【上流検証】最小構成のモデルベース開発事例 その33【ネットワークRAPID⑥】

【上流検証】最小構成のモデルベース開発事例 その33【ネットワークRAPID⑥】 事例

バックナンバーはこちら
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

おさらい

フクさん
フクさん

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

CANoe、SimulinkDLL、システム変数、シグナル、CAN
太郎くん
太郎くん

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

フクさん
フクさん

そうだね。

CAPLブラウザ

太郎くん
太郎くん

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

フクさん
フクさん

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

CANoeネットワークノードの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送信は別物。
    • シグナルの更新有無に関係なく送信周期を定義できる。

バックナンバーはこちら

コメント

タイトルとURLをコピーしました