Acquisizione valori via Modbus da contatori Iskraemeco
Home › Forum › Programmazione IEC 61131 (LogicLab) › Acquisizione valori via Modbus da contatori Iskraemeco
- Questo topic ha 6 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 1 mese, 3 settimane fa da
Alessandro Campodonico.
-
AutorePost
-
Marzo 4, 2016 alle 2:02 pm #35963
Anonimo
InattivoStiamo utilizzando dei contatori Iskraemeco MT831/MT860 con il modulo plug&play MKMB-3-e-3 di interfaccia Modbus di cui allego documentazione li abbiamo interfacciati a vostri sistemi SlimLine in Modbus RTU.
Come si vede alcuni registri come ad esempio registro OBIS 1.8.0 Totalizzatore energia attiva A+ ritornano valori su 8 bytes espressi nel formato IEE754 a 64 bits. Mi chiedevo se esiste la possibilità di convertire questi valori nel formato REAL a 32 bits gestito dallo SlimLine.
Marzo 4, 2016 alle 2:28 pm #39433Sergio Bertana
Amministratore del forumHo sviluppato una nuova funzione IEE754DoubleToFloat, IEE754 double to float (Estratto manuale) che converte un valore dal formato IEE754 a 64 bits nel formato REAL a 32 bits gestito dallo SlimLine.
Ho realizzato il programma IEEConversion (Stampa) che esegue il test di funzionamento della funzione (Download progetto). Naturalmente eseguendo la conversione di formato si ha una perdita di precisione nel numero ed un range diverso del valore.
Febbraio 26, 2025 alle 6:23 pm #79882Alessandro Campodonico
PartecipanteRispolvero questo vecchio post ho provato ad utilizzare la funzione, con il seguente codice
CombinedValue : DWORD; CombinedValueR : REAL; CombinedValueR:=IEE754DoubleToFloat(ADR(CombinedValue));
Ma purtroppo ottengo un errore in compilazione SDF(1) – errore G0101: VALUE => Tipo non corrispondente in assegnazione.
La mia necessità sarebbe quella di leggere tramite modbus la corrente di assorbimento presa da 2 registri consecutivi a 16 bit, concatenarli in 1 variabile dword e convertirli in float(real).
Ho visto che avete FB WordToDouble e questa funzione IEE754DoubleToFloat, con questi due sistemi dovrei riuscire ad ottenere quello che mi serve, il problema è l’errore in compilazione.
Febbraio 27, 2025 alle 7:59 am #79890Sergio Bertana
Amministratore del forumC’è un po di confusione, vedo se riesco a fare chiarezza… La funzione IEE754DoubleToFloat a cui fai riferimento permetteva di convertire un numero dal formato float IEE754 a 64 bits nel formato float IEE754 a 32 bits. Questa operazione era necessaria all’epoca perchè LogicLab non gestiva il formato LREAL cioè float a 64 bits.
Ma tui hai un’altro problema, hai 2 registri Modbus a 16 bits che ritornano un valore DWORD a 32 bits almeno così credo (Attenzione molti meters di energia ritornano un valore su 2 registri Modbus a 16 bits ma con un valore REAL IEE754 a 32 bits).
Ora se è una DWORD basta leggere i 2 registri a 16 bits e poi combinare i due valori con la funzione WordsToDouble stando attendo a LSW e MSW, al limite inverti i due registri. Se invece il valore è un REAL devi combinare i due valori e poi trasferirli in una variabile REAL, per comprendere il formato IEE754 puoi utilizzare un convertitore on-line come questo. Ecco un semplice esempio.
VAR DWValue : DWORD; (* DWORD result *) RLValue : REAL; (* REAL result *) ModbusRegs : ARRAY[0..1] OF WORD; (* Modbus registers *) END_VAR ModbusRegs[0]:=16#449A; //MSW Value ModbusRegs[1]:=16#522B; //LSW value DWValue:=WordsToDouble(ModbusRegs[0], ModbusRegs[1]); //Result=16#449A522B RLValue:=eGetREAL(ADR(DWValue)); //Result=1234.5677
Febbraio 27, 2025 alle 1:46 pm #79920Alessandro Campodonico
PartecipanteGrazie mille per le dritte,
Si il mio problema è che devo leggere la corrente di un inverter tramite Modbus, e l’inverter appoggia la variabile float su 2 registri consecutivi WORD, quindi devo combinarli insieme e convertirli in REAL.
La prima parte l’ho fatta (anche se WordsToDouble mi restituiva un errore “funzione sconosciuta” alla fine cercando un ho visto che nella libreria eLLabUtyLib cè l’FB WordsToDouble)
Il problema ora è che anche eGetREAL mi ritorna errore ” funzione sconosciuta” ma non sono riuscito a trovarlo in nessuna libreria, come posso risolvere?
Febbraio 27, 2025 alle 2:11 pm #79927Sergio Bertana
Amministratore del forumDa quello che scrivi vedo che non hai seguito l’evolvere delle versioni LogicLab, da un certo tempo a questa parte, nel progetto non vengono più incluse le singole librerie ma si include una raccolta di librerie (Vedi articolo).
La raccolta ti evita di cercare gli oggetti nelle librerie, basta inserirli nel progetto e si preoccupa LogicLab di cercarli ed utilizzarli.
Quindi elimina dal tuo progetto tutte le librerie ed inserisci la raccolta in questo modo riuscirai a compilare il programma.
Febbraio 27, 2025 alle 2:58 pm #79936Alessandro Campodonico
PartecipanteIo utilizzo la versione 5.12.0.36 di logiclab nella gestione libreria non ho l’opzione per aggiungere il pacchetto di libreria, per adesso preferisco non aggiornare in quanto mi ritrovo ( con vecchi programmi ) ad avere decine e decine di problemi in compilazione, per ora preferirei rimanere cosi.
Ho importato eGETReal ora però non trova PVOID, cè un elenco della posizione di tutte queste funzioni o FB necessarie cosi da importarle tutte?
-
AutorePost
- Devi essere connesso per rispondere a questo topic.