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

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

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

はじめに

前回、CAN回線ログを元にDAQパケットの送信周期が
本来であれば10[ms]であるべきところ、
実際は15[ms]周期となっていた。

一応原因のあたりは付いているので、
そこを確認していく。

登場人物

博識フクロウのフクさん

指差しフクロウ

イラスト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パケット送信周期の精度が悪い理由

太郎くん
太郎くん

で、送信周期が狙い通り10[ms]にならないのって何が原因になるの?

フクさん
フクさん

一言で言うと
XCP BasicのPCシミュレーション用コードのイベントチャンネルの時間精度がそもそもあまり高くない
ってことになるね。

太郎くん
太郎くん

え!
それって結構根深い話なんじゃ・・・。

フクさん
フクさん

まぁ完全に根幹の部分になるね。

該当コード

フクさん
フクさん

これは該当部分のコードを見ながら話した方が良いだろう。
ちなみにxcpsim.cのthreadって関数になる。

// Task Sheduler
static DWORD WINAPI thread(PVOID par) {

	WORD i = 0;
	WORD j = 0;

	threadRunning = 1;
	while (threadRunning) {

		Sleep(10);

		if (mainRunning) {

			/* 10ms Task ECU Simulation */
			ecuCyclic();

			/* Event Channel 1 is cyclic 1 ms */
#ifdef XCP_ENABLE_DAQ
			for (j = 0; j < 10; ++j) {
				gTimer += 1;
				XcpEvent(3);

			}
#endif

			/* Event Channel 1 is cyclic 10 ms */
#ifdef XCP_ENABLE_DAQ
#ifdef XCP_DPRAM_SERVER
			dpramServerTriggerTask(1);
#else
			XcpEvent(1);
#endif
#endif

			if (i++ % 10 == 0) {

				/* Event Channel 2 is cyclic 100 ms */
#ifdef XCP_ENABLE_DAQ
				XcpEvent(2);
#endif

				/* Flush every 100ms */
				ApplXcpSendFlush();

			}
			/* XCP driver background processing */
#ifdef XCP_ENABLE_CHECKSUM
			XcpBackground();
#endif  

		}
	}

	return 0;
}

該当コードの問題個所と状況

フクさん
フクさん

問題の箇所は10行目
Sleep(10);
だな。

太郎くん
太郎くん

Sleep(10);
だから10[ms]待つってことだから別に間違っては無さそうな?

太郎くん
太郎くん

まぁイベントチャンネル3が1ms周期だから
これが実現できないってのはあるだろうけど、
今回はイベントチャンネル1の10[ms]周期だから問題にはならなそうに見えるかな。

フクさん
フクさん

Sleep(10);
は、「最低10[ms]は待つ」ってだけで厳密に10[ms]で戻ってくる保証はないんだよね。
PC依存な面もあるかもしれないが、Windowsの場合、大体15[ms]になることは多いな。

太郎くん
太郎くん

「大体15[ms]」
あれ?15[ms]っていうと・・・もしや・・・。

フクさん
フクさん

そう。
このSleep(10)が15[ms]だからイベントチャンネル1が15[ms]になって、
結果としてDAQパケット送信間隔が15[ms]になる。

太郎くん
太郎くん

ダメじゃん!

フクさん
フクさん

まぁ一応対策も考えてるから、次回説明だな。

まとめ

フクさん
フクさん

まとめだよ。

  • DAQパケット送信周期の精度が悪い理由を確認。
    • イベントチャンネルが15[ms]になってる。
      • Sleep(10)で10[ms]周期を作ろうとしているが、実際は15[ms]になってる。
        • この部分はPC依存な面はある。
  • 上記により小手先の回収ではどうにもならなそう。
  • 一応対策も考えてるので次回確認予定。

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

コメント

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