【CanTp】車両診断通信 その38【シミュレーション㉕】

【CanTp】車両診断通信 その38【シミュレーション㉕】 車両診断通信

バックナンバーはこちら。
https://www.simulationroom999.com/blog/diagnostic-communication-backnumber/

はじめに

ISO-TPのシミュレーションをしよう。のシリーズ。
AUTOSAR-CanTpを実際に動作させてみるためのリクエストメッセージ構築。

IS14229-1に準じたリクエストとレスポンスになるが、
詳細はそのうち説明予定。

登場人物

博識フクロウのフクさん

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

リクエスト用Python can-isotpのコード

フクさん
フクさん

まずはリクエスト用だけど、これは以前作ったものを連続リクエストできるように修正したものになる。

太郎くん
太郎くん

資産流用だね。

import isotp
import logging
import time
import threading

from can.interfaces.vector import VectorBus

class ThreadedApp:
   def __init__(self):
      isotp_params = {
         'stmin' : 0, 
         'blocksize' : 0,
         'wftmax' : 0,
         'll_data_length' : 8,
         'tx_padding' : 0xCC,
         'rx_flowcontrol_timeout' : 1000,
         'rx_consecutive_frame_timeout' : 1000,
         'squash_stmin_requirement' : False,
         'can_fd' : False,
         'tx_data_min_length' : 8
      }
      self.exit_requested = False
      self.bus = VectorBus(channel='0', bitrate=500000)
      addr = isotp.Address(isotp.AddressingMode.NormalFixed_29bits, source_address=0xF1, target_address=0x10) 
      self.stack = isotp.CanStack(self.bus, address=addr, params=isotp_params, error_handler=self.my_error_handler)

   def start(self):
      self.exit_requested = False
      self.thread = threading.Thread(target = self.thread_task)
      self.thread.start()

   def stop(self):
      self.exit_requested = True
      if self.thread.isAlive():
         self.thread.join()
   
   def send(self, msg):
      self.stack.send(msg)
   
   def my_error_handler(self, error):
      logging.warning('IsoTp error happened : %s - %s' % (error.__class__.__name__, str(error)))

   def thread_task(self):
      while self.exit_requested == False:
         self.stack.process()
         time.sleep(0.001)
         
   def shutdown(self):
      self.stop()
      self.bus.shutdown()

def sendrecv( app, msg ):
   print("Send msg : %s" % (msg.hex()))
   app.send(msg)
   t1 = time.time()
   while time.time() - t1 < 5:
      if app.stack.available():
         payload = app.stack.recv()
         print("Recv msg : %s" % (payload.hex()))
         break
      time.sleep(0.2)


if __name__ == '__main__':
   app = ThreadedApp()
   app.start()
   
   # リクエストメッセージ byte配列リスト
   datas=[
      bytes([0x22, 0x01, 0x0a]),
      bytes([0x22, 0x01, 0x0a, 0x01, 0x0a, 0x01, 0x0a]),
      bytes([0x22, 0x01, 0x0a, 0x01, 0x0a, 0x01, 0x0a, 0x01, 0x0a, 0x01, 0x0a, 0x01, 0x0a, 0x01, 0x0a, 0x01, 0x0a]),
   ]
   
   # リクエストメッセージ連続送信
   for i in range(len(datas)):
      sendrecv(app, datas[i])

   print("Exiting")
   app.shutdown()
フクさん
フクさん

ポイントはリクエストメッセージをbyte配列のリストにしてるってところだね。

太郎くん
太郎くん

ってことは、
このリストを修正するだけでリクエストメッセージを変更出来たり、増減できたりするわけだ。

リクエストメッセージの意味は?

太郎くん
太郎くん

ところで、リクエストメッセージがいままでの適当な数列って感じじゃなくて、
なんか意味あり気な感じになってるけど?

フクさん
フクさん

まぁ一応ISO14229-1に則った形にはなってるね。
まだISO14229-1については語ってないので今今は気にしなくても良いけど、
Servcei$22の仕様に準じたリクエストメッセージになってる。

太郎くん
太郎くん

うーん、気にしないと言われたので気にしない。

フクさん
フクさん

(・・・ま、いっか。)

想定するレスポンス

太郎くん
太郎くん

で、このリクエストをした際の想定するレスポンスはどんな感じになってるの?

フクさん
フクさん

一応ISO14229-1の準ずる形として
0x62,0x01,0x0a,0x00…
みたいになる。

フクさん
フクさん

リクエスト側の0x01,0x0aを1セットとして、レスポンス側は0x01,0x0a,0x00を1セットとしてレスポンスする形になるような感じで実装してある。

太郎くん
太郎くん

あ、もう実装してあるんだ。

フクさん
フクさん

(うーん、このAUTOSAR-CanTp側の実装はいろんな意味で公開できんな。
理由1:無理やり繋いでるからコードがめっちゃ汚い
理由2:TOPPERS協会以外でA-COMSTACKのコードを開示するのはコンプライアンス的にちょっと微妙かもしれん。
理由3:若干機密にかすってる。)

フクさん
フクさん

とりあえず、次回は実際に動かしてログを取ってみよう。

まとめ

フクさん
フクさん

まとめだよ。

  • Python can-isotpのリクエスト用スクリプトを修正。
    • 一応ISO14229-1に準拠したリクエストにしている。
  • AUTOSAR-CanTp側も実装。
    • こちらもSO14229-1に準拠したレスポンスにしている。
    • 一身上の都合でコードは未公開。

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

コメント

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