Libreria gestione dispositivi Modbus (eLLabMdbDevsLib)

Questa libreria contiene un insieme di funzioni e blocchi funzione per la gestione di dispositivi commerciali connessi tramite protocollo Modbus.

La comunicazione modbus è gestita dalla FB*`ModbusMaster <#FblModbusMaster>`__****che quindi deve essere inclusa nel progetto che si realizza*.

ModbusMsCore, Modbus master core

Type Library
FB eLLabMdbDevsLib_B000

image0

Questo FB agisce come “cuore” della libreria gestendo tramite il FB ModbusMaster il cui indirizzo di allocazione deve essere passato in MMdb la comunicazione Modbus con i dispositivi connessi allo stream definito in File.

Nota: Per utilizzare questo FB è necessario includere nel progetto anche il FB**ModbusMaster.

Il FB fornisce in uscita il MMID che deve essere passato ai vari FB dipendenti di gestione dei dispositivi. L’ingresso SpyOn se attivo permette di spiare il funzionamento della FB.

In Delay è possibile definire un tempo di attesa tra le interrogazioni Modbus. In caso di errore viene attivata per un loop di programma l’uscita Fault.

Enable (BOOL) Attivazione gestione.
SpyOn (BOOL) Se attivo permette di spiare il funzionamento della FB.
File (FILEP) Flusso dati stream su cui gestire la comunicazione.
MMdb (@ModbusMaster) Indirizzo di allocazione FB ModbusMaster di gestione protocollo Modbus.
IFTime (UDINT)

Tempo ricezione caratteri (μS), se comunicazione su porta seriale il tempo deve essere definito in base al baud rate. Nel caso di comunicazione su rete ethernet è possibile definire il valore minimo.

300 Baud - 112000 (uS)
600 Baud - 56000 (uS)
1200 Baud - 28000 (uS)
2400 Baud - 14000 (uS)
4800 Baud - 7000 (uS)
9600 Baud - 3430 (uS)
19200 Baud - 1720 (uS)
38400 Baud - 860 (uS)
57600 Baud - 573 (uS)
76800 Baud - 429 (uS)
115200 Baud - 286 (uS)
Delay (UINT) Tempo di pausa dopo l’esecuzione del comando modbus espresso in mS.
Enabled (BOOL) Attivo su abilitazione FB.
Fault (BOOL) Attivo per un loop se errore esecuzione comando.
MMID (UDINT) Modbus master ID da passare alle FB collegate.

Codici di errore

In caso di errore si attiva l’uscita Fault, con SysGetLastError è possibile rilevare il codice di errore.

Codice Descrizione
10064010 FB eseguita in una task diversa dalla task di background.

Esempi

Nell’esempio viene eseguita la scrittura e la rilettura di 4 registri WORD da un sistema SlimLine all’indirizzo Modbus 40000. Modificando i valori in WValues è possibile ritrovare il valore modificato dopo averlo scritto e riletto dal sistema SlimLine in RValues.

Definizione variabili

VAR
RValues : ARRAY[ 0..3 ] OF UINT; (\* Values read from SlimLine \*)
WValues : ARRAY[ 0..3 ] OF UINT; (\* Values to write to SlimLine \*)
MMdb : ModbusMaster; (\* ModbusMaster instance \*)
MManager : ModbusMsCore; (\* Master modbus core \*)
RRegs : SAModbusCmd; (\* Read registers FB \*)
WRegs : SAModbusCmd; (\* Write registers FB \*)
Sport : SysSerialPort; (\* Serial port \*)
END_VAR

Esempio FBD (PTP141B000, FBD_SAModbusCmd)

image1

SAModbusCmd, stand alone Modbus command

Type Library
FB eLLabMdbDevsLib_A100

image2

Questo FB permette di eseguire un comando Modbus in connessione al FB ModbusMsCore collegando l’MMID in uscita con l’analogo ingresso di questo FB. In Type è possibile selezionare il tipo di protocollo.

Attivando Enable viene eseguita da FB ModbusMSCore la funzione modbus definita in Fcode sul nodo definito in Node. La funzione è eseguita ciclicamente insieme a tutte la altre FB connesse. Terminata l’esecuzione viene attivata per un loop di programma l’uscita Done. Se l’esecuzione comando ha esito positivo si attiva per un loop di programma l’uscita Ok.

Se FCode è una funzione di lettura, il valore delle variabili a partire dall’indirizzo definito in Address per il numero di variabili definito da Points, viene letto dal sistema slave e trasferito nelle variabili indirizzate da Buffer.

Se FCode è una funzione di scrittura, il valore delle variabili presenti nel buffer di memoria indirizzato da Buffer per il numero di variabili definito da Points, è inviato al dispositivo slave che lo trasferirà nelle sue variabili a partire dall’indirizzo definito in Address.

In caso di errore esecuzione viene attivata per un loop di programma l’uscita Fault ed incrementato il valore in Errors.

Enable (BOOL) Attivazione gestione, se disabilitata ModbusMsCore passa ad eseguire FB successivo.
MMID (UDINT) Modbus master ID copiare valore in uscita da ModbusMsCore.
Type (USINT) Tipo di protocollo modbus. 0:RTU, 1:Ascii, 2:TCP
Node (USINT) Numero di nodo modbus su cui effettuare il comando (Range da 0 a 255).
FCode (USINT) Codice funzione modbus da eseguire nel comando (Range da 0 a 255). Vedi funzioni eseguite da FB ModbusMaster <#FblModbusMaster> __.
Address (UINT) Indirizzo di allocazione variabili su sistema slave. In accordo alle specifiche modbus l’indirizzo inviato nel frame dati è (Address-1) (Range da 16#0001 a 16#FFFF).
Points (USINT) Numero di variabili consecutive su cui opera il comando.
Buffer (@USINT) Indirizzo buffer dati letti o da scrivere.
Timeout (UINT) Tempo massimo esecuzione comando espresso in mS. Se il comando non termina nel tempo definito viene abortito ed attivata l’uscita Fault.
Done (BOOL) Attivo per un loop al termine della acquisizione di tutte le variabili.
Ok (BOOL) Attivo per un loop se esecuzione comando corretta.
Fault (BOOL) Attivo per un loop se errore esecuzione.

Codici di errore

In caso di errore si attiva l’uscita Fault, con SysGetLastError è possibile rilevare il codice di errore.

Codice Descrizione
10070010 FB eseguita in una task diversa dalla task di background.
10070020 MMID non definito.
10070030 MMID non impostato correttamente.
10070100 Troppe FB istanziate.

Esempi

Nell’esempio viene eseguita la scrittura e la rilettura di 4 registri WORD da un sistema SlimLine all’indirizzo Modbus 40000. Modificando i valori in WValues è possibile ritrovare il valore modificato dopo averlo scritto e riletto dal sistema SlimLine in RValues.

Definizione variabili

VAR
RValues : ARRAY[ 0..3 ] OF UINT; (\* Values read from SlimLine \*)
WValues : ARRAY[ 0..3 ] OF UINT; (\* Values to write to SlimLine \*)
MMdb : ModbusMaster; (\* ModbusMaster instance \*)
MManager : ModbusMsCore; (\* Master modbus core \*)
RRegs : SAModbusCmd; (\* Read registers FB \*)
WRegs : SAModbusCmd; (\* Write registers FB \*)
Sport : SysSerialPort; (\* Serial port \*)
END_VAR

Esempio FBD (PTP141B000, FBD_SAModbusCmd)

image3

EastronSDM120_v1, Eastron SDM120 energy meter

Type Library
FB eLLabMdbDevsLib_A200

image4

Questo FB permette di eseguire la lettura di tutte le variabili da un analizzatore di energia Eastron SDM120. Deve essere utilizzata in connessione al FB ModbusMsCore collegando l’MMID in uscita con l’analogo ingresso di questo FB.

In Node occorre definire il numero di nodo Modbus dell’analizzatore di energia. In uscita dal FB sono ritornati tutti i valori letti dall’analizzatore. In caso di possibile definire un tempo di attesa tra le interrogazioni Modbus. In caso di errore viene attivata per un loop di programma l’uscita Fault.

I parametri di default del dispositivo sono 2400, n, 8, 1, nodo modbus 1.

Enable (BOOL) Attivazione gestione, se disabilitata ModbusMsCore passa ad eseguire FB successivo.
MMID (UDINT) Modbus master ID copiare valore in uscita da ModbusMsCore.
Node (USINT) Numero di nodo modbus su cui effettuare il comando (Range da 0 a 255).
Timeout (UDINT) Valore di timeout esecuzione singola interrogazione Modbus (mS)
Done (BOOL) Attivo per un loop al termine della acquisizione di tutte le variabili.
Fault (BOOL) Attivo per un loop se errore esecuzione.
Errors (UDINT) Numero errori di comunicazione con analizzatore di energia.
Voltage (REAL) Line voltage (Volts).
Current (REAL) Line current (Amps).
Frequency (REAL) Line frequency (Hertz).
ACPower (REAL) Active power (Watts).
ApPower (REAL) Apparent power (VA).
RePower (REAL) Reactive power (Var).
PwFactor (REAL) Power factor (None).
IAcEnergy (REAL) Import active energy (kWh).
EAcEnergy (REAL) Export active energy (kWh).
TAcEnergy (REAL) Total active energy (kWh).

Codici di errore

In caso di errore si attiva l’uscita Fault, con SysGetLastError è possibile rilevare il codice di errore.

Codice Descrizione
10065010 FB eseguita in una task diversa dalla task di background.
10065020 MMID non definito.
10065030 MMID non impostato correttamente.
10065100 Troppe FB istanziate.

Esempi

Nell’esempio viene gestita la lettura di un analizzatore di rete Eastron tipo SDM120.

Definizione variabili

VAR
Sport : SysSerialPort; (\* Serial port \*)
MManager : ModbusMsCore; (\* Master modbus core \*)
MMdb : ModbusMaster; (\* ModbusMaster instance \*)
Meter : EastronSDM120_v1; (\* SDM120 meter \*)
END_VAR

Esempio FBD (PTP141B000, FBD_EastronSDM120_v1)

image5

Esempio ST (PTP141A200, ST_EastronSDM120_v1)

IF (SysFirstLoop) THEN
SPort.COM:=ADR('COM0'); (\* COM port definition \*)
SPort.Baudrate:=2400; (\* Baudrate \*)
SPort.Parity:='N'; (\* Parity \*)
SPort.DataBits:=8; (\* Data bits \*)
SPort.StopBits:=1; (\* Stop bits \*)
SPort.DTRManagement:=DTR_AUTO_WO_TIMES; (\* DTR management \*)
SPort.DTRComplement:=FALSE; (\* DTR complement \*)
SPort.EchoFlush:=FALSE; (\* Received echo flush \*)
SPort.DTROnTime:=0; (\* DTR On time delay (mS) \*)
SPort.DTROffTime:=0; (\* DTR Off time delay (mS) \*)
SPort.FlushTm:=0; (\* Flush time (mS) \*)
SPort.RxSize:=0; (\* Rx buffer size \*)
SPort.TxSize:=0; (\* Tx buffer size \*)
MManager.SpyOn:=TRUE; (\* Spy On \*)
MManager.MMdb:=ADR(MMdb); (\* Modbus manager FB \*)
MManager.IFTime:=14000; (\* Interframe time (uS) \*)
MManager.Delay:=10; (\* Communication delay (mS) \*)
Meter.Node:=1; (\* Meter modbus node \*)
Meter.Timeout:=200; (\* Meter modbus timeout (mS) \*)
END_IF;
SPort(Open:=TRUE); (\* Serial port management \*)
MManager.File:=SPort.File; (\* File pointer \*)
MManager(Enable:=SPort.Opened); (\* Master modbus core \*)
Meter.MMID:=MManager.MMID; (\* Modbus master ID \*)
Meter(Enable:=TRUE); (\* SDM120 meter \*)

EastronSDM630_v1, Eastron SDM630 energy meter

Type Library
FB eLLabMdbDevsLib_A000

image6

Questo FB permette di eseguire la lettura di tutte le variabili da un analizzatore di energia Eastron SDM630. Deve essere utilizzata in connessione al FB ModbusMsCore collegando l’MMID in uscita con l’analogo ingresso di questo FB.

In Node occorre definire il numero di nodo Modbus dell’analizzatore di energia. In uscita dal FB sono ritornati tutti i valori letti dall’analizzatore. In caso di possibile definire un tempo di attesa tra le interrogazioni Modbus. In caso di errore viene attivata per un loop di programma l’uscita Fault.

I parametri di default del dispositivo sono 9600, n, 8, 1, nodo modbus 1.

Per attivare il menù di configurazione premere per 3 secondi sul tasto “E” attivando il menù di password. Definita la pasword (Default 1000) agendo nuovamente per 3 secondi sul tasto “E” si accede al menù parametri.

Con i tasti “M” e “P” è possibile eseguire lo scan di tutti i parametri. Per modificare il valore di un parametro premere per 3 secondi sul tasto “E”.

Enable (BOOL) Attivazione gestione, se disabilitata ModbusMsCore passa ad eseguire FB successivo.
MMID (UDINT) Modbus master ID copiare valore in uscita da ModbusMsCore.
Node (USINT) Numero di nodo modbus su cui effettuare il comando (Range da 0 a 255).
Timeout (UDINT) Valore di timeout esecuzione singola interrogazione Modbus (mS)
Done (BOOL) Attivo per un loop al termine della acquisizione di tutte le variabili.
Fault (BOOL) Attivo per un loop se errore esecuzione.
Errors (UDINT) Numero errori di comunicazione con analizzatore di energia.
Voltage (REAL) Line voltage (Volts). [0]:Fase 1, [1]:Fase 2, [2]:Fase 3, [3] Valore medio
Current (REAL) Line current (Amps). [0]:Fase 1, [1]:Fase 2, [2]:Fase 3, [3] Valore medio, [4] Valore totale
PhAngle (REAL) Phase angle (Degrees). [0]:Fase 1, [1]:Fase 2, [2]:Fase 3, [3] Valore totale
Frequency (REAL) Line frequency (Hertz).
ACPower (REAL) Active power (Watts). [0]:Fase 1, [1]:Fase 2, [2]:Fase 3, [3] Valore medio
ApPower (REAL) Apparent power (VA). [0]:Fase 1, [1]:Fase 2, [2]:Fase 3, [3] Valore totale
RePower (REAL) Reactive power (Var). [0]:Fase 1, [1]:Fase 2, [2]:Fase 3, [3] Valore totale
PwFactor (REAL) Power factor (None). [0]:Fase 1, [1]:Fase 2, [2]:Fase 3, [3] Valore totale
IAcEnergy (REAL) Import active energy (kWh).
EAcEnergy (REAL) Export active energy (kWh).
TAcEnergy (REAL) Total active energy (kWh).

Codici di errore

In caso di errore si attiva l’uscita Fault, con SysGetLastError è possibile rilevare il codice di errore.

Codice Descrizione
10066010 FB eseguita in una task diversa dalla task di background.
10066020 MMID non definito.
10066030 MMID non impostato correttamente.
10066100 Troppe FB istanziate.

Esempi

Nell’esempio viene gestita la lettura di un analizzatore di rete Eastron tipo SDM630.

Definizione variabili

VAR
Meter : EastronSDM630_v1; (\* SDM630 meter \*)
SPort : SysSerialPort; (\* Serial port \*)
MManager : ModbusMsCore; (\* Master modbus core \*)
MMdb : ModbusMaster; (\* ModbusMaster instance \*)
END_VAR

Esempio FBD (PTP141B000, FBD_EastronSDM630_v1)

image7

Esempio ST (PTP141A200, FBD_EastronSDM630_v1)

IF (SysFirstLoop) THEN
SPort.COM:=ADR('COM0'); (\* COM port definition \*)
SPort.Baudrate:=9600; (\* Baudrate \*)
SPort.Parity:='N'; (\* Parity \*)
SPort.DataBits:=8; (\* Data bits \*)
SPort.StopBits:=1; (\* Stop bits \*)
SPort.DTRManagement:=DTR_AUTO_WO_TIMES; (\* DTR management \*)
SPort.DTRComplement:=FALSE; (\* DTR complement \*)
SPort.EchoFlush:=FALSE; (\* Received echo flush \*)
SPort.DTROnTime:=0; (\* DTR On time delay (mS) \*)
SPort.DTROffTime:=0; (\* DTR Off time delay (mS) \*)
SPort.FlushTm:=0; (\* Flush time (mS) \*)
SPort.RxSize:=0; (\* Rx buffer size \*)
SPort.TxSize:=0; (\* Tx buffer size \*)
MManager.SpyOn:=TRUE; (\* Spy On \*)
Mmanager.Mmdb:=ADR(MMdb); (\* Modbus manager FB \*)
MManager.IFTime:=3430; (\* Interframe time (uS) \*)
MManager.Delay:=10; (\* Communication delay (mS) \*)
Meter.Node:=1; (\* Meter modbus node \*)
Meter.Timeout:=200; (\* Meter modbus timeout (mS) \*)
END_IF;
SPort(Open:=TRUE); (\* Serial port management \*)
MManager.File:=SPort.File; (\* File pointer \*)
MManager(Enable:=SPort.Opened); (\* Master modbus core \*)
Meter.MMID:=MManager.MMID; (\* Modbus master ID \*)
Meter(Enable:=TRUE); (\* SD630 meter \*)