我正在用Simulink构建一个HIL/SIL测试,它从车辆上测试车辆控制单元(VCU(。该VCU通过J1939 CAN网络与配电模块(PDM(进行通信。PDM处理开关和执行器的输入和输出,并将信息放到CAN总线上。然后,VCU知道PDM从连接的传感器中看到了什么。反过来,VCU在CAN总线上提供PDM应如何控制连接的执行器的信息。
我的笔记本电脑通过Vector适配器和Simulink连接到同一条CAN总线上。
为了测试VCU,我需要模仿PDM并向VCU发送消息,就好像我是PDM一样。然后,VCU必须采取正确的行动,并相应地控制实际的PDM。
显然,如果我只是模仿PDM,我的消息将干扰从真正的PDM发送的消息。所以基本上,我需要PDM闭嘴,只听。我为PDM做演讲。然而,PDM在纯侦听模式下是不可配置的,所以我必须拦截它发送的所有消息,这样它们就永远不会到达VCU。
我的想法是,我会检测(通过观察所有消息的仲裁字段(PDM何时开始发送,并在仲裁字段中拉低一点。它会意识到我的"信息"优先于它自己的信息,它就会停止传输。就好像CAN总线总是太忙了,给PDM留出了空间。这将关闭PDM而不会引发错误。但也欢迎其他建议。
那么(如何(在MATLAB/Simulink中或使用单独的CAN控制器拦截J1939 CAN消息?
这里有一个想法,如何实现您想要的东西。不过,您需要一些额外的硬件。
这是大致轮廓:
- 设置一个CAN网关设备,该设备具有两个独立的CAN接口
can0
和can1
- 断开PDM与CAN总线的连接,并将其连接到CAN网关的一个接口,例如
can0
- 将CAN网关的第二个接口
can1
连接到原始CAN总线,该总线还包括您的笔记本电脑和VCU - 对CAN网关进行编程,以将
can1
上的所有传入CAN帧转发到can0
接口 - 如果您想忽略来自PDM的所有消息,只需忽略接口
can0
上的CAN帧,而不是将它们转发到can1
示例,如何实现这样的CAN网关:
- 硬件:使用树莓派和带有两个CAN接口的CAN扩展板,如PiCAN2双板
- 软件:编写一个小程序,使用Linux内核中已经包含的socketcan在接口
can0
和can1
之间转发流量 - 如果您的设备通过更高层的J1939传输协议进行通信,您可能还需要在Raspberry Pi上运行J1939传输协议。如果您只是简单地使用29位标识符,最大有效负载为8字节的数据,那么这也不应该是必要的
- 或者,您也可以使用更昂贵的商业解决方案,例如CAN路由器
您最初的想法:
我认为你所设想的在技术上是可行的,但可能还有其他一些缺点。
- 由于can控制器的驱动器在传输仍在进行时通常不会暴露交互操作can帧的接口,因此您可以从微控制器直接寻址can收发器
- 一些研究人员通过将仲裁ID后CAN帧中的第一个隐性位变成某些选定CAN ID的显性位,实现了CAN拒绝服务攻击。他们使用了Arduino Uno和Microchip MCP2551 E/P CAN收发器。所使用的代码也可在线获取。由于这种在传输过程中对CAN帧的交互式操作与您所寻找的内容有关,因此这可能是一个很好的起点
- 当您以这种方式使PDM静音时,我仍然看到了一些缺点:
- 您不仅会以这种方式使PDM静音,而且(至少(会延迟CAN总线上具有仲裁ID的其他节点的传输优先级低于来自PDM的消息
- 当PDM在一定次数的重试后无法成功地将其CAN帧发送到总线时,它很可能会进入某种错误状态
还有一个想法:
如果您能够调整VCU的软件,请对其进行更改,使其不会消耗PDM中的CAN帧,而是通过对相同消息使用不同的CAN ID来消耗笔记本电脑中的CAN框架。为此,您必须更改dbc文件。