Vai al contenuto
PLC Forum


Comandi Hostlink Con Cs1


Messaggi consigliati

Inserito:

Volevo gentilmente sapere se posso attraverso i comandi hostlink (cioò, dal mio software sviluppato in VB) impostare delle DM con dati in virgola mobile.

Il PLC di destinazione è un CS1.

Sul manuale non ho trovato nulla a riguardo.

Ciao a tutti e buona giornata.


Claudio Negro
Inserita: (modificato)

La virgola mobile è solo un formato di archiviazione dei dati, il problema che si pone è quindi come convertire un numero in virgola mobile di visual basic in virgola mobile per plc

In linea di massima, il formato di archiviazione è esattamente lo stesso (infatti è uno standard ieee qualcosa.. di 4 byte, ovvero 2 word) solo che visual basic non consente di "vedere" il dato come lui stesso lo archivia (ecco uno dei motivi per cui ho sempre detto di provare altri linguaggi, anche se poi non l'ho mai fatto...).

Per superare questo ostacolo (su visual basic a 32 bit, che con opportune modifiche, se necessario, si può portare a 16 bit) ho usato un sistema non molto elegante, ma che risolve con poche istruzioni il problema. Consiste nel dichiarare 2 tipi di dati (nel mio caso, variabile e word) uno contenente una sola voce single e l'altro contenente 2 voci integer (stiamo trattando i dati in virgola mobile di 4 byte, che in visual basic sono i dati single, mentre i double sono a 8 byte, e se non sbaglio stanno comprarendo sui plc cj, ma non ho ancora approfondito, quindi al momento non li includo nel discorso, anche se, in pratica, non cambia molto, solo il numero di byte, e quindi di word occupate)

Si creano 2 variabili con i due tipi dichiarati, quindi si inserisce il valore nella variabile tipo virgola, e la si copia mediante l'istruzione lset nella variabile word. Nonostante la guida di visual basic sconsigli questa procedura, perchè non sempre è facile determinare gli spazi di archiviazione delle variabili, in questo caso funziona benissimo.

Data la compattezza del codice, te lo scrivo:

Private Type virgola

dato As Single

End Type

Private Type word

dato(1) As Integer

End Type

Function ConvertiVM(dato As Single) As String

Dim a As virgola, b As word

a.dato = dato

LSet b = a

ConvertiVM = ConvertiHex(b.dato(0)) & ConvertiHex(b.dato(1))

End Function

Function ConvertiHex(dato As Integer) As String

Dim hx As String

hx = Hex(dato)

ConvertiHex = String(4 - Len(hx), "0") & hx

End Function

La funzione ConvertiHex serve solo a ottenere un dato utile per l'hostlink a partire da un dato integer (che ha lo spazio di archiviazione di una word), la funzione ConvertiVM legge il dato, lo copia da una variabile all'altra e restituisce il risultato come stringa già convertita in esadecimale con l'ordine esatto delle word, pronta per essere spedita in un comando hostlink di scrittura, come fossero normali dati esadecimali.

Spero di averti aiutato, ad ogni modo, fammi sapere se ti da problemi (anche perchè l'ho sviluppato solo per vedere se era fattibile il giorno in cui ho scoperto l'esistenza dell'istruzione lset.. non è stato mai testato sul campo per ogni valore possibile, solo qualche prova, per verificare che corrisponda "abbastanza" :unsure: .. ma dovrebbe! :D ).

Ciao!

Modificato: da Claudio Negro
  • 3 years later...
Inserita:

Si può anche usare l' API di windows:

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _

(Dest As Any, source As Any, ByVal numBytes As Long)

Dichiarare una variabile single (o double) da usare per dest.

dim LeggiFloat as single

Supponendo che il valore in formato in virgola mobile sia memorizzato

in un intero, ad esempio 'intvalore'

CopyMemory LeggiFloat, intvalore, 4

oppure se era in un' array di byte come : Dim c(3) As Byte

CopyMemory LeggiFloat, c(0), 4

Ovviamente si può invertire le posizioni intvalore con LeggiFloat

per effettuare il passaggio inverso

ciao

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...