Questo blocco funzione da eseguire in task Back utilizzabile con modello a cascata, permette di gestire 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 le informazioni e lo stato dei comandi, in ACNr occorre definire il numero di comandi da gestire.
Upgrade list
- Se l’oggetto aggiornato non è nell’ultima versione del package, vedi capitolo “Aggiornamento librerie” in questo articolo.
- Gli oggetti obsoleti sono inseriti nella libreria eLLabObsoleteLib fare riferimento al relativo manuale ed al manuale programmazione in formato pdf.
ACModbus_v1
Utilizza il nuovo blocco funzione ModbusMaster_v1, tutti gli altri parametri rimangono inalterati.
ACModbus_v2
Utilizza il nuovo blocco funzione ModbusMaster_v2, tutti gli altri parametri rimangono inalterati. Utilizza la nuova struttura dati ACMODBUS_DATA_V2 in cui è stato aggiunta la definizione del campo Absolute.
ACModbus_v3
Utilizza il nuovo blocco funzione ModbusMaster_v3 e la nuova struttura dati ACMODBUS_DATA_V3. Modificata gestione comandi, su errore esecuzione si esegue un nuovo tentativo poi si setta errore. I comandi in errore sono ritentati dopo il tempo definito in RTime. Eliminato uscite CStart, COk, AIDx ora questi dati sono nella struttura dati. Eliminato uscita Errors, ora gli errori sono conteggiati nella struttura dati.
Descrizione
Enable (BOOL) Comando abilitazione gestione. Da collegare a Done del FB precedente se utilizzato in cascata.
MMdb (@ModbusMaster_v3) Indirizzo istanza FB ModbusMaster per gestione protocollo Modbus.
ACAdd (@ACMODBUS_DATA_V3) Indirizzo array strutture ACMODBUS_DATA definizione comandi Modbus da eseguire.
ACNr (UDINT) Numero comandi Modbus da eseguire (Lunghezza array definizione).
RTime (TIME) Tempo attesa prima di ritentare i comandi in errore.
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.

Esempi
Come utilizzare gli esempi.
Viene eseguita la lettura/scritture di 4 registri da un sistema SlimLine. Se definto localhost il programma opera sullo stesso sistema in cui è eseguito. Dopo la lettura e prima della scrittura viene incrementato il valore di alcuni registri.
LogicLab (Ptp205, ST_ACModbus)
PROGRAM ST_ACModbus
VAR
i : UDINT; (* Auxiliary variable *)
TCPClient : SysTCPClient; (* TCP client management *)
MMdb : ModbusMaster_v3; (* Modbus master *)
ACMdb : ACModbus_v3; (* Array command modbus *)
ACData : ARRAY[0..1] OF ACMODBUS_DATA_V3; (* Array command data *)
RValue : ARRAY[0..3] OF UINT; (* Modbus read values *)
WValue : ARRAY[0..3] OF UINT; (* Modbus write values *)
MRegisters AT %MX100.16 : ARRAY[0..3] OF UINT; (* Modbus registers *)
END_VAR
// *****************************************************************************
// PROGRAM "ST_ACModbus"
// *****************************************************************************
// This program connects to a SlimLine system and reads and writes some
// registers through modbus protocol.
// -----------------------------------------------------------------------------
// -------------------------------------------------------------------------
// INITIALIZATION
// -------------------------------------------------------------------------
// Program initializations.
IF (SysFirstLoop) THEN
// TCP client settings.
TCPClient.PeerAdd:=ADR('127.0.0.1'); //Peer address
TCPClient.PeerPort:=502; //Peer port
TCPClient.LocalAdd:=ADR('0.0.0.0'); //Local address
TCPClient.LocalPort:=0; //Local port
TCPClient.FlushTm:=50; //Flush time (mS)
TCPClient.LifeTm:=20; //Life time (S)
TCPClient.RxSize:=128; //Rx buffer size
TCPClient.TxSize:=128; //Tx buffer size
// Modbus master settings.
MMdb.Type:=MODBUS_PROTOCOL#MDB_TCP; //Modbus protocol type
MMdb.Absolute:=FALSE; //Absolute addressing
MMdb.Timeout:=T#1s; //Timeout time
MMdb.Delay:=T#1s; //Delay time
// Array command modbus settings.
ACMdb.ACAdd:=ADR(ACData); //Array command address
ACMdb.ACNr:=SIZEOF(ACData)/SIZEOF(ACData[0]); //Array command number
ACMdb.RTime:=T#10s; //Retry time
// Array command parameters settings.
ACData[0].Command.0:=TRUE; //Spy On
ACData[0].Command.1:=FALSE; //Absolute addressing
ACData[0].Node:=1; //Modbus node
ACData[0].FCode:=16#03; //Modbus function code
ACData[0].Address:=40008; //Modbus register address
ACData[0].Points:=4; //Modbus register points
ACData[0].Buffer:=ADR(RValue); //Memory buffer address
ACData[1].Command.0:=TRUE; //Spy On
ACData[1].Command.1:=FALSE; //Absolute addressing
ACData[1].Node:=1; //Modbus node
ACData[1].FCode:=16#10; //Modbus function code
ACData[1].Address:=40008; //Modbus register address
ACData[1].Points:=4; //Modbus register points
ACData[1].Buffer:=ADR(WValue); //Memory buffer address
END_IF;
// -------------------------------------------------------------------------
// ARRAY COMMAND MANAGEMENT
// -------------------------------------------------------------------------
// Manage the Modbus communication.
TCPClient(Connect:=TRUE); //TCPClient management
MMdb(File:=TCPClient.File); //Modbus master
ACMdb(MMdb:=ADR(MMdb)); //Array command modbus
// Manage modbus commands.
ACMdb.Enable:=NOT(ACMdb.Done) AND (SysFIsOpen(MMdb.File)); //FB enable
// On read Ok increases the value.
IF (ACData[0].Status.0) THEN
WValue[0]:=WValue[0]+1; //Modbus value
END_IF;
// Before to write increases the value.
IF (ACData[1].Status.1) THEN
WValue[1]:=WValue[1]+1; //Modbus value
END_IF;
// [End of file]