バックナンバーはこちら。
https://www.simulationroom999.com/blog/diagnostic-communication-backnumber/
はじめに
AUTOSAR-Dcmのシミュレーションの話。
ReadDataByIdentifierのシミュレーションのPythonコードについて。
登場人物
博識フクロウのフクさん
イラスト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
ReadDataByIdentifierのシミュレーション用のPythonコード
今回はReadDataByIdentifierサービス。
テスト用のPythonコードはこんなん。
import isotp
import logging
import time
import threading
from can.interfaces.vector import VectorBus
class ThreadedApp:
def __init__(self):
isotp_params = {
'stmin' : 0,
'blocksize' : 4,
'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)
self.bus = VectorBus(channel='0', bitrate=500000, fd=True)
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() # Non-blocking
#time.sleep(self.stack.sleep_time()) # Variable sleep time based on state machine state
time.sleep(0.001) # Variable sleep time based on state machine state
def shutdown(self):
self.stop()
self.bus.shutdown()
def sendrecv( app, msg ):
if msg[0] == 0x00:
tsleep = msg[1]*0x100 + msg[2]
tsleep = tsleep / 1000
print("sleep : %f [ms]" % tsleep)
time.sleep(tsleep)
else:
print("Send msg : %s" % (msg.hex()))
app.send(msg)
t1 = time.time()
while time.time() - t1 < 1:
if app.stack.available():
payload = app.stack.recv()
print("Recv msg : %s" % (payload.hex()))
break
time.sleep(0.001)
if __name__ == '__main__':
app = ThreadedApp()
app.start()
datas=[
bytes([0x22, 0x12, 0x34]),
bytes([0x22, 0x56, 0x78]),
bytes([0x22, 0x11, 0x11]),
bytes([0x22, 0x12, 0x34, 0x56, 0x78]),
bytes([0x22, 0x56, 0x78, 0x12, 0x34]),
bytes([0x22, 0x12, 0x34, 0x11, 0x11, 0x56, 0x78]),
bytes([0x22, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34]),
bytes([0x22, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34, 0x12, 0x34]),
]
#while True:
for i in range(len(datas)):
sendrecv(app, datas[i])
print("Exiting")
app.shutdown()
ReadDataByIdentifierのシミュレーション用のPythonコード解説
最初のほうはシングルDIDとかマルチDIDとか、マルチDIDの中に未サポートDIDを混ぜるとかのテストっぽいけど・・・。
なんかむっちゃ長いメッセージあるよ!?
あー、これはマルチDIDでリクエストした際に
「レスポンスメッセージ長が最大値である4095[byte]を超えたらどうなる?」
ってのを確認するためだねー。
DID=0x1234は一個あたり130byteになる。
メッセージの先頭byteはReadDataByIdentifier Response SIDで0x62固定。
残りの(4095-1)=4094[byte]でどれだけのDIDを応答できるかと言うと・・・。
\(\displaystyle\frac{4095[byte]-1[byte]}{130[byte/DID]}=31.49230769230769[DID]\)
つまり、31DIDまでは応答できるけど、
32DIDになるとメッセージ最大値を超える。
ここら辺の挙動の差を見てみる感じ。
それで、長いメッセージあるのかー。
まとめ
まとめだよ。
- ReadDataByIdentifierのシミュレーション用のPythonコード書いた。
- ReadDataByIdentifierのマルチDIDに関連したテストパターンメイン。
- マルチDID。
- 未サポートDIDを混ぜる。
- レスポンスメッセージ長が最大値を超えるようなDID指定。
バックナンバーはこちら。
コメント