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 <#FblModbusMaster>`__. 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 <#FctSysGetLastError>`__ è 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** .. code-block:: none 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 <#modbusmscore-modbus-master-core>`__ 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 <#FctSysGetLastError>`__ è 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** .. code-block:: none 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 <#modbusmscore-modbus-master-core>`__ 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 <#FctSysGetLastError>`__ è 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** .. code-block:: none 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)* .. code-block:: none 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 <#modbusmscore-modbus-master-core>`__ 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 <#FctSysGetLastError>`__ è 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** .. code-block:: none 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)* .. code-block:: none 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 \*) .. |image0| image:: media/image1.jpg :width: 1.33472in :height: 1.54306in .. |image1| image:: media/image2.jpg :width: 7.08681in :height: 3.38958in .. |image2| image:: media/image3.jpg :width: 1.33472in :height: 2.06319in .. |image3| image:: media/image4.jpg :width: 7.08681in :height: 3.38958in .. |image4| image:: media/image5.jpg :width: 1.53125in :height: 2.83472in .. |image5| image:: media/image7.jpg :width: 7.08681in :height: 2.90139in .. |image6| image:: media/image8.jpg :width: 1.56319in :height: 3.01944in .. |image7| image:: media/image10.jpg :width: 7.08681in :height: 3.03958in