第一、
Modbus RTU协议需要对数据进行校验,串行协议有奇偶校验,ASCII模式LRC校验,RTU模式用16位CRC校验.。其采用Maser/Slave方式。
ModbusTCP模式没有规定校验,因为TCP协议是一个面向连接的可靠协议。其采用服务器和客户端方式,MODBUS TCP是传输在TCP/IP网络上的,多了一个报文头,少了CRC校验,采用TCP的502端口。
在一个Modbus网络上的所有设备都必须选择相同的传输模式和串口参数(端口,波特率等)或者选择IP+端口号(502),因此,如果要进行Modbus RTU协议和ModbusTCP协议的转换,需要物理转换器RS485 to Ethernet的转换模块。
第二、Modbus RTU协议
1、基本格式:起始位(T1_T2_T3_T4)+设备地址+功能码+数据+CRC校验+结束符(T1_T2_T3_T4)
数据传输时注意:数据帧之间间隔必须大于3.5个字符,帧内数据间隔要小于1.5个字符(低位字节在前,高位字节在后)
ModbusRTU协议格式
设备地址 | 功能码 | 数据格式 | CRC校验L | CRC校验H |
8位 | 8位 | N*8位 | 8位 | 8位 |
(N<=124,传输数据过大会引起通信错误)
2、功能码介绍:
功能码 |
0x01 |
0x02 |
0x03 |
0x04 |
0x05 |
0x06 |
0x0F |
0x10 |
含义 |
读线圈(PLC输出位(单或多位操作)) |
读离散输入状态(PLC输入位(单或多位操作) |
读保持寄存器 (单或多字操作) |
读输入寄存器 (单或多字操作) |
写单个线圈 (单位操作) |
写单个保持寄存器 (单字操作) |
写多个线圈 (多个位操作) |
写多个保持寄存器 (多个字操作) |
3、主对从写操作的数据帧格式:
从机地址 | 功能码 | 数据地址L | 数据地址H | 数据L | 数据H | CRC_L | CRC_H |
0x01 | 06 | 00 | 01 | 00 | 10 | 略 | 略 |
从机对主机响应:
从机地址 | 功能码 | 数据地址L | 数据地址H | 数据L | 数据H | CRC_L | CRC_H |
0x01 | 06 | 00 | 01 | 00 | 10 | 略 | 略 |
4、主机对从机读数据操作:
从机地址 | 功能码 | 数据地址L | 数据地址H | 数据L | 数据H | CRC_L | CRC_H |
0x01 | 03 | 00 | 01 | 00 | 01 | 略 | 略 |
从机对主机响应:
从机地址 | 功能码 | 数据字节个数 | 数据1 | 数据2 | CRC_L | CRC_H |
0x01 | 03 | 02 | 00 | 00 | 略 | 略 |
第三、ModbusTCP协议格式
发送:0x00 0x00 0x00 0x00 0x00 0x06 0x01 0x04 0x00 0x00 0x00 0x10
Byte1 |
Byte2 |
Byte3 |
Byte4 |
Byte5 |
Byte6 |
Byte7 |
Byte8 |
Byte9 |
Byte10 |
Byte11 |
Byte12 |
0x00 |
0x00 |
0x00 |
0x00 |
0x00 |
0x06 |
0x01 |
0x04 |
0x00 |
0x00 |
0x00 |
0x10 |
事务处理标识H |
事务处理标识 L |
协议标识符H |
协议标识符L |
长度H |
长度L |
设备地址 |
功能码 |
寄存器起始地址H |
寄存器起始地址L |
读输入寄存器个数H |
读输入寄存器读输入寄存器L |
返回:0x00 0x00 0x00 0x00 0x00 0x22 0x01 0x04 0x20 +Bytes[32]
Byte1 |
Byte2 |
Byte3 |
Byte4 |
Byte5 |
Byte6 |
Byte7 |
Byte8 |
Byte9 |
Byte10~ Byte41 |
0x00 |
0x00 |
0x00 |
0x00 |
0x00 |
0x22 |
0x01 |
0x04 |
0x20 |
Bytes[32] |
事务处理标识 H |
事务处理标识 L |
协议标识符H |
协议标识符L |
长度H |
长度L |
设备地址 |
功能码 |
返回寄存器数据长度 |
返回的寄存器的数据 |
疑问:Byte9:如果表示数据长度,由于其是一个字节表示,所以其值最大位0xFF即255,所以返回数据长度有限制。搜索帖子有说长度不超124个,待验证....