https://tr.beckhoff.com.cn/course/view.php?id=125

Modbus TCP

变量定义

//输入寄存器 属性:R  功能码:04H
    mb_Input_Registers : ARRAY [0..255] OF INT;
//输出寄存器 属性:R/W   功能码:03H
    mb_Output_Registers : ARRAY [0..255] OF INT;
//输入线圈 属性:R  功能码:02H
    mb_Input_Coils : ARRAY [0..255] OF BOOL;
//输出线圈 属性:R/W  功能码:01H
    mb_Output_Coils : ARRAY [0..255] OF BOOL;

按照上面的变量名称定义在程序内,即可通过modbus使用对应的功能码读取到数据。
modbus完整支持很多功能码,但是实际在应用的时候常用的也就那么几个。具体如下:

0x01: 读线圈寄存器
0x02: 读离散输入寄存器
0x03: 读保持寄存器
0x04: 读输入寄存器
0x05: 写单个线圈寄存器
0x06: 写单个保持寄存器
0x0f: 写多个线圈寄存器
0x10: 写多个保持寄存器

读取地址

若按照此定义方式,所有的地址都是从16#8000(32769)开始读取,数量根据定义数量而定。

调试

PLC做主站时,调试软件做从站

但是如果通过调试软件,例如modcsan32、modbus poll 等等软件进行读取输入寄存器和保持寄存器时可能会出现无法一次性读完256个。

modbus poll最多只允许125个:

modscan 32最多允许128个:

129个就会报错(无效的数据长度)

Modbus RTU

TCP/IP