Comunicazione modbus con multimetro Lovato DMG110
Home › Forum › Terminali operatore (Weintek) › Comunicazione modbus con multimetro Lovato DMG110
- Questo topic ha 7 risposte, 4 partecipanti ed è stato aggiornato l'ultima volta 2 mesi, 2 settimane fa da
Sergio Bertana.
-
AutorePost
-
Marzo 12, 2022 alle 1:39 pm #64394
Stefano
PartecipanteDevo visualizzare i dati di un multimetro Lovato DMG110 con un HMI MT8073iE. Sul pannello ho creato “Dispositivo Locale 3” selezionando il driver “MODBUS RTU (HEX Addressing)” PLC/IF RS-485 2W e COM3 (19200,N,8,1).
Riesco a comunicare con il dispositivo ma spesso appare la finestrina “PLC No Response” che poi si chiude da sola. Se controllo la LW-9402 visualizzo sempre il valore 2.
Non riesco a capire se l’errore può essere dato un timeout, la lettura di un indirizzo errato o disturbi sulla linea.
C’è modo di fare il debug della comunicazione per capire esattamente l’errore?
Marzo 12, 2022 alle 1:39 pm #64396Stefano
PartecipanteCon EasyDiagnoser ho trovato l’errore. Un errore “2” su una richiesta era dato da un indirizzo non esistente sul dispositivo.
L’altro era un errore numero 12 dato da 2 richieste successive:
[5x] 2031616/2
[5x] 2097152/2Corrispondenti a queste indicazioni del produttore del dispositivo:
1B20H 4 Energia Attiva Importata totale Total imp. Active Energy kWh / 100 Unsigned long-long
1B28H 4 Energia Reattiva Importata totale Total imp. Reactive Energy kvarh / 100 Unsigned long-longil 4 che si vede dopo l’indirizzo è il numero di word da leggere, sono valori a 64 bit. Evidentemente il dispositivo genera un errore se non si leggono consecutivamente tutte le 4 word. Credo che l’unico modo sia con una macro.
PS tutti questi valori erano pubblicati via MQTT. Se un oggetto ha un indirizzo errato semplicemente non viene visualizzato l’oggetto. Se l’indirizzo non valido è tra i dati MQTT appare il messaggio “PLC no response”.
Aprile 30, 2022 alle 10:54 pm #65113nmimpianti
PartecipanteSalve io pure ho problemi a leggere
1B20H 4 Energia Attiva Importata totale Total imp. Active Energy kWh/100 Unsigned long-long
1B28H 4 Energia Reattiva Importata totale Total imp. Reactive Energy kvarh/100 Unsigned long-long.Qualcuno ha risolto?
Maggio 6, 2022 alle 4:03 pm #65225Sergio Bertana
Amministratore del forumSe riesci a leggere gli altri registri vuol dire che la comunicazione è corretta come corretto è l’indirizzamento. Perchè di solito il primo problema che si incontra nelle comunicazioni Modbus è l’offset 1 sull’indirizzamento (Aggiungere o togliere 1 all’indirizzo del registro).
Ora i tuoi 2 registri sono degli unsigned long, quindi utilizzerai una lettura 4x di una variabile 32-bit Unsigned. per leggere la variabile vengono letti 2 registri a 16 bits. Siccome il protocollo Modbus non specifica l’endianness dei dati, potrebbe verificarsi una inversione di endianness e quindi leggi un dato completamente sballato. Per correggere il problema nella finestra di impostazione del protocollo puoi selezionare l’inversione della endianness (Screenshot).
Giugno 6, 2022 alle 3:45 pm #65483Stefano
PartecipanteDopo innumerevoli prove sono giunto alla soluzione.
Il problema fondamentale è che i registri non sono Unsigned Long (32 bit) ma bensì Unsigned long-long (64 bit). Inoltre bisogna stare attenti a leggere sempre un numero di registri multiplo di 2 a partire da indirizzi pari altrimenti lo strumento va in errore.Per leggere i due registri incriminati mi sono appoggiato ad una macro che legge i registri, li converte in un float a 32 bit e copia il valore in un registro del pannello.
Non sarebbe il massimo perchè arriverà un momento in cui il valore mostrato sarà approssimato, ma per ora a me basta così. Di seguito la Macro:
macro_command main() unsigned int uiData[2] = {0,0} float energy = 0 GetData(uiData[0], "DMG110", 5x, 1b21, 2)// read 4 words active energy energy = uiData[0] energy = (energy + uiData[1] * 65536) / 100 SetData(energy, "Local HMI", LW, 30, 1) GetData(uiData[0], "DMG110", 5x, 1b29, 2)// read 4 words reactive energy energy = uiData[0] energy = (energy + uiData[1] * 65536) / 100 SetData(energy, "Local HMI", LW, 32, 1) end macro_command
Giugno 8, 2022 alle 4:35 pm #65491Sergio Bertana
Amministratore del forumMa scusa se usi un pannello cMT hai la possibilità di operare direttamente su variabili a 64 bits, sia intere che float.
Gennaio 29, 2025 alle 6:29 pm #79498Roberto Iuliano
PartecipanteBuonasera ho lo stesso problema ,leggo il valore di tensione,ampere,potenza con il comando 5x , ma i kwh cioè con il registro 1B1f che sarebbe al -1 del 1B20 leggo un valore sballato rispetto al display.
Credo di essere stato chiaro.
Gennaio 31, 2025 alle 8:12 am #79510Sergio Bertana
Amministratore del forumDevi verificare che tipo di dato è presente in quel registro, può essere che il contatore totalizzatore visto il range di visualizzazione sia espresso come una variabile a 64 bits intera o float.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.