如何解码现代 Ioniq EV 的 OBD-2 数据
How to decode OBD-2 data from Hyundai Ioniq EV
我尝试使用 Raspberry PI 和蓝牙 ELM327 接口从现代 Ioniq Electro(版本 28kWh)读取 OBD-2 数据。连接和数据传输正常。
例如:发送2105<cr><lf>
给出响应(<cr>
为值0x0d=13):
7F2112<cr>7F2112<cr>7F2112<cr>02D<cr>0:6105FFFFFFFF<cr>7F2112<cr>1:00000000001616<cr>2:161616161621FA<cr>3:26480001501616<cr>4:03E82403E80FC0<cr>5:003A0000000000<cr>6:00000000000000<cr><cr>>
4:03E82403E80FC0
中的值C0
好像是充电状态(SOC)显示值:
C0
-> 192 -> 192/2 % = 96%
有一些可用的解码表(参见https://github.com/JejuSoul/OBD-PIDs-for-HKMC-EVs/tree/master/Ioniq%20EV%20-%2028kWh),但如何使用这些表?
例如发送 2101<cr><lf>
给出响应:
02C<cr>
0:6101FFFFF800<cr>
01E<cr>
0:6101000003FF<cr>
03D<cr>
0:6101FFFFFFFF<cr>
016<cr>
0:6101FFE00000<cr>
1:0002D402CD03F0<cr>
1:0838010A015C2F<cr>
7F2112<cr>
1:B4256026480000<cr>
1:0921921A061B03<cr>
2:000582003401BD<cr>
2:0000000A002702<cr>
2:000F4816161616<cr>
2:00000000276234<cr>
3:04B84100000000<cr>
3:5B04692F180018<cr>
3:01200000000000<cr>
3:1616160016CB3F<cr>
4:00220000600000<cr>
4:00D0FF00000000<cr>
4:CB0100007A0002<cr>
5:000001F3026A02<cr>
5:5D4000025D4600<cr>
6:D2000000000000<cr>
6:00DECA0000D8E6<cr>
7:008A2FEB090002<cr>
8:0000000003E800<cr>
<cr>
>
请注意,为了更好的可读性,在每个回车 return (<cr>
) 后面添加了换行符,它不是原始数据响应的一部分。
我如何从这些数据中解码温度、电流等?
我自己发现了错误。 ELM327说明(http://elmelectronics.com/DSheets/ELM327DS.pdf)详细解释了AT命令。
这个问题的问题是在初始化阶段(未在问题中描述)由 AT H0
命令(headers 关闭)引起的多个 ECU 的 CAN 响应混合。另见 EM327DS.pdf 第 44 页(多选)。
在启动时使用 AT H1
时,可以毫无问题地解码响应。
初始化(开启AT H1 = headers)
AT D\r\n
AT Z\r\n
AT L0\r\n
AT E0\r\n
AT S0\r\n
AT H1\r\n
AT SP 0\r\n
之后与ECU的通信:
- 对第一个命令的响应
0100\r\n
:
SEARCHING...\r7EB06410080000001\r7EC06410080000001\r\r>
- 对第二个命令的响应
2101\r\n
:
7EE037F2112\r7ED102C6101FFFFF800\r7EA10166101FFE00000\r7EC103D6101FFFFFFFF\r7EB101E6101000003FF\r7EA2109211024062703\r7EC214626482648A3FF\r7ED2100907D87E15592\r7EB210838011D88B132\r7ED2202A1A7024C0134\r7EA2200000000546900\r7EC22C00D9E1C1B1B1B\r7EB220000000A000802\r7EA2307200000000000\r7ED23050343102000C8\r7EC231B1B1C001BB50F\r7EB233C04B8320000D0\r7EC24B5010000810002\r7ED24047400C8760017\r7EB24FF300000000000\r7ED25001401F387F46A\r7EC256AC100026CB100\r7EC2600E3C50000DE69\r7ED263F001300000000\r7EC27008CC38209015C\r7EC280000000003E800\r\r>
- 对第三个命令的响应
2105\r\n
:
7EE037F2112\r7ED037F2112\r7EA037F2112\r7EC102D6105FFFFFFFF\r7EB037F2112\r7EC2100000000001B1C\r7EC221C1B1B1B1B2648\r7EC2326480001641A1B\r7EC2403E80803E80147\r7EC25003A0000000000\r7EC2600000000000000\r\r>
现在每个响应都以 ECU 的 ID 开头。只关注以 7EC
.
开头的回复
示例:
正在寻找以安培为单位的电池电流。在文档 Spreadsheet_IoniqEV_BMS_2101_2105.xls 中,您可以找到电池电流:
- 对
2101
的响应21
:最后一个字节=电池电流的高字节
- 对
2101
的响应22
:第一个字节=电池电流的低字节
因此请查看 2101\r\n
的回复并搜索 7EC21
和 7EC22
:您会发现:
7EC214626482648A3FF
:取电池高值的最后一个字节 -> FF
7EC22C00D9E1C1B1B1B
:取 7EC22
后的第一个字节表示电池电量不足 -> C0
电池电流值为:FFC0
这个值是两个补码编码的:
0xffc0 = 65472 -> 65472 - 65536 = -64 ->
-6.4A
结果:电池充电6.4A
有关编码示例,请参阅:
https://github.com/greenenergyprojects/obd2-gateway, file src/obd2/obd2.ts
我尝试使用 Raspberry PI 和蓝牙 ELM327 接口从现代 Ioniq Electro(版本 28kWh)读取 OBD-2 数据。连接和数据传输正常。
例如:发送2105<cr><lf>
给出响应(<cr>
为值0x0d=13):
7F2112<cr>7F2112<cr>7F2112<cr>02D<cr>0:6105FFFFFFFF<cr>7F2112<cr>1:00000000001616<cr>2:161616161621FA<cr>3:26480001501616<cr>4:03E82403E80FC0<cr>5:003A0000000000<cr>6:00000000000000<cr><cr>>
4:03E82403E80FC0
中的值C0
好像是充电状态(SOC)显示值:
C0
-> 192 -> 192/2 % = 96%
有一些可用的解码表(参见https://github.com/JejuSoul/OBD-PIDs-for-HKMC-EVs/tree/master/Ioniq%20EV%20-%2028kWh),但如何使用这些表?
例如发送 2101<cr><lf>
给出响应:
02C<cr>
0:6101FFFFF800<cr>
01E<cr>
0:6101000003FF<cr>
03D<cr>
0:6101FFFFFFFF<cr>
016<cr>
0:6101FFE00000<cr>
1:0002D402CD03F0<cr>
1:0838010A015C2F<cr>
7F2112<cr>
1:B4256026480000<cr>
1:0921921A061B03<cr>
2:000582003401BD<cr>
2:0000000A002702<cr>
2:000F4816161616<cr>
2:00000000276234<cr>
3:04B84100000000<cr>
3:5B04692F180018<cr>
3:01200000000000<cr>
3:1616160016CB3F<cr>
4:00220000600000<cr>
4:00D0FF00000000<cr>
4:CB0100007A0002<cr>
5:000001F3026A02<cr>
5:5D4000025D4600<cr>
6:D2000000000000<cr>
6:00DECA0000D8E6<cr>
7:008A2FEB090002<cr>
8:0000000003E800<cr>
<cr>
>
请注意,为了更好的可读性,在每个回车 return (<cr>
) 后面添加了换行符,它不是原始数据响应的一部分。
我如何从这些数据中解码温度、电流等?
我自己发现了错误。 ELM327说明(http://elmelectronics.com/DSheets/ELM327DS.pdf)详细解释了AT命令。
这个问题的问题是在初始化阶段(未在问题中描述)由 AT H0
命令(headers 关闭)引起的多个 ECU 的 CAN 响应混合。另见 EM327DS.pdf 第 44 页(多选)。
在启动时使用 AT H1
时,可以毫无问题地解码响应。
初始化(开启AT H1 = headers)
AT D\r\n
AT Z\r\n
AT L0\r\n
AT E0\r\n
AT S0\r\n
AT H1\r\n
AT SP 0\r\n
之后与ECU的通信:
- 对第一个命令的响应
0100\r\n
:
SEARCHING...\r7EB06410080000001\r7EC06410080000001\r\r>
- 对第二个命令的响应
2101\r\n
:
7EE037F2112\r7ED102C6101FFFFF800\r7EA10166101FFE00000\r7EC103D6101FFFFFFFF\r7EB101E6101000003FF\r7EA2109211024062703\r7EC214626482648A3FF\r7ED2100907D87E15592\r7EB210838011D88B132\r7ED2202A1A7024C0134\r7EA2200000000546900\r7EC22C00D9E1C1B1B1B\r7EB220000000A000802\r7EA2307200000000000\r7ED23050343102000C8\r7EC231B1B1C001BB50F\r7EB233C04B8320000D0\r7EC24B5010000810002\r7ED24047400C8760017\r7EB24FF300000000000\r7ED25001401F387F46A\r7EC256AC100026CB100\r7EC2600E3C50000DE69\r7ED263F001300000000\r7EC27008CC38209015C\r7EC280000000003E800\r\r>
- 对第三个命令的响应
2105\r\n
:
7EE037F2112\r7ED037F2112\r7EA037F2112\r7EC102D6105FFFFFFFF\r7EB037F2112\r7EC2100000000001B1C\r7EC221C1B1B1B1B2648\r7EC2326480001641A1B\r7EC2403E80803E80147\r7EC25003A0000000000\r7EC2600000000000000\r\r>
现在每个响应都以 ECU 的 ID 开头。只关注以 7EC
.
示例:
正在寻找以安培为单位的电池电流。在文档 Spreadsheet_IoniqEV_BMS_2101_2105.xls 中,您可以找到电池电流:
- 对
2101
的响应21
:最后一个字节=电池电流的高字节 - 对
2101
的响应22
:第一个字节=电池电流的低字节
因此请查看 2101\r\n
的回复并搜索 7EC21
和 7EC22
:您会发现:
7EC214626482648A3FF
:取电池高值的最后一个字节 ->FF
7EC22C00D9E1C1B1B1B
:取7EC22
后的第一个字节表示电池电量不足 ->C0
电池电流值为:FFC0
这个值是两个补码编码的:
0xffc0 = 65472 -> 65472 - 65536 = -64 ->
-6.4A
结果:电池充电6.4A
有关编码示例,请参阅:
https://github.com/greenenergyprojects/obd2-gateway, file src/obd2/obd2.ts