zoukankan      html  css  js  c++  java
  • 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 
             
  • 相关阅读:
    Getting Started with ASP.NET Web API 2 (C#)
    借助StackView简化页面布局
    获取网络数据
    歌曲列表和频道列表
    自定义UIImage组件实现圆形封面,转动,以及模糊背景
    什么是CoreData?
    Swift
    PNChart图表绘制库的使用
    PathCover个人主页控件使用
    ProgressHUD进程提示控件的使用
  • 原文地址:https://www.cnblogs.com/csflyw/p/14648468.html
Copyright © 2011-2022 走看看