Simulink 中任意触发的 CAN 报文传输
此示例说明如何在一般情况下传输 CAN 报文。
CAN Transmit 模块提供在数据变化时有条件地传输 CAN 报文的功能。如果该模块的输入报文之一发生变化,例如由于信号值之一发生变化,则该模块会立即传输该报文。
然而,数据变化并非触发 CAN 报文传输的唯一条件。在复杂模型中,触发条件可能更广泛。例如,信号或状态变量的值与某个设定阈值的比较。
描述
以 Simulink® 模型 ArbitrarilyTriggeredCANTransmissionExample 为例,它表示一个通过 CAN 总线传输车速和胎压值的简化系统。显示系统会接收这些值并将其提供给驾驶员。需要持续向驾驶员提供车速值,但胎压值仅在低于某个阈值时才会显示,以指示轮胎出现了放气。
modelName = "ArbitrarilyTriggeredCANTransmissionExample";
open_system(modelName);该模型的组织结构如下。
Tire pressure measurement 子系统生成胎压的测量值,并对轮胎放气导致的压力快速下降(从标称值 3 bar 或 300000 Pa)进行仿真。此子系统包含一个运行的平均滤波器,用于平滑瞬时压力数据以降低测量噪声的影响。
下游的 Low tire pressure alarm 子系统将滤波后的压力值与阈值进行比较,如果压力变得低于此阈值,则将警报标志设置为 true。
警报标志会激活 Transmit tire pressure 子系统,该子系统包含一个 CAN Pack 和一个 CAN Transmit 模块;此子系统会有条件地在 CAN 总线上传输滤波后的压力信号。
Vehicle speed measurement 子系统对从 0 到 100 km/h 的加速度所对应的速度信号进行仿真。
Transmit vehicle speed 子系统包括一个 CAN Pack 和一个 CAN Transmit 模块,用于在总线上无条件地传输速度信号。

Transmit tire pressure 子系统中的模块配置如下:
CAN Pack 使用外部数据库文件
CANBusArbitraryTrigger.dbc对信号进行编码和打包。CAN Transmit 配置为启用
On data change传输选项。
该模型使用虚拟通道进行配置,允许在 MATLAB® 中接收传输的报文。
请注意,如模型中的采样时间重叠所示,系统分别以 10 Hz 和 1 Hz 的不同速率对胎压信号和车速信号进行采样。Transmit vehicle speed 子系统中的 CAN Transmit 模块配置为在数据有变化时传输,因此传输周期为 1 Hz。同样,Transmit tire pressure 子系统中的 CAN Transmit 模块配置为在数据有变化时传输,并且由此产生的传输周期将为 10 Hz;然而,仅当子系统激活时,信号才会传输。
在 MATLAB 中仿真模型和记录数据
在 MATLAB 中设置并启动 canChannel 来侦听在 MathWorks® 虚拟通道 1 上传输的报文。
db = canDatabase("CANBusArbitraryTrigger.dbc"); canCh = canChannel("Mathworks", "Virtual 1", 2); canCh.Database = db; start(canCh);
将仿真设置为使用调速,以便模型仿真时间约等于挂钟时间。脚本会相应地暂停执行。
StopTime = 10; % [s] set_param(modelName, "EnablePacing", "on", "PacingRate", "1", "StopTime", num2str(StopTime)); set_param(modelName, "SimulationCommand", "start"); pause(StopTime);
接收缓冲区中的所有报文
msg = receive(canCh, inf, "OutputFormat", "timetable");
对报文进行后处理
要显示 Vehicle_Speed 和 Tire_Pressure 信号,请在时间表中解码收到的 CAN 报文。
Tmsg = canMessageTimetable(msg, db); Tsig = canSignalTimetable(Tmsg); plot(Tsig.Vehicle_Status.Time, Tsig.Vehicle_Status.Vehicle_Speed, "b*-"); yyaxis("left"); ylabel("Vehicle speed [m/s]"); hold("on"); plot(Tsig.Tire_Status.Time, Tsig.Tire_Status.Tire_Pressure/1e5, "rx-"); yyaxis("right"); ylabel("Tire pressure [bar]");
![Figure contains an axes object. The axes object with ylabel Tire pressure [bar] contains 2 objects of type line.](../../examples/vnt/win64/ArbitrarilyTriggeredCANMessageTransmissionInSimulinkExample_02.png)
在上图中,请注意虚拟通道导致的初始传输延迟,这表明传输实际上是在仿真开始后一段时间开始的。这是使用虚拟通道时的预期行为。
此外,请注意,车速是单调递增的,采样频率为 1 Hz。从开始到大约 7 秒后,胎压下降到低于 2.5 bar 的阈值,系统开始传输胎压信号。此信号在减弱,因为轮胎正在放气,系统按照预期以 10 Hz 的频率进行采样。