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

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

バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/

はじめに

前回はPyXCPによるDAQ起動を実施。
(SET_DAQ_LIST_MODE、START_STOP_DAQ_LIST、START_STOP_SYNCHのコマンドを投げた。)
CAN回線上にDAQパケットが流れていたのでDAQ起動は成功した。

しかし、CAN回線モニタしてDAQパケットが分かっただけであり、
PyXCP経由で取得ものではない。
DAQパケットの取得は、いままでのコマンド形式の手法とは異なるようで、
そこらへんの話をしていく。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラスト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パケットの取得方法概要

太郎くん
太郎くん

DAQ起動はできたけど、PyXCP経由でのDAQパケット取得手段がわかってない状態だったねー。

フクさん
フクさん

そうだね。
取得方法は今までのやり方は雰囲気が変わるね。

太郎くん
太郎くん

仕組みが違うってこと?

フクさん
フクさん

うん。
コマンドは投げれば何かしらレスポンスが有る想定のメソッドだったが、
DAQパケットはXCPスレーブ側から能動的に送信されてくる。
よって、Python側で何もしていなくても受信できなければならない

太郎くん
太郎くん

まぁそうだよね。
Python側で別の処理しててもDAQパケットは送出され続けられるわけだし。

フクさん
フクさん

というわけで、PyXCPでは内部でdaqQueueというQueueにDAQパケットを貯め続ける仕組みが組み込まれている。
これにより、DAQパケットを常に受けつけられる状態を作ってる。

太郎くん
太郎くん

ほー。
ということはPython側で多少読み出しができない期間があっても、
そのdaqQueueが貯めておいてくれるから、取りこぼししないってことか。

フクさん
フクさん

そうだね。
まぁdaqQueueが無くてもCANインターフェース等がバッファリングしてたりするんで、
PyXCPでバッファリングしなくても辻褄合うことは多いだろうが、
それでも早々にPyXCP側で貯め込んでおいた方が良いのだろうね。

DAQパケット取得の具体的なコード

太郎くん
太郎くん

なんとなく仕組みっぽいのはわかってきたから、
そろそろ具体的なコードを希望。

フクさん
フクさん

こんな感じだな。
ちなみに0.2秒後に抜けてくるwhileループになってる。

import time

start = time.time()
while True:
    queue_len = len(xm.transport.daqQueue)
    for _ in range(queue_len):
        daq = xm.transport.daqQueue.popleft()
        print( '%.6f, %s' % ( daq[3],daq[0].hex() ) )
    if time.time() > start + 0.2:
        break

結果

1637554273.380365, 007b0d00000000
1637554273.390367, 00df0d00000000
1637554273.400484, 00430e00000000
1637554273.410388, 00a70e00000000
1637554273.420251, 000a0f00000000
1637554273.430279, 006e0f00000000
1637554273.441190, 00db0f00000000
1637554273.451152, 003f1000000000
1637554273.461138, 00a31000000000
1637554273.471091, 00061100000000
1637554273.481069, 006a1100000000
1637554273.491047, 00ce1100000000
1637554273.501016, 00311200000000
1637554273.510994, 00951200000000
1637554273.520964, 00f91200000000
1637554273.530966, 005d1300000000
1637554273.540911, 00c01300000000
1637554273.550922, 00241400000000
1637554273.560900, 00881400000000
1637554273.570861, 00ec1400000000
1637554273.580823, 004f1500000000
1637554273.590817, 00b31500000000
1637554273.600787, 00171600000000

結果解説

太郎くん
太郎くん

xm.transportにさっき言ってたdaqQueueが定義されてるのね。
そして、len(xm.transport.daqQueue)で現在の格納されてるDAQパケット数を特定して、
そのパケット数分をxm.transport.daqQueue.popleft()で一気に引き抜いてるわけか。

フクさん
フクさん

そうだね。
これはJSON記述のコンフィグレーションパラメータにある、
CAN_USE_DEFAULT_LISTENERをtrueに設定していると使える機能だ。

太郎くん
太郎くん

あの時のパラメータがここで効いてくるのか。

JSONのコンフィグレーションはここらへんでやったね。

まとめ

フクさん
フクさん

まとめだよ。

  • DAQパケットの取得方法の概要説明。
    • transport層に相当するクラスでdaqQueueが定義されている。
    • このdaqQueueに自動的にDAQパケットがキューイングされる仕組み。
  • 上記仕組みはJSONコンフィグレーションのCAN_USE_DEFAULT_LISTENER
    • trueでないと使えない点に注意。

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

コメント

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