无心飞扬 发表于 2024-8-9 23:26:34

codesys modbustcp

我们都知道在以太网上可以使用modbusTCP来进行通讯。以太网通讯需要有服务器和客户端。一般的PLC是在控制器上建立一个服务器器。像上位机及高一层的设备可以连接PLC,最常用的是用modbusTCP的功能4读取输入寄存器的内容,用功能3读取保持寄存器的内容。也可以写PLC的内容。但是,在codesys当中的配置和常规的想法不一样,可能造成混淆。

codesys建立服务器
在控制器侧建立服务器按常规想法是建立一个modbus_TCP_master. 但在实际应用中,我们需要在设备树上添加modbus_TCP_slave_device. 这是在建立服务器最容易混淆的部分。正确的做法如下:





各部分设置如下。

通用设置
总线从站端口:常规设置为502.
保持寄存器:这里可以设置要使用的保持寄存器的多少,占用的地址为%IW
输入寄存器:这里是输入寄存器的地址的多少,占用的地址为%QW。
设置是否有要设置输入和输出离散量的地址。
串口网关
在这里是否使用串口网关。

modbus_TCP_slave_device的映射
这一部分设置于控制器中的地址的映射。

将设置的保持寄存器和输入寄存器于具体的地址关联起来。这里我们设定了10各保持寄存器和10各输入寄存器。映射关系在这里设置。





下面是modbus_TCP_Slave_Device IEC对象,状态和信息项没有设置的部分。

服务器功能实验
在GVL全局变量库中建立一个变量:

VAR_GLOBAL
        IO_QW0 AT %QW0 : INT;
END_VAR

增加一段数据增加的程序,然后下载运行程序。





在外部计算机上运行多功能调试助手





选择端口为502,连接服务器。显示连接服务器成功。在发送区输入modbusTCP读取输入寄存器的内容,我们读取10个输入寄存器的内容。命令16进制码如下:

00 01 00 00 00 06 05 04 03 E8 00 0A

返回帧如下,分别是两次的返回帧:

返回帧1:

00 01 00 00 00 17 05 04 14 21 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

返回帧2:

00 01 00 00 00 17 05 04 14 21 DA 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

其中的字节9和字节10是程序中的输入寄存器1的内容是在程序中不断递增的。

总结
使用modbusTCP可以方便的实现外部于codesys控制器的的数据通讯。但在配置时容易产生混淆,我认为codesys是以外部设备的角度来看服务器和从站设备。
在ModbusTCP通讯中应当注意,每个报文的最大长度应该是有限制的,应该每次读取的数量在254个字节,127个寄存器的内容,如果超出这个范围会失败。在这里记录下来供大家参考。



页: [1]
查看完整版本: codesys modbustcp