9SX UPS通讯协议
- SHUT通讯协议
- 串口定义
- 同步
- SHUT数据帧
- UPS Commands
- GET REPORT command
- SHUT通讯实例
在改造中碰到了某公司的9SX UPS串口通讯。原来的控制器采用了C语言编程。因为不想费事,向原厂家询问通讯协议。前台的小姐很骄傲的说他们不提供通讯协议了,要想通讯就要采购他们公司的硬件卡,提供通讯协议。我问他们这个国际公司还要脸吗?让我鄙视。在这里把调试的经过和大家说一下,供大家参考。
SHUT通讯协议
SHUT是Sirail HID UPS Transfer的缩写。写HID的都知道,是USB设备的定义。在这里USP厂家把设备描述用在串口通讯上,实现UPS的数据通讯。
串口定义
Default settings of a UPS SHUT serial port are :
- Baud rate : 2400
- 8 data bits
- No parity
- 1 stop bit
- Flow control : none
同步
主机可以向UPS发送同步信息,发送同步信息是发送一个, 字符<0x16, ^V>。UPS收到同步信息在200ms之内会返回一个信息。
按照2,3,和5接线,用串口助手就可以实验这个功能。发送一个0x16的16进制数字。在串口助手上就会收到一个0x16的返回信息。
SHUT数据帧
经过同步后,开始发送数据帧,并从UPS侧接收数据帧。
帧类型 | 数据长度 | Data byte D0…Dn | Checksum-8 |
---|---|---|---|
1 byte | 1 byte | 1-8 bytes | 1 byte |
帧类型:
- 0x01 <^A> ---- 请求(从主机到UPS)
- 0x04<^D> ---- 响应(从UPS到主机)
- 0x05<^E> ---- 通知(UPS主动通知主机)
- 在类型字节上+0x80表示是最后一帧。
数据长度:
在这个字节中定义帧的数据长度。如果要发送5个字节的数据,设置这个字节为0x55. 允许的长度设定值为:0x11,0x22,… , 0x88。
校验和:
对发送的数据,注意,不是全部的帧,而是数据进行异或校验。
Chk = XOR XOR … XOR
UPS Commands
GET REPORT command
Field | Request Type 1 | Request Type 2 | Report ID | Report Type | Inter LSB | Inter MSB | Lenght LSB | Length MSB |
---|---|---|---|---|---|---|---|---|
Data | 0xA1 | 0x01 | 变量 | 0x03 | 0x00 | 0x00 | 0x08 | 0x00 |
这里面数据起变化的是Report ID,对应不同的报告。UPS侧接到GET REPORT命令后返回:
Byte 0:Report ID
Byte 1…n: 数据。
这里要说明的是在发送的自己中对数据进行XOR校验,但在返回的报文中,对Byte 0… Byte n进行XOR异或校验。
SHUT通讯实例
字节号 | 事件描述 | Host Data | UPS Data |
---|---|---|---|
0 | 主机发送同步信息,字符0x16 | 0x16 | |
1 | UPS回答信息,字符0x16 | 0x16 | |
2 | 开始SHUT帧,发送0x01,请求帧,由于是最后的帧0x84 | 0x81 | |
3 | 数据长度,0x88, GET REPORT命令,8个字节 | 0x88 | |
4 | GET REPORT帧,Request Type 1 | 0xA1 | |
5 | GET REPORT帧,Request Type 2 | 0x01 | |
6 | GET REPORT帧,Report ID | 0x06 | |
7 | GET REPORT帧,Report type | 0x03 | |
8 | GET REPORT帧,Interface #,总是0 | 0x00 | |
9 | GET REPORT帧,Interface #,总是0 | 0x00 | |
10 | GET REPORT帧,字节长度,0x08 | 0x08 | |
11 | GET REPORT帧,帧字节MSB | 0x00 | |
12 | 帧校验和 | 0xBD | |
13 | UPS回答 | 0x06 | |
14 | UPS发送RESPONSE,最后一个字节0x84 | 0x84 | |
15 | UPS发送回答数据长度 | 0x66 | |
15 | UPS剩余能量 | 0x64 | |
16 | UPS剩余时间LSB,秒为单位 | 0x)C | |
17 | UPS剩余时间,中间字节 | 0x7B | |
18 | UPS剩余时间,中间字节 | 0x00 | |
19 | UPS剩余时间,MSB | 0x00 | |
20 | 校验和 | 0x15 |
通过查询,得到:
剩余能量:100%
剩余时间 = 0x0C + SHL(0x7B, 8) = 31500 秒
通过定时发送询问帧,就可以得到当前的剩余容量和剩余时间。