バックナンバーはこちら。
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は自動的に一個後ろになる。
バックナンバーはこちら。
コメント