主要内容

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_SpeedTire_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.

在上图中,请注意虚拟通道导致的初始传输延迟,这表明传输实际上是在仿真开始后一段时间开始的。这是使用虚拟通道时的预期行为。

此外,请注意,车速是单调递增的,采样频率为 1 Hz。从开始到大约 7 秒后,胎压下降到低于 2.5 bar 的阈值,系统开始传输胎压信号。此信号在减弱,因为轮胎正在放气,系统按照预期以 10 Hz 的频率进行采样。

另请参阅

模块