バックナンバーはこちら。
https://www.simulationroom999.com/blog/model-based-of-minimum-2-backnumber/
はじめに
前回、AUTOSAR-XCP側こと仮想ECUもちょっとだけ修正が必要なことが判明。
修正しなくても動作はするが、CANoe側が1ms駆動になっているので仮想ECU側も1ms駆動に変更したい。
というのがおおよその動機。
今回は修正コードを確認してみる。
登場人物
博識フクロウのフクさん
イラスト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
仮想ECU側の修正コード
一応、前回の話を元に修正してきたけど・・・。
元々のecu.cの一部
void ecu_t1ms_job()
{
}
extern uint8_t g_XcpDebugMemory[1024];
sint32 *g_pwTarget = (sint32*)&g_XcpDebugMemory[0x200]; // LSB:1/65535.0[rad/s]
sint32 *g_pwInput = (sint32*)&g_XcpDebugMemory[0x204]; // LSB:1/65535.0[rad/s]
sint32 *g_pwOutput = (sint32*)&g_XcpDebugMemory[0x208];
#define NORMALIZE 100.0
#define LSB (1/65535.0)
#define T1 0.25
#define dT 0.01
void ecu_t10ms_job()
{
float64 target = (*g_pwTarget) * LSB / NORMALIZE;
float64 Input = (*g_pwInput) * LSB / NORMALIZE;
float64 Output;
float64 Output_zi = (*g_pwOutput) * LSB / NORMALIZE;
/*
* 計算の実行
* @param Auto, 自動制御モード, 1 = 有効, 0 = 無効
* @param TargetSpeed, 目標角速度[100/256 rad/s]
* @param InputSpeed, 実角速度[100/256 rad/s]
* @param extOutput, 外部制御値(Auto=0 時に採用される値)
* @param pOutput, [out]出力値
* @param T1Value, 積分単位時間
* @param TcValue, PID制御の実行周期時間(単位:ミリ秒)
* @return 処理結果, 1 = 正常終了, -1 = エラー終了
*/
PidControl_exec(
1,
target,
Input,
0,
&Output,
(float64)T1,
(float64)dT
);
*g_pwOutput = (sint32)(Output * NORMALIZE / LSB);
}
変更後のecu.cの一部
extern uint8_t g_XcpDebugMemory[1024];
sint32 *g_pwTarget = (sint32*)&g_XcpDebugMemory[0x200]; // LSB:1/65535.0[rad/s]
sint32 *g_pwInput = (sint32*)&g_XcpDebugMemory[0x204]; // LSB:1/65535.0[rad/s]
sint32 *g_pwOutput = (sint32*)&g_XcpDebugMemory[0x208];
#define NORMALIZE 100.0
#define LSB (1/65535.0)
#define T1 0.25
#define dT 0.001
void ecu_t1ms_job()
{
float64 target = (*g_pwTarget) * LSB / NORMALIZE;
float64 Input = (*g_pwInput) * LSB / NORMALIZE;
float64 Output;
float64 Output_zi = (*g_pwOutput) * LSB / NORMALIZE;
/*
* 計算の実行
* @param Auto, 自動制御モード, 1 = 有効, 0 = 無効
* @param TargetSpeed, 目標角速度[100/256 rad/s]
* @param InputSpeed, 実角速度[100/256 rad/s]
* @param extOutput, 外部制御値(Auto=0 時に採用される値)
* @param pOutput, [out]出力値
* @param T1Value, 積分単位時間
* @param TcValue, PID制御の実行周期時間(単位:ミリ秒)
* @return 処理結果, 1 = 正常終了, -1 = エラー終了
*/
PidControl_exec(
1,
target,
Input,
0,
&Output,
(float64)T1,
(float64)dT
);
*g_pwOutput = (sint32)(Output * NORMALIZE / LSB);
}
void ecu_t10ms_job()
{
}
仮想ECU側の修正コード考察
ふむ。
OKだとは思うけど、一応何をしたのか説明よろしく。
まずはPID制御器の処理周期だけど、
元々はecu_t10ms_job()って関数内で動いてたんだよね。
1ms周期で処理させるにはecu_t1ms_job()って関数に移動させる必要があるんで、
切り取って張り付けただけ。
で、このままだとPID制御器の内部演算の積分、微分相当のところで使用してるΔtが実際の時間と乖離しちゃうんで、
#define dT 0.01
を
#define dT 0.001
にすることで対処した。
って感じ。
うん。
バッチリOKだ!
よっしゃ!
これで今度こそ、やることは全部やった感じかな?
そうだね。
あとは実際に動作確認をするのみだ。
まとめ
まとめだよ。
- AUTOSAR-XCPこと仮想ECU側の修正コード開示。
- PID制御器の処理周期修正。
- ecu_t10ms_job()関数からecu_t1ms_job()関数へ移動。
- PID制御器か内の微分、積分の演算で使用しているΔtを修正。
- #define dTを0.001に変更。
バックナンバーはこちら。
コメント