
MODBUS/TCP 规范
MODBUS/TCP 为MODBUS 的TCP网络协议。TCP 网络端口号为502。
MODBUS/TCP 在MODBUS 协议前,增加了6 个字节的协议头,
同时取消了普通MODBUS 的CRC16 校验和。格式如下:
字节 含义 取值(Hex)
1 协议标识 00
2 协议标识 00
3 协议标识 00
4 协议标识 00
5 MODBUS 信文长度高8 位 00
6 MODBUS 信文长度低8 位 为字节7 及以后字节数
7 从站地址 0~255
8 功能码
9 … n 数据
【示例】在从站17 读AI108~AI110
主站发送信文如下:
字节 含义 示例(Hex)
1 协议标识 00
2 协议标识 00
3 协议标识 00
4 协议标识 00
5 MODBUS 信文长度高8 位 00
6 MODBUS 信文长度低8 位 06
7 从站地址 11
8 功能码 04
9 起始地址高8 位 00
10 起始地址低8 位 6B
字节 含义 示例(Hex)
11 数据个数高8 位 00
12 数据个数低8 位 03
上例的从站响应信文如下:
字节 含义 示例(Hex)
1 协议标识 00
2 协议标识 00
3 协议标识 00
4 协议标识 00
5 MODBUS 信文长度高8 位 00
6 MODBUS 信文长度低8 位 09
7 从站地址 11
8 功能码 04
9 字节数 06(限制了最大可以发送的字节数目)
10 数据Hi(AI108) 02
11 数据Lo(AI108) 2B
12 数据Hi(AI109) 00
13 数据Lo(AI109) 00
14 数据Hi(AI110) 00
15 数据Lo(AI110) 64
示例中,
AI108-AI110 的测值返回为022BH、0000H、0064H。
MODBUS/TCP 使用端口号为502。
MODBUS/TCP 编程指南
从站为MODBUS/TCP 服务器端(Server),用户程序为客户端程序(Client)。
下面介绍客户端程序的编程规范。
客户端程序典型应用
一般说来,MODBUS/TCP 客户端程序包含以下步骤:
1. 用socket()调用建立流式套接口s(TCP);
2. 用connect()调用将套接口s 与从站连接(端口502);
3. 准备MODBUS / TCP 报文;
4. 用send()调用在套接口s 上发送报文;
5. 用select()调用判断套接口s 上是否有数据可读,超时10s;
6. 用recv()调用在套接口s上接收报文。其中首先接收6字节MODBUS/TCP报文头,再根据报文头中的长度接收实际报文;
7. 处理报文;
8. 重复3~7 步骤。
MODBUS-TCP作为一种网络通讯协议目前在大量的自动化设备上使用,如施奈德的系列PLC,QUANTUM, Preminum等。
其不足在于每次信文的长度受限,每次最大发送字节数目为255(从站返送的第九个字节),因此在大数据量传送的情况下,或者寄存器不顺序的情况下,组态软件可能会需要更多的时间来读取数据,从而对通讯的速率得不到保证。
建议大数据量(如1000个字),不要采用标准的MODBUS-TCP协议,可以采用自定义协议或者根据需求扩展的MODBUS-TCP。
简单的扩展是将第九个字节和第十个字节作为字节数目,这样最大的字节数目为65535,比标准规约扩大了255倍。
从站响应信文如下:
字节 含义 示例(Hex)
1 协议标识 00
2 协议标识 00
3 协议标识 00
4 协议标识 00
5 MODBUS 信文长度高8 位 00
6 MODBUS 信文长度低8 位 09
7 从站地址 11
8 功能码 04
9 字节数Hi 00
10 字节数Lo 06
11 数据Hi(AI108) 02
12 数据Lo(AI108) 2B
13 数据Hi(AI109) 00
14 数据Lo(AI109) 00
15 数据Hi(AI110) 00
16 数据Lo(AI110) 64
由于MODBUS-TCP协议中主要采用TCP的校验方式,因此去掉了原来MODBUS规约中的CRC校验,根据实际经验,在接收到响应信文后必须检查协议标识、从站地址及功能码,这样可以避免在网络设备转换过程中出现的意外情况(如光电转换等)。