Windows版 iTRONサービスコールの作成 (時間管理機能)
(その5)
周期起動ハンドラの状態を参照するサービスコールは以下のとおりです。
サービスコール名 | 説明 |
---|---|
ref_cyc | 周期起動ハンドラの状態を取得します。 |
Ver3.0と4.0では関数名は同じですが、引数の順番が逆になりますので注意してください。
Ver3.0で周期起動ハンドラの状態を取得するには以下のサービスコールを使用します。
ER ref_cyc( T_RCYC *pk_rcyc, HNO cycno )
引数 | 説明 |
---|---|
pk_rcyc | 周期起動ハンドラ状態を格納する構造体のポインタ。 |
cycno | 周期ハンドラ番号。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外の周期ハンドラ番号。 |
E_NOEXS | 指定した周期ハンドラ番号は登録されていない。 |
E_PAR | パラメータエラー。 |
周期起動ハンドラ状態を格納する構造体(T_RCYC)は以下のとおりです。
メンバ名 | 説明 |
---|---|
exinf | 拡張情報。 |
lfttim | 次の起動周期までの時間。 |
cycact |
周期ハンドラの活性状態。
|
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief 周期ハンドラの状態参照.
*
* @param [out] pk_rcyc 周期ハンドラ状態を格納する構造体のポインタ.
* @param [in] cycno 周期ハンドラ番号.
*
* @retval エラーコード.
*/
ER ref_cyc( T_RCYC *pk_rcyc, HNO cycno )
{
ER ercd;
WICYCSTAT sts;
//! 引数が不正な場合はエラーにする.
if( !pk_rcyc ){
return E_PAR;
}
wi_CommonLock();
//! 周期ハンドラの状態を取得する.
ercd = wi_RefarenceCycleHadler( cycno, &sts );
if( ercd == E_OK ){
pk_rcyc->exinf = sts.ExtInfo;
pk_rcyc->lfttim.utime = (short)(sts.LeftTime >> 32 & 0x0000FFFF);
pk_rcyc->lfttim.ltime = (long )(sts.LeftTime & 0xFFFFFFFF);
pk_rcyc->cycact = (sts.Active ? TCY_ON : TCY_OFF);
}
wi_CommonUnlock();
return ercd;
}
周期起動ハンドラ状態を格納する構造体のポインタがNULLの場合エラーにします。
周期起動ハンドラ状態を取得する関数を呼び出して現在の周期起動ハンドラの状態を取得し引数の構造体に格納します。
周期起動ハンドラの状態を取得する (Ver4.0)
Ver4.0で周期起動ハンドラの状態を取得するには以下のサービスコールを使用します。
ER ref_cyc( ID cycid, T_RCYC *pk_rcyc )
引数 | 説明 |
---|---|
cycid | 周期ハンドラID番号。 |
pk_rcyc | 周期起動ハンドラ状態を格納する構造体のポインタ。 |
戻り値 | 説明 |
---|---|
E_OK | 正常終了。 |
E_ID | 範囲外の周期ハンドラID番号。 |
E_NOEXS | 指定した周期ハンドラID番号は登録されていない。 |
E_PAR | パラメータエラー。 |
周期起動ハンドラ状態を格納する構造体(T_RCYC)は以下のとおりです。
メンバ名 | 説明 |
---|---|
cycstat |
周期ハンドラの動作状態。
|
lefttim | 次の起動周期までの時間。 |
・サービスコールのソースコードは以下のようになります。
/****************************************************************************/
/*!
* @brief 周期ハンドラの状態参照.
*
* @param [in] cycid 周期ハンドラID番号.
* @param [out] pk_rcyc 周期ハンドラ状態を格納する構造体のポインタ.
*
* @retval エラーコード.
*/
ER ref_cyc( ID cycid, T_RCYC *pk_rcyc )
{
ER ercd;
WICYCSTAT sts;
//! 引数が不正な場合はエラーにする.
if( !pk_rcyc ){
return E_PAR;
}
wi_CommonLock();
//! 周期ハンドラの状態を取得する.
ercd = wi_RefarenceCycleHadler( cycid, &sts );
if( ercd == E_OK ){
pk_rcyc->cycstat = sts.Active ? TCYC_STA : TCYC_STP;
pk_rcyc->lefttim.utime = (short)(sts.LeftTime >> 32 & 0x0000FFFF);
pk_rcyc->lefttim.ltime = (long )(sts.LeftTime & 0xFFFFFFFF);
}
wi_CommonUnlock();
return ercd;
}
周期起動ハンドラ状態を格納する構造体のポインタがNULLの場合エラーにします。
周期起動ハンドラ状態を取得する関数を呼び出して現在の周期起動ハンドラの状態を取得し引数の構造体に格納します。
周期起動ハンドラの状態取得関数
周期起動ハンドラの状態を取得する関数のソースコードは以下のとおりです。
/****************************************************************************/
/*!
* @brief 周期ハンドラの状態参照.
*
* @param [in] no 周期ハンドラ番号.
* @param [out] sts 周期ハンドラ状態を格納する構造体のポインタ.
*
* @retval エラーコード.
*/
ER wi_RefarenceCycleHadler( INT no, WICYCSTAT *sts )
{
ER ercd;
WICYCOBJ *p;
DWORDLONG now_time;
//! 周期ハンドラ番号のオブジェクトを取得する.
p = (WICYCOBJ *)wi_FindObject( no, TMAX_MAXCYC, ObjList, &ercd );
if( !p ){
return ercd;
}
//! 現在時刻を取得する.
now_time = wi_GetSystemTime();
//! 起動時刻までの時間を計算する.
if( (now_time - p->StartTime) >= p->CycleTime ){
sts->LeftTime = 0;
}else{
sts->LeftTime = p->CycleTime - (now_time - p->StartTime);
}
//! 周期ハンドラの状態を構造体にセットする.
sts->Active = p->Active;
sts->ExtInfo = p->ExtInfo;
return E_OK;
}
周期起動ハンドラの状態を取得する関数は以下のような処理を行います。
- 引数で指定された周期ハンドラのID番号に該当する周期ハンドラ・オブジェクトを取り出します。
- 現在時刻を取得して、次に周期起動ハンドラが起動されるまでの時間を計算して、引数の構造体にセットします。
- 周期起動ハンドラの状態を取り出して、引数の構造体にセットします。
- def_cyc()で周期起動ハンドラを登録するときに渡された拡張情報を引数の構造体にセットします。