CDL3的自定义CAN协议

Motec CAN协议

    之前弄清楚了Dash Manager的初步使用方法,但想要使用除Motec ECU和一些特定型号的ECU以外的数据来源,需要对其CAN协议进行定制。

    一般需要了解的CAN的格式是11位地址加8字节数据(扩展帧有29位地址)。对于ECU来说,一般一个数据占1-2字节,所以传送的多有数据自然不可能只有8个字节,这就需要进行多帧的传输。但多帧传输是需要协议的,而在Dash Manager中完全没有找到过关于多帧传输协议的信息。这方面国内中文资料极少,爬到谷歌上找到了Motec的论坛,上面有很多人有类似的疑问,但下面的回答不痛不痒,主要是针对ECU而不是CDL3的。后来是从一个博客中得到的启示,贴上地址

https://zhaodi.me/motec-can-bus-stream-decoding/

(感觉博主好强…)

    这篇博客中讲的是M84的CAN协议。概括地说就是Motec的CAN协议以0x82,0x81,0x80为包头,每个数据包包含22帧,存放了各种数据。但对使用CDL的我来说,仍然存在两个重要的问题。一是将CAN分析仪接到从M800输出到CDL的CAN接口上试图分析数据时,我发现我得到的数据是这样的


不难发现,是18帧一个循环,而且里面也没有出现任何形似82,81,80的数据。第二是,CDL如何知道应该在哪一位放了什么数据,又如何知道接入的是什么ECU呢?如果它一直按照82,81,80,22帧的协议来读数据,岂不是只能和Motec产品交互

    在之前看论坛时,看见有人说可以给Motec support发邮件,所以我就把这两个问题发过去试试。在发出邮件后的第4天,我收到了Motec的回复。


同时他给了我一张图片,看样子应该是他特地做的吧


可以说是相当赞了。从这张图里得到最重要的信息就是Offset这个参数。之前一直以为是将数据的值进行偏移,而图里说,这其实是数据在CAN帧中位置的偏移量。也就是Offset=2,说明数据起始在一帧里的第3个字节,Offset=6,说明数据起始在一帧里的第7字节。

    Motec的这张png解决了我的第二个问题的前半部分。但如何进行自定义的多帧传输,以及我从M800中拿出的数据还是没有解决。因此我根据Dash Manager中的M800 Pattern的channel参数,结合Offset定义和CAN分析仪又进行了测试,发现之所以我的数据是18帧,是因为在M800的默认配置里,所有通道占的字节数加起来正好是144,也就是18*8。虽然看起来这个解释很圆满,但这又说明,这144个字节里并没有数据的包头字节,那CDL如何区别ECU的问题还是无法解决。所以尽管我已经尝试了发送单帧数据,并能够控制CDL的显示,但还是不能将它用于实际。

Compound Message的使用

    不过,在Motec的邮件里有两个链接,是Motec的网络seminar地址(油管上的,需要。。)。视频里讲了Motec CAN的Compound Message的意义。不同于Single Message是将所有数据放在多个帧里融合成一个整体,Compound Message是给帧定义了一个索引,存放在数据位的第一个或前两个字节。这样就相当于在CDL的CAN id下又加了一级id,有点像操作系统里的多级页表。


一个帧里能携带的数据减少了,但能方便地对同一个CAN id传递很多不同的数据。这在Dash Manager里配置起来也很简单


选择Compound之后,左侧定义数据位的某两个字节作为索引,右侧加入通道和Offset即可。需要注意的是右侧加入的第一个通道,他的Offset是0,也就是和索引位的默认Offset相同,在传输时,通道的数据位置定义会覆盖掉索引的定义,也就是我发送00 11 01 00 00 00 00 00,这个数据的前两位会被认为是Accel Pedal Pos而不是No1的ID。

总结

    Compound传输多帧很简单

    有问题可以email Motec官方

    可能CDL识别ECU的方法在Communication的参数这个Async. Device里


里面有M8,M4,GPS,和一些看起来很像品牌的选项,很有可能就是选择CAN协议的。但在Default配置下这项是不能选择的。

猜你喜欢

转载自blog.csdn.net/Dio980/article/details/79600515