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
LogicLabeLLabMdbDevsLib

Enable (BOOL) Comando abilitazione gestione. Da collegare a Done del FB precedente se utilizzato in cascata.

MMdb (@ModbusMaster) Indirizzo istanza FB ModbusMaster per gestione protocollo Modbus.

ACAdd (@ACMODBUS_DATA) Indirizzo array 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.

Ok (BOOL) Attivo per un loop se tutti i comandi sono stati eseguiti correttamente.

Fault (BOOL) Attivo per un loop se errore di esecuzione.

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).

LogicLab (Ptp141)
PROGRAM ST_ACModbus
VAR
    i : UDINT; (* Auxiliary variable *)
    Sp : SysSerialPort; (* Serial port management *)
    ACData : ARRAY[ 0..2 ] OF ACMODBUS_DATA; (* Array command data *)
    MMdb : ModbusMaster; (* 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"
// ****************************************************************************
// 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.IFTime:=3430; //Interframe time (uS)    
        MMdb.Timeout:=200; //Timeout time (mS)    
        MMdb.Delay:=100; //Delay time (mS)    

        // 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]

Ti è stato utile questo articolo ?

Ultimo aggiornamento: 19 Novembre 2019