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

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

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

はじめに

前回はALLOC_ODT_ENTRYコマンドを試した。
ODT_ENRYの箱を用意するものであり、当然これもECU内リソースを消費していく。

ALLOC_DAQ、ALLOC_ODT、ALLOC_ODT_ENTRYを実施することで
DAQ listの構造的な生成は出来ている状態まできた。

よって、DAQ listに対して具体的な値を更新していくコマンドに入っていく。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラスト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 listの構造的な準備

フクさん
フクさん

前回までのコマンドでDAQ listの構造的な準備は整った。

太郎くん
太郎くん

と言うことは後はDAQ listの内部情報を更新していく流れになるのか。

フクさん
フクさん

そうだね。
具体的にはODT_ENTRYへの情報書き込みになるな。

SET_DAQ_PTR

太郎くん
太郎くん

となると、次のコマンドは何になるのかな?

フクさん
フクさん

SET_DAQ_PTRコマンドだね。

太郎くん
太郎くん

名前的にはDAQへポインタ参照???

フクさん
フクさん

そのニュアンスでほぼOKだ。
まぁ実際に参照するのはODT_ENTRYになるんだけど。

太郎くん
太郎くん

具体的な電文はどうなるの?

フクさん
フクさん

一番最初のODT_ENTRYである
DAQ NUMBER=0
ODT NUMBER=0
ODE_ENTRY_NUMBER=0
の場合、
0xE2, 0x00, 0x00, 0x00, 0x00, 0x00
になるね。
3~4byte目にDAQ NUMBER。
5byte目にODT NUMBER。
6byte目にODE_ENTRY_NUMBER。

太郎くん
太郎くん

早速送ってみよう。

xcp_sendrecv([0xE2, 0x00, 0x00, 0x00, 0x00, 0x00, ]);
Send msg : Timestamp:        0.000000   ID: 0001 S DLC: 6 e2 00 00 00 00 00
Recv msg : Timestamp: 1635592684.882097 ID: 0002 S DLC: 1 ff Channel: 1

XCP Basicのコンソール画面

-> SET_DAQ_PTR daq=0,odt=0,idx=0
<- 0xFF
太郎くん
太郎くん

これは参照位置を設定しただけだらか
特に目立った変化はなさそうだね。

WRITE_DAQ

フクさん
フクさん

そして次はWRITE_DAQ。

太郎くん
太郎くん

これでODT_ENTRYを更新するんだね。

フクさん
フクさん

今回は
size=4、
address=0x00000004、
address extension=0xFF
を設定してみよう。

太郎くん
太郎くん

address extension=0xFFの意味は?

フクさん
フクさん

今回は特に意味ないな。
実際はaddress extensionを利用して32bit以上のメモリ空間や、
物理メモリアドレスとは異なる論理的なメモリ空間にアクセスする場合に使うね。

太郎くん
太郎くん

そういえば、今回はXCP Basicの中に用意した配列にアクセスするから、
そういういいでは論理的なメモリ空間と言えるのか。

フクさん
フクさん

電文はこれになる。
0xE1, 0xFF, 0x04, 0xFF, 0x04, 0x00, 0x00, 0x00
2byte目がBIT_OFFSET
3byte目がSize
4byte目がaddress extension
5~8byte目がaddress
になる。

太郎くん
太郎くん

BIT_OFFSETってなんだっけ?

フクさん
フクさん

ビット単位の読み出しや書き込みで使用されるパラメータだな。
0~7を設定できて、指定アドレスの指定した1bitに対してアクセスできる。
使用しない場合は0xFFを設定する仕様になってるんで、今回は0xFFにしてある。

太郎くん
太郎くん

なるほど。
ビット単位アクセスもできるんだね。
まぁ今回は4byteアクセスだからさっきの電文をそのまま投げてみよう。

xcp_sendrecv([0xE1, 0xFF, 0x04, 0xFF, 0x04, 0x00, 0x00, 0x00, ]);
Send msg : Timestamp:        0.000000   ID: 0001 S DLC: 8 e1 ff 04 ff 04 00 00 00
Recv msg : Timestamp: 1635852341.842311 ID: 0002 S DLC: 1 ff Channel: 1

XCP Basicのコンソール画面

-> WRITE_DAQ size=4,addr=00000004h,FFh
<- 0xFF
太郎くん
太郎くん

うん。
問題無く書けたみたいだ。

フクさん
フクさん

今回はODT_ENTRYを一個しか生成していないから無関係なんだけど、
複数生成していた場合は、WRITE_DAQをする自動的に次のODT_ENTRYに参照が移動する。
よって、SET_DAQ_PTRを投げ直さなくてもOKな仕様になってる。

太郎くん
太郎くん

SET_MTAの時もそうだったけど、
C言語のポインタ的な仕様がこういうところでも踏襲されてるんだねー。

まとめ

フクさん
フクさん

まとめだよ。

  • DAQ listの構造的な準備はできたので、実際にODT_ENTRYを更新していく。
  • 更新するODT_ENTRYを参照するにはSET_DAQ_PTRを使用する。
  • 実際にODT_ENTRYを更新するにはWRITE_DAQを使用する。
    • WRITE_DAQ実行後は参照するODT_ENTRYは自動的に一個後ろになる。

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

コメント

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