2017版罐旁指示器MODBUS RTU通信协议
本通信协议采用标准ModBus协议,采用RTU(十六进制数)传输模式。ModBus协议是一种主---从式协议。任何时刻只有一个设备能够在线路上进行发送。由主站管理信息交换,且只有主站能发起。主站会依次对从站进行轮流查询。只有当从站地址与轮询地址相匹配,从站才能回复消息。从站之间不能进行直接通信。协议帧中不包含任何消息报头及消息结束符,消息的开始和结束依靠间隔时间来识别,当间隔时间长于或等于3.5个字符时,即作为检测到帧结束。如果网络内没有与查询地址相一致的从站或从站接收时CRC校验出错,主站将不会接收到返回帧,这时主站根据超时设定判断是否超时,如超时,做出重发或弹出异常错误窗口动作。
协议帧定义
从站地址 |
功能代码 |
数据区 |
CRC16 |
从站地址:地址在1---247之间。在同个主站网络中每个从站地址。
本机从站地址默认为1可设置范围(1~99)
功能代码:包含读、写多个寄存器。
本机只支持03H(读多个寄存器)。
数据: 以二进制代码传输。
寄存器数据在传输过程中用十六进制数表示,先传高字节,再传低字节,如液位为3028,先传0BH,再传D4H。
CRC16: 循环冗余校验,校验从从站地址到数据区后一个字节。
计算多项式码为A001(hex)。
通讯口设置
通讯方式 异步串行通讯接口,如RS-485等
波特率 9600
字节数据格式 HEX
. 一位起始位
. 八位数据位
. 一位停止位
. 无校验
1 |
* |
* |
* |
* |
* |
* |
* |
* |
1 |
起始位 数据位(从低到高) 停止位
消息帧格式 (功能是从主站角度定义的)
读寄存器帧
从站地址 |
功能代码 |
首寄存器地址 |
寄存器数N |
CRC16 |
1字节 |
1字节 |
2字节 |
2字节 |
2字节 |
1--247 |
03H |
AddrH, AddrL |
NH, NL (1---24) |
CrcL, CrcH |
读寄存器返回桢
从站地址 |
功能代码 |
字节数 |
寄存器数据 |
CRC16 |
1字节 |
1字节 |
1字节 |
N*2字节 |
2字节 |
1--247 |
03H |
N*2 |
DataH, DataL |
CrcL, CrcH |
错误返回桢
从站地址 |
功能代码 |
错误代码 |
CRC16 |
1字节 |
1字节 |
1字节 |
2字节 |
1---247 |
查询功能代码+80H |
见表2 |
CrcL, CrcH |
功能代码表:1
功能代码 |
ModBus名 |
功能名 |
广播 |
一次连续的N的值 |
03H |
Read Holding Registers |
读N个寄存器值 |
No |
30 |
错误代码表:2
错误代码 |
说明 |
1 |
寄存器长度超限 |
2 |
寄存器地址超限 |
4 |
读或写不允许 |
寄存器地址表(只读寄存器):3
编号 |
参数名 |
地址 |
数值范围 |
备注 |
1 |
液位 |
0 |
0~量程 |
单位为mm |
2 |
平均温度 |
1 |
-550~850 |
末位为一位小数位。单位:℃ |
3 |
温度点1位置 |
2 |
0~量程内固定值 |
单位为mm |
4 |
温度点1温度 |
3 |
-550~850 |
末位为一位小数位。单位:℃ |
5 |
温度点2位置 |
4 |
0~量程内固定值 |
单位为mm |
6 |
温度点2温度 |
5 |
-550~850 |
末位为一位小数位。单位:℃ |
7 |
温度点3位置 |
6 |
0~量程内固定值 |
单位为mm |
8 |
温度点3温度 |
7 |
-550~850 |
末位为一位小数位。单位:℃ |
9 |
温度点4位置 |
8 |
0~量程内固定值 |
单位为mm |
10 |
温度点4温度 |
9 |
-550~850 |
末位为一位小数位。单位:℃ |
11 |
温度点5位置 |
10 |
0~量程内固定值 |
单位为mm |
12 |
温度点5温度 |
11 |
-550~850 |
末位为一位小数位。单位:℃ |
13 |
温度点6位置 |
12 |
0~量程内固定值 |
单位为mm |
14 |
温度点6温度 |
13 |
-550~850 |
末位为一位小数位。单位:℃ |
15 |
温度点7位置 |
14 |
0~量程内固定值 |
单位为mm |
16 |
温度点7温度 |
15 |
-550~850 |
末位为一位小数位。单位:℃ |
17 |
温度点8位置 |
16 |
0~量程内固定值 |
单位为mm |
18 |
温度点8温度 |
17 |
-550~850 |
末位为一位小数位。单位:℃ |
19 |
温度点9位置 |
18 |
0~量程内固定值 |
单位为mm |
20 |
温度点9温度 |
19 |
-550~850 |
末位为一位小数位。单位:℃ |
21 |
温度点10位置 |
20 |
0~量程内固定值 |
单位为mm |
22 |
温度点10温度 |
21 |
-550~850 |
末位为一位小数位。单位:℃ |
23 |
温度点11位置 |
22 |
0~量程内固定值 |
单位为mm |
24 |
温度点11温度 |
23 |
-550~850 |
末位为一位小数位。单位:℃ |
25 |
温度点12位置 |
24 |
0~量程内固定值 |
单位为mm |
26 |
温度点12温度 |
25 |
-550~850 |
末位为一位小数位。单位:℃ |
27 |
温度点13位置 |
26 |
0~量程内固定值 |
单位为mm |
28 |
温度点13温度 |
27 |
-550~850 |
末位为一位小数位。单位:℃ |
29 |
温度点14位置 |
28 |
0~量程内固定值 |
单位为mm |
30 |
温度点14温度 |
29 |
-550~850 |
末位为一位小数位。单位:℃ |
寄存器地址表说明:
1、所有数据类型为有符号整型(两字节)。
2、通信传输中带小数点的数据全部用整数代替如:温度为19.5℃代替为195。(即忽略小数点)
3、全部寄存器数据在传输过程中用十六进制数表示,先传高字节,再传低字节,如传送279,先传01H,再传23H。
例如:
发送(HEX):01 ,03 ,00 ,00 ,00 ,06, C5, C8
返回(HEX):01,03 ,0C, 0B,D4 ,00 ,AC, 27 ,10 ,00 ,AD ,03 ,E8 ,00 ,AB, 58, 77
从站地址 |
功能代码 |
首寄存器地址 |
寄存器数N |
CRC16 |
1字节 |
1字节 |
2字节 |
2字节 |
2字节 |
01H |
03H |
0H,00H |
0H, 06H |
C5H, C8H |
读寄存器返回桢
从站地址 |
功能代码 |
字节数 |
寄存器数据 |
CRC16 |
1字节 |
1字节 |
1字节 |
N*2字节 |
2字节 |
01H |
03H |
0CH |
0B,D4 ,00 ,AC, 27 ,10 ,00 ,AD ,03 ,E8 ,00 ,AB |
58H, 77H |
代表读1#设备0寄存器开始的连续6个寄存器 。返回值:地址0寄存器0B,D4代表液位值为3028毫米,地址1寄存器00AC代表平均温度为17.2℃,地址2,3寄存器2710H,00ADH代表温度传感器1的安装位置为10000毫米,温度为17.3℃,地址4,6寄存器03E8H,00ABH代表温度传感器2的安装位置为1000毫米,温度为17.1℃