ACModbus, Array command Modbus

List

Questa pagina fa parte del Manuale Programmazione IEC 61131-3. Vai all indice.

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

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.

Information Circle

Blocco funzione

CODESYS: Non disponibile

LogicLab: eLLabModbusLib

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.

Immagine FB ACModbus

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 *)
    MValue : ARRAY[0..3] OF UINT; (* Modbus 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(MValue); //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(MValue); //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
        MValue[0]:=MValue[0]+1; //Modbus value
    END_IF;

    // Before to write increases the value.

    IF (ACData[1].Status.1) THEN
        MValue[1]:=MValue[1]+1; //Modbus value
    END_IF;

// [End of file]
Was this article helpful?