バックナンバーはこちら。
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空間を書き換える実験になる。
登場人物
博識フクロウのフクさん
![指差しフクロウ](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
DAQパケットを受信しながらのDOWNLOADコマンド発行
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」20アップ.png)
前回でDAQパケット受信はできるようになったけど、
計測値は0値固定なんだよねぇ。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
これはやっぱりXCP Basicの実験でやったようにDOWNLOADコマンドで途中に挟むって実験をやっておきたいねー。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
そうだね。
XCP Basic側はそれをやっても問題ないことは分かっているが、
PyXCP側でそれが成立するかは確認しておくべきだろう。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」13アップ.png)
やり方としては前回のDAQパケット受信のwhileループにsetMta、downloadのメソッドを挟み込む感じでOKなのかな?
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
恐らくそれで行けるはずだ。
PyXCPも以前我々がやったのと同じように
CMD-RESとDAQパケットを仕分けるロジックが入っているようだから、
CAN回線上にRES、ERR、DAQが混在しても問題が出ないはずだ。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
XCP Basicの時もDAQパケットとレスポンスパケットの混在対策の話は出たねー。
あれと同じことやってるのか。
たしかここら辺。
実際のコード
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
じゃ、今回の実験コードは太郎くんに書いてもらおう。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」20アップ.png)
まじか。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/「技術者a」20アップ.png)
うーん、前回のwhileループのコードをもってきて・・・。
そして間にsetMtaとdownloadを挟み込んで・・・。
タイミングは0.05秒毎にそれぞれを発行して・・・。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
こんな感じか。
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)
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/まるフクロウ.png)
うん。
いいんじゃない?
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者02アップ.png)
setMta、downloadのタイミングはdownload_timeで計ってるんだけど、
初回はstartStopSynchの通信でで少しdelayが入ることを想定して少し早め(30[ms])に細工した感じ。
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/お休みフクロウ.png)
そうだね。
PythonでCAN受信する場合、若干のDelayが入るから、
そういった微調整は重要な要素だろう。
![太郎くん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/技術者01アップ.png)
次回、実際に動作確認ってところかな。
まとめ
![フクさん](https://www.simulationroom999.com/blog/wp-content/uploads/2020/05/指差しフクロウ.png)
まとめだよ。
- PyXCPでDAQパケットを受信しながらSET_MTA、DOWNLOADのコマンド送信を行う実験。
- XCP Basic側は問題なくできることは分かってるのでPyXCP側メインの実験。
- 一応PyXCP内コード的には大丈夫そう。
- 実験コードはDAPパケット受信ループ内で0.05秒周期でSET_MTA、DOWNLOAD発行。
バックナンバーはこちら。
コメント