Vai al contenuto

Comunicazione modbus con multimetro Lovato DMG110

Home Forum Terminali operatore (Weintek) Comunicazione modbus con multimetro Lovato DMG110

Stai visualizzando 8 post - dal 1 a 8 (di 8 totali)
  • Autore
    Post
  • #64394
    Stefano
    Partecipante

    Devo 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?

    #64396
    Stefano
    Partecipante

    Con 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/2

    Corrispondenti 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-long

    il 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”.

    #65113
    nmimpianti
    Partecipante

    Salve 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?

    #65225
    Sergio Bertana
    Amministratore del forum

    Se 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).

    #65483
    Stefano
    Partecipante

    Dopo 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
    #65491
    Sergio Bertana
    Amministratore del forum

    Ma scusa se usi un pannello cMT hai la possibilità di operare direttamente su variabili a 64 bits, sia intere che float.

    #79498
    Roberto Iuliano
    Partecipante

    Buonasera 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.

    #79510
    Sergio Bertana
    Amministratore del forum

    Devi 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.

Stai visualizzando 8 post - dal 1 a 8 (di 8 totali)
  • Devi essere connesso per rispondere a questo topic.