bcbel Inserito: 20 luglio 2004 Segnala Inserito: 20 luglio 2004 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: 21 luglio 2004 Segnala Inserita: 21 luglio 2004 (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 plcIn 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 virgoladato As SingleEnd TypePrivate Type worddato(1) As IntegerEnd TypeFunction ConvertiVM(dato As Single) As StringDim a As virgola, b As worda.dato = datoLSet b = aConvertiVM = ConvertiHex(b.dato(0)) & ConvertiHex(b.dato(1))End FunctionFunction ConvertiHex(dato As Integer) As StringDim hx As Stringhx = Hex(dato)ConvertiHex = String(4 - Len(hx), "0") & hxEnd FunctionLa 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" .. ma dovrebbe! ).Ciao! Modificato: 21 luglio 2004 da Claudio Negro
innocenzo Inserita: 17 aprile 2008 Segnala Inserita: 17 aprile 2008 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 singleSupponendo che il valore in formato in virgola mobile sia memorizzatoin un intero, ad esempio 'intvalore'CopyMemory LeggiFloat, intvalore, 4oppure se era in un' array di byte come : Dim c(3) As ByteCopyMemory LeggiFloat, c(0), 4Ovviamente si può invertire le posizioni intvalore con LeggiFloatper effettuare il passaggio inverso ciao
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora