FUNCTION_BLOCK ModbusRTU_Master 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 //modbus 通信 modbus rtu //MBUS_RTU_MASTER :HNCMBUS.ModbusRtuPoll; (* modbus rtu master *) MBUS_RTU_Connect :HSMBUS.ModbusHsRtuConnect; MBUS_RTU_MSG,MBUS_RTU_MSG1,MBUS_RTU_MSG2,MBUS_RTU_MSG3 :HSMBUS.ModbusHsRtuMaster; (* modbus rtu msg *) blink_0 :blink; handle :RTS_IEC_HANDLE; tab_read_hold1 :ARRAY[0..9] OF INT; bMbsRtuDone :BOOL := FALSE; uiMbsStatus :UINT; uiMbsError :UINT := 0; iturn :INT:= 0; //r1 :R_TRIG; //******TON**************************************/ Timer_ON :TON; Timer_ON1 :TON; Timer_ON2 :TON; Timer_ON3 :TON; icount: BOOL; bReq : ARRAY[0..9] OF BOOL; r_Trig : ARRAY[1..9] OF R_TRIG; END_VAR
(* blink_0(ENABLE := TRUE, TIMELOW := T#200MS, TIMEHIGH := T#200MS); r1(CLK := blink_0.OUT); IF r1.Q THEN iturn := iturn + 1; END_IF *) (* modbus rtu master *) //使用Modbus RTU ,控制器作为RTU 主站,读取并映射力传感器的数值 MBUS_RTU_Connect( bEnable:= TRUE, iDeviceId:= Device, dBaud:= dwBaudRate, iParity:= 0, iConnectType:= 0, iError=> uiMbsError, iStatus=> uiMbsStatus); IF (uiMbsStatus <> 1) THEN RETURN; END_IF IF icount=FALSE THEN bReq[0]:=TRUE; END_IF icount:=TRUE; r_Trig[1](CLK:=(bReq[0] OR bReq[5])); //1、读取寄存器 MBUS_RTU_MSG( iDeviceId:= Device, iSlaveId:= 1, bEnable:= r_Trig[1].Q, iFuncCode:= ModbusCmd.MODBUS_READ_INPUT_REGISTERS, Address1:= 0, iDataSize1:= NumRegisters, dataPtr1:= ADR(tab_regs), iRspTimeout:= 1000); //iError=> , //iDone=> , //iStatus=> ); Timer_ON(IN := bReq[0], PT := T#100MS); IF Timer_ON.Q THEN bReq[3] := FALSE; bReq[1] := TRUE; END_IF r_Trig[2](CLK:= bReq[1]); //2、读取线圈状态 MBUS_RTU_MSG1( iDeviceId:= Device, iSlaveId:= 1, bEnable:= r_Trig[2].Q, iFuncCode:= ModbusCmd.MODBUS_READ_DISCRETE_INPUTS, Address1:= 0, iDataSize1:= NumBits, dataPtr1:= ADR(tab_bits), iRspTimeout:= 1000); //iError=> , //iDone=> , //iStatus=> ); // 上升沿计时器,计时完成后对上一个读/写请求标志位进行复位,对下一个读/写请求进行置位 Timer_ON1(IN := bReq[1], PT := T#100MS); IF Timer_ON1.Q THEN bReq[0] := FALSE; bReq[2] := TRUE; END_IF r_Trig[3](CLK:= bReq[2]); //3、写入寄存器 MBUS_RTU_MSG2( iDeviceId:= Device, iSlaveId:= 1, bEnable:= r_Trig[3].Q, iFuncCode:= ModbusCmd.MODBUS_WRITE_MULTIPLE_REGISTERS, Address1:= 0, iDataSize1:= NumInputRegisters, dataPtr1:= ADR(tab_inputregs), iRspTimeout:= 1000); //iError=> , //iDone=> , //iStatus=> ); Timer_ON2(IN := bReq[2], PT := T#100MS); IF Timer_ON2.Q THEN bReq[1] := FALSE; bReq[3] := TRUE; END_IF r_Trig[4](CLK:= bReq[3]); //4、写入线圈状态 MBUS_RTU_MSG3( iDeviceId:= Device, iSlaveId:= 1, bEnable:= r_Trig[4].Q, iFuncCode:= ModbusCmd.MODBUS_WRITE_MULTIPLE_COILS, Address1:= 0, iDataSize1:= NumInputBits, dataPtr1:= ADR(tab_inputbits), iRspTimeout:= 1000); //iError=> , //iDone=> , //iStatus=> ); Timer_ON3(IN := bReq[3], PT := T#100MS); IF Timer_ON3.Q THEN bReq[2] := FALSE; bReq[0] := TRUE; END_IF