主要内容

通过 CAN Pack 模块输入端口动态更改 CAN ID

此示例说明如何通过输入端口指定 CAN ID 来动态控制提供给 CAN Pack 模块的 CAN 标识符 (CAN ID)。

通过这种方法,可使用不同的 CAN ID 对报文进行动态打包。

探索模型

model = 'demoDynamicCANID'; 
open_system(model);

构建该模型是为了展示报文从打包到通过虚拟 CAN 网络传输的流程。关键组件包括:

  • CAN Pack 模块:配置为通过输入端口动态接受 CAN ID,以便于灵活打包 CAN 报文。

  • CAN Transmit 模块:用作将打包的报文发送到虚拟 CAN 网络的入口。

  • CAN Configuration 模块:配置可用于传输和接收报文的 CAN 设备的参数。

  • Step 模块:为 CAN Pack 模块提供不同输入。

检查 CAN Pack 模块

双击 CAN Pack 模块以打开其参数对话框。选择选项 Specify CAN identifier from input port

启用此复选框会添加一个新的输入端口,以允许动态地提供不同的 CAN ID。

设置 CAN Transmit 模块

报文被打包并发送到 CAN Transmit 模块,该模块连接到 MathWorks® 虚拟通道 1。

在 MATLAB 中创建 CAN 通道

要接收这些报文并观察它们,请使用 MathWorks 虚拟通道 2。

rxCh = canChannel('MathWorks', 'Virtual 1', 2);

启动接收通道。

start(rxCh);

仿真模型。

sim(model);

以时间表格式接收报文。

rxMsg = receive(rxCh, Inf, "OutputFormat", "timetable")
rxMsg=11×8 timetable
       Time       ID    Extended       Name              Data            Length      Signals       Error    Remote
    __________    __    ________    __________    ___________________    ______    ____________    _____    ______

    1.8717 sec    1      false      {0×0 char}    {[8 0 0 0 0 0 0 0]}      8       {0×0 struct}    false    false 
    2.8777 sec    1      false      {0×0 char}    {[8 0 0 0 0 0 0 0]}      8       {0×0 struct}    false    false 
    3.8816 sec    1      false      {0×0 char}    {[8 0 0 0 0 0 0 0]}      8       {0×0 struct}    false    false 
    4.8831 sec    1      false      {0×0 char}    {[8 0 0 0 0 0 0 0]}      8       {0×0 struct}    false    false 
    5.8903 sec    1      false      {0×0 char}    {[8 0 0 0 0 0 0 0]}      8       {0×0 struct}    false    false 
    6.8906 sec    5      false      {0×0 char}    {[8 0 0 0 0 0 0 0]}      8       {0×0 struct}    false    false 
    7.8868 sec    5      false      {0×0 char}    {[8 0 0 0 0 0 0 0]}      8       {0×0 struct}    false    false 
    8.8831 sec    5      false      {0×0 char}    {[8 0 0 0 0 0 0 0]}      8       {0×0 struct}    false    false 
    9.8793 sec    5      false      {0×0 char}    {[8 0 0 0 0 0 0 0]}      8       {0×0 struct}    false    false 
    10.876 sec    5      false      {0×0 char}    {[8 0 0 0 0 0 0 0]}      8       {0×0 struct}    false    false 
    11.874 sec    5      false      {0×0 char}    {[8 0 0 0 0 0 0 0]}      8       {0×0 struct}    false    false 

观察接收到的报文中 CAN ID 的变化。

stop(rxCh);

要可视化不同的 CAN ID,请对接收到的 CAN ID 绘图。

plot(rxMsg.Time, rxMsg.ID);
hold on
data = vertcat(rxMsg.Data{:});
plot(rxMsg.Time, data(:,1));
hold off
xlabel("TimeStamp");
ylabel("CAN ID Value");
legend("CAN ID","Data","Location","northeastoutside");
legend("boxoff");
yMax = max(rxMsg.ID)+5;
ylim([0 yMax]);