第一、
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个,待验证....