首页 > 解决方案 > 如何解码现代 Ioniq EV 的 OBD-2 数据

问题描述

我尝试使用 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>>

C0中的值4:03E82403E80FC0似乎是充电状态 (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>
>

请注意,为了更好的可读性,在每个回车符 ( <cr>) 后面添加了换行符,它不是原始数据响应的一部分。

如何从这些数据中解码温度、电流……?

标签: obd-ii

解决方案


我自己发现了错误。ELM327 描述 ( http://elmelectronics.com/DSheets/ELM327DS.pdf ) 详细解释了 AT 命令。

这个问题的问题是AT H0在初始化阶段(未在问题中描述)中的命令(标头关闭)导致来自多个 ECU 的 CAN 响应混合。另见EM327DS.pdf第 44 页(多选)。

在启动时使用AT H1时,可以毫无问题地解码响应。

初始化(AT H1 = 标头打开)

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中,您可以找到电池电流:

  • 响应:最后一个字节 = 电池电流的高21字节2101
  • 响应:第一个字节 = 电池电流的低22字节2101

2101\r\n因此,请查看并搜索7EC21and的响应7EC22:您会发现:

  • 7EC214626482648A3FF: 取最后一个字节作为电池高值 ->FF
  • 7EC22C00D9E1C1B1B1B: 取第一个字节7EC22作为电池电量低值 ->C0

电池电流值为:FFC0

这个值是两个补码编码:
0xffc0 = 65472 -> 65472 - 65536 = -64 -> -6.4A

结果:电池充电6.4A

有关编码示例,请参见:
https ://github.com/greenenergyprojects/obd2-gateway ,文件src/obd2/obd2.ts


推荐阅读