AM402通讯之ModbusTCP_Client(配置的方式)

以下为汇川AM402系列PLC(客户端-10.10.56.88)与华数机器人三型系统(服务端10.10.56.99)之间的ModbusTCP通讯:

注意:汇川PLC是通过配置(推荐)的方式实现的,华数机器人是通过ST语言的方式实现的;经测试能实现自动重连。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

以下为华数机器人的通讯程序:

1,首先需要添加库文件

 

 

 

 2,编写服务端通讯程序FB块,具体程序内容如下:

 

 

 

 

FUNCTION_BLOCK ModbusTCP_Server
VAR_IN_OUT   
        UnitID:                       UINT;                              //ID
        wPort:                        WORD;                              //端口
        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;
        error:                        UINT := 0;
END_VAR
VAR
        //实例化
        MBUS_TCP_SERVER:              HNCMBUS.ModbusTcpSlave;    (* modbus tcp server *)
        bEnableServer:                BOOL;
END_VAR
//TCP 服务端
MBUS_TCP_SERVER(Enable             := true,
                UnitID             := UnitID,                
                RspTimeOut         := 100,
                DataTimeOut     := 100,
                Port             := wPort,                           //端口
                SlaveCount         := 10,
                
                NumBits         := INT_TO_UDINT(NumBits),          //读线圈状态寄存器的大小
                TabBits         := ADR(tab_bits),                  //读对方线圈状态
                NumInputBits     := INT_TO_UDINT(NumInputBits),     //写线圈状态寄存器的大小
                TabInputBits     := ADR(tab_inputbits),             //写对方线圈状态
                NumRegisters     := INT_TO_UDINT(NumRegisters),     //读取寄存器的大小
                TabRegisters     := ADR(tab_regs),                  //读对方寄存器
                NumInputRegisters := INT_TO_UDINT(NumInputRegisters), //输入寄存器的大小
                TabInputRegisters := ADR(tab_inputregs),           //写对方寄存器
                
                Status             => Status,
                ErrorID         => error);
                

 

 

3,在调用FB之前需要新建一些全局变量存储通信数据,变量列表如下:

 

 

 

 

VAR_GLOBAL
//Modbus 
    COIL_STAT:         ARRAY[0..149] OF  BOOL;    //线圈状态寄存器 1位,最高150个,客户端只写,服务端只读  用法COIL_STAT[0]
    IN_STAT:           ARRAY[0..149] OF  BOOL;    //输入状态寄存器1位,最高150个,客户端只读,服务端只写  用法IN_STAT[0]
    HOLD_REG:          ARRAY[0..149] OF  INT;    //保持寄存器 16位,最高150个,客户端只写,服务端只读   用法HOLD_REG[0]
    IN_REG:            ARRAY[0..149] OF  INT;    //输入寄存器16位,最高150个,客户端只读,服务端只写  用法IN_REG[0]
    
//总切换按钮
    GC_bTCP:                                          BOOL;                        //RTU/TCP 
    GC_bRTU:                                          BOOL;                        //RTU/TCP 
    GC_bRTU_MASTER:                                   BOOL;                        //RTU 主站
    GC_bRTU_Slave:                                    BOOL;                        //RTU 从站
    GC_bTCP_Server:                                   BOOL;                        //TCP 服务端
    GC_bTCP_Client:                                   BOOL;                        //TCP 客户端 
    
//MoGC_dbus TCP Server
    GC_wPortServerTCP:                                WORD:= 502;                  //端口
    GC_udiNumServerTCP:                               INT:= 150;                   //寄存器个数
    GC_UnitIDServer:                                  UINT:= 2;                    //ID
    
    
//MoGC_dbus TCP Client
    GC_UnitIDClient:                                  UINT:= 1;                    //ID
    GC_IPAddrClient:                                  STRING:= '192.168.6.10';     //IPAddrClient
    GC_Address:                                       DWORD:= 0;                 //起始地址
    GC_wPortClientTCP:                                WORD:= 502;                  //端口
    GC_udiNumClientTCP:                               INT:=150;                     //寄存器个数150
    
    
//MoGC_dbus RTU Master
    GC_dwBaudRateMaster:                              WORD:= 9600;                 //波特率
    GC_DeviceMaster:                                  UINT:=10;                    //串口号
      GC_udiNumMaster:                                  INT:=150;                    //寄存器个数
//MoGC_dbus RTU Slave                                                              
    GC_dwBaudRateSlave:                               WORD:= 9600;                 //波特率
    GC_DeviceSlave:                                   UINT:=10;                    //串口号
      GC_udiNumSlave:                                   INT:=150;                    //寄存器个数
    
//Modbus通讯心跳
    GC_bSwitchConnect:                                 BOOL;                        //通讯开关
    GC_bAlarmConnect:                                  BOOL;                        //通讯报警---映射(任意)
    GC_bResetConnect:                                  BOOL;                        //复位报警---映射(任意)

    GC_iDelayTimeConnect:                                INT;                         //延时时间
    
    GC_HoldRegConnect:                                 INT;                        //读取对方数据  一定时间内没变化就报警---映射(读取保持寄存器)
    GC_InputRegConnect:                                INT;                        //写给对方的  0<>1---映射 (写入寄存器)
END_VAR 

4,具体调用程序如下:

 

 

 

 

PROGRAM ModbusTcp
VAR
    ModbusTCP_Server1: ModbusTCP_Server;
    ModbusTCP_Client1: ModbusTCP_Client;
END_VAR
//Modbus TCP 
GC_bTCP_Server:= TRUE;
GC_bTCP_Client:= FALSE;

IF GC_bTCP_Server=TRUE AND GC_bTCP_Client=FALSE THEN   //默认是服务端
    ModbusTCP_Server1(
                    UnitID:= GC_UnitIDServer, 
                    wPort:= GC_wPortServerTCP, 
                    NumBits:= GC_udiNumServerTCP, 
                    NumInputBits:= GC_udiNumServerTCP, 
                    NumRegisters:= GC_udiNumServerTCP, 
                    NumInputRegisters:= GC_udiNumServerTCP, 
                    tab_bits:= COIL_STAT, 
                    tab_inputbits:= IN_STAT, 
                    tab_regs:= HOLD_REG, 
                    tab_inputregs:= IN_REG, 
                    Status=> , 
                    error=> );
ELSIF GC_bTCP_Server=FALSE AND GC_bTCP_Client=TRUE THEN//客户端010 85888936
     ModbusTCP_Client1(
                    IPAddr:= GC_IPAddrClient, 
                    wPort:= GC_wPortClientTCP, 
                    UnitID:= GC_UnitIDClient, 
                    Address:= GC_Address, 
                    NumBits:= GC_udiNumClientTCP, 
                    NumInputBits:= GC_udiNumClientTCP, 
                    NumRegisters:= GC_udiNumClientTCP, 
                    NumInputRegisters:= GC_udiNumClientTCP, 
                    tab_bits:= COIL_STAT, 
                    tab_inputbits:= IN_STAT, 
                    tab_regs:= HOLD_REG, 
                    tab_inputregs:= IN_REG, 
                    Status=> , 
                    errorID=> );
END_IF        

到此结束。。。

posted @ 2021-02-14 19:47  CSF践行  阅读(0)  评论(0)    收藏  举报