I could not find a good example of the Codesys ModbusFB Library as it is more complicated than the WAGO Modbus App Simple Libraries. Here is a simple example of Function Code 3, Read Holding Registers.
PROGRAM ModbusTest
VAR // Connection management
initDone : BOOL := FALSE;
clientTCP : ModbusFB.ClientTCP;
clientRequestReadHR : ModbusFB.ClientRequestReadHoldingRegisters; //FC3
eErrorRead : ModbusFB.Error;
aDataHoldingRegisters : ARRAY[0..3] OF UINT;
aIPAddress: ARRAY[0..3] OF BYTE := [192, 168, 1, 17];
uiPort: UINT := 502;
uiUnitID: UINT := 1;
uiStartAddress: UINT := 20;
uiQuantity: UINT := 4;
udiTimeout: UDINT := 1000;
xExecute: BOOL;
xDone : BOOL;
xBusy : BOOL;
xError : BOOL;
uiRetryCnt : UINT;
wErrorCount : WORD;
wDoneCount : WORD;
T1 : TON;
END_VAR
IF NOT initDone THEN
// Initialize TCP client connection
clientTCP(
xConnect := TRUE,
aIPaddr := aIPAddress, // IP as BYTE array
uiPort := uiPort);
IF clientTCP.xConnected THEN
initDone := TRUE; // Connection established
END_IF
END_IF
T1(IN := NOT xExecute, PT := T#1S);
IF T1.Q THEN
xExecute := TRUE;
END_IF
clientRequestReadHR(
xExecute:= xExecute,
udiTimeOut:= ,
xDone=> xDone,
xBusy=> xBusy,
xError=> xError,
rClient:= clientTCP,
uiUnitId:= uiUnitID,
udiReplyTimeout:= ,
uiMaxRetries:= ,
eErrorID=> eErrorRead,
eException=> ,
uiRetryCnt=> uiRetryCnt,
uiStartItem:= uiStartAddress,
uiQuantity:= uiQuantity,
pData:= ADR(aDataHoldingRegisters));
IF xDone THEN
wDoneCount := wDoneCount + 1;
xExecute := FALSE; // Reset trigger after completion
END_IF
IF xError THEN
wErrorCount := wErrorCount + 1;
xExecute := FALSE; // Reset trigger if failedE
ND_IFHere is the library you need to add to your project.
