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
到此结束。。。

浙公网安备 33010602011771号