(57)【要約】【課題】システム稼働中にコントローラの任意のメモリ領域の値を強制的に書き換えると共に、システム稼働を安定して継続できるようにする。【解決手段】支援装置８０は、任意のプログラムのソースコードをコンパイルして機械語オブジェクトに変換するコンパイル部８１を有する。コントローラ９０は、機械語オブジェクトを実行するプログラム実行部９１、強制設定値が書き込まれたメモリアドレスが登録される強制設定アドレス記憶部９２等を有する。プログラム実行部９１は、機械語オブジェクトにおける所定の命令を実行する際に、該所定の命令によるアクセス先アドレスが、上記強制設定アドレス記憶部９２に登録されている場合には、該アクセス先アドレスへのアクセスを実行しない。【選択図】図１２
2017142794.tif 000002
【特許請求の範囲】
【請求項１】
支援装置とコントローラを有するプログラマブルコントローラシステムであって、
前記支援装置は、
任意のプログラムのソースコードをコンパイルして機械語オブジェクトに変換するコンパイル手段を有し、
前記コントローラは、
前記機械語オブジェクトを実行するプログラム実行手段と、
強制設定値が書き込まれたメモリアドレスが登録される強制設定アドレス記憶手段とを有し、
前記プログラム実行手段は、前記機械語オブジェクトにおける所定の命令を実行する際に、該所定の命令によるアクセス先アドレスが、前記強制設定アドレス記憶手段に登録されている場合には、該アクセス先アドレスへのアクセスを実行しない、あるいは該アクセス先アドレスへ前記強制設定値を書き込むことを特徴とするプログラマブルコントローラシステム。
【請求項２】
前記支援装置の前記コンパイル手段は、前記任意のプログラムのソースコードを機械語オブジェクトに変換する際に、書込み命令に関しては所定の機械語を追加生成し、
前記コントローラの前記プログラム実行手段は、前記機械語オブジェクトを実行する際、該機械語オブジェクトにおける前記書込み命令を実行する際に前記所定の機械語を実行することで、該書込み命令のアクセス先アドレスが、前記強制設定アドレス記憶手段に登録されている場合には、該書込み命令による該アクセス先アドレスへの書き込みを実行しないことを特徴とする請求項１記載のプログラマブルコントローラシステム。
【請求項３】
前記支援装置または他装置は、
任意に指定させた前記メモリアドレスと前記強制設定値を、前記コントローラに通知する設定手段を有し、
前記コントローラは、前記通知されたメモリアドレスを前記強制設定アドレス記憶手段に登録すると共に、前記通知された強制設定値を該通知されたメモリアドレスの記憶領域に書き込む強制設定管理手段を更に有することを特徴とする請求項１または２記載のプログラマブルコントローラシステム。
【請求項４】
前記支援装置または他装置は、
前記コンパイルの際に前記ソースコードの各変数に割り当てられたメモリアドレスが、記憶される変数−アドレス記憶手段を更に有し、
前記設定手段は、前記ソースコード中の各変数のうちの任意の変数を指定させると共に任意の強制設定値を指定させ、該任意に指定された変数に対応するメモリアドレスを前記変数−アドレス記憶手段から取得して、これらを前記任意に指定させた前記メモリアドレスと前記強制設定値として前記コントローラに通知することを特徴とする請求項３記載のプログラマブルコントローラシステム。
【請求項５】
前記強制設定管理手段は、前記通知されたメモリアドレスが既に前記強制設定アドレス記憶手段に登録されている場合には、前記通知されたメモリアドレスを前記強制設定アドレス記憶手段に登録することなく、前記通知された強制設定値を該通知されたメモリアドレスの記憶領域に上書き格納することを特徴とする請求項４記載のプログラマブルコントローラシステム。
【請求項６】
前記他装置は、前記コントローラの動作をモニタする機能を有するＨＣＩ装置であることを特徴とする請求項３記載のプログラマブルコントローラシステム。
【請求項７】
前記支援装置の前記コンパイル手段は、前記任意のプログラムのソースコードを機械語オブジェクトに変換する際に、書込み命令に対応する機械語命令群に強制代入処理へのジャンプ命令を付加し、更に強制代入処理情報一覧に該ジャンプ命令の位置と該書込み命令の書込み先アドレスを登録し、
前記コントローラは、
前記支援装置が生成した前記機械語オブジェクトと前記強制代入処理情報一覧を取得すると、前記強制代入処理情報一覧に基づいて、前記機械語オブジェクトにおける全ての前記強制代入処理へのジャンプ命令を何もしない命令に置き換えることで、その後、前記支援装置から所定の通知があるまでは前記強制代入処理を実行させない初期状態形成手段を更に有することを特徴とする請求項１記載のプログラマブルコントローラシステム。
【請求項８】
前記支援装置は、任意のときに任意のメモリアドレスと強制設定値を前記所定の通知として前記コントローラに通知する設定手段を更に有し、
前記コントローラは、該所定の通知と前記強制代入処理情報一覧に基づいて、前記機械語オブジェクトにおける該当位置の前記何もしない命令を前記強制代入処理へのジャンプ命令に戻す強制設定制御手段を更に有することを特徴とする請求項７記載のプログラマブルコントローラシステム。
【請求項９】
前記強制代入処理は、前記強制設定値をアキュムレータに格納する処理であり、
前記所定の命令は、該アキュムレータの格納データをメモリの前記アクセス先アドレスに転送・記憶する処理であることを特徴とする請求項８記載のプログラマブルコントローラシステム。
【請求項１０】
機械語オブジェクトを実行するプログラム実行手段と、
強制設定値が書き込まれたメモリアドレスが登録される強制設定アドレス記憶手段とを有し、
前記プログラム実行手段は、前記機械語オブジェクトにおける所定の命令を実行する際に、該所定の命令によるアクセス先アドレスが、前記強制設定アドレス記憶手段に登録されている場合には、該アクセス先アドレスへのアクセスを実行しないことを特徴とするコントローラ。
【請求項１１】
前記機械語オブジェクトは、支援装置または自装置において任意のプログラムのソースコードを機械語オブジェクトに変換する際に書込み命令に関しては所定の機械語を追加生成することで生成された機械語オブジェクトであり、
前記プログラム実行手段は、前記機械語オブジェクトを実行する際、該機械語オブジェクトにおける前記書込み命令を実行する際に前記所定の機械語を実行することで、該書込み命令のアクセス先アドレスが、前記強制設定アドレス記憶手段に登録されている場合には、該書込み命令による該アクセス先アドレスへの書き込みを実行しないことを特徴とする請求項１０記載のコントローラ。
【請求項１２】
外部のコンピュータ装置から通知されてきた、該コンピュータ装置において任意に指定させたメモリアドレスと強制設定値を受信すると、該受信したメモリアドレスを前記強制設定アドレス記憶手段に登録すると共に、該受信した強制設定値を該受信したメモリアドレスの記憶領域に書き込む強制設定管理手段を更に有することを特徴とする請求項１０
または１１記載のコントローラ。
【請求項１３】
任意のプログラムのソースコードをコンパイルして機械語オブジェクトに変換する手段であって、前記任意のプログラムのソースコードを機械語オブジェクトに変換する際に、書込み命令に関しては所定の機械語を追加生成することで、機械語オブジェクトを生成するコンパイル手段と、
該コンパイル手段で生成した機械語オブジェクトをコントローラに転送する転送手段とを有し、
該コンパイル手段で生成した機械語オブジェクトを前記コントローラで実行させることで、該機械語オブジェクトにおける前記書込み命令を実行する際に前記所定の機械語を実行させることによって、該書込み命令のアクセス先アドレスが、該コントローラの所定の記憶手段に登録されている場合には、該書込み命令による該アクセス先アドレスへの書き込みを実行させないようにすることを特徴とする支援装置。
【請求項１４】
任意に指定させたメモリアドレスと強制設定値を、前記コントローラに通知する設定手段を更に有し、
前記コントローラにおいて該通知したメモリアドレスを前記所定の記憶手段に登録させると共に該通知した強制設定値を該通知したメモリアドレスの記憶領域に書き込ませることを特徴とする請求項１３記載の支援装置。
【請求項１５】
前記コンパイルの際に前記ソースコードの各変数に割り当てられたメモリアドレスが、記憶される変数−アドレス記憶手段を更に有し、
前記設定手段は、前記ソースコード中の各変数のうちの任意の変数を指定させると共に任意の強制設定値を指定させ、該任意に指定された変数に対応するメモリアドレスを前記変数−アドレス記憶手段から取得して、これらを前記任意に指定させた前記メモリアドレスと前記強制設定値として前記コントローラに通知することを特徴とする請求項１４記載の支援装置。
【請求項１６】
任意に指定させたメモリアドレスと強制設定値を、コントローラに通知する設定手段を有し、
前記コントローラにおいて該通知したメモリアドレスを所定の記憶手段に登録させると共に該通知した強制設定値を該通知したメモリアドレスの記憶領域に書き込ませることで、前記コントローラにおいて機械語オブジェクトにおける所定の命令を実行する際に、該所定の命令によるアクセス先アドレスが、前記所定の記憶手段に登録されている場合には、該アクセス先アドレスへのアクセスを実行させないようにすることを特徴とするＨＣＩ装置。
【請求項１７】
支援装置におけるコンパイル処理の際にソースコードの各変数に割り当てられたメモリアドレスが、記憶される変数−アドレス記憶手段を更に有し、
前記設定手段は、前記ソースコード中の各変数のうちの任意の変数を指定させると共に任意の強制設定値を指定させ、該任意に指定された変数に対応するメモリアドレスを前記変数−アドレス記憶手段から取得して、これらを前記任意に指定させた前記メモリアドレスと前記強制設定値として前記コントローラに通知することを特徴とする請求項１６記載のＨＣＩ装置。
【請求項１８】
支援装置と稼動系コントローラと待機系コントローラを有する二重化コントローラシステムであって、
前記支援装置は、
任意のプログラムのソースコードをコンパイルして機械語オブジェクトに変換するコンパイル手段を有し、
前記稼動系コントローラは、
前記機械語オブジェクトを実行するプログラム実行手段と、
強制設定値が書き込まれたメモリアドレスが登録される強制設定アドレス記憶手段と、
該強制設定アドレス記憶手段を前記待機系コントローラに通知してバックアップ版として保持させる通知手段とを有し、
前記プログラム実行手段は、前記機械語オブジェクトにおける所定の命令を実行する際に、該所定の命令によるアクセス先アドレスが、前記強制設定アドレス記憶手段に登録されている場合には、該アクセス先アドレスへのアクセスを実行しない、あるいは該アクセス先アドレスへ前記強制設定値を書き込むことを特徴とする二重化コントローラシステム。
【請求項１９】
前記強制設定アドレス記憶手段は任意の番号を保持し、
前記稼動系コントローラは、前記強制設定アドレス記憶手段を更新する毎に前記番号を更新する第１更新手段を更に有し、
前記待機系コントローラは、前記通知手段により通知された強制設定アドレス記憶手段の前記番号が、自コントローラが保持する前記バックアップ版の番号と異なる場合に、該通知された強制設定アドレス記憶手段を新たなバックアップ版とする第２更新手段を有することを特徴とする請求項１８記載の二重化コントローラシステム。
【請求項２０】
前記待機系コントローラの前記第２更新手段は、前記通知手段により通知された強制設定アドレス記憶手段の前記番号が、自コントローラが保持する前記バックアップ版の番号と異なる場合には、更に、自己が保持する機械語オブジェクトを変更することを特徴とする請求項１９記載の二重化コントローラシステム。
【請求項２１】
前記自己が保持する機械語オブジェクトを変更する処理は、該機械語オブジェクトの強制代入処理へのジャンプ命令を何もしない命令に置き換える処理、あるいは、該何にしない命令を該強制代入処理へのジャンプ命令に置き換える処理であることを特徴とする請求項２０記載の二重化コントローラシステム。
【請求項２２】
前記支援装置の前記コンパイル手段は、前記任意のプログラムのソースコードを機械語オブジェクトに変換する際に、書込み命令に関しては強制代入処理へのジャンプ命令を付加し、更に強制代入処理情報一覧に該ジャンプ命令の位置と該書込み命令の書込み先アドレスを登録し、
前記稼動系コントローラは、
前記支援装置が生成した前記機械語オブジェクトと前記強制代入処理情報一覧を取得すると、前記強制代入処理情報一覧に基づいて、前記機械語オブジェクトにおける全ての前記強制代入処理へのジャンプ命令を何もしない命令に置き換えることで、その後、前記支援装置から所定の通知があるまでは前記強制代入処理を実行させない初期状態生成手段を更に有することを特徴とする請求項１８記載の二重化コントローラシステム。
【請求項２３】
前記稼動系コントローラの前記初期状態生成手段は、前記何もしない命令への置き換え後の機械語オブジェクトと前記強制代入処理情報一覧を前記待機系コントローラに送信して保持させることを特徴とする請求項２２記載の二重化コントローラシステム。
【請求項２４】
前記支援装置の前記設定手段は、前記メモリアドレスと強制設定値を前記所定の通知として前記稼動系コントローラに通知し、
前記稼動系コントローラの第１更新手段は、該通知に応じて前記強制設定アドレス記憶手段を更新すると共に、該所定の通知と前記強制代入処理情報一覧に基づいて、前記機械語オブジェクトにおける該当位置の前記何もしない命令を前記強制代入処理へのジャンプ命令に戻すことを特徴とする請求項２２または２３記載の二重化コントローラシステム。
【請求項２５】
前記強制代入処理は、前記強制設定値をアキュムレータに格納する処理であり、
前記書込み命令は、該アキュムレータの格納データをメモリの前記書込み先アドレスに転送・記憶する処理であることを特徴とする請求項２４記載の二重化コントローラシステム。
【請求項２６】
前記待機系コントローラの前記第２更新手段は、前記通知手段により通知された強制設定アドレス記憶手段の前記番号が、自コントローラが保持する前記バックアップ版の番号と異なる場合に、該相違する部分のアドレスに対応する該当位置を前記強制代入処理情報一覧から求めて、前記機械語オブジェクトにおける前記該当位置の前記何もしない命令を前記強制代入処理へのジャンプ命令に戻すことを特徴とする請求項２４または２５記載の二重化コントローラシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラマブルコントローラシステムに関する。
【背景技術】
【０００２】
ソフトウエア開発でデバッグを実施する時、プログラム動作の確認のため、変数の値を書き換えて実施することがある。この一例として、特許文献１に開示されているように内部変数とプログラムの一部を書き換える方法がある。
【０００３】
また、プラントシステムの稼働中に一部の計器などが故障して正常な値が取り込めない状態では、システムの正常稼働に影響が発生するため、一時的に値を強制的に書き換えて、システムの稼働を継続することが求められる。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開2010-122824号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
上記のように稼動中に正常な値が取り込めない場合、オペレータが監視画面から変数の値の書き換えを実施する必要がある。しかし、上記特許文献１では、エンジニアリングツールを使用しており、オペレータは、コントローラ内で動作しているプログラムには詳しくないため、エンジニアリングツールを扱って値を変更することは困難である。
【０００６】
監視画面から強制的に変数の値を設定する場合、オペレータが監視対象の変数に対して値を設定するため、エンジニアリングツールの回路図（プログラム）による接続点を指定する方法では、運用が困難である。
【０００７】
また、上記特許文献１の従来技術では、演算結果を一時的に内部変数に書き出し、その値を読み出して、次の演算結果の入力とするコードを生成する。強制的に値を書き換える場合は、その内部変数に対して書き込むコードをNOPに置き換え、内部変数に値を設定する仕組みになっている。そのため、接続点毎に一時変数（内部変数）が必要であり、メモリを余分に消費している。
【０００８】
また、特許文献１の従来技術では、一時変数に対して値を設定するため、複数個所で変数に対する書き込みを実施しているプログラムの場合、対象の変数への書き込みする複数の接続点に対して値を設定する必要があり、簡単にユーザが指定した変数に対して強制的に値を設定することができない。
【０００９】
ところで、ここで、上述したように、プラントシステムの稼働中に一部の計器などが故障して正常な値が取り込めない状態になったら、この値を強制的に書き換えることで対応する。例えば、システム稼動中、コントローラには各計器（センサなど）の計測値が入力され、各計器に対して予め割り当てられているメモリ領域に、計測値が格納される(データ収集する)。この様なデータ収集処理は例えば定周期で実行され、以って定周期で上記各メモリ領域の格納データが更新されることになる。
【００１０】
稼動中に任意の計器が故障等すると、故障した計器に対応するメモリ領域には異常値が格納されることになり、以ってこのメモリ領域の値を用いる何らかの処理に、悪影響が生じる可能性がある。これを避ける為に上記のように値を強制的に書き換えることで、システム稼働を継続できる。これは、例えば、故障した計器に対応するメモリ領域に、所定の設定値を書き込むものである。
【００１１】
しかしながら、これによってシステム稼働を継続することで、上記定周期のデータ収集処理も続行されるので、上記故障した計器に対応するメモリ領域には再び異常値が格納されてしまう（上記設定値に上書きされてしまう）ことになる。
【００１２】
本発明の課題は、システム稼働中にコントローラの任意のメモリ領域の値を強制的に書き換えると共に、この強制設定されたメモリ領域へのその後の書込みを禁止でき、以ってシステム稼働を安定して継続できるプログラマブルコントローラ、その支援装置、コントローラ、二重化コントローラシステムなどを提供することである。
【課題を解決するための手段】
【００１３】
本例のプログラマブルコントローラは、例えば、支援装置とコントローラを有する構成であって、それぞれが例えば以下の各手段を有する。
支援装置は、任意のプログラムのソースコードをコンパイルして機械語オブジェクトに変換するコンパイル手段を有する。
【００１４】
コントローラは、前記機械語オブジェクトを実行するプログラム実行手段と、強制設定値が書き込まれたメモリアドレスが登録される強制設定アドレス記憶手段とを有する。
そして、前記プログラム実行手段は、前記機械語オブジェクトにおける所定の命令を実行する際に、該所定の命令によるアクセス先アドレスが、前記強制設定アドレス記憶手段に登録されている場合には、該アクセス先アドレスへのアクセスを実行しない。
【発明の効果】
【００１５】
本発明のプログラマブルコントローラ、その支援装置、コントローラ、二重化コントローラシステムなどによれば、システム稼働中にコントローラの任意のメモリ領域の値を強制的に書き換えると共に、この強制設定されたメモリ領域へのその後の書込みを禁止でき、以ってシステム稼働を安定して継続できる。
【図面の簡単な説明】
【００１６】
【図１】実施例１のプログラマブルコントローラシステムの構成図である。
【図２】（ａ）はソースコード、（ｂ）は変数−アドレス対応表、（ｃ）は中間コードの具体例である。
【図３】（ａ）は強制設定画面、（ｂ）は強制設定値送信データ、（ｃ）は強制ＯＮアドレス一覧の具体例である。
【図４】コントローラにおける強制設定処理の一例を示すフローチャート図である。
【図５】コントローラにおける特定の機械語オブジェクトによる処理の一例を示すフローチャート図である。
【図６】実施例２のプログラマブルコントローラシステムの構成図である。
【図７】機械語オブジェクトの具体例を示す図である。
【図８】（ａ）は強制代入処理情報一覧、（ｂ）は強制ＯＮアドレス一覧の具体例である。
【図９】実施例２のシステム全体の概略処理フロー図である。
【図１０】強制代入処理のフローチャート図である。
【図１１】バックエンドコンパイラの処理フローチャート図である。
【図１２】本例のプログラマブルコントローラシステムの機能ブロック図である。
【図１３】本例の二重化コントローラシステムの構成図である。
【図１４】（ａ）は実施例３の強制ＯＮアドレス一覧、（ｂ）は強制代入一覧情報の具体例である。
【図１５】実施例３の機械語オブジェクトの具体例である。
【図１６】実施例３の強制代入処理フローチャート図である。
【図１７】実施例３の処理フローチャート図（その１）である。
【図１８】実施例３の処理フローチャート図（その２）である。
【図１９】実施例３の処理フローチャート図（その３）である。
【図２０】実施例３の処理フローチャート図（その４）である。
【図２１】本例の二重化コントローラシステムの機能ブロック図である。
【発明を実施するための形態】
【００１７】
以下、図面を参照して本発明の実施の形態について説明する。
まず、図１〜図５を参照して実施例１について説明する。
図１は、実施例１のプログラマブルコントローラシステムの構成図である。
【００１８】
図示の例のプログラマブルコントローラは、支援装置１０、コントローラ２０等を有し、更にＨＣＩ（Human Communication Interface）装置３０を有していてもよい。ＨＣＩ装置３０は、例えばプログラマブル表示器などであるが、この例に限らない。尚、支援装置１０、コントローラ２０、ＨＣＩ装置３０は、ネットワーク１に接続されており、ネットワーク１を介して相互にデータ送受信可能となっている。尚、ネットワーク１は、１つのネットワークとは限らず、複数のネットワークより成るものであっても構わない。
【００１９】
また、尚、コントローラは、ＰＬＣの制御装置であってもよいし、ＤＣＳ（分散制御システム；distributed control system）の制御装置であってもよい。
支援装置１０は、ユーザにプログラム開発環境を提供するコンピュータ装置（ローダ等）である。支援装置１０は、所定のアプリケーションプログラムをコンピュータで実行することで実現される各種処理機能等を有する。これは、例えば、ユーザに任意のプログラムのソースコード１３を記述させる為のユーザインターフェース機能を有し、ユーザが作成したソースコード１３をターゲット上で動作する機械語オブジェクト１５に変換するコンパイラ（フロントエンドコンパイラ１１、バックエンドコンパイラ１２）機能を有し、生成された機械語オブジェクト１５をターゲットに送信する通信機能を有するものとなる。これら各機能は基本的には既存の一般的な機能であるので、コンパイラ以外は特に図示せず、上記簡単な説明のみとする。
【００２０】
上記プログラム開発環境上でユーザによって記述されたソースコード１３は、フロントエンドコンパイラ１１によって中間コード１４に変換されて例えばファイルとして保存される。バックエンドコンパイラ１２は、生成された中間コード１４を、ターゲット上で動作する機械語オブジェクト１５に変換する。変換された機械語オブジェクト１５は例えばファイルとして保存される。尚、ターゲットとは、例えばコントローラ２０である。この機械語オブジェクト１５のファイルは、上記不図示の送信機能によりターゲットに送信される。
【００２１】
また、上記コンパイラ（フロントエンドコンパイラ１１、バックエンドコンパイラ１２）は、上記変換処理に伴って、上記ソースコード１３に記述されている各変数に対して任意のメモリアドレスを割り当てる。これは、例えば、コントローラ２０のメモリ２２に係わるメモリアドレスを割り当てるものであり、この処理も既存機能であるので、特に詳細には説明しない。そして、この様な変数へのアドレス割当て結果を、変数−アドレス対応表１６に記録しておく。
【００２２】
ここで、図２（ａ）に、ソースコード１３の一部について一例を示す。
また、図２（ｂ）には、図２（ａ）の例に応じた変数−アドレス対応表１６の具体例を示す。
【００２３】
図２（ａ）には、入力側の変数として図示の変数V000と変数V0001があり、出力側の変数として図示の変数V002がある、ＡＤＤ命令を示している。そして、これら３つの変数に対して、コンパイル処理の際に例えば任意のメモリアドレスが割り当てられ、この割当て結果が例えば図２（ｂ）に示すものとなる。この例では、例えば変数V000に対してはメモリＭの65550番地が割り当てられていることになる。尚、メモリＭとは本例ではコントローラ２０のメモリ２２のことであるものとするが、この例に限らない。尚、図示のＷＩは、データ型を示すものであり、ここでは特に関係しないので、特に説明しないものとする。
【００２４】
図２（ｂ）に示すように、変数−アドレス対応表１６は、ソースコード１３上の各変数の変数名４１に対応付けて、その変数に対して割り当てられたメモリのアドレス４２が登録されたものとなる。尚、この様な変数−アドレス対応表１６の生成機能自体は、既存機能であるので、これ以上詳細には説明しないものとする。
【００２５】
また、中間コード１４の一例を図２（ｃ）に示す。図２（ｃ）に示すように、中間コード１４は、例えば、演算子とオペランドを一組とした、仮想的なターゲットを想定したニーモニック言語などである。尚、１つの中間コードは、バックエンドコンパイラ１２により、それと等価な複数の機械語命令に変換される。
【００２６】
図２（ｃ）の例では、演算子（中間コード命令）として、ＬＤ、ＡＤＤ，ＳＴの各命令が示され、各演算子に係るオペランド（メモリアドレス）が示されている。尚、ここでは、演算結果等を一時的に格納するレジスタを、アキュムレータと記すものとする。
【００２７】
図２（ｃ）の例の中間コードでは、ＬＤ命令によって、そのオペランドで示されたアドレス（メモリＭの65550番地；以下、メモリＭについては省略して記すものとする）の値を、アキュムレータに取り込む。次にＡＤＤ命令によって、そのオペランドに示されるアドレス（65551番地）の格納データの値に、アキュムレータの値を加算し、この加算結果をアキュムレータに格納する。その後、ＳＴ命令によって、そのオペランドで示されたアドレス（65552番地）に、アキュムレータの値を書き込む。
【００２８】
一般的に、メモリに対して何らかの値を書き込む中間コード命令（機械語オブジェクトも同様）の場合、書込み先メモリのアドレス、書き込む値、そのデータ型の情報が存在する。中間コードの場合には、メモリへの書き込みを実施する演算子として、例えば図２（ｃ）に示すＳＴ命令がある。ＳＴ命令は、上記の通り、上記アキュムレータに格納された値を、オペランドで示しているアドレスに書き込む動作になる。
【００２９】
ここで、上記背景技術で述べたような、プラントシステムの稼働中に一部の計器などが故障して正常な値が取り込めない状態となったことで、仮に上記“65550番地”の値が、異常な値となってしまったとした場合、この異常値に基づく上記加算結果を格納する65552番地の値も、異常な値となる。この為、その後、65552番地の値を読み出して不図示の何らかの処理を行う命令が実行されると、システムの正常稼働に影響が発生する。この為、この例では例えば、65552番地の格納データ値を強制的に書き換えて、システムの稼働を継続することが求められる。
【００３０】
しかしながら、この様に強制的に値を書き換えても、システムの稼働が継続されることで、その後に例えば上記ＳＴ命令が実行されると、65552番地に関して上記強制設定値に異常値が上書きされてしまうことになる。この為、その値を強制的に書き換えたメモリアドレスに関しては、その後、通常処理による書き込みが実施されないようにする仕組みが、求められる。尚、読出し命令が実行されても上記“異常値が上書きされてしまう”事態は起こり得ないので、読出し命令は対象とはならない。対象となるのは、上記ＳＴ命令のような、値を書き換えてしまう命令（書込み命令）である。
【００３１】
上述したことから、本手法では、強制設定値が設定されたメモリアドレスに関しては、その後、このメモリアドレスにアクセスする書込み命令は実行されないようにする。但し、強制設定値自体を、何らかの理由により変更したい場合があることを想定した場合、値の変更を一切禁止することは、望ましくない。
【００３２】
これより、本手法では、後に図３を参照して説明するように、支援装置１０またはＨＣＩ装置３０においてユーザが変数と設定値を指定するだけで、異常が生じたメモリアドレスの格納データを強制的に上記ユーザ設定値に書き換えることを可能にすると共に、その際に例えば後述する図４の処理によりこの強制設定対象のメモリアドレスをコントローラ２０側で強制ＯＮアドレス一覧２４に登録させる。この様な強制ＯＮアドレス一覧２４への登録処理の具体例を、図４のフローチャート図に示し、後に説明する。
【００３３】
また、支援装置１０におけるプログラム（ソースコード１３）のコンパイルの際に、所定の命令（書込み命令）に関しては所定の処理（例えば後述する図５の処理）を実現する機械語も追加する形で機械語オブジェクトを生成する。所定の命令を実行する際には例えば後述する図５の処理が実行され、その際に上記強制ＯＮアドレス一覧２４が参照されることで、その値を強制的に書き換えたメモリアドレスに関しては、その後、通常処理による書き込みが実施されないようにすることができる。
【００３４】
ここで、ＨＣＩ装置３０は、例えばプログラマブル表示器等であり、コントローラ２０の動作を監視（モニタリング）する為の機能等を有している。この監視機能は、例えば、コントローラ２０において何らかの異常が発生した場合、この異常に関する所定の情報（例えば異常があったメモリアドレス）などを表示する機能等（この機能自体は既存の一般的な機能であり特に説明しない）である。その際、変数−アドレス対応表１６を参照することで、異常があったメモリアドレスに対応する変数名を、表示することもできる。勿論、その為には、予め、支援装置１０からＨＣＩ装置３０へ、ソースコード１３や変数−アドレス対応表１６等を転送して保持させておく必要がある。また、この様な監視機能は、支援装置１０が備えていてもよい。
【００３５】
これより、後述する“ユーザに、ソースコード上で、強制設定を実施する変数を任意に指定させる”処理や、後述する図３（ａ）の強制設定画面５０上でユーザに任意の強制設定値を設定させる処理や、これらに基づく後述する図３（ｂ）の強制設定値送信データ６０の生成処理は、支援装置１０が実行してもよいしＨＣＩ装置３０が実行してもよい。
【００３６】
本例では、強制設定対象のメモリアドレスは、上記ＳＴ命令等の“そのオペランドが示すアドレスに値を書込む命令”（簡単の為に単に“書込み命令”と記す場合もある）の当該アドレスであるものとする。
【００３７】
そして、本例の場合には、支援装置１０においてコンパイラが“メモリへの書き込みを行う中間コード命令”を機械語オブジェクトに変換する際に、『書込み先アドレスを強制ＯＮアドレス一覧２４内に登録されている各アドレスと比較し、書込み先アドレスが強制ＯＮアドレス一覧２４に存在しない場合は、アキュムレータの値をメモリに書き込み、強制ＯＮアドレス一覧２４に存在する場合は、メモリに書き込みを実施しない』という処理を行う械語オブジェクト（強制設定用機械語オブジェクトと呼ぶものとする）を、生成する。この様な強制設定用機械語オブジェクトをコントローラ２０で実行すると、例えば後述する図５の処理が実行されるのであり、これについては後述する。
【００３８】
尚、この様な強制設定用機械語オブジェクトのベースが、予め作成されて支援装置１０に記憶されており、このベースに上記“書込み命令”の機械語オブジェクトを挿入することで、上記強制設定用機械語オブジェクトを生成するようにしてもよい。これは、後述する図５の例の場合、図示のステップＳ２６以外の処理が上記ベースに相当し、ベースではステップＳ２６の処理は存在せず、上記“書込み命令”の機械語オブジェクトがステップＳ２６の処理として挿入されることで、例えば図５に示す処理を実現する強制設定用機械語オブジェクトが生成される。勿論、これは一例であり、この例に限らない。
【００３９】
尚、“メモリへの書き込みを行う中間コード命令”が、書込み命令の一例であり、その具体例は例えばＳＴ命令、ＳＥＴ命令、ＲＥＳＥＴ命令、ＭＯＶ命令などであるが、これらの例に限らない。
【００４０】
本手法では、任意のメモリアドレスに強制設定値が設定された後に、このアドレスに書き込みが行われることを防止するので、読出し命令は考慮しなくてよく、上記の通り書込み命令が対象となる。
【００４１】
上述したように、本手法では、まず、ユーザが任意の変数と設定値を指定するだけで、異常が生じたメモリアドレスの格納データを強制的に上記ユーザ設定値に書き換えること（強制設定）を可能にすると共に、その際にこの強制設定したメモリアドレスをコントローラ２０側で強制ＯＮアドレス一覧２４に登録させる。
【００４２】
これについて、以下、図３や上記図２を参照して説明する。
尚、ここでは、上記支援装置１０で作成された任意のソースコード１３とこれをコンパイルした際に作成された上記変数−アドレス対応表１６は、ネットワーク１を介して上記ＨＣＩ装置３０に転送されて格納されてもよい。これより、以下に説明する強制設定に係る処理は、支援装置１０で行ってもよいがＨＣＩ装置３０で行ってもよい。
【００４３】
支援装置１０またはＨＣＩ装置３０において、ユーザが例えば強制設定の実行を指示すると、装置はまずソースコード１３をディスプレイに表示させる。ユーザは、表示されるソースコード上で強制設定を実施する変数（変数名など）を指定して、さらに任意の強制設定値を設定する。この強制設定値の設定は、別画面（例えば図３（ａ）に示す強制設定画面５０）で行うようにしてもよい。
【００４４】
尚、上記監視機能により、ユーザは、異常が生じたメモリアドレスに対応する変数名を把握することができ、この変数名を指定する。これにより、異常が生じたメモリアドレスについて強制設定を行うことができ、以ってシステムの稼働を継続することができる。
【００４５】
例えば図２（ａ）に示す例のソースコード１３を表示させた例で説明するならば、ユーザが例えば図示の変数V002を選択指定すると、例えば図３（ａ）に示す強制設定画面５０が表示される。
【００４６】
強制設定画面５０には、図示の変数名の入力欄５１と設定値の入力欄５２があり、初期状態で変数名の入力欄５１には上記ソースコード上で選択指定された変数名（ここではV002）が既に入力された状態となっている。この状態で、ユーザが任意の強制設定値（本例では‘100’）を上記設定値の入力欄５２に入力して、図示の「実行」ボタン５３を操作すると、支援装置１０またはＨＣＩ装置３０は、例えば図３（ｂ）に示す強制設定値送信データ６０を生成して、これを上記不図示の通信機能によりコントローラ２０へ送信する。この送信データ６０を受信したコントローラ２０は、例えば後述する図４の処理を実行する。
【００４７】
ここで、図３（ｂ）に示す例では、強制設定値送信データ６０は、アドレス６１と強制設定値６２から成る。強制設定値６２は、上記設定値の入力欄５２に入力された値である。また、アドレス６１は、上記変数名の入力欄５１に設定された変数名に対応するアドレスであり、これは変数−アドレス対応表１６を参照して取得される。上記の例では、設定される変数名はV0002であるので、図２（ｂ）の例では対応するアドレスは“65552番地”となり、これより図３（ｂ）に示す内容の強制設定値送信データ６０が、生成されることになる。
【００４８】
この様に、ユーザは、特に強制設定対象のメモリアドレスが分からなくても、ソースコード上の変数名を指定することで、強制設定対象のメモリアドレスがコントローラ２０に送られることになる。
【００４９】
尚、ＨＣＩ装置３０は、例えばプログラマブル表示器等であり、既存機能としてコントローラ２０の動作状態をモニタする機能（監視機能）等も有している。これに関して、コントローラ２０は、例えば何らかの異常を検出してこの異常に係るメモリアドレスを判定して、これをＨＣＩ装置３０に通知する等の既存機能を有している。
【００５０】
そして、ＨＣＩ装置３０は、通知された異常メモリアドレスに対応する変数名を、変数−アドレス対応表１６を参照して認識することができ、この変数名を表示することができる。これより、ユーザは、問題が生じた変数名を把握して、上記のように強制設定すべき変数名として指定すること等が可能となる。
【００５１】
一般的に、プログラマブル表示器等のユーザ（オペレータ等）は、コントローラ内で動作しているプログラムには詳しくないが、上記ＨＣＩ装置３０によれば、この様なオペレータ等であっても、問題が生じたメモリアドレスに対応する変数名を把握して、上記のように強制設定すべき変数名として指定すること等が可能となる。そして、これより、問題が生じたメモリアドレスへの強制設定が簡単に行われて、システム稼動を安定して継続できることになる。この様に、本手法によれば、オペレータ等は、変数を指定するだけで簡単に変数の値を強制的に変更できる。
【００５２】
尚、上記ＨＣＩ装置３０と同様の監視機能を、支援装置１０が備えていてもよい。
コントローラ２０は、上記強制設定値送信データ６０を受信すると、上記強制ＯＮアドレス一覧２４への登録処理を行う（後述する図４の処理など）。これについては後述するが、ここで強制ＯＮアドレス一覧２４について簡単に説明しておく。
【００５３】
図３（ｃ）に、強制ＯＮアドレス一覧２４の具体例を示す。
図示の例の強制ＯＮアドレス一覧２４は、管理番号７１と強制ＯＮメモリアドレス７２から成る。管理番号７１は、予め決められているシリアル番号（１，２，３、・・・など）である。尚、ここでは後述するインデックスは、管理番号７１に相当するものとする。
【００５４】
強制ＯＮメモリアドレス７２には、上記強制設定対象のメモリアドレスが格納されるが、初期状態では全てにＮＵＬＬが格納されている。図示の例では、強制設定対象のメモリアドレスが、これまでに図３（ｂ）に示す例の１つだけしか通知されてきていない場合を示しており、それ故に２行目以降は全て、未だＮＵＬＬのままとなっている。尚、NULLは、無効なアドレスを示す。
【００５５】
コントローラ２０は、上記強制設定値送信データ６０を受信すると、強制ＯＮアドレス一覧２４に上記強制設定対象のメモリアドレスを登録すると共に、メモリ２２における上記強制設定対象のアドレスの領域に、この強制設定値を書き込む。この処理の具体例を図４に示す。
【００５６】
図４は、コントローラ２０における強制設定処理の一例を示すフローチャート図である。尚、この処理は、例えばプログラム実行管理部２１が行うが、この例に限らない（不図示の別の機能部が実行してもよい）。
【００５７】
図４の処理では、コントローラ２０は、上記送信されてくる強制設定値送信データ６０を受信すると（ステップＳ１１）、まず、インデックスを初期値（＝１）に設定する（ステップＳ１２）。尚、受信した強制設定値送信データ６０からは、上記アドレス６１と強制設定値６２が得られることになる。アドレス６１は、強制設定対象のメモリアドレスである。
【００５８】
その後は、後述するステップＳ１４，Ｓ１５の何れかがＹＥＳとなるまでインデックスを更新（＋１インクリメント）しながらステップＳ１３〜Ｓ１６の処理を繰り返す。尚、上記の通り、インデックスは上記管理番号７１に相当するので、換言するならば、強制ＯＮアドレス一覧２４の各行を順次処理対象としながらステップＳ１３〜Ｓ１６の処理を繰り返すことになる。
【００５９】
そして、ステップＳ１４がＹＥＳになったらステップＳ１７，Ｓ１８の処理を実行し、ステップＳ１５がＹＥＳになったらステップＳ１８の処理のみを実行して、本処理を終了する。
【００６０】
すなわち、まず、強制ＯＮアドレス一覧２４から、現在のインデックスが示す行の強制ＯＮメモリアドレス７２を取得する（ステップＳ１３）。強制ＯＮメモリアドレス７２にアドレスが登録されていない場合にはＮＵＬＬが取得されることになり、図３（ｃ）の例では１行目（インデックス＝１）以外ではＮＵＬＬが取得されることになる。
【００６１】
そして、ステップＳ１３でＮＵＬＬを取得した場合には（ステップＳ１４、ＹＥＳ）ステップＳ１７へ移行し、それ以外の場合（何らかのメモリアドレスを取得した場合には（ステップＳ１４，ＮＯ）ステップＳ１５へ移行する。
【００６２】
ステップＳ１５では、ステップＳ１３で取得したメモリアドレスが、上記強制設定対象のメモリアドレス（アドレス６１）と同一であるか否かを判定し、両者が同じである場合には（ステップＳ１５，ＹＥＳ）、メモリ２２における上記強制設定対象のメモリアドレスに、上記強制設定値６２を書き込む（ステップＳ１８）。尚、この場合には、上記アドレス６１は、既に強制ＯＮアドレス一覧２４に登録済みである（以前に登録されている）ことになるので、このアドレス６１を強制ＯＮアドレス一覧２４に登録することは必要ないことになる。
【００６３】
一方、両者が異なる場合には（アドレス６１と強制ＯＮメモリアドレス７２が異なる場合には）（ステップＳ１５，ＮＯ）、インデックスを更新（＋１インクリメント）して（ステップＳ１６）、ステップＳ１３に戻る。
【００６４】
上記ステップＳ１４の判定がＹＥＳである場合すなわちステップＳ１３でＮＵＬＬを取得した場合には、強制ＯＮアドレス一覧２４において現在のインデックスが示す行の強制ＯＮメモリアドレス７２に、受信した上記強制設定対象メモリアドレスを登録する（ステップＳ１７）。更に、メモリ２２における上記強制設定対象メモリアドレスに、受信した強制設定値６２を書き込む（ステップＳ１８）。
【００６５】
尚、本例では、強制ＯＮアドレス一覧２４には、上記強制設定対象メモリアドレスが上から順に登録されるので、図４はこの例に応じた処理を示すものであり（よって、図示の例に限らない）、上記受信したアドレス６１が強制ＯＮアドレス一覧２４に未登録である場合に、ステップＳ１４の判定がＹＥＳとなることになる。
【００６６】
上記処理について、具体例を用いて説明するならば、最初はインデックス＝１であるので、図３（ｃ）の例では１行目が取得されるので、強制ＯＮメモリアドレス７２としてアドレス‘65552’が取得されることになり、以ってステップＳ１４の判定はＮＯとなる。そして、仮に、上記強制設定対象メモリアドレス（アドレス６１）が‘65552’であった場合には、ステップＳ１５がＹＥＳとなる。一方、上記強制設定対象メモリアドレスが‘65552’以外であった場合には、ステップＳ１５はＮＯとなり、ステップＳ１６によってインデックス＝２となってステップＳ１３に戻ると、図３（ｃ）の例では２行目はＮＵＬＬであるので、今度はステップＳ１４がＹＥＳとなる。そして、仮に強制設定対象メモリアドレスが‘65553’であったとするならば、強制ＯＮアドレス一覧２４の２行目における強制ＯＮメモリアドレス７２の欄に‘65553’が登録されると共に（ステップＳ１７）、メモリ２２のアドレス‘65553’の記憶領域に、受信した強制設定値６２が書き込まれることになる。
【００６７】
つまり、上記処理は、上記強制設定値送信データ６０が、強制ＯＮアドレス一覧２４に未登録のメモリアドレス（新規のメモリアドレス）に対する強制設定値６２である場合には、この新規のメモリアドレスを強制ＯＮアドレス一覧２４に追加登録したうえで（ステップＳ１７）、メモリ２２におけるこの新規メモリアドレスの領域に、強制設定値６２を書き込む（ステップＳ１８）。一方、過去に既に強制設定値を設定したことがあるメモリアドレスについて設定値を変更したい場合には、ステップＳ１７の処理は必要なく、ステップＳ１８の処理のみを実行することになる。
【００６８】
図５は、コントローラ２０において機械語オブジェクト２３を実行する際に上記強制設定用機械語オブジェクトを実行したときの処理の一例を示す図である。上記の通り、例えばＳＴ命令等の書き込み命令を機械語オブジェクトに変換する際に、図５に示すような処理を実現する機械語オブジェクトが生成されている。図示の各処理のうち、ステップＳ２６の処理が例えばＳＴ等の書き込み命令による処理に相当し、それ以外の処理が追加されているものと見做しても構わない。
【００６９】
尚、例えば上記図２（ｃ）のＳＴ命令に係る図５の処理が実行されて且つステップＳ２６の処理が実行されることになった場合には、ステップＳ２６では上記の「アドレス65552番地に、アキュムレータの値を書き込む」処理が実行されることになる。
【００７０】
ここで、本例では、図５の処理を開始したら、上記ステップＳ２６による書込み先アドレス（上記の例では65552番地）を、認識するものとする。認識した書込み先アドレスは、後述するステップＳ２４の処理で用いられる。
【００７１】
図５の処理例では、まず、インデックスを初期値（＝１）に設定する（ステップＳ２１）。その後は、後述するステップＳ２３，Ｓ２４の何れかがＹＥＳとなるまでインデックスを更新（＋１インクリメント）しながらステップＳ２２〜Ｓ２５の処理を繰り返す。ステップＳ２３がＹＥＳになったらステップＳ２６の処理を実行し、ステップＳ２４がＹＥＳになったらステップＳ２７の処理を実行して、本処理を終了する。
【００７２】
すなわち、まず、強制ＯＮアドレス一覧２４から、現在のインデックスが示す行の強制ＯＮメモリアドレス７２を取得する（ステップＳ２２）。強制ＯＮメモリアドレスが登録されていない場合にはＮＵＬＬが取得されることになり、図３（ｃ）の例では１行目（インデックス＝１）以外の場合にはＮＵＬＬが取得されることになる。
【００７３】
そして、ステップＳ２２でＮＵＬＬが取得された場合には（ステップＳ２３，ＹＥＳ）、メモリ２２における上記書込み先アドレスへの書き込みを実行して（ステップＳ２６）本処理を終了する。
【００７４】
一方、ステップＳ２２でＮＵＬＬ以外（何らかのアドレス）が取得された場合には（ステップＳ２３，ＮＯ）、当該取得アドレスが上記書込み先アドレスと同一である場合には（ステップＳ２４，ＹＥＳ）、メモリ２２における上記書込み先アドレスへの書き込みを実行しないで（ステップＳ２７）本処理を終了する。
【００７５】
ステップＳ２２での取得アドレスが上記書込み先アドレスと同じではない場合には（ステップＳ２４，ＮＯ）、インデックスを更新（＋１インクリメント）して（ステップＳ２５）ステップＳ２２に戻る。
【００７６】
上記書込み先アドレスが、強制ＯＮアドレス一覧２４に登録されているアドレスである場合には、上記ステップＳ２２〜Ｓ２５の処理を繰り返す中で何れはステップＳ２４の判定がＹＥＳとなることになり、ステップＳ２７の処理が実行されることになる。一方、強制ＯＮアドレス一覧２４に登録されていないアドレスである場合には、上記ステップＳ２２〜Ｓ２５の処理を繰り返して全ての登録アドレスと一致チェックした後（全て、不一致となる）、ステップＳ２２でＮＵＬＬが取得されることになり、ステップＳ２６の処理が実行されることになる。
【００７７】
この様にして、強制設定値が書き込まれたアドレスに関しては、その後、通常処理により書き込みが禁止されることになる。
尚、支援装置１０、コントローラ２０、ＨＣＩ装置３０は、何れも、ハードウェア的には、少なくとも不図示のＣＰＵ／ＭＰＵ等の演算プロセッサと記憶装置（メモリなど）を有している。そして、記憶装置には予め各装置に応じた所定のアプリケーションプログラムが格納されている。演算プロセッサが、このアプリケーションプログラムを実行することで、上記各装置の各種処理機能が実現される。すなわち、コントローラ２０の場合、上記プログラム実行管理部２１の処理、上記図４のフローチャート図の処理、上記図５のフローチャート図の処理などが実現される。支援装置１０の場合、上記コンパイラ（フロントエンドコンパイラ１１、バックエンドコンパイラ１２）の処理等が実現される。
【００７８】
また、支援装置１０またはＨＣＩ装置３０は、上記演算プロセッサが上記アプリケーションプログラムを実行することで、上述した“ユーザに、ソースコード上で、強制ＯＮを実施する変数を任意に指定させる”処理や、図３（ａ）の強制設定画面５０上でユーザに任意の強制設定値を設定させる処理や、これらに基づく図３（ｂ）の強制設定値送信データ６０の生成処理等の各種処理が、実現されてもよい。
【００７９】
尚、上述した例に限らず、例えばコントローラ２０が支援装置１０の機能の一部を備えていてもよい。例えばコントローラ２０がコンパイラ機能（フロントエンドコンパイラ１１、バックエンドコンパイラ１２の両方もしくは何れか一方）を、備えていてもよい。この場合、支援装置１０は、ソースコード１３またはこれを中間コードに変換したものを、コントローラ２０に送り、コントローラ２０において機械語オブジェクトを生成するようにしてもよい。
【００８０】
以上、実施例１について説明した。
以下、図６〜図１１を参照して、実施例２について説明する。
実施例２は、実施例１の特徴・効果に加えて、更に、コントローラ側での処理負荷を低減できる特徴・効果を提供するものである。
【００８１】
図６は、実施例２のプログラマブルコントローラシステムの構成図である。
図示の例では、実施例２のプログラマブルコントローラシステムは、支援装置２１０、コントローラ２２０等を有し、これらはネットワーク（不図示）を介して相互にデータ送受信可能となっている。尚、図示していないが、実施例１（図１）と同様に更にＨＣＩ（Human Communication Interface）装置３０を有していてもよい。
【００８２】
支援装置２１０においても、上記支援装置１０と同様に、プログラム開発環境上でユーザによって任意に記述されたソースコード２１３が、フロントエンドコンパイラ２１１によって中間コード２１４に変換され、更に中間コード２１４がバックエンドコンパイラ２１２によって、ターゲット上で動作する機械語オブジェクト２１５に変換される。また、このコンパイル処理に伴って変数−アドレス対応表２１６（対応表１６と同じ）が生成される点も、支援装置１０と同様であり、その説明は省略する。
【００８３】
支援装置２１０が支援装置１０と異なる点は、コンパイル処理に伴って更に図示の「強制代入処理情報一覧」２１７が、生成される点である。更に、機械語オブジェクト２１５の内容も、支援装置１０の機械語オブジェクト１５とは一部異なる点がある。これらについては後に具体例を示して詳しく説明するが、「強制代入処理情報一覧」２１７には、“機械語オブジェクト２１５における各「強制代入処理へのジャンプ命令」の位置と、書き込み先アドレスの情報が含まれる。
【００８４】
尚、実施例２における強制代入処理は、例えば図１０に具体例を示すサブルーチン処理であり、機械語オブジェクト２１５にはこの様なサブルーチンへジャンプする機械語命令が、含まれている。実施例２の強制代入処理は、後に図１０を参照して説明するが、メモリの書き込み先アドレスに強制設定値を格納させる為の処理であり、これを実現する為に例えばアキュムレータの値を強制設定値に置き換えるが、この例に限らない。
【００８５】
「強制代入処理情報一覧」２１７の生成は、本例ではバックエンドコンパイラ２１２で機械語命令への変換処理に伴って実施する。バックエンドコンパイラ２１２の入力は、フロントエンドコンパイラ２１１が生成した中間コード２１４である。バックエンドコンパイラ２１２は、この中間コード２１４の１命令を該当する１又は複数の機械語命令に変換する。例えば、図２（ｃ）のLD  M,WI,65550の中間コード命令は、図７の例では以下の機械語命令群に展開される。
【００８６】
LDR    R3,ICODE_DEF_1
LDRSH  R0,[R3]
尚、ICODE_DEF_1は、M,WI,65550に対応したコントローラ内のアドレスを示す。
【００８７】
中間コードの各命令に対応した機械語命令への変換規則があり、それを元にバックエンドコンパイラ２１２が機械語オブジェクト２１５に変換する。「強制代入処理情報一覧」２１７の生成については後述する。
【００８８】
生成された「強制代入処理情報一覧」２１７と機械語オブジェクト２１５は、コントローラ２２０にダウンロードされて図示の「強制代入処理情報一覧」２２５と機械語オブジェクト２２３として記憶される。その際、機械語オブジェクト２２３における「強制代入処理へのジャンプ命令」を全てＮＯＰ（No  Operation）に置き換える。但し、この処理は支援装置２１０側で実行してもよい。尚、よく知られているように、ＮＯＰは、所謂“何もしない命令”の一例である。  ここで、図７に、機械語オブジェクト２１５の具体例を示す。これは、図２（ｃ）の中間コードを、機械語命令群に変換した例である。尚、図７では、見易さのためアセンブラで示しているが実際はアセンブラに対応したバイナリデータである。
【００８９】
図７の例において、下から２行目の“LDR  pc,[wk1,#64]”が、上記「強制代入処理（サブルーチン）へのジャンプ命令」の一例である。本例のコンパイラ（２１１，２１２）は、ＳＴ命令等の書込み命令を機械語命令群に変換する際に、予め決められて登録されている「強制代入処理へのジャンプ命令」（一例が“LDR  pc,[wk1,#64]”）を挿入している。尚、上記処理により、コントローラ２２０側では機械語オブジェクト２２３が初期状態ではこの“LDR  pc,[wk1,#64]”が上記ＮＯＰに置き換えられていることになる。
【００９０】
図７において、上記“LDR  pc,[wk1,#64]”を含む４つの機械語命令群（下から４番目〜最下行）は、図２（ｂ）におけるＳＴ命令を機械語命令群に変換したものである。従来では一例として、ＳＴ命令を、“MOV lr,pc”“LDR  pc,[wk1,#64]”以外の２つの機械語命令群に変換するものとなり、アキュムレータの格納データを当該ＳＴ命令の書込み先アドレス（本例では65552）に格納する処理を実行するものとなる。
【００９１】
また、この様な「強制代入処理（サブルーチン）へのジャンプ命令」に係わる情報が、コンパイル処理の際に「強制代入処理情報一覧」２１７に登録される。
図８（ａ）に、「強制代入処理情報一覧」２１７の具体例を示す。図示の例では、「強制代入処理情報一覧」２１７は、管理番号２３１、強制代入処理へのジャンプ位置２３２、機械語命令２３３、書き込み先アドレス２３４等のデータ項目から成る。
【００９２】
管理番号２３１は、単に、各レコードに任意に割り当てられるシリアル番号等である。強制代入処理へのジャンプ位置２３２には、「強制代入処理へのジャンプ命令」の機械語オブジェクト２１５における位置（行）が格納され、図７の例では１０行目であるので図８（ａ）に示すように‘１０’が格納される。書き込み先アドレス２３４には、強制代入処理へのジャンプ位置２３２にある「強制代入処理へのジャンプ命令」が係わる中間コード（本例ではＳＴ命令）の書込み先アドレス（本例では65552）が格納される。
【００９３】
尚、「強制代入処理情報一覧」２１７＝「強制代入処理情報一覧」２２５と見做して構わない。
機械語命令２３３には、例えば、機械語オブジェクトにおいて“強制代入処理へのジャンプ位置”２３２が示す位置に記述されていた機械語命令（例えば「強制代入処理へのジャンプ命令」等）が、格納される。
【００９４】
コントローラ２２０は、上記初期状態から運用開始すると、支援装置２１０から任意の強制設定の通知があるまでは、各書込み命令は、上記“強制代入処理”は一切実行しないで、アキュムレータの現在の格納データをメモリ２２２における書込み先アドレスに格納する処理を行うことになる。
【００９５】
そして、その後、任意のときに、何等かの異常が生じた為に、上記実施例１で説明したものと同様に、支援装置２１０側で例えば上記図３（ａ）の強制設定画面５０上でユーザが該当変数に対して強制設定することで、支援装置２１０がコントローラ２２０に対して強制設定値送信データ６０（強制設定対象のアドレス６１と強制設定値６２）を送信する。
【００９６】
この送信データ６０を受信したコントローラ２２０は、「強制代入処理情報一覧」２２５を検索して強制設定対象アドレス（該当する書き込み先アドレス２３４）に対応する「強制代入処理へのジャンプ位置２３２」（該当位置）を取得して、機械語オブジェクト２２３における該当位置の機械語命令を、ＮＯＰから「強制代入処理へのジャンプ命令」（省略して“ジャンプ命令”と記す場合もあるものとする）に置き換える。
【００９７】
これより、コントローラ２２０では、その後、メモリ２２２における該当アドレス（強制設定対象のアドレス６１）の値を、強制設定値６２により上書きすることになる。
尚、上記送信データ６０を受信したコントローラ２２０は、更に、強制ＯＮアドレス一覧２２４を更新する。これは、基本的には実施例１と同様に図４の処理を実行するものであってよい。但し、本例では強制ＯＮアドレス一覧２２４は、図８（ｂ）に示すように、管理番号２４１、強制ＯＮメモリアドレス２４２に加えて、強制設定値２４３がある。管理番号２４１、強制ＯＮメモリアドレス２４２は、上記管理番号７１、強制ＯＮメモリアドレス７２と同じであり、説明は省略する。強制設定値２４３には、上記受信した送信データ６０の強制設定値６２が格納される。
【００９８】
上述したように、実施例２では、機械語オブジェクト２２３において現在強制設定している部分だけ強制代入処理が実行され、それ以外はＮＯＰとなるので、アプリケーションの実行への影響が最小限に抑えられる。
【００９９】
図９に、実施例２のシステム全体の概略処理フローを示す。
まず、任意のときに、支援装置２１０側で開発者等が任意の制御プログラムのソースコードを作成し、これをコンパイルさせると、支援装置２１０のコンパイラ（２１１，２１２）は、ソースコード２１３→中間コード２１４→機械語オブジェクト２１５に順次変換する。この機械語オブジェクト２１５には、上記の通り、各該当箇所にジャンプ命令が含まれている。更に、上記「強制代入処理情報一覧」２１７等を生成する（ステップＳ３１）。
【０１００】
そして、支援装置２１０は、上記のように生成した機械語オブジェクト２１５、「強制代入処理情報一覧」２１７等を、コントローラ２２０にダウンロードする（ステップＳ３２）。
【０１０１】
コントローラ２２０は、上記ダウンロードされた「強制代入処理情報一覧」２１７と機械語オブジェクト２１５を、「強制代入処理情報一覧」２２５、機械語オブジェクト２２３として記憶する。そして、「強制代入処理情報一覧」２２５に基づいて、機械語オブジェクト２２３における各ジャンプ命令を全てＮＯＰに置き換える（ステップＳ４１）。更に、「強制代入処理情報一覧」２２５を更新してもよい。
【０１０２】
ここで、機械語オブジェクト２１５には、例えば後述する図１０の処理を実行するサブルーチン（強制代入処理）が含まれる。上記ジャンプ命令は、この強制代入処理にジャンプして実行する為の命令である。そして、ダウンロード直後の初期状態では上記のようにジャンプ命令は全てＮＯＰに置き換えられている。よって、その後、運用状態に移行して機械語オブジェクト２２３を繰り返し実行すると、初期状態のままでは強制代入処理は実行されない（既存の通常処理だけが実行される）。既存の通常処理とは、ＳＴ命令などの書込み処理に関しては「アキュムレータの現在値をメモリの該当位置（書込み先アドレス）に転送・格納する処理」である（ステップＳ４２）。
【０１０３】
ここで、アキュムレータの現在値は、ＬＤ命令やＡＤＤ命令等の実行に伴って随時更新される。上記のように何等かの異常が発生することで、アキュムレータに異常値が格納される場合があり、上記既存の通常処理ではこの異常値がそのままメモリ２２２に格納されることになり、以って後にメモリ格納データを使用する処理があった場合、異常動作する可能性があった。実施例２では、上記強制代入処理を実行することでこの問題を解消すると共に、その必要がない限りは上記ＮＯＰにより強制代入処理を実行しないようにできる。
【０１０４】
そして、任意のときに、支援装置２１０側で開発者等が例えば上記図３（ａ）の強制設定画面５０により任意の変数（メモリアドレス）に対する任意の強制設定値を入力すると、支援装置２１０はこの強制設定値等を例えば図３（ｂ）の送信データ６０でコントローラ２２０に通知する（ステップＳ３３）。
【０１０５】
この通知を受信したコントローラ２２０は、この通知内容を強制ＯＮアドレス一覧２２４に登録すると共に（ステップＳ４４）、この通知内容と「強制代入処理情報一覧」２２５に基づいて、機械語オブジェクト２２３における該当位置のＮＯＰを、ジャンプ命令に置き換える（ステップＳ４３）。この該当位置の求め方は、例えば、「強制代入処理情報一覧」２２５を検索して、その書き込み先アドレス２３４が通知されたアドレスと一致するレコードと求めて、この該当レコードの“強制代入処理へのジャンプ位置”２３２を、該当位置とする。
【０１０６】
仮に図３（ｂ）に示す内容の通知があった場合、強制ＯＮアドレス一覧２２４には図８（ｂ）に示す管理番号２４１＝‘１’のレコードが登録される。更に、「強制代入処理情報一覧」２２５が図８（ａ）に示す内容であったとすると、その最初のレコードが上記該当レコードとなり、該当位置は‘１０’となる。これより、例えば機械語オブジェクト２２３が図７の例である場合、その１０行目のＮＯＰ（図７ではＮＯＰに置き換える前の状態を示している）が、ジャンプ命令に置き換えられることになる。つまり、この処理によって図７に示す状態に戻ることになる。
【０１０７】
その後は、機械語オブジェクト２２３を実行すると、上記該当位置（該当箇所）のみ、強制代入処理を実行することになる。上記具体例の場合、図７の１０行目を実行するときのみ強制代入処理を実行することになる。該当位置以外にも書込み命令があったとしても、ＮＯＰであり、強制代入処理は実行されない。これより、該当位置では強制代入処理を実行したうえで「現在のアキュムレータの格納値をメモリの書込み先アドレスに転送・格納する処理」を実行する。該当位置以外では、強制代入処理を実行することなく「アキュムレータの現在値をメモリ２２２の書込み先アドレスに転送・格納する処理」を実行する（ステップＳ４５）。
【０１０８】
尚、図７には、機械語オブジェクト２２３の一部のみを示しており、図には無いが、ＮＯＰのままとなっている箇所も存在するものとする。尚、その後、不図示のＮＯＰについても、上記該当位置と判定された場合にはジャンプ命令に戻されることになる。このようにして、機械語オブジェクト２２３において、現在、強制設定が必要な該当箇所のみ、ジャンプ命令によって強制代入処理が実行され、それ以外の書込み命令箇所はＮＯＰとなるので、不要な処理の実行が避けられ、処理負荷を軽減できる。
【０１０９】
図１０に、上記強制代入処理の一例を示す。
図示に示す処理は、上記ジャンプ命令によって呼び出されて開始され、呼出しの際には書込み先アドレスが渡される。これより、強制ＯＮアドレス一覧２２４を検索して、書込み先アドレスが登録されているか否かを確認し（ステップＳ５１）、登録されているならば（ステップＳ５２，ＹＥＳ）、強制ＯＮアドレス一覧２２４における該当レコードの強制設定値２４３を、アキュムレータに格納して（ステップＳ５３）リターンする。
【０１１０】
これより、続いて、アキュムレータの格納データをメモリ２２２の書込み先アドレスに書き込む処理が行われると、強制設定値がメモリに格納されることになる。
尚、書込み先アドレスが強制ＯＮアドレス一覧２２４に登録されていない場合には（ステップＳ５２，ＮＯ）、そのまま本処理を終了してリターンする。
【０１１１】
図１１に、支援装置２１０におけるバックエンドコンパイラ２１２の処理の一例を示す。尚、この処理の前にフロントエンドコンパイラ２１１によってソースコード２１３が中間コード２１４に変換されている。
【０１１２】
図１１の処理例では、まず、変数“機械語命令展開位置”に初期値‘１’をセットする（ステップＳ６１）。また、「強制代入処理情報一覧」２１７における現在の処理対象レコードの管理番号２３１を示す変数“管理番号”にも、初期値‘１’をセットする（ステップＳ６２）。
【０１１３】
そして、中間コード２１４のファイルから順次中間コード命令を１個ずつ読み出して（ステップＳ６３）、読み出した１つの中間コード命令についてステップＳ６５〜Ｓ７２の処理を実行することを繰り返す。そして、ファイル内の全ての中間コード命令について処理実行したら（読み出す中間コード命令が無くなったら）（ステップＳ６４，ＮＯ）、本処理を終了する。
【０１１４】
中間コード命令を１つ読み出したら（ステップＳ６４，ＹＥＳ）、読み出した中間コード命令に対応する変換規則を読み込み、該変換規則で得られる機械語命令群のなかで先頭の機械語命令を取得する（ステップＳ６５）。尚、上述したように、従来より、中間コードを機械語に変換するのに、予め登録されている所定の変換規則を用いる。例えば、図２（ｃ）のＳＴ命令に対応する変換規則による機械語命令群は、図７の最後の４行分であり、そのなかで先頭の機械語命令は「LDR R3・・・」であるのでこれがステップＳ６５で取得されることになる。残りの３行も後述するステップＳ６９で順次取得されることになる。
【０１１５】
そして、上記ステップＳ６５または後述するステップＳ６９で取得された機械語命令が、“強制代入処理へのジャンプ命令”であるか否かを判定し（ステップＳ６６）、ジャンプ命令である場合には（ステップＳ６６，ＹＥＳ）、ステップＳ７１、Ｓ７２の処理を行ってステップＳ６７へ移行し、そうでない場合には（ステップＳ６６，ＮＯ）そのままステップＳ６７へ移行する。
【０１１６】
ステップＳ７１の処理は、まず、「強制代入処理情報一覧」２１７における現在の処理対象レコード（変数“管理番号”によって示される）における“強制代入処理へのジャンプ位置”２３２に、現在の変数“機械語命令展開位置”の値を格納する。図７の例では、処理対象が１０行目の機械語命令“LDR pc・・・”になって初めてステップＳ６６がＹＥＳとなり、そのときまでに後述するステップＳ６８が繰り返される為に現在の変数“機械語命令展開位置”の値は‘１０’となっている。これより、図８（ａ）に示すように、管理番号２３１＝‘１’のレコード（該当レコード）における“強制代入処理へのジャンプ位置”２３２には、‘１０’が格納されることになる。
【０１１７】
ステップＳ７１の処理では、更に、現在の処理対象の機械語命令に対応する中間コード命令の書込み先アドレスを、上記該当レコードの書き込み先アドレス２３４に格納する。上記具体例では１０行目の機械語命令“LDR pc・・・”に対応する中間コード命令は、図２（ｃ）のＳＴ命令であるので、その書込み先アドレスである“M,WI,65552”が、図８（ａ）に示すように上記該当レコードの書き込み先アドレス２３４に格納されることになる。
【０１１８】
以上のステップＳ７１の処理を実行完了したら、変数“管理番号”の値を＋１インクリメントして（ステップＳ７２）、ステップＳ６７へ移行する。
ステップＳ６７では、現在の処理対象の機械語命令（ステップＳ６５または後述するステップＳ６９で取得された機械語命令）を、所定の出力先（所定の記憶領域など）へ出力する。これを繰り返すことで最終的には例えば図７に示す機械語命令群が所定の出力先に生成されることになり、以って中間コードを機械語命令群に変換する処理が完了することになる。
【０１１９】
ステップＳ６７に続いて、変数“機械語命令展開位置”の値を＋１インクリメントして（ステップＳ６８）、上記変換規則から次の機械語命令を取得する（ステップＳ６９）。取得できたら（ステップＳ７０，ＹＥＳ）ステップＳ６６に戻るが、取得できなかったら（ステップＳ７０，ＮＯ）ステップＳ６３へ戻り、次の中間コード命令を読み込む。
【０１２０】
このようにして、コンパイル処理によって、機械語オブジェクト２１５を生成すると共に「強制代入処理情報一覧」２１７を生成する。
尚、上述したコントローラ２２０の各種処理機能は、例えば、プログラム実行管理部２２１が実行・実現するが、この例に限らない。尚、コントローラ２２０は、不図示のＣＰＵ／ＭＰＵ等の演算プロセッサと記憶装置（メモリなど）を有している。そして、記憶装置には予め各装置に応じた所定のアプリケーションプログラムが格納されている。演算プロセッサが、このアプリケーションプログラムを実行することで、上記コントローラ２２０の各種処理機能が実現される。
【０１２１】
上述した本手法では、実施例１、実施例２とも、ユーザは、変数を指定するだけで簡単に変数の値を強制的に変更できるため、コントローラのプログラムデバッグだけでなく、プラントシステムの稼働中に一部の計器などが故障して正常な値が取り込めない時、オペレータが監視画面から計器の値を強制的に変更し、システム稼働を安定して継続できる効果が得られる。
【０１２２】
強制的に値を変更する時、アプリケーションの実行時間が増加し、制御周期内にアプリケーションの実行が実施できないとシステムとしての動作が不安定になる。そこで、強制的に値を変更できる場合でもアプリケーションの実行時間の増加を抑えることが必要になる。実施例２では、更に、全ての書き込み命令では無く、強制的に値を変更するところだけ強制代入処理が実行されるため、アプリケーションの実行時間の増加を必要最小限に抑えて、強制的に値を変更することが可能になる。
【０１２３】
図１２は、本例のプログラマブルコントローラシステムの機能ブロック図である。
図示の例のプログラマブルコントローラシステムは、例えば、支援装置８０とコントローラ９０を有する。この例に限らず、更に、他装置１００を有していてもよい。上記支援装置１０または支援装置２１０が支援装置８０の一例であり、上記コントローラ２０またはコントローラ２２０がコントローラ９０の一例であると見做しても構わない。但し、コントローラ９０は、実施例１（支援装置１０）に対応する場合、初期状態形成部９４、強制設定制御部９５は有しないと見做してよい。また、上記ＨＣＩ装置３０が他装置１００の一例であると見做しても構わない。
【０１２４】
支援装置８０は、例えば、任意のプログラムのソースコードをコンパイルして機械語オブジェクトに変換するコンパイル部８１を有する。
コントローラ９０は、例えば、機械語オブジェクトを実行するプログラム実行部９１、強制設定値が書き込まれたメモリアドレスが登録される強制設定アドレス記憶部９２等を有する。
【０１２５】
上記プログラム実行部９１は、上記機械語オブジェクトにおける所定の命令を実行する際に、該所定の命令によるアクセス先アドレスが、上記強制設定アドレス記憶部９２に登録されている場合には、該アクセス先アドレスへのアクセスを実行しない、あるいは該アクセス先アドレスへ前記強制設定値を書き込む。
【０１２６】
上記構成により、例えば、強制的に値を変更した（強制設定値を設定した）メモリアドレスに関しては、その後、更新（計器の値を上書きする等）を禁止することができ、強制設定値が異常値などに書き換えられる事態を防止し、以ってシステム稼働を安定して継続できる。
【０１２７】
また、上記構成において例えば、上記コンパイル部８１は、上記任意のプログラムのソースコードを機械語オブジェクトに変換する際に、書込み命令に関しては所定の機械語を追加生成する。所定の機械語は、例えば上記図５の処理を実現するものである。
【０１２８】
上記プログラム実行部９１は、上記機械語オブジェクトを実行する際、該機械語オブジェクトにおける上記書込み命令を実行する際に上記所定の機械語を実行することで、該書込み命令のアクセス先アドレスが、上記強制設定アドレス記憶部９２に登録されている場合には、該書込み命令による該アクセス先アドレスへの書き込みを実行しない。
【０１２９】
また、例えば、支援装置８０または他装置１００は、任意に指定させたメモリアドレスと強制設定値を、コントローラ９０に通知する設定部（８２．１０１）を有する。
この場合、コントローラ９０は、例えば、通知されたメモリアドレスを強制設定アドレス記憶部９２に登録すると共に、通知された強制設定値を該通知されたメモリアドレスの記憶領域に書き込む強制設定管理部９３を更に有する。
【０１３０】
また、例えば、支援装置８０または他装置１００は、上記コンパイルの際に上記ソースコードの各変数に割り当てられたメモリアドレスが、記憶される変数−アドレス記憶部（８３、１０２）を更に有していてもよい。
【０１３１】
この場合、上記設定部（８２，１０１）は、例えば、上記ソースコード中の各変数のうちの任意の変数を指定させると共に任意の強制設定値を指定させ、該任意に指定された変数に対応するメモリアドレスを上記変数−アドレス記憶部（８３、１０２）から取得して、これらを上記“任意に指定させたメモリアドレスと強制設定値”としてコントローラ９０に通知する。
【０１３２】
また、例えば、上記強制設定管理部９３は、上記通知されたメモリアドレスが既に上記強制設定アドレス記憶部９２に登録されている場合には、当該通知されたメモリアドレスを強制設定アドレス記憶部９２に登録することなく、上記通知された強制設定値を該通知されたメモリアドレスの記憶領域に上書き格納する。
【０１３３】
あるいは、上記支援装置８０のコンパイル部８１は、上記任意のプログラムのソースコードを機械語オブジェクトに変換する際に、書込み命令に対応する機械語命令群に強制代入処理へのジャンプ命令を付加し、更に強制代入処理情報一覧に該ジャンプ命令の位置と該書込み命令の書込み先アドレスを登録するものであってもよい（実施例２に対応する）。
【０１３４】
実施例２に対応する場合、コントローラ９０は、初期状態形成部９４、強制設定制御部９５を有するものであってもよい。
初期状態形成部９４は、上記支援装置８０が生成した機械語オブジェクトと強制代入処理情報一覧を取得すると、強制代入処理情報一覧に基づいて、機械語オブジェクトにおける全ての強制代入処理へのジャンプ命令を“何もしない命令”（例えばＮＯＰ等）に置き換えることで、その後、支援装置８０から所定の通知があるまでは強制代入処理を実行させない。
【０１３５】
強制設定制御部９５は、上記所定の通知と強制代入処理情報一覧に基づいて、機械語オブジェクトにおける該当位置の上記“何もしない命令”を上記強制代入処理へのジャンプ命令に戻す。
【０１３６】
上記強制代入処理は、例えば、上記強制設定値をアキュムレータに格納する処理であり、上記所定の命令は、例えば、該アキュムレータの格納データをメモリのアクセス先アドレスに転送・記憶する処理である。
【０１３７】
尚、上記コンパイル部８１またはその機能の一部を、コントローラ９０が有していてもよい。この場合、支援装置８０はコンパイル部８１またはその機能の他の一部を有していなくても構わない。
【０１３８】
尚、支援装置８０、コントローラ９０、他装置１００は、何れも、ハードウェア的には、少なくとも不図示のＣＰＵ／ＭＰＵ等の演算プロセッサと記憶装置（メモリなど）を有している。そして、記憶装置には予め各装置に応じた所定のアプリケーションプログラムが格納されている。演算プロセッサが、このアプリケーションプログラムを実行することで、上記各装置の各種処理機能が実現される。すなわち、支援装置８０の場合、上記コンパイル部８１、設定部８２、変数−アドレス記憶部８３等の各種処理機能が実現される。コントローラ９０の場合、上記プログラム実行部９１、強制設定アドレス記憶部９２、強制設定管理部９３等の各種処理機能が実現される。他装置１００の場合、上記設定部１０１、変数−アドレス記憶部１０２等の各種処理機能が実現される。
【０１３９】
以上説明した本例のプログラマブルコントローラ、その支援装置１０、コントローラ２０、ＨＣＩ装置３０によれば、システム稼働中にコントローラの任意のメモリ領域の値を強制的に書き換えると共に、この強制設定されたメモリ領域へのその後の書込みを禁止でき、以ってシステム稼働を安定して継続できる。また、ユーザが変数と強制設定する値を指定するだけで簡単に変数の値を強制的に書き換えることを可能にし（これは特にＨＣＩ装置３０等のオペレータ（プログラムに詳しくない人）であっても可能にし）、デバッグ作業の効率向上、プラントシステムの安定稼働をサポートすることができる。
【０１４０】
本手法によれば、プラントシステムの稼働中に例えば一部の計器などが故障して正常な値が取り込めない時、オペレータが監視画面から計器の値（対応するメモリの格納値）を強制的に変更し、システム稼働を安定して継続できる効果が得られる。これは、特に、強制的に値を変更した（強制設定値を設定した）メモリアドレスに関しては、その後、システム稼働による通常の処理による更新（計器の値を上書きする等）を禁止することで、強制設定値が異常値などに書き換えられる事態を防止し、以ってシステム稼働を安定して継続できる。
【０１４１】
更に、本手法によれば、ユーザは、変数（変数名など）を指定するだけで簡単に変数の値を強制的に変更できるため、プラントシステムの稼働中に一部の計器などが故障して正常な値が取り込めない時、オペレータがＨＣＩ装置等の監視画面から計器の値を容易に変更することができる。
【０１４２】
上述したように、上記特許文献１では、エンジニアリングツールを使用しており、オペレータは、コントローラ内で動作しているプログラムには詳しくないため、エンジニアリングツールを扱って値を変更することは困難である。これに対して、本手法では、上記の通り、オペレータは、変数（変数名など）を指定するだけで簡単に変数の値を強制的に変更できる。
【０１４３】
また、上述したように、上記特許文献１では、接続点毎に一時変数が必要であり、メモリを余分に消費しているが、本例のプログラムではこの様な一時変数は必要ない。また、上述したように、上記特許文献１では、対象の変数への書き込みする複数の接続点に対して値を設定する必要があるが、本例ではこの様な必要はなく、対象の変数（変数名など）を指定して値を設定すれば済む。
【０１４４】
以下、実施例３について説明する。
実施例３は、基本的には、上述した実施例１や実施例２を二重化コントローラシステムに適用した例であるが、この例に限らない。上述した実施例１、２では得られない更なる効果が得られる構成・機能も含まれていてもよい。以下に説明する実施例３の図面・説明は、この様な更なる効果が得られる構成・機能も示しているが、これは必須の構成・機能ではない。
【０１４５】
よく知られているように、既存の二重化コントローラシステムは、稼動系コントローラと待機系コントローラを有し、待機系コントローラは、制御プログラム実行はしていないが、制御に係わるデータは稼動系コントローラと同じデータを保持するようになっている（等値化処理などによる）。この等値化処理自体は、既存の処理であってよく、特に説明しないものとする。
【０１４６】
上述した実施例１、２を単純に既存の二重化コントローラに適用した場合、上記実施例１、２で説明した強制設定値と対象アドレス等に関して、ユーザは支援装置等から、稼働系コントローラ、待機系コントローラに対して、別々に設定をする必要があり、設定値の一義性に課題があった。
【０１４７】
（１）設定を変更した場合：
ユーザは、稼働/待機コントローラそれぞれに対して設定する必要あり、ユーザが間違えた情報を設定しても気が付けない。
【０１４８】
（２）待機系を後から立ち上げた場合
ユーザは、運用中に稼働系コントローラに対して任意の強制設定値、対象アドレスを設定すると共にこれら強制設定値、対象アドレスを覚えておき、後から立ち上がった待機系コントローラに対して、覚えていた値、アドレスを全て設定する必要があり、ユーザとして使いにくいシステムとなっていた。
【０１４９】
そこで、実施例３では、この様な課題を解決しつつ上述した実施例１または実施例２を適用した二重化コントローラシステムを提案する。
実施例３では、支援装置から稼動系コントローラに対して、任意のプログラムのダウンロードや任意の設定を行う。その一方で支援装置から待機系コントローラに対しては、少なくとも設定に関しては何も行わない。設定値は、稼動系コントローラから待機系コントローラに転送し、両コントローラが同一の設定内容となるようにする。これより、ユーザが稼動系と待機系とで異なる設定を行う可能性はなくなり、ユーザの手間を軽減できる効果も得られる。
【０１５０】
実施例３では、支援装置から稼働系コントローラへ通知された強制設定値から、強制ＯＮアドレス一覧を稼働側コントローラで更新する。但し、実施例３における強制ONアドレス一覧は、後述するシーケンス番号付きとなっており、強制ＯＮアドレス一覧の更新の際にシーケンス番号も更新する。これについては後述する。稼動系コントローラは、この強制ＯＮアドレス一覧（シーケンス番号付）を、待機側コントローラへ転送する。強制ＯＮアドレス一覧は、例えば更新がある毎にまたは定期的に、稼働系コントローラから待機コントローラへ送信される。
【０１５１】
待機系コントローラでも、強制ＯＮアドレス一覧を保持しており、バックアップ版と呼ぶものとする。
待機系コントローラでは、稼動／待機切替えの際に問題なく処理を引き継げるようにする為に、保持するデータやプログラムを稼動系コントローラと同一の状態としている必要がある。既存の等値化処理によって例えばメモリ５３２の記憶内容はメモリ５２２と同一となるようにしている。尚、メモリ５３２（５２２）には、制御に係わるデータ（例えば制御対象機器に関する各種状態データ（温度、回転数等）や各種設定値等が格納される。これに加えて、更に、強制ＯＮアドレス一覧や機械語オブジェクトの内容も、稼動系コントローラと同一となるようにする必要がある。
【０１５２】
待機系コントローラ側では、上記転送された強制ＯＮアドレス一覧のシーケンス番号が上記バックアップ版のシーケンス番号と異なる場合、変更があったものと見做し、対応する処理を実行する。これは、例えば、自コントローラが保持する機械語オブジェクトの内容を変更する処理であり、続いて更に上記転送された強制ＯＮアドレス一覧を新たなバックアップ版として記憶する処理も行う。
【０１５３】
機械語オブジェクトの内容を変更する処理は、例えば、まず、上記転送された強制ＯＮアドレス一覧とバックアップ版とを相互に比較して、相違点（追加された事項または削除された事項）を抽出する。転送された強制ＯＮアドレス一覧には存在するがバックアップ版には存在しない事項が、追加された事項となる。その逆に、バックアップ版には存在するが転送された強制ＯＮアドレス一覧には存在しない事項が、削除された事項となる。そして、この相違点などに基づいて、機械語オブジェクトの強制設定処理に係わる該当箇所を変更するが、これについては後に詳しく説明する。
【０１５４】
図１３は、本例の二重化コントローラシステムのシステム構成図である。
図示のシステムは、既存の一般的なコントローラの二重化システムと同様、２つのコントローラを備え、一方を稼動系、他方を待機系とする。図示の例では、稼動系コントローラ５２０と待機系コントローラ５３０を備える。稼動系コントローラ５２０に何等かの異常が発生した場合、待機系コントローラ５３０が稼動系に切り替わる。
【０１５５】
待機系コントローラ５３０は、制御動作は行っていないが、既存の等値化処理等により稼動系コントローラ５２０と同じ制御データを保持している。これより、上記稼動系への切替後の制御動作が問題なく行える（スムーズに制御を引き継げる）。これに加えて本手法では更に、待機系コントローラ５３０は、上記「強制ＯＮアドレス一覧」についても稼動系コントローラ５２０と同じデータを保持するようにしている。更に、この更新処理の処理負荷が軽減できるようにしている。これについて、以下、図１４も参照して説明する。また、待機系コントローラ５３０は、自己が保持する機械語オブジェクト５３３が、稼動系コントローラ５２０が保持する機械語オブジェクト５２３と同一内容となるようにしている。
【０１５６】
図１３の例では、支援装置５１０は、コンパイラによってソースコード５１３を機械語オブジェクト５１５に変換する。つまり、ユーザによって任意に作成された制御プログラム等のソースコード５１３を、フロントエンドコンパイラ５１１が中間コード５１４に変換する。バックエンドコンパイラ５１２が、この中間コード５１４を機械語オブジェクト５１５に変換する。このコンパイル処理に伴って変数−アドレス対応表５１６を生成すると共に強制代入一覧情報５１７を生成する。変数−アドレス対応表５１６は、図１の変数−アドレス対応表１６と同じであってよく、ここでは特に説明しない。また、強制代入一覧情報５１７も、図６の強制代入処理情報一覧２１７と同じであっても構わない。
【０１５７】
支援装置５１０は、上記のように生成した機械語オブジェクト５１５と強制代入一覧情報５１７を稼動系コントローラ５２０へダウンロードして、図示の機械語オブジェクト５２３、強制代入一覧情報５２５として記憶させる。稼動系コントローラ５２０は、プログラム実行管理部５２１、メモリ５２２等を有し、強制ＯＮアドレス一覧５２４を記憶・管理し、また上記のように機械語オブジェクト５２３、強制代入一覧情報５２５を記憶・保持する。強制ＯＮアドレス一覧５２４は、基本的には上記強制ＯＮアドレス一覧２４と同様に強制設定対象のアドレスを記憶するものであるが、本例では更に後述するシーケンスNo.や強制設定値も記憶する。
【０１５８】
尚、後述する稼動系コントローラ５２０の各種処理動作は、例えばプログラム実行管理部５２１が実行するが、この例に限らない。
待機系コントローラ５３０は、プログラム実行管理部５３１、メモリ５３２等を有し、機械語オブジェクト５３３、強制ＯＮアドレス一覧バックアップ５３４、強制代入一覧情報５３５を記憶する。
【０１５９】
ここで、図１３において、支援装置５１０は、変形例（強制代入一覧情報５１７を生成する形態）を示しているが、図１の支援装置１０と同一の構成・機能であってもよい。同様に、稼動系コントローラ５２０や待機系コントローラ５３０は、変形例（強制代入一覧情報５２５を利用する形態）を示しているが、図１のコントローラ２０と同一の構成・機能であってもよい。つまり、実施例３の構成は、図１３に示す構成に限らず、例えば“図１の支援装置１０とコントローラ２０＋コントローラ２０”等の構成であっても構わない（この例では、稼動系、待機系の両方がコントローラ２０と同じ構成を有する）。
【０１６０】
何れの場合であっても、待機系コントローラが、稼動系コントローラと同一のデータ／プログラムを保持するように所定の処理を実行する点では同じである。例えば、稼動系コントローラ５２０が「強制ＯＮアドレス一覧」５２４を保持し、その上記バックアップ版である図示の「強制ＯＮアドレス一覧バックアップ」５３４を待機系コントローラ５３０が保持するが、「強制ＯＮアドレス一覧バックアップ」５３４の内容が「強制ＯＮアドレス一覧」５２４と同一となるようにしている。これは、ユーザの手間が掛かることなく、且つ、間違いが生じることなく、実現させることができる。
【０１６１】
図１４（ａ）に示すように、実施例３の「強制ＯＮアドレス一覧」５２４は、シーケンスNo.５４１、強制設定個数５４２、アドレス５４３、強制設定値５４４を有する。尚、バックアップ版である「強制ＯＮアドレス一覧バックアップ」５３４も、同一のデータ構成を有するが、ここでは稼動系における「強制ＯＮアドレス一覧」５２４について説明する。
【０１６２】
アドレス５４３は、実施例１（図３（ｃ））の強制ＯＮメモリアドレス７２と同じと見做して構わない。本例では更に強制設定値も格納する。つまり、稼動系コントローラ５２０は、図３（ｂ）の強制設定値送信データ６０を受信すると、そのアドレス６１をアドレス５４３に格納すると共にこの送信データ６０の強制設定値６２を強制設定値５４４に格納する。尚、図１４（ａ）には示していないが、アドレス５４３及び強制設定値５４４のペア毎に任意の管理番号（上記管理番号７１に相当）が割り当てられていても構わない。
【０１６３】
シーケンスNo.５４１は、「強制ＯＮアドレス一覧」５２４の更新時毎に稼動系コントローラ５２０によって＋１インクリメントされる。更新時とは、新たなアドレス５４３と強制設定値５４４のペアが追加格納されるとき、あるいは逆に登録されているアドレス５４３と強制設定値５４４の各ペアのうち任意のペアが削除されるときである。何れにしても、「強制ＯＮアドレス一覧」５２４の格納内容に変化があると、シーケンスNo.５４１も変化する。
【０１６４】
強制設定個数５４２は、現在登録されている上記ペアの個数であるが、このデータは無くても構わない。
上記のように、稼動系コントローラ５２０は、自己が保持する「強制ＯＮアドレス一覧」５２４を、定期的に又は更新時に、待機系コントローラ５３０へ送信する。待機系コントローラ５３０は、「強制ＯＮアドレス一覧」５２４のバックアップ版である「強制ＯＮアドレス一覧バックアップ」５３４を保持・管理している。任意のとき、「強制ＯＮアドレス一覧」５２４と「強制ＯＮアドレス一覧バックアップ」５３４とが同一の内容であったとしても、「強制ＯＮアドレス一覧」５２４が更新されると、両者は異なる状態となるので、再び一致する状態に戻す必要がある。「強制ＯＮアドレス一覧」５２４が更新された場合、そのシーケンスNo.５４１が更新されるので、「強制ＯＮアドレス一覧バックアップ」５３４のシーケンスNo.５４１とは一致しない状態となる。
【０１６５】
これより、待機系コントローラ５３０は、稼動系コントローラ５２０から渡された「強制ＯＮアドレス一覧」５２４のシーケンスNo.５４１が、「強制ＯＮアドレス一覧バックアップ」５３４のシーケンスNo.５４１と一致する場合には、何も処理しない。
【０１６６】
不一致の場合のみ、受信した「強制ＯＮアドレス一覧」５２４をバックアップ領域にコピーする等して、「強制ＯＮアドレス一覧バックアップ」５３４を更新する。ここで、本例では、不一致の場合には更に、機械語オブジェクト５３３が機械語オブジェクト５２３と同一内容となるように機械語オブジェクト５３３を更新する。その為に、強制代入一覧情報５３５を用いる。
【０１６７】
ここで、実施例３の機械語オブジェクト５１５（５２３、５３３）は、実施例２の機械語オブジェクト２１５（２２３）と同様であり、そのときに該当する書込み命令に関してのみ強制設定値をメモリの書込み先アドレスに格納させる処理を実現するものである。機械語オブジェクト５１５（５２３、５３３）の具体例を図１５に示し後に説明するものとする。上記機械語オブジェクト５２３（５３３）の更新も、この例に応じたものとなる。詳しくは後述する。
【０１６８】
以下、図１４（ｂ）、図１５を参照して詳しく説明する。
まず、支援装置５１０においてコンパイル処理の際に、強制代入一覧情報５１７を生成する。このコンパイル処理によって機械語オブジェクト５１５が生成されるが、この機械語オブジェクト５１５には所定のサブルーチン（強制代入処理と呼ぶ）へのジャンプ命令が含まれている。図１５に、本例の機械語オブジェクト５１５等の具体例を示す。これは、図２（ｃ）の中間コードを、機械語命令群に変換した例である。
【０１６９】
尚、図１５では、見易さのためアセンブラで示しているが実際はアセンブラに対応したバイナリデータである。また、尚、図１５に示す機械語オブジェクト５１５の具体例は、図７に示した機械語オブジェクト２１５等の具体例と同一であり、以下、間単に説明する。
【０１７０】
また、強制代入一覧５２５（５３５）は、実施例２の強制代入処理情報一覧２１７（２２５）と同じであってよく、これより、図１４（ｂ）に示す強制代入一覧５２５（５３５）の具体例は、図８（ａ）に示す強制代入処理情報一覧２１７（２２５）の具体例と、同一のデータ構成を示している。
【０１７１】
図１５の例において、下から２行目の“LDR  pc,[wk1,#64]”が、上記「強制代入処理（サブルーチン）へジャンプする命令」の一例である。本例のコンパイラ（５１１，５１２）は、ＳＴ命令等の書込み命令を機械語命令群に変換する際に、予め決められて登録されている「強制代入処理へジャンプする命令」（一例が“LDR  pc,[wk1,#64]”）を挿入している。
【０１７２】
図１５において、上記“LDR  pc,[wk1,#64]”を含む４つの機械語命令群（下から４番目〜最下行）は、図２（ｂ）におけるＳＴ命令を機械語命令群に変換したものである。従来では一例として、ＳＴ命令を、“LDR  pc,[wk1,#64]”以外の３つの機械語命令群に変換するものとなり、アキュムレータの格納データを当該ＳＴ命令の書込み先アドレス（本例では65552）に格納する処理を実行するものとなる。
【０１７３】
また、支援装置５１０は、上記機械語オブジェクト５１５への変換処理に伴って強制代入一覧情報５１７を生成する。これは、上記の様な「強制代入処理（サブルーチン）へジャンプする命令」（単に“ジャンプ命令”と記す場合もあるものとする）に係わる情報が、コンパイル処理に伴って強制代入一覧情報５１７に登録されるものである。図１４（ｂ）に、強制代入一覧情報５１７（５２５，５３５）の具体例を示す。
【０１７４】
強制代入一覧情報５１７（５２５，５３５）は、管理番号５５１、強制代入処理へのジャンプ位置５５２、機械語命令５５３、書き込み先アドレス５５４等のデータ項目から成る。管理番号５５１は、単に、各レコードに任意に割り当てられるシリアル番号等である。強制代入処理へのジャンプ位置５５２には、当該「強制代入処理へジャンプする命令」の機械語オブジェクトにおける位置（行）が格納され、図１５の例では１０行目であるので図１４（ｂ）に示すように‘１０’が格納される。書き込み先アドレス５５４には、当該「強制代入処理へジャンプする命令」が係わる中間コード（本例ではＳＴ命令）の書込み先アドレス（本例では65552）が格納される。
【０１７５】
機械語命令５５３には、例えば、機械語オブジェクトにおいて“強制代入処理へのジャンプ位置”５５２が示す位置に記述されていた機械語命令（例えば「強制代入処理へのジャンプ命令」等）が、格納される。
【０１７６】
支援装置５１０は、上記のように生成した機械語オブジェクト５１５と強制代入一覧情報５１７を、稼動系コントローラ５２０にダウンロードする。稼動系コントローラ５２０は、上記ダウンロードされた強制代入一覧情報５１７を、そのまま、図１３の強制代入一覧情報５２５として記憶する。一方、ダウンロードされた機械語オブジェクト５１５は、上記「強制代入処理へジャンプする命令」（ジャンプ命令）は全てＮＯＰ（No Operation）に置き換えて、図１３の機械語オブジェクト５２３として記憶する。尚、よく知られているように、ＮＯＰは、所謂“何もしない命令”の一例である。
【０１７７】
そして、稼動系コントローラ５２０は、上記強制代入一覧情報５２５と機械語オブジェクト５２３を待機系コントローラ５３０に転送して、これらを図示の強制代入一覧情報５３５と機械語オブジェクト５３３として記憶させる。
【０１７８】
上記のように、稼動系コントローラ５２０と待機系コントローラ５３０がそれぞれ初期状態を構築した後、運用開始される。尚、初期状態では、「強制ＯＮアドレス一覧」５２４、「強制ＯＮアドレス一覧バックアップ」５３４には、強制設定対象のアドレスや強制設定値等のデータ等は１つも登録されていない（シーケンスNO.５４１は、例えば所定の初期値（０など）が格納された状態となっている）。
【０１７９】
以上の処理により、初期状態では、機械語オブジェクト５２３と機械語オブジェクト５３３は同一の内容（「強制代入処理へジャンプする命令」が全てＮＯＰ（No Operation）に置き換わっている）となっている。例えば図１５の機械語オブジェクトの場合、上記“LDR  pc,[wk1,#64]”が上記ＮＯＰに置き換えられていることになる。
【０１８０】
稼動系コントローラ５２０は、上記初期状態から運用開始すると、支援装置５１０から任意の強制設定の通知（図３（ｂ）等）があるまでは、上記“強制代入処理”は一切実行されないことになる（全てＮＯＰなので）。つまり、各書込み命令は、アキュムレータの現在の格納データをメモリ５２２における書込み先アドレスに格納する処理を行うことになる。尚、特に説明しないが、既存の等値化処理によって、メモリ５２２とメモリ５３２の格納内容が同一となるように制御されている。また、尚、逐一説明しないが、アキュムレータの格納データは、読み込み命令や演算命令（ＬＤやＡＤＤ等）の実行に伴って随時変わっていく。
【０１８１】
そして、その後、任意のときに、何等かの異常が生じた為に、上記実施例１で説明したものと同様に、支援装置５１０側で例えば上記図３（ａ）の強制設定画面５０上でユーザが該当変数に対して強制設定することで、支援装置５１０が稼動系コントローラ５２０に対して強制設定値送信データ６０（強制設定対象のアドレス６１と強制設定値６２）を送信する。
【０１８２】
これより、稼動系コントローラ５２０では、機械語オブジェクト５２３における該当箇所のＮＯＰを、元に戻す処理を行う（「強制代入処理へジャンプする命令」に戻される）。例えば上記送信データ６０を受信した稼動系コントローラ５２０は、「強制代入一覧情報」５２５を検索して、強制設定対象のアドレス６１と同一の書き込み先アドレス５５４に対応する「強制代入処理へのジャンプ位置５５２」（該当位置）を取得して、機械語オブジェクト５２３における該当位置の機械語命令を、ＮＯＰから「強制代入処理へジャンプする命令」に置き換える。
【０１８３】
これより、稼動系コントローラ５２０では、その後、メモリ５２２における該当アドレス（強制設定対象のアドレス６１）の値を、強制設定値５４４により上書きすることになる。
【０１８４】
尚、上記送信データ６０を受信した稼動系コントローラ５２０は、更に、強制ＯＮアドレス一覧５２４を更新する。これは、基本的には実施例１と同様に図４の処理を実行するものであってよい。但し、本例では強制ＯＮアドレス一覧５２４は、図１４（ａ）に示すように、アドレス５４３だけでなく強制設定値５４４も格納する。アドレス５４３には上記送信データ６０のアドレス６１が格納され、強制設定値５４４には、上記送信データ６０の強制設定値６２が格納される。
【０１８５】
上述したように、実施例３では、機械語オブジェクトにおいて現在の強制設定対象箇所だけ強制代入処理が実行され、それ以外はＮＯＰとなるので、アプリケーションの実行への影響が最小限に抑えられる。
【０１８６】
あるいは、送信データ６０が解除通知である場合には、上記と逆に、元に戻された「強制代入処理へジャンプする命令」（ジャンプ命令）を再びＮＯＰに置き換える処理を行うようにしてもよい。この様にして、稼動系コントローラ５２０は、必要に応じて機械語オブジェクト５１５の更新／変更を行う場合がある。上記該当位置（該当箇所）とは、現在、強制ＯＮアドレス一覧５２４に登録されているアドレスに関係する命令の位置である。
【０１８７】
上記機械語オブジェクト５１５の更新／変更処理については後に詳しく説明するが、上記のことから、強制ＯＮアドレス一覧５２４が更新／変更されると、機械語オブジェクト５２３も更新／変更する必要があることになる。これは、待機系コントローラ５３０においても基本的には同様である。
【０１８８】
この為、待機系コントローラ５３０では、上記のように、シーケンスNo.５４１に基づいて「強制ＯＮアドレス一覧」５２４の更新有りを判定し、以って「強制ＯＮアドレス一覧バックアップ」５３４を更新した場合、更に、更新後の「強制ＯＮアドレス一覧バックアップ」５３４に基づいて、機械語オブジェクト５３３を更新／変更する。
【０１８９】
この様にして、稼動系コントローラ５２０と待機系コントローラ５３０とは、（一時的に異なる状態となっても）同一のデータ保持状態となるように制御されている。これより、稼動・待機切替が、スムーズに行えることになる。
【０１９０】
尚、強制代入一覧情報５２５と強制代入一覧情報５３５は、上記初期状態で同一の内容となっており、また、その後の運用中に更新／変更されることはなく、初期状態のままである。
【０１９１】
上記稼動系コントローラ５２０で実行される上記強制代入処理の一例は、実施例２における上記強制代入処理の一例（図１０に示すステップＳ５１，Ｓ５２，Ｓ５３）と同じであってよい。
【０１９２】
図１６に、上記稼動系コントローラ５２０で実行される上記強制代入処理の一例を示すが、上記のことから、以下、間単に説明するのみとする。
尚、上記ジャンプ命令は、書込み処理に係わる命令群に含まれている。書込み処理は、基本的には、任意の書込み先アドレスに現在のアキュムレータを転送・格納する処理であるが、ジャンプ命令が実行される場合にはアキュムレータには強制設定値が格納されていることになる。
【０１９３】
図１６に示す強制代入処理は、上記ジャンプ命令によって呼び出されて開始され、呼出しの際には上記書込み先アドレスが渡される。これより、強制ＯＮアドレス一覧５２４を検索して、書込み先アドレスが登録されているか否かを確認し（ステップＳ１）、登録されているならば（ステップＳ２，ＹＥＳ）、強制ＯＮアドレス一覧５２４における該当レコードの強制設定値５４４を、アキュムレータに格納して（ステップＳ３）リターンする。
【０１９４】
これより、続いて、アキュムレータの現在値をメモリの書込み先アドレスに書き込む処理が行われると、強制設定値がメモリ５２２の書込み先アドレスに格納されることになる。
【０１９５】
尚、書込み先アドレスが強制ＯＮアドレス一覧５２４に登録されていない場合には（ステップＳ２，ＮＯ）、そのまま本処理を終了してリターンする。
上述した実施例３のシステム全体の動作について、再び図１３を参照しながら、以下、まとめて説明するものとする。
【０１９６】
本説明では、上述した初期処理は完了しており、その後の運用中の動作について説明するものとする。
（ａ）運用中、任意のときに、支援装置５１０側で、ユーザの判断・操作により、例えば上記強制設定画面５０上での上述した任意のデータ入力が行われることで、上記図３（ｂ）の強制設定値送信データ６０が稼動系コントローラ５２０に通知される。また、本例では、更に、不図示の強制設定解除画面上で、現在強制設定中の任意のアドレス（変数）に対して当該強制設定を解除する為のユーザ入力もできるものとし、これより不図示の強制設定解除データが稼動系コントローラ５２０に通知されるものとする。尚、強制設定解除データのデータ構成は、図３（ｂ）と同様であってよいが、“解除”であることを示すデータも付加されるものとする。
【０１９７】
（ｂ）稼動系コントローラ５２０は、上記強制設定値送信データ６０又は上記強制設定解除データ（不図示）を受信すると、まず、強制ＯＮアドレス一覧５２４を更新する（受信データの登録または登録データの削除。登録処理は実施例１と同様であり説明は省略する。削除処理も、単に、登録アドレスの中で通知されたアドレスと同一のものを削除すればよい）。更に、そのシーケンスNo.５４１を更新（＋１インクリメント）する。
【０１９８】
続いて、更に、機械語オブジェクト５２３を更新する。これは、強制設定値送信データ６０を受信した場合には、機械語オブジェクト５２３の該当箇所をＮＯＰからジャンプ命令に変更する。該当箇所は、通知内容（強制設定値送信データ６０）と強制代入一覧情報５２５から求める。すなわち、強制代入一覧情報５２５において、その書き込み先アドレス５５４が通知されたアドレスと一致するレコードの“強制代入処理へのジャンプ位置”５３２が、上記該当個所となる。図１４（ｂ）に示す例に対して図３（ｂ）の通知があった場合には、該当位置は‘１０’（１０行目）となる。これは、例えば図１５の例における下から２行目の位置であり、初期状態では、当該下から２行目にあるジャンプ命令である図示の“LDR pc,・・・”は、上記ＮＯＰに置き換えられおり、これを元々のジャンプ命令“LDR pc,・・・”に戻す処理となる。
【０１９９】
また、上記強制設定解除データ（不図示）を受信した場合も、上記送信データ６０の場合と同様にして上記該当箇所を求めるが、続いて、機械語オブジェクト５２３における該当箇所のジャンプ命令を上記ＮＯＰに置き換える。
【０２００】
（ｃ）稼働系コントローラ５２０は、上記のように定期的に又は更新時に、強制ＯＮアドレス一覧５２４を待機系コントローラ５３０へ通知する。上記（ａ）、（ｂ）の動作によって強制ＯＮアドレス一覧５２４の更新があった場合には、当該更新後の強制ＯＮアドレス一覧５２４（よってシーケンスNo.５４１も更新されている）を、待機系コントローラ５３０へ通知することになる。
【０２０１】
（ｄ）待機系コントローラ５３０は、強制ＯＮアドレス一覧５２４を受信する毎に、まず、シーケンス番号の変化の有無を確認して、変化無しの場合には何も行わない。シーケンス番号の変化の有無は、受信した強制ＯＮアドレス一覧５２４のシーケンスNo.５４１が、強制ＯＮアドレス一覧バックアップ５３４のシーケンスNo.５４１と一致する場合には変化無し、不一致の場合には変化有りと判定する。
【０２０２】
シーケンス番号の変化有りの場合、受信した強制ＯＮアドレス一覧５２４には更新があったものと見做して、機械語オブジェクト５３３とバックアップ版を更新する処理を行う。
【０２０３】
機械語オブジェクト５３３の更新は、まず、受信した強制ＯＮアドレス一覧５２４と、強制ＯＮアドレス一覧バックアップ５３４とを相互に比較して相違点（追加されたアドレス５４３または削除されたアドレス５４３）を検出する。これによって、強制設定追加またはその解除を認識でき、且つ、対象となるアドレスが認識できるので、その後は、上記稼動系コントローラ５２０と同様にして機械語オブジェクト５３３の更新を行う。
【０２０４】
最後に、受信した強制ＯＮアドレス一覧５２４をバックアップ領域へコピーする。つまり、バックアップ版の更新は、単に、受信した強制ＯＮアドレス一覧５２４を、新たな強制ＯＮアドレス一覧バックアップ５３４として記憶すればよい。
【０２０５】
以上、システム全体の動作の流れについて説明した。
以下、図１７〜図２０の各フローチャート図を参照して、システムを構成する各装置の処理について説明する。
【０２０６】
図１７は、支援装置５１０から強制設定通知されたときの稼動系コントローラ５２０の処理フローチャート図である。
図１８は、支援装置５１０から強制設定解除通知されたときの稼動系コントローラ５２０の処理フローチャート図である。
【０２０７】
まず、図１７について説明する。
稼動系コントローラ５２０は、上記強制設定の通知（送信データ６０）を受信すると、まず、所定のパラメータチェックを行うが（ステップＳ８１）、これについて特に説明しない。
【０２０８】
ステップＳ８１のパラメータチェック結果が正常の場合、機械語オブジェクト置換処理を行う（ステップＳ８２）。これは上述した機械語オブジェクトにおける該当箇所（該当位置）を求めて、該当箇所のＮＯＰを元々のジャンプ命令に戻す処理であり、詳細フローを図１９に示し、後に説明する。
【０２０９】
上記ステップＳ８２の処理が成功すると（ステップＳ８３，ＹＥＳ）、アプリケーション更新完了待ち状態となり（ステップＳ８４）、更新完了すると（ステップＳ８５，ＹＥＳ）、強制ＯＮアドレス一覧５２４を更新する。すなわち、強制ＯＮアドレス一覧５２４に新たなアドレス５４３と強制設定値５４４のペアとして、上記送信データ６０のアドレス６１と強制設定値６２を登録する（ステップＳ８６，Ｓ８７）。その際、更に、シーケンスNo.５４１を＋１インクリメントする。更に、強制設定個数５４２を＋１インクリメントしてもよい。尚、強制設定個数５４２は、現在登録されている強制設定データ（アドレス５４３と強制設定値５４４のペア）の数を示すものであり、初期状態では‘０’となっている。
【０２１０】
そして、待機系コントローラ５３０へ、上記更新後の強制ＯＮアドレス一覧５２４を通知する（ステップＳ８８）。最後に、支援装置５１０への応答データを作成・送信して（ステップＳ８９）、本処理を終了する。
【０２１１】
次に、以下、図１８について説明する。
稼動系コントローラ５２０は、支援装置５１０からの上記強制設定解除データ（不図示）を受信すると、まず、上記ステップＳ８１と同様に所定のパラメータチェックを行い（ステップＳ９１）正常であればステップＳ９２へ移行する。
【０２１２】
ステップＳ９２では、強制ＯＮアドレス一覧５２４の現在の登録データ数を確認し（例えば、強制設定個数５４２を参照する）、登録数が０件であれば（ステップＳ９２，ＹＥＳ）何もせずにそのまま支援装置５１０への応答データの生成・送信を行って（ステップＳ１００）本処理を終了する。
【０２１３】
登録数が１件以上あれば（ステップＳ９２，ＮＯ）、強制ＯＮアドレス一覧５２４を更新する。つまり、強制ＯＮアドレス一覧５２４から該当データ（強制設定解除データのアドレスと同一のアドレス５４３と、これとペアである強制設定値５４４）を削除する（ステップＳ９３）。この処理が正常完了したら（ステップＳ９４，ＹＥＳ）、続いて、上記更新後の強制ＯＮアドレス一覧５２４を、待機系コントローラ５３０へ通知する（ステップＳ９５）。
【０２１４】
そして、機械語オブジェクト更新（置換）処理を行う（ステップＳ９６）。この処理は例えば図１９の処理を実行するものであり、後に説明する。そして、この更新処理が成功したら（ステップＳ９７，ＹＥＳ）、アプリケーション更新完了待ち状態となり（ステップＳ９８）、完了したら（ステップＳ９９，ＹＥＳ）、支援装置５１０への応答データを作成・送信して（ステップＳ１００）、本処理を終了する。
【０２１５】
尚、上記ステップＳ９４，Ｓ９７，Ｓ９９の判定がＮＯの場合には、そのまま支援装置５１０への応答データの生成・送信を行って（ステップＳ１００）本処理を終了する。
図１９は、上記機械語オブジェクト更新（置換）処理の具体例である。
【０２１６】
図１９の処理は、稼動系コントローラ５２０の処理でも、待機系コントローラ５３０の処理でも、実行されるが、ここでは稼動系コントローラ５２０をメインにして説明する。
上記のように、稼動系コントローラ５２０は、支援装置５１０から強制設定またはその解除の通知があると、上記図１７または図１８の処理を行って、そのなかで図１９の処理を行うことになる。
【０２１７】
図示の例では、稼動系コントローラ５２０は、まず、強制代入一覧情報５２５から１レコードずつ読み出し（ステップＳ１０１）、読出し成功した場合には（ステップＳ１０２、ＹＥＳ）これが強制設定登録または削除の対象となるアドレス（支援装置５１０から通知されたアドレス）と一致するか否かを判定し（ステップＳ１０３）、不一致の場合にはステップＳ１０１に戻る。また、ステップＳ１０３がＹＥＳとなることなく強制代入一覧情報５２５の全レコードについて処理実行した場合には（ステップＳ１０２，ＮＯ）本処理を終了する。
【０２１８】
読み出したアドレスが強制設定（登録）または解除の対象アドレスである場合には（ステップＳ１０３，ＹＥＳ）、強制設定（登録）の場合には（ステップＳ１０４，ＹＥＳ）機械語オブジェクト５２３における該当箇所（対象アドレスに対応する位置；強制代入処理へのジャンプ位置５５２）を、ＮＯＰからジャンプ命令に置き換える（ステップＳ１０５）。一方、解除の場合には（ステップＳ１０４，ＮＯ）機械語オブジェクト５２３における該当箇所を、ジャンプ命令からＮＯＰに置き換える（ステップＳ１０６）。
【０２１９】
全ＰＧ（プログラム）について処理完了したら（ステップＳ１０７，ＹＥＳ）、本処理を終了するが、まだ処理完了していないならば（ステップＳ１０７，ＮＯ）ステップＳ１０１に戻る。
【０２２０】
図２０は、待機系コントローラ５３０の処理フローチャート図である。
この処理は、上記のように稼動系コントローラ５２０から強制ＯＮアドレス一覧５２４の通知があったときに実行される。
【０２２１】
稼動系コントローラ５２０は、まず、通知された強制ＯＮアドレス一覧５２４のシーケンスNo.５４１と、強制ＯＮアドレス一覧バックアップ５３４のシーケンスNo.５４１とが一致するか否かをチェックし（ステップＳ１１１）、一致する場合には強制ＯＮアドレス一覧５２４は更新なしと判定して（ステップＳ１１２，ＮＯ）、そのまま本処理を終了する。不一致の場合には強制ＯＮアドレス一覧５２４は更新ありと見做して（ステップＳ１１２，ＹＥＳ）、ステップＳ１１３〜Ｓ１１８の処理を実行する。
【０２２２】
すなわち、まず、支援インタフェース処理をロックする（変更中は、支援装置５１０からのアプリケーション変更を受け付けない様にしている）（ステップＳ１１３）。続いて、機械語オブジェクト更新（置換）処理を行う（ステップＳ１１４）。これは基本的には図１９と同様の処理を行って機械語オブジェクト５３３の該当箇所を変更するものであるが、登録か解除かの判定と対象アドレスを認識する処理（既に一例を上述しているので、ここでは説明は省略する）も必要となる点で異なる。
【０２２３】
上記機械語オブジェクト更新（置換）が成功したら（ステップＳ１１５，ＹＥＳ）、強制設定値書き込みを行い（ステップＳ１１６）、続いて、強制ＯＮアドレス一覧５２４をバックアップ領域へコピーすることで、強制ＯＮアドレス一覧バックアップ５３４を更新する（ステップＳ１１７）。
【０２２４】
最後に、支援インタフェース排他制御を解除して（ステップＳ１１８）本処理を終了する。
上記機能を備えることにより、稼働系コントローラ５２０だけに強制設定を行っても、稼動系コントローラ５２０から待機系コントローラ５３０へ通知することにより、切り替わりが発生しても、強制設定値を引き継げる。
【０２２５】
また、待機系強制設定更新確認＆強制設定処理は、イニシャル時にもチェックし、登録されている全データについて稼働系の情報を引き継ぐことを可能としている。
上述したように、本手法の実施例１により、ユーザは、変数を指定するだけで簡単に変数の値を強制的に変更できるため、コントローラのプログラムデバッグだけでなく、プラントシステムの稼働中に一部の計器などが故障して正常な値が取り込めない時、オペレータが監視画面から計器の値を強制的に変更し、システム稼働を安定して継続できる効果がある。
【０２２６】
実施例３では、実施例１の効果に加えて、更に下記の効果が得られる。
すなわち、二重化コントローラシステムにおいて、ユーザは支援装置から稼働系コントローラに対して強制設定または解除を指示するだけで、上述した稼動系コントローラと待機系コントローラの処理により、稼動系と待機系とで同様の変更・更新が行われて同じデータ・プログラムを保持する状態へと自動的に移行することになる。よって、ユーザの手間が掛かることなく、且つ、間違いが生じることなく、稼働/待機の切替えが発生した時でも、強制設定値を引き継げ、システム稼働を安定して継続できる効果がある
あるいは、実施例３では更に、実施例２と略同様の効果が得られるものであってもよい。
【０２２７】
図２１は、本例の二重化コントローラシステムの機能ブロック図である。
図示の例の二重化コントローラシステムは、例えば、支援装置８０とコントローラ９０を有する。この例に限らず、更に、他装置１００を有していてもよい。上記支援装置１０が支援装置８０の一例であり、上記コントローラ２０がコントローラ９０の一例であり、上記ＨＣＩ装置３０が他装置１００の一例であると見做しても構わない。
【０２２８】
図２１に示す支援装置８０、コントローラ９０、他装置１００は、基本的に、図１２に示す支援装置８０、コントローラ９０、他装置１００と同じであっても構わないので、同一符号を付してあり、その説明は省略する。尚、これは、換言するならば、上記実施例１，２のプログラマブルコントローラシステムの機能を、そのまま二重化コントローラシステムに適用したものを、本例の二重化コントローラシステムの基本としてもよいものと言うこともできる。
【０２２９】
尚、これより、図２１は示していないが、図２１のコントローラ９０も、図１２のコントローラ９０と同様に、更に上述して初期状態形成部９４や強制設定制御部９５の処理機能も有するものであっても構わない。
【０２３０】
但し、本例の二重化コントローラシステムは、上記基本的な機能だけでなく、更に下記の処理機能も有するものであってもよい。
すなわち、稼動系／待機系の二重化コントローラシステムにおいては、コントローラは、稼動系として動作するときはコントローラ９０の処理機能に加えて図示の稼動系コントローラ９０Ａの処理機能も有する。一方、待機系として動作するときにはコントローラ９０の処理機能に代えて図示の待機系コントローラ９０Ｂの処理機能を有する。つまり、例えば待機系として動作する場合には、制御プログラム実行は行っていないので、プログラム実行部９１の処理機能は有さないことになる。
【０２３１】
なお、コントローラは、稼動系コントローラ９０Ａと待機系コントローラ９０Ｂの両方の機能を備えているが、稼動系として動作しているときには稼動系コントローラ９０Ａの処理機能を実行し、待機系として動作しているときには待機系コントローラ９０Ｂの処理機能を実行するものである。
【０２３２】
稼動系コントローラ９０Ａは、まず、上記強制設定アドレス記憶部９２を待機系コントローラ９０Ｂに通知してバックアップ版として保持させる通知部６０１を有する。
ここで、一例として、二重化コントローラシステムにおいては、上記強制設定アドレス記憶部９２は、更に、任意の番号（一例が上記シーケンス番号）も保持するものとする。
【０２３３】
そして、稼動系コントローラ９０Ａは、強制設定アドレス記憶部９２を更新する毎に上記番号を更新する第１更新部６０２を更に有する。これは、例えば番号を＋１インクリメントするが、この例に限らない。
【０２３４】
また、待機系コントローラ９０Ｂは、上記通知部６０１により通知された強制設定アドレス記憶部９２の上記番号が、自コントローラが保持する上記バックアップ版の番号と異なる場合に、該通知された強制設定アドレス記憶部９２を新たなバックアップ版とする第２更新部６１１を有する。
【０２３５】
上記待機系コントローラ９０Ｂの上記第２更新部６１１は、上記通知部６０１により通知された強制設定アドレス記憶部９２の上記番号が、自コントローラが保持する上記バックアップ版の番号と異なる場合には、更に、自己が保持する機械語オブジェクトを変更する。
【０２３６】
例えば、上記自己が保持する機械語オブジェクトを変更する処理は、該機械語オブジェクトの強制代入処理へのジャンプ命令を何もしない命令に置き換える処理、あるいは、該何にしない命令を該強制代入処理へのジャンプ命令に置き換える処理である。
【０２３７】
ここで、一例として、上記支援装置８０の上記コンパイル部８１は、上記任意のプログラムのソースコードを機械語オブジェクトに変換する際に、書込み命令に関しては強制代入処理へのジャンプ命令を付加し、更に強制代入処理情報一覧に該ジャンプ命令の位置と該書込み命令の書込み先アドレスを登録するものとする。勿論、これは一例であり、この例に限らない。
【０２３８】
この例の場合には、上記稼動系コントローラ９０Ａは、支援装置８０が生成した機械語オブジェクトと上記強制代入処理情報一覧を取得すると、強制代入処理情報一覧に基づいて、機械語オブジェクトにおける全ての“強制代入処理へのジャンプ命令”を“何もしない命令”に置き換えることで、その後、支援装置８０から所定の通知があるまでは上記強制代入処理を実行させない初期状態生成部６０３を更に有する。
【０２３９】
また、この例の場合には、稼動系コントローラ９０Ａの初期状態生成部６０３は、上記“何もしない命令”への置き換え後の機械語オブジェクトと、上記強制代入処理情報一覧とを、待機系コントローラ９０Ｂに送信して保持させる。これより、待機系コントローラ９０Ｂにおいても、初期状態では、保持する機械語オブジェクトは、全ての“強制代入処理へのジャンプ命令”が“何もしない命令”に置き換えられた状態となっている。
【０２４０】
そして、その後、任意のときに、支援装置８０の上記設定部８２は、上記メモリアドレスと強制設定値を、上記所定の通知として、稼動系コントローラ９０Ａに通知する。
これに応じて、稼動系コントローラ９０Ａの第１更新部６０２は、該通知に応じて強制設定アドレス記憶部９２を更新すると共に、該所定の通知と強制代入処理情報一覧に基づいて、機械語オブジェクトにおける該当位置の上記“何もしない命令”を上記“強制代入処理へのジャンプ命令”に戻す。
【０２４１】
尚、例えば、上記強制代入処理は、上記強制設定値をアキュムレータに格納する処理であり、上書込み命令は、該アキュムレータの格納データをメモリの書込み先アドレスに転送・記憶する処理である。
【０２４２】
そして、待機系コントローラ９０Ｂの上記第２更新部６１１は、上記通知部６０１により通知された強制設定アドレス記憶部９２の上記番号が、自コントローラが保持する上記バックアップ版の番号と異なる場合に、該相違する部分のアドレスに対応する該当位置を強制代入処理情報一覧から求めて、機械語オブジェクトにおける該当位置の“何もしない命令”を上記“強制代入処理へのジャンプ命令”に戻す。
【符号の説明】
【０２４３】
１  ネットワーク
１０  支援装置
１１  フロントエンドコンパイラ
１２  バックエンドコンパイラ
１３  ソースコード
１４  中間コード
１５  機械語オブジェクト
１６  変数−アドレス対応表
２０  コントローラ
２１  プログラム実行管理部
２２  メモリ
２３  機械語オブジェクト
２４  強制ＯＮアドレス一覧
３０  ＨＣＩ装置
４１  変数名
４２  アドレス
５０  強制設定画面
５１  変数名の入力欄
５２  設定値の入力欄
５３  「実行」ボタン
６０  強制設定値送信データ
６１  アドレス
６２  強制設定値
７１  管理番号
７２  強制ＯＮメモリアドレス
８０  支援装置
８１  コンパイル部
８２  設定部
８３  変数−アドレス記憶部
９０  コントローラ
９０Ａ  稼動系コントローラ
９０Ｂ  待機系コントローラ
９１  プログラム実行部
９２  強制設定アドレス記憶部
９３  強制設定管理部
９４  初期状態形成部
９５  強制設定制御部
１００他装置
１０１  設定部
１０２  変数−アドレス記憶部
２１０  支援装置
２１１  フロントエンドコンパイラ
２１２  バックエンドコンパイラ
２１３  ソースコード
２１４  中間コード
２１５  機械語オブジェクト
２１６  変数−アドレス対応表
２１７  強制代入処理情報一覧
２２０  コントローラ
２２１  プログラム実行管理部
２２２  メモリ
２２３  機械語オブジェクト
２２４  強制ＯＮアドレス一覧
２２５  強制代入処理情報一覧
２３１  管理番号
２３２  強制代入処理へのジャンプ位置
２３３  機械語命令
２３４  書き込み先アドレス
２４１  管理番号
２４２  強制ＯＮメモリアドレス
２４３  強制設定値
５１０  支援装置
５１１  フロントエンドコンパイラ
５１２  バックエンドコンパイラ
５１３  ソースコード
５１４  中間コード
５１５  機械語オブジェクト
５１６  変数−アドレス対応表
５１７  強制代入一覧情報
５２０  稼動系コントローラ
５２１  プログラム実行管理部
５２２  メモリ
５２３  機械語オブジェクト
５２４  強制ＯＮアドレス一覧
５２５  強制代入一覧情報
５３０  待機系コントローラ
５３１  プログラム実行管理部
５３２  メモリ
５３３  機械語オブジェクト
５３４  強制ＯＮアドレス一覧バックアップ
５３５  強制代入一覧情報
５４１  シーケンスNo.
５４２  強制設定個数
５４３  アドレス
５４４  強制設定値
５５１  管理番号
５５２  強制代入処理へのジャンプ位置
５５３  機械語命令
５５４  書き込み先アドレス
６０１  通知部
６０２  第１更新部
６０３  初期状態生成部
６１１  第２更新部
【図１】
2017142794.tif 000003
【図２】
2017142794.tif 000004
【図３】
2017142794.tif 000005
【図４】
2017142794.tif 000006
【図５】
2017142794.tif 000007
【図６】
2017142794.tif 000008
【図７】
2017142794.tif 000009
【図８】
2017142794.tif 000010
【図９】
2017142794.tif 000011
【図１０】
2017142794.tif 000012
【図１１】
2017142794.tif 000013
【図１２】
2017142794.tif 000014
【図１３】
2017142794.tif 000015
【図１４】
2017142794.tif 000016
【図１５】
2017142794.tif 000017
【図１６】
2017142794.tif 000018
【図１７】
2017142794.tif 000019
【図１８】
2017142794.tif 000020
【図１９】
2017142794.tif 000021
【図２０】
2017142794.tif 000022
【図２１】
2017142794.tif 000023