从具有多个ECU芯片的车辆接收的帧


10

我一般不是“汽车人”,所以希望我能对此做足够的解释以在这里获得一些帮助:

将消息发送到OBD-II设备时,在我测试过的大多数汽车中,我都会收到一个答复。但是,对于显然具有多个ECU芯片的汽车,我从每个汽车中都得到了回应。例如,如果我将01 0C PID命令发送到具有3个ECU芯片的车辆,则会收到3个响应,这些响应通常非常相似,但仍然不同。

一个01 00命令应该返回4个字节,用于说明车辆支持的PID,但这也将为每个ECU返回4个字节-一个是充实的4个字节,带有多个标志的开和关,而其他似乎只有少数标志已打开(到目前为止,这些标志似乎始终是“主要”响应中包含的标志,但我不确定是否总是这种情况)。

例:

SENT: 01 00

RECEIVED:

00 BF BF AC D3 - This response has the most binary flags turned on
00 98 18 80 11 - 8 flags on here
00 98 18 80 13 - 9 flags on here

最后两行由也在第一行中标记的标志组成,但是第3行有一个附加标志,第2行没有。

在我看来,也许只有一个ECU可以作为发送命令时应该收听的“主要”芯片,并且(我认为)我知道我可以使用CAN ID掩码/过滤器来只注意我需要的那些。

问题是:我真的应该关注一个“主要ECU”,还是所有这些响应都同样重要?如果我需要确定主要目标,是否可以发送命令确定哪个是“最重要的”?

测试车辆:

2011 Chevy Cruze               [2 ECUs]
2015 BMW M5                    [3 ECUs]
2015 Range Rover Autobiography [3 ECUs]

1
告诉我们您尝试使用哪种品牌和型号可能会很有用。我所知道的是,具有3个ECU的汽车通常设置有两个常规ECU(每个引擎组一个)和一个“主” ECU,用于管理往返两个常规ECU的信号(可能在两个ECU之间)。“主” ECU实际上并没有做更多的事情,因此,如果设置了诊断故障代码,则其来源将是常规ECU,而不是“主” ECU。但是,您可能必须通过OBD-II接口轮询主控方才能获得DTC。我希望我能为您提供更多帮助,但这仅是我目前所拥有的。
Zaid 2015年

1
我是软件工程师,但没有使用过OBD或CAN,但是此页面有帮助吗?似乎应该有一种过滤消息的方法。
JPhi1618 2015年

@Zaid感谢您的额外信息。我用测试过的汽车更新了我的问题,但这是我需要在任意数量的给定汽车中做出决定的问题。最终可能不会很重要,具体取决于发送不支持的PID时我应该期望的确切响应,但是我只想涵盖我的所有基础
Rein S

@ JPhi1618这实际上与我需要的上下文几乎相同。这很可能是我需要遵循的道路!非常感谢您提供的链接,我将对其进行更深入的研究。
Rein S

1
如果发现任何您认为可以充实的有趣内容,请返回并回答您自己的问题。那是完全允许的。
JPhi1618 2015年

Answers:


5

如果您的车辆是2008年或更晚的车辆,并且使用的是can协议,则可以使用AT CR命令选择要从哪个ECU收听。
方法如下:
发送

AT H1

这将打开标题以查看ECU的地址。
发送

0100

这是一个OBD命令,用于显示支持1-20中的哪些PID。
您的回答应该是:

7E8064100BE3EA813
7E906410098188013
>

这表明您有2个ECU 7E8(引擎)7E9(变速箱),
我看到有5个ECU返回:7E8,7E9,7EA,7EB,7EC。
为了仅从一个ECU听到,您发出AT CRA xxx,其中xxx是ECU地址。
发送以下

AT CRA 7E8

然后

0100

将返回:

7E8064100BE3EA813

发送

AT H0

关闭标题,然后发送:

0100

你会回来的

4100BE3EA813

如果您的车辆是29位的,那么0100共振将类似于:

18DAF11806410088180013
18DAF110064100BE5FA813
>

该图显示了2个ECU 18DAF118(变速器)和18DAF110(发动机)。
发送

AT CRA 18DAF110

听到来自引擎的声音。


嗨!我正在研究车辆诊断系统的原型。我已经回答了您的问题,但查询很少... 1)是否有任何AT命令来检查有多少个ECU。2)当头部又比为什么只有一个字符串“4100BE3EA813”被显示不是两者“410098188013”
开发

4

CAN无法像您想的那样工作。

CAN不是基于模块的,而是基于消息的。没有模块直接与任何其他模块对话。在CAN中,模块生成带有地址的消息,该地址标识消息中将包含的数据。地址也说明了消息的重要性。地址越低,优先级越高。

例如,ABS将发送车辆速度。每个其他需要数据的模块都将读取它。

没有哪个模块比任何其他模块都重要,重要的是消息优先级。


只是为了跟进此事:如果没有哪个模块比另一个模块更重要,那么是否有任何理由要过滤掉多个ECU的响应?例如,如果我请求BMW M5的RPM,我会得到3个响应(它们通常是相似的,但永远不会完全相同)。我是否应该“相信”第一个回答作为准确的阅读内容?有什么理由不仅仅针对每个请求的第一个响应?
Rein S 2015年

如果所有响应都具有相同的地址,则信任第一个。如果他们没有相同的地址,则信任具有最高优先级的地址。最高优先级具有最低地址。
vini_i 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.