什么是can通讯(通俗理解CAN通讯)
什么是can通讯(通俗理解CAN通讯)CAN通信这玩意不就是机器版本的群聊吹牛P吗。上来就给人整专业术语,不是自己笨得*牛翔就是装X弄玄虚。整个过程一副凭你的智慧很难解释的贱样。这不要紧,关键那个萌新还是个萌妹子。气得哥写下这篇通俗版CAN通信解释。
前几天看到一个装叉分子在给萌新讲CAN通信,开口就是
“嗯,报文ID等于优先级 PGN SA”,
搞得萌新一愣一愣的。
讲不下去还点上半截红梅,抽一口闭眼叹气,一脸无奈地把红梅按灭再收好——留着等会抽。
整个过程一副凭你的智慧很难解释的贱样。
这不要紧,关键那个萌新还是个萌妹子。
气得哥写下这篇通俗版CAN通信解释。
上来就给人整专业术语,不是自己笨得*牛翔就是装X弄玄虚。
CAN通信这玩意不就是机器版本的群聊吹牛P吗。
完全可以用群聊来类比CAN通信,虽然不严谨但好在通俗易懂快上手。
女神在群里发了条天气好冷,一群哈巴狗就流着哈喇子回多喝热水多喝查,很快群消息就被舔狗刷屏,搞得你都看不到有用消息,想发消息岔进去讨论也没机会。
这种情况就叫CAN 负载率高。
CAN负载率高就是某个控制器跟个话逼似的一天到晚在群里叨逼。
既然CAN负载率高就跟群消息刷屏一样会影响控制器通信那肯定要降低CAN负载率啊。
怎么降?
让群里那几个话P少说几句或者说少说一些没价值的垃圾话,比如多喝热水之类。
同样的情况挪到CAN通信上来就是让控制器不要发出没用的消息。
什么是没用的消息?
发到群里没人关注的消息。
在整车CAN上就是没有控制器需要的消息。
通常在CAN 网络开发的时候就会定义哪个控制器需要发什么消息,哪个控制器需要收什么消息。
PS:这个过程叫CAN 矩阵定义。
换到群聊里就是公司群,人力需要在群里告诉大家周末加班,年底降薪,年终奖取消之类的破事,
而各位打工人只需要回句加班费怎么算?
(人力也是打工人,但这几年魔幻事件比较多导致部分人力会演化成工贼)
公司群聊不是想怎么聊就怎么聊,里面有套路。
1.部门小头目每周五下了班再往群里发周六周日加班,然后大家跟丧尸似地回收到。
这种群聊方式叫周期式群聊,在CAN通信里某些消息就跟周末加班消息一样是按周期发出来。
2. 也有的消息跟大家在群里问人力怎么算加班费一样,有询问才会有回答(发出)。
要是控制器把消息发出去了,但需要收这条消息的控制器没收到。
那么他就可以报出CAN通信故障。
什么是没收到消息?
就像平安夜当晚群里都在发(没错就是发虚拟苹果)一样,你冲群里吼了一声“平安夜送苹果是土狗过洋节”。
你本以为大家会来喷你但群里却异常安静,不是大家集体欠网费了,而是你已经被踢出群聊。
咋判断是不是被踢出群呢?
等消息的时间超出了你的心理预期,一条消息也没收到;
等消息的时间超出了等待时间都还是没收到消息在CAN通信上叫time out 。
不过现实中人被踢出群的情况比较少见,更多情况是点开群里的红包等半天也没打开。这种情况也算time out。即超出等待时间。
还有一种情况是某个人在群里聊着聊着会有沉默一下,语义上也连不起来。在CAN上这叫丢帧,也就是群友发的某几句消息你没收到。
有时候别人拉你进群你要先看看群里要聊些什么东西吧
咋看呢,看话题名字。写着群聊会聊什么话题的清单就是CAN矩阵。
一看群消息的名字不是Tony就是Jenny。这就是你想进的理发技术交流群没跑了。
光知道群里要讨论tony还不行吧,还要知道Tony的话题是哪家理发店来的。
那就规定大家在话题末尾加上理发店店代号,Tony是富贵理发店发出来的,就这么写话题名字Tony22(22代表大富贵店)。
群聊嗨了,都抢着发言还有没有武德。
得让重要话题先发出来吧。
咋看话题重不重要,是不是该优先发出来呢?
往话题前面放上话题优先级。Tony是重要议题那就在话题前写01。
小结:话题Tony的全名就是01tony22,代表这是个重要话题,聊tony老师,富贵理发店发的。
在CAN通信里,消息的名字就像群聊的话题名称。开头也是放消息优先级,中间要聊的议题叫参数组,末尾是消息的来源。发动机发的消息地址是00,等采集了消息一看消息的ID末尾是00就知道消息是发动机发出来的。
作为资深吃瓜群众有时候也想看懂机器们在聊什么怎么看?甚至想亲自下场和机器们(控制器们)聊聊咋整?
那还不简单。
第一,要有一颗吃瓜的心你就是闰土瓜田里的猹,到处都是大瓜,还怕他闰土?
第二,要在机器群聊中插一棒子聊天光有心还不够,你还要有道具——CAN分析仪;
第三,还要上面提到的群聊话题表,也就是CAN矩阵。
有了这两样神器你还需要把要伪装的控制器从群聊里踢出去,也就是把它从线束上拔掉才能伪装成某个控制器加入群聊。
聊什么话题呢?
看你需要,从话题清单(CAN矩阵)上找,再按上面的定义发送消息。
比如你可以伪装成AEB给发动机发消息让发动机限制转速。
举个例子,根据CAN矩阵的定义有条叫AEB110的信息长度8byte,其中byte1-2就是限制转速。发动机运行的时候转速不能超过byte1-2表示的转速。
下一步
你拿着CAN分析仪(也可以是ETAS 582)插到OBD接口(下图红框内的针脚就是诊断CAN,标定CAN在蓝框内不过量产车为了省钱会取消蓝框内的针)上,
再打开Busmaster就可以潜水到控制器的群聊里面。
接下来,伪装成AEB给ECU发消息,限制发动机转速。
照着CAN矩阵在上图红框内填上消息的ID和其他信息
把你需要限制的发动机转速,比如2000rpm换算成HEX(16进制)填到绿框即byte1-2里面。
下一步点发送/黑框就行,踩油门看看发动机转速会不会超过2000rpm。
可是收到的消息全是十六进制数据啊看不懂啊。
没关系,再继续用CAN矩阵。根据CAN矩阵可以把消息里的数字转换你需要的信号。转换的过程叫解析。
按这个公式来转换:信号值=精度*信号所在byte的值 偏移量
比如收到消息编号ID0x18F25000 ,byte1-2表示转速,精度0.25,偏移量0
消息内容是
FF 0B B8 00 00 00 00 00,byte1-2的值是0B B8转换成十进制是3000
∴转速=3000*0.25 0=750rpm,刚好和发动机实际怠速相对应。
PS:不用纠结什么魔头罗拉格式和英特尔格式的报文,拿到数据先转换一遍看。比如不知道0B、B8组成的数字是0BB8还是B80B可以先算一算看
转速40000*0.25≈10000多rpm显然不合理。
对了,本文中提到的消息在专业术语里叫报文。不管中文叫消息还是报文,在英文里都是叫message。
有时候看中文一脸懵(不讲人话),看英文就容易懂了。
补充一点:
为什么要CAN通信?
这个问题就跟为什么要群聊一样。每个信号都要单独用导线发送的话多费导线啊,ECU又不是蜈蚣,长了几百只针脚出来接导线。不如用两根双铰线发报文方便。
先写到这里,昨天不是周五吗?下班后群里又蹦出小队长发的消息:
周六周日加班。
每周定时发果然是周期消息/周期报文,接着群里一溜地回“收到”。
劳子就是不回,就是这么朋克。