Questo FB permette di eseguire un array di comandi Modbus, si connette al FB ModbusMaster ed in base alla selezione del tipo ed allo stream di comunicazione si possono gestire comandi Modbus Ascii, Modbus RTU, Modbus TCP sia su seriale che su connessione ethernet (UDP/TCP).
Permette di essere utilizzato in cascata con altri FB della libreria, collegando il Done di una FB con Enable di quella successiva è possibile creare catene di FB che condividono la stessa connessione Modbus.
In MMdb occorre passare l'indirizzo del FB di gestione protocollo Modbus. In ACAdd occorre indicare l'indirizzo di allocazione della struttura ACMODBUS_DATA che contiene tutte le informazioni dei comandi ed in ACNr occorre definire il numero di comandi. Si ricorda di importare la definizione della struttura ACMODBUS_DATA dalla libreria nel proprio progetto.
Se tutti i comandi definiti sono eseguiti con successo si attiva per un loop di programma l'uscita Ok.
Function block
CODESYS: Non disponibile
LogicLab: eLLabMdbDevsLib
Enable (BOOL) Comando abilitazione gestione. Da collegare a Done del FB precedente se utilizzato in cascata.
MMdb (@ModbusMaster_v1) Indirizzo istanza FB ModbusMaster per gestione protocollo Modbus.
ACAdd (@ACMODBUS_DATA) Indirizzo array strutture ACMODBUS_DATA definizione comandi Modbus da eseguire.
ACNr (UDINT) Numero comandi Modbus da eseguire (Lunghezza array definizione).
Done (BOOL) Esecuzione terminata, rimane attivo fino alla disabilitazione di Enable. Da collegare ad Enable del FB successivo se utilizzato in cascata.
Fault (BOOL) Attivo per un loop se errore di esecuzione.
CStart (BOOL) Attivo per un loop su start comando Modbus, sincronizzandosi con AIDx è possibile gestire logiche su avvio comandi.
COk (BOOL) Attivo per un loop se comando Modbus eseguito correttamente, sincronizzandosi con AIDx è possibile gestire logiche su esecuzione comandi.
AIDx (USINT) Indice array attivo, da utilizzarsi con CStart e COk per sincronizzarsi sui comandi.
Errors (UDINT) Numero errori di esecuzione.
Errori
In caso di errore eseguendo immediatamente dopo la funzione SysGetLastError è possibile rilevare il codice di errore. Fare riferimento alla tabella seguente per la descrizione.
Esempi
Come utilizzare gli esempi.
Viene eseguita la lettura dei registri di temperatura, umidità e CO2 da un sensore Sensit STHC120. Per avere una rappresentazione grafica del funzionamento in cascata rimando all'esempio in FBD del SDM120 (Articolo).
PROGRAM ST_ACModbus_v1
VAR
i : UDINT; (* Auxiliary variable *)
Sp : SysSerialPort; (* Serial port management *)
ACData : ARRAY[ 0..2 ] OF ACMODBUS_DATA; (* Array command data *)
MMdb : ModbusMaster_v1; (* Modbus master *)
ACMdb : ACModbus; (* Array command modbus *)
Temperature : UINT; (* Temperature (0.01 °C) *)
Humidity : UINT; (* Humidity (0.01 %) *)
CO2 : UINT; (* CO2 (ppm) *)
END_VAR
// ****************************************************************************
// PROGRAM "ST_ACModbus_v1"
// ****************************************************************************
// This program acquires temperature, humidity and CO2 registers from a STHC102
// sensors.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// INITIALIZATION
// -------------------------------------------------------------------------
// Program initializations.
IF (SysFirstLoop) THEN
// Serial port settings.
Sp.COM:=ADR('COM2'); //COM port definition
Sp.Baudrate:=9600; //Baudrate
Sp.Parity:='N'; //Parity
Sp.DataBits:=8; //Data bits
Sp.StopBits:=1; //Stop bits
Sp.DTRManagement:=DTR_AUTO_WO_TIMES; //DTR management
Sp.DTRComplement:=FALSE; //DTR complement
Sp.EchoFlush:=FALSE; //Received echo flush
Sp.DTROnTime:=0; //DTR On time delay (mS)
Sp.DTROffTime:=0; //DTR Off time delay (mS)
Sp.FlushTm:=0; //Flush time (mS)
Sp.RxSize:=0; //Rx buffer size
Sp.TxSize:=0; //Tx buffer size
// Modbus master settings.
MMdb.SpyOn:=TRUE; //Spy On
MMdb.Type:=0; //Modbus type
MMdb.Timeout:=0.2; //Timeout time (S)
MMdb.Delay:=0.1; //Delay time (S)
// Array command modbus settings.
ACMdb.ACAdd:=ADR(ACData); //Array command address
ACMdb.ACNr:=SIZEOF(ACData)/SIZEOF(ACData[0]); //Array command number
ACMdb.MMdb:=ADR(MMdb); //ModbusMaster pointer
// Array command parameters settings.
ACData[0].Node:=1; //Modbus node
ACData[0].FCode:=16#03; //Modbus function code
ACData[0].Address:=9; //Modbus register address
ACData[0].Points:=1; //Modbus register points
ACData[0].Buffer:=ADR(Temperature); //Memory buffer address
ACData[1].Node:=1; //Modbus node
ACData[1].FCode:=16#03; //Modbus function code
ACData[1].Address:=10; //Modbus register address
ACData[1].Points:=1; //Modbus register points
ACData[1].Buffer:=ADR(Humidity); //Memory buffer address
ACData[2].Node:=1; //Modbus node
ACData[2].FCode:=16#03; //Modbus function code
ACData[2].Address:=11; //Modbus register address
ACData[2].Points:=1; //Modbus register points
ACData[2].Buffer:=ADR(CO2); //Memory buffer address
END_IF;
// -------------------------------------------------------------------------
// ARRAY COMMAND MANAGEMENT
// -------------------------------------------------------------------------
// Manage the Modbus communication.
Sp(Open:=TRUE); //Serial port management
MMdb.File:=Sp.File; //File pointer
MMdb(); //Modbus master
ACMdb(); //Modbus master
// Manage modbus commands.
ACMdb.Enable:=NOT(ACMdb.Done); //FB enable
// [End of file]
Ultimo aggiornamento: 8 Ottobre 2020