Codesys Linux Runtime SL ModbusFB Library Example

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.

4 Likes