跳到主要内容

7.15.3 建立连接、接收ModbusTCP请求并回应报文

功能

处理ModbusTCP客户端的连接请求、接收及Modbus请求并发送响应

功能代码(16#byte)操作数据宽度说明
0x01读线圈
0x02读离散输入量
0x03读保持寄存器
0x04读输入寄存器
0x05写单个线圈
0x06写单个保持寄存器
0x0F写多个线圈
0x10写多个保持寄存器

LD图形

alt text

参数说明

接口说明声明数据类型说明
DISCONNECTINPUTBOOLMB_TCP_SERVER指令与伙伴断开连接。服务器响应CONNECT参数种输入的IP地址的连接请求。
接受一个连接请求后,可以使用该参数进行控制断开连接:
FLASE/0:在无通信来连接时建立被动连接
TURE/1:终止连接。如果置位该输入,将不在执行来连接、收发数据等操作
CONNECTIN_OUTTCP_CONNECTCONFIG连接描述结构对象,使用TCP_CONNECTCONFIG结构,说明建立指定来凝结时所需的所有地址参数,包括本端IP、本端端口、对端IP、对端端口、是否主动建立连接五个参数。
默认地址为0.0.0.0(任何IP地址),也可以输入具体IP地址。
用于MB_TCP_SERVER的连接结构中主动建立连接项(ActiveEstablished)应为FALSE,否则将输出错误码状态码0x8BB
,具体参见TCP_Connectconfig
COIL_DATAAREAIN_OUTANY指向“MB_TCP_SERVER”指令中Modbus线圈数据区域
线圈数据区域中包含Modbus客户端通过Modbus功能:
0x01:读取线圈;
0x05:写单个线圈;
0x0F:写多个线圈可访问的值
DISCRETE_DATAAREAIN_OUTANY指向“MB_TCP_SERVER”指令中Modbus离散输入量数据区域。离散输入量数据区域中包含Modbus客户端通过Modbus功能:
0x02:读离散输入可访问的值
HOLDING_REG_DATAAREAIN_OUTANY指向“MB_TCP_SERVER”指令中Modbus保持寄存器数据区域
保持寄存器数据区域中包含Modbus客户端通过Modbus功能:
0x03:读取保持寄存器;
0x06:写单个保持寄存器;
0x10:写多个保持寄存器可访问的值
INPUT_REG_DATAAREAIN_OUTANY指向“MB_TCP_SERVER”指令中输入寄存器数据区域
线圈数据区域中包含Modbus客户端通过Modbus功能:
0x04:读取输入寄存器可访问的值
NDROUTPUTBOOL"New Data Ready":
FALSE/0:无心数据
TRUE/1:Modbus客户端写入新数据
Modbus功能中写线圈(0x05,0x0F)和写保持寄存器(0x06,0x10)会使NDR置位
DROUTPUTBOOL“Data Read”:
FALSE/0:未读取数据;
TRUE/1:Modbus客户段读取数据;
Modbus功能中读线圈(0x01);
读保持寄存器(0x03);读输入寄存器(0x04)会使DR置位。
ERROROUTPUTBOOL如果在调用“MB_TCP_SERVER”指令过程中出错,ERROR参数将输出TRUE/1
错误的详细信息将由STATUS参数指定
STATUSOUTPUTWORD指令的详细状态信息
信息
  • Modbus协议通常使用502作为服务段端口
  • ANY属于类属数据类型参见类属数据类型
  • 置位值维持1个周期
  • 天行PLC中使用小端存储

连接及收发数据状态说明

STATUS(16进制)说明
0000指令未执行,初始状态
7002等待建立通信连接
7007通信连接已关闭
7004通信连接已建立
7005正在发送数据
7006正在接收数据

参数错误状态说明

STATUS(16进制)说明
80BBActiveEstablished参数值无效。只允许对服务段建立被动连接
8389数据区域存在重叠

协议错误:

对应Modbus协议回应异常报文种错误码STATUS(16#WORD)说明
/8380接收到的Modbus帧格式错误或字节数过小
018381不支持的功能代码
038382数据长度错误,接收到Modbus帧长度无效或与实际接收到的字节数不一致
028383访问越界。Modbus帧种数据地址错误或访问了绑定的数据区域以外的区域
038384数据值错误。对应功能码0x05,写单个线圈是数据值0XFF00代表置1,0x0000代表置0,其余为不合法数据

示例

  • LD示例图片如下图所示:

alt text

  • 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
);