ModbusRTU_Slave之FB的建立

(*
1、III型Modbus TCP客户端模块
2、为了实现通用化
*)
FUNCTION_BLOCK ModbusRTU_Slave
VAR_IN_OUT 
       dwBaudRate:                   WORD;                             //波特率
       Device:                       UINT;                                //串口号
       NumBits:                      INT;                               //线圈状态寄存器个数
       NumInputBits:                 INT;                               //输入状态寄存器个数
       NumRegisters:                 INT;                               //保持寄存器个数
       NumInputRegisters:            INT;                               //输入寄存器个数
         
       //寄存器
       tab_bits:                     ARRAY[0..149] OF BOOL;             //线圈状态寄存器 1位,最高300个,客户端只写,服务端只读
       tab_inputbits:                ARRAY[0..149] OF BOOL;             //输入状态寄存器1位,最高300个,客户端只读,服务端只写 
       tab_regs:                     ARRAY[0..149] OF INT;             //保持寄存器 16位,最高300个,客户端只写,服务端只读 
       tab_inputregs:                ARRAY[0..149] OF INT;             //输入寄存器16位,最高300个,客户端只读,服务端只写      
END_VAR
VAR_OUTPUT
        Status:                      UINT;
        errorID:                     UINT := 0;
END_VAR
VAR
        //实例化
        MBUS_RTU_Connect      :HSMBUS.ModbusHsRtuConnect;
        MBUS_RTU_SLAVE:              HSMBUS.ModbusHsRtuSlave;    (* modbus rtu slave  *) 
        uiMbsStatus           :UINT;    
        uiMbsError              :UINT := 0;
END_VAR
MBUS_RTU_Connect(
    bEnable:= TRUE, 
    iDeviceId:= Device, 
    dBaud:= dwBaudRate, 
    iParity:= 0, 
    iConnectType:= 1, 
    iError=> uiMbsError, 
    iStatus=> uiMbsStatus);
    
IF (uiMbsStatus <> 1) THEN
    RETURN;
END_IF

MBUS_RTU_SLAVE(
            iDeviceId:= Device, 
            iSlaveId:= 1, 
            bEnable:= TRUE, 
            iDiscreteInputNums:= INT_TO_UINT(NumInputBits), 
            pDiscreteInputs:= ADR(tab_inputbits),   //输入对方线圈状态数据 
            iCoilNums:= INT_TO_UINT(NumBits), 
            pCoils:= ADR(tab_bits),        //读取对方线圈状态数据
            iInputRegisterNums:= INT_TO_UINT(NumInputRegisters), 
            pInputRegisers:= ADR(tab_inputregs), //输入对方寄存器数据 
            iRegiserNums:= INT_TO_UINT(NumRegisters), 
            pRegisers:= ADR(tab_regs),        //读取对方寄存器数据  
            iError=> errorID, 
            iStatus=> Status);
原文地址:https://www.cnblogs.com/csflyw/p/14648480.html