このページは機械翻訳を使用して翻訳されました。最新版の英語を参照するには、ここをクリックします。
Simulink における任意トリガー CAN メッセージ送信
この例では、一般的な条件で CAN メッセージを送信する方法を示します。
CAN Transmit ブロックは、データの変更時に条件付きで CAN メッセージを送信する機能を提供します。ブロックへの入力メッセージの 1 つが変更されると (たとえば、信号値の 1 つが変更されたため)、ブロックは直ちにメッセージを送信します。
ただし、CAN メッセージの送信をトリガーできる条件はデータの変更だけではありません。複雑なモデルでは、トリガー条件はより一般的なものになる可能性があります。たとえば、信号または状態変数の値と設定されたしきい値の比較などです。
説明
CAN バスを介して車両速度とタイヤ空気圧の値を送信する簡略化されたシステムを表す Simulink ® モデル ArbitrarilyTriggeredCANTransmissionExample
を検討してください。表示システムはこれらの値を受信し、ドライバーが利用できるようにします。車両の速度はドライバーに継続的に提供される必要がありますが、タイヤの空気圧は、タイヤが空気圧が低下していることを示すために、その値が特定のしきい値より低い場合にのみ表示されます。
modelName = "ArbitrarilyTriggeredCANTransmissionExample";
open_system(modelName);
モデルは次のように構成されています。
"Tire pressure measurement" サブシステムは、タイヤ圧力の測定値を生成し、タイヤの空気圧低下による急激な圧力低下(公称値 3 bar または 300000 Pa から)をシミュレートします。このサブシステムには、瞬間圧力データを平滑化して測定ノイズの影響を減らす実行平均フィルターが含まれています。
下流の "Low tire pressure alarm" サブシステムは、圧力のフィルタリングされた値をしきい値と比較し、圧力がこのしきい値より低くなった場合にアラーム フラグを true に設定します。
アラーム フラグは、CAN Pack ブロックと CAN Transmit ブロックを含む "Transmit tire pressure" サブシステムをアクティブにします。このサブシステムは、フィルタリングされた圧力信号を条件付きで 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 メッセージを timetable で復号化します。
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]");
上の図では、仮想チャネルによる初期の送信遅延に注目してください。これは、シミュレーションの開始後しばらくしてから送信が実際に開始されることを示しています。これは仮想チャネルを使用する場合の予想される動作です。
さらに、車両速度は単調に増加し、1 Hz でサンプリングされていることに注意してください。開始から約7秒後、タイヤの空気圧が2.5barの閾値を下回り、タイヤ空気圧信号の送信が始まります。この信号はタイヤの空気が抜けているため減少しており、予想どおり 10 Hz でサンプリングされています。