バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/
はじめに
前回から仮想HILSに於けるFMUとCANシグナルの紐づけを目的としてあCAPLの話に突入。
CAPLを記述する際はイベントとノードの意識が割と重要となる。
その点を鑑みた上でCAPLを記述することとなった。
今回は実際に作成したCAPLを確認する。
登場人物
博識フクロウのフクさん
![指差しフクロウ](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
イラストACにて公開の「kino_k」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=iKciwKA9&area=1
エンジニア歴8年の太郎くん
![技術者太郎](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
イラストACにて公開の「しのみ」さんのイラストを使用しています。
https://www.ac-illust.com/main/profile.php?id=uCKphAW2&area=1
CAPLコード
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
CAPLを書いてきたんで、貼っておく。
制御器側CAPL
variables
{
msTimer Timer1ms;
}
on signal Target
{
@sysvar::FMI::PID::Input::target = getSignal(Target);
}
on signal Speed
{
@sysvar::FMI::PID::Input::u = getSignal(Speed);
}
on timer Timer1ms
{
setSignal(Voltage::Voltage, @sysvar::FMI::PID::Output::y);
}
on start
{
setTimerCyclic(Timer1ms,1,1);
}
プラント側CAPL
variables
{
msTimer Timer1ms;
}
on message Voltage
{
@FMI::Motor::Input::voltage = getSignal(Voltage::Voltage);
}
on start
{
setTimerCyclic( Timer1ms, 1, 1);
}
on timer Timer1ms
{
setSignal(Sensor::Speed, @FMI::Motor::Output::speed);
setSignal(Sensor::Current,@FMI::Motor::Output::current);
}
CAPLコードを確認
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
これは予想以上にシンプルな感じだねー。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
on startとかon timerとかon signalとかが各関数の先頭にあるけど、
これがイベントハンドラ?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
そうだね。
イベントハンドラはまず先頭に「on」が付く。
そして、
シミュレーション開始なら「start」
タイマなら「timer」
シグナル更新なら「signal」
シグナル更新に関してはさらにその後ろにシグナル名を付けると、
そのシグナル更新時に該当ハンドラが呼び出される。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
なるほど。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
両方のon startで
setTimerCyclic
って関数呼んでるけど、これがタイマイベントを発生されるタイマを開始させてるAPIになるのかな?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/まるフクロウ.png)
正解。
今回だと1ms周期で呼び出されるタイマハンドラになる。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
あとはon timerが1ms周期で呼び出されるからFMUの入出力に割り当てられた
システム変数をCANのシグナルにコピー、
またはそれの逆。
をしてるわけか。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/まるフクロウ.png)
それも正解。
CAPLのコツ的なもの
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
これは思ったよりも簡単そうで安心した。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/考え中フクロウ.png)
まぁCAPLの使い方のコツとしては
「シンプルな構成にする」
かな。
当然複雑なこともできるのだけど、複雑なものは別途ライブラリにするとかにした方が良いだろうね。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
FMUもある意味複雑な処理をライブラリにしているようなもんだんね。
CAPLは繋ぎの辻褄合わせをしてるだけだし。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
そうそう。
その程度の使い方が良いだろう。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
ほぼほぼ準備は整ってきたから次回は実際に動作させるところだねー。
まとめ
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
まとめだよ。
- 仮想HILS向けCAPLコード公開。
- イベントハンドラは関数先頭に「on」が付く。
- その後ろに以下が続く。
- start:シミュレーション開始。
- timer:タイマ。
- signal:シグナル更新。
- その後ろに以下が続く。
- CAPLのコツはシンプルに書く。
- 複雑な処理はライブラリに逃がすなどがコツ。
バックナンバーはこちら。
コメント