ModbusRTU_Master之FB的建立

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 
         
原文地址:https://www.cnblogs.com/csflyw/p/14648468.html