バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/
はじめに
前回で仮想ECU側のXCP関連のCAN-FD向けの調整が完了。
XCPとしてはMAX_CTOとMAX_DTOを8から64に変更すればOK。
仮想ECU側はこれ以外にPID制御の入出力の変数を調整する必要がある。
登場人物
博識フクロウのフクさん
イラスト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
PID制御の入出力の定義
そういえば、PID制御の入出力ってどう定義してたんだっけ?
こんな感じで定義してたね。
extern uint8_t g_XcpDebugMemory[1024];
sint16 *g_pwTarget = (sint16*)&g_XcpDebugMemory[0x100]; // LSB:1/256[rad/s]
sint16 *g_pwInput = (sint16*)&g_XcpDebugMemory[0x102]; // LSB:1/256[rad/s]
sint16 *g_pwOutput = (sint16*)&g_XcpDebugMemory[0x104];
なるほど。
特定のアドレスを符号付き16bit変数って体で定義したのか。
ってことはこれを符号付き32bit長にすればOKってことか。
あとはアドレス16bit境界になってるから32bit境界にする必要もあるね。
あ、そうか。
じゃないと、各変数が16bit分被るから、お互いがお互いの16bit分を書き換えるって事象がおきちゃう!
PID制御の入出力の修正
というわけで以下に修正だ。
extern uint8_t g_XcpDebugMemory[1024];
sint32 *g_pwTarget = (sint32*)&g_XcpDebugMemory[0x100]; // LSB:1/65535.0[rad/s]
sint32 *g_pwInput = (sint32*)&g_XcpDebugMemory[0x104]; // LSB:1/65535.0[rad/s]
sint32 *g_pwOutput = (sint32*)&g_XcpDebugMemory[0x108];
この変数というかポインタを使う側は修正しなくてもOK?
このポインタ変数を利用してる側は、そのままfloat64として扱ってるから
今回の構成としては修正は不要かな。
float64 target = (*g_pwTarget) * LSB / NORMALIZE;
float64 Input = (*g_pwInput) * LSB / NORMALIZE;
float64 Output;
float64 Output_zi = (*g_pwOutput) * LSB / NORMALIZE;
なるほど。
ポインタの参照先が16bitか32bitかはあまり気にしなくてもOKなのね。
というわけで仮想ECU側の修正はこんなもんだろう。
次は指令器の辻褄合わせか。
まとめ
まとめだよ。
- 仮想ECU側のPID制御の入出力定義はポインタで実施。
- 元々が符号付き16bit変数へのポインタだったのでこれを符号付き32bit長変数に差し替え。
- 上記に伴い、参照先のアドレス境界を16bitから32bitに切替。
- PID制御器の入力はfloat64で、参照変数が16bitか32bitかは気にしなくてもOKなコード。
バックナンバーはこちら。
コメント