【CANoe】最小構成のMBD事例 第2章 その270【仮想ECU連携⑦】

【CANoe】最小構成のMBD事例 第2章 その270【仮想ECU連携⑦】 事例
【CANoe】最小構成のMBD事例 第2章 その270【仮想ECU連携⑦】

バックナンバーはこちら。
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に変更。

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

コメント

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