【XCP】最小構成のMBD事例 第2章 その191【PyXCP⑬】

【XCP】最小構成のMBD事例 第2章 その191【PyXCP⑬】事例
【XCP】最小構成のMBD事例 第2章 その191【PyXCP⑬】

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

バックナンバーはこちら。

コメント

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