1

我正在使用 Simulink 构建 HIL/SIL 测试,该测试从车辆上测试车辆控制单元 (VCU)。此 VCU 通过 J1939 CAN 网络与配电模块 (PDM) 通信。PDM 处理来自开关和致动器的输入和输出,并将信息放在 CAN 总线上。VCU 然后知道 PDM 从连接的传感器看到什么。反过来,VCU 将有关 PDM 应如何控制连接的执行器的信息放在 CAN 总线上。

我的笔记本电脑通过 Vector 适配器和 Simulink 连接到同一条 CAN 总线。

为了测试 VCU,我需要模仿 PDM 并向 VCU 发送消息,就像我是 PDM 一样。然后 VCU 必须采取正确的行动并相应地控制真正的 PDM。

显然,如果我只是模仿 PDM,我的消息会干扰从真实 PDM 发送的消息。所以基本上,我需要 PDM 闭嘴,只听。我为 PDM 代言。但是,PDM 不能在只听模式下进行配置,所以我必须拦截它发送的所有消息,这样它们就永远不会到达 VCU。

我的想法是当 PDM 开始发送时我会检测(通过观察所有消息的仲裁字段),并在仲裁字段中拉低一点。它会识别出我的“信息”比它自己的优先级,并且它会停止传输。就好像 CAN 总线总是忙于给 PDM 腾出空间。这将关闭 PDM 而不会引发错误。但欢迎提出其他建议。

那么(如何)可以在 MATLAB/Simulink 或使用单独的 CAN 控制器中拦截 J1939 CAN 消息?

4

1 回答 1

2

这是一个想法,如何实现您正在寻找的东西。但是,您需要一些额外的硬件。

这是粗略的轮廓:

  • 设置一个 CAN 网关设备,它有两个独立的 CAN 接口can0can1.
  • 断开 PDM 与 CAN 总线的连接,并将其连接到 CAN 网关的接口之一,例如can0
  • 将 CAN 网关的第二个接口 , 连接can1到原始 CAN 总线,其中还包括您的笔记本电脑和 VCU
  • 对您的 CAN 网关进行编程,以将所有传入的 CAN 帧转发can1can0接口
  • 由于您想忽略来自 PDM 的所有消息,只需忽略进入接口的 CAN 帧can0而不它们转发到can1

例如,如何实现这样的 CAN 网关:

  • 硬件:使用 Raspberry Pi 和带有两个 CAN 接口的 CAN 扩展板,例如PiCAN2 duo板。
  • 软件:编写一个小程序来转发接口can0和之间的流量can1,使用已经包含在 Linux 内核中的socketcan 。
  • 如果您的设备通过更高层的 J1939 传输协议进行通信,您可能还需要在 Raspberry Pi 上运行J1939 传输协议。如果您只是使用最大有效负载为 8 字节数据的 29 位标识符,那么这也不是必需的。
  • 或者,您也可以使用更昂贵的商业解决方案,例如这个CAN-Router

你原来的想法:

我认为您所设想的在技术上是可行的,但可能还有其他一些缺点。

  • 由于 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 帧,方法是为相同的消息使用不同的 CAN-ID。为此,您必须更改 dbc 文件。

于 2018-11-01T22:23:17.327 回答