武汉新普惠—气象站2984MODBUS通讯协议 本文关键词:气象站,通讯协议,武汉新,MODBUS
武汉新普惠—气象站2984MODBUS通讯协议 本文简介:武汉新普惠科技有限公司自动气象站通信协议新普惠自动气象站通讯协议标准MODBUS通讯协议通讯参数:波特率9600数据位8位无校验位气象站标准MODBUS通讯协议使用RTU模式。消息帧发送至少要以3.5个字符时间的停顿间隔开始,即在传输完每帧的最后一个字节,至少需要3.5个字符时间的停顿来标定消息帧的
武汉新普惠—气象站2984MODBUS通讯协议 本文内容:
武汉新普惠科技有限公司自动气象站通信协议
新普惠自动气象站通讯协议
标准MODBUS通讯协议
通讯参数:波特率9600
数据位
8位
无校验位
气象站标准MODBUS通讯协议使用RTU
模式。消息帧发送至少要以3.5
个字符时间的停顿间隔开始,即在传输完每帧的最后一个字节,至少需要3.5
个字符时间的停顿来标定消息帧的结束。下一个新的消息帧可在此停顿后开始,整个消息帧必须作为一连续的流传输。
气象站标准MODBUS通讯协议仅支持读功能,不支持配置气象站寄存器的功能,即不能写入任何数据。其特点有:
①气象站共有16个通道寄存器,对应16个通道的传感器测量输出值;
②寄存器最小编号固定于0,最大编号固定于15,不可更改;
③支持一次读取单个、多个(寄存器编号必须连续)寄存器;
④每一通道数据占2个字节,高字节在前,低字节在后,16位有符号整形值;
⑤数据小数位定义,同XPH协议的小数定义,即N位小数,数据值扩大10的N次方倍。
气象站标准MODBUS通讯协议帧
外部设备发送帧:
如
01
03
00
00
00
10
44
06
序号
含义
偏移
字节数
说明
1
设备地址
0
1
设备唯一标识
2
操作码(读)
1
1
固定值0x03
3
寄存器起始编号
2
2
读取的第一个寄存器编号
4
读取寄存器个数
4
2
5
CRC16检验
6
2
低前高后
设备地址:假定为0x01,有效范围0-254,0为广播地址。
操
作
码:固定为0x03,即读取操作,不支持其他操作。
起始编号:范围0-15,表示要读取的第一个寄存器编号。
寄存器个数:范围1-16,表示读取最后一个寄存器编号+1,读取的数据不包括本编号的寄存器内容,仅作为结束标记,其值必须保证大于等于“起始编号”。
气象站返回数据帧:
如
01
03
20
7F
FF
7F
FF
7F
FF
7F
FF
7F
FF
7F
FF
7F
FF
7F
FF
7F
FF
7F
FF
7F
FF
7F
FF
7F
FF
7F
FF
7F
FF
7F
FF
8C
45
序号
含义
偏移
字节数
说明
备注
1
地址域
0
1
地址(0x01)
0x01
2
操作码
1
1
仅读(0x03)
0x03
3
数据长度域
2
1
0x20
4
数据域
3
2
通道1
0x7FFF(无效/未接)
风速
(分辨率0.1)
5
2
通道2
0x7FFF(无效/未接)
7
2
通道3
0x7FFF(无效/未接)
温度
(分辨率0.1)
9
2
通道4
0x7FFF(无效/未接)
11
2
通道5
0x7FFF(无效/未接)
13
2
通道6
0x7FFF(无效/未接)
日照时数
(分辨率0.1)
15
2
通道7
0x7FFF(无效/未接)
风向
(分辨率1)
17
2
通道8
0x7FFF(无效/未接)
总辐射
(分辨率1)
19
2
通道9
0x7FFF(无效/未接)
湿度
(分辨率0.1)
21
2
通道10
0x7FFF(无效/未接)
总辐射累加辐射量
(分辨率0.01)
23
2
通道11
0x7FFF(无效/未接)
25
2
通道12
0x7FFF(无效/未接)
27
2
通道13
0x7FFF(无效/未接)
直接辐射
(分辨率1)
29
2
通道14
0x7FFF(无效/未接)
直接累加辐射量
(分辨率0.01)
31
2
通道15
0x7FFF(无效/未接)
散射辐射
(分辨率1)
33
2
通道16
0x7FFF(无效/未接)
散射累加辐射量
(分辨率0.01)
5
校验域
35
2
低前高后
0x69
0x3F
数据长度:不含本身,仅表示数据域的字节数量。最大32,最小0。
根据读取指令序列的“起始编号”和“寄存器个数”来确定。
数据长度
=
(结束编号
–寄存器个数)*2
通讯举例:
风速:
发送:01
03
00
00
00
01
84
0A
返回:01
03
02
00
64
B9
AF
00
64
为风速数据,十进制100,风速有1位小数,即为10.0m/s
温度:
发送:01
03
00
02
00
01
25
CA
返回:01
03
02
00
9B
F9
EF
00
9B
即为温度数据,是十六进制整数,换算成十进制是155,我们的温度传感器分辨率是0.1,则当前温度应该除以10,即为15.5度。
温度是有负数的,我们传感器返回的负数是以十六进制补码的形式表示,例如:
返回:01
03
02
FF
65
39
9F
FF
65
即为温度数据,是十六进制整数,换算成十进制是-155,我们的温度传感器分辨率是0.1,则当前温度应该除以10,即为-15.5度。
风向:
发送:01
03
00
06
00
01
64
0B
返回:01
03
02
00
64
B9
AF
00
64
为风向数据,十进制100,即为100度
湿度:
发送:01
03
00
08
00
01
05
C8
返回:01
03
02
00
64
B9
AF
00
64
为湿度数据,十进制100,分辨率是0.1,即为10.0%RH
三、附录
1、CRC16校验码的计算
(1).预置1个16位的寄存器为十六进制FFFF(即全为1);称此寄存器为CRC寄存器;
(2).把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低
8位相异或,把结果放于CRC寄存器;
(3).把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;
(4).如果移出位为0:重复第3步(再次右移一位);
如果移出位为1:CRC寄存器与多项式A001(1010
0000
0000
0001)进行异或;
(5).重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;
(6).重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;
(7).将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低
字节进行交换;
(8).最后得到的CRC寄存器内容即为CRC16码。(注意得到的CRC码即为低前高后顺序)
2、通道数据转换
例如温度十六进制编码为“00
C3”,换算成二进制为“0000000
11000011”,其二进制的第一位为“0”,所以它的值为正数,此时则可以用1中的的方法换算出十进制值“195”,最后将它除以10后得到最终结果“19.5”。
又例如温度十六进制编码为“FF
3D”,换算成二进制为“11111111
00111101”,其二进制的第一位为“1”,所以它的值为负数。
其具体换算步骤如下:
(1)将其二进制的的第一位替换为“0”
得到:“01111111
00111101”
(2)后15位取反后得到:“00000000
11000010”
(3)加上“1”后得到:“00000000
11000011”
(4)按照1中的正数表示方法得到十进制值“195”
(5)因为是负值所以为“-195”
(6)结果除以10,最终结果为“-19.5”
所以:00
C3
→
19.5℃
FF
3D
→
-19.5℃