(* 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);