• ModbusTCP_Client之FB的建立


    (*
    1、III型Modbus TCP服务端模块
    2、为了实现通用化
    *)
    FUNCTION_BLOCK ModbusTCP_Client
    VAR_IN_OUT 
            IPAddr:                       STRING;                                 //IP
            wPort:                        WORD;                                   //端口
            UnitID:                       UINT;                                   //ID
            Address:                      DWORD;                                  //起始地址
            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:                         INT;
            errorID:                        UINT := 0;
    END_VAR
    VAR
            //客户端通信(实例化)
            aMBUS_TCP_REQ:                  ARRAY[0..5] OF HSMBUS.ModbusTcpClient;
         
            iCounter:                       INT;                      //计数器 
            iMdbRegStatus:                  INT;                      //状态机
            abDoneConnect:                  ARRAY[0..10] OF INT;
            
            tab_bits1:                     ARRAY[0..149] OF BOOL;                   //线圈状态寄存器 1位,最高300个,客户端只写,服务端只读
    END_VAR
    CASE iMdbRegStatus OF 
        0: //初始化
              (*4种寄存器*)
               FOR iCounter:= 0 TO 3 BY 1 DO
                   aMBUS_TCP_REQ[iCounter](
                                iId:= 1, 
                                strIpAddr:= IPAddr, 
                                iPort:= wPort, 
                                bEnable:= FALSE, 
                                iRspTimeout:= 1000);
               END_FOR
               
               iMdbRegStatus:=1; //下一状态机
        1://读或者写数据
               //读取线圈寄存器
               aMBUS_TCP_REQ[0](
                            bEnable:= TRUE, 
                            iFuncCode:= ModbusCmd.MODBUS_READ_DISCRETE_INPUTS,//功能码, 
                            Address1:= Address,//起始地址
                            iDataSize1:= NumBits,//线圈寄存器个数, 
                            dataPtr1:= ADR(tab_bits),//存储数据, 
                            iStatus=> Status, 
                            iDone=> abDoneConnect[0], 
                            iError=> errorID);
                IF abDoneConnect[0]=1 AND Status=1 THEN
                    iMdbRegStatus:= 2;
                    aMBUS_TCP_REQ[0](
                                iId:= 1, 
                                strIpAddr:= IPAddr, 
                                iPort:= wPort, 
                                bEnable:= FALSE, 
                                iRspTimeout:= 1000);
                END_IF
          2:
                //写入线圈寄存器
                aMBUS_TCP_REQ[0](
                            bEnable:= TRUE, 
                            iFuncCode:= ModbusCmd.MODBUS_WRITE_MULTIPLE_COILS,//功能码, 
                            Address1:= Address,//起始地址
                            iDataSize1:= NumInputBits,//线圈寄存器个数, 
                            dataPtr1:= ADR(tab_inputbits),//存储数据, 
                            iStatus=> Status, 
                            iDone=> abDoneConnect[0], 
                            iError=> errorID);
               IF abDoneConnect[0]=1 AND Status=1 THEN
                  iMdbRegStatus:= 3;
                  aMBUS_TCP_REQ[0](
                                iId:= 1, 
                                strIpAddr:= IPAddr, 
                                iPort:= wPort, 
                                bEnable:= FALSE, 
                                iRspTimeout:= 1000);             
               END_IF
               
                     
        3:
                //读取写入寄存器
                aMBUS_TCP_REQ[0](
                            bEnable:= TRUE, 
                            iFuncCode:= ModbusCmd.MODBUS_READ_INPUT_REGISTERS,//功能码, 
                            Address1:= Address,//起始地址
                            iDataSize1:= NumRegisters,//线圈寄存器个数, 
                            dataPtr1:= ADR(tab_regs),//存储数据, 
                            iStatus=> Status, 
                            iDone=> abDoneConnect[0], 
                            iError=> errorID);
               IF abDoneConnect[0]=1 AND Status=1 THEN
                  iMdbRegStatus:= 4;
                  aMBUS_TCP_REQ[0](
                                iId:= 1, 
                                strIpAddr:= IPAddr, 
                                iPort:= wPort, 
                                bEnable:= FALSE, 
                                iRspTimeout:= 1000);    
               END_IF
         4:
     
                //写入寄存器
                aMBUS_TCP_REQ[0](
                            bEnable:= TRUE, 
                            iFuncCode:= ModbusCmd.MODBUS_WRITE_MULTIPLE_REGISTERS,//功能码, 
                            Address1:= Address,//起始地址
                            iDataSize1:= NumInputRegisters,//线圈寄存器个数, 
                            dataPtr1:= ADR(tab_inputregs),//存储数据, 
                            iStatus=> Status, 
                            iDone=> abDoneConnect[0], 
                            iError=> errorID);
                //各类寄存器读或写完成
                IF abDoneConnect[0]=1 AND Status=1 THEN
                    iMdbRegStatus:=1;    
                    aMBUS_TCP_REQ[0](
                                iId:= 1, 
                                strIpAddr:= IPAddr, 
                                iPort:= wPort, 
                                bEnable:= FALSE, 
                                iRspTimeout:= 1000);
                END_IF
                
    END_CASE
    
    
    (*
    CASE iMdbRegStatus OF 
        0: //初始化
              (*4种寄存器*)
               FOR iCounter:= 0 TO 3 BY 1 DO
                   aMBUS_TCP_REQ[iCounter](
                                 ReqEnable:=FALSE,
                                 UnitID:=1,
                                 Port:=wPort,
                                 IPAddr:=IPAddr,
                                 RspTimeOut:=1000,
                                 DataTimeOut:=1000 );
               END_FOR
               
               iMdbRegStatus:=1; //下一状态机
        1://读或者写数据
               //读取线圈寄存器
               aMBUS_TCP_REQ[0]( 
                             ReqEnable:=TRUE,
                             Command:=HNCMBUS.MODBUS_READ_DISCRETE_INPUTS,
                             Address0:=Address,
                             DataSize0:=NumBits,
                             DataPtr0:=ADR(tab_bits),
                             Status  =>Status,
                             ErrorID =>errorID,
                             Done    =>abDoneConnect[0]
                             );
                
                //写入线圈寄存器
                aMBUS_TCP_REQ[1]( 
                             ReqEnable:=TRUE,
                             Command:=HNCMBUS.MODBUS_WRITE_MULTIPLE_COILS,
                             Address0:=Address,
                             DataSize0:=NumInputBits,
                             DataPtr0:=ADR(tab_inputbits),
                             Status  =>Status,
                             ErrorID =>errorID,
                             Done    =>abDoneConnect[1]
                             );
                     
                //读取写入寄存器
                aMBUS_TCP_REQ[2]( 
                             ReqEnable:=TRUE,
                             Command:=HNCMBUS.MODBUS_READ_INPUT_REGISTERS,
                             Address0:=Address,
                             DataSize0:=NumRegisters,
                             DataPtr0:=ADR(tab_regs),
                             Status  =>Status,
                             ErrorID =>errorID,
                             Done    =>abDoneConnect[2]
                             );
                             
                //写入寄存器
                aMBUS_TCP_REQ[3]( 
                             ReqEnable:=TRUE,   
                             Command:=HNCMBUS.MODBUS_WRITE_MULTIPLE_REGISTERS,
                             Address0:=Address,
                             DataSize0:=NumInputRegisters,
                             DataPtr0:=ADR(tab_inputregs),
                             Status  =>Status,
                             ErrorID =>errorID,
                             Done    =>abDoneConnect[3]
                             );
        
                //各类寄存器读或写完成
                IF (*abDoneConnect[0] AND abDoneConnect[1] AND abDoneConnect[2] AND*) abDoneConnect[3] THEN
                    iMdbRegStatus:=0;    
                END_IF
                
    END_CASE
    *)
  • 相关阅读:
    装配线调度
    最长非降子序列
    0-1背包问题
    所有点对的最短路径问题
    矩阵链相乘
    最长公共子序列
    最近点对问题
    寻找多数元素
    寻找第K小元素
    java冒泡排序算法
  • 原文地址:https://www.cnblogs.com/csflyw/p/14648485.html
Copyright © 2020-2023  润新知