3.6.1 协议描述
在Modbus TCP/IP协议中,串行链路中的主/从设备分别演变为客户端/服务器端设备。即客户端相当于主站设备,服务器端相当于从站设备。基于TCP/IP网络的传输特性,串行链路上一主多从的构造也演变为多客户端/多服务器端的构造模型。Modbus协议在TCP/IP上的实现是在TCP/IP协议层上的应用,它需要一个完整的TCP/IP协议栈作为支撑,Modbus TCP/IP服务器端通常使用端口502作为接收报文的端口。
我们已经知道,Modbus协议定义了一个与基础通信层无关的简单协议数据单元(PDU),如图3-5所示。
图3-5 PDU与ADU的关系
为了便于传输或者提取各报文、保证报文传输的完整性,Modbus协议在应用数据单元(ADU)中引入了附加字段。如串行链路中,针对ASCII模式分别引入了(:)作为报文分隔标记,并引入LRC作为错误校验;而针对RTU模式则引入了T3.5时间间隔作为报文分隔,引入CRC作为错误校验。
同样地,在TCP/IP网络上的Modbus协议也需要引入一个称为MBAP(Modbus Application Header)报文头的字段,如图3-6所示。
图3-6 Modbus TCP/IP ADU与PDU的关系
作为对比,Modbus TCP/IP与Modbus串行链路之间,报文数据构造的区别和联系如图3-7所示。
图3-7 Modbus TCP/IP与Modbus串行消息构成对比
Modbus TCP/IP协议最大帧数据长度为260字节,其中字节0~6构成MBAP报头,各字段意义如表3-5所示。
表3-5 MBAP报头说明
1.传输标识
传输标识用于将查询报文与未来响应之间建立联系。因此,对TCP/IP连接来说,在同一时刻,这个标识符必须是唯一的。有几种使用此标识符的方式:
例如可以将传输标识作为一个带有计数器的简单“TCP发送顺序号”,在每一个请求发送时自动+1;也可以用作智能索引或指针,来识别事务处理的内容,以便记忆当前的远端服务器和未处理的请求。
服务器端可接受的请求数量取决于其容量,即:服务器资源量和TCP窗口尺寸。同样,客户端同时启动事务处理的数量也取决于客户机的资源容量。
2.单元标识符
在对Modbus或Modbus+等串行链路子网中的设备进行寻址时,这个域是用于路由的目的。在这种情况下,“Unit Identifier”携带一个远端设备的Modbus从站地址。
如果Modbus服务器连接到Modbus+或Modbus串行链路子网,并通过一个网桥或网关配置这个服务器的IP地址,则Modbus单元标识符对识别连接到网桥或网关后的子网的从站设备是必需的。TCP连接中的目的IP地址识别了网桥本身的地址,而网桥则使用Modbus单元标识符将请求转交给正确的从站设备。
分配给串行链路上的Modbus从站设备地址为1~247(十进制),地址0作为广播地址。
对单纯的Modbus TCP/IP设备来说,利用IP地址即可寻址Modbus服务器端设备,此时Modbus单元标识符是无用的,必须使用值0xFF填充。当对直接连接到TCP/IP网络上的Modbus服务器寻址时,建议不要在“单元标识符”域使用有效的Modbus从站地址。
以上是MBAP报头各字段含义的详细说明。
实际上在Modbus TCP/IP传输过程中,服务端(从机)返回的响应报文中同样包含MBAP报头,除了Length字段外,其他字段与客户端一致。Modbus消息帧由TCP/IP层提供,不需要像串行链路那样自己判断一帧是否结束,所有数据传输由TCP/IP层处理。因为底层的TCP/IP协议确保了端到端的连接,而且TCP/IP链路层已确保传输数据的准确性,所以Modbus TCP/IP协议中已不再需要LRC或CRC等校验功能。