Comunicazione Modbus RTU con Energy meter SDM120
Home › Forum › Programmazione IEC 61131 (LogicLab) › Comunicazione Modbus RTU con Energy meter SDM120
Taggato: ModbusRTU
- Questo topic ha 14 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 2 anni, 1 mese fa da
Sergio Bertana.
-
AutorePost
-
Gennaio 15, 2021 alle 8:06 am #58794
tommas.cavallini
PartecipanteSalve a tutti possiedo un PLC SlimLine LogicLab Compact Ethernet e devo instaurare una comunicazione RTU con 2 EnergyMeter. Ho seguito il tutorial di Elsist per leggere i dati da un SDM120 e con uno solo funziona tutto; però quando provo a leggere 2 dati provenienti da 2 EnergyMeter differenti riesco sempre a leggerne solo 1 come posso risolvere questo problema?
Gennaio 15, 2021 alle 8:23 am #58798Sergio Bertana
Amministratore del forumQuando parli di tutorial credo tu ti riferisca a questo video, dove ho spiegato come eseguire l’acquisizione dei dati dagli Energy meter SDM120.
Ora immagino tu abbia utilizzato per la lettura il FB EastronSDM120, che ne gestisce completamente la lettura. Ma come vedi il FB ha il parametro Node dove devi definire il nodo Modbus del meter da acquisisre.
In pratica ogni SDM120 deve avere il proprio indirizzo di nodo uno diverso dall’altro, di default l’indirizzo di nodo è 1, per cambiarlo devi seguire le informazioni del manuale, in pratica devi tenere premutoil tasto sul frontale per entrare in Set parametri e poi inviare un comando Modbus di scrittura indirizzo di nodo.
Gennaio 15, 2021 alle 10:36 am #58805tommas.cavallini
PartecipanteBuongiorno, intanto grazie mille per l’attenzione. Nel mio progetto ho utilizzato i FB SysSerialPort e ModbusMaster e VarSwap.
Ho provato in seguito a collegare un altro FB ModbusMaster (che identifica il secondo SDM120 avente nodo 2) utilizzando lo stesso FB per la porta seriale. Nella porta EN del secondo ModbusMaster ho aggiunto un eTON con tempo di 200ms, però riesco sempre a leggere solo il primo (collegato al primo FB ModbusMaster). Ho provato anche a separare il tutto in due programmi diversi associandoli anche a task diversi, ma il risultato non cambia, anzi, non legge più nemmeno il primo.
Come posso risolvere? Grazie ancora in anticipo.
Gennaio 15, 2021 alle 10:56 am #58807Sergio Bertana
Amministratore del forumQuindi se ho capito non utilizzi il FB EastronSDM120, ma vuoi provare a realizzare tu il programma con il FB ModbusMaster?
Allora se devi comunicare con più dispositivi in RS485 multidrop devi utilizzare la tecnica delle FB in cascata, in pratica istanzi più FB ModbusMaster tutte condividono il File in uscita dalla SysSerialPort. Il Done della prima FB lo colleghi all’Enable della seconda e così via, il Done dell’ultima istanza lo colleghi invertito all’Enable della prima. Puoi intrudurre una pausa di attesa tra le comunicazioni defindendo il valore di Delay.
Ma molto meglio in questo caso utilizzare il FB ACModbus, che ti permette di connetterti a più dispositivi in multidrop utilizzando un solo FB ModbusMaster.
Gennaio 15, 2021 alle 6:14 pm #58808tommas.cavallini
PartecipanteHo provato il metodo con i FB ModbusMaster in cascata e funziona, grazie mille per l’aiuto!
I suoi video e le sue spiegazioni sono stati fondamentali soprattutto perchè mi sono appena affacciato al mondo dei PLC, gliene sono veramente grato. Nel caso avessi altri dubbi, scriverò sul forum che è molto ben fatto e le risposte sono più celeri di quanto mi aspettassi.
Gennaio 28, 2021 alle 11:21 am #58894tommas.cavallini
PartecipanteAdesso è venuto fuori il problema che tramite connessione ModBus RTU voglio anche scrivere dei dati. Mi chiedevo quindi: se per la lettura usavamo il FB varSwap per convertire in REAL i valori, per la scrittura come faccio?
Pensavo di inserire i valori da scrivere alla voce Buffer del FB ModbusMaster, ma credo di aver capito che non posso scrivere un valore REAL ma un valore nello standard IEE754, giusto?
Come faccio ad eseguire quindi la conversione inversa di VarSwap?
Gennaio 28, 2021 alle 11:30 am #58898Sergio Bertana
Amministratore del forumUn pò di ordine tra le idee… e una occhiata a questo post potrebbe essere utile.
I dati in lettura e scrittura sul meter sono sempre in float 32 bit IEE754, che in IEC61131 si identificano con il formato REAL. Quindi con la funzione VarSwap non fai nessuna conversione. Usi questa funzione perchè essendo il valore espresso su 32 bits si utilizzano 2 registri Modbus per la lettura/scrittura e siccome il protocollo Modbus non specifica l’endiannes sui valori multiregistro ognuno fà come vuole.
La funzione VarSwap sistema proprio l’endiannes dei dati quindi puoi usarla sia per convertire i dati in lettura che quelli in scrittura. Quindi per scrivere un valore sul meter appoggi il dato REAL nel buffer del FB ModbusMaster (Che definirei di tipo DWORD) utilizzando la funzione VarSwap.
Febbraio 8, 2021 alle 11:33 am #58983tommas.cavallini
PartecipantePerfetto, adesso il mio problema sta nella gestione temporale di lettura e scrittura di dieci elettrovalvole.
Se per la lettura basta associare il programma al task Back in modo tale da essere eseguita periodicamente, la scrittura invece vorrei poterla eseguire solo in seguito ad una particolare condizione: ho visto che LogicLab non mette a disposizione dei task ad evento, quindi come potrei fare?
Febbraio 8, 2021 alle 11:39 am #58985Sergio Bertana
Amministratore del forumMi sono un pò perso… si parlava di energy meter SDM120 ed ora saltiamo ad elettrovalvole…
Ma venendo alla tua domanda hai appreso come mettere in cascata più FB ModbusMaster per effettuare la lettura dei registri da diversi strumenti. Ora quando devi scrivere aspetti il Done dell’ultimo FB in cascata e anzichè ripartire con la sequenza togliendo l’Enable del primo, farai partire un un ulteriore FB ModbusMaster che configurerai di volta in volta per la scrittura del registro che ti occorre.
Febbraio 8, 2021 alle 5:58 pm #58986tommas.cavallini
PartecipanteAnzitutto mi scuso per la confusione: devo leggere sia gli EnergyMeter che le elettrovavole, su queste ultime devo effettuare anche la scrittura: dato che entrambe comunicano in RTU ho pensato di poter chiedere direttamente qui senza dover per forza aprire un altro topic.
Venendo a noi, non ho ben capito la soluzione proposta: pensavo di separare la fase di lettura e scrittura non collegando i FB in cascata. Infatti, la lettura deve essere continuativa mentre la scrittura avviene solo quando e se voglio cambiare dei parametri.
Febbraio 8, 2021 alle 6:01 pm #58989Sergio Bertana
Amministratore del forumNessun problema solo che non capivo il nesso con le elettrovalvole…
Infatti il mio sufggerimento era di abilitare il FB parametrizzato per la scrittura solo quando serve scrivere, naturalmente tutto sarebbe molto più semplice lavorando in linguaggio ST e gestendo il programma in case con lo statement CASE.
TRovi molti programmi realizzati in questo modo puoi prendere spunto da esempi che trovi nel forum.
Marzo 17, 2021 alle 5:53 pm #59286Matteo Bianchi
PartecipanteSto cercando di lavorare con SDM20, rispetto all’esempio del video corso, che utilizza la funzione ModbusMaster, la documentazione online riporta un ModbusMaster versione v1, in cui non compare più il parametro IFTime.
Come posso recuperare la documentazione con il vecchio parametro IFTime, io non lavoro a 2400 bit/s ma a 9600, per cui IFTime in esempio non và bene. O eventualmente come posso fare per utilizzare il nuovo ModbusMaster_V1 ?
Che libreria devo caricare?
Marzo 17, 2021 alle 5:59 pm #59296Sergio Bertana
Amministratore del forumLa vecchia documentazione la puoi sempre trovare nel manuale in PDF che è scaricabile dal sito (LO trovi in testa all’indice del manuale on-line).
Ma io ti consiglio di scaricare dal sito la libreria eLLabMdbDevsLib che come vedi dalla pagina del manuale è la libreria in cui si trova il nuovo FB ModbusMaster_v1.
La libreria è realizzata per i nuovi sistemi XUnified, se il tuo sistema è ancora un XTargetxx puoi eseguire un upgrade (Trovi le informazioni nella zona knowlewdge del sito) od inserire nel progetto la libreria eLLabXTargetAdjLib (Vedi articolo).
Febbraio 21, 2023 alle 10:08 pm #70448Edi
PartecipanteSalve, vorrei chiedere un consiglio sulla gestione del protocollo ModbusMaster in quanto dovrei acquisire la lettura contemporanea di più registri non consecutivi di due contatori di energia elettrica (non SDM) collegati tramite la RS485.
Mi trovo in difficoltà su come eseguire la lettura di almeno 15 valori REAL, in poche parole dovrei realizzare un FB uguale a quello del SDM 630 dove acquisisce tensione, corrente, potenza attiva, reattiva ecc.
Febbraio 22, 2023 alle 2:11 pm #70500Sergio Bertana
Amministratore del forumIl modo più intuitivo di realizzare quello che ti serve è utilizzare più istanze del FB ModbusMaster connesse in cascata (Vedi articolo).
Il modo più da programmatore e che utilizza meno risorse è di utilizzare il FB ACModbus, definendo un array di variabili ACMODBUS_DATA_V2 con i parametri dei vari registri da gestire sul meter.
-
AutorePost
- Devi essere connesso per rispondere a questo topic.