バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/
はじめに
前回まででPyFMIのDummyFMU関連の辻褄合わせを実施。
細かいことは抜けているかもしれないがおおよそFMU周りはOKだろう。
となると、今度はPID制御器を組み込んだ仮想ECUとのやり取りの部分に入る。
(つまりXCP関連)
登場人物
博識フクロウのフクさん
イラスト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
XCP関連セットアップ処理追加
次はXCP関連の話になる。
以前、xcp_canってクラスを作ってるから
それを呼び出せば良いってイメージでいるのだけど、それでOK?
OKだ。
追加するコードもシンプルで以下になる。
# XCP関連セットアップ
self.xcp = xcp_can.xcp_can()
self.xcp.setup()
self.xcp.start_daq()
ほう。
start_daq()を呼び出しているってことは、ここでDAQ起動までしちゃうのね。
XCP関連の処理が隠蔽されてるから利用する側は相当楽ちんってことか。
仮想HILS側でXCP絡みをごちゃごちゃやりたくないからね。
XCP DAQ受信部追加
次はDAQ受信部だね。
FMU_handler内のFMU処理部直前で呼び出すことを想定している。
コードとしてはこれもシンプル。
# XCP DAQ受信
daq = self.xcp.recv_daq()
if len(daq) > 0:
self._voltage = float(int.from_bytes(daq['0'][0][5:7], byteorder='little', signed=True))/0x100
do_pidで使用していたself._voltageがここで登場するのか。
ところで、int.from_bytesって何?
DAQの結果がbytearrayで取得されるんで、複数バイトをまとめて整数型にしてる。
最終的にはfloatにするけど。
なるほど。
bytearrayからの変換か。
一撃で変換してくれるのはありがたいね。
XCP STIM送信部追加
そしてXCP関連の最後のSTIM送信。
これもFMU_handler内で呼び出す想定だが、
こちらはFMU_handler内のFMU処理部直後に呼び出す。
# XCP STIM送信
self.xcp.stim(int(self.deque_target[-1])*0x100, int(self.deque_speed[-1])*0x100)
一行で終わるのか!
うん。
ちなみにDAQ受信でもあったけど、
物理値の単位はどれも1/256にしてある。
変数としては2byte(16bit)長で、上位byteが整数部、下位byte小数部。
ってイメージ。
1/256とか意味不明な単位だと思ったけど、
byteで考えるとちょうど良い単位なのか。
というわけで仮想HILSが作れるはずなので、
次回までにとりあえず動くところまでやっておこう。
まとめ
まとめだよ。
- XCP関連の処理を追加。
- 基本xcp_canクラスを呼び出すだけ。
- DAQ受信とSTIM送信はFMU処理が実装してあるFMU_handler内で呼び出す。
- DAQ受信はFMU処理直前。
- STIM送信はFMU処理直後。
- これにより、仮想ECU側の変数と仮想HILS側のシグナルの同期が取れる。
バックナンバーはこちら。
コメント