1.前言
使用modbus有些时间了,期间使用过modbus RTU也使用过modbus TCP,通过博文和大家分享一些MODBUS TCP的东西。在嵌入式中实现TCP就需要借助一个以太网协议栈,在这里我选择最简单的uIP协议栈。uIP协议栈简单易用方便上手,相比于LwIP无论是移植还是使用难度都低些,这样就可以把更多的精力花在modbus tcp协议本身而不必花大量的时间研究以太网协议栈。modbus协议栈为freemodbus
【其他有用的博文】
【1】uIP学习笔记
【工程代码】
示例代码托管于GitHub——【Github Clone】
如果有问题我会及时更新。
【使用说明】
【1】工具链为IAR 6.5
【2】从机IP为固定IP 192.168.1.15,请保证从机和路由器位于同一个网段中。
【3】modbus tcp的侦听端口号为502
2.MODBUS TCP注意点
2.1 主机和从机、服务端和客户端
图1 MODBUS请求响应模型
【在modbus协议中】
主机发送modbus请求,从机根据请求内容向主机返回响应。在modbus协议中,主机总是主动方,从机总是被动方。
【在网络应用中】
在网络应用中存在客户端和服务器端,客户端(例如浏览器)发送请求到服务器,服务器向客户端返回内容(例如HTML文本)。
【在modbus tcp中】
主机是客户端,而从机是服务器端。千万不要以为服务器端重要,主机也重要,所以主机就是服务器端。
2.2 是否可以多主机
通过前面的分析,主机为客户端那么modbus tcp支持多个主机,在一个局域网中可存在多个主机和多个从机。从机的连接能力(连接主机的数量)由uIP的最大TCP连接个数决定。
2.3 modbus TCP协议简述
modbus TCP和modbus RTU基本相同,但是也存在一些区别
【1】从机地址变得不再重要,多数情况下忽略。从某种意义上说从机地址被IP地址取代
【2】CRC校验变得不再重要,甚至可以忽略。由于TCP数据包中已经存在校验,为了不重复造轮子,modbus TCP干脆取消了CRC校验。
modbus TCP和modbus RTU的区别可使用下图概括
图2 modbus TCP数据包和modbus RTU数据包比较
在modbus TCP中包含一个MBAP头,该头包含以下几个部分
区域 |
长度
|
描述
|
客户端
|
服务器
|
传输标志
|
2字节
|
MODBUS 请求和响应传输过程中
序列号
|
客户端生成 |
应答时复制该值
|