FB_MBReadInputRegs (Modbus function 4)

FB_MBReadInputRegs (Modbus function 4) 1:

This function is used for reading 1 to 128 input registers (16 bit). Observe the byte-order little endian.

VAR_INPUT

VAR_INPUT
    sIPAddr    : STRING(15);
    nTCPPort   : UINT:= MODBUS_TCP_PORT;
    nUnitID    : BYTE:=16#FF;
    nQuantity  : WORD;
    nMBAddr    : WORD;
    cbLength   : UDINT;
    pDestAddr  : POINTER OF BYTE;
    bExecute   : BOOL;
    tTimeout   : TIME;
END_VAR

sIPAddr: Is a string containing the IP address of the target device.

nTCPPort: Port number of the target device.

nUnitID: Identification number of a serial sub-network device. If a device is addressed directly via TCP/IP, this value must be 16#FF.

nQuantity: Number of input registers (data words) to be read. The value of nQuantity must be > 0.

nMBAddr: Start address of the input register to be read (word offset).

cbLength: Contains the max. byte size of the destination buffer. The minimum buffer byte size must be: nQuantity * 2.

pDestAddr: Contains the address of the destination buffer into which the data are to be read. The buffer can be a single variable, an array or a structure, whose address can be found with the ADR operator.

bExecute: The function block is activated by a rising edge at this input.

tTimeout: States the length of the timeout that may not be exceeded by execution of the ADS command.

VAR_OUTPUT

VAR_OUTPUT
    bBUSY      : BOOL;
    bError     : BOOL;
    nErrId     : UDINT;
    cbRead     : UDINT;
END_VAR

bBusy : When the function block is activated this output is set. It remains set until an acknowledgement is received.

bError : If an ADS error should occur during the transfer of the command, then this output is set once the bBusy output is reset.

nErrId : Supplies the ADS error number when the bError output is set.

cbRead: Contains the number of bytes currently read.

Function specific ADS error code

Possible reason

0x8001

Modbus function not implemented

0x8002

Invalid address or length

0x8003

Invalid parameters: - wrong number of registers

0x8004

Modbus server error

Example of calling the block in FBD:

PROGRAM Test
VAR
    fbReadRegs         : FB_MBReadRegs;
    bReadRegs          : BOOL;
    bReadRegsBusy      : BOOL;
    bReadRegsError     : BOOL;
    nReadRegsErrorId   : UDINT;
    nReadRegsCount     : UDINT;
    nQuantity          : WORD := 3;
    nMBAddr            : WORD:= 2;
    arrData            : ARRAY [1..3] OF WORD;
END_VAR

FB_MBReadInputRegs (Modbus function 4) 2:

After a rising edge of "bExecute" and successful execution of the ReadRegs command, the content of registers 3-5 is located in the arrData array:

Register

Array offset

Status

3

1

0x4543 ( as byte 0x43 0x45)

4

2

0x5234 ( as byte 0x34 0x52)

5

2

0x1235 ( as byte 0x35 0x12)

Requirements

Development environment

Target system type

PLC libraries to be linked

TwinCAT v3.0.0

PC or CX (x86)

Tc2_ModbusSrv