バックナンバーはこちら
https://www.simulationroom999.com/blog/model-based-of-minimum-backnumber/
はじめに
前回は、CANoeのシステム変数の定義とSystemVriableOutputを使用したシステム変数への出力を行った。
今回は、CAPLを使用したシステム変数のシグナルへの分配を行う。
登場人物
博識フクロウのフクさん

イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん

イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
おさらい

一応、全体像のおさらい。


とりあえず、システム変数への出力までは出来ている状態だから、
あとはシグナルへ書き込めば良いのかな?

そうだね。
CAPLブラウザ

ただ、CAPLとか書いたことないし、
ノードに割り付けるとか言ってたようだけど
割り付け方も知らないよ。

まぁそんな難しい話は無くて、
ノード上の鉛筆マークの「編集」ってのをクリックすると
そのノード用のCAPLを編集できる。


おう。なんか開いた。


CAPLブラウザだね。
CAPL用のエディタだと思えば良い。
CAPLコード

includeとvariableってのがあるだけだね。

今回はそこは使わないので、そっとしておいて、
以下のコードを書けば良いよ。
on sysvar_update SHIFT_LEVER_REVERSE
{
setSignal(CAN1::SHIFT_111::SHIFT_LEVER_REVERSE_0,@sysvar::SHIFT_LEVER_REVERSE);
setSignal(CAN2::SHIFT_222::SHIFT_LEVER_REVERSE_1,@sysvar::SHIFT_LEVER_REVERSE);
}

え?これだけ?

今回はシステム変数をシグナルへコピするだけなんで、
これだけ。
ValueObject

でも、それぞれのコードの意味は正確には良く分からないな。
そもそも「on sysvar_update SHIFT_LEVER_REVERSE」って何?関数名?

ValueObjectってもので、イベントハンドラと言った方が分かり易いかな。
「on sysvar_update SHIFT_LEVER_REVERSE」は
「SHIFT_LEVER_REVERSEというシステム変数が更新された」ら呼び出される関数。
と思えば良いよ。

ということは、
SimulinkモデルからSystemVariableOutputで更新が掛かると、このイベントハンドラが呼ばれるってことだね。
シグナル更新

「CAN1::SHIFT_111::SHIFT_LEVER_REVERSE_0」と「CAN2::SHIFT_222::SHIFT_LEVER_REVERSE_1」は
それぞれの回線のシグナル名だね?
「@sysvar::SHIFT_LEVER_REVERSE」がシステム変数かな?

そうだね。

setSignalでシグナルに書き込むんだと思う。
というわけで、システム変数が更新→各シグナルを更新→各CAN回線へ送信・・・。
CAN送信周期

あれ?
Simulinkモデル自体は\(10[ms]\)駆動にしていた場合、
「on sysvar_update SHIFT_LEVER_REVERSE」は\(10[ms]\)毎に呼ばれて、
結果、CAN回線への送信も\(10[ms]\)?

これは困る!
CAN回線への送信はCAN1側は\(10[ms]\)周期でCAN2側は\(100[ms]\)じゃないと!

大丈夫だよ。
シグナルの更新とCAN回線への送信周期は別物だから。
dbcでシグナルを載せている各メッセージの送信周期で設定した周期で送信されるんで。
ちなみにシグナルが更新されなくても指定の送信周期で送信される。

そういえば、冷静に考えると、
以前のシグナル書き込みも書き込んだ周期で送信してたわけじゃなかったね。
あせった。
まとめ

まとめだよ。
- CAPLはValueObjectというイベントハンドラを起点に処理を走らせる。
- シグナル更新とCAN送信は別物。
- シグナルの更新有無に関係なく送信周期を定義できる。
バックナンバーはこちら
コメント