VxWorksターゲットにおける変数管理の留意点について



複数のISaGRAF Ver.4/5タスクが動作している時に、あるタスクに属しているC言語の変数を別のタスクから参照してはいけません。
これは、次のときに問題が発生します。
    • 複数のタスクが同一のコードセクションを実行していて、かつOSが各タスクの変数のインスタンス化を管理していない場合

例えば、複数のISaGRAFのバーチャルマシンが実行中の場合や、システムレイヤのライブラリが複数のタスク(エクスチェンジディスパッチャ(IXD)、コンフィギュレーションマネージャ(CMG)等)から使用されている場合です。
このような場合、例えば、ISaGRAF Ver.4/5のバーチャルマシンどうしでは、同じ変数でも区別して使われるようにする必要があります。

共有すべきではない変数
以下の通りです。これらの変数はタスク毎に別途作成する必要があります。
    1. カーネル変数
    カーネル用変数はバーチャルマシン1つにつき1セット用意する必要があります。

    2.
    システムレイヤ変数
    システム関連の変数も、バーチャルマシン毎に1セット必要です。
    また、このレイヤを使用するタスク(コンフィギュレーションマネージャ、エクスチェンジディスパッチャ等)毎にも1セットの変数が必要です。

解決方法
VxWorksターゲットの場合、このようなタスク間での変数の区別を下記のような方法で実現します。
  • 各変数は1個の構造体の中のメンバとして宣言されています。カーネル用、システムレイヤ用それぞれがあります。
    各タスクの初期化時に、これらの構造体のメモリを動的にアロケートします。全てのカーネル変数の構造体を1個のポインタ(pISa_KERGLOBINST)で指すように設定されています。全てのシステムレイヤ変数」も1個のポインタ(pISa_COMMONGLOBINST)で指すように設定されています。

OSがこれら2つの変数を保存できるようになっていれば良いことになります。タスクが待ち状態になったら自動的にタスクのコンテキストの一部として保存され、タスクが再度アクティブになった時にリストアされる、というようにです。具体的には下の図を参照してください。

VxWorks以外のOSで、同様の問題が発生する場合は、タスクの変数をコンテキストの一部として保存する機能をOSがサポートしているかどうかを確認してください。

最終更新:
2009-03-19 11:57
改訂:
1.1
評価点数:0 (0 件の投票)
Chuck Norris has counted to infinity. Twice.

最も人気の FAQ RSS

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

最近の 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)