如何解码现代 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的通信:

  1. 对第一个命令的响应 0100\r\n:
SEARCHING...\r7EB06410080000001\r7EC06410080000001\r\r>
  1. 对第二个命令的响应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>
  1. 对第三个命令的响应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 的回复并搜索 7EC217EC22:您会发现:

  • 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