(57)【特許請求の範囲】
【請求項１】
ホストに従って機器を監視制御する監視制御装置であって、
前記ホストに装着されるプラグインに含まれた複数のアクションのうち実行対象のアクションを識別するプラグイン管理部と、
前記プラグインに含まれる前記複数のアクションに対応した複数のアクションパラメータを格納した複数の配列を生成して、前記ホスト及び前記プラグインにより共有されるプロセス空間に前記生成された複数の配列を配置し、前記生成された複数の配列のうち前記プラグイン管理部により指定されたアクションに対応する配列にアクセスして前記指定されたアクションに対応するアクションパラメータを操作するアクションパラメータ管理部と、
を備えたことを特徴とする監視制御装置。
【請求項２】
メモリと、
計測値を前記機器から取得し前記メモリに格納し、前記メモリに保持された演算値を前記機器に出力し、また、前記メモリに保持された計測値及び演算値を外部システムと通信する通信部と、
前記ホストに従った演算を行って演算結果を演算値として前記メモリに格納するとともに、前記プラグインを指定するジョブファイルを取得し、前記メモリの値を参照し前記プラグインを使ってジョブに応じた演算を実行して演算結果を演算値として前記メモリに格納する演算部と、
をさらに備えた
ことを特徴とする請求項１に記載の監視制御装置。
【請求項３】
前記プラグイン管理部は、前記プラグインのプログラムに宣言された、前記実行対象のアクションを指定する識別子を呼び出すことで前記プラグインに格納されたアクションの実行を制御し、前記ホストの機能を拡張し、
前記アクションパラメータ管理部は、前記生成された複数の配列のうち前記識別子で指定された配列にアクセスし、前記アクセスされた配列に対して要素インデックスを指定することで前記アクションパラメータに含まれる値を読みだしたり書き込んだりする
ことを特徴とする請求項１に監視制御装置。
【請求項４】
前記アクションが、外部システムと連携するロジックであり、前記メモリの値及び前記外部システム上にあるデータを取得して操作することで演算を行い、演算された結果を前記外部システムに送信して前記メモリ上に書き込み、制御プログラムの処理対象になる前記メモリ上の値及び前記外部システム上のデータを変数として定義し、定義された変数を識別するための属性の集合に識別子をつけて管理する変数管理部をさらに備え、
前記演算部は、前記アクションパラメータが、変数の識別子と変数の現在値とをペアで要素としてもつ配列であり、前記アクションの実行前にジョブに含まれるすべての前記アクションに関する前記アクションパラメータから変数の属性を取得し、取得された属性を使って変数の現在値を取得し前記アクションパラメータへ格納し、また、すべての前記アクションの実行が完了した後、演算結果を前記アクションパラメータから取り出し、前記取得された属性に従って現在値を更新する
ことを特徴とする請求項２に記載の監視制御装置。
【請求項５】
前記プラグイン管理部は、
前記アクションの動作を監視し、前記監視制御装置で定義済みの例外処理を捕捉する例外監視手段と、
指定された時間が経過しても前記アクションの実行が完了していないか否かを監視する実行時間監視手段と、
を有し、
前記プラグイン管理部は、前記例外監視手段及び前記実行時間監視手段の監視結果に応じて、前記アクションの動作に異常が発生したと判断した場合、直ぐに前記アクションの実行を停止し、予め割り付けられているユーザ定義の異常処理を実行し、実行終了後に前記アクションパラメータに書き込まれた値を破棄する
ことを特徴とする請求項１に記載の監視制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、監視制御装置に関する。
【背景技術】
【０００２】
近年、インターネットに存在するソフトウエアをＰＣ（Ｐｅｒｓｏｎａｌ  Ｃｏｍｐｕｔｅｒ）にダウロードし、アプリケーションプログラムで使用するプラグインプログラムが実用化されている。こうしたプラグインプログラムにはＡｄｏｂｅ社のＦｌａｓｈ  ＰｌａｙｅｒやＯｒａｃｌｅのＪａｖａ（登録商標）  Ｐｌｕｇ−Ｉｎなどがあり、ブラウザと呼ばれるアプリケーションプログラムに動的に組み込まれる。ここでブラウザにはＭｉｃｒｏｓｏｆｔ社のＩｎｔｅｒｎｅｔ  ＥｘｐｌｏｒｅｒやＭｏｚｉｌｌａ  ＦｏｕｎｄａｔｉｏｎのＦｉｒｅｆｏｘ、Ａｐｐｌｅ社のＳａｆａｒｉ、Ｇｏｏｇｌｅ社のＣｈｒｏｍｅなどが知られている。その他のアプリケーションプログラムでは動画編集ソフトウエア、例えばペガシス社の動画ファイル変換ソフトであるＴＭＰＧＥｎｃでＭＰＥＧやＡＶＩ、ＦＬＶといった動画フォーマットごとに用意される動画変換のためのプラグインソフトウエアなどがある。【０００３】
なお、本明細書では、「アドオン」は物のはたらきを示す実体を持たない概念的な「機能」を指す言葉と定義し、「プラグイン」は機能が組み込まれた実体を持つ「ソフトウェア」を指す言葉と定義する。また「ホスト」とはプラグインを組み込む本体側のソフトウエアを意味する。先述した例ではブラウザがホストでＦｌａｓｈ  Ｐｌａｙｅｒがプラグインになる。【０００４】
また、組込み分野では複合機のソフトウエアをインターネット経由で動的に拡張できるものもある。【０００５】
特許文献１には、ＬＡＮを介してプリンタに接続されたホストコンピュータにおいて、検索対象情報リストＵＩ制御モジュール内の検索対象情報リストに記述されている検索対象範囲に存在している機能情報を取得して機能情報リストに書き込み、機能情報リストに書き込まれている機能情報の一部をプリンタ機能設定画面の表示欄に表示して、表示された機能情報に対応する機能の追加、更新、および削除の指示を受け付け、受け付けられた指示に従って機能の追加、更新、および削除を実行することが記載されている。これにより、特許文献１によれば、ドライバ本体モジュールに接続されているプラグインモジュールを用いて、機能の追加、更新、および削除を行うことができるとされている。【０００６】
一方、プラグインのセキュリティについて社会問題になっており、動的に機能を追加できる反面、追加する機能に悪意がある場合はシステム全体が危機になる場合がある。そのため、セキュリティ向上を目的にプラグインをホストとなるプログラムとは別のプロセス空間で実行させる方法が知られている。【０００７】
特許文献２には、コンピュータ装置において、プラグインが信頼できると確信すると、アプリケーションが、プラグインに情報を渡して親アプリケーションとは別個のプロセスとして実行させることが記載されている。これにより、特許文献２によれば、プラグインは自身のプロセス空間で実行するため、不適切に挙動するプラグインは親アプリケーションに損傷を与えないとされている。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特許第４３７１６９３号公報
【特許文献２】特許第４７５７８７３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
特許文献１に記載の技術では、プラグインのセキュリティをどのように向上させるのかについて一切記載がない。【００１０】
特許文献２に記載の技術では、ホストとは別のプロセス空間でプラグインを実行するので、ホストとプラグインの間でプロセス間通信が発生するため、実行速度が遅くなる可能性がある。また、プロセスを新たに生成するために余分なメモリを必要とする可能性がある。【００１１】
セキュリティが特に重要とされる分野の１つにＦＡ（Ｆａｃｔｏｒｙ  Ａｕｔｏｍａｔｉｏｎ）やＰＡ（Ｐｒｏｃｅｓｓ  Ａｕｔｏｍａｔｉｏｎ）といった監視制御分野がある。こうした分野では、工場、プラントといった施設で制御装置を使った監視制御が行われている。監視制御装置は、プラント内のセンサからデータを収集し、監視制御装置内の演算装置を使って制御プログラム（制御アルゴリズム）を実行し、駆動装置に制御信号を送信したり表示器を操作したりする。近年では、ネットワークを介してＭＥＳ（Ｍａｎｕｆａｃｔｕｒｉｎｇ  Ｅｘｅｃｕｔｉｏｎ  Ｓｙｓｔｅｍ）やＥＲＰ（Ｅｎｔｅｒｐｒｉｓｅ  Ｒｅｓｏｕｒｃｅ  Ｐｌａｎｎｉｎｇ）といった外部システムと通信するものもあり、監視制御装置と接続できる機器や通信方式も増加している。ここで、監視制御装置には、ＰＬＣ（Ｐｒｏｇｒａｍｍａｂｌｅ  Ｌｏｇｉｃ  Ｃｏｎｔｒｏｌｌｅｒ）、ＮＣ（Ｎｕｍｅｒｉｃａｌ  Ｃｏｎｔｒｏｌｌｅｒ）、プログラマブル表示器などがある。【００１２】
プラントでは、リアルタイム性及び省メモリが必要とされるため、特許文献２のような方式では適用が困難である。これらの問題に対してＭｉｃｒｏｓｏｆｔ社のＯＳ（Ｏｐｅｒａｔｉｏｎ  Ｓｙｓｔｅｍ）であるＷｉｎｄｏｗｓ（登録商標）で使われるダイナミックリンクライブラリやＵＮＩＸ（登録商標）のシェアードライブラリといった形式で、ホストと同一のプロセス空間でプラグインを実装し機能を拡張する方法もある。この方法を使えばメモリの消費も少なく、プロセス間通信も不要になり高速に処理を行うことができるようにも考えられる。【００１３】
これらのライブラリでは、プラグインの入力となるデータは、ホストがプラグインの関数の引数として提供するかプラグインがホスト側の関数を使って取得する。また、出力データである演算結果は、同じく引数で渡したり、関数の戻り値、あるいはプラグインがホスト側の関数を呼び出し、そのときの引数で渡すことで実現する。こうした場合、データを渡すために使う関数の仕様、つまり引数のデータ型や並びが変わるとプラグインをコンパイルし直す必要がある。結果として、プラグインを高速に実行することが困難である。【００１４】
また、これらのライブラリでは、プラグインの関数やホストの関数を直接呼び出して同じプロセス空間にあるデータを渡すため、不正なメモリ操作や、不正なプラグインにより親プロセスの実行を妨害する可能性がある。すなわち、セキュリティ上の問題が発生しやすいので、プラグインを安全に実行することが困難である。【００１５】
本発明は、上記に鑑みてなされたものであって、プラグインを高速かつ安全に実行できる監視制御装置を得ることを目的とする。
【課題を解決するための手段】
【００１６】
上述した課題を解決し、目的を達成するために、本発明の１つの側面にかかる監視制御装置は、ホストに従って機器を監視制御する監視制御装置であって、前記ホストに装着されるプラグインに含まれた複数のアクションのうち実行対象のアクションを指定するプラグイン管理部と、前記プラグインに含まれる前記複数のアクションに対応した複数のアクションパラメータを格納した複数の配列を生成して、前記ホスト及び前記プラグインにより共有されるプロセス空間に前記生成された複数の配列を配置し、前記生成された複数の配列のうち前記プラグイン管理部により指定されたアクションに対応する配列にアクセスして前記指定されたアクションに対応するアクションパラメータを操作するアクションパラメータ管理部とを備えたことを特徴とする。
【発明の効果】
【００１７】
本発明によれば、プラグインとホストとが同一のプロセス空間（共有されるプロセス空間）にアクセスでき、プラグイン及びホストの間に互いに識別しながらパラメータを格納する専用の領域（複数の配列）を設けることができるので、ホスト側をコンパイルし直すことなくプラグインを実行できるとともに、プラグインが直接的にホストにアクセスすることを防止できる。この結果、ホストの実行を継続しながらホストの機能を拡張するためのプラグインを高速かつ安全に実行できる。
【図面の簡単な説明】
【００１８】
【図１】図１は、実施の形態１にかかる監視制御装置が適用されたプラントの構成を示す図である。
【図２】図２は、実施の形態１における監視制御装置の機能構成を示す図である。
【図３】図３は、実施の形態１におけるアクションパラメータの格納例を示す図である。
【図４】図４は、実施の形態１におけるアクションパラメータに現在値を格納する例を示す図である。
【図５】図５は、実施の形態１におけるアクションパラメータへ演算結果を格納する例を示す図である。
【図６】図６は、実施の形態１におけるジョブファイルの例を示す図である。
【図７】図７は、実施の形態１におけるアクションの例を示す図である。
【図８】図８は、実施の形態１におけるアクションの登録の流れを示すフローチャートである。
【図９】図９は、実施の形態１におけるアクションパラメータの生成の流れを示すフローチャートである。
【図１０】図１０は、実施の形態１におけるアクション実行の流れを示すフローチャートである。
【図１１】図１１は、実施の形態２にかかる監視制御装置の機能構成を示す図である。
【図１２】図１２は、実施の形態２における変数定義ファイルの例を示す図である。
【図１３】図１３は、実施の形態２におけるアクションパラメータと変数テーブルとの例を示す図である。
【図１４】図１４は、実施の形態２におけるアクションパラメータに現在値を格納する例を示す図である。
【図１５】図１５は、実施の形態２におけるアクションパラメータへ演算値を格納する例を示す図である。
【図１６】図１６は、実施の形態２における変数管理部の初期化の流れを示すフローチャートである。
【図１７】図１７は、実施の形態２におけるジョブ実行の流れを示すフローチャートである。
【図１８】図１８は、実施の形態３にかかる監視制御装置の機能構成を示す図である。
【図１９】図１９は、実施の形態３における例外監視の流れを示すフローチャートである。
【発明を実施するための形態】
【００１９】
以下に、本発明にかかる監視制御装置の実施の形態を図面に基づいて詳細に説明する。なお、この実施の形態によりこの発明が限定されるものではない。
【００２０】
実施の形態１．
実施の形態１にかかる監視制御装置１００について図１を用いて説明する。図１は、実施の形態１にかかる監視制御装置１００が適用されたプラントＰＬの構成例を示すブロック図である。
【００２１】
プラント（工場等）ＰＬにおいて、監視制御装置１００は、プログラミング可能なホスト１３０に従って、プラントＰＬにおけるデバイス（機器）３０のプロセスデータ（計測値）を監視したり、ホスト１３０に含まれる制御プログラム（制御アルゴリズム）に従ってプロセスデータの演算を行い制御データ（演算値）を生成し、外部システム２０にネットワーク６０経由で送信したりする。監視制御装置１００は、例えば、ＰＬＣ（Ｐｒｏｇｒａｍｍａｂｌｅ  Ｌｏｇｉｃ  Ｃｏｎｔｒｏｌｌｅｒ）、ＮＣ（Ｎｕｍｅｒｉｃａｌ  Ｃｏｎｔｒｏｌｌｅｒ）、プログラマブル表示器などである。
【００２２】
監視制御装置１００は、後述するように、ホスト１３０を実行させながらホスト１３０の機能拡張が可能な組み込み監視制御装置である。監視制御装置１００は、ホスト１３０を実行させることにより、その内部に監視制御システム（複数の機能ブロックを含む構成）１００ａを実現しているため、監視制御装置１００内の監視制御システム１００ａと区別する意味で、監視制御装置１００外部のシステムを外部システム２０と呼んでいる。外部システム２０は、例えば、ネットワーク６０経由で監視制御装置１００に接続されたサーバ又はパソコン（パーソナルコンピュータ）などの情報処理装置を含む。
【００２３】
監視制御装置１００は、デバイス（機器）３０の中に含まれるセンサ３２で、プラントＰＬのプロセス値を計測した計測値を取得し、監視制御装置１００の内部メモリ（デバイスメモリ１５０）に記憶する。この計測値から、監視制御装置１００は、ホスト１３０に含まれるＰＩＤ（Ｐｒｏｐｏｒｔｉｏｎａｌ  Ｉｎｔｅｇｒａｌ  Ｄｅｒｉｖａｔｉｖｅ）などの制御アルゴリズムを使って実装された制御プログラムに従って、制御値（演算値）を算出して駆動装置３１に出力したり、センサ３２から取得した計測値を加工して現在値としてランプやメータなどの表示器３３に出力したりする。
【００２４】
また、監視制御装置１００は、Ｅｔｈｅｒｎｅｔ（登録商標）／ＵＳＢ／ＲＳ２３２Ｃなどの規格に従った汎用ケーブル５０により設定用パソコン４０に接続されており、インターネット・イントラネット等のネットワーク６０を介してデータベースやＭＥＳ／ＥＲＰなどの外部システム２０と接続・連携することができる。なお、図１では、図示の簡略化のため、１つのデバイス３０を示しているが、監視制御装置１００は、複数のデバイス３０を監視制御してもよい。
【００２５】
設定用パソコン４０は、外部システム２０との連携手順（外部システム２０と連携するロジック）を記述したジョブファイル１１０やホスト１３０の機能を拡張するためのプラグイン１２０を監視制御装置１００に転送できる。設定用パソコン４０は、例えば、パソコン（パーソナルコンピュータ）などの情報処理端末を含む。さらに、設定用パソコン４０で設定した条件のとき、監視制御装置１００内のメモリであるデバイスメモリ１５０の値を加工して外部システム２０へ送ったり、外部システム２０から取得されたデータを加工して監視制御装置１００のデバイスメモリ１５０に書き込むといった処理を行う。
【００２６】
プラグイン１２０は、監視制御装置１００の主機能を実現するプログラムであるホスト１３０を拡張するものである。プラグイン１２０は、ホスト１３０の実行を継続しながらホスト１３０に追加可能である。このため、新しい外部システム２０が追加されたり、ＴＣＰ／ＩＰやＳＯＡＰ（Ｓｉｍｐｌｅ  Ｏｂｊｅｃｔ  Ａｃｃｅｓｓ  Ｐｒｏｔｏｃｏｌ）といった新しい通信プロトコルが追加されたりなど連携方法が変更された場合に、プラグイン１２０を設定用パソコン４０から監視制御装置１００にダウンロードすることでその変更に対応することができる。これに応じて、監視制御装置１００は、ホスト１３０の実行に従った監視制御動作を継続しながら、上記の変更に対応してホスト１３０の機能を拡張できる。
【００２７】
図２に監視制御装置１００内の機能構成（監視制御システム１００ａの構成）を示す。図２に示された各機能構成は、ホスト１３０の実行に応じて（例えば、コンパイル時等に）一括して監視制御装置１００内に生成されてもよいし、ホスト１３０の実行の段階に応じて順次に生成・消滅されてもよい。図２において、破線で示した部分がホスト１３０である。プラグイン１２０は、ホスト１３０に機能的に装着される。ホスト１３０は、デバイスメモリ１５０にアクセスし、デバイスメモリ１５０に値を書き込んだり、デバイスメモリ１５０から値を読み出したりする。
【００２８】
ホスト１３０において、演算部１３３は、設定用パソコン４０（図１参照）から通信部１３１経由でダウンロードされたジョブファイル１１０（図６参照）内の起動条件であるトリガが成立するか否かを監視する。ジョブファイル１１０は、監視制御装置１００で実行すべきプラグイン１２０を指定するための情報を含む。演算部１３３は、トリガが成立すると判断した場合に、ジョブ実行手段１３３Ａにジョブファイル１１０内の連携処理（ジョブ）を実行させる。通信部１３１経由でダウンロードされたジョブファイル１１０は、通信部１３１によりジョブデータ記憶部１３４に記憶される。連携処理は、アクション１２０ａ（図７参照）を使って記述される。アクション１２０ａは、プラグイン１２０で実装される機能であり、プラグイン１２０に含まれている。
【００２９】
すなわち、プラグイン１２０は、複数のアクション１２０ａを含み、ジョブファイル１１０は、複数のアクション１２０ａのうち実行すべきアクション１２０ａを指定する。演算部１３３は、その指定されたアクション１２０ａに応じて、演算処理を行い、演算結果をデバイスメモリ１５０に格納する。
【００３０】
デバイスメモリ１５０は、監視制御装置１００内の内部メモリであり、計測値を保持したり、アクション１２０ａにより演算された演算値を保持したりする。プラグイン管理部１３２は、インストールされた（装着された）プラグイン１２０の登録・削除などの管理を行う。
【００３１】
例えば、プラグイン管理部１３２は、デバイスメモリ１５０に格納された演算結果を参照し、ホスト１３０に装着されるプラグイン１２０に含まれた複数のアクション１２０ａのうち実行対象のアクションを識別する。例えば、プラグイン管理部１３２は、プラグイン１２０のプログラムに宣言された、実行対象のアクションを指定する識別子を呼び出すことでプラグイン１２０に格納されたアクション１２０ａの実行を制御し、ホスト１３０の機能を拡張する。
【００３２】
通信部１３１は、外部システム２０やデバイス３０と演算値や計測値、制御値を通信する。アクション１２０ａは、外部システム２０と連携するデータの識別子（例えば、変数名）や演算内容が記述されている（図７参照）。
【００３３】
アクションパラメータ管理部１３５は、プラグイン１２０に渡すデータの属性と現在値で構成される要素に持つパラメータの生成や現在値の更新、アクション１２０ａで演算された値をアクションパラメータ１３５ａに書き込む処理を行う。
【００３４】
例えば、アクションパラメータ管理部１３５は、複数の配列を生成する。複数の配列は、プラグイン１２０に含まれる複数のアクション１２０ａに対応した複数のアクションパラメータ１３５ａを格納している。例えば、各配列は、１つのアクションパラメータ１３５ａを格納している（図３参照）。
【００３５】
例えば、図３では、１つのアクションパラメータ１３５ａとして、二項演算を行うアクションを実行するために必要な複数のパラメータ（複数の値）を格納した例を示している。この二項演算には、演算を行う値を参照する位置を特定するために必要な２つのパラメータと、演算結果を格納する場所を特定するための１つのパラメータ、合せて３つのパラメータが必要になる。図３では、要素番号「００１」、「００２」、「００３」の３つのパラメータを要素に持つ配列を示している。要素番号「００１」の要素１３５ａ４は、デバイス３０のメモリを特定する複数の情報を組み合わせたもので、参照するデータの種別、識別するための名称、デバイス（例えば、シーケンサデバイス）の種類、オフセットアドレスを並べて格納している。したがって、ここでは、デバイス（例えば、シーケンサデバイス）におけるデータレジスタ「Ｄ」のオフセットアドレス１０００番目の値をＷＯＲＤ（２ｂｙｔｅ、符号なし整数）型で読み出すことになる。
【００３６】
図３の行と列との関係について説明する。図３の要素番号「００１」、「００２」、「００３」の各列（例えば、要素番号「００１」の列１３５ａ４）は、配列の要素を示している。これに対して、変数種別、名称などの各行（例えば、名称の行１３５ａ５）は、要素の属性を意味している。したがって、例えば、「Ｄ１０００」は、アクションパラメータ１３５ａの「００１」番目の要素の値が持つ属性「名称」が「Ｄ１０００」であることを示す。
【００３７】
アクションパラメータ管理部１３５は、ホスト１３０及びプラグイン１２０により共有されるプロセス空間（すなわち、メモリの領域が割り当てられるアドレス空間）に、その生成された複数の配列を配置する（例えば、メモリアドレスを割り当てる）。例えば、アクションパラメータ管理部１３５は、プラグイン１２０のプログラム、すなわちアクション１２０ａの記述（図７参照）に宣言された共通機能を呼び出すことにより、ホスト１３０及びプラグイン１２０により共有されるプロセス空間に複数の配列における少なくとも１つの配列を配置する。すなわち、共通機能（例えば、図７の「ＱｕｅｒｙＡｃｔｉｏｎＩＤ（）」）は、ホスト１３０及びプラグイン１２０により共有されるプロセス空間に対応している。
【００３８】
そして、アクションパラメータ管理部１３５は、複数の配列のうちプラグイン管理部１３２により指定されたアクション１２０ａに対応する配列にアクセスして、指定されたアクション１２０ａに対応するアクションパラメータを操作する。例えば、アクションパラメータ管理部１３５は、複数の配列のうち、プラグイン管理部１３２により呼び出された識別子で指定された配列にアクセスし、アクセスされた配列に対して要素インデックスを指定することでアクションパラメータに含まれる値を読みだしたり書き込んだりする。例えば、配列は、要素インデックスを与えることで、その要素として監視対象のデバイス３０の属性（例えば、デバイス３０の識別子、デバイス３０のタイプなど）、及びデバイス３０の現在値（例えば、デバイス３０の現在の動作状態又は制御状態を示す値）を返す。
【００３９】
監視制御システム１００ａで扱う変数は多種に存在し、それぞれに異なる属性をもつ。変数の種類には、グローバル変数、ローカル変数、デバイス変数、データベース変数などを挙げることができる。グローバル変数は、１つの監視制御システム１００ａの中で（すなわち、ホスト１３０の中で）共有される変数で局番号やネットワーク番号、変数名、データ型などの属性を持つ。ローカル変数は、ホスト１３０に含まれる複数のプログラム（例えば、制御プログラム及び他のプログラム）を含む監視制御システム１００ａの中の１つプログラム内で共有される変数でプログラム名や変数名、データ型を属性にもつ。デバイス変数は、監視制御装置１００の物理メモリを参照するもので、レジスタやキャッシュ、ランダムアクセスメモリ、シーケンシャルアクセスメモリといったメモリ種別や位置を示すアドレス、変数名などの属性がある。データベース変数は、データベースのフィールドと関連づいた変数で、テーブル名、フィールド名、変数名、データ型、抽出条件などの属性をもつと考えられる。これらの変数は、システムによって異なるが、変数が属性をもつことは共通である。図１２はこうした変数をファイルに定義した例を示す。ホスト１３０をプログラミングする際に、変数に対してこれらの属性を定義（宣言）することで、変数が参照される範囲を制御できる。
【００４０】
図１２に示す変数定義ファイル１３４ａでは、２つのデバイス変数Ｄ１０００、Ｄ２０００とデータベース変数ＴＢ１．ＦＬＤ１とが定義されている。変数Ｄ１０００は、変数型がデバイス変数で、データ型がＷＯＲＤ（符号なし２ｂｙｔｅ）、オフセットアドレスが１０００、デバイスの種別がデータであることを示している。変数Ｄ２０００は、変数型がデバイス変数で、データ型がＷＯＲＤ（符号なし２ｂｙｔｅ）、オフセットアドレスが２０００、デバイスの種別がデータであることを示している。変数ＴＢＬ．ＦＬＤ１は、変数型がデータベース変数で、データ型がＤＷＯＲＤ（符号なし４ｂｙｔｅ）、データベース名が“Ｔｅｓｔ”、データベースに接続するときに必要なＩＰアドレスが１９２．１６８．１０．１、テーブル名が“Ｔａｂｌｅ１”、フィールド名が“Ｆｉｅｌｄ１”であることを示している。演算処理は、こうした変数定義を初期化時に変数定義ファイル１３４ａを読み込んでおくか、設定パソコン４０から監視制御装置１００に入力する形で、監視制御装置１００の内部（例えば、ジョブデータ記憶部１３４）に保持しておく。
【００４１】
アクション１２０ａは、こうした変数（デバイス３０を監視制御するための変数）を操作するもので、操作に必要なデータがアクションパラメータ１３５ａである。ジョブファイル１１０は、どの変数をアクション１２０ａに処理させるかを定義する（図６参照）。例えば、ジョブファイル１１０は、プラグイン１２０に含まれる複数のアクション１２０ａのうち実行すべきアクション１２０ａを識別子（例えば、図６の「４２」）で指定する。アクションパラメータ管理部１３５は、アクション１２０ａを識別子がどのアクションパラメータ１３５ａに対応しているのかを、プラグイン１２０に含まれる複数のアクション１２０ａについて共通機能（例えば、図７の「ＱｕｅｒｙＡｃｔｉｏｎＩＤ（）」）で管理しており、与えられたアクション１２０ａを識別子に応じて処理対象のアクションパラメータ１３５ａを特定できる。
【００４２】
例えば、２つの変数の平均をとるアクション１２０ａを例にとり図３を使ってこれらの概念を説明する。ジョブファイル１１０（図６参照）にはＤ１０００及びＤ２０００のデバイス変数があり、２つの変数の値の平均をとってデータベース変数ＴＢＬ１．ＦＬＤ１に書き込む。このアクション１２０ａでは、Ｄ１０００，Ｄ２０００，ＴＢＬ１．ＦＬＤ１の３つの変数が必要になるので、アクションパラメータ１３５ａに格納する要素は３つになる。図３は、アクションパラメータ１３５ａの格納例を示したものである。アクションパラメータ１３５ａは、格納位置を示すインデックス（要素インデックス）１３５ａ１と、変数の属性（例えば、デバイス３０の属性）を格納する部分１３５ａ２と、現在値（例えば、デバイス３０の現在値）を格納する部分１３５ａ３との３つに分けることができる。属性は、変数で共通の属性（例えば、変数名など）と個別の属性（例えば、デバイス種別など）とに分類される。
【００４３】
すなわち、アクションパラメータ１３５ａは、インデックス１３５ａ１を与えると、例えば変数の属性と現在値とを返す配列として実装される。例えば、初期状態においてインデックス１３５ａ１を与えられた場合、配列は、現在値として（空であることを示す）「ｎｕｌｌ」等を返す。アクションパラメータ管理部１３５は、アクションパラメータ１３５ａを格納した配列を、ジョブファイル１１０に記述されたアクション１２０ａの数だけ保持する。例えば、アクションパラメータ１３５ａを格納した配列は、その配列要素を指定するための要素インデックスとして、図３に示すインデックス１３５ａ１を有する。また、アクションパラメータ１３５ａを格納した配列の識別子は、アクション１２０ａの識別子に対応付けられている。そのため、アクションパラメータ管理部１３５は、処理対象のアクション１２０ａの識別子に応じて、配列の識別子と要素インデックスとを指定することでアクションパラメータ１３５ａの値を読みだしたり書き込んだりする。
【００４４】
図４は、監視制御装置１００の機能を使って現在値１３５ａ３１，１３５ａ３２をアクションパラメータ１３５ａに格納する例である。現在値１３５ａ３１，１３５ａ３２を獲得するには、通常、アクセスＡＰＩ（Ａｐｐｌｉｃａｔｉｏ  Ｉｎｔｅｒｆａｃｅ）が用意されているので、それを使って（例えば、ホスト１３０及びプラグイン１２０に共有されたプロセス空間（又は共通機能）経由で）取得する。すなわち、監視制御装置１００は、センサ３２から取得された計測値及び計測値に対応した属性を、アクセスＡＰＩによりアクションパラメータ１３５ａ用の属性及び現在値に（互いに対応付けられた状態で）変換し、変換された現在値を現在値１３５ａ３１，１３５ａ３２とする。
【００４５】
図４では、変換された属性をもとに監視制御装置１００から変数「００１」（変数「Ｄ０００１」）の現在値１３５ａ３１として「４０９６（０ｘ１０００）」を取得して格納している。次の変数「００２」（変数「Ｄ０００２」）も同様で、ここでは現在値１３５ａ３２として「５７３４４（０ｘＥ０００）」を取得して格納している。この２つの値を加算して平均をとると「３０７２０（０ｘ７８００）」になる。従って、図５のように変数「００３」（変数「ＴＢＬ１．ＦＬＤ１」）は、他の変数と異なりデータ型はＤＷＯＲＤ（符号なし４ｂｙｔｅ）なので演算値１３５ａ３３として「０ｘ００００７８００」が格納される。
【００４６】
図６は、実施の形態１におけるジョブファイル１１０の例である。ここでは、ＸＭＬ（ｅＸｔｅｎｄｅｄ  Ｍａｒｋｕｐ  Ｌａｎｇｕａｇｅ）フォーマットでジョブファイル１１０を記述しているが、それ以外のデータフォーマット（例えば、ＳＧＭＬ（Ｓｔａｎｄａｒｄ  Ｇｅｎｅｒａｌｉｚｅｄ  Ｍａｒｋｕｐ  Ｌａｎｇｕａｇｅ）又はＨＴＭＬ（ＨｙｐｅｒＴｅｘｔ  Ｍａｒｋｕｐ  Ｌａｎｇｕａｇｅ）などのマークアップ言語、ベーシックやＣ言語などのプログラミング言語）を使ってもよい。
【００４７】
図６に示すジョブファイル１１０では、行００１〜行００４までがジョブを起動するための条件であるトリガを宣言している。行００５〜行０１８までは実行するジョブを宣言している。行００２は、トリガに含まれる条件式である。ここでは、「Ｄ１０００  ＞  １００」、つまり変数Ｄ１０００が１００より大きい場合にジョブを起動することを示している。行００３は、起動するジョブの識別子を示している。ここでは、ジョブの識別子が「００１」であるジョブを起動することを意味している。行００７は、ジョブに含まれる１番目のアクション１２０ａの識別子が「４２」であることを示す。アクション１２０ａの識別子は、プラグイン１２０を登録したときにアクション１２０ａに設定されている番号である。この例では、「４２」は、３番目の引数に指定された演算子に従って１番目の変数と２番目の変数を２項演算して（平均をとって）演算結果を４番目の変数に設定するアクション１２０ａである。行００８〜行０１１までは、アクション１２０ａに渡すパラメータである。ここでは変数「Ｄ１０００」，「Ｄ２０００」、演算子「＋」、変数「ＴＢＬ．ＦＬＤ１」が指定されている。このように、ジョブファイル１１０にはアクション１２０ａに渡すデータが記述されている。
【００４８】
図７は、プラグイン１２０に含まれるアクション１２０ａの記述例である。ここでは、Ｃ言語を使って実装した、アクションパラメータ１３５ａの３番目に指定された演算子に従って１番目と２番目のデータを２項演算するアクション１２０ａを示している。ただし、アクション１２０ａの実装は、特にＣ言語に限ったものではなく、他のプログラミング言語（ベーシックなど）によっても可能である。
【００４９】
行１０２は、実行する関数名「ｄｏＥｘｅｃｕｔｅ」と引数「ＨＡＮＤＬＥ  ｐａｒａｍｅｔｅｒ」とを示している。関数名は、監視制御システム１００ａで決まった名前にしておく。ここで引数には、ＨＡＮＤＬＥ型のｐａｒａｍｅｔｅｒという名前の変数「ＨＡＮＤＬＥ  ｐａｒａｍｅｔｅｒ」が指定されている。この変数は、アクションパラメータ１３５ａの識別子で、アクションパラメータ１３５ａは使われるアクション１２０ａについて１つ生成され、監視制御システム１００ａ内で一意の値をもつ。行１０４から行１０５は、アクション１２０ａで使われる変数を宣言している。行１０７では、アクションパラメータ１３５ａの１番目の値（整数型の値）を変数「ａｒｇ１」に格納している。行１０８では、同様に２番目の値（整数型の値）を変数「ａｒｇ２」に格納している。行１０９では、３番目の値（文字型の値）を変数「ｏｐ」に格納している。変数「ｏｐ」は演算子を表している。行１１０から行１１９で、演算子の種類に応じて変数「ａｒｇ１」，「ａｒｇ２」を演算し、その結果（整数型の値）を変数「ｒｅｓｕｌｔ」に格納している。行１２０では、変数「ｒｅｓｕｌｔ」をアクションパラメータ１３５ａの４番目の要素に格納している。
【００５０】
次に、図８のフローチャートを使ってプラグイン管理部１３２におけるアクションの登録処理の流れについて説明する。
【００５１】
ステップＳＴ００２では、指定された場所に配置されたプラグイン１２０をメモリにロードする。指定された場所とはフォルダやディレクトリなどのファイルシステムの任意の場所でよい。この場所にあるロード可能なモジュールを自動で読み込む。
【００５２】
ただし、ステップＳＴ００１のように、どのモジュールをロードするのかを設定ファイルなど記述しておき選択するなどの制御をしてもかまわない。
【００５３】
ステップＳＴ００３では、プラグイン１２０にアクション１２０ａの識別子を問い合わせする。識別子の問い合わせは、規定の関数を使って実現してもよい。例えば、図７のように、プラグイン１２０のプログラムに「ＱｕｅｒｙＡｃｔｉｏｎＩＤ（）」といった名称の関数（共通機能）を共通で予め定義しておき、その中でアクションを識別するＩＤ、たとえば先の図７の例ではこの関数の中で「４２」を返すことで図６のジョブを実行することができる。
【００５４】
ＳＴ００４では、アクション１２０ａの識別子とプラグイン１２０のアドレスとをペアでプラグイン管理部１３２（図２参照）に登録する。ここでプラグイン１２０のアドレスとは、プラグイン１２０に定義されているアクション１２０ａを実行するときに使われる関数ポインタなどである。図７の例によれば、「ｄｏＥｘｅｃｕｔｅ」が識別子「４２」とともに登録される。
【００５５】
ステップＳＴ００５では、ステップＳＴ００２〜ステップＳＴ００４の処理がジョブ中で使われている全てのアクション１２０ａについて行われたか否かを判断する。全てのアクション１２０ａについて行われていない（ＳＴ００５で「Ｎｏ」の）場合、処理をステップＳＴ００２へ戻し、全てのアクション１２０ａについて行われた（ＳＴ００５で「Ｙｅｓ」の）場合、処理を終了する。
【００５６】
次に、実施の形態１におけるアクションパラメータ１３５ａの生成処理の流れに関して図９に示すフローチャートに従って説明する。
【００５７】
ステップＳＴ１０１では、ジョブファイル１１０を読み込む。ここでは、図６のジョブファイル１１０を読み込むことにする。
【００５８】
ステップＳＴ１０２では、アクションパラメータ１３５ａを生成し初期化しておく。
【００５９】
ステップＳＴ１０３では、ジョブファイル１１０からジョブで使われている変数、図６の例では、「Ｄ１０００」、「Ｄ２０００」、「ＴＢ１．ＦＬＤ１」の属性をアクションパラメータに格納する。
【００６０】
ステップＳＴ１０５では、ステップＳＴ１０２、ステップＳＴ１０３の処理がジョブ中で使われている全てのアクション１２０ａについて行われたか否かを判断する。全てのアクション１２０ａについて行われていない（ＳＴ１０５で「Ｎｏ」の）場合、処理をステップＳＴ１０３へ戻し、全てのアクション１２０ａについて行われた（ＳＴ１０５で「Ｙｅｓ」の）場合、処理を終了する。
【００６１】
次に、実施の形態１におけるジョブの実行の流れに関して図１０に示すフローチャートに従って説明する。ここでは、図６の識別子「００１」であるジョブを実行する例について説明する。また、ここでは、アクション１２０ａとして、識別子「４２」のアクション１２０ａを実行する例を示している。
【００６２】
ステップＳＴ２０１において、ジョブデータ管理部１３４から実行するアクション１２０ａの識別子を取得する。ここでは、「４２」を取得する。
【００６３】
ステップＳＴ２０２において、プラグイン管理部１３２から取得したアクション１２０ａの識別子から該当するプラグイン１２０を取得する。すなわち、アクション１２０ａの識別子に対応するプラグイン１２０を実行する。ここでは、図７のアクション１２０ａを含むプラグイン１２０が取得されるものとする。したがって、アクション１２０ａの関数ポインタ「ｄｏＥｘｅｃｕｔｅ」が取得されることになる。
【００６４】
ステップＳＴ２０３において、アクションパラメータ管理部１３５からプラグイン１２０のアクション１２０ａに対応するアクションパラメータ１３５ａを取得する。
【００６５】
ステップＳＴ２０４において、演算部１３３は、アクションパラメータ１３５ａの属性を参照し、ホスト１３０の機能（及び共通機能）を使って変数の現在値を取得し、アクションパラメータ１３５ａの要素に代入する。ここでホスト１３０の機能とは、機種ごと用意されているアクセスＡＰＩなどで実現する。
【００６６】
ステップＳＴ２０５において、ステップＳＴ２０４の処理が処理対象のアクション１２０ａに対する全てのアクションパラメータ１３５ａについて行われたか否かを判断する。全てのアクションパラメータ１３５ａについて行われていない（ＳＴ２０５で「Ｎｏ」の）場合、処理をステップＳＴ２０４へ戻し、全てのアクションパラメータ１３５ａについて行われた（ＳＴ２０５で「Ｙｅｓ」の）場合、ステップＳＴ２０６へ進める。
【００６７】
ステップＳＴ２０６において、演算部１３３がアクションパラメータ１３５ａにアクセスするための数値（ハンドル）を作成する。
【００６８】
ステップＳＴ２０７では、ステップＳＴ２０１〜ステップＳＴ２０６の処理がジョブ中で使われている全てのアクション１２０ａについて行われたか否かを判断する。全てのアクション１２０ａについて行われていない（ＳＴ２０７で「Ｎｏ」の）場合、処理をステップＳＴ２０１へ戻し、全てのアクション１２０ａについて行われた（ＳＴ２０７で「Ｙｅｓ」の）場合、ステップＳＴ２０８へ進める。
【００６９】
ステップＳＴ２０８において、演算部１３３は、ハンドルで指定されたプラグイン１２０を実行する。
【００７０】
ステップＳＴ２０９において、プラグイン１２０は、演算を行う。
【００７１】
ステップＳＴ２１０において、プラグイン１２０は、演算結果をアクションパラメータ１３５ａに書き込む。そして、演算部１３３は、アクションパラメータ１３５ａに書き込まれた演算結果をホスト１３０に書き込む。その結果、ホスト１３０は、デバイスメモリ１５０の値を更新したり、通信部１３１を使って外部システム２０に値を送信したりする。
【００７２】
以上のように、実施の形態１では、監視制御装置１００において、プラグイン管理部１３２は、ホスト１３０に装着されるプラグイン１２０に含まれた複数のアクション１２０ａのうち実行対象のアクション１２０ａを識別する。アクションパラメータ管理部１３５は、プラグイン１３０に含まれる複数のアクション１２０ａに対応した複数のアクションパラメータ１３５ａを格納した複数の配列を生成して、ホスト１３０及びプラグイン１２０により共有されるプロセス空間にその生成された複数の配列を配置する。そして、アクションパラメータ管理部１３５は、複数の配列のうちプラグイン管理部１３２により識別されたアクション１２０ａに対応する配列にアクセスして、その指定されたアクション１２０ａに対応するアクションパラメータ１３５ａを操作する。これにより、プラグインとホストとが同一のプロセス空間（共有されるプロセス空間）にアクセスでき、プラグイン及びホストの間に互いに識別しながらパラメータを格納する専用の領域（複数の配列）を設けることができるので、ホスト側をコンパイルし直すことなくプラグインを実行できるとともに、プラグインが直接的にホストにアクセスすることを防止できる。この結果、ホストの実行を継続しながらホストの機能を拡張するためのプラグインを高速かつ安全に実行できる。
【００７３】
例えば、プラグイン１２０とホスト１３０との間にパラメータを格納する専用の領域を設けることができるので、複雑で異なる属性をもつ変数を識別子等により一元的に管理でき、消費メモリを削減でき、また直接メモリを参照しないためセキュリティを向上させることができる。
【００７４】
例えば、プラグイン１２０とホスト１３０とを同一のプロセスにロードでき、これらの間に互いに識別しながらパラメータを格納する専用の領域を設けることができるので、プラグイン１２０及び親プロセス（ホスト１３０）間は、変数を識別する識別子と変数値とをペアでもつ単純なバッファだけで連携させることができる。これにより、親プロセス（ホスト１３０）の仕様変更によりプラグイン１２０が影響を受けることが少ない。すなわち、拡張プログラムに必要なインターフェースが本体側に依存しないので拡張プログラムの作成・保守にかかるコストを低減できる。
【００７５】
例えば、プラグイン１２０とホスト１３０とを同一のプロセスにロードでき、これらの間に互いに識別しながらパラメータを格納する専用の領域を設けることができるので、プラグイン１２０は親プロセス（ホスト１３０）のサービスを直接呼び出すことが不要である。これにより、プラグイン１２０による親プロセス（ホスト１３０）の機能呼び出しがなく、不正操作が困難である。すなわち、本体側のメモリを直接アクセスしないのでシステムの実行を阻害する拡張プログラムを作るのが困難である。
【００７６】
また、実施の形態１では、監視制御装置１００において、通信部１３１は、計測値をデバイス３０から取得しデバイスメモリ１５０に格納したり、デバイスメモリ１５０に保持された演算値をデバイス３０に出力し、また、デバイスメモリ１５０に保持された計測値及び演算値を外部システム２０と通信する。演算部１３３は、ホスト１３０に従った演算を行って演算結果を演算値としてデバイスメモリ１５０に格納する。それとともに、演算部１３３のジョブ実行手段１３３Ａは、プラグイン１２０を指定するジョブファイル１１０を取得し、デバイスメモリ１５０の値を参照しプラグイン１２０を使ってジョブに応じた演算を実行し、その演算結果を演算値としてデバイスメモリ１５０に格納する。これにより、監視制御装置１００は、デバイス３０の監視制御をホスト１３０及びプラグイン１２０のそれぞれに従って行うことができる。
【００７７】
また、実施の形態１では、監視制御装置１００において、プラグイン管理部１３２は、プラグイン１２０のプログラム（すなわち、アクション１２０ａの記述）に宣言された、実行対象のアクションを指定する識別子を呼び出すことでプラグイン１２０に格納されたアクション１２０ａの実行を制御し、ホスト１３０の機能を拡張する。アクションパラメータ管理部１３５は、生成された複数の配列のうち、プラグイン管理部１３２により呼び出された識別子で指定された配列にアクセスし、アクセスされた配列に対して要素インデックスを指定することでアクションパラメータ１３５ａに含まれる値を読みだしたり書き込んだりする。これにより、プラグインとホストとが同一のプロセス空間（共有されるプロセス空間）に配置されたパラメータを格納する専用の領域（複数の配列）におけるアクションパラメータにアクセスできるように構成できる。
【００７８】
また、実施の形態１では、監視制御装置１００において、プラグイン１２０の実行に必要なアクションパラメータ１３５ａに、アクセスするための数値（ハンドル）をつける。そのため、参照する範囲を小さくでき、排他制御も少なくできるので、高速でセキュリティの高いプラグインの実行を実現できる。また、交換するデータも最小限にすることができ、不要なメモリを削減できる。
【００７９】
実施の形態２．
次に、実施の形態２にかかる監視制御装置について説明する。以下では、実施の形態１と異なる部分を中心に説明する。
【００８０】
実施の形態２では、アクションパラメータ１３５ａを調整（例えば、最適化）し要素のサイズを均一にすることで、実施の形態１に比べて、より省メモリ且つより高性能な監視制御システム１００ａｊの構築を目指す。
【００８１】
図１１は、実施の形態２における監視制御装置１００ｊの機能構成例（監視制御システム１００ａｊの構成例）である。プラグイン１２０が操作できる変数は、例えばすべて変数管理部１３６ｊで管理される。変数管理部１３６ｊでは、設定用パソコン４０（図１参照）から設定された内容に従って変数を定義していく。定義できる変数は、グローバル変数、ジョブ内でローカルに宣言されるローカル変数、データベースのフィールドにマッピングされているデータベース変数、あるいは定数、文字列などの固定値であってもよい。このとき、各変数がもつ複数の属性に対して変数ＩＤと呼ばれるＩＤが生成される。変数管理部１３６ｊでは、変数ＩＤから該当する変数の現在値を取得することができる。演算部１３３は、プラグイン１２０を実行するときに、プラグイン１２０側から変数ＩＤを渡されるので、変数管理部１３６ｊを通して現在値を取得してプラグイン１２０に渡す。
【００８２】
演算部１３３は、ジョブデータ記憶部１３４内にあるジョブデータと変数とを記述した図１２に示す変数定義ファイル１３４ａに従って、取り扱う変数の属性を格納した変数バッファ１３６Ａｊを作成する。変数バッファ１３６Ａｊの属性には、変数ＩＤと呼ぶ識別子をメモリアドレスとしてアクセスすることができる。
【００８３】
例えば、演算部１３３は、ジョブデータ記憶部１３４内にあるジョブデータに従って、プラグイン１２０の演算に必要な変数ＩＤを格納したアクションパラメータ１３５ａを作成する。演算部１３３は、アクションパラメータ１３５ａに格納された変数ＩＤから直接的に変数の属性を取得し、ホスト１３０の基本機能（例えば、アクセスＡＰＩ）を使って変数の現在値をアクションパラメータ１３５ａに格納する。すなわち、アクションパラメータ１３５ａは、変数の識別子と変数の現在値とをペアで要素としてもち、インデックス１３５ａ１を与えると、例えば変数の識別子と変数の現在値とを返す配列として実装される。
【００８４】
次に、プラグイン１２０に実行を依頼する。プラグイン１２０は、実行を依頼されると、アクションパラメータ１３５ａの先頭から現在値を順番に読み込み演算を行い、演算結果をアクションパラメータ１３５ａに書き戻す。演算部１３３は、プラグイン１２０の実行が終了したことを検出すると、デバイスメモリ１５０の値を更新したり、通信部１３１を使って外部システム２０に値を送信したりする。
【００８５】
ここで変数ＩＤは属性列を入力したハッシュ関数（文字列等のキーを与えるとハッシュ数を返す関数）で生成した値を使うこともできる。この場合はデータベースに属性を格納し、属性を格納したレコードのハッシュ数を使うことでより高速なアクセスを行うことができる。
【００８６】
図１２は、実施の形態２における監視制御装置１００ｊに設定用パソコン４０（図１参照）から設定する設定データの例である。ここでは、２つの変数についての設定データを示している。行２００〜行２０４までは、１番目の変数を定義しており、行２０５〜行２０９までは、２番目の変数を定義している。行２１０〜行２１５までは、３番目の変数を定義している。行２００では、変数の名前（ｎａｍｅ）が“Ｄ１０００”であり、変数型がデバイスメモリ（Ｄｅｖｉｃｅ）であり、データ型がＷＯＲＤ（符号なし２バイト）であることを定義している。さらに行２０１では、監視制御装置の局番号が００１であり、行２０２では、メモリのオフセットアドレスが１０００であり、行２０３では、デバイスメモリのデバイス種別が“Ｄａｔａ”であることを定義している。次に、行２１０では、変数名が“ＴＢ１．ＦＬＤ１”であり、変数型がデータベース変数（Ｄａｔａｂａｓｅ）であり、データ型がＤＷＯＲＤ（符号なし４バイト）であることを定義している。行２１１では、データベース名が“Ｔｅｓｔ”、動作するネットワークアドレスが“１９２．１６８．１０．１”であることを定義している。さらに、この変数は、階層的なデータ構造をとることができ、内部にデータベースのテーブル“Ｔａｂｌｅ１”をもち、その中のフィールド“Ｆｉｅｌｄ１”を参照できることを意味している。
【００８７】
図１３は、変数管理部１３６ｊにおけるアクションパラメータ１３５ａと変数バッファ１３６Ａｊの例を示す。変数バッファ１３６Ａｊでは、変数の属性が連続的に書き込まれる。アクションパラメータ１３５ａには、書き込み先（変数バッファ１３６Ａｊ）のメモリアドレスが書き込まれる。ここでは１番目の変数（インデックス「０１０７」の変数）はアドレス０００３に格納され、２番目の変数（インデックス「０１０８」の変数）は０００１Ｃ、３番目の変数（インデックス「０１０９」の変数）は０ｘ０００３５にあることになる。図１４のようにアクションパラメータ１３５ａに現在値１３５ａ３１ｊ，１３５ａ３２ｊが書き込まれる。ここでは、１番目の変数に「０ｘ１０００」、２番目の変数には「０ｘＥ０００」が書き込まれる。最後に、図１５のように演算した結果１３５ａ３３ｊが変数バッファ１３６Ａｊに書き込まれる。ここでは「０ｘ００００７８００」が書き込まれている。
【００８８】
次に、図１６のフローチャートを使って変数管理部１３６ｊの初期化動作の流れについて説明する。
【００８９】
ステップＳＴ３０１では、変数バッファ１３６Ａｊのために変数の属性を格納するための連続領域を確保する。この容量は、監視制御システム１００ａｊで予め定義しておく。
【００９０】
ステップＳＴ３０２では、図１２のような変数定義ファイル１３４ａを読み込む。このステップでは、変数を１つ分読み込む。
【００９１】
ステップＳＴ３０３では、読み込んだ属性（図３に示す変数の属性を格納する部分１３５ａ２参照）を変数バッファ１３６Ａｊにおける指定されたメモリアドレスの先頭から追記して書き込む。
【００９２】
ステップＳＴ３０４では、１つの変数のすべての属性について処理が行われたか否かを判断する。すべての属性について行われていない（ＳＴ３０４で「Ｎｏ」の）場合、処理をステップＳＴ３０３へ戻し、すべての属性について行われた（ＳＴ３０４で「Ｙｅｓ」の）場合、処理をステップＳＴ３０５へ進める。
【００９３】
ステップＳＴ３０５では、変数ＩＤを生成する。変数ＩＤは、監視制御システム１００ａｊ内で変数が一意に識別できる値ならどのような値でも構わない。図１３の例では、メモリアドレスが変数ＩＤになる。
【００９４】
ステップＳＴ３０６において、変数を使っているアクションパラメータ１３５ａに変数ＩＤを書き込む。
【００９５】
ステップＳＴ３０７では、ステップＳＴ３０２〜ステップＳＴ３０６の処理がジョブ中で使われている全ての変数について行われたか否かを判断する。全ての変数について行われていない（ＳＴ３０７で「Ｎｏ」の）場合、処理をステップＳＴ３０２へ戻し、全ての変数について行われた（ＳＴ３０７で「Ｙｅｓ」の）場合、処理を終了する。
【００９６】
次に、図１７のフローチャートを使ってアクション１２０ａの実行の流れについて説明する。
【００９７】
ステップＳＴ４０１において、アクション１２０ａに含まれる変数の１つについて変数のＩＤを取得する。
【００９８】
ステップＳＴ４０２において、変数ＩＤをアドレスとしてもつアクションパラメータ１３５ａの要素から、変数の属性を取得する。
【００９９】
ステップＳＴ４０３において、取得した属性を使って監視制御装置１００ｊから現在値を取得する。例えば、デバイス変数であれば、デバイス種別“Ｄ”（データレジスタ）、オフセット１００を使って、Ｄ１００番地のメモリイメージをＷＯＲＤ型のデータとして読みだす。
【０１００】
ステップＳＴ４０４において、ステップＳＴ４０１〜ステップＳＴ４０３の処理が、アクション１２０ａに含まれる全ての変数について行われたか否かを判断する。全ての変数について行われていない（ＳＴ４０４で「Ｎｏ」の）場合、処理をステップＳＴ４０１へ戻し、全ての変数について行われた（ＳＴ４０４で「Ｙｅｓ」の）場合、ステップＳＴ４０５へ進める。
【０１０１】
ステップＳＴ４０５において、取得した現在値を使って演算を行う。
【０１０２】
ステップＳＴ４０６において、演算した演算結果を格納する変数の変数ＩＤを取得する。
【０１０３】
ステップＳＴ４０７において、演算結果を、変数ＩＤをメモリアドレスとして持つアクションパラメータ１３５ａの要素に書き込む。
【０１０４】
以上のように、実施の形態２では、監視制御装置１００ｊにおいて、変数管理部１３６ｊは、メモリ（変数バッファ１３６Ａｊ）上の値や外部システム２０上にあるデータを取得して操作することで演算を行い、その結果を外部システム２０に送信したりメモリ（変数バッファ１３６Ａｊ）上に書き込み、このときプログラムの処理対象になるメモリ（変数バッファ１３６Ａｊ）上の値や外部システム２０上のデータを変数として定義し、その変数を識別するための属性の集合に識別子（変数ＩＤ）をつけて管理する。アクションパラメータ１３５ａは、変数の識別子（変数ＩＤ）と変数の現在値をペアで要素としてもつ配列である。演算部１３３は、アクション１２０ａの実行前にジョブに含まれるすべてのアクション１２０ａに関するアクションパラメータ１３５ａから変数の属性を取得し、その属性を使って変数の現在値を取得しアクションパラメータ１３５ａへ格納する。また、演算部１３３は、すべてのアクション１２０ａの実行が完了した後、演算結果をアクションパラメータ１３５ａから取り出し、属性に従って現在値を更新する。これにより、アクション１２０ａの実行に必要なパラメータについて、変数種別に関わらず固定長の識別子（変数ＩＤ）をアクションパラメータ１３５ａ内に保持するため、アクション１２０ａの実行時に必要なメモリを削減することができる。また、アクションパラメータ１３５ａ（配列）における要素のサイズ（データ長）を均等にできるため、配列の要素インデックスを指定した検索を高速に行うことができ、アクション１２０ａの実行性能を向上できる。すなわち、アクションパラメータ１３５ａを調整（例えば、最適化）し要素のサイズを均一にすることができるので、実施の形態１に比べて、より省メモリ且つより高性能な監視制御システム１００ａｊを構築できる。
【０１０５】
実施の形態３．
次に、実施の形態３にかかる監視制御装置について説明する。以下では、実施の形態１と異なる部分を中心に説明する。
【０１０６】
実施の形態３では、例外処理やタイムアウトなどアクションの実行状態を監視することで、実施の形態１に比べて、より信頼性の高いシステムの構築を目指す。
【０１０７】
ＵＮＩＸ（登録商標）やＭｉｃｒｏｓｏｆｔ社Ｗｉｎｄｏｗｓ（登録商標）など一般的なオペレーティングシステム（ＯＳ）では、シグナルと呼ばれるプロセス間通信の手法がある。シグナルが送信された際、ＯＳは、宛先プロセスの正常な処理の流れに割り込む。受信プロセスがシグナルハンドラを登録しておけば、シグナル受信時にそのルーチンが実行される。シグナルは、ゼロ除算やセグメンテーション違反といったプログラムの例外が発生した場合にも送信される。また、タイムアウトもシグナル同様にハンドラを登録しておけば、処理が割りこまれて実行される。Ｗｉｎｄｏｗｓ（登録商標）では、Ｗｉｎ３２  ＡＰＩである「ＷａｉｔＦｏｒＳｉｎｇｌＯｂｊｅｃｔ（）」を使った方法が知られている。ＵＮＩＸ（登録商標）では、関数「ａｌａｒｍ（）」を使って、シグナルＳＩＧＡＬＲＭを発生させ、関数「ｓｉｇｎａｌ（）」で登録したハンドラを起動する方法が使われる。
【０１０８】
図１８は、監視制御装置１００ｋの機能構成例（監視制御システム１００ａｋの構成例）である。
【０１０９】
プラグイン管理部１３２ｋは、例外監視手段１３２Ａｋ及び実行時間監視手段１３２Ｂｋを有する。
【０１１０】
例外監視手段１３２Ａｋは、プラグイン１２０が例外処理を発生しないか監視する。例外監視手段１３２Ａｋは、アクション１２０ａの動作を監視し監視制御装置１００ｋで定義済みの例外処理を捕捉する。例外監視手段１３２Ａｋは、監視結果をプラグイン管理部１３２ｋに供給する。例えば、例外監視手段１３２Ａｋは、定義済みの例外処理を捕捉した場合、その旨の監視結果をプラグイン管理部１３２ｋに供給する。
【０１１１】
実行時間監視手段１３２Ｂｋは、プラグイン１２０を起動後に、アクション１２０ａが、指定された時間内に終了するかを監視する。すなわち、実行時間監視手段１３２Ｂｋは、指定された時間が経過してもアクション１２０ａの実行が完了していないか否かを監視する。実行時間監視手段１３２Ｂｋは、監視結果をプラグイン管理部１３２ｋに供給する。例えば、実行時間監視手段１３２Ｂｋは、指定された時間が経過してもアクション１２０ａの実行が完了していない場合、その旨の監視結果をプラグイン管理部１３２ｋに供給する。
【０１１２】
プラグイン管理部１３２ｋは、例外監視手段１３２Ａｋ及び実行時間監視手段１３２Ｂｋの監視結果に応じて、アクション１２０ａの動作に異常が発生しているか否かを判断する。プラグイン管理部１３２ｋは、例えば、第１の条件と第２の条件との少なくとも一方が成立する場合、アクション１２０ａの動作に異常が発生していると判断し、第１の条件と第２の条件とのいずれも成立しない場合、アクション１２０ａの動作に異常が発生していないと判断する。第１の条件は、プラグイン１２０が監視制御装置１００ｋで定義済みの例外処理を発生していることである。第２の条件は、指定された時間が経過してもアクション１２０ａの実行が完了していないことである。
【０１１３】
プラグイン管理部１３２ｋは、アクション１２０ａの動作に異常が発生している場合、直ぐにアクション１２０ａの実行を停止し、予め割り付けられているユーザ定義の異常処理を実行し、実行終了後にアクションパラメータ１３５ａに書き込まれた値を破棄する。
【０１１４】
例外監視手段１３２Ａｋ及び実行時間監視手段１３２Ｂｋでは、前述したようにシグナルを使って実現できるのも明らかだが、プラグイン１２０側で起動時に乱数を作り実行中に指定された時間で更新する方法でも実現することができる。
【０１１５】
図１９はこの手順を示したフローチャートである。プラグイン１２０がアクション１２０ａの実行により起動されることでこのフローは開始する。
【０１１６】
ステップＳＴ５０１では、プラグイン１２０が乱数を生成する。
ステップＳＴ５０２では、プラグイン１２０の処理を行う。
【０１１７】
ステップＳＴ５０３では、指定された時間を経過したか否かを判断する。指定された時間を経過していない（ステップＳ５０３で「Ｎｏ」の）場合、処理をステップＳＴ５０２へ戻し、指定された時間を経過している（ステップＳ５０３で「Ｙｅｓ」の）場合、処理をステップＳＴ５０４へ進める。
【０１１８】
ステップＳＴ５０４では、プラグイン１２０が乱数を更新する。
【０１１９】
ステップＳＴ５０５では、プラグイン１２０が更新した乱数をホスト１３０（図２参照）が読み込み、値が更新されたか判断する。値が更新されている（ステップＳＴ５０５で「Ｙｅｓ」の）場合、処理をステップＳＴ５０２へ戻し、値が更新されていない（ステップＳ５０５で「Ｎｏ」の）場合、処理をステップＳＴ５０６へ進める。
【０１２０】
ステップＳＴ５０６では、プラグイン１２０が、例外処理を実行する。
【０１２１】
このように、ホスト１３０では、指定された周期でプラグイン１２０の乱数を監視する。例えば、ホスト１３０は、乱数の前回の値を記憶しておき、乱数の現在の値を取得したら乱数の現在の値と前回の値とを比較する。ホスト１３０は、その比較結果に応じて、乱数が前回の値と変わっていなかったと判断した場合には、アクション１２０ａの動作に異常が発生しているものと判断されるので、プラグイン１２０の例外ハンドラ（ユーザ定義の異常処理）を起動する。
【０１２２】
なお、プラグイン１２０の例外ハンドラは、例えば、プラグイン１２０の登録時に登録しておく。このとき、ハンドルを登録するのではなく共通の関数を定義しておいてもよい。例えば、図７のアクションに「ＥｘｃｅｐｔｉｏｎＨａｎｄｌｅｒ（）」という名前の関数を定義することでも実現できる。
【０１２３】
以上のように、実施の形態３では、監視制御装置１００ｋにおいて、例外監視手段１３２Ａｋが、アクション１２０ａの動作を監視し、監視制御装置１００ｋで定義済みの例外処理を捕捉する。実行時間監視手段１３２Ｂｋが、指定された時間が経過してもアクション１２０ａの実行が完了していないか否かを監視する。プラグイン管理部１３２ｋは、例外監視手段１３２Ａｋ及び実行時間監視手段１３２Ｂｋの監視結果に応じて、アクション１２０ａの動作に異常が発生したか否かを判断する。プラグイン管理部１３２ｋは、アクション１２０ａの動作に異常が発生している場合、直ぐにアクション１２０ａの実行を停止し、予め割り付けられているユーザ定義の異常処理を実行し、実行終了後にアクションパラメータ１３５ａに書き込まれた値を破棄する。これにより、プラグインの動作の異常を監視でき、監視制御システムに損害を与えるプラグインの実行を抑制することができるので、監視制御システムの信頼性を向上できる。すなわち、例外処理やタイムアウトなどアクションの実行状態を監視することができるので、実施の形態１に比べて、より信頼性の高いシステムを構築することができる。
【産業上の利用可能性】
【０１２４】
以上のように、本発明にかかる監視制御装置は、機器の監視制御に有用である。
【符号の説明】
【０１２５】
２０  外部システム、３０  デバイス、４０  設定用パソコン、  １００，１００ｊ，１００ｋ  監視制御装置。
【図１】
0005832703.tif 000002
【図２】
0005832703.tif 000003
【図３】
0005832703.tif 000004
【図４】
0005832703.tif 000005
【図５】
0005832703.tif 000006
【図６】
0005832703.tif 000007
【図７】
0005832703.tif 000008
【図８】
0005832703.tif 000009
【図９】
0005832703.tif 000010
【図１０】
0005832703.tif 000011
【図１１】
0005832703.tif 000012
【図１２】
0005832703.tif 000013
【図１３】
0005832703.tif 000014
【図１４】
0005832703.tif 000015
【図１５】
0005832703.tif 000016
【図１６】
0005832703.tif 000017
【図１７】
0005832703.tif 000018
【図１８】
0005832703.tif 000019
【図１９】
0005832703.tif 000020