バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/
はじめに
PyXCPでDAQパケットを受信しながらSET_MTA、DOWNLOADのコマンド送信を行う実験用のコードを起こした。
一応PyXCP内コード的には大丈夫そうではあるが、
本当に大丈夫かは試しておいた方が良さそう。
というわけで、今回は実際に動作確認してみる。
登場人物
博識フクロウのフクさん
イラスト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パケットを受信しながらSET_MTA、DOWNLOADのコマンド送信
じゃ、前回のコードを走らせるよー。
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)
結果
1637603013.423053, 00000000000000
1637603013.432965, 00630000000000
1637603013.443000, 00c70000000000
1637603013.452937, 002a0100000000
1637603013.462923, 008e0100000000
1637603013.472877, 00f20100000000
1637603013.482838, 00550200000000
1637603013.492832, 00b90200000000
download 11223344
1637603013.502785, 001d0300000000
1637603013.512772, 00810311223344
1637603013.522799, 00e50311223344
1637603013.532695, 00480411223344
1637603013.542681, 00ac0411223344
1637603013.552667, 00100511223344
download 55667788
1637603013.562620, 00730511223344
1637603013.572639, 00d70555667788
1637603013.582608, 003b0655667788
1637603013.592578, 009f0655667788
download 99aabbcc
1637603013.602572, 00030755667788
1637603013.612509, 00660755667788
1637603013.622512, 00ca0799aabbcc
1637603013.632432, 002d0899aabbcc
download 00000000
1637603013.642459, 00920899aabbcc
1637603013.652380, 00f50899aabbcc
1637603013.662292, 00580999aabbcc
1637603013.672376, 00bd0900000000
結果確認
うん。
一応動いてそうだ。
でも、donwloadを呼び出したタイミングでDAQパケットの値が変わっていないのが気になる・・・。
CAN回線的にどうなっているかを見たら?
こんな感じだね。
0.654443 1 2 Rx d 7 00 00 00 00 00 00 00
0.664355 1 2 Rx d 7 00 63 00 00 00 00 00
0.674390 1 2 Rx d 7 00 C7 00 00 00 00 00
0.684327 1 2 Rx d 7 00 2A 01 00 00 00 00
0.694313 1 2 Rx d 7 00 8E 01 00 00 00 00
0.704266 1 2 Rx d 7 00 F2 01 00 00 00 00
0.714228 1 2 Rx d 7 00 55 02 00 00 00 00
0.724222 1 2 Rx d 7 00 B9 02 00 00 00 00
0.734175 1 2 Rx d 7 00 1D 03 00 00 00 00
0.735330 1 1 Rx d 8 F6 00 00 FF 04 00 00 00
0.736444 1 2 Rx d 1 FF
0.739058 1 1 Rx d 6 F0 04 11 22 33 44
0.740155 1 2 Rx d 1 FF
0.744161 1 2 Rx d 7 00 81 03 11 22 33 44
0.754188 1 2 Rx d 7 00 E5 03 11 22 33 44
0.764084 1 2 Rx d 7 00 48 04 11 22 33 44
0.774070 1 2 Rx d 7 00 AC 04 11 22 33 44
0.784056 1 2 Rx d 7 00 10 05 11 22 33 44
0.785482 1 1 Rx d 8 F6 00 00 FF 04 00 00 00
0.787407 1 2 Rx d 1 FF
0.794010 1 2 Rx d 7 00 73 05 11 22 33 44
0.800440 1 1 Rx d 6 F0 04 55 66 77 88
0.802398 1 2 Rx d 1 FF
0.804029 1 2 Rx d 7 00 D7 05 55 66 77 88
0.813998 1 2 Rx d 7 00 3B 06 55 66 77 88
0.823968 1 2 Rx d 7 00 9F 06 55 66 77 88
0.833962 1 2 Rx d 7 00 03 07 55 66 77 88
0.836559 1 1 Rx d 8 F6 00 00 FF 04 00 00 00
0.840524 1 2 Rx d 1 FF
0.843899 1 2 Rx d 7 00 66 07 55 66 77 88
0.847602 1 1 Rx d 6 F0 04 99 AA BB CC
0.849428 1 2 Rx d 1 FF
0.853901 1 2 Rx d 7 00 CA 07 99 AA BB CC
0.863822 1 2 Rx d 7 00 2D 08 99 AA BB CC
0.873849 1 2 Rx d 7 00 92 08 99 AA BB CC
0.883769 1 2 Rx d 7 00 F5 08 99 AA BB CC
0.884908 1 1 Rx d 8 F6 00 00 FF 04 00 00 00
0.886178 1 2 Rx d 1 FF
0.893682 1 2 Rx d 7 00 58 09 99 AA BB CC
0.894312 1 1 Rx d 6 F0 04 00 00 00 00
0.897098 1 2 Rx d 1 FF
0.903766 1 2 Rx d 7 00 BD 09 00 00 00 00
0.913711 1 2 Rx d 7 00 20 0A 00 00 00 00
0.923730 1 2 Rx d 7 00 84 0A 00 00 00 00
0.933642 1 2 Rx d 7 00 E8 0A 00 00 00 00
0.943653 1 2 Rx d 7 00 4C 0B 00 00 00 00
CAN回線上はDOWNLOADコマンド発行後にDAQパケットの値が変わってるからXCP Basic側は正常。
つまり、daqQueueにデータを貯めているListener側のスレッドとメインスレッドの切り替わりで20~30[ms]程度のオーバーヘッドがあるってことになるな。
加えて、SET_MTA、DOWNLOADの2コマンドを投げているのも遅れの原因となっているのだろう。
まじか。
これは・・・問題無い?
元々の目的がHILSもどきなんで、リアルタイム性に於いて、ちょっと問題ありではあるが、
Pythonで回している以上、リアルタイム性はある程度犠牲にはなるんだよね。
よって、一旦問題無いとするのも考え方としてはありだね。
まぁこれはこれで重要な結果だし、
これを元に次の手を考えるネタにはなる。
(つまり失敗寄りの結果ってことなんだな)
まとめ
まとめだよ。
- DAQパケットを受信しながらSET_MTA、DOWNLOADのコマンド送信してみた。
- 一応動いた。
- が、DAQパケットの吸い上げのリアルタイム性が若干悪い。
- 20~30[ms]程度の遅れがある。
- Pythonでやる以上、やむを得ない問題ではあるが、もう少し手が無いか考える必要はありそう。
バックナンバーはこちら。
コメント