第6章 関数とプログラミング 137
6.4 プログラミング手順
6.4.1 バスインタフェース関数を使用する場合
バスインタフェース関数を使用してプログラミングを行う場合の手順を示します。
(1)
プログラミング概略
バスインタフェース関数を使用してユーザプログラムを作成する際の概略を下記に示しま す。
(2)
バスインタフェース関数使用時の注意事項
a)プログラミング時の注意事項
(1)
バスインタフェース関数を使用する場合、バスインタフェース関数へ渡す引数には、
グローバル変数およびスタティック変数を使用しないでください。
(3) WDT(ウォッチドッグタイマ)の使用方法 WDT(ウォッチドッグタイマ)
WDTは、WinCPUユニットのハードウェアやプログラムの異常を検出するための、WinCPU
ユニット内部のタイマです。
WinCPUユニットの
WDTには、システム
WDTとユーザ
WDTの
2種類があります。
a)
システムWDT
システムWDTはWinCPUユニットのシステムにて監視するタイマで、ハードウェアやシ ステムソフトウェアの異常の検出に使用します。システム
WDT時間の設定は
WinCPU設 定ユーティリティのシステム設定画面で行います。システムWDTのリセットはバスイン タフェースドライバが自動的に実施します。
システムWDTがタイムアップすると、次のようになります。
(1) WinCPUユニットの出力をすべてOFFにします。
(2) WinCPUユニット前面のRDY LED、B.RUN LEDが消灯して、ERR.LEDが点滅します。
(3) WinCPU設定ユーティリティのユニット情報画面でエラー情報のシステムWDTエラ
ーが
(白)→ (赤)となります。b)
ユーザWDT
ユーザWDTはユーザプログラムで監視するタイマでユーザプログラムの異常の検出に 使用します。
ユーザWDT時間の設定およびリセットはユーザプログラムでバスインタフェース関数 を使用して実行します。
ユーザWDTがタイムアップすると、次のようになります。
(1) WinCPUユニットの出力をすべてOFFにします。
(2) WinCPUユニットの前面のB.RUN LEDが消灯して、ERR.LEDが点滅します。
(3) WinCPU設定ユーティリティのユニット情報画面でエラー情報のユーザWDTエラー
が
(白)→ (赤)となります。[使用方法]
ユーザWDTの使用方法例を示します。
1)
ユーザWDTと通信制御が1つのアプリケーションで構成されている場合
[注意]
・ユーザWDTの設定時間は、処理時間(a)の最大値以上の値を設定してください。
・処理時間(a)は、他のアプリケーション動作状況などの影響を受けるため、システムの テスト稼動時にすべてのアプリケーションを実行した状態で測定してください。
(時間を測定するサンプルプログラム(2)の“[サンプルプログラム]”を参照)
・処理時間(a)は、OSのスケジューリングなどの影響を受けますので、延びや遅れが発生 する可能性あります。延びや遅れを少なくするためには、ユーザプログラムのプライ オリティを高くしてください。
(プライオリティを高くするサンプルプログラム(2)の“[サンプルプログラム]”を参照)
2)
ユーザWDTと通信制御が複数のアプリケーションで構成されている場合
[注意]
・ユーザWDTの設定時間は(a)の処理時間の最大値以上の値を設定してください。
・(a)の処理時間は他のアプリケーションの動作状況などの影響を受けますので、システム
のテスト稼動時にすべてのアプリケーションを実行した状態で測定してください。
(時間を測定するサンプルプログラム(“[サンプルプログラム]”)を参照)
・(a)の処理時間はOSのスケジューリングなどの影響を受けますので、延びや遅れが発生す る可能性あります。延びや遅れを少なくするためには、ユーザプログラムのプライオリテ ィを高くしてください。
(プライオリティを高くするサンプルプログラム(“[サンプルプログラム]”)を参照)
[
サンプルプログラム
]時間を測定するサンプルプログラム
dispt1=timeGetTime(); //システム時間を取得します 通信制御処理等
dispt2=timeGetTime(); //システム時間を取得します
dispt=dispt2−dispt1; //前回取得のシステム時間との差を計算します
プライオリティを高くするサンプルプログラム VOID PriorityChange()
{
UNIT ret ; HANDLE ph;
ph=OpenProcess((PROCESS_SET_INFORMATION), FALSE,GetCurrentProcessld());
//自アプリケーションのハンドルを取得します ret=SetPriorityClass(ph,HIGH_PRIORITY_CLASS);
//自アプリケーションのプライオリティを取得します }