通过 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]);
