【XCP】最小構成のMBD事例 第2章 その165【XCP Basic⑲】

【XCP】最小構成のMBD事例 第2章 その165【XCP Basic⑲】 事例
【XCP】最小構成のMBD事例 第2章 その165【XCP Basic⑲】

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

はじめに

XCP BasicのメモリアクセスでDAQの実験が残っていた。
DAQを動作させるにはそれなりの手順が有り、以下のコマンドを投げる必要がある。

  • FREE_DAQ
  • ALLOC_DAQ
  • ALLOC_ODT
  • ALLOC_ODT_ENTRY
  • SET_DAQ_PTR
  • WRITE_DAQ
  • SET_DAQ_LIST_MODE
  • START_STOP
  • START_STOP_SYNCH

とりあえず順番に一個ずつ投げていくことに。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラスト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

XCPパケット送受信を関数化

太郎くん
太郎くん

じゃー、まずは順番にやっていくってことで、
FREE_DAQから投げていくかー。

フクさん
フクさん

ちょい待ち!

太郎くん
太郎くん

な、なに?

フクさん
フクさん

前回までのXCPパケットの投げ方だと手順が冗長になるから、
ここらで一旦関数化してしまおう。

太郎くん
太郎くん

確かにだいたい投げ方は一緒だもんね。

フクさん
フクさん

加えて、DAQが動作し始めるとこちらのコマンドに対してのレスポンス以外に
DAQパケットが混じってくるから、そこもちゃんとレスポンスパケットと認識する形で受信するようにしておこう。

太郎くん
太郎くん

具体的にはどんな感じにするの?

フクさん
フクさん

一応、私の方でざっと組んでみた。

resid = 2
def xcp_sendrecv(data):
    send_msg = can.Message(arbitration_id=1, extended_id=0, data=data)
    print('Send msg : %s' % send_msg)
    bus.send( send_msg )
    start = time.time()
    while True:
        recv_msg = bus.recv(timeout=1)
        if recv_msg != None:
            if resid == recv_msg.arbitration_id:
                if (0xFC <= recv_msg.data[0] ) & ( recv_msg.data[0] <= 0xFF):
                    break
        if time.time() > start + 1:
            break
    print('Recv msg : %s' % recv_msg)
    return recv_msg

xcp_sendrecv([0xFF, 0x00, ]);
Send msg : Timestamp:        0.000000   ID: 0001 S DLC: 2 ff 00
Recv msg : Timestamp: 1635382190.793615 ID: 0002 S DLC: 8 ff 04 80 08 08 00 01 01 Channel: 1

XCP Basicのコンソール画面

-> CONNECT mode=0
太郎くん
太郎くん

ほう。
xcp_sendrecvって名前の関数なのね。

xcp_sendrecv関数解説

太郎くん
太郎くん

CAN送信はいままでと一緒だね。

太郎くん
太郎くん

CAN受信側がwhile文とif文が一杯増えてる感じだけど、
これは何をしてるの?

フクさん
フクさん

まず、応答が無かった時のためにタイムアウト機能を入れてる。
if time.time() > start + 1:
で判定してて、とりあえず1秒以上応答が無かったらタイムアウトだ。

フクさん
フクさん

そして受信パケットのCANDIDが2と先頭のPIDが0xFEか0xFFであれば、
コマンドに対しての何かしらのレスポンスと認識する。

太郎くん
太郎くん

レスポンスPIDは
0xFFが正常応答
0xFEがエラー応答だったね。

フクさん
フクさん

そうそう。
それ以外の場合はDAQパケットの可能性があるんで、
読み捨てる

太郎くん
太郎くん

なるほど。
コマンドを送ってレスポンス待ちのタイミングで
たまたまDAQパケットが飛び込んで来たら、それがレスポンスと誤認する可能性があるのか。
それを回避するための判定ってことか。

フクさん
フクさん

正解だ。

フクさん
フクさん

次回からは、この関数を使ってバンバンパケットを投げまくる。

まとめ

フクさん
フクさん

まとめだよ。

  • XCPパケット送受信処理を関数化してみた。
  • CAN送信は従来通り。
  • CAN受信でいろいろ判定を追加
    • タイムアウト追加。
      • 1秒タイムアウト。
    • CANID判定追加
    • PID判定追加。
      • 0xFE(エラー)か0xFF(正常)以外はレスポンスとして扱わない。
      • レスポンスのタイミングでDAQパケットが来ても無視できる。

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

コメント

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