バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/
はじめに
前回はPyXCPのDAQパケットの取得の仕組みを実際に取得するコードを確認した。
transport層に相当するクラスでdaqQueueが定義されており、
このdaqQueueに自動的にDAQパケットがキューイングされる仕組みになっている。
これはJSONコンフィグレーションのCAN_USE_DEFAULT_LISTENERがtrueでないと使えない。
今回は、以前XCP BasicでやったのようにDAQパケットを受信しながらDOWNLAODで該当RAM空間を書き換える実験になる。
登場人物
博識フクロウのフクさん

イラスト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
DAQパケットを受信しながらのDOWNLOADコマンド発行

前回でDAQパケット受信はできるようになったけど、
計測値は0値固定なんだよねぇ。

これはやっぱりXCP Basicの実験でやったようにDOWNLOADコマンドで途中に挟むって実験をやっておきたいねー。

そうだね。
XCP Basic側はそれをやっても問題ないことは分かっているが、
PyXCP側でそれが成立するかは確認しておくべきだろう。

やり方としては前回のDAQパケット受信のwhileループにsetMta、downloadのメソッドを挟み込む感じでOKなのかな?

恐らくそれで行けるはずだ。
PyXCPも以前我々がやったのと同じように
CMD-RESとDAQパケットを仕分けるロジックが入っているようだから、
CAN回線上にRES、ERR、DAQが混在しても問題が出ないはずだ。

XCP Basicの時もDAQパケットとレスポンスパケットの混在対策の話は出たねー。
あれと同じことやってるのか。
たしかここら辺。
実際のコード

じゃ、今回の実験コードは太郎くんに書いてもらおう。

まじか。

うーん、前回のwhileループのコードをもってきて・・・。
そして間にsetMtaとdownloadを挟み込んで・・・。
タイミングは0.05秒毎にそれぞれを発行して・・・。

こんな感じか。
import time
download_wait = 0.05
start = time.time()
download_time = time.time()+download_wait-0.03
ram_update = [
[0x11, 0x22, 0x33, 0x44],
[0x55, 0x66, 0x77, 0x88],
[0x99, 0xAA, 0xBB, 0xCC],
[0x00, 0x00, 0x00, 0x00],
]
i = 0
str = ""
while True:
queue_len = len(xm.transport.daqQueue)
for _ in range(queue_len):
daq = xm.transport.daqQueue.popleft()
str += '%.6f, %s\n' % ( daq[3],daq[0].hex() )
if time.time() > download_time:
xm.setMta(0x00000004,0xff)
bhv = bytearray(ram_update[i])
xm.download(bhv)
str += 'download %s\n' % bhv.hex()
download_time = download_time + download_wait
i = i+1
if i > 3:
i = 3
if time.time() > start + 0.22:
break
time.sleep(0.010)
print(str)

うん。
いいんじゃない?

setMta、downloadのタイミングはdownload_timeで計ってるんだけど、
初回はstartStopSynchの通信でで少しdelayが入ることを想定して少し早め(30[ms])に細工した感じ。

そうだね。
PythonでCAN受信する場合、若干のDelayが入るから、
そういった微調整は重要な要素だろう。

次回、実際に動作確認ってところかな。
まとめ

まとめだよ。
- PyXCPでDAQパケットを受信しながらSET_MTA、DOWNLOADのコマンド送信を行う実験。
- XCP Basic側は問題なくできることは分かってるのでPyXCP側メインの実験。
- 一応PyXCP内コード的には大丈夫そう。
- 実験コードはDAPパケット受信ループ内で0.05秒周期でSET_MTA、DOWNLOAD発行。
バックナンバーはこちら。
コメント