自动气象站通讯协议
V20110831
一、协议特性
1、支持 XPH 通讯、标准 MODBUS 通讯两种格式。
2、支持 RS-232、RS-485 通讯总线。
3、支持 19200 波特率,特殊版本可达 38400.
4、支持最大设备数 254 个。
5、数据帧最小间隔 100ms 以上。
6、使用 CRC16 数据帧错误检查,多项式码 0xA001。
二、协议说明
恒奥德站支持两种格式的通讯协议工作,任一时刻只能使用一种通讯协
议进行通讯。下面分别对两种通讯协议进行详细说明。
1、XPH 通讯协议
通讯参数:波特率 9600
数据位 8 位
无校验位
XPH 通讯协议是效仿标准 MODBUS 通讯的一个自定义版本,其并不兼容 MODBUS
通讯协议。其特点是召唤式工作,气象站仅作为服务器,使用上位机客户端进行
通讯。气象站收到正确数据帧后,就回复相应的内容,无效数据帧则不回复任何
内容。不回复是便于多台气象站进行 485 总线组网,避免数据通讯冲突。
1)XPH 通用帧格式
序号 |
内容 |
字节数 |
说明 |
备注 |
1 |
地址域 |
1 |
气象站通讯地址 |
唯一 |
2 |
读写域 |
1 |
读(0x03)/写(0x10)操作码 |
2选1 |
3 |
命令域 |
2 |
命令码,前 1 字节必须为 0 |
00 xx |
4 |
数据长度域 |
2 |
数据域长度,不包括本域 |
发送时可无 |
5 |
数据域 |
N |
数据 |
|
6 |
校验域 |
2 |
CRC16 检验码 |
低前高后 |
|
北京恒奥德科技有限公司自动气象站通信协议
2)XPH 协议通讯码
3)XPH 通讯协议详细说明
对于每条通讯命令码,进行收发过程的详细描述,假定气象站的地址为 0x01。
返回的通道数据都以有符号 16 进制数表示,如通道 1 的数据(包括实时数和历
史数据)为 0x12 0x34,表示为十进制数即 4660(0x1234)。即数据字节的高位在
前,低位在后,此顺序不能错,否则数据值将错误。
另外,对不不同的传感器类型,某些通道数据值需要表示 N 位小数,此时,
该通道 16 位有符号数扩大 10 的 N 次方倍。如通道 1 表示风速,带一位小数,其
数据为 0x00 0x7B(十进制 123),则实际风速为 12.3m/s,即读取的数据扩大了
10 倍,其他小数以此类推。传感器精度参数详见说明书。
红色字:命令码
绿色字:CRC16 校验码(低字节在前,高字节在后)
蓝色字:数据(高字节在前,低字节在后,0x7FFF 表示无效数据)
紫色字:数据长度(高字节在前,低字节在后)
序号 |
命令码 |
含义 |
类型 |
备注 |
1 |
0x00 |
实时环境参数数据 |
通用类型 |
仅读 |
2 |
0x20 |
系统参数配置 |
通用类型 |
读写 |
3 |
0x37 |
读历史数据 |
通用类型 |
仅读 |
4 |
0x38 |
历史数据重读 |
通用类型 |
仅读 |
5 |
0x61 |
配置登录 GPRS 服务器密码 |
需支持 |
读写 |
6 |
0x80 |
复位气象站 |
通用类型 |
仅写 |
|
北京恒奥德科技有限公司自动气象站通信协议
A、读取实时环境参数数据
客户端发送:
01 03 00 00 F1 D8
气象站返回:(38 字节)
01 03 00 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 69 3F
返回数据格式说明:
16 通道对应的配置出厂时定义,根据需要而定。
序号 |
含义 |
偏移 |
字节数 |
说明 |
备注 |
1 |
地址域 |
0 |
1 |
地址(0x01) |
0x01 |
2 |
操作码 |
1 |
1 |
仅读(0x03) |
0x03 |
3 |
数据长度域 |
2 |
2 |
0x00 0x20 |
高前低后 |
4 |
数据域 |
4 |
2 |
通道 1 |
0x7FFF(无效/未接) |
4数据域
6 |
2 |
通道 2 |
0x7FFF(无效/未接) |
4数据域
8 |
2 |
通道 3 |
0x7FFF(无效/未接) |
4数据域
10 |
2 |
通道 4 |
0x7FFF(无效/未接) |
4数据域
12 |
2 |
通道 5 |
0x7FFF(无效/未接) |
4数据域
14 |
2 |
通道 6 |
0x7FFF(无效/未接) |
4数据域
16 |
2 |
通道 7 |
0x7FFF(无效/未接) |
4数据域
18 |
2 |
通道 8 |
0x7FFF(无效/未接) |
4数据域
20 |
2 |
通道 9 |
0x7FFF(无效/未接) |
4数据域
22 |
2 |
通道 10 |
0x7FFF(无效/未接) |
4数据域
24 |
2 |
通道 11 |
0x7FFF(无效/未接) |
4数据域
26 |
2 |
通道 12 |
0x7FFF(无效/未接) |
4数据域
28 |
2 |
通道 13 |
0x7FFF(无效/未接) |
4数据域
30 |
2 |
通道 14 |
0x7FFF(无效/未接) |
4数据域
32 |
2 |
通道 15 |
0x7FFF(无效/未接) |
4数据域
34 |
2 |
通道 16 |
0x7FFF(无效/未接) |
5 |
校验域 |
36 |
2 |
低前高后 |
0x69 0x3F |
|
北京恒奥德科技有限公司自动气象站通信协议
B、读取系统参数配置
客户端发送:(6 个字节)
01 03 00 20 F0 00
气象站返回:(14 字节)
01 03 00 08 0B 08 1F 0B 00 0A 01 01 98 E0
返回数据说明:
存储间隔:即历史数据保存的间隔,单位为:分钟
设备地址:设置范围 0-254,
0 为广播地址,一般不要随便使用,主要用于组网或多播;
1-254 为正常设备地址,同一总线上必须保证唯一;
若无返回数据,则说明读取不成功。
序号 |
含义 |
偏移 |
字节数 |
说明 |
备注 |
1 |
地址域 |
0 |
1 |
地址(0x01) |
0x01 |
2 |
操作码 |
1 |
1 |
读(0x03) |
0x03 |
3 |
数据长度域 |
2 |
2 |
0x00 0x08 |
高前低后 |
4 |
数据域 |
3 |
1 |
年 |
0B(2011 年) |
4数据域
4 |
1 |
月 |
08(8 月) |
4数据域
5 |
1 |
日 |
1F (31 日) |
4数据域
6 |
1 |
时 |
0B(12 点/24 小时制) |
4数据域
7 |
1 |
分 |
00(00 分钟) |
4数据域
8 |
1 |
存储间隔 |
10(分钟) |
4数据域
9 |
1 |
语言类型 0/1 |
1-英语/0-中文 |
4数据域
10 |
1 |
设备地址 |
01(0x01-0xFE) |
5 |
校验域 |
11 |
2 |
低前高后 |
0x98 0xE0 |
|
北京恒奥德科技有限公司自动气象站通信协议
C、写入系统参数配置
客户端发送:(17 字节)
01 10 00 20 00 04 08 0B 08 1F 0B 00 10 00 00 59 DD
气象站返回:(8 个字节)
01 10 00 20 00 04 C0 00
发送数据说明:
寄存器数量:该域无意义,保留该域为了向前兼容,请尽量使用说明的数值;
数据域最后一个字节,目前为设备地址设置,之前的通讯版本选择为保留,故在
20110831 之后都要小心设置。最好是先读取系统参数,然后使用读取的设备地
址填充该字节。
若无返回数据,则说明写入不成功,否则写入成功。
序号 |
含义 |
偏移 |
字节数 |
说明 |
备注 |
1 |
地址域 |
0 |
1 |
地址(0x01) |
0x01 |
2 |
操作码 |
1 |
1 |
写(0x10) |
0x10 |
3 |
命令码 |
2 |
2 |
0x00 0x20 |
高前低后 |
4 |
寄存器数量 |
4 |
2 |
0x00 0x04 |
高前低后 |
5 |
数据长度 |
6 |
1 |
0x08 |
8 个数据字节 |
6 |
数据域 |
7 |
1 |
0B |
0B(2011 年) |
6数据域
8 |
1 |
08 |
08(8 月) |
6数据域
9 |
1 |
1F |
1F (31 日) |
6数据域
10 |
1 |
0B |
0B(12 点/24 小时制) |
6数据域
11 |
1 |
00 |
00(00 分钟) |
6数据域
12 |
1 |
10 |
存储间隔 16(分钟) |
6数据域
13 |
1 |
00 |
1-英语/0-中文 |
6数据域
14 |
1 |
00 |
保留/地址 |
5 |
校验域 |
15 |
2 |
低前高后 |
0x59 0xDD |
|
北京恒奥德科技有限公司自动气象站通信协议
D、读取历史数据
客户端发送:(6 个字节)
01 03 00 37 B0 0E
气象站返回:(1044 个字节)
01 03 04 0E 00 1C D0~DN CRC16
返回数据说明:
数据长度域:为“有效数据帧数”和“数据域”两个域字节总和。
数据域:固定大小为 1036 个字节,每帧 37 字节,故最大有效帧 1036/37=28 帧。
有效数据帧数:由于历史数据包是等长的,该域指示数据域中包含的有效帧数,
有效帧从数据域的 0 位置开始,顺序往后排列。最大有效帧为 28 帧。
历史数据帧说明:(37 字节)
序号 |
偏移 |
字节数 |
说明 |
1 |
0 |
1 |
年(2000 年以后的偏移) |
2 |
1 |
1 |
月 |
3 |
2 |
1 |
日 |
4 |
3 |
1 |
时(24 小时制) |
5 |
4 |
1 |
分钟 |
16 通
道数
据值 |
5 |
2 |
通道 1 |
16 通
道数
据值
7 |
2 |
通道 2 |
16 通
道数
据值
9 |
2 |
通道 3 |
16 通
道数
据值
11 |
2 |
通道 4 |
16 通
道数
据值
13 |
2 |
通道 5 |
|
序号 |
含义 |
偏移 |
字节数 |
说明 |
备注 |
1 |
地址域 |
0 |
1 |
地址(0x01) |
0x01 |
2 |
操作码 |
1 |
1 |
读(0x03) |
0x03 |
3 |
数据长度 |
2 |
2 |
0x04 0x0E |
高前低后 |
4 |
有效数据帧数 |
4 |
2 |
0x00 0x1C |
高前低后 |
5 |
数据域 |
6 |
1036 |
历史数据包 |
分成 N 帧 |
6 |
校验域 |
1042 |
2 |
低前高后 |
CRC16 低前高后 |
|
北京恒奥德科技有限公司自动气象站通信协议
E、重读历史数据
客户端发送:
01 03 00 38 F0 0A
气象站返回:
返回数据与“[D]读取历史数据”返回数据格式相同。
说明:
由于远程数据读取时,且历史数据包比较大,可能会发生数据错误。就可能
造成读取的历史数据在传输过程中出错,从而导致某些上位机接口程序误判读取
历史数据错误。而气象站一旦读取了历史数据后不能重读的话,就会造成某包历
史数据丢失的现象。重读历史数据命令用于重复读取上一次读取的历史数据,从
而解决错误丢失历史问题。
|
15 |
2 |
通道 6 |
17 |
2 |
通道 7 |
19 |
2 |
通道 8 |
21 |
2 |
通道 9 |
23 |
2 |
通道 10 |
25 |
2 |
通道 11 |
27 |
2 |
通道 12 |
29 |
2 |
通道 13 |
31 |
2 |
通道 14 |
33 |
2 |
通道 15 |
35 |
2 |
通道 16 |
|
北京恒奥德科技有限公司自动气象站通信协议
F、读取登录密码(该命令需额外支持,默认不支持)
客户端发送:(8 个字节)
01 03 00 61 00 04 15 d7
气象站返回:(12 个字节)
01 03 00 61 00 04 YY YY YY YY CRC16
返回数据说明:
数据域:4 位 ASCII 码表示的密码,每位的范围 0-9,即 0x30-0x39。数据域 0-3
字节对应界面输入的左-右顺序。
G、写入登录密码(该命令需额外支持,默认不支持)
客户端发送:(12 字节)
01 10 00 61 00 04 YY YY YY YY CRC16
气象站返回:(8 个字节)
01 10 00 61 00 04 CRC16
写入数据说明:
数据域:4 位 ASCII 码表示的密码,每位的范围 0-9,即 0x30-0x39。数据域 0-3
字节对应界面输入的左-右顺序。
序号 |
含义 |
偏移 |
字节数 |
说明 |
备注 |
1 |
地址域 |
0 |
1 |
地址(0x01) |
0x01 |
2 |
操作码 |
1 |
1 |
读(0x03) |
0x03 |
3 |
命令码 |
2 |
2 |
0x00 0x61 |
高前低后 |
4 |
数据长度域 |
4 |
2 |
0x00 0x04 |
高前低后 |
5 |
数据域 |
6 |
4 |
4 位密码数据 |
从左到右 |
6 |
校验域 |
10 |
2 |
低前高后 |
CRC16 低前高后 |
|
北京恒奥德科技有限公司自动气象站通信协议
H、复位气象站
客户端发送:(4 字节)
01 80 01 80
气象站返回:
无返回
北京恒奥德科技有限公司自动气象站通信协议
2、标准 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
设备地址:假定为 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
数据长度:不含本身,仅表示数据域的字节数量。最大 32,最小 0。
根据读取指令序列的“起始编号”和“结束编号”来确定。
数据长度 = (结束编号 – 起始编号)*2
序号 |
含义 |
偏移 |
字节数 |
说明 |
1 |
设备地址 |
0 |
1 |
设备唯一标识 |
2 |
操作码(读) |
1 |
1 |
固定值 0x03 |
3 |
数据长度 |
2 |
1 |
不含本字节 |
4 |
数据域 |
3 |
N |
最多 32 个字节 |
5 |
CRC16 检验 |
3+N |
2 |
低前高后 |
|
序号 |
含义 |
偏移 |
字节数 |
说明 |
1 |
设备地址 |
0 |
1 |
设备唯一标识 |
2 |
操作码(读) |
1 |
1 |
固定值 0x03 |
3 |
寄存器起始编号 |
2 |
2 |
读取的第一个寄存器编号 |
4 |
寄存器结束编号 |
4 |
2 |
读取的最后个寄存器编号-1 |
5 |
CRC16 检验 |
6 |
2 |
低前高后 |
|
北京恒奥德科技有限公司自动气象站通信协议
三、附录
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℃