被制御装置を模擬した装置模擬プログラムを有する端末装置に接続され、前記被制御装置を制御する制御プログラム、前記被制御装置に対するデータの入出力を実際に行う実インタフェース部、前記被制御装置に対するデータの入出力を仮想的に行う仮想インタフェース部、前記装置模擬プログラム及び前記制御プログラムのいずれか一方からの指令に応じて前記実インタフェース部と前記仮想インタフェース部とを切替える切替部、を備え、前記切替部は、前記仮想インタフェース部から前記指令を実行し値変化が発生した場合に前記装置模擬プログラムに値変化に関する情報を送信することを特徴とする制御プログラム試験装置。前記装置模擬プログラムから前記指令を受信し、該指令を前記切替部に送信する装置模擬インタフェース部を備え、前記装置模擬プログラムは、前記指令に該指令を実行する時刻情報を付して前記装置模擬インタフェース部に送信し、前記装置模擬インタフェース部は前記時刻情報に基づき前記指令を送信し、前記切替部は前記指令を受信し、該指令に応じて前記実インタフェース部と前記仮想インタフェース部とを切替えることを特徴とする請求項1に記載の制御プログラム試験装置。前記装置模擬プログラムからの指令が前記仮想インタフェース部への指令である場合に、前記制御プログラムの処理を停止して前記切替部に前記装置模擬プログラムからの指令を実行させるタイミング調整部、を備えたことを特徴とする請求項1に記載の制御プログラム試験装置。被制御装置を模擬した装置模擬プログラムを有する端末装置と、前記被制御装置を制御する制御プログラム、前記被制御装置に対するデータの入出力を実際に行う実インタフェース部、前記被制御装置に対するデータの入出力を仮想的に行う仮想インタフェース部、前記装置模擬プログラム及び前記制御プログラムのいずれか一方からの指令に応じて前記実インタフェース部と前記仮想インタフェース部とを切替える切替部、を有し、前記端末装置に接続されたコントローラと、を備え、前記仮想インタフェース部から前記指令を実行して値変化が発生した場合に、前記切替部が前記装置模擬プログラムに値変化に関する情報を送信することを特徴とする制御プログラム試験システム。前記装置模擬プログラムから前記指令を受信し、該指令を前記切替部に送信する装置模擬インタフェース部を備え、前記装置模擬プログラムは、前記指令に該指令を実行する時刻情報を付して前記装置模擬インタフェース部に送信し、前記装置模擬インタフェース部は前記時刻情報に基づき前記指令を送信し、前記切替部は前記指令を受信し、該指令に応じて前記実インタフェース部と前記仮想インタフェース部とを切替えることを特徴とする請求項4に記載の制御プログラム試験システム。前記コントローラは、前記装置模擬プログラムからの指令が前記仮想インタフェース部への指令である場合に、前記制御プログラムの処理を停止して前記切替部に前記装置模擬プログラムからの指令を実行させるタイミング調整部、を備えたことを特徴とする請求項4に記載の制御プログラム試験システム。被制御装置を制御する制御プログラム、前記被制御装置に対するデータの入出力を実際に行う実インタフェース部、前記被制御装置に対するデータの入出力を仮想的に行う仮想インタフェース部、前記装置模擬プログラム及び前記制御プログラムのいずれか一方からの指令に応じて前記実インタフェース部と前記仮想インタフェース部とを切替える切替部、を有するコントローラと、前記コントローラに接続され、前記被制御装置を模擬した装置模擬プログラムを有する端末装置と、を備えた制御プログラム試験システムにおいて、前記制御プログラムまたは前記装置模擬プログラムが前記切替部に向けてデータ入出力に関する指令を送信する指令送信ステップと、前記指令送信ステップにより送信された前記指令に基づき、前記切替部が前記実インタフェース部と前記仮想インタフェース部とを切替えて前記実インタフェース部または前記仮想インタフェース部に前記指令を実行させる切替ステップと、前記切替ステップにより前記仮想インタフェース部が前記指令を実行した後、実行された前記指令により値変化が発生したか否かを前記切替部が判断する判断ステップと、前記判断ステップにより前記切替部が前記値変化が発生したと判断した場合に、前記切替部が前記装置模擬プログラムに対して値変化に関する情報を送信する値変化情報送信ステップと、前記値変化情報送信ステップにより送信された前記値変化に関する情報を受信した前記装置模擬プログラムが、前記被制御装置を模擬した装置模擬の処理を実行する装置模擬処理ステップと、を備えたことを特徴とする制御プログラムの試験方法。しかしながら、上記のシーケンスコントローラにおいては、制御プログラムの制御対象である装置模擬プログラムを外部のパソコン等で作成し、コントローラにダウンロードした後に制御プログラムの試験を行うため、装置模擬プログラムを変更するたびにコントローラにダウンロードしなければならないという課題があった。本発明はこのような課題を解決するためになされたもので、装置模擬プログラムをダウンロードせず制御プログラムの試験をすることができる制御プログラム試験装置、制御プログラム試験システム、及び制御プログラムの試験方法を得ることを目的とする。本発明に係る制御プログラム試験装置は、被制御装置を模擬した装置模擬プログラムを有する端末装置に接続され、被制御装置を制御する制御プログラム、被制御装置に対するデータの入出力を実際に行う実インタフェース部、被制御装置に対するデータの入出力を仮想的に行う仮想インタフェース部、装置模擬プログラム及び制御プログラムのいずれか一方からの指令に応じて実インタフェース部と仮想インタフェース部とを切替える切替部、を備え、仮想インタフェース部から指令を実行して値変化が発生した場合に切替部が装置模擬プログラムに値変化に関する情報を送信するものである。本発明に係る制御プログラム試験システムは、被制御装置を模擬した装置模擬プログラムを有する端末装置と、被制御装置を制御する制御プログラム、被制御装置に対するデータの入出力を実際に行う実インタフェース部、被制御装置に対するデータの入出力を仮想的に行う仮想インタフェース部、装置模擬プログラム及び制御プログラムのいずれか一方からの指令に応じて実インタフェース部と仮想インタフェース部とを切替える切替部、を有し、端末装置に接続されたコントローラと、を備え、仮想インタフェース部が指令を実行して値変化が発生した場合に、切替部が装置模擬プログラムに値変化に関する情報を送信するものである。本発明に係る制御プログラムの試験方法は、被制御装置を制御する制御プログラム、被制御装置に対するデータの入出力を実際に行う実インタフェース部、被制御装置に対するデータの入出力を仮想的に行う仮想インタフェース部、装置模擬プログラム及び制御プログラムのいずれか一方からの指令に応じて実インタフェース部と仮想インタフェース部とを切替える切替部、を有するコントローラと、コントローラに接続され、被制御装置を模擬した装置模擬プログラムを有する端末装置と、を備えた制御プログラム試験システムにおいて、制御プログラムまたは装置模擬プログラムが切替部に向けてデータ入出力に関する指令を送信する指令送信ステップと、指令送信ステップにより送信された指令に基づき、切替部が実インタフェース部と仮想インタフェース部とを切替えて実インタフェース部または仮想インタフェース部に指令を実行させる切替ステップと、切替ステップにより仮想インタフェース部が指令を実行した後、実行された指令により値変化が発生したか否かを切替部が判断する判断ステップと、判断ステップにより切替部が値変化が発生したと判断した場合に、切替部が装置模擬プログラムに対して値変化に関する情報を送信する値変化情報送信ステップと、値変化情報送信ステップにより送信された値変化に関する情報を受信した装置模擬プログラムが、被制御装置を模擬した装置模擬の処理を実行する装置模擬処理ステップと、を備えたものである。本発明によれば、上記構成を備えたことにより、コントローラに装置模擬プログラムをダウンロードすることなく制御プログラムの試験を行うことができる。実施の形態1.本発明を実施するための実施の形態1に係る制御プログラム試験システムを図1~図8を用いて説明する。図1において、制御プログラム試験システム1は、制御対象の被制御装置図示しないに接続され、これを制御するコントローラ2と、被制御装置を模擬した装置模擬プログラム30の開発生成に用いられるパソコン3とで構成されている。なお、コントローラ2は被制御装置に接続されない場合もある。コントローラ2には、記憶媒体200、RAM201、CPU202、被制御装置と接続され被制御装置に対するデータの入出力を実際に行う実インタフェース以下、実IOと称する25、パソコン3と接続するコントローラ側IF部203、が設けられている。RAM201には、被制御装置に対するデータの入出力を仮想的に行う仮想インタフェース以下、仮想IOと称する24が設けられ、記憶媒体200には、被制御装置を制御するための制御プログラム20、パソコン3の装置模擬プログラム30にアクセスする際に用いる装置模擬IF部21、指令ReadWriteに応じて仮想IO24と実IO25を切替る際に用いるIO切替設定データ部22、IO切替部23が保持されている。なお、制御プログラム20、装置模擬IF部21、及びIO切替部23はプログラムであり、IO切替設定データ部22はデータベースである。記憶媒体200に保持されたプログラムは、コントローラ2で起動するOS図示しないによってRAM201に展開され、CPU202で実行される。また、IO切替設定データ部22のデータはIO切替部26によってRAM201に展開され使用される。パソコン3には、RAM301、開発生成した装置模擬プログラム30やその他のデータを記憶する記憶媒体300、装置模擬プログラム30を読み出して動作させるCPU302、コントローラと接続するパソコン側IF部303が設けられている。記憶媒体300に保持されたプログラムは、パソコン3上で起動するOS図示しないによってRAM301に展開され、CPU302で実行される。コントローラ側IF部203やパソコン側IF部303としては、例えば、シリアル、USB、Ethernet登録商標に対応するインタフェースがある。図2は、制御プログラム試験システム1を機能ブロックで示す図である。コントローラ2には制御プログラム20、装置模擬IF部21、IO切替設定データ部22、IO切替部23、仮想IO24、及び実IO25が設けられ、パソコン3には装置模擬プログラム30が設けられている。全体の動作ここで、制御プログラム試験システム1の動作について説明する。図3は、制御プログラム試験システム1全体の動作シーケンスを示し、実線は実際の処理を伴う動作を、破線は繰り返し同じ動作に戻る場合を表している。まず、制御プログラム試験システム1はIO切替部23と装置模擬IF部21を起動する。このとき、どちらを先に起動しても良い。次に、装置模擬プログラム30と制御プログラム20を起動する。装置模擬プログラム30と制御プログラム20の起動順序は、試験対象によって決まる。各機能ブロックを起動させると、制御プログラム試験システム1は、次の3つのケースいずれかにより試験を開始する。ケース1:装置模擬プログラム30が装置模擬IF部21へ指令ReadまたはWriteを送信する。ケース2:制御プログラム20がIO切替部23へ指令ReadまたはWriteを送信する。ケース1の場合、装置模擬プログラム30が装置模擬処理を行いステップS01装置模擬IF部21へ指令を送信するとステップS02、装置模擬IF部21はIO切替部23へ転送するステップS03。ケース2の場合は制御プログラム20が制御処理を行いステップS04、IO切替部23へReadやWriteの指令を送信するステップS05。なお、図3の例ではケース1の動作ステップS01~ステップS03を行った後、ケース2のステップS04、ステップS05を順次行っているが、制御プログラム20の制御処理ステップS04から始めても良い。ステップS04及びステップS05による指令の送信を終えると、制御プログラム20は制御が終了したか否かを判断し、処理が終了していないと判断した場合はステップS04及びステップS05より前の状態に戻る。IO切替部23は、装置模擬IF部21またはおよび制御プログラム20から指令を受信すると実IO25と仮想IO24のどちらに入力すべきかIO切替設定データ部22を参照して判断し、判断結果に基づいて実IO25および仮想IO24の切替制御を行うステップS06。そして、実IO25または仮想IO24のデータをReadしたり、WriteしたりするステップS07。このとき、制御プログラム20からの指令に従いReadしたデータは、制御プログラム20へ送信する。IO切替部23は、指令が被制御装置へのWriteであり、かつ、仮想IO24を介してデータをWriteした結果により値が変化したか否かを判断しステップS08、値が変化している場合は値変化イベントを装置模擬IF部21へ送信するステップS09。装置模擬IF部21は、この値変化イベントを装置模擬プログラム30へ転送しステップS10、その後、処理が終了したか否かを判断し、処理が終了していないと判断した場合はステップS01で指令を受信するより前の状態に戻る。装置模擬プログラム30は、装置模擬IF部21から受信した値変化イベントにより起動条件が満たされた装置模擬処理があるか否かを判断し、起動条件が満たされた装置模擬処理がある場合はこれを起動し、別スレッドで実行するステップS11。このステップS11の処理は、上記ステップS01と同じである。そして、この処理において装置模擬IF部21へ指令を送信するステップS12。指令の送信後、装置模擬プログラム30は実行すべき装置模擬処理が実行されたか否かを判断し、処理が終了していないと判断した場合はステップS10による値変化イベントを受信するより前の状態に戻る。装置模擬IF部21がステップS12による指令を受信するとIO切替部23に転送しステップS13、コントローラ2の各機能ブロックは装置模擬IF部21がステップS01で指令を受信した場合と同様の動作を繰り返す。このように、制御プログラム試験システム1は、上記の動作を繰り返し行うことで装置模擬プログラム30をコントローラ2へダウンロードすることなく、制御プログラム20の試験を、装置模擬プログラム30の開発に用いたパソコン3上で容易に実行できる。また、装置模擬プログラム30のダウンロード時間を削減することで、デバッグが何回も必要となる装置模擬プログラム30の開発工期を短縮することもできる。ここで、各機能ブロックそれぞれの動作の詳細を、フローチャートを用いて説明する。制御プログラムの動作図4は制御プログラム20のフローチャートである。制御プログラム20は、予めプログラム上に設定されたロジックに従いIO切替部23へRead指令を送信し、実IO25または仮想IO24からデータの読み出しを行うステップS101、図3のステップS04、S05、S07に対応。Read指令が無い場合、ステップS101の処理は省略できる。制御プログラム20はまた、予めプログラム上に設定されたロジックに従いIO切替部23へ指令を出して実IO25又は仮想IO24に値のWriteを行うステップS102。Readの場合と同様に、Write指令が無い場合はステップS102の処理を省略できる。そして、Write及びReadの制御が終了したか否かを判断しステップS103、制御処理が終了していない場合はステップS101の処理へ戻り、処理が終了している場合はこのフローを終了する。IO切替部の動作次に、図5を用いてIO切替部23のフローを説明する。IO切替部23は、装置模擬IF部21または制御プログラム20から指令ReadまたはWriteを受信するとステップS201、図3のステップS03、S05に対応、この指令は実IO25と仮想IO24のどちらに対する指令かを判断するステップS202。実IO25への指令の場合はこの指令に従ってデータのReadまたはWriteを行いステップS203、図3のステップS07に対応、仮想IO24への指令の場合はこの指令に従ってReadまたはWriteを行うステップS204、図3のステップS07に対応。仮想IO24へWriteを行う場合、その指令が出力へのWrite指令であって、かつ、この指令によりWriteをした結果、値が変化したか否かを判断しステップS205、図3のステップS08に対応、値変化している場合は装置模擬IF部21へ値変化イベントを送信するステップS206、図3のステップS09に対応。その後、処理が終了したかを判断しステップS207、終了していなければステップS201の前の状態に戻り、処理が終了していればこのフローを終了する。一方、仮想IO24への出力へのWrite指令であって値変化していない場合、及び仮想IO24へのRead指令の場合は、ステップS206を行わずに上記ステップS207を行う。また、上記ステップS202で実IO25への指令ReadまたはWriteと判断した場合も同様に、ステップS203の後、ステップS207で処理が終了したか否かを判断する。装置模擬IF部の動作次に、図6及び図7を用いて装置模擬IF部21のフローを説明する。図6は1タスクで処理する場合を、図7は2タスクで処理する場合をそれぞれ示している。図6において、装置模擬IF部21は装置模擬プログラム30からの指令またはIO切替部23からの値変化イベントを受信するとステップS301、図3のステップS02、S09、S12に対応、装置模擬プログラム30からの指令かIO切替部23からの値変化イベントかを判断するステップS302。IO切替部23からの値変化イベントの場合は装置模擬プログラム30へこれを転送しステップS303、図3のステップS10に対応、装置模擬プログラム30からの指令の場合はIO切替部23へこの指令を転送するステップS304、図3のステップS03、S13に対応。そして、処理が終了したか否かを判断しステップS305、終了していない場合はステップS301に戻り、処理が終了している場合はこのフローを終了する。装置模擬IF部21のフローを2タスクで行う場合、図7のフロー1では装置模擬プログラム30からの指令を受信しステップS311、図3のステップS02、S12に対応、受信した指令をIO切替部23へ転送するステップS312、図3のステップS03、S13に対応。そして、処理が終了したか否かを判断しステップS313、処理が終了していない場合はステップS311に戻り、処理が終了している場合はフロー1を終了する。図7のフロー2では、装置模擬IF部21はIO切替部23からの値変化イベントを受信しステップS321、図3のステップS09に対応、受信した値変化イベントを装置模擬プログラム30へ転送するステップS322、図3のステップS10に対応。そして、処理が終了したか否かを判断しステップS323、処理が終了していない場合はステップS321に戻り、処理が終了している場合はフロー2を終了する。装置模擬プログラムの動作次に、図8を用いて装置模擬プログラム30のフローを説明する。装置模擬プログラム30は、指令がある場合に装置模擬IF部21へ送信しステップS401、図3のステップS02に対応、装置模擬IF部21から値変化イベントを受信するステップS402、図3のステップS10に対応。そして、受信した値変化イベントによって起動条件が満たされた装置模擬処理があるか否かを判断しステップS403、該当する装置模擬処理がある場合にはこれを起動して別スレッドで実行し、この処理の中で新たな指令を装置模擬IF部21へ送信するステップS404、図3のステップS11、S12に対応。その後、装置模擬プログラム30は装置模擬が終了したか否かを判断しステップS405、終了していない場合はステップS402に戻り、処理が終了している場合はこのフローを終了する。なお、送信する指令が無い場合はステップS401の送信処理を省略できる。本実施の形態によれば、制御プログラム試験システム1は、コントローラ2に制御プログラム20、IO切替部23、装置模擬IF部21、実IO25、及び仮想IO24を備え、パソコン3に装置模擬プログラム30を備え、制御プログラム20または装置模擬プログラム30からの指令に基づき仮想IO24に値変化が生じると装置模擬プログラム30が装置模擬処理を行う構成としたことにより、装置模擬プログラム30をパソコン3からコントローラ2にダウンロードすることなく制御プログラム20の制御プログラム試験制御プログラム20による装置模擬プログラム30の装置模擬処理の実行を行うことが可能となる。また、開発中にデバッグが何回も必要となる装置模擬プログラム30をコントローラ2にダウンロードする時間を削減できるため、開発工期を短縮できる。また、装置模擬プログラム30に時間管理の機能を設けることにより、指令を所定の時刻に実行するよう自動制御することもできる。実施の形態2.本発明を実施するための実施の形態2に係る制御プログラム試験システム1Aを図9~図12を用いて説明する。構成は実施の形態1と同じで、装置模擬プログラム30Aと装置模擬IF部21Aの機能が異なる。具体的には、装置模擬プログラム30Aは時間に関する情報を指令ReadおよびWriteに付与する機能を有し、装置模擬IF部21Aはこの指令のリストを受信すると付与された時間情報に基づいて指令をIO切替部23へ転送する機能を有する。全体の動作ここで、制御プログラム試験システム1Aの動作について説明する。図9は、制御プログラム試験システム1A全体の動作シーケンスを示し、実線は実際の処理を伴う動作を、破線は繰り返し同じ動作に戻る場合を表している。まず、制御プログラム試験システム1AはIO切替部23と装置模擬IF部21Aを起動する。このとき、どちらを先に起動しても良い。次に、装置模擬プログラム30A、制御プログラム20の順に起動する。各機能ブロックを起動させると、制御プログラム試験システム1Aは、コントローラ2Aの装置模擬IF部21Aからパソコン3Aの装置模擬プログラム30Aへ期間情報をつけて指令リスト取得要求を送信するステップS21。この処理は予め定めた時刻に定期的あるいは不定期に行われる。装置模擬プログラム30Aは、指令リスト取得要求を受信すると指定された期間における指令の実行時刻を決定し、この時刻情報付きの指令リストを作成しステップS22、その結果を装置模擬IF部21Aへ送信するステップS23。装置模擬IF部21Aは、受信した指令リストの時刻情報を参照し、指定された時刻になるとIO切替部23へ指令を送信するステップS24。なお、時刻の計測はコントローラ2A内に設けられたタイマ図示しない等を用いて行う。制御プログラム20は、制御処理ステップS25において、データのRead及びWriteの指令をIO切替部23に送信するステップS26。なお、制御プログラム20からの指令と装置模擬IF部21Aからの指令のどちらが先に行われるかは試験対象によって決まる。IO切替部23は、装置模擬IF部21Aや制御プログラム20から指令を受信すると実IO25と仮想IO24のどちらに入力すべきかIO切替設定データ部22を参照して判断し、判断結果に基づいて実IO25または仮想IO24へ指令を入力するステップS27。そして、実IO25または仮想IO24のデータRead及びWriteを行い、Readしたデータを制御プログラム20へ送信するステップS28。IO切替部23は、また、仮想IO24を介してデータの読み書きをした結果、この指令が出力指令であって、かつ、この出力指令により値が変化したか否かを判断しステップS29、値が変化している場合は値変化イベントを装置模擬IF部21Aへ送信するステップS30。装置模擬IF部21Aは、この値変化イベントを装置模擬プログラム30Aへ転送するステップS31。装置模擬プログラム30Aは、値変化イベントを受信すると値変化イベントにより起動条件が満たされた新しい装置模擬処理があるか否かを判断し、起動条件が満たされた装置模擬処理がある場合はこれを起動して別スレッドで実行するステップS32。装置模擬IF部21Aは、装置模擬プログラム30Aに対してステップS21で要求した期間の指令リストの取得要求を再度送信しステップS33、装置模擬プログラム30Aは受信した指令リストの取得要求に応答して指定期間における指令リストを指令に時刻を付けて作成しステップS34、装置模擬IF部21Aへ送信するステップS35。その後、装置模擬プログラム30Aは指令リストにある処理が終了したか否かを判断し、処理が終了していないと判断した場合はステップS31の値変化イベントを受信するより前の状態に戻る。装置模擬IF部21AはステップS35により指令リストを受信すると、保有していた指令リストを上書きしステップS36、その後、指令リストにある処理が終了したか否かを判断し、処理が終了していないと判断した場合はステップS21の前の状態に戻り、予め設定された所定時刻になると再び指令リストの取得要求を送信し、以後、同様の動作を繰り返す。制御プログラム試験システム1Aは、上記の動作を繰り返し行うことで、装置模擬プログラム30Aが開発に用いたパソコン3Aからコントローラ2Aへのダウンロードすることなく、制御プログラム20の制御プログラム試験を行うことができる。また、指令に時刻情報を付与することにより、タイミング調整が必要な指令の実行時刻を自動制御することもできる。ここで、各機能ブロックそれぞれの動作を、フローチャートを用いて説明する。装置模擬IF部の動作図10は、装置模擬IF部21Aの動作を示すフローチャートであり、3つのタスクフローで構成されている。フロー1は、パソコン3Aの装置模擬プログラム30Aから定期的に不定期であってもよい指定時刻つきの指令を取得するためのフローである。フロー2は、装置模擬プログラム30Aから取得した指令リストに従い、付与された指定された時刻に指令をIO切替部23へ送信するためのフローである。フロー3は、IO切替部23から値変化イベントを受信して装置模擬プログラム30Aへ転送し、次に指令リストの取得要求を送信するまでの期間の指令リストを取得しなおすためのフローである。フロー1において、装置模擬IF部21Aは装置模擬プログラム30Aに対し、所定の期間情報を付して指令リストの取得要求を送信し、装置模擬プログラム30Aから指令リストを受信すると自装置に設けられた保有リストに新たに取得した指令リストを追加するステップS501、図9のステップS23に対応。そして装置模擬IF部21Aのフロー2がスリープ状態であればこれを解除しステップS502、ステップS501で取得した指令リストの最後の指令で指定された時刻より所定時間前までの間、フロー1をスリープ状態にさせるS503。ステップS501で取得した指令リストの最後の指令で指定された時刻より所定時間前になるとフロー1のスリープ状態を解除して処理が終了したか否かを判断しステップS504、処理が終了していなければステップS501の前の状態に戻り、処理が終了していればこのフローを終了する。フロー2では、装置模擬IF部21Aは保有している指令リストに現在の時刻が指定時刻とされた指令があるか否かを判断しステップS511、現在の時刻が指定時刻とされた指令がある場合はこの指令をIO切替部23へ送信し、この指令を実行させるステップS512、図9のステップS24に対応。現在の時刻が指定時刻とされた指令が無い場合、あるいはステップS512が終了すると、指令リストをチェックして次の指令で指定された時刻までこのフロー2をスリープ状態とするステップS513。次の指令で指定された時刻になるとフロー2のスリープ状態を解除し、処理が終了したか否かを判断しステップS514、処理が終了していなければステップS511の前の状態に戻り、処理が終了していればこのフローを終了する。フロー3では、装置模擬IF部21AはIO切替部23からの値変化イベントを受信しステップS521、図9のステップS30に対応、装置模擬プログラム30Aへこれを転送するステップS522、図9のステップS31に対応。そして、次に指令リスト取得要求を送信する所定時間までの間における指令リストを更新するために、装置模擬プログラム30Aへ指令リスト取得要求を送信して新たな指令リストを取得し、保有している指令リストを上書きするステップS523、図9のステップS36に対応。装置模擬IF部21Aは、その後、フロー2がスリープ状態にあればこれを解除しステップS524、処理が終了したか否かを判断しステップS525、終了していない場合はステップS521の前の状態に戻り、処理が終了している場合はこのフローを終了する。装置模擬プログラムの動作次に、図11及び図12を用いて装置模擬プログラム30Aのフローを説明する。図11は1タスクで処理する場合を、図12は2タスクで処理する場合をそれぞれ示している。図11において、装置模擬プログラム30Aは装置模擬IF部21Aから指令リストの取得要求または値変化イベントを受信するとステップS601、図9のステップS21、S31、S33に対応、受信したデータは値変化イベントか指令リストの取得要求かを判断しステップS602、値変化イベントの場合はこの値変化イベントにより起動条件が満たされた装置模擬処理があるか否かを判断するステップS603。該当する装置模擬処理がある場合にはこれを起動して別スレッドで実行し、この処理の中でこれより後の指令を時刻つきで計算するステップS604、図9のステップS32に対応。ステップS601で受信したデータが指令リストの取得要求である場合、指令リスト取得要求で要求した所定期間分の指令リストを装置模擬プログラム30Aの各装置模擬処理から取得し、装置模擬IF部21Aに送信するステップS605、図9のステップS23、S35に対応。値変化イベントによって起動条件が満たされた装置模擬処理が無い場合や装置模擬処理の別スレッドで指令を実行した後、あるいは装置模擬IF部21Aへ指令を送信した後、装置模擬プログラム30Aは装置模擬処理が終了したか否かを判断しステップS606、装置模擬処理が終了していない場合はステップS601の前の状態に戻り、処理が終了している場合はこのフローを終了する。一方、図12に示すように2タスクで処理する場合、装置模擬プログラム30Aはフロー1において装置模擬IF部21Aから値変化イベントを受信しステップS611、図9のステップS31に対応、この値変化イベントにより起動条件が満たされた装置模擬処理があるか否かを判断するステップS612。該当する装置模擬処理がある場合はこれを起動して別スレッドで実行し、この処理の中でこれより後の指令を時刻つきで計算するステップS613、図9のステップS32に対応。その後、装置模擬処理が終了したか否かを判断しステップS614、終了していない場合はステップS611の前の状態に戻り、処理が終了している場合はこのフローを終了する。装置模擬プログラム30Aは、また、図12のフロー2において、装置模擬IF部21Aから所定期間分の指令リストの取得要求を受信しステップS621、図9のステップS21、S33に対応、要求された指令リストを装置模擬プログラム30Aの各装置模擬処理から取得し、装置模擬IF部21Aに送信するステップS622、図9のステップS23、S35に対応。装置模擬IF部21Aへ指令を送信した後、装置模擬プログラム30Aは装置模擬処理が終了したか否かを判断しステップS623、終了していない場合はステップS621の前の状態に戻り、処理が終了している場合はこのフローを終了する。なお、制御プログラム20及びIO切替部23は実施の形態1と同じであるため、説明を省略する。本実施の形態によれば、制御プログラム試験システム1Aは、装置模擬プログラム30Aと装置模擬IF部21Aの機能を拡張して指令に指定時刻に実行する時刻情報を付与することにより、実施の形態1に記載の効果に加えて、指令を所定の時刻に自動制御で実行させることが可能となる。これは、実施の形態1における制御プログラム30に時間管理の機能を備えた場合と同様の効果を奏するものである。実施の形態3.本発明を実施するための実施の形態3に係る制御プログラム試験システム1Bを図13~図18を用いて説明する。図13に示すように、本実施の形態に係る制御プログラム試験システム1Bは、実施の形態2の構成に加えて、装置模擬IF部21B、IO切替部23、制御プログラム20それぞれに接続された連携動作タイミング調整部26を備えている。また、その他の構成については、装置模擬IF部21Bは実施の形態2と機能が一部異なるものの、それ以外は同じであるため説明を省略する。全体の動作ここで、制御プログラム試験システム1Bの動作について説明する。図14は、制御プログラム試験システム1B全体の動作シーケンスを示し、実線は実際の処理を伴う動作を、破線は繰り返し同じ動作に戻る場合を表している。まず、制御プログラム試験システム1BはIO切替部23、装置模擬IF部21B、連携動作タイミング調整部26を任意の順に起動する。次に、装置模擬プログラム30Aを起動し、制御プログラム20を起動する。各機能ブロックを起動させると、制御プログラム試験システム1Bは、コントローラ2Bの装置模擬IF部21Bから連携動作タイミング調整部26へ制御プログラム20の停止指令を送信しステップS41、連携動作タイミング調整部26は制御プログラム20を停止するAPIApplicationProgramInterfaceを読んで制御プログラム20を停止するステップS42。なお、連携動作タイミング調整部26は制御プログラムリストを有し、制御プログラム20を止める際にはこれを参照する。その後、連携動作タイミング調整部26は装置模擬IF部21Bに装置模擬入力時刻停止指令を送信しステップS43、装置模擬IF部21Bはパソコン3Aの装置模擬プログラム30Aへ所定期間における指令リストを要求する指令リスト取得要求を送信するステップS44。この処理は予め定めた時刻に定期的あるいは不定期に行われる。なお、この装置模擬入力時刻停止指令とは、装置模擬IF部21B内の内部時刻を停止させる指令である。装置模擬プログラム30Aは、指令リスト取得要求を受信すると所定期間における指令の実行時刻を決定し、この時刻情報を付けた指令リストを作成してステップS45装置模擬IF部21Bへ送信するステップS46。装置模擬IF部21Bは、指令リストを受信すると連携動作タイミング調整部26へ制御プログラム20の再開指令を送信しステップS47、連携動作タイミング調整部26は制御プログラム20を再開もしくは開始するAPIを読んで制御プログラム20を再開もしくは開始するステップS48。連携動作タイミング調整部26は、ステップS48にて制御プログラム20を再開させた後、装置模擬IF部21Bからの入力が行われるように、装置模擬IF部21Bに装置模擬入力時刻進行指令を送信するステップS49。なお、この装置模擬入力時刻進行指令とは、装置模擬IF部21B内の内部時刻を進行させる指令である。制御プログラム20が再開し、制御処理ステップS50により制御プログラム20からIO切替部23へ指令が送信されるとステップS51、IO切替部23はIOを切替えるステップS52。連携動作タイミング調整部26へ制御プログラム20の停止指令を送信しステップS53、連携動作タイミング調整部26は制御プログラム20を停止するAPIを読み制御プログラムリストを参照して制御プログラム20を停止しステップS54、制御プログラム20が停止した後にIO切替部23はデータのReadまたはWriteを行うステップS55。例えば実IO25への指令の場合、IO切替部23はこの指令に従って実IO25を介してデータのReadまたはWriteを行う。仮想IO24へのWrite指令であれば実IO25へ書き込んだ後に連携動作タイミング調整部26へ制御プログラム20の停止指令を送信しステップS53、制御プログラム20の停止が完了した後、仮想IO24にWriteを行うステップS55。また、仮想IO24へのRead指令であれば、仮想IO24に対してReadを行うステップS55。指令が仮想IO24へのWrite指令であって、その指令の実行により値変化が発生した場合、IO切替部23は値変化イベントを装置模擬IF部21Bに送信するステップS57。また、図示はしていないが、指令が仮想IO24に対する出力へのWrite指令であって値変化イベントを送信しない場合は、IO切替部23は連携動作タイミング調整部26に制御プログラム20の再開指令を送信し、連携動作タイミング調整部26は制御プログラム20を再開するAPIを読んでこれを再開する。その後、連携動作タイミング調整部26は、装置模擬IF部21Bに装置模擬入力時刻進行指令を送って、装置模擬IF部21Bの内部時刻を進行させる。ステップS57により装置模擬IF部21Bが値変化イベントを受信した場合、装置模擬IF部21Bは装置模擬プログラム30Aへこれを転送するステップS58。装置模擬プログラム30Aは、値変化イベントを受信すると値変化イベントにより起動条件が満たされた新しい装置模擬処理があるか否かを判断し、起動条件が満たされた装置模擬処理がある場合はこれを起動し、指定期間における指令を時刻付きで作成するステップS59。装置模擬IF部21Bはその後、ステップS44で要求した期間の指令リストの取得要求を再度送信しステップS60、装置模擬プログラム30Aはこの要求に応答して指令リストを作成しステップS61、装置模擬IF部21Bへ送信するステップS62。そして、再び指令リストの取得要求や値変化イベントを受信する前の状態に戻る。装置模擬IF部21BはステップS62にて指令リストを受信すると、保有していた指令リストを上書きするステップS63。装置模擬IF部21Bは、ステップS63にて指令リストを上書きする。その後、制御プログラム20の再開指令を装置模擬IF部21Bから連携動作タイミング調整部26に送信するステップS47。また、連携動作タイミング調整部26は制御プログラム20を再開しステップS48、装置模擬入力時刻進行指令を装置模擬IF部21Bに送信する。そして、ステップS41以降の動作を繰り返す。その後、装置模擬IF部21Bは、装置模擬入力時刻進行指令を受信すると、内部時刻を進行させ、ステップS47以降の処理を繰り返す。装置模擬IF部21Bは、また、内部時刻が進行している期間は装置模擬プログラム30Aの装置模擬処理を実行する。具体的には、ステップS46やステップS62にて受信した指令リストに従い、指定時刻より所定時間前になると連携動作タイミング調整部26へ制御プログラム20の再開指令を送信し、連携動作タイミング調整部26が制御プログラム20を再開するAPIを読んで制御プログラム20を再開させるステップS48。なお、ここでいう所定時間とは、装置模擬IF部21Bから連携動作タイミング調整部26を介して制御プログラム20へ停止指令が到達するのに要する時間である。制御プログラム20を再開させた後、装置模擬IF部21Bは指定時刻になるとIO切替部23に指令を送信し図示しない、IO切替部23はステップS51にて制御プログラム20から指令を受信したときと同様に以降の処理を繰り返す。ここで、各機能ブロックそれぞれの動作を、フローチャートを用いて説明する。装置模擬IF部の動作装置模擬IF部21Bの動作を4つのタスクフローで実施する場合を図15、図16を用いて説明する。図15はフロー1およびフロー2を、図16はフロー3およびフロー4を示している。フロー1は、パソコン3Aの装置模擬プログラム30Aから定期的に不定期であってもい指定時刻つきの指令を取得するためのフローである。このフローの処理前後において、制御プログラム20の停止指令や再開指令を連携動作タイミング調整部26へ送信する。フロー2は、装置模擬プログラム30Aから取得した指令リストに従い、付与された指定された時刻に指令をIO切替部23へ送信するためのフローである。指令を送る前に、制御プログラム20の停止指令を連携動作タイミング調整部26へ送信する。フロー3は、IO切替部23から値変化イベントを受信して装置模擬プログラム30Aへ転送し、次に指令リストの取得要求を送信するまでの期間の指令リストを取得しなおすためのフローである。この処理後に、制御プログラム20の再開指令を連携動作タイミング調整部26へ送信する。フロー4は、連携動作タイミング調整部26から装置模擬入力時刻の停止指令または進行指令を受信して装置模擬IF部21Bの内部時刻を停止または進行再開させるためのフローである。フロー1において、装置模擬IF部21Bは管理する内部時刻の進行状態を示す装置模擬入力時刻停止中フラグがONかOFFかを確認しステップS701、OFFであれば連携動作タイミング調整部26に制御プログラム20の停止指令を送信するステップS702、図14のステップS41に対応。装置模擬IF部21Bは、その後、装置模擬プログラム30Aに対して所定の期間情報を付して指令リストの取得要求を送信し図14のステップS44に対応、装置模擬プログラム30Aから指令リストを受信すると自装置に設けられた保有リストに新たに取得した指令リストを追加するステップS703、図14のステップS46に対応。そして、制御プログラム20の再開指令を連携動作タイミング調整部26に送信し、完了を待つステップS704、図14のステップS47に対応。装置模擬IF部21Bのフロー2がスリープ状態であればこれを解除しステップS705、ステップS703で取得した指令リストの最後の指令で指定された時刻より所定時間前までの間、フロー1をスリープ状態にさせるステップS706。また、上述のステップS701において装置模擬入力時刻停止中フラグがONの場合、ステップS706において、フロー1を所定時間例えば100ms程度スリープ状態にさせる。このとき、装置模擬IF部21Bが管理する内部時刻は、タイマの現時刻から内部時刻の進行を停止させていた累積時間である累積時刻停止時間を差し引いて計算するものとする。装置模擬IF部21Bは、最後の指令で指定された時刻より所定時間前になるとフロー1のスリープ状態を解除して処理が終了したか否かを判断しステップS707、処理が終了していなければステップS701の前の状態に戻り、処理が終了していればこのフローを終了する。なお、ここでいう所定時間とは、装置模擬IF部21Bから連携動作タイミング調整部26を介して制御プログラム20へ停止指令が到達するのに要する時間である。フロー2では、装置模擬IF部21Bはタイマの値から算出される内部時刻から算出される装置模擬入力時刻の進行を停止する装置模擬入力時刻停止中フラグがONかOFFかを確認しステップS711、OFFであれば保有している指令リストに現時刻が指定時刻よりも所定時間前の指令があるか否かを判断するステップS712。現時刻が指令により指定された時刻よりも所定時間前であると判断した場合は制御プログラム20の停止指令を連携動作タイミング調整部26へ送信するステップS713。そして、時間が経過し、現時刻が指定時刻になるとこの指令をIO切替部23に送信し、この入力を実行させるステップS714。なお、ここでいう所定時間とは、装置模擬IF部21Bから連携動作タイミング調整部26を介して制御プログラム20へ停止指令を伝達するのに要する時間である。装置模擬IF部21Bは、その後、指令リストをチェックし、現時刻が指定時刻より所定時間前の指令が無い場合、次の指令で指定された時刻より所定時間前までこのフロー2をスリープ状態とするステップS715。また、上述のステップS711において装置模擬入力時刻停止中フラグがONの場合、ステップS715では、フロー2を所定時間例えば100ms程度スリープ状態にさせる。このとき、装置模擬IF部21Bが管理する内部時刻は、タイマの現時刻から内部時刻の進行を停止させていた累積時間である累積時刻停止時間を差し引いて計算するものとする。装置模擬IF部21Bは、次の指令で指定された時刻より所定時間前になるとフロー2のスリープ状態を解除して処理が終了したか否かを判断しステップS716、処理が終了していなければステップS711の前の状態に戻り、処理が終了していればこのフローを終了する。フロー3では、装置模擬IF部21BはIO切替部23からの値変化イベントを受信しステップS721、図14のステップS57に対応、装置模擬プログラム30Aへこれを転送するステップS722、図14のステップS58に対応。そして、次に指令リスト取得要求を送信する所定時間までの間の指令リストを更新するために、装置模擬プログラム30Aへ指令リスト取得要求を送信して新たな指令リストを取得し、保有している指令リストを上書きするステップS723。装置模擬IF部21Bは、指令リストが更新されると図14のステップS46、ステップS62、制御プログラム20の再開指令を連携動作タイミング調整部26へ送信しステップS724、図14のステップS47に対応、フロー2がスリープ状態にあればこれを解除するステップS725。そして、処理が終了したか否かを判断しステップS726、終了していない場合はステップS721の前の状態に戻り、処理が終了している場合はこのフローを終了する。フロー4では、装置模擬IF部21Bは連携動作タイミング調整部26から装置模擬入力時刻停止指令を受信しステップS731、図14のステップS43に対応、装置模擬入力時刻停止中フラグをONにし、応答を返すステップS732。装置模擬IF部21Bは、連携動作タイミング調整部26から装置模擬入力時刻進行指令を受信するとステップS733、図14のステップS49に対応、装置模擬入力時刻停止中フラグをOFFにし、装置模擬IF部21Bのフロー1、フロー2のスリープ状態を解除し、その後、応答を返すステップS734。装置模擬IF部21Bは、装置模擬入力時刻停止指令受信から装置模擬入力時刻進行指令処理完了までの時間を累積時刻停止時間に加算しステップS735、処理が終了したか否かを判断しステップS736、終了していない場合はステップS731の前の状態に戻り、処理が終了している場合はこのフローを終了する。IO切替部の動作次に、図17を用いてIO切替部23のフローを説明する。IO切替部23は、制御プログラム20または装置模擬IF部21Bから指令を受信するとステップS801、この指令は実IO25と仮想IO24のどちらに対する指令かを判断するステップS802。実IO25への指令の場合は指令に従ってデータのReadまたはWriteを行いステップS803、仮想IO24への指令の場合はWrite指令か否かを判断するステップS804。仮想IO24へのWrite指令の場合は一旦実IO25へWriteを行いステップS805、次に、装置模擬IF部21B以外からの指令で、Write指令か否かを判断するステップS806。ステップS806の判断の結果、指令が仮想IO24へのWrite指令の場合、制御プログラム20の停止指令を連携動作タイミング調整部26へ送信して制御プログラム20を停止させステップS807、ステップS806の判断の結果、指令が仮想IO24へのWrite指令でない場合はそのまま、指令に従って仮想IO27にWriteやReadを行うステップS808。その後、指令がWrite指令であり、かつ、このWrite指令により値が変化したか否かを判断しステップS809、図14のステップS56に対応、値変化している場合は装置模擬IF部21Bへ値変化イベントを送信しステップS810、図14のステップS57に対応このフローを終了する。ステップS809にて、仮想IO24のWrite指令であって値変化していない場合、あるいは仮想IO24へのRead指令の場合、この指令がWrite指令か否かを判断しステップS811、Write指令の場合は制御プログラム20の再開指令を連携動作タイミング調整部26へ送信し、制御プログラム20を再開させて完了を待つステップS812。ステップS810又はステップS812の後、処理が終了したか否かを判断しステップS813、処理が終了していると判断すればこのフローを終了し、処理が終了していないと判断すればステップS801の前の状態に戻る。連携動作タイミング調整部の動作続いて、図18を用いて連携動作タイミング調整部26のフローを説明する。連携動作タイミング調整部26は、コントローラ2B内に備えられた受信停止指令リストが空でなければ受信停止指令リストから、空であれば連携動作タイミング調整部26以外の他のプログラムから制御プログラム20の停止指令を受信するステップS901、図14のステップS41に対応。停止指令を受信すると装置内に設けられた制御プログラムリストを参照して制御プログラム20の処理を停止しステップS902、装置模擬IF部21Bに装置模擬入力時刻停止指令を送信し、応答が返ってくるのを待つステップS903、図14のステップS43に対応。そして、停止指令の送り元に停止完了の返信をするステップS904。連携動作タイミング調整部26はその後、他のプログラムから制御プログラム20の再開指令または停止指令を受信するとステップS905、再開指令を受信したか否かを判断するステップS906。再開指令を受信していない場合は受信停止指令リストに停止指令を追加しステップS907、ステップS905の前の状態に戻る。ステップS906で再開指令を受信したと判断した場合、制御プログラムリストを参照して制御プログラム20を再開しステップS908、装置模擬IF部21Bに装置模擬入力時刻進行指令を送信し、応答が返ってくるのを待つステップS909、図14のステップS49に対応。その後、再開指令の送り元に再開完了を返信しステップS910、処理が終了したか否かを判断しステップS911、処理が終了していなければステップS901の前の状態に戻り、処理が終了していればこのフローを終了する。本実施の形態によれば、制御プログラム試験システム1Bは、連携動作タイミング調整部26を備え、装置模擬をするために必要な動作、例えば装置模擬プログラム30が装置模擬処理を実行する間は制御プログラム20を停止して装置模擬入力時刻を一時停止することにより、実施の形態2に記載の効果に加えて、装置模擬プログラム30Aからの装置模擬入力とコントローラ2上の制御プログラム20の連携動作のタイミングが変わらないようにすることができる。装置模擬プログラム30Aと制御プログラム20の連携動作のタイミングへの影響を回避することができる。これにより、装置模擬プログラム30Aの代わりに実際の被制御装置をコントローラ2Bに接続した場合と同じタイミングで制御プログラムの動作試験を行うことができる。なお、上記実施の形態1ないし実施の形態3の説明において~部と説明したものは、~手段、~回路、~機器としても良い。すなわち、ソフトウェア、ファームウェア、素子デバイス基板配線などのハードウェア、あるいはこれらの組合せによって実施することができる。また、上記実施の形態のコントローラ2は、制御プログラム20を試験するための制御プログラム試験装置と言い換えても良い。また、上記指令はReadとWriteの指令を総称するものである。