外部アプリケーションからターゲットをスタート/ストップさせる方法


このページでは、ターゲットのリソース(バーチャルマシン、以下VM)のスタート/ストップを外部トリガーのイベントで行う方法の一例を示します。これはターゲットのフック関数をカスタマイズすることで実現します。ワークベンチ側の修正は不要です。
このサンプルはWindows NTの場合です。

仕様
VMのカレントディレクトリ(通常はターゲットのCMDSディレクトリ)に"STOP"という名前のファイルが生成されると、ターゲットはストップします。
また、"START"という名前のファイルが生成されると、ターゲットはスタートします。
アルゴリズム
ターゲットをストップさせる簡単な方法は、エラーモードに移行させることです(アプリケーションで0除算が発生した場合などにもこのモードになります)。このモードになってもI/Oドライバはコールされますが、アプリケーションは実行されません。そのため、この例ではこのモードでI/Oドライバの使用も禁止する方法についても説明します。

まず、下記の関数は"stop" ファイルを検出するためのもので、ターゲットのフック関数で使用します。コードは "SmpHooks.c" に追加します。
なお、フックを実装する方法については「ターゲットにフック関数を実装する方法」をご覧ください。
/**************************************************************************
File: SmpHooks.c
Author: GGR - CJ International
Creation date: 27-Jun-2001 --- 4.10 Released ---
***************************************************************************
ドキュメント:

***************************************************************************
説明: メッセージを表示するための関数

***************************************************************************
Modifications: (who / date / description)


***************************************************************************/
#include <dsys0def.h>
#include <dker0def.h>
#include <dker0uhk.h>
#include <sys/stat.h>

/* I/Oドライバを禁止するための関数 */
__declspec(dllimport) void FlagStopDriverSet(uchar FlagStopRequest);

/******************************************************************************
function : kerHookBegCycExec
description : 各サイクルの最初にコールされるフック関数
テキストファイル start/stopが存在するかどうかをチェックする

warning :
******************************************************************************/
void kerHookBegCycExec(void)
{
    struct _stat StatFile;

    if (_stat("START", &StatFile) == 0) /* STARTファイルが存在する */
    {
      printf("Start file exist\n");
      KBF_SINT(ISA_SYSVA_RESMODE) = ISA_RESMODE_RT; /* システム変数にリアルタイムモードで実行するよう書きこむ */
      remove("START");
    }
    if (_stat("STOP", &StatFile) == 0) /* STOPファイルが存在する */
    {
      printf("Stop file exist\n");
      KBF_SINT(ISA_SYSVA_RESMODE) = ISA_RESMODE_RS; /* システム変数に致命的なエラーが起きたことを書きこむ */
      remove("STOP");
    }
    if (KBF_SINT(ISA_SYSVA_RESMODE) == ISA_RESMODE_RS) /* エラーによりSTOPしている場合 */
    {
      FlagStopDriverSet(1); /* I/Oドライバの禁止フラグをセットする */
    }
    else
    {
      FlagStopDriverSet(0); /* I/Oドライバの禁止フラグをリセットする */
    }
}
/*****************************************************************************/

ここで、エラーモードの場合にI/O処理を禁止させたい場合は、各I/Oドライバに以下のコードを追加します。
まず、ISaVM プロジェクトに「追加ライブラリのパス」でドライバのライブラリのパス名と、ライブラリ名を追加します (この例では CjIOSmpl.lib とします)。
Visual C++でのプロジェクトの設定

追加するコードは次の通り。
/* このファンクションは毎サイクルの最初フック関数(ISA_KERHOOK_BEGCYCEXEC)からコールされます。 */

static uchar _cuSTOPFLAG;
__declspec(dllexport) void FlagStopDriverSet(uchar FlagStopRequest)
{
    _cuSTOPFLAG = (uchar)FlagStopRequest;
}

これで、ドライバ側のread/writeの各関数内で _cuSTOPFLAG の値をチェックできるようになります。
(_cuSTOPFLAG == 0) ならば、読み込みまたはI/O出力を更新するようにします。

注意事項
アプリケーションで0除算などの致命的なエラーが発生した場合は、この変更を施したI/Oドライバはコールされなくなりますので注意してください。
また、トリガーイベントの検出は、サイクルタイム毎の間隔となります。
最終更新:
2009-03-23 14:25
改訂:
1.0
評価点数:0 (0 件の投票)
Chuck Norris has counted to infinity. Twice.

最も人気の FAQ RSS

  1. LD言語で、ある接点がFALSEの場合、それ以降のファンクションブロックを実行しないように出来るか? (44520 回の閲覧)
  2. SFC要素の「ステップ」と「トランジション」の意味と役割を教えてください。 (43453 回の閲覧)
  3. ISaGRAF WorkbenchをWindows 7で使用するにはどうしたらよいでしょうか? (40945 回の閲覧)
  4. ISaGRAFはIEC1131-3のシステム定義に準拠しているか? (38996 回の閲覧)
  5. PLCプログラムをより早く動かすにはどうすればよいですか? (38833 回の閲覧)
  6. LD言語で、立ち上がり・立ち下がりの出力はあるか? (36894 回の閲覧)
  7. VxWorksターゲットにおける変数管理の留意点について (36391 回の閲覧)
  8. 日立製作所製SHマイコン用コンパイラ使用時の注意事項 (35599 回の閲覧)
  9. Cファンクション/ファンクションブロックの"Hidden" パラメータとはどのようなものか (35533 回の閲覧)
  10. FBD/LD言語で同じ行に複数の演算がある場合の実行順序は? (33530 回の閲覧)

最近の FAQ RSS

  1. ファンクションブロックはネストできますか。 (2016-08-05 15:07)
  2. Cファンクション/ファンクションブロックの"Hidden" パラメータとはどのようなものか (2015-01-30 14:24)
  3. 前のISaGRAFで作成したプロジェクトをインポートしたら、コメントが文字化けを起こしています。 (2014-05-07 06:52)
  4. 前のバージョンで作成したプロジェクトは読み込めますか。 (2014-03-07 07:46)
  5. ISaGRAFでコンフィグレーション、リソースそれにPOUはそれぞれいくつ作成できますか。 (2014-03-07 02:06)