7.15.3 建立连接、接收ModbusTCP请求并回应报文
功能
处理ModbusTCP客户端的连接请求、接收及Modbus请求并发送响应
功能代码(16#byte) | 操作数据宽度 | 说明 |
---|---|---|
0x01 | 位 | 读线圈 |
0x02 | 位 | 读离散输入量 |
0x03 | 字 | 读保持寄存器 |
0x04 | 字 | 读输入寄存器 |
0x05 | 位 | 写单个线圈 |
0x06 | 字 | 写单个保持寄存器 |
0x0F | 位 | 写多个线圈 |
0x10 | 字 | 写多个保持寄存器 |
LD图形
参数说明
接口说明 | 声明 | 数据类型 | 说明 |
---|---|---|---|
DISCONNECT | INPUT | BOOL | MB_TCP_SERVER指令与伙伴断开连接。服务器响应CONNECT参数种输入的IP地址的连接请求。 接受一个连接请求后,可以使用该参数进行控制断开连接: FLASE/0:在无通信来连接时建立被动连接 TURE/1:终止连接。如果置位该输入,将不在执行来连接、收发数据等操作 |
CONNECT | IN_OUT | TCP_CONNECTCONFIG | 连接描述结构对象,使用TCP_CONNECTCONFIG结构,说明建立指定来凝结时所需的所有地址参数,包括本端IP、本端端口、对端IP、对端端口、是否主动建立连接五个参数。 默认地址为0.0.0.0(任何IP地址),也可以输入具体IP地址。 用于MB_TCP_SERVER的连接结构中主动建立连接项(ActiveEstablished)应为FALSE,否则将输出错误码状态码0x8BB ,具体参见TCP_Connectconfig |
COIL_DATAAREA | IN_OUT | ANY | 指向“MB_TCP_SERVER”指令中Modbus线圈数据区域 线圈数据区域中包含Modbus客户端通过Modbus功能: 0x01:读取线圈; 0x05:写单个线圈; 0x0F:写多个线圈可访问的值 |
DISCRETE_DATAAREA | IN_OUT | ANY | 指向“MB_TCP_SERVER”指令中Modbus离散输入量数据区域。离散输入量数据区域中包含Modbus客户端通过Modbus功能: 0x02:读离散输入可访问的值 |
HOLDING_REG_DATAAREA | IN_OUT | ANY | 指向“MB_TCP_SERVER”指令中Modbus保持寄存器数据区域 保持寄存器数据区域中包含Modbus客户端通过Modbus功能: 0x03:读取保持寄存器; 0x06:写单个保持寄存器; 0x10:写多个保持寄存器可访问的值 |
INPUT_REG_DATAAREA | IN_OUT | ANY | 指向“MB_TCP_SERVER”指令中输入寄存器数据区域 线圈数据区域中包含Modbus客户端通过Modbus功能: 0x04:读取输入寄存器可访问的值 |
NDR | OUTPUT | BOOL | "New Data Ready": FALSE/0:无心数据 TRUE/1:Modbus客户端写入新数据 Modbus功能中写线圈(0x05,0x0F)和写保持寄存器(0x06,0x10)会使NDR置位 |
DR | OUTPUT | BOOL | “Data Read”: FALSE/0:未读取数据; TRUE/1:Modbus客户段读取数据; Modbus功能中读线圈(0x01); 读保持寄存器(0x03);读输入寄存器(0x04)会使DR置位。 |
ERROR | OUTPUT | BOOL | 如果在调用“MB_TCP_SERVER”指令过程中出错,ERROR参数将输出TRUE/1 错误的详细信息将由STATUS参数指定 |
STATUS | OUTPUT | WORD | 指令的详细状态信息 |
信息
- Modbus协议通常使用502作为服务段端口
- ANY属于类属数据类型参见类属数据类型
- 置位值维持1个周期
- 天行PLC中使用小端存储
连接及收发数据状态说明
STATUS(16进制) | 说明 |
---|---|
0000 | 指令未执行,初始状态 |
7002 | 等待建立通信连接 |
7007 | 通信连接已关闭 |
7004 | 通信连接已建立 |
7005 | 正在发送数据 |
7006 | 正在接收数据 |
参数错误状态说明
STATUS(16进制) | 说明 |
---|---|
80BB | ActiveEstablished参数值无效。只允许对服务段建立被动连接 |
8389 | 数据区域存在重叠 |
协议错误:
对应Modbus协议回应异常报文种错误码 | STATUS(16#WORD) | 说明 |
---|---|---|
/ | 8380 | 接收到的Modbus帧格式错误或字节数过小 |
01 | 8381 | 不支持的功能代码 |
03 | 8382 | 数据长度错误,接收到Modbus帧长度无效或与实际接收到的字节数不一致 |
02 | 8383 | 访问越界。Modbus帧种数据地址错误或访问了绑定的数据区域以外的区域 |
03 | 8384 | 数据值错误。对应功能码0x05,写单个线圈是数据值0XFF00代表置1,0x0000代表置0,其余为不合法数据 |
示例
- LD示例图片如下图所示:
- ST示例代码如下所示:
MB_TCP _SERVER_2(
disconnect:=aa,
CONNECT:=config,
coil_dataarea:=bb
discrete_dataarea:=dataarea,
holding_reg_dataarea:=dataarea _holding,
reg_dataarea:=reg_datarea,
NDR=>n,
DR=>dr,
ERROR=>error,
STATUS=>xx
);