(57)【要約】【課題】  被制御装置を模擬した装置模擬プログラムをダウンロードすることなく、制御プログラムの試験を可能とする。【解決手段】  被制御装置を模擬した装置模擬プログラム30を有するパソコン３に接続されたコントローラ２に、被制御装置を制御する制御プログラム20、被制御装置に対して実際にデータを入出力する実Ｉ/Ｏ25、被制御装置に対して仮想的にデータを入出力する仮想Ｉ/Ｏ24、装置模擬プログラム30及び制御プログラム20のいずれか一方からの指令に応じて実Ｉ/Ｏ25と仮想Ｉ/Ｏ24とを切替えるＩ/Ｏ切替部23を備え、仮想Ｉ/Ｏ24からの指令を実行して値変化イベントが発生した場合、Ｉ/Ｏ切替部23が装置模擬プログラム30に値変化イベントを送信する。【選択図】          図２
2013029914.tif 000002
【特許請求の範囲】
【請求項１】
被制御装置を模擬した装置模擬プログラムを有する端末装置に接続され、
前記被制御装置を制御する制御プログラム、
前記被制御装置に対するデータの入出力を実際に行う実インタフェース部、
前記被制御装置に対するデータの入出力を仮想的に行う仮想インタフェース部、
前記装置模擬プログラム及び前記制御プログラムのいずれか一方からの指令に応じて前記実インタフェース部と前記仮想インタフェース部とを切替える切替部、を備え、
前記切替部は、前記仮想インタフェース部から前記指令を実行し値変化が発生した場合に前記装置模擬プログラムに値変化に関する情報を送信することを特徴とする制御プログラム試験装置。
【請求項２】
前記装置模擬プログラムから前記指令を受信し、該指令を前記切替部に送信する装置模擬インタフェース部を備え、
前記装置模擬プログラムは、前記指令に該指令を実行する時刻情報を付して前記装置模擬インタフェース部に送信し、
前記装置模擬インタフェース部は前記時刻情報に基づき前記指令を送信し、
前記切替部は前記指令を受信し、該指令に応じて前記実インタフェース部と前記仮想インタフェース部とを切替えることを特徴とする請求項１に記載の制御プログラム試験装置。
【請求項３】
前記装置模擬プログラムからの指令が前記仮想インタフェース部への指令である場合に、前記制御プログラムの処理を停止して前記切替部に前記装置模擬プログラムからの指令を実行させるタイミング調整部、を備えたことを特徴とする請求項１に記載の制御プログラム試験装置。
【請求項４】
被制御装置を模擬した装置模擬プログラムを有する端末装置と、
前記被制御装置を制御する制御プログラム、
前記被制御装置に対するデータの入出力を実際に行う実インタフェース部、
前記被制御装置に対するデータの入出力を仮想的に行う仮想インタフェース部、
前記装置模擬プログラム及び前記制御プログラムのいずれか一方からの指令に応じて前記実インタフェース部と前記仮想インタフェース部とを切替える切替部、を有し、前記端末装置に接続されたコントローラと、を備え、
前記仮想インタフェース部から前記指令を実行して値変化が発生した場合に、前記切替部が前記装置模擬プログラムに値変化に関する情報を送信することを特徴とする制御プログラム試験システム。
【請求項５】
前記装置模擬プログラムから前記指令を受信し、該指令を前記切替部に送信する装置模擬インタフェース部を備え、
前記装置模擬プログラムは、前記指令に該指令を実行する時刻情報を付して前記装置模擬インタフェース部に送信し、
前記装置模擬インタフェース部は前記時刻情報に基づき前記指令を送信し、
前記切替部は前記指令を受信し、該指令に応じて前記実インタフェース部と前記仮想インタフェース部とを切替えることを特徴とする請求項４に記載の制御プログラム試験システム。
【請求項６】
前記コントローラは、前記装置模擬プログラムからの指令が前記仮想インタフェース部への指令である場合に、前記制御プログラムの処理を停止して前記切替部に前記装置模擬プログラムからの指令を実行させるタイミング調整部、を備えたことを特徴とする請求項４に記載の制御プログラム試験システム。
【請求項７】
被制御装置を制御する制御プログラム、
前記被制御装置に対するデータの入出力を実際に行う実インタフェース部、
前記被制御装置に対するデータの入出力を仮想的に行う仮想インタフェース部、
前記装置模擬プログラム及び前記制御プログラムのいずれか一方からの指令に応じて前記実インタフェース部と前記仮想インタフェース部とを切替える切替部、を有するコントローラと、
前記コントローラに接続され、前記被制御装置を模擬した装置模擬プログラムを有する端末装置と、を備えた制御プログラム試験システムにおいて、
前記制御プログラムまたは前記装置模擬プログラムが前記切替部に向けてデータ入出力に関する指令を送信する指令送信ステップと、
前記指令送信ステップにより送信された前記指令に基づき、前記切替部が前記実インタフェース部と前記仮想インタフェース部とを切替えて前記実インタフェース部または前記仮想インタフェース部に前記指令を実行させる切替ステップと、
前記切替ステップにより前記仮想インタフェース部が前記指令を実行した後、実行された前記指令により値変化が発生したか否かを前記切替部が判断する判断ステップと、
前記判断ステップにより前記切替部が前記値変化が発生したと判断した場合に、前記切替部が前記装置模擬プログラムに対して値変化に関する情報を送信する値変化情報送信ステップと、
前記値変化情報送信ステップにより送信された前記値変化に関する情報を受信した前記装置模擬プログラムが、前記被制御装置を模擬した装置模擬の処理を実行する装置模擬処理ステップと、を備えたことを特徴とする制御プログラムの試験方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、デジタル入出力を有する制御装置に用いられる制御プログラムを試験する試験装置、試験システム、及び方法に関するものである。
【背景技術】
【０００２】
ＦＡ（Factory Automation）等の分野では、制御プログラムに従い自動制御を行う制御装置が用いられている。このような制御装置において制御プログラムの動作確認を行うには、実際の入出力機器である被制御装置を接続しなければならない。
【０００３】
制御装置に被制御装置が接続されていない状態で制御プログラムの試験を行う装置として、従来、制御装置と被制御装置間で実際のデータ入出力を行う実Ｉ／Ｏに割当てた実Ｉ／Ｏアドレス、制御装置内部のメモリに仮想的に設けられたデータ入出力機器の仮想Ｉ／Ｏアドレス、仮想Ｉ／Ｏアドレスの有効性を示すフラグ、並びに実Ｉ／Ｏアドレス及び仮想Ｉ／Ｏアドレスに対応するメモリアドレスを記憶するマッピングテーブルを備え、有効フラグにより仮想Ｉ／Ｏアドレスの無効が示されている場合は実Ｉ／Ｏとメモリアドレスとの間でデータ入出力を行い、仮想Ｉ／Ｏアドレスの有効が示されている場合は仮想Ｉ／Ｏアドレスとメモリアドレスとの間でデータ入出力を行うシーケンスコントローラがある（例えば、特許文献１参照）。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平８−２７２４０９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、上記のシーケンスコントローラにおいては、制御プログラムの制御対象である装置模擬プログラムを外部のパソコン等で作成し、コントローラにダウンロードした後に制御プログラムの試験を行うため、装置模擬プログラムを変更するたびにコントローラにダウンロードしなければならないという課題があった。
【０００６】
本発明はこのような課題を解決するためになされたもので、装置模擬プログラムをダウンロードせず制御プログラムの試験をすることができる制御プログラム試験装置、制御プログラム試験システム、及び制御プログラムの試験方法を得ることを目的とする。
【課題を解決するための手段】
【０００７】
本発明に係る制御プログラム試験装置は、被制御装置を模擬した装置模擬プログラムを有する端末装置に接続され、被制御装置を制御する制御プログラム、被制御装置に対するデータの入出力を実際に行う実インタフェース部、被制御装置に対するデータの入出力を仮想的に行う仮想インタフェース部、装置模擬プログラム及び制御プログラムのいずれか一方からの指令に応じて実インタフェース部と仮想インタフェース部とを切替える切替部、を備え、仮想インタフェース部から指令を実行して値変化が発生した場合に切替部が装置模擬プログラムに値変化に関する情報を送信するものである。
【０００８】
本発明に係る制御プログラム試験システムは、被制御装置を模擬した装置模擬プログラムを有する端末装置と、被制御装置を制御する制御プログラム、被制御装置に対するデータの入出力を実際に行う実インタフェース部、被制御装置に対するデータの入出力を仮想的に行う仮想インタフェース部、装置模擬プログラム及び制御プログラムのいずれか一方からの指令に応じて実インタフェース部と仮想インタフェース部とを切替える切替部、を有し、端末装置に接続されたコントローラと、を備え、仮想インタフェース部が指令を実行して値変化が発生した場合に、切替部が装置模擬プログラムに値変化に関する情報を送信するものである。
【０００９】
本発明に係る制御プログラムの試験方法は、被制御装置を制御する制御プログラム、被制御装置に対するデータの入出力を実際に行う実インタフェース部、被制御装置に対するデータの入出力を仮想的に行う仮想インタフェース部、装置模擬プログラム及び制御プログラムのいずれか一方からの指令に応じて実インタフェース部と仮想インタフェース部とを切替える切替部、を有するコントローラと、コントローラに接続され、被制御装置を模擬した装置模擬プログラムを有する端末装置と、を備えた制御プログラム試験システムにおいて、制御プログラムまたは装置模擬プログラムが切替部に向けてデータ入出力に関する指令を送信する指令送信ステップと、指令送信ステップにより送信された指令に基づき、切替部が実インタフェース部と仮想インタフェース部とを切替えて実インタフェース部または仮想インタフェース部に指令を実行させる切替ステップと、切替ステップにより仮想インタフェース部が指令を実行した後、実行された指令により値変化が発生したか否かを切替部が判断する判断ステップと、判断ステップにより切替部が値変化が発生したと判断した場合に、切替部が装置模擬プログラムに対して値変化に関する情報を送信する値変化情報送信ステップと、値変化情報送信ステップにより送信された値変化に関する情報を受信した装置模擬プログラムが、被制御装置を模擬した装置模擬の処理を実行する装置模擬処理ステップと、を備えたものである。
【発明の効果】
【００１０】
本発明によれば、上記構成を備えたことにより、コントローラに装置模擬プログラムをダウンロードすることなく制御プログラムの試験を行うことができる。
【図面の簡単な説明】
【００１１】
【図１】実施の形態１に係る制御プログラム試験システムの構成を示す図である。
【図２】実施の形態１に係る制御プログラム試験システムを示す機能ブロック図である。
【図３】実施の形態１に係る制御プログラム試験システムの動作シーケンス図である。
【図４】実施の形態１における制御プログラムのフローチャートである。
【図５】実施の形態１におけるＩ/Ｏ切替部のフローチャートである。
【図６】実施の形態１における装置模擬Ｉ/Ｆ部のフローチャートである。
【図７】実施の形態１における装置模擬Ｉ/Ｆ部の別のフローチャートである。
【図８】実施の形態１における装置模擬プログラムのフローチャートである。
【図９】実施の形態２に係る制御プログラム試験システムの動作シーケンス図である。
【図１０】実施の形態２における装置模擬Ｉ/Ｆ部のフローチャートである。
【図１１】実施の形態２における装置模擬プログラムのフローチャートである。
【図１２】実施の形態２における装置模擬プログラムの別のフローチャートである。
【図１３】実施の形態３に係る制御プログラム試験システムを示す機能ブロック図である。
【図１４】実施の形態３に係る制御プログラム試験システムの動作シーケンス図である。
【図１５】実施の形態３における装置模擬Ｉ/Ｆ部のフローチャートの一部である。
【図１６】実施の形態３における装置模擬Ｉ/Ｆ部のフローチャートの一部である。
【図１７】実施の形態３におけるＩ/Ｏ切替部のフローチャートである。
【図１８】実施の形態３における連携動作タイミング調整部のフローチャートである。
【発明を実施するための形態】
【００１２】
実施の形態１．
本発明を実施するための実施の形態１に係る制御プログラム試験システムを図１〜図８を用いて説明する。図１において、制御プログラム試験システム１は、制御対象の被制御装置（図示しない）に接続され、これを制御するコントローラ２と、被制御装置を模擬した装置模擬プログラム30の開発・生成に用いられるパソコン３とで構成されている。
なお、コントローラ２は被制御装置に接続されない場合もある。
【００１３】
コントローラ２には、記憶媒体200、ＲＡＭ201、ＣＰＵ202、被制御装置と接続され被制御装置に対するデータの入出力を実際に行う実インタフェース（以下、実Ｉ/Ｏと称する）25、パソコン３と接続するコントローラ側Ｉ/Ｆ部203、が設けられている。
ＲＡＭ201には、被制御装置に対するデータの入出力を仮想的に行う仮想インタフェース（以下、仮想Ｉ/Ｏと称する）24が設けられ、記憶媒体200には、被制御装置を制御するための制御プログラム20、パソコン３の装置模擬プログラム30にアクセスする際に用いる装置模擬Ｉ/Ｆ部21、指令（Read/Write）に応じて仮想Ｉ/Ｏ24と実Ｉ/Ｏ25を切替る際に用いるＩ/Ｏ切替設定データ部22、Ｉ/Ｏ切替部23が保持されている。なお、制御プログラム20、装置模擬Ｉ/Ｆ部21、及びＩ/Ｏ切替部23はプログラムであり、Ｉ/Ｏ切替設定データ部22はデータベースである。記憶媒体200に保持されたプログラムは、コントローラ２で起動するＯＳ（図示しない）によってＲＡＭ201に展開され、ＣＰＵ202で実行される。また、Ｉ/Ｏ切替設定データ部22のデータはＩ/Ｏ切替部26によってＲＡＭ201に展開され使用される。
【００１４】
パソコン３には、ＲＡＭ301、開発・生成した装置模擬プログラム30やその他のデータを記憶する記憶媒体300、装置模擬プログラム30を読み出して動作させるＣＰＵ302、コントローラと接続するパソコン側Ｉ/Ｆ部303が設けられている。記憶媒体300に保持されたプログラムは、パソコン３上で起動するＯＳ（図示しない）によってＲＡＭ301に展開され、ＣＰＵ302で実行される。
コントローラ側Ｉ/Ｆ部203やパソコン側Ｉ/Ｆ部303としては、例えば、シリアル、ＵＳＢ、Ethernet（登録商標）に対応するインタフェースがある。
【００１５】
図２は、制御プログラム試験システム１を機能ブロックで示す図である。
コントローラ２には制御プログラム20、装置模擬Ｉ/Ｆ部21、Ｉ/Ｏ切替設定データ部22、Ｉ/Ｏ切替部23、仮想Ｉ/Ｏ24、及び実Ｉ/Ｏ25が設けられ、パソコン３には装置模擬プログラム30が設けられている。
【００１６】
・全体の動作
【００１７】
ここで、制御プログラム試験システム１の動作について説明する。
図３は、制御プログラム試験システム１全体の動作シーケンスを示し、実線は実際の処理を伴う動作を、破線は繰り返し同じ動作に戻る場合を表している。
まず、制御プログラム試験システム１はＩ/Ｏ切替部23と装置模擬Ｉ/Ｆ部21を起動する。このとき、どちらを先に起動しても良い。次に、装置模擬プログラム30と制御プログラム20を起動する。装置模擬プログラム30と制御プログラム20の起動順序は、試験対象によって決まる。
【００１８】
各機能ブロックを起動させると、制御プログラム試験システム１は、次の３つのケースいずれかにより試験を開始する。
ケース１：装置模擬プログラム30が装置模擬Ｉ/Ｆ部21へ指令（ReadまたはWrite）を送信する。
ケース２：制御プログラム20がＩ/Ｏ切替部23へ指令（ReadまたはWrite）を送信する。
【００１９】
ケース１の場合、装置模擬プログラム30が装置模擬処理を行い（ステップS01）装置模擬Ｉ/Ｆ部21へ指令を送信すると（ステップS02）、装置模擬Ｉ/Ｆ部21はＩ/Ｏ切替部23へ転送する（ステップS03）。ケース２の場合は制御プログラム20が制御処理を行い（ステップS04）、Ｉ/Ｏ切替部23へReadやWriteの指令を送信する（ステップS05）。
【００２０】
なお、図３の例ではケース１の動作（ステップS01〜ステップS03）を行った後、ケース２のステップS04、ステップS05を順次行っているが、制御プログラム20の制御処理（ステップS04）から始めても良い。
【００２１】
ステップS04及びステップS05による指令の送信を終えると、制御プログラム20は制御が終了したか否かを判断し、処理が終了していないと判断した場合はステップS04及びステップS05より前の状態に戻る。
【００２２】
Ｉ/Ｏ切替部23は、装置模擬Ｉ/Ｆ部21または/および制御プログラム20から指令を受信すると実Ｉ/Ｏ25と仮想Ｉ/Ｏ24のどちらに入力すべきかＩ/Ｏ切替設定データ部22を参照して判断し、判断結果に基づいて実Ｉ/Ｏ25および仮想Ｉ/Ｏ24の切替制御を行う（ステップS06）。そして、実Ｉ/Ｏ25または仮想Ｉ/Ｏ24のデータをReadしたり、Writeしたりする（ステップS07）。このとき、制御プログラム20からの指令に従いReadしたデータは、制御プログラム20へ送信する。
【００２３】
Ｉ/Ｏ切替部23は、指令が被制御装置へのWriteであり、かつ、仮想Ｉ/Ｏ24を介してデータをWriteした結果により値が変化したか否かを判断し（ステップS08）、値が変化している場合は値変化イベントを装置模擬Ｉ/Ｆ部21へ送信する（ステップS09）。装置模擬Ｉ/Ｆ部21は、この値変化イベントを装置模擬プログラム30へ転送し（ステップS10）、その後、処理が終了したか否かを判断し、処理が終了していないと判断した場合はステップS01で指令を受信するより前の状態に戻る。
【００２４】
装置模擬プログラム30は、装置模擬Ｉ/Ｆ部21から受信した値変化イベントにより起動条件が満たされた装置模擬処理があるか否かを判断し、起動条件が満たされた装置模擬処理がある場合はこれを起動し、別スレッドで実行する（ステップS11）。このステップS11の処理は、上記ステップS01と同じである。そして、この処理において装置模擬Ｉ/Ｆ部21へ指令を送信する（ステップS12）。指令の送信後、装置模擬プログラム30は実行すべき装置模擬処理が実行されたか否かを判断し、処理が終了していないと判断した場合はステップS10による値変化イベントを受信するより前の状態に戻る。
【００２５】
装置模擬Ｉ/Ｆ部21がステップS12による指令を受信するとＩ/Ｏ切替部23に転送し（ステップS13）、コントローラ２の各機能ブロックは装置模擬Ｉ/Ｆ部21がステップS01で指令を受信した場合と同様の動作を繰り返す。
【００２６】
このように、制御プログラム試験システム１は、上記の動作を繰り返し行うことで装置模擬プログラム30をコントローラ２へダウンロードすることなく、制御プログラム20の試験を、装置模擬プログラム30の開発に用いたパソコン３上で容易に実行できる。また、装置模擬プログラム30のダウンロード時間を削減することで、デバッグが何回も必要となる装置模擬プログラム30の開発工期を短縮することもできる。
【００２７】
ここで、各機能ブロックそれぞれの動作の詳細を、フローチャートを用いて説明する。
【００２８】
・制御プログラムの動作
【００２９】
図４は制御プログラム20のフローチャートである。
制御プログラム20は、予めプログラム上に設定されたロジックに従いＩ/Ｏ切替部23へRead指令を送信し、実Ｉ/Ｏ25または仮想Ｉ/Ｏ24からデータの読み出しを行う（ステップS101、図3のステップS04、S05、S07に対応）。Read指令が無い場合、ステップS101の処理は省略できる。
【００３０】
制御プログラム20はまた、予めプログラム上に設定されたロジックに従いＩ/Ｏ切替部23へ指令を出して実Ｉ/Ｏ25又は仮想Ｉ/Ｏ24に値のWriteを行う（ステップS102）。Readの場合と同様に、Write指令が無い場合はステップS102の処理を省略できる。
そして、Write及びReadの制御が終了したか否かを判断し（ステップS103）、制御処理が終了していない場合はステップS101の処理へ戻り、処理が終了している場合はこのフローを終了する。
【００３１】
・Ｉ/Ｏ切替部の動作
【００３２】
次に、図５を用いてＩ/Ｏ切替部23のフローを説明する。
Ｉ/Ｏ切替部23は、装置模擬Ｉ/Ｆ部21または制御プログラム20から指令（ReadまたはWrite）を受信すると（ステップS201、図3のステップS03、S05に対応）、この指令は実Ｉ/Ｏ25と仮想Ｉ/Ｏ24のどちらに対する指令かを判断する（ステップS202）。
【００３３】
実Ｉ/Ｏ25への指令の場合はこの指令に従ってデータのReadまたはWriteを行い（ステップS203、図3のステップS07に対応）、仮想Ｉ/Ｏ24への指令の場合はこの指令に従ってReadまたはWriteを行う（ステップS204、図3のステップS07に対応）。
【００３４】
仮想Ｉ/Ｏ24へWriteを行う場合、その指令が出力へのWrite指令であって、かつ、この指令によりWriteをした結果、値が変化したか否かを判断し（ステップS205、図3のステップS08に対応）、値変化している場合は装置模擬Ｉ/Ｆ部21へ値変化イベントを送信する（ステップS206、図3のステップS09に対応）。その後、処理が終了したかを判断し（ステップS207）、終了していなければステップS201の前の状態に戻り、処理が終了していればこのフローを終了する。
【００３５】
一方、仮想Ｉ/Ｏ24への出力へのWrite指令であって値変化していない場合、及び仮想Ｉ/Ｏ24へのRead指令の場合は、ステップS206を行わずに上記ステップS207を行う。また、上記ステップS202で実Ｉ/Ｏ25への指令（ReadまたはWrite）と判断した場合も同様に、ステップS203の後、ステップS207で処理が終了したか否かを判断する。
【００３６】
・装置模擬Ｉ/Ｆ部の動作
【００３７】
次に、図６及び図７を用いて装置模擬Ｉ/Ｆ部21のフローを説明する。図６は１タスクで処理する場合を、図７は２タスクで処理する場合をそれぞれ示している。
図６において、装置模擬Ｉ/Ｆ部21は装置模擬プログラム30からの指令またはＩ/Ｏ切替部23からの値変化イベントを受信すると（ステップS301、図3のステップS02、S09、S12に対応）、装置模擬プログラム30からの指令かＩ/Ｏ切替部23からの値変化イベントかを判断する（ステップS302）。Ｉ/Ｏ切替部23からの値変化イベントの場合は装置模擬プログラム30へこれを転送し（ステップS303、図3のステップS10に対応）、装置模擬プログラム30からの指令の場合はＩ/Ｏ切替部23へこの指令を転送する（ステップS304、図3のステップS03、S13に対応）。そして、処理が終了したか否かを判断し（ステップS305）、終了していない場合はステップS301に戻り、処理が終了している場合はこのフローを終了する。
【００３８】
装置模擬Ｉ/Ｆ部21のフローを２タスクで行う場合、図７のフロー１では装置模擬プログラム30からの指令を受信し（ステップS311、図3のステップS02、S12に対応）、受信した指令をＩ/Ｏ切替部23へ転送する（ステップS312、図3のステップS03、S13に対応）。そして、処理が終了したか否かを判断し（ステップS313）、処理が終了していない場合はステップＳ311に戻り、処理が終了している場合はフロー１を終了する。図７のフロー２では、装置模擬Ｉ/Ｆ部21はＩ/Ｏ切替部23からの値変化イベントを受信し（ステップS321、図3のステップS09に対応）、受信した値変化イベントを装置模擬プログラム30へ転送する（ステップS322、図3のステップS10に対応）。そして、処理が終了したか否かを判断し（ステップS323）、処理が終了していない場合はステップＳ321に戻り、処理が終了している場合はフロー２を終了する。
【００３９】
・装置模擬プログラムの動作
【００４０】
次に、図８を用いて装置模擬プログラム30のフローを説明する。
装置模擬プログラム30は、指令がある場合に装置模擬Ｉ/Ｆ部21へ送信し（ステップS401、図3のステップS02に対応）、装置模擬Ｉ/Ｆ部21から値変化イベントを受信する（ステップS402、図3のステップS10に対応）。そして、受信した値変化イベントによって起動条件が満たされた装置模擬処理があるか否かを判断し（ステップS403）、該当する装置模擬処理がある場合にはこれを起動して別スレッドで実行し、この処理の中で新たな指令を装置模擬Ｉ/Ｆ部21へ送信する（ステップS404、図3のステップS11、S12に対応）。その後、装置模擬プログラム30は装置模擬が終了したか否かを判断し（ステップS405）、終了していない場合はステップＳ402に戻り、処理が終了している場合はこのフローを終了する。なお、送信する指令が無い場合はステップS401の送信処理を省略できる。
【００４１】
本実施の形態によれば、制御プログラム試験システム１は、コントローラ２に制御プログラム20、Ｉ/Ｏ切替部23、装置模擬Ｉ/Ｆ部21、実Ｉ/Ｏ25、及び仮想Ｉ/Ｏ24を備え、パソコン３に装置模擬プログラム30を備え、制御プログラム20または装置模擬プログラム30からの指令に基づき仮想Ｉ/Ｏ24に値変化が生じると装置模擬プログラム30が装置模擬処理を行う構成としたことにより、装置模擬プログラム30をパソコン３からコントローラ２にダウンロードすることなく制御プログラム20の制御プログラム試験（制御プログラム20による装置模擬プログラム30の装置模擬処理の実行）を行うことが可能となる。また、開発中にデバッグが何回も必要となる装置模擬プログラム30をコントローラ２にダウンロードする時間を削減できるため、開発工期を短縮できる。
また、装置模擬プログラム30に時間管理の機能を設けることにより、指令を所定の時刻に実行するよう自動制御することもできる。
【００４２】
実施の形態２．
本発明を実施するための実施の形態２に係る制御プログラム試験システム１Ａを図９〜図１２を用いて説明する。構成は実施の形態１と同じで、装置模擬プログラム30Ａと装置模擬Ｉ/Ｆ部21Ａの機能が異なる。具体的には、装置模擬プログラム30Ａは時間に関する情報を指令（ReadおよびWrite）に付与する機能を有し、装置模擬Ｉ/Ｆ部21Ａはこの指令のリストを受信すると付与された時間情報に基づいて指令をＩ/Ｏ切替部23へ転送する機能を有する。
【００４３】
・全体の動作
【００４４】
ここで、制御プログラム試験システム１Ａの動作について説明する。
図９は、制御プログラム試験システム１Ａ全体の動作シーケンスを示し、実線は実際の処理を伴う動作を、破線は繰り返し同じ動作に戻る場合を表している。
まず、制御プログラム試験システム１ＡはＩ/Ｏ切替部23と装置模擬Ｉ/Ｆ部21Ａを起動する。このとき、どちらを先に起動しても良い。次に、装置模擬プログラム30Ａ、制御プログラム20の順に起動する。
【００４５】
各機能ブロックを起動させると、制御プログラム試験システム１Ａは、コントローラ２Ａの装置模擬Ｉ/Ｆ部21Ａからパソコン３Ａの装置模擬プログラム30Ａへ期間情報をつけて指令リスト取得要求を送信する（ステップS21）。この処理は予め定めた時刻に定期的あるいは不定期に行われる。
【００４６】
装置模擬プログラム30Ａは、指令リスト取得要求を受信すると指定された期間における指令の実行時刻を決定し、この時刻情報付きの指令リストを作成し（ステップS22）、その結果を装置模擬Ｉ/Ｆ部21Ａへ送信する（ステップS23）。装置模擬Ｉ/Ｆ部21Ａは、受信した指令リストの時刻情報を参照し、指定された時刻になるとＩ/Ｏ切替部23へ指令を送信する（ステップS24）。なお、時刻の計測はコントローラ２Ａ内に設けられたタイマ（図示しない）等を用いて行う。
制御プログラム20は、制御処理（ステップS25）において、データのRead及びWriteの指令をＩ/Ｏ切替部23に送信する（ステップS26）。
なお、制御プログラム20からの指令と装置模擬Ｉ/Ｆ部21Ａからの指令のどちらが先に行われるかは試験対象によって決まる。
【００４７】
Ｉ/Ｏ切替部23は、装置模擬Ｉ/Ｆ部21Ａや制御プログラム20から指令を受信すると実Ｉ/Ｏ25と仮想Ｉ/Ｏ24のどちらに入力すべきかＩ/Ｏ切替設定データ部22を参照して判断し、判断結果に基づいて実Ｉ/Ｏ25または仮想Ｉ/Ｏ24へ指令を入力する（ステップS27）。そして、実Ｉ/Ｏ25または仮想Ｉ/Ｏ24のデータRead及びWriteを行い、Readしたデータを制御プログラム20へ送信する（ステップS28）。
【００４８】
Ｉ/Ｏ切替部23は、また、仮想Ｉ/Ｏ24を介してデータの読み書きをした結果、この指令が出力指令であって、かつ、この出力指令により値が変化したか否かを判断し（ステップS29）、値が変化している場合は値変化イベントを装置模擬Ｉ/Ｆ部21Ａへ送信する（ステップS30）。
【００４９】
装置模擬Ｉ/Ｆ部21Ａは、この値変化イベントを装置模擬プログラム30Ａへ転送する（ステップS31）。
装置模擬プログラム30Ａは、値変化イベントを受信すると値変化イベントにより起動条件が満たされた新しい装置模擬処理があるか否かを判断し、起動条件が満たされた装置模擬処理がある場合はこれを起動して別スレッドで実行する（ステップS32）。
【００５０】
装置模擬Ｉ/Ｆ部21Ａは、装置模擬プログラム30Ａに対してステップS21で要求した期間の指令リストの取得要求を再度送信し（ステップS33）、装置模擬プログラム30Ａは受信した指令リストの取得要求に応答して指定期間における指令リストを指令に時刻を付けて作成し（ステップS34）、装置模擬Ｉ/Ｆ部21Ａへ送信する（ステップS35）。その後、装置模擬プログラム30Ａは指令リストにある処理が終了したか否かを判断し、処理が終了していないと判断した場合はステップS31の値変化イベントを受信するより前の状態に戻る。
【００５１】
装置模擬Ｉ/Ｆ部21ＡはステップS35により指令リストを受信すると、保有していた指令リストを上書きし（ステップS36）、その後、指令リストにある処理が終了したか否かを判断し、処理が終了していないと判断した場合はステップS21の前の状態に戻り、予め設定された所定時刻になると再び指令リストの取得要求を送信し、以後、同様の動作を繰り返す。
【００５２】
制御プログラム試験システム１Ａは、上記の動作を繰り返し行うことで、装置模擬プログラム30Ａが開発に用いたパソコン３Ａからコントローラ２Ａへのダウンロードすることなく、制御プログラム20の制御プログラム試験を行うことができる。また、指令に時刻情報を付与することにより、タイミング調整が必要な指令の実行時刻を自動制御することもできる。  
【００５３】
ここで、各機能ブロックそれぞれの動作を、フローチャートを用いて説明する。
【００５４】
・装置模擬Ｉ/Ｆ部の動作
【００５５】
図１０は、装置模擬Ｉ/Ｆ部21Ａの動作を示すフローチャートであり、３つのタスクフローで構成されている。
【００５６】
フロー１は、パソコン３Ａの装置模擬プログラム30Ａから定期的に（不定期であってもよい）指定時刻つきの指令を取得するためのフローである。
フロー２は、装置模擬プログラム30Ａから取得した指令リストに従い、付与された（指定された）時刻に指令をＩ/Ｏ切替部23へ送信するためのフローである。
フロー３は、Ｉ/Ｏ切替部23から値変化イベントを受信して装置模擬プログラム30Ａへ転送し、次に指令リストの取得要求を送信するまでの期間の指令リストを取得しなおすためのフローである。
【００５７】
フロー１において、装置模擬Ｉ/Ｆ部21Ａは装置模擬プログラム30Ａに対し、所定の期間情報を付して指令リストの取得要求を送信し、装置模擬プログラム30Ａから指令リストを受信すると自装置に設けられた保有リストに新たに取得した指令リストを追加する（ステップS501、図9のステップS23に対応）。
【００５８】
そして装置模擬Ｉ/Ｆ部21Ａのフロー２がスリープ状態であればこれを解除し（ステップS502）、ステップS501で取得した指令リストの最後の指令で指定された時刻より所定時間前までの間、フロー１をスリープ状態にさせる（S503）。ステップS501で取得した指令リストの最後の指令で指定された時刻より所定時間前になるとフロー１のスリープ状態を解除して処理が終了したか否かを判断し（ステップS504）、処理が終了していなければステップS501の前の状態に戻り、処理が終了していればこのフローを終了する。
【００５９】
フロー２では、装置模擬Ｉ/Ｆ部21Ａは保有している指令リストに現在の時刻が指定時刻とされた指令があるか否かを判断し（ステップS511）、現在の時刻が指定時刻とされた指令がある場合はこの指令をＩ/Ｏ切替部23へ送信し、この指令を実行させる（ステップS512、図9のステップS24に対応）。
【００６０】
現在の時刻が指定時刻とされた指令が無い場合、あるいはステップS512が終了すると、指令リストをチェックして次の指令で指定された時刻までこのフロー２をスリープ状態とする（ステップS513）。次の指令で指定された時刻になるとフロー２のスリープ状態を解除し、処理が終了したか否かを判断し（ステップS514）、処理が終了していなければステップS511の前の状態に戻り、処理が終了していればこのフローを終了する。
【００６１】
フロー３では、装置模擬Ｉ/Ｆ部21ＡはＩ/Ｏ切替部23からの値変化イベントを受信し（ステップS521、図9のステップS30に対応）、装置模擬プログラム30Ａへこれを転送する（ステップS522、図9のステップS31に対応）。そして、次に指令リスト取得要求を送信する所定時間までの間における指令リストを更新するために、装置模擬プログラム30Ａへ指令リスト取得要求を送信して新たな指令リストを取得し、保有している指令リストを上書きする（ステップS523、図9のステップS36に対応）。
【００６２】
装置模擬Ｉ/Ｆ部21Ａは、その後、フロー２がスリープ状態にあればこれを解除し（ステップS524）、処理が終了したか否かを判断し（ステップS525）、終了していない場合はステップS521の前の状態に戻り、処理が終了している場合はこのフローを終了する。
【００６３】
・装置模擬プログラムの動作
【００６４】
次に、図１１及び図１２を用いて装置模擬プログラム30Ａのフローを説明する。図１１は１タスクで処理する場合を、図１２は２タスクで処理する場合をそれぞれ示している。
図１１において、装置模擬プログラム30Ａは装置模擬Ｉ/Ｆ部21Ａから指令リストの取得要求または値変化イベントを受信すると（ステップS601、図9のステップS21、S31、S33に対応）、受信したデータは値変化イベントか指令リストの取得要求かを判断し（ステップS602）、値変化イベントの場合はこの値変化イベントにより起動条件が満たされた装置模擬処理があるか否かを判断する（ステップS603）。
【００６５】
該当する装置模擬処理がある場合にはこれを起動して別スレッドで実行し、この処理の中でこれより後の指令を時刻つきで計算する（ステップS604、図9のステップS32に対応）。ステップS601で受信したデータが指令リストの取得要求である場合、指令リスト取得要求で要求した所定期間分の指令リストを装置模擬プログラム30Ａの各装置模擬処理から取得し、装置模擬Ｉ/Ｆ部21Ａに送信する（ステップS605、図9のステップS23、S35に対応）。
【００６６】
値変化イベントによって起動条件が満たされた装置模擬処理が無い場合や装置模擬処理の別スレッドで指令を実行した後、あるいは装置模擬Ｉ/Ｆ部21Ａへ指令を送信した後、装置模擬プログラム30Ａは装置模擬処理が終了したか否かを判断し（ステップS606）、装置模擬処理が終了していない場合はステップS601の前の状態に戻り、処理が終了している場合はこのフローを終了する。
【００６７】
一方、図１２に示すように２タスクで処理する場合、装置模擬プログラム30Ａはフロー１において装置模擬Ｉ/Ｆ部21Ａから値変化イベントを受信し（ステップS611、図9のステップS31に対応）、この値変化イベントにより起動条件が満たされた装置模擬処理があるか否かを判断する（ステップS612）。該当する装置模擬処理がある場合はこれを起動して別スレッドで実行し、この処理の中でこれより後の指令を時刻つきで計算する（ステップS613、図9のステップS32に対応）。
【００６８】
その後、装置模擬処理が終了したか否かを判断し（ステップS614）、終了していない場合はステップS611の前の状態に戻り、処理が終了している場合はこのフローを終了する。
【００６９】
装置模擬プログラム30Ａは、また、図１２のフロー２において、装置模擬Ｉ/Ｆ部21Ａから所定期間分の指令リストの取得要求を受信し（ステップS621、図9のステップS21、S33に対応）、要求された指令リストを装置模擬プログラム30Ａの各装置模擬処理から取得し、装置模擬Ｉ/Ｆ部21Ａに送信する（ステップS622、図9のステップS23、S35に対応）。装置模擬Ｉ/Ｆ部21Ａへ指令を送信した後、装置模擬プログラム30Ａは装置模擬処理が終了したか否かを判断し（ステップS623）、終了していない場合はステップS621の前の状態に戻り、処理が終了している場合はこのフローを終了する。
【００７０】
なお、制御プログラム20及びＩ/Ｏ切替部23は実施の形態１と同じであるため、説明を省略する。
【００７１】
本実施の形態によれば、制御プログラム試験システム１Ａは、装置模擬プログラム30Ａと装置模擬Ｉ/Ｆ部21Ａの機能を拡張して指令に指定時刻に実行する時刻情報を付与することにより、実施の形態１に記載の効果に加えて、指令を所定の時刻に自動制御で実行させることが可能となる。これは、実施の形態１における制御プログラム30に時間管理の機能を備えた場合と同様の効果を奏するものである。
【００７２】
実施の形態３．
本発明を実施するための実施の形態３に係る制御プログラム試験システム１Ｂを図１３〜図１８を用いて説明する。図１３に示すように、本実施の形態に係る制御プログラム試験システム１Ｂは、実施の形態２の構成に加えて、装置模擬Ｉ/Ｆ部21Ｂ、Ｉ/Ｏ切替部23、制御プログラム20それぞれに接続された連携動作タイミング調整部26を備えている。また、その他の構成については、装置模擬Ｉ/Ｆ部21Ｂは実施の形態２と機能が一部異なるものの、それ以外は同じであるため説明を省略する。
【００７３】
・全体の動作
【００７４】
ここで、制御プログラム試験システム１Ｂの動作について説明する。
図１４は、制御プログラム試験システム１Ｂ全体の動作シーケンスを示し、実線は実際の処理を伴う動作を、破線は繰り返し同じ動作に戻る場合を表している。
まず、制御プログラム試験システム１ＢはＩ/Ｏ切替部23、装置模擬Ｉ/Ｆ部21Ｂ、連携動作タイミング調整部26を任意の順に起動する。次に、装置模擬プログラム30Ａを起動し、制御プログラム20を起動する。
【００７５】
各機能ブロックを起動させると、制御プログラム試験システム１Ｂは、コントローラ２Ｂの装置模擬Ｉ/Ｆ部21Ｂから連携動作タイミング調整部26へ制御プログラム20の停止指令を送信し（ステップS41）、連携動作タイミング調整部26は制御プログラム20を停止するＡＰＩ（Application Program Interface）を読んで制御プログラム20を停止する（ステップS42）。なお、連携動作タイミング調整部26は制御プログラムリストを有し、制御プログラム20を止める際にはこれを参照する。
【００７６】
その後、連携動作タイミング調整部26は装置模擬Ｉ/Ｆ部21Ｂに装置模擬入力時刻停止指令を送信し（ステップS43）、装置模擬Ｉ/Ｆ部21Ｂはパソコン３Ａの装置模擬プログラム30Ａへ所定期間における指令リストを要求する指令リスト取得要求を送信する（ステップS44）。この処理は予め定めた時刻に定期的あるいは不定期に行われる。なお、この装置模擬入力時刻停止指令とは、装置模擬Ｉ/Ｆ部21Ｂ内の内部時刻を停止させる指令である。
【００７７】
装置模擬プログラム30Ａは、指令リスト取得要求を受信すると所定期間における指令の実行時刻を決定し、この時刻情報を付けた指令リストを作成して（ステップS45）装置模擬Ｉ/Ｆ部21Ｂへ送信する（ステップS46）。
【００７８】
装置模擬Ｉ/Ｆ部21Ｂは、指令リストを受信すると連携動作タイミング調整部26へ制御プログラム20の再開指令を送信し（ステップS47）、連携動作タイミング調整部26は制御プログラム20を再開（もしくは開始）するＡＰＩを読んで制御プログラム20を再開（もしくは開始）する（ステップS48）。
【００７９】
連携動作タイミング調整部26は、ステップS48にて制御プログラム20を再開させた後、装置模擬Ｉ/Ｆ部21Ｂからの入力が行われるように、装置模擬Ｉ/Ｆ部21Ｂに装置模擬入力時刻進行指令を送信する（ステップS49）。なお、この装置模擬入力時刻進行指令とは、装置模擬Ｉ/Ｆ部21Ｂ内の内部時刻を進行させる指令である。
【００８０】
制御プログラム20が再開し、制御処理（ステップS50）により制御プログラム20からＩ/Ｏ切替部23へ指令が送信されると（ステップS51）、Ｉ/Ｏ切替部23はＩ/Ｏを切替える（ステップS52）。連携動作タイミング調整部26へ制御プログラム20の停止指令を送信し（ステップS53）、連携動作タイミング調整部26は制御プログラム20を停止するＡＰＩを読み制御プログラムリストを参照して制御プログラム20を停止し（ステップS54）、制御プログラム20が停止した後にＩ/Ｏ切替部23はデータのReadまたはWriteを行う（ステップS55）。
【００８１】
例えば実Ｉ/Ｏ25への指令の場合、Ｉ/Ｏ切替部23はこの指令に従って実Ｉ/Ｏ25を介してデータのReadまたはWriteを行う。仮想Ｉ/Ｏ24へのWrite指令であれば実Ｉ/Ｏ25へ書き込んだ後に連携動作タイミング調整部26へ制御プログラム20の停止指令を送信し（ステップS53）、制御プログラム20の停止が完了した後、仮想Ｉ/Ｏ24にWriteを行う（ステップS55）。また、仮想Ｉ/Ｏ24へのRead指令であれば、仮想Ｉ/Ｏ24に対してReadを行う（ステップS55）。
【００８２】
指令が仮想Ｉ/Ｏ24へのWrite指令であって、その指令の実行により値変化が発生した場合、Ｉ/Ｏ切替部23は値変化イベントを装置模擬Ｉ/Ｆ部21Ｂに送信する（ステップS57）。
【００８３】
また、図示はしていないが、指令が仮想Ｉ/Ｏ24に対する出力へのWrite指令であって値変化イベントを送信しない場合は、Ｉ/Ｏ切替部23は連携動作タイミング調整部26に制御プログラム20の再開指令を送信し、連携動作タイミング調整部26は制御プログラム20を再開するＡＰＩを読んでこれを再開する。
その後、連携動作タイミング調整部26は、装置模擬I/F部21Bに装置模擬入力時刻進行指令を送って、装置模擬I/F部21Bの内部時刻を進行させる。
【００８４】
ステップS57により装置模擬Ｉ/Ｆ部21Ｂが値変化イベントを受信した場合、装置模擬Ｉ/Ｆ部21Ｂは装置模擬プログラム30Ａへこれを転送する（ステップS58）。
装置模擬プログラム30Ａは、値変化イベントを受信すると値変化イベントにより起動条件が満たされた新しい装置模擬処理があるか否かを判断し、起動条件が満たされた装置模擬処理がある場合はこれを起動し、指定期間における指令を時刻付きで作成する（ステップS59）。
【００８５】
装置模擬Ｉ/Ｆ部21Ｂはその後、ステップS44で要求した期間の指令リストの取得要求を再度送信し（ステップS60）、装置模擬プログラム30Ａはこの要求に応答して指令リストを作成し（ステップS61）、装置模擬Ｉ/Ｆ部21Ｂへ送信する（ステップS62）。そして、再び指令リストの取得要求や値変化イベントを受信する前の状態に戻る。
【００８６】
装置模擬Ｉ/Ｆ部21ＢはステップS62にて指令リストを受信すると、保有していた指令リストを上書きする（ステップS63）。装置模擬Ｉ/Ｆ部21Ｂは、ステップS63にて指令リストを上書きする。その後、制御プログラム20の再開指令を装置模擬Ｉ/Ｆ部21Ｂから連携動作タイミング調整部26に送信する（ステップS47）。また、連携動作タイミング調整部26は制御プログラム20を再開し（ステップS48）、装置模擬入力時刻進行指令を装置模擬Ｉ/Ｆ部21Ｂに送信する(ステップS49)。そして、ステップS41以降の動作を繰り返す。
その後、装置模擬Ｉ/Ｆ部21Ｂは、装置模擬入力時刻進行指令を受信すると、内部時刻を進行させ、ステップS47以降の処理を繰り返す。
【００８７】
装置模擬Ｉ/Ｆ部21Ｂは、また、内部時刻が進行している期間は装置模擬プログラム30Ａの装置模擬処理を実行する。具体的には、ステップS46やステップS62にて受信した指令リストに従い、指定時刻より所定時間前になると連携動作タイミング調整部26へ制御プログラム20の再開指令を送信し、連携動作タイミング調整部26が制御プログラム20を再開するＡＰＩを読んで制御プログラム20を再開させる（ステップS48）。なお、ここでいう所定時間とは、装置模擬Ｉ/Ｆ部21Ｂから連携動作タイミング調整部26を介して制御プログラム20へ停止指令が到達するのに要する時間である。
【００８８】
制御プログラム20を再開させた後、装置模擬Ｉ/Ｆ部21Ｂは指定時刻になるとＩ/Ｏ切替部23に指令を送信し（図示しない）、Ｉ/Ｏ切替部23はステップS51にて制御プログラム20から指令を受信したときと同様に以降の処理を繰り返す。
【００８９】
ここで、各機能ブロックそれぞれの動作を、フローチャートを用いて説明する。
【００９０】
・装置模擬Ｉ/Ｆ部の動作
【００９１】
装置模擬Ｉ/Ｆ部21Ｂの動作を４つのタスクフローで実施する場合を図１５、図１６を用いて説明する。図１５はフロー１およびフロー２を、図１６はフロー３およびフロー４を示している。
【００９２】
フロー１は、パソコン３Ａの装置模擬プログラム30Ａから定期的に（不定期であってもい）指定時刻つきの指令を取得するためのフローである。このフローの処理前後において、制御プログラム20の停止指令や再開指令を連携動作タイミング調整部26へ送信する。
フロー２は、装置模擬プログラム30Ａから取得した指令リストに従い、付与された（指定された）時刻に指令をＩ/Ｏ切替部23へ送信するためのフローである。指令を送る前に、制御プログラム20の停止指令を連携動作タイミング調整部26へ送信する。
【００９３】
フロー３は、Ｉ/Ｏ切替部23から値変化イベントを受信して装置模擬プログラム30Ａへ転送し、次に指令リストの取得要求を送信するまでの期間の指令リストを取得しなおすためのフローである。この処理後に、制御プログラム20の再開指令を連携動作タイミング調整部26へ送信する。
フロー４は、連携動作タイミング調整部26から装置模擬入力時刻の停止指令または進行指令を受信して装置模擬Ｉ/Ｆ部21Ｂの内部時刻を停止または進行再開させるためのフローである。
【００９４】
フロー１において、装置模擬Ｉ/Ｆ部21Ｂは管理する内部時刻の進行状態を示す装置模擬入力時刻停止中フラグがＯＮかＯＦＦかを確認し（ステップS701）、ＯＦＦであれば連携動作タイミング調整部26に制御プログラム20の停止指令を送信する（ステップS702、図14のステップS41に対応）。
【００９５】
装置模擬Ｉ/Ｆ部21Ｂは、その後、装置模擬プログラム30Ａに対して所定の期間情報を付して指令リストの取得要求を送信し（図14のステップS44に対応）、装置模擬プログラム30Ａから指令リストを受信すると自装置に設けられた保有リストに新たに取得した指令リストを追加する（ステップS703、図14のステップS46に対応）。そして、制御プログラム20の再開指令を連携動作タイミング調整部26に送信し、完了を待つ（ステップS704、図14のステップS47に対応）。
【００９６】
装置模擬Ｉ/Ｆ部21Ｂのフロー２がスリープ状態であればこれを解除し（ステップS705）、ステップS703で取得した指令リストの最後の指令で指定された時刻より所定時間前までの間、フロー１をスリープ状態にさせる（ステップS706）。また、上述のステップS701において装置模擬入力時刻停止中フラグがＯＮの場合、ステップS706において、フロー１を所定時間（例えば100ms程度）スリープ状態にさせる。
このとき、装置模擬Ｉ/Ｆ部21Ｂが管理する内部時刻は、タイマの現時刻から内部時刻の進行を停止させていた累積時間である累積時刻停止時間を差し引いて計算するものとする。
【００９７】
装置模擬Ｉ/Ｆ部21Ｂは、最後の指令で指定された時刻より所定時間前になるとフロー１のスリープ状態を解除して処理が終了したか否かを判断し（ステップS707）、処理が終了していなければステップS701の前の状態に戻り、処理が終了していればこのフローを終了する。なお、ここでいう所定時間とは、装置模擬Ｉ/Ｆ部21Ｂから連携動作タイミング調整部26を介して制御プログラム20へ停止指令が到達するのに要する時間である。
【００９８】
フロー２では、装置模擬Ｉ/Ｆ部21Ｂはタイマの値から算出される内部時刻から算出される装置模擬入力時刻の進行を停止する装置模擬入力時刻停止中フラグがＯＮかＯＦＦかを確認し（ステップS711）、ＯＦＦであれば保有している指令リストに現時刻が指定時刻よりも所定時間前の指令があるか否かを判断する（ステップS712）。
【００９９】
現時刻が指令により指定された時刻よりも所定時間前であると判断した場合は制御プログラム20の停止指令を連携動作タイミング調整部26へ送信する（ステップS713）。そして、時間が経過し、現時刻が指定時刻になるとこの指令をＩ/Ｏ切替部23に送信し、この入力を実行させる（ステップS714）。なお、ここでいう所定時間とは、装置模擬Ｉ/Ｆ部21Ｂから連携動作タイミング調整部26を介して制御プログラム20へ停止指令を伝達するのに要する時間である。
【０１００】
装置模擬Ｉ/Ｆ部21Ｂは、その後、指令リストをチェックし、現時刻が指定時刻より所定時間前の指令が無い場合、次の指令で指定された時刻より所定時間前までこのフロー２をスリープ状態とする（ステップS715）。また、上述のステップS711において装置模擬入力時刻停止中フラグがＯＮの場合、ステップS715では、フロー２を所定時間（例えば100ms程度）スリープ状態にさせる。
このとき、装置模擬Ｉ/Ｆ部21Ｂが管理する内部時刻は、タイマの現時刻から内部時刻の進行を停止させていた累積時間である累積時刻停止時間を差し引いて計算するものとする。
【０１０１】
装置模擬Ｉ/Ｆ部21Ｂは、次の指令で指定された時刻より所定時間前になるとフロー２のスリープ状態を解除して処理が終了したか否かを判断し（ステップS716）、処理が終了していなければステップS711の前の状態に戻り、処理が終了していればこのフローを終了する。
【０１０２】
フロー３では、装置模擬Ｉ/Ｆ部21ＢはＩ/Ｏ切替部23からの値変化イベントを受信し（ステップS721、図14のステップS57に対応）、装置模擬プログラム30Ａへこれを転送する（ステップS722、図14のステップS58に対応）。そして、次に指令リスト取得要求を送信する所定時間までの間の指令リストを更新するために、装置模擬プログラム30Ａへ指令リスト取得要求を送信して新たな指令リストを取得し、保有している指令リストを上書きする（ステップS723）。
【０１０３】
装置模擬Ｉ/Ｆ部21Ｂは、指令リストが更新されると（図14のステップS46、ステップS62）、制御プログラム20の再開指令を連携動作タイミング調整部26へ送信し（ステップS724、図14のステップS47に対応）、フロー２がスリープ状態にあればこれを解除する（ステップS725）。そして、処理が終了したか否かを判断し（ステップS726）、終了していない場合はステップS721の前の状態に戻り、処理が終了している場合はこのフローを終了する。
【０１０４】
フロー４では、装置模擬Ｉ/Ｆ部21Ｂは連携動作タイミング調整部26から装置模擬入力時刻停止指令を受信し（ステップS731、図14のステップS43に対応）、装置模擬入力時刻停止中フラグをＯＮにし、応答を返す（ステップS732）。
【０１０５】
装置模擬Ｉ/Ｆ部21Ｂは、連携動作タイミング調整部26から装置模擬入力時刻進行指令を受信すると（ステップS733、図14のステップS49に対応）、装置模擬入力時刻停止中フラグをＯＦＦにし、装置模擬Ｉ/Ｆ部21Ｂのフロー１、フロー２のスリープ状態を解除し、その後、応答を返す（ステップS734）。
【０１０６】
装置模擬Ｉ/Ｆ部21Ｂは、装置模擬入力時刻停止指令受信から装置模擬入力時刻進行指令処理完了までの時間を累積時刻停止時間に加算し（ステップS735）、処理が終了したか否かを判断し（ステップS736）、終了していない場合はステップS731の前の状態に戻り、処理が終了している場合はこのフローを終了する。
【０１０７】
・Ｉ/Ｏ切替部の動作
【０１０８】
次に、図１７を用いてＩ/Ｏ切替部23のフローを説明する。
Ｉ/Ｏ切替部23は、制御プログラム20または装置模擬Ｉ/Ｆ部21Ｂから指令を受信すると（ステップS801）、この指令は実Ｉ/Ｏ25と仮想Ｉ/Ｏ24のどちらに対する指令かを判断する（ステップS802）。
【０１０９】
実Ｉ/Ｏ25への指令の場合は指令に従ってデータのReadまたはWriteを行い（ステップS803）、仮想Ｉ/Ｏ24への指令の場合はWrite指令か否かを判断する（ステップS804）。仮想Ｉ/Ｏ24へのWrite指令の場合は一旦実Ｉ/Ｏ25へWriteを行い（ステップS805）、次に、装置模擬Ｉ/Ｆ部21Ｂ以外からの指令で、Write指令か否かを判断する（ステップS806）。
【０１１０】
ステップS806の判断の結果、指令が仮想Ｉ/Ｏ24へのWrite指令の場合、制御プログラム20の停止指令を連携動作タイミング調整部26へ送信して制御プログラム20を停止させ（ステップS807）、ステップS806の判断の結果、指令が仮想Ｉ/Ｏ24へのWrite指令でない場合はそのまま、指令に従って仮想Ｉ/Ｏ27にWriteやReadを行う（ステップS808）。
【０１１１】
その後、指令がWrite指令であり、かつ、このWrite指令により値が変化したか否かを判断し（ステップS809、図14のステップS56に対応）、値変化している場合は装置模擬Ｉ/Ｆ部21Ｂへ値変化イベントを送信し（ステップS810、図14のステップS57に対応）このフローを終了する。
【０１１２】
ステップS809にて、仮想Ｉ/Ｏ24のWrite指令であって値変化していない場合、あるいは仮想Ｉ/Ｏ24へのRead指令の場合、この指令がWrite指令か否かを判断し（ステップS811）、Write指令の場合は制御プログラム20の再開指令を連携動作タイミング調整部26へ送信し、制御プログラム20を再開させて完了を待つ（ステップS812）。ステップS810又はステップS812の後、処理が終了したか否かを判断し（ステップS813）、処理が終了していると判断すればこのフローを終了し、処理が終了していないと判断すればステップS801の前の状態に戻る。
【０１１３】
・連携動作タイミング調整部の動作
【０１１４】
続いて、図１８を用いて連携動作タイミング調整部26のフローを説明する。
連携動作タイミング調整部26は、コントローラ２Ｂ内に備えられた受信停止指令リストが空でなければ受信停止指令リストから、空であれば連携動作タイミング調整部26以外の他のプログラムから制御プログラム20の停止指令を受信する（ステップS901、図14のステップS41に対応）。停止指令を受信すると装置内に設けられた制御プログラムリストを参照して制御プログラム20の処理を停止し（ステップS902）、装置模擬Ｉ/Ｆ部21Ｂに装置模擬入力時刻停止指令を送信し、応答が返ってくるのを待つ（ステップS903、図14のステップS43に対応）。そして、停止指令の送り元に停止完了の返信をする（ステップS904）。
【０１１５】
連携動作タイミング調整部26はその後、他のプログラムから制御プログラム20の再開指令または停止指令を受信すると（ステップS905）、再開指令を受信したか否かを判断する（ステップS906）。再開指令を受信していない場合は受信停止指令リストに停止指令を追加し（ステップS907）、ステップS905の前の状態に戻る。
【０１１６】
ステップS906で再開指令を受信したと判断した場合、制御プログラムリストを参照して制御プログラム20を再開し（ステップS908）、装置模擬Ｉ/Ｆ部21Ｂに装置模擬入力時刻進行指令を送信し、応答が返ってくるのを待つ（ステップS909、図14のステップS49に対応）。その後、再開指令の送り元に再開完了を返信し（ステップS910）、処理が終了したか否かを判断し（ステップS911）、処理が終了していなければステップS901の前の状態に戻り、処理が終了していればこのフローを終了する。
【０１１７】
本実施の形態によれば、制御プログラム試験システム１Ｂは、連携動作タイミング調整部26を備え、装置模擬をするために必要な動作、例えば装置模擬プログラム30が装置模擬処理を実行する間は制御プログラム20を停止して装置模擬入力時刻を一時停止することにより、実施の形態２に記載の効果に加えて、装置模擬プログラム30Ａからの装置模擬入力とコントローラ２上の制御プログラム20の連携動作のタイミングが変わらないようにすることができる。装置模擬プログラム30Ａと制御プログラム20の連携動作のタイミングへの影響を回避することができる。これにより、装置模擬プログラム30Ａの代わりに実際の被制御装置をコントローラ２Ｂに接続した場合と同じタイミングで制御プログラムの動作試験を行うことができる。
【０１１８】
なお、上記実施の形態１ないし実施の形態３の説明において「〜部」と説明したものは、「〜手段」、「〜回路」、「〜機器」としても良い。すなわち、ソフトウェア、ファームウェア、素子・デバイス・基板・配線などのハードウェア、あるいはこれらの組合せによって実施することができる。
また、上記実施の形態のコントローラ２は、制御プログラム20を試験するための制御プログラム試験装置と言い換えても良い。
また、上記指令はReadとWriteの指令を総称するものである。
【符号の説明】
【０１１９】
１、１Ａ、１Ｂ  制御プログラム試験システム
２、２Ａ、２Ｂ  コントローラ
20  制御プログラム
21、21Ａ、21Ｂ  装置模擬Ｉ/Ｆ部
22  Ｉ/Ｏ切替設定データ部
23  Ｉ/Ｏ切替部
24  仮想Ｉ/Ｏ
25  実Ｉ/Ｏ
26  連携動作タイミング調整部
200  記憶媒体
201  ＲＡＭ
202  ＣＰＵ
203  コントローラ側Ｉ/Ｆ部
３、３Ａ、３Ｂ  パソコン
30、30Ａ  装置模擬プログラム
300  記憶媒体
301  ＲＡＭ
302  ＣＰＵ
303  パソコン側Ｉ/Ｆ部
【図１】
2013029914.tif 000003
【図２】
2013029914.tif 000004
【図３】
2013029914.tif 000005
【図４】
2013029914.tif 000006
【図５】
2013029914.tif 000007
【図６】
2013029914.tif 000008
【図７】
2013029914.tif 000009
【図８】
2013029914.tif 000010
【図９】
2013029914.tif 000011
【図１０】
2013029914.tif 000012
【図１１】
2013029914.tif 000013
【図１２】
2013029914.tif 000014
【図１３】
2013029914.tif 000015
【図１４】
2013029914.tif 000016
【図１５】
2013029914.tif 000017
【図１６】
2013029914.tif 000018
【図１７】
2013029914.tif 000019
【図１８】
2013029914.tif 000020