(57)【要約】【課題】一定のタスク周期毎に周期実行されるタスクに含まれるアプリケーションプログラムを予め定められたタスク周期内に収まるように実行させるための環境を提供する。【解決手段】方法は、アプリケーションプログラムのソースコードの入力を受付けるステップと、アプリケーションプログラムのソースコードに、当該アプリケーションプログラムをタスク周期内において予め設定された時間だけ実行させた後に中断させ、次のタスク周期において当該アプリケーションプログラムの実行を再開するための第１の命令を付加することで、アプリケーションプログラムの実行モジュールを生成するステップとを含む。【選択図】図３
2019139365.tif 000002
【特許請求の範囲】
【請求項１】
一定のタスク周期毎に周期実行されるタスクに含まれるアプリケーションプログラムを生成する方法であって、
アプリケーションプログラムのソースコードの入力を受付けるステップと、
前記アプリケーションプログラムのソースコードに、当該アプリケーションプログラムをタスク周期内において予め設定された時間だけ実行させた後に中断させ、次のタスク周期において当該アプリケーションプログラムの実行を再開するための第１の命令を付加することで、前記アプリケーションプログラムの実行モジュールを生成するステップとを備える、方法。
【請求項２】
前記第１の命令は、
アプリケーションプログラムの実行開始から前記予め設定された時間が経過すると、当該時点の実行状態を保存する命令と、
前記保存した実行状態を復元する命令とを含む、請求項１に記載の方法。
【請求項３】
前記第１の命令は、アプリケーションプログラムの実行開始から前記予め設定された時間が経過すると割込イベントを発生するように割込タイマを設定するための命令をさらに含む、請求項２に記載の方法。
【請求項４】
前記第１の命令は、前記アプリケーションプログラムのソースコードに予め設定された中断ポイント毎に前記予め設定された時間が経過しているか否かを判断する命令をさらに含む、請求項２に記載の方法。
【請求項５】
前記アプリケーションプログラムのソースコードに対して前記中断ポイントを挿入するステップをさらに備える、請求項４に記載の方法。
【請求項６】
前記実行モジュールを生成するステップは、前記第１の命令を付加することで生成される第１の実行コードと、前記第１の命令が付加されていない前記アプリケーションプログラムのソースコードから生成された第２の実行コードとを含む、前記実行モジュールを生成する、請求項１〜５のいずれか１項に記載の方法。
【請求項７】
前記実行モジュールを生成するステップは、前記実行モジュールに含まれている実行コードの状態を示す情報を含むプログラム定義情報を前記実行モジュールに関連付けて生成するステップを含む、請求項６に記載の方法。
【請求項８】
前記実行モジュールを生成するステップは、前記アプリケーションプログラムのソースコードに、当該アプリケーションプログラムの実行、中断、再開に係る制御パラメータの設定を受付けるための第２の命令をさらに付加するステップを含む、請求項１〜７のいずれか１項に記載の方法。
【請求項９】
前記制御パラメータは、アプリケーションプログラムの実行を中断した箇所から再開する、および、アプリケーションプログラムを最初から実行する、のいずれかを選択するための情報を含む、請求項８に記載の方法。
【請求項１０】
前記実行モジュールを参照するユーザプログラムの作成過程において、アプリケーションプログラムをタスク周期内において予め設定された時間だけ実行させた後に中断させる機能が有効化されているか否かに応じて、前記制御パラメータの設定の受付けを有効化するか否かを変化させるステップをさらに備える、請求項８または９に記載の方法。
【請求項１１】
一定のタスク周期毎に周期実行されるタスクに含まれるアプリケーションプログラムを生成する装置であって、
アプリケーションプログラムのソースコードの入力を受付ける手段と、
前記アプリケーションプログラムのソースコードに、当該アプリケーションプログラムをタスク周期内において予め設定された時間だけ実行させた後に中断させ、次のタスク周期において当該アプリケーションプログラムの実行を再開するための第１の命令を付加することで、前記アプリケーションプログラムの実行モジュールを生成する手段とを備える、装置。
【請求項１２】
コンピュータに、一定のタスク周期毎に周期実行されるタスクに含まれるアプリケーションプログラムを生成させるためのプログラムであって、前記プログラムは前記コンピュータに
アプリケーションプログラムのソースコードの入力を受付けるステップと、
前記アプリケーションプログラムのソースコードに、当該アプリケーションプログラムをタスク周期内において予め設定された時間だけ実行させた後に中断させ、次のタスク周期において当該アプリケーションプログラムの実行を再開するための第１の命令を付加することで、前記アプリケーションプログラムの実行モジュールを生成するステップとを実行させる、プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、一定のタスク周期毎に周期実行されるタスクに含まれるアプリケーションプログラムを生成する方法、装置、プログラムに関する。
【背景技術】
【０００２】
様々な生産現場において、ＰＬＣ（プログラマブルコントローラ）などの制御装置を用いたＦＡ（Factory Automation）技術が広く普及している。近年の情報通信技術（ＩＣＴ：Information and Communication Technology）の発展に伴って、このようなＦＡ分野における制御装置においても、従来のシーケンスプログラムだけではなく、各種のアプリケーションプログラムが実行されるようになっている。
【０００３】
このような制御装置におけるプログラム実行は、例えば、周期実行されるタスクの単位でリソースなどの割当てが管理される。例えば、国際公開第２０１５／１３６９７３号（特許文献１）は、少なくとも２種類のタスクを周期実行する制御装置を開示する。この特許文献１に開示される制御装置は、いずれかのタスクに含まれるプログラムに対する修正によって、タスクの実行時間が変動した場合であっても、装置を安定化して動作させる技術を開示する。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】国際公開第２０１５／１３６９７３号
【発明の概要】
【発明が解決しようとする課題】
【０００５】
上述のように、一定のタスク周期毎に周期実行されるタスクにおいて、プログラム実行が予め設定されたタスク周期内で完了しないような場合も存在し得る。通常、このような事態を生じ得ると応答性などの制御性能を低下させることになるので、制御装置の設計者（プログラマ）は、各タスク周期での処理が予め設定されたタスク周期内に収まるように、プログラムを作成する必要がある。この場合、１回のプログラム実行が、複数のタスク周期にまたがることもある。
【０００６】
一方で、例えば、オープンソースソフトウエアなどの既存のソースコードを利用して各種アプリケーションプログラムを作成するような場面も想定される。このような場合、各タスク周期での処理が予め設定されたタスク周期内で実行完了できるように、ソースコードを修正する必要があるが、このようなソースコードの修正自体が手間であり、また、デバックや事後的な変更などに手間を要するという課題がある。
【０００７】
本発明は、一定のタスク周期毎に周期実行されるタスクに含まれるアプリケーションプログラムを予め定められたタスク周期内に収まるように実行させるための環境を提供することを目的とする。
【課題を解決するための手段】
【０００８】
本開示の一例に従えば、一定のタスク周期毎に周期実行されるタスクに含まれるアプリケーションプログラムを生成する方法が提供される。方法は、アプリケーションプログラムのソースコードの入力を受付けるステップと、アプリケーションプログラムのソースコードに、当該アプリケーションプログラムをタスク周期内において予め設定された時間だけ実行させた後に中断させ、次のタスク周期において当該アプリケーションプログラムの実行を再開するための第１の命令を付加することで、アプリケーションプログラムの実行モジュールを生成するステップとを含む。
【０００９】
この開示によれば、予め定められたタスク周期内に実行が完了しないアプリケーションプログラムを周期実行されるタスクとして登録した場合であっても、各タスク周期内では、予め設定された時間だけ実行させた後に中断させつつ、複数のタスク周期に亘って１回実行するような実行形態を提供できる。アプリケーションプログラムのソースを手作業で変更する必要がなく、このような複数のタスク周期に亘る実行を実現できるため、任意のアプリケーションプログラムを制御装置上で実行させることができ、制御装置をより高機能化させることができる。
【００１０】
上述の開示において、第１の命令は、アプリケーションプログラムの実行開始から予め設定された時間が経過すると、当該時点の実行状態を保存する命令と、保存した実行状態を復元する命令とを含む。
【００１１】
この開示によれば、アプリケーションプログラムの実行状態にかかわらず、予め設定された時間が経過した時点での実行状態を保存し、その後のタスク周期において、その保存した実行状態を復元できるので、任意のアプリケーションプログラムについて、複数のタスク周期に亘る実行を実現できる。
【００１２】
上述の開示において、第１の命令は、アプリケーションプログラムの実行開始から予め設定された時間が経過すると割込イベントを発生するように割込タイマを設定するための命令をさらに含む。
【００１３】
この開示によれば、予め設定された時間に応じた割込タイマを用いることで、アプリケーションプログラムに対して割当てられた時間を正確に順守することができる。
【００１４】
上述の開示において、第１の命令は、アプリケーションプログラムのソースコードに予め設定された中断ポイント毎に予め設定された時間が経過しているか否かを判断する命令をさらに含む。
【００１５】
この開示によれば、割込タイマなどを利用できないプログラム実行環境であっても、アプリケーションプログラムに対して割当てられた時間を正確に順守することができる。
【００１６】
上述の開示において、方法は、アプリケーションプログラムのソースコードに対して中断ポイントを挿入するステップをさらに含む。
【００１７】
この開示によれば、アプリケーションプログラムのソースコードに対して、要求される時間管理精度などに応じて、中断ポイントを任意の位置に挿入することができるので、アプリケーションプログラムに対する要求などに柔軟に対応できる。
【００１８】
上述の開示において、実行モジュールを生成するステップは、第１の命令を付加することで生成される第１の実行コードと、第１の命令が付加されていないアプリケーションプログラムのソースコードから生成された第２の実行コードとを含む、実行モジュールを生成する。
【００１９】
この開示によれば、実行モジュールをプログラム部品として利用する際に、複数のタスク周期に亘った実行、および、通常の実行のいずれをも柔軟に選択できる。
【００２０】
上述の開示において、実行モジュールを生成するステップは、実行モジュールに含まれている実行コードの状態を示す情報を含むプログラム定義情報を実行モジュールに関連付けて生成するステップを含む。
【００２１】
この開示によれば、実行モジュールをプログラム部品として利用する際に、プログラム定義情報を参照することで、利用対象の実行モジュールに含まれる実行コードなどを確実に知ることができ、ユーザに対する利便性などを高めることができる。
【００２２】
上述の開示において、実行モジュールを生成するステップは、アプリケーションプログラムのソースコードに、当該アプリケーションプログラムの実行、中断、再開に係る制御パラメータの設定を受付けるための第２の命令をさらに付加するステップを含む。
【００２３】
この開示によれば、実行モジュールをプログラム部品として利用する際に、制御パラメータを適切に設定することで、利用先のアプリケーションなどに応じた処理を容易に実現できる。
【００２４】
上述の開示において、制御パラメータは、アプリケーションプログラムの実行を中断した箇所から再開する、および、アプリケーションプログラムを最初から実行する、のいずれかを選択するための情報を含む。
【００２５】
この開示によれば、複数のタスク周期に亘るアプリケーションプログラムの実行の有効化および無効化を容易に選択できる。
【００２６】
上述の開示において、方法は、実行モジュールを参照するユーザプログラムの作成過程において、アプリケーションプログラムをタスク周期内において予め設定された時間だけ実行させた後に中断させる機能が有効化されているか否かに応じて、制御パラメータの設定の受付けを有効化するか否かを変化させるステップをさらに含む。
【００２７】
この開示によれば、実行モジュールをプログラム部品として利用する場合に、機能を有効化または無効化するのかに応じて、ユーザにより分かりやすいユーザインターフェイスを提供できる。
【００２８】
本開示の別の一例に従えば、一定のタスク周期毎に周期実行されるタスクに含まれるアプリケーションプログラムを生成する装置が提供される。装置は、アプリケーションプログラムのソースコードの入力を受付ける手段と、アプリケーションプログラムのソースコードに、当該アプリケーションプログラムをタスク周期内において予め設定された時間だけ実行させた後に中断させ、次のタスク周期において当該アプリケーションプログラムの実行を再開するための第１の命令を付加することで、アプリケーションプログラムの実行モジュールを生成する手段とを含む。
【００２９】
本開示のさらに別の一例に従えば、コンピュータに、一定のタスク周期毎に周期実行されるタスクに含まれるアプリケーションプログラムを生成させるためのプログラムが提供される。プログラムはコンピュータに、アプリケーションプログラムのソースコードの入力を受付けるステップと、アプリケーションプログラムのソースコードに、当該アプリケーションプログラムをタスク周期内において予め設定された時間だけ実行させた後に中断させ、次のタスク周期において当該アプリケーションプログラムの実行を再開するための第１の命令を付加することで、アプリケーションプログラムの実行モジュールを生成するステップとを実行させる。
【発明の効果】
【００３０】
本発明によれば、一定のタスク周期毎に周期実行されるタスクに含まれるアプリケーションプログラムを予め定められたタスク周期内に収まるように実行させるための環境を提供できる。
【図面の簡単な説明】
【００３１】
【図１】一般的な制御装置におけるユーザプログラムの周期実行を説明するための模式図である。
【図２】ステート管理処理を加える設計変更の一例を説明するための図である。
【図３】図２に示す分割実行化されたアプリケーションプログラムの実行性能の一例を示すタイムチャートである。
【図４】本実施の形態に係る制御システムの全体構成例を示す模式図である。
【図５】本実施の形態に係る制御システムを構成する制御装置のハードウェア構成例を示すブロック図である。
【図６】本実施の形態に係る制御システムを構成するサポート装置のハードウェア構成例を示すブロック図である。
【図７】本実施の形態に係るビルド処理の概略手順を示すフローチャートである。
【図８】本実施の形態に係る分割実行を制御するための継続フラグの意義を説明するための図である。
【図９】本実施の形態に係る分割実行を制御するための分割時間の意義を説明するための図である。
【図１０】本実施の形態に係るビルド処理における分割実行化インターフェイスの追加を説明するための図である。
【図１１】図１０に示す分割実行化に対応したビルド処理によって生成されたファンクションブロックの利用例を説明するための図である。
【図１２】本実施の形態に係る分割実行に係る処理の中断／再開に係る挙動を説明するための図である。
【図１３】本実施の形態に係る分割実行の処理手順の一例を示すフローチャートである。
【図１４】本実施の形態に係るビルド処理における中断ポイントの挿入処理を説明するための図である。
【図１５】本実施の形態に係る分割実行化における中断ポイントの任意挿入を説明するための図である。
【図１６】本実施の形態に係るビルド処理によって生成された２種類の実行コードを含む実行モジュールをプログラム部品として利用する場合の手順を説明するための図である。
【図１７】本実施の形態に係るビルド処理により生成される二重の実行コードを含む実行モジュールを利用する場合のユーザプログラムの作成例を説明するための図である。
【図１８】本実施の形態に係るビルド処理によって生成された実行コードのみを含む実行モジュールをプログラム部品として利用する場合の手順を説明するための図である。
【図１９】本実施の形態に係るビルド処理により生成される分割実行化された実行コードのみを含む実行モジュールを利用する場合のユーザプログラムの作成例を説明するための図である。
【発明を実施するための形態】
【００３２】
本発明の実施の形態について、図面を参照しながら詳細に説明する。なお、図中の同一または相当部分については、同一符号を付してその説明は繰返さない。
【００３３】
＜Ａ．適用例＞
まず、本発明が適用される場面の一例について説明する。図１は、一般的な制御装置におけるユーザプログラムの周期実行を説明するための模式図である。以下の説明においては、制御装置の一例として、主として、ＰＬＣ（プログラマブルコントローラ）を想定する。
【００３４】
図１（Ａ）には、制御装置において実行されるユーザプログラム５０の一例を示す。本明細書において、「ユーザプログラム」は、「システムプログラム」と区別する意味で用いられる用語である。「ユーザプログラム」は、制御対象に応じて任意に作成される命令の組合せであり、制御装置の設計者が任意に作成および修正可能である。これに対して、「システムプログラム」は、「ユーザプログラム」を実行するための実行環境や、制御装置に含まれるハードウェアの制御を実現するためのプログラムである。基本的には、「システムプログラム」は予め制御装置にインストールされている。
【００３５】
図１（Ａ）に示すユーザプログラム５０は、典型的には、国際電気標準会議（International Electrotechnical Commission：ＩＥＣ）によって規定された国際規格ＩＥＣ６１１３１−３に従って記述された１または複数の命令からなるソースコードを包含する。ユーザプログラム５０は、いずれかのタスクの一部として登録されており、当該タスクに設定される制御周期であるタスク周期毎に繰返し実行される。すなわち、あるタスク周期において、ユーザプログラム５０の先頭から最終までが順次実行され、次のタスク周期においても、ユーザプログラム５０の先頭から最終までが順次実行される。このようなユーザプログラム５０の先頭から最終までの順次実行が予め定められたタスク周期毎に繰返されることを「周期実行」と称す。なお、タスク周期は、制御装置において周期実行できる最小の周期（以下、「制御周期」とも称す。）の整数倍として規定されてもよい。
【００３６】
制御装置において実行されるタスク制御プログラム（「スケジューラ」とも称される。）は、予め設定されたタスク周期毎に各タスクに含まれるプログラムを繰返し実行する。
【００３７】
図１（Ａ）に示すユーザプログラム５０は、シーケンス命令群５２と、外部プログラムを実行するためのファンクションブロック５４とを含む。ファンクションブロック５４は、予め定められた実行条件が成立すると、指定されたプログラムを呼出して実行する。以下、あるタスク内で呼出されるプログラムを、便宜上「アプリケーションプログラム」とも称す。本実施の形態に係るアプリケーションプログラムは、シーケンス命令などとともに、一定のタスク周期毎に周期実行されるタスクに含まれることになる。
【００３８】
図１（Ｂ）には、図１（Ａ）に示すユーザプログラム５０の実行タイミングを表すタイムチャートの一例を示す。図１（Ｂ）に示す周期実行のケースＡは、ユーザプログラム５０に含まれるファンクションブロック５４の実行条件が成立していない場合に相当する。このケースＡにおいては、予め設定されたタスク周期内で、ユーザプログラム５０の実行（処理時間５６）が完了していることが分かる。
【００３９】
図１（Ｂ）に示す周期実行のケースＢは、２番目のタスク周期において、ユーザプログラム５０に含まれるファンクションブロック５４の実行条件が成立した場合を示す。このケースＢにおいては、ファンクションブロック５４により呼出されるアプリケーションプログラムの実行に要する処理時間５８が、ケースＡの場合の処理時間５６に加算されることになる。このケースＢにおいては、処理時間５６と処理時間５８との合計がタスク周期内に収まっているので、適切に周期実行ができている。
【００４０】
図１（Ｂ）に示す周期実行のケースＣは、ケースＢと同様に、２番目のタスク周期において、ユーザプログラム５０に含まれるファンクションブロック５４の実行条件が成立した場合を示す。このケースＣにおいては、ファンクションブロック５４により呼出されるアプリケーションプログラムの実行に要する処理時間５８が、タスク周期より長く、予め設定されたタスク周期内で、ユーザプログラム５０の実行が完了できていない。ケースＣに示すように、１回のタスク実行に要する時間が予め設定されたタスク周期に収まらない状態を「周期超過」とも称す。
【００４１】
１または複数のタスクが周期実行される制御装置においては、このような周期超過の発生を回避する必要がある。このような周期超過の発生を回避するために、制御装置の設計者は、設定されているタスク周期内に処理が完了するように各タスクに関連付けられるアプリケーションプログラムを作成する必要がある。
【００４２】
但し、アプリケーションプログラムが提供する処理が１タスク周期内で完了できない場合もあり、このような場合には、複数周期に分けて段階的に処理を進めるようにアプリケーションプログラムを作成しなければならない。以下の説明においては、１回の実行が複数のタスク周期に亘るアプリケーションプログラムを「分割実行プログラム」とも称す。このような分割実行プログラムを生成する典型的な手法として、周期毎にいずれかの命令を実行するのかを管理するステート管理処理を加えるような設計がなされる。以下、設計からプログラミングに関する手順の一例について説明する。
【００４３】
図２は、ステート管理処理を加える設計変更の一例を説明するための図である。図２（Ａ）には、一般的な、バブルソートプログラムのソースコード６０の一例を示す。図２（Ｂ）には、図２（Ａ）に示すソースコードに対して、ステート管理処理を加えたソースコード６２の一例を示す。紙面の都合上、図２（Ｂ）には、図２（Ａ）のソースコード６０に対応するソースコードの一部のみが示されている。
【００４４】
図２（Ａ）に示すソースコード６０のループ処理の命令群６４は、図２（Ｂ）のソースコード６２に含まれるＣＡＳＥ文を用いて命令群６６−１，６６−２，・・・のように分割される。ＣＡＳＥ文で用いられるステート（変数ｓｔａｔｅ）をタスク周期毎にインクリメントすることで、ＣＡＳＥ文を用いて分割された命令群６６−１，６６−２，・・・の各々がタスク周期毎に順次実行されることになる。このようなステート管理処理を用いることで、アプリケーションプログラムの処理を分割実行化する。
【００４５】
一方で、図２（Ｂ）に示されるソースコード６２から明らかなように、ステート管理処理を加えることで、ステップ数は大きく膨れ上がり、ソースコード６２のプログラマ以外には理解困難で、かつ、デバッグやメンテナンス性の劣化したソースコードとなる。
【００４６】
次に、図２に示すような分割実行化されたアプリケーションプログラムの実行性能の一例について説明する。
【００４７】
図３は、図２に示す分割実行化されたアプリケーションプログラムの実行性能の一例を示すタイムチャートである。図３において、「Ｐ」は、タスク内で呼出されるアプリケーションプログラムの実行に要する時間（一例として、１要素の処理に１００μｓが必要であるとする。）を示し、「Ｅ」は、タスク内で実行されるその他の処理の実行に要する時間（周期毎に８０μｓが必要であるとする。）を示す。
【００４８】
図３には、タスク周期が１ｍｓのタスクにおいて２３要素の処理を行う場合の例を示す。
【００４９】
図３に示すタスクＡは、図２（Ａ）に示すような、分割実行化されていないソースコードを実行した場合を示す。タスクＡを１回実行するには、２．３８ｍｓ（＝８０μｓ＋１００μｓ×２３）の時間を要するため、周期超過が生じ得る。
【００５０】
図３に示すタスクＢは、図２（Ｂ）に示すように、１タスク周期毎に１要素を処理するように、アプリケーションプログラムの実行を分割実行化した場合を示す。タスクＢによってアプリケーションプログラムを呼出して、当該アプリケーションプログラムの処理全体を１回実行するのに、２３周期分の時間が必要となるとともに、アプリケーションプログラムの分割実行化（設計変更）が必要となる。
【００５１】
図３に示す例では、２３要素の処理を行う例を示したが、アプリケーションプログラムが処理する要素の数が一定ではない場合も多い。例えば、制御装置に接続されたセンサからの計測データ、あるいは、内蔵ストレージに転送された任意のデータを対象として処理する場合、そのような処理対象のデータ自体が巨大である場合や、処理タイミングなどによって入力データの量が変動する場合がある。そのため、分割実行化されたアプリケーションプログラムにどれだけのタスク周期が必要であるかを事前に見積もることが難しく、システム全体の設計が複雑化し得る。
【００５２】
また、分割実行化されたアプリケーションプログラムは、設計が難しく、実装量が多く、また、用途に応じた処理時間の調整も困難であるため、制御装置の設計者は可能な限り、分割実行化という手法を採用したくはないと考える。
【００５３】
上述したような課題に対して、本実施の形態は、１回の処理実行に複数のタスク周期が必要なアプリケーションプログラムを、ユーザ設定された時間ずつ分割実行できるような環境を提供する。このような分割実行を実現するに対して、制御装置の設計者に対して、ステート管理処理を追加するような変更を要求することはない。
【００５４】
例えば、図３のタスクＣには、本実施の形態に係る処理例を示す。図３に示すタスクＣには、アプリケーションプログラムの実行時間が０．８ｍｓと設定されている場合を示す。言い換えれば、プログラマなどのユーザは、分割すべきアプリケーションプログラムの指定、および、分割実行に割当てる時間の設定を行うだけで、図３に示すタスクＣのような実行を実現できる。
【００５５】
図３に示すタスクＣにおいては、最初の２周期において、それぞれ０．８ｍｓ分の処理が実行され、最終の周期において０．７ｍｓ分の処理が実行されることで、アプリケーションプログラムの１回分の実行が完了する。
【００５６】
後述するように、基本的には、ユーザは、各タスク周期において分割実行に割当てる時間だけを任意に設定すればよく、各タスクの実行目的や要求仕様などに応じて、自由に設定できる。
【００５７】
なお、本明細書において、「分割実行プログラム」は、状況に応じて複数のタスク周期に亘って実行されるプログラムを包含するものであり、場合によっては、１タスク周期内で実行が完了する場合もある。本明細書の「分割実行プログラム」は、このようなプログラムも包含し得る。
【００５８】
同様に、本明細書において、「分割実行」は、あるプログラムが予め設定された時間ずつ実行される状態を意味するものであり、現実に、複数のタスク周期に亘って実行される必要は必ずしもない。すなわち、状況に応じて実行に要する時間が変動するプログラムについては、「分割実行」で処理した場合であっても、１タスク周期内で処理が完了することがある。「分割実行」との用語は、このような現実のプログラムの実行結果が複数のタスク周期に亘っていることを要求するものではない。
【００５９】
本実施の形態においては、典型例として、（１）任意のアプリケーションプログラムを上述したような分割実行できる形式（以下、「分割実行型」あるいは「分割実行型プログラム」と称することもある。）に自動的に変換する局面と、（２）何らかの方法で生成された分割実行型プログラムを配布し、その配布された分割実行型プログラムをプログラム部品として利用する局面とを想定する。
【００６０】
（１）の局面は、アプリケーションプログラムの分割実行化の処理に相当する。典型的には、サポート装置が、任意のソースプログラムから実行形式のコードなどに変換（以下、「ビルド」とも称す。）する際に、ユーザ設定の時間が経過すると処理の実行を中断し、次のタスク周期で再開することが可能な形式に自動的に変化する。このようなサポート装置の機能を利用することで、処理の実行／中断／再開の手続きをユーザが明示的にプログラムしなくても、自動的に分割実行型プログラムを生成できる。
【００６１】
このように、（１）の局面は、一定のタスク周期毎に周期実行されるタスクに含まれるアプリケーションプログラムを生成する方法、装置、プログラムなどに向けられる。
【００６２】
（２）の局面は、上述の（１）の局面において生成された分割実行型プログラムをプログラム部品として、任意のプログラムの一部として再利用できる。再利用する場合、分割実行（すなわち、複数周期に亘る実行）の有効／無効を任意に選択できるようにしてもよい。このようなプログラム部品としての再利用できる形式でプログラムを提供する形態は、例えば、各種のライブラリやアドオンプログラムなどに応用できる。
【００６３】
それぞれの局面を含む、より詳細な実施の形態について説明する。
＜Ｂ．制御システムの全体構成例＞
まず、本実施の形態に係る制御装置１００を含む制御システム１の全体構成例について説明する。
【００６４】
図４は、本実施の形態に係る制御システム１の全体構成例を示す模式図である。図４を参照して、制御システム１の主たる構成要素である制御装置１００は、予め用意されたユーザプログラムを実行することで、任意の制御対象を制御する。より具体的には、制御装置１００は、制御対象から計測値や状態値（以下、「入力データ」とも称す。）などを収集するとともに、収集された入力データに基づいて制御演算を実行し、制御演算の実行により得られる指令値や状態値（以下、「出力データ」とも称す。）を制御対象へ出力するという、一連の制御処理をサイクリックに実行する。
【００６５】
図４には、制御装置１００がフィールドネットワーク２を介して１または複数のデバイス１０と接続されている構成例を示す。１または複数のデバイス１０は、制御装置１００からの出力データに従って制御対象を制御し、制御対象から計測された入力データを制御装置１００へ提供する。一例として、デバイス１０は、リモートＩ／Ｏ（Input/Output）装置１２と、リレー群１４と、画像センサ１８およびカメラ２０と、サーボドライバ２２およびサーボモータ２４とを含む。
【００６６】
リモートＩ／Ｏ装置１２は、フィールドネットワーク２を介して通信を行う通信部と、入力データの取得および出力データの出力を行うための入出力部（以下、「Ｉ／Ｏユニット」とも称す。）とを含む。
【００６７】
Ｉ／Ｏユニットは、フィールドネットワークに直接接続されるようにしてもよいし、制御装置１００の一部に組込まれてもよい。
【００６８】
画像センサ１８は、カメラ２０によって撮像された画像データに対して、パターンマッチングなどの画像計測処理を行って、その処理結果を制御装置１００へ送信する。サーボドライバ２２は、制御装置１００からの出力データ（例えば、位置指令など）に従って、サーボモータ２４を駆動する。
【００６９】
フィールドネットワーク２は、データの到達時間が保証される、定周期通信を行うネットワークを採用することが好ましい。このような定周期通信を行うネットワークとしては、ＥｔｈｅｒＣＡＴ（登録商標）、ＥｔｈｅｒＮｅｔ／ＩＰ（登録商標）、ＤｅｖｉｃｅＮｅｔ（登録商標）、ＣｏｍｐｏＮｅｔ（登録商標）などが知られている。
【００７０】
制御装置１００には、ユーザプログラムの開発やデバッグを行うためのサポート装置２００が接続されることもある。サポート装置２００により提供される機能の詳細については、後述する。
【００７１】
制御装置１００は、上位ネットワーク６を介して、サーバ装置３００および表示装置４００と接続されている。
【００７２】
サーバ装置３００は、制御装置１００との間で必要なデータを遣り取りする。サーバ装置３００は、例えば、データベース機能を有しており、制御装置１００が出力するイベントログなどを時系列に収集するようにしてもよい。
【００７３】
表示装置４００は、ユーザからの操作を受けて、制御装置１００に対してユーザ操作に応じたコマンドなどを送信するとともに、制御装置１００での演算結果などをグラフィカルに表示する。
【００７４】
＜Ｃ．各装置のハードウェア構成例＞
次に、本実施の形態に係る制御システム１を構成する主要な装置のハードウェア構成例について説明する。
【００７５】
（ｃ１：制御装置１００のハードウェア構成例）
図５は、本実施の形態に係る制御システム１を構成する制御装置１００のハードウェア構成例を示すブロック図である。図５を参照して、制御装置１００は、プロセッサ１０２と、メインメモリ１０４と、ストレージ１０６と、上位ネットワークコントローラ１０８と、フィールドネットワークコントローラ１１０と、ＵＳＢ（Universal Serial Bus）コントローラ１１２と、メモリカードインターフェイス１１４とを含む。これらのコンポーネントは、プロセッサバス１３０を介して接続されている。
【００７６】
プロセッサ１０２は、制御演算などを実行する演算処理部に相当し、ＣＰＵ（Central Processing Unit）やＧＰＵ（Graphics Processing Unit）などで構成される。具体的には、プロセッサ１０２は、ストレージ１０６に格納されたプログラムを読出して、メインメモリ１０４に展開して実行することで、制御対象に応じた制御、および、後述するような各種処理を実現する。
【００７７】
メインメモリ１０４は、ＤＲＡＭ（Dynamic Random Access Memory）やＳＲＡＭ（Static Random Access Memory）などの揮発性記憶装置などで構成される。ストレージ１０６は、例えば、ＨＤＤ（Hard Disk Drive）やＳＳＤ（Solid State Drive）などの不揮発性記憶装置などで構成される。
【００７８】
ストレージ１０６には、基本的な機能を実現するためのシステムプログラム１４０、および、ユーザプログラムを実現するための１または複数の実行モジュール９８などが格納される。
【００７９】
上位ネットワークコントローラ１０８は、上位ネットワーク６を介して、表示装置４００やサーバ装置５００（図４参照）といった任意の情報処理装置との間でデータを遣り取りする。
【００８０】
フィールドネットワークコントローラ１１０は、フィールドネットワーク２を介して、フィールドデバイスとの間でデータを遣り取りする。フィールドネットワークコントローラ１１０は、フィールドネットワーク２を介した定周期通信を行うための通信マスタとして機能する。
【００８１】
ＵＳＢコントローラ１１２は、ＵＳＢ接続を介して、サポート装置２００などとの間でデータを遣り取りする。
【００８２】
メモリカードインターフェイス１１４は、着脱可能な記録媒体の一例であるメモリカード１１６を受付ける。メモリカードインターフェイス１１４は、メモリカード１１６に対してデータを書込み、メモリカード１１６から各種データ（ログやトレースデータなど）を読出すことが可能になっている。
【００８３】
図５には、プロセッサ１０２がプログラムを実行することで必要な機能が提供される構成例を示したが、これらの提供される機能の一部または全部を、専用のハードウェア回路（例えば、ＡＳＩＣ（Application Specific Integrated Circuit）またはＦＰＧＡ（Field-Programmable Gate Array）など）を用いて実装してもよい。あるいは、制御装置１００の主要部を、汎用的なアーキテクチャに従うハードウェア（例えば、汎用パソコンをベースとした産業用パソコン）を用いて実現してもよい。この場合には、仮想化技術を用いて、用途の異なる複数のＯＳ（Operating System）を並列的に実行させるとともに、各ＯＳ上で必要なアプリケーションを実行させるようにしてもよい。さらに、制御装置１００に表示装置やサポート装置などの機能を統合した構成を採用してもよい。
【００８４】
（ｃ２：サポート装置２００のハードウェア構成例）
本実施の形態に係るサポート装置２００は、一例として、汎用的なアーキテクチャに従うハードウェア（例えば、汎用パソコン）を用いてプログラムを実行することで実現される。
【００８５】
図６は、本実施の形態に係る制御システム１を構成するサポート装置２００のハードウェア構成例を示すブロック図である。図６を参照して、サポート装置２００は、ＣＰＵやＭＰＵなどのプロセッサ２０２と、光学ドライブ２０４と、主メモリ２０６と、ストレージ２０８と、ＵＳＢコントローラ２１２と、ネットワークコントローラ２１４と、入力部２１６と、表示部２１８とを含む。これらのコンポーネントはバス２２０を介して接続される。
【００８６】
プロセッサ２０２は、ストレージ２０８に格納された各種プログラムを読み出して、主メモリ２０６に展開して実行することで、後述するような各種処理を実現する。
【００８７】
ストレージ２０８は、例えば、ＨＤＤやＳＳＤなどで構成される。ストレージ２０８には、典型的には、サポート装置２００において実行されるユーザプログラムの作成、作成したプログラムのデバッグ、システム構成の定義、各種パラメータの設定などを行うためのサポートプログラム２３０が格納される。
【００８８】
サポートプログラム２３０は、コンピュータであるサポート装置２００を、アプリケーションプログラムを生成する装置として機能させる。より具体的には、サポートプログラム２３０は、本実施の形態に係るビルド処理を実現するためのビルド処理モジュール２３２、および、ソースコードの作成・編集処理などを実現するためのプログラミングツール２３４を含む。
【００８９】
サポート装置２００は、光学ドライブ２０４を有しており、コンピュータ読取可能なプログラムを非一過的に格納する記録媒体２０５（例えば、ＤＶＤ（Digital Versatile Disc）などの光学記録媒体）から、その中に格納されたプログラムが読取られてストレージ２０８などにインストールされる。
【００９０】
サポート装置２００で実行される各種プログラムは、コンピュータ読取可能な記録媒体２０５を介してインストールされてもよいが、ネットワーク上のサーバ装置などからダウンロードする形でインストールするようにしてもよい。また、本実施の形態に係るサポート装置２００が提供する機能は、ＯＳが提供するモジュールの一部を利用する形で実現される場合もある。
【００９１】
ＵＳＢコントローラ２１２は、ＵＳＢ接続を介して制御装置１００との間のデータの遣り取りを制御する。ネットワークコントローラ２１４は、任意ネットワークを介した他の装置との間のデータの遣り取りを制御する。
【００９２】
入力部２１６は、キーボードやマウスなどで構成され、ユーザ操作を受付ける。表示部２１８は、ディスプレイ、各種インジケータ、プリンタなどで構成され、プロセッサ２０２からの処理結果などを出力する。
【００９３】
図６には、プロセッサ２０２がプログラムを実行することで必要な機能が提供される構成例を示したが、これらの提供される機能の一部または全部を、専用のハードウェア回路（例えば、ＡＳＩＣまたはＦＰＧＡなど）を用いて実装してもよい。
【００９４】
（ｃ３：サーバ装置３００のハードウェア構成例）
本実施の形態に係る制御システム１を構成するサーバ装置３００は、一例として、汎用的なファイルサーバまたはデータベースサーバを用いて実現できる。このような装置のハードウェア構成については公知であるので、ここでは、その詳細な説明は行わない。
【００９５】
（ｃ４：表示装置４００のハードウェア構成例）
本実施の形態に係る制御システム１を構成する表示装置４００は、ＨＭＩ装置と称されるものであり、専用機として実装された構成を採用してもよいし、汎用的なアーキテクチャに従うハードウェア（例えば、汎用パソコンをベースとした産業用パソコン）を用いて実現してもよい。
【００９６】
汎用パソコンをベースとした産業用パソコンを用いて表示装置４００を実現する場合には、上述の図６に示すようなサポート装置２００と同様のハードウェア構成が採用される。但し、図６に示す構成例のうち、サポートプログラム２３０に代えて、ＨＭＩ機能を実現するためのプログラムがインストールされる。
【００９７】
＜Ｄ．実施の形態１：アプリケーションプログラムの分割実行化＞
以下、アプリケーションプログラムを分割実行化する局面について説明する。すなわち、本実施の形態に係る変換処理によって、分割実行型プログラムを生成する方法などについて説明する。
【００９８】
（ｄ１：ビルド処理）
まず、アプリケーションプログラムを分割実行化するための変換処理（ビルド処理）について説明する。本明細書において、「ビルド処理」は、ソースコードを制御装置１００上で実行可能な形式のコード（以下、「実行コード」とも称す。）に変換する処理を意味するものであり、典型的には、ソースコードのパース（字句解析および構文解析）、最適化、オブジェクトコードの生成などの処理を含む。
【００９９】
本実施の形態においては、アプリケーションプログラムのソースコードから実行コードを生成するビルド処理において、複数周期に分けて段階的に処理を進めるような実行コードを生成することができる。
【０１００】
図７は、本実施の形態に係るビルド処理の概略手順を示すフローチャートである。図７に示す処理は、基本的には、サポート装置２００によって提供される。より具体的には、サポート装置２００において、プロセッサ２０２がサポートプログラム２３０を実行することで、入力されたアプリケーションプログラムのソースコードに対してビルド処理が実行される。
【０１０１】
図７を参照して、通常のビルド処理においては、アプリケーションプログラムのソースコード７０が入力されると、制御装置１００で実行するための実行コードへ変換する通常のビルド処理７２が実行される。これによって、アプリケーションプログラムに対応する実行コード７４が生成される。
【０１０２】
これに対して、分割実行化に対応したビルド処理においては、入力されたアプリケーションプログラムのソースコード７０に対して、ユーザ（設計者あるいはプログラマ）が何らかの変更を加えることなく、複数周期に分けて段階的に処理を進めるような実行コードを生成するための、分割実行化に対応したビルド処理７６が実行される。分割実行化に対応したビルド処理７６においては、分割実行化された実行コードへ変換する処理が実行される。これによって、分割実行化されたアプリケーションプログラムの実行コード７８が生成される。
【０１０３】
実行コード７８は、アプリケーションの分割実行の制御を行うための情報を遣り取りするための分割実行化インターフェイス７８２と、分割実行に必要な命令を含む分割実行化コード７８４と、アプリケーションプログラムに対応する実行コード７８６とを含む。
【０１０４】
分割実行化インターフェイス７８２は、親アプリケーションなどとの間で、分割実行に必要な設定の受付けや、分割実行の状態の出力などを行うための環境を提供する。
【０１０５】
分割実行化コード７８４は、プログラム実行の中断および再開を実現するための処理（例えば、メモリ上にあるデータの退避および復帰など）を実現するための命令群を含む。より具体的には、分割実行化コード７８４は、アプリケーションプログラムの実行開始から予め設定された時間（後述の「分割時間」）が経過すると、当該時点の実行状態を保存する命令と、保存した実行状態を復元する命令とを含む。分割実行化コード７８４によって実現される処理の詳細については後述する。
【０１０６】
実行コード７８は、基本的には、通常のビルド処理によって生成される実行コード７４と同様である。
【０１０７】
このように、本実施の形態に係るサポート装置２００は、アプリケーションプログラムのソースコード７０を実行コードに変換する処理（ビルド処理）において、ソースコード７０に対して、分割実行化インターフェイス７８２および分割実行化コード７８４を自動的に組入れた、分割実行化に対応したアプリケーションプログラムの実行コード７８を生成する。
【０１０８】
以下の説明において、１または複数の実行コードおよび必要な情報をパッケージ化したものを「実行モジュール」とも称す。「実行モジュール」は、そのままの形態で配布または流通できる状態を意味する。上述の図７の実行コード７８は、実行モジュールの一例でもある。
【０１０９】
なお、サポート装置２００は、ユーザからの明示的な設定、あるいは、予め定められた判断条件に従って、図７に示す通常のビルド処理および分割実行化に対応したビルド処理を任意に選択できるように構成されてもよい。
【０１１０】
図７に示すように、本実施の形態に係るビルド処理は、アプリケーションプログラムのソースコード７０の入力を受付ける処理と、アプリケーションプログラムのソースコード７０に、当該アプリケーションプログラムをタスク周期内において予め設定された時間だけ実行させた後に中断させ、次のタスク周期において当該アプリケーションプログラムの実行を再開するための第１の命令（分割実行化コード７８４）を付加することで、アプリケーションプログラムの実行モジュール（実行コード７８）を生成する処理とを含む。また、本実施の形態に係るビルド処理は、アプリケーションプログラムのソースコード７０に、当該アプリケーションプログラムの実行、中断、再開に係る制御パラメータの設定を受付けるための第２の命令（分割実行化インターフェイス７８２）を付加する処理も含む。
【０１１１】
（ｄ２：制御パラメータおよび分割実行化インターフェイス）
次に、分割実行を制御するためのパラメータおよびそれらのパラメータを設定するための分割実行化インターフェイスの一例について説明する。
【０１１２】
本実施の形態においては、分割実行を制御するためのパラメータとして、（１）継続フラグ、（２）分割時間、（３）完了フラグの３つを用いる。
【０１１３】
（１）継続フラグは、対象のアプリケーションプログラムの直前に実行中断した箇所から再開して処理を継続するのか、あるいは、対象のアプリケーションプログラムを最初から処理を実行するのかを設定する。すなわち、（１）継続フラグは、アプリケーションプログラムの実行を中断した箇所から再開する、および、アプリケーションプログラムを最初から実行する、のいずれかを選択するための情報に相当する。この結果、継続フラグは、本実施の形態に係る分割実行の有効／無効を実質的に設定することになる。
【０１１４】
図８は、本実施の形態に係る分割実行を制御するための継続フラグの意義を説明するための図である。図８（Ａ）には、継続フラグがＯＦＦに設定されている場合のプログラムの実行例を示し、図８（Ｂ）には、継続フラグがＯＮに設定されている場合のプログラムの実行例を示す。
【０１１５】
図８（Ａ）に示すように、継続フラグがＯＦＦに設定されている場合には、タスク内で呼出されるアプリケーションプログラム（図８において「Ｐ」の符号で示されている）が、タスク周期毎に最初から処理が開始され、タスク周期内にすべての処理を実行できれば、完了を通知する。このようなアプリケーションプログラムの最初からの実行がタスク周期毎に繰返される。
【０１１６】
これに対して、継続フラグがＯＮに設定されている場合には、図８（Ｂ）に示すように、あるタスク周期で実行が開始されたアプリケーションプログラムにおいて、実行が中断されると、次のタスク周期において、その中断された箇所から処理が再開される。このように、継続フラグがＯＮに設定されることで、アプリケーションプログラムはタスク周期毎に処理の実行が中断されても、次のタスク周期において、各中断された箇所から処理が再開されることになる。このような処理の再開および中断の機能を利用することで、１回のアプリケーションプログラムの実行を複数のタスク周期に亘らせることができる。
【０１１７】
次に、（２）分割時間は、各タスク周期においてアプリケーションプログラムの実行に割当てられる時間を設定する。すなわち、分割時間は、アプリケーションプログラムの実行開始から中断するまでの時間を意味する。
【０１１８】
図９は、本実施の形態に係る分割実行を制御するための分割時間の意義を説明するための図である。図９（Ａ）には、分割時間がｔ１に設定されている場合のプログラムの実行例を示し、図９（Ｂ）には、分割時間がｔ２（＞ｔ１）に設定されている場合のプログラムの実行例を示す。
【０１１９】
図９（Ａ）に示すように、分割時間がｔ１に設定されている場合には、各タスク周期において、アプリケーションプログラムは設定された分割時間ｔ１だけ処理を実行し、その後、処理の実行を中断する。図９（Ｂ）に示すように、分割時間がｔ１より長いｔ２に設定されている場合には、各タスク周期において、アプリケーションプログラムは設定された分割時間ｔ２だけ処理を実行し、その後、処理の実行を中断する。
【０１２０】
このように、分割時間の長さを他のタスクなどとの関係で任意に調整することができるようになっている。
【０１２１】
なお、実装上の仕様として、例えば、分割時間をゼロに設定した場合であっても、アプリケーションプログラムが全く実行されないというのではなく、各タスク周期において最小限の処理を実行して、処理の実行を中断するようにしてもよい。また、分割時間に「無限」が設定された場合には、アプリケーションプログラムの実行が完了するまで中断しないようにしてもよい（詳細については後述する）。但し、この場合には、周期超過が発生する可能性がある。
【０１２２】
（３）完了フラグは、アプリケーションプログラムの実行完了を通知する。完了フラグを参照することで、対象のアプリケーションプログラムの実行が完了したか否かを判断できる。
【０１２３】
図７に示される分割実行化されたアプリケーションプログラムの実行コード７８に追加される分割実行化コード７８４は、上述したような制御パラメータを保持するための変数またはメモリ領域を形成するための命令を含む。
【０１２４】
ここで、図７に示される分割実行化されたアプリケーションプログラムの実行コード７８に追加される分割実行化インターフェイス７８２の一例について説明する。
【０１２５】
図１０は、本実施の形態に係るビルド処理における分割実行化インターフェイス７８２の追加を説明するための図である。図１０には、ファンクションブロックの形でアプリケーションプログラムの実行が指定されている例を示す。図１０に示す例では、アプリケーションプログラムの実行に際して、ユーザ定義の入力変数７０２および出力変数７０４がそれぞれ入力および出力として規定されているとする。
【０１２６】
分割実行化に対応したビルド処理によって、アプリケーションプログラムに対応する実行コード７８６が生成される。このとき、分割実行に必要な命令を含む分割実行化コード７８４が追加される。
【０１２７】
さらに、分割実行化インターフェイス７８２として、継続フラグ７８２０および分割時間７８２２が入力として追加されるとともに、完了フラグ７８２４が出力として追加される。すなわち、本実施の形態に係るビルド処理によって、ファンクションブロックまたはファンクションには、分割実行に必要な制御パラメータを遣り取りするためのフラグおよび変数が追加的に割当てられる。
【０１２８】
タスクとして登録されるプログラム内でこのようなファンクションブロックを利用する場合には、継続フラグ７８２０、分割時間７８２２および完了フラグ７８２４は、任意の変数種別（例えば、内部変数、外部変数、システム変数など）への割当てが可能になっている。
【０１２９】
図１１は、図１０に示す分割実行化に対応したビルド処理によって生成されたファンクションブロックの利用例を説明するための図である。図１１に示すように、分割実行化インターフェイス７８２（継続フラグ７８２０、分割時間７８２２、完了フラグ７８２４）が追加されたファンクションブロックを利用する際には、対応するアプリケーションプログラムに与える入力データを示す変数、および、対応するアプリケーションプログラムでの処理実行の結果得られる出力結果を格納する変数が定義される。また、対応するアプリケーションプログラムの実行を指示する条件（Ｅｘｅｃ）が規定される。このアプリケーションプログラムの実行を指示する条件には、完了フラグ７８２４の値を含めるようにしてもよい。このような条件を定義することで、対応するアプリケーションプログラムが複数周期に亘って実行中において、同一のアプリケーションプログラムが重複して実行されることを防止できる。
【０１３０】
（ｄ３：処理の中断／再開）
次に、本実施の形態に係る分割実行時のアプリケーションプログラムの挙動について説明する。
【０１３１】
図１２は、本実施の形態に係る分割実行に係る処理の中断／再開に係る挙動を説明するための図である。図１２を参照して、アプリケーションプログラムに対応する実行コード７８６は、各タスク周期において実行開始タイミングが到来すると、予め設定された分割時間だけ実行される。分割時間内にすべての処理を実行できれば、処理完了となる。但し、分割時間内にすべての処理を実行できなければ、一旦処理は中断する。この際、次に処理を再開できるように、中断した時点における実行状態８４が保存される。そして、処理が再開されると、保存された実行状態８４が復元される。
【０１３２】
実行状態８４としては、典型的には、プログラムの実行位置（命令位置）、スタック、変数情報、レジスタ値などの、メモリ上の状態値を含む。
【０１３３】
中断／再開時の処理コストを最小化するため、実行状態８４を保存する形態の一例として、中断時にアプリケーションプログラムが使用していたメモリエリア（プログラム実行用メモリ８０）を保護するようにしてもよい。すなわち、アプリケーションプログラムが使用していたメモリエリアに対して、当該アプリケーションプログラム外からの変更を禁止するようにしてもよい。このようなメモリエリアを保護することで、アプリケーションプログラムが再度呼出されたときに、その保護したメモリエリアをそのまま再利用できる。
【０１３４】
但し、再度呼出される（処理再開）まで当該メモリエリア（プログラム実行用メモリ８０）が別用途で使用される可能性がある場合など、当該アプリケーションプログラム外からの変更を禁止できない場合（すなわち、プログラム実行用メモリ８０が保持する実行状態８４の内容を保護できない場合）などには、プログラム実行用メモリ８０とは別に用意した、退避用メモリ８２に実行状態８４を一旦退避して保存する。そして、再度呼出されたとき（処理再開されたとき）に、その保存した実行状態８４をプログラム実行用メモリ８０へ復元するようにしてもよい。プログラム実行用メモリ８０とは別の退避用メモリ８２を用いることで、実行状態８４を確実に復元できる。
【０１３５】
このようなアプリケーションプログラムの実行開始から予め設定された時間（分割時間）が経過すると、当該時点の実行状態８４を保存する処理と、当該保存した実行状態８４を復元する処理とは、分割実行化コード７８４に含まれる命令によって実現される。
【０１３６】
（ｄ４：分割実行の処理手順）
次に、分割実行化されたアプリケーションプログラムの処理手順について説明する。図１３は、本実施の形態に係る分割実行の処理手順の一例を示すフローチャートである。図１３（Ａ）は、分割実行が無効化されている場合の処理手順を示し、図１３（Ｂ）は、分割実行が有効化されている場合の処理手順を示す。
【０１３７】
まず、図１３（Ａ）を参照して、分割実行が無効化されている場合の処理手順について説明する。タスク周期の到来などにおいて、処理が開始されると、メモリが初期化され（ステップＳ２）、アプリケーションプログラムが実行される（ステップＳ４）。そして、アプリケーションプログラムに含まれるすべての命令の実行が完了すると、処理は終了する。
【０１３８】
このような図１３（Ａ）に示す処理手順は、分割実行化されていないアプリケーションプログラムの実行時の処理手順と同様である。
【０１３９】
次に、図１３（Ｂ）を参照して、分割実行が有効化されている場合の処理手順について説明する。なお、図１３（Ｂ）に含まれる処理のうち、図１３（Ａ）と同様の処理については、同一のステップ番号を付している。
【０１４０】
タスク周期の到来などにおいて、処理が開始されると、まず、継続フラグがＯＮであるか否かが判断される（ステップＳ１）。継続フラグがＯＦＦでなければ（ステップＳ１においてＮＯの場合）、メモリが初期化される（ステップＳ２）。これに対して、継続フラグがＯＮであれば（ステップＳ１においてＹＥＳの場合）、前回の処理実行時に保存された実行状態が復元される（ステップＳ３）。すなわち、継続フラグは、アプリケーションプログラムを初期化した上で実行するか否かを制御するために用いられる。
【０１４１】
ステップＳ２またはステップＳ３の後、実行時間が初期化される（ステップＳ５）。実行時間は、アプリケーションプログラムの実行継続時間の実測値を意味し、実行時間の初期化は、実行継続時間を実測するためのタイマなどをリセットすることを意味する。そして、アプリケーションプログラムが実行される（ステップＳ４）。
【０１４２】
そして、アプリケーションプログラムに含まれるすべての命令の実行が完了したか否かが判断される（ステップＳ６）。すべての命令の実行が完了していれば（ステップＳ６においてＹＥＳ）、完了フラグがＯＮにセットされ（ステップＳ７）、処理は終了する。
【０１４３】
一方、アプリケーションプログラムに含まれるすべての命令の実行が完了していなければ（ステップＳ６においてＮＯ）、アプリケーションプログラムの実行開始から設定された分割時間が経過したか否かが判断される（ステップＳ８）。
【０１４４】
アプリケーションプログラムの実行開始から設定された分割時間が経過していなければ（ステップＳ８においてＮＯ）、ステップＳ６以下の処理が繰返される。これに対して、アプリケーションプログラムの実行開始から設定された分割時間が経過していれば（ステップＳ８においてＹＥＳ）、当該タスク周期におけるアプリケーションプログラムが実行可能な時間が経過したことを意味し、処理の実行を中断するとともに、中断した時点における実行状態が保存される（ステップＳ９）。そして、当該タスク周期における処理は終了する。
【０１４５】
このように、本実施の形態に係る分割実行が有効化されている場合には、継続実行中であれば前回の中断状態から処理を再開し、そうでなければ初期状態から処理を開始する。予め設定された分割時間が経過した場合には、実行状態（プログラムの実行位置（命令位置）、スタック、変数情報、レジスタ値など）が保存される。このような実行状態を保存することで、処理の中断／再開をフレキシブルに実現できる。
【０１４６】
（ｄ５：処理中断の実装方式その１：タイマ割込方式）
本実施の形態に係るビルド処理においては、基本的には、アプリケーションプログラムのソースコードに対して、ユーザによる変更無しに、設定された分割時間毎に処理を中断できる。このような処理中断の実装方式の一例について説明する。
【０１４７】
このような実装方式の第一案として、割込タイマを利用して、予め設定された分割時間が到来する毎に、割込イベントを発生させるとともに、この割込イベントに応答して、処理の実行を中断するようにしてもよい。
【０１４８】
より具体的には、上述の図１３（Ｂ）に示される処理手順において、設定された分割時間の値で割込タイマをセットする。セットされた割込タイマからの割込イベントが発生する前にすべての命令の実行が完了していれば、完了フラグをＯＮにセットするとともに、割込タイマの設定を破棄する。一方、命令の実行が完了する前に、割込タイマからの割込イベントが発生すると、当該時点における実行状態が保存される。
【０１４９】
このような割込タイマの設定は、分割実行化コード７８４に含まれる命令によって実現される。すなわち、分割実行化コード７８４は、アプリケーションプログラムの実行開始から予め設定された時間（分割時間）が経過すると割込イベントを発生するように割込タイマを設定するための命令を含む。
【０１５０】
割込タイマを利用可能な環境（ハードウェア、ＯＳ、インタプリタ実行系がサポートしている場合など）であると判断された場合に、このようなタイマ割込方式が選択される。
【０１５１】
（ｄ６：処理中断の実装方式その２：中断ポイント挿入方式）
上述したようなタイマ割込方式を利用できない環境の場合には、予め自動挿入された中断ポイントを利用する中断ポイント挿入方式を採用してもよい。
【０１５２】
中断ポイントは、アプリケーションプログラムに含まれる命令を順次実行するにあたって、処理開始から予め設定された分割時間が経過したか否かを判断する位置に相当する。すなわち、アプリケーションプログラムに含まれる命令が順次実行され、中断ポイントに到達するたびに分割時間が経過したか否かが判断される。このように、アプリケーションプログラムの処理中断は、挿入されたいずれかの中断ポイントとなる。
【０１５３】
図１４は、本実施の形態に係るビルド処理における中断ポイントの挿入処理を説明するための図である。図１４（Ａ）には、一般的な、バブルソートプログラムのソースコード６０の一例を示し、図１４（Ｂ）には、ソースコード６０に対して中断ポイント６８が挿入されたソースコード６１の一例を示す。図１４に示すソースコードにおいては、中断ポイント６８を意味するキーワード（命令語）として、「ＣＨＥＣＫ＿ＰＯＩＮＴ」を用いている。
【０１５４】
このような中断ポイント６８をソースコードの適切な位置に挿入しておくことで、中断ポイント６８毎に処理の中断要否が判断されることになる。なお、後述するような中断ポイント６８をユーザが任意に挿入する場合を除いて、基本的には、中断ポイント６８は自動的にソースコード内に挿入されることになる。このような中断ポイント６８の挿入は、分割実行化コード７８４に含まれる命令によって実現される。すなわち、分割実行化コード７８４は、アプリケーションプログラムのソースコードに予め設定された中断ポイント６８毎に予め設定された時間（分割時間）が経過しているか否かを判断する命令を含む。また、本実施の形態に係るビルド処理は、アプリケーションプログラムのソースコードに対して中断ポイント６８を挿入する処理を含む。
【０１５５】
中断ポイント挿入方式においては、ある中断ポイント６８から次の中断ポイント６８までは、処理を中断できないので、設定された分割時間を順守できるように、中断ポイント６８を挿入する位置（粒度）を最適化する必要がある。また、中断ポイント６８を挿入することによる、コード量および実行モジュールサイズの増加、処理ジッタによる性能への影響を最小化する観点からも、中断ポイント６８を挿入する位置および数を最適化する必要がある。
【０１５６】
そこで、ビルド処理においては、以下のような手順に従って、中断ポイント６８の挿入位置を決定することが好ましい。
【０１５７】
（１）命令毎の実行時間表を参照して、ソースコードに含まれる各命令の実行時間を算出する。
【０１５８】
（２）ソースコードの先頭または直前の中断ポイントの位置から、必要な実行時間を累積加算してゆき、予め定められた時間に達する直前に中断ポイントを挿入する。
【０１５９】
予め定められた時間としては、ビルド処理に設定される分割時間が分かる場合には、当該設定される分割時間をそのまま利用すればよい。一方、設定される分割時間がプログラム実行時まで分からない場合（例えば、ユーザが分割時間を任意に設定できる環境下など）には、分割実行化されたアプリケーションプログラムが実行される環境において設定される分割時間の最小分解能を、予め定められた時間として採用できる。
【０１６０】
（ｄ７：中断ポイントの任意設定）
上述の中断ポイント挿入方式においては、中断ポイントが自動的に挿入される例を説明したが、この中断ポイントを任意の位置に挿入または自動的に挿入された位置を変更するようにしてもよい。
【０１６１】
例えば、アプリケーションプログラムにおいて実行される一連の処理のうち、特定の処理区間については中断させたくないような場合が想定される。このような場合には、ユーザが中断ポイントの位置を明示的に指定できるようにしてもよい。例えば、一連の通信処理において、複数の通信コマンドを連続的に発行する必要がある場合などでは、途中で処理が中断すると受信側が不正状態やタイムアウトになるような問題が生じ得る。このような事態を回避するために、処理を中断させたくない区間には、中断ポイントを意図的に挿入しないように設定できる。
【０１６２】
図１５は、本実施の形態に係る分割実行化における中断ポイントの任意挿入を説明するための図である。図１５には、図１４と同様に、一般的な、バブルソートプログラムのソースコード６１の一例を示す。
【０１６３】
図１５に示すソースコード６１においては、中断ポイント６８は、（１）初期処理後（配列サイズの取得後）と、（２）配列全体の１操作単位（ｘ値の更新）とに挿入されており、配列要素の個別処理（ｙ値の更新）の区間には挿入されていない。その結果、ｙ値の更新中には処理は中断されなくなり、あるｘ値についてのｙ値は、一度の処理ですべて更新されることになる。
【０１６４】
中断ポイントを任意の位置に挿入する処理は、ビルド処理時に実行される。上述したタイマ割込方式が採用される場合には、割込イベントが発生した場合であっても、次の中断ポイントに到達するまでは処理を継続するようにコーディングされる。
【０１６５】
一方、中断ポイント挿入方式が採用される場合には、入力されたソースコードに対して、中断ポイントが先に自動的に挿入されるので、ユーザは、必要に応じて、自動的に挿入された中断ポイントを任意に変更する。このような中断ポイントを挿入することで、中断ポイントが挿入された箇所においてのみ、分割時間の経過（すなわち、中断の要否）が判断される。
【０１６６】
上述したような中断ポイントの任意設定の機能を利用することで、例えば、通信処理や予め手順が定められたような処理についても、中断による不具合の発生を回避できる。
【０１６７】
＜Ｅ．実施の形態２：分割実行型プログラムのプログラム部品としての利用＞
次に、本実施の形態に係るビルド処理によって生成された分割実行型プログラムをライブラリなどのプログラム部品として利用する例について説明する。
【０１６８】
（ｅ１：応用例）
例えば、制御装置のメーカやソフトウェアベンダなどのプログラム部品提供者は、任意のアプリケーションプログラムを分割実行型プログラムとして有償あるいは無償で配布し、制御装置の一般ユーザやシステムインテグレータなどのプログラム部品利用者がその配布された分割実行型プログラムを組込んだ任意のユーザプログラムを作成するような形態が想定される。
【０１６９】
プログラム部品の配布形態としては、任意の方法を採用できる。例えば、光学ディスクなどの媒体に実行コード（あるいは、実行モジュールやライブラリ）を格納した上で配布してもよいし、サーバなどに実行コードを配置した上で、任意の情報処理装置からのアクセスによってダウンロードの形で配布してもよい。
【０１７０】
さらに、プログラム部品としての実行コードを単体で配布するのではなく、ソースコードまたはソースコードに対してビルド処理することで生成される実行コードとともに、プログラム部品としての実行コードを配布するようにしてもよい。
【０１７１】
（ｅ２：分割実行プログラムの判別）
本実施の形態に係るビルド処理によって生成された分割実行化されたアプリケーションプログラムには、分割実行型プログラムであることを判別するための情報を付加しておくことが好ましい。
【０１７２】
例えば、本実施の形態に係るビルド処理によって分割実行型プログラムが生成される際に、分割実行型プログラムであることを示すプログラム定義情報を付加するようにしてもよい。すなわち、本実施の形態に係るビルド処理は、実行モジュールに含まれている実行コードの状態を示す情報を含むプログラム定義情報を実行モジュールに関連付けて生成する処理を含んでいてもよい。
【０１７３】
プログラム定義情報を付加する形態としては、例えば、分割実行型プログラムと関連付けられるヘッダファイルに組入れてもよいし、分割実行型プログラムの実行コードに組入れてもよい。プログラム定義情報としては、分割実行型プログラムであることを示す固有の識別子であってもよい。
【０１７４】
ユーザプログラムを開発するプログラミングツールは、指定されたアプリケーションプログラムに関連付けられた固有の識別子の有無に基づいて、プログラム編集時やビルド処理時に、分割実行型プログラムであるか否かを判別する。プログラミングツールにおいて、分割実行型プログラムであるか否かを判別できるので、後述するような分割実行型プログラムに応じたインターフェイスの提供などを実現できる。
【０１７５】
（ｅ３：分割実行プログラムの配布形態）
本実施の形態においては、プログラム部品の利用者が分割実行の有効／無効を任意に選択できるように、大別して、以下のいずれかの形態で分割実行プログラムを配布するようにしてもよい。
【０１７６】
（１）二重の実行コードを配布（性能優先）
本実施の形態に係るビルド処理によって生成された分割実行対応版の実行コードと、通常のビルド処理によって生成された実行コードとの両方を含むプログラム部品を配布してもよい。プログラム部品の一形態として、実行モジュールを採用できる。この場合、それぞれの実行コードにおけるエントリポイントのアドレスが異なるため、実行モジュールを利用するユーザプログラムのビルド時において、いずれの実行モジュールを利用するのかが指定される。ユーザプログラムのプログラミングツールが指定される実行モジュールのエントリポイントへのリンクを生成する。
【０１７７】
（２）分割実行化された実行コードのみ配布（サイズ優先）
本実施の形態に係るビルド処理によって生成された分割実行対応版の実行コードのみを含む実行モジュールを配布するようにしてもよい。このように配布された実行モジュールを、分割実行を無効化して利用する場合には、当該実行モジュールを利用するユーザプログラムのビルド時において、呼び出し時の制御パラメータを適切に設定することで、分割実行を無効化して動作させることができる。
【０１７８】
配布されたプログラム部品が上述のいずれの形態であるかを示す識別子を、当該プログラム部品に関連付けられるプログラム定義情報に含めるようにしてもよい。
【０１７９】
（ｅ４：二重の実行コードを配布）
次に、二重の実行コードを配布する場合の手順の一例について説明する。
【０１８０】
図１６は、本実施の形態に係るビルド処理によって生成された２種類の実行コードを含む実行モジュールをプログラム部品として利用する場合の手順を説明するための図である。
【０１８１】
図１６を参照して、まず、プログラム部品提供者は、任意のアプリケーションプログラムのソースコード７０に対して、通常のビルド処理７２が実行されることで、アプリケーションプログラムに対応する実行コード７４を生成する。並行して、プログラム部品提供者は、同じアプリケーションプログラムのソースコード７０に対して、分割実行化に対応したビルド処理７６を実行することで、分割実行化されたアプリケーションプログラムの実行コード７８を生成する。
【０１８２】
実行コード７８は、アプリケーションの分割実行の制御を行うための情報を遣り取りするための分割実行化インターフェイス７８２と、分割実行に必要な命令を含む分割実行化コード７８４と、アプリケーションプログラムに対応する実行コード７８６とを含む。
【０１８３】
さらに、プログラム部品提供者は、アプリケーションプログラムに対応する実行コード７４および分割実行化されたアプリケーションプログラムの実行コード７８を一体化した実行モジュール９０を生成する。実行モジュール９０には、実行モジュール９０が分割実行型プログラムであることを示す情報、および、２つの実行コードが含まれていることを示す情報を含むプログラム定義情報９２を付加するようにしてもよい。
【０１８４】
この実行モジュール９０および関連付けられるプログラム定義情報９２がプログラム部品として、プログラム部品利用者へ提供される。
【０１８５】
このように、二重の実行コードを配布する場合には、本実施の形態に係るビルド処理は、分割実行に必要な命令を含む分割実行化コード７８４を付加することで生成される実行コード７８と、分割実行化コード７８４が付加されていないアプリケーションプログラムのソースコード７０から生成された実行コード７４とを含む、実行モジュール９０を生成する。
【０１８６】
一方、プログラム部品利用者は、実行モジュール９０を利用する、任意のユーザプログラムのソースコード９４を作成したとする。そして、プログラム部品利用者は、プログラミングツールを操作して、作成したユーザプログラムのソースコード９４に対して、通常のビルド処理９６を実行することで、ユーザプログラムに対応する実行モジュール９８を生成する。このとき、ユーザプログラム内にて、プログラム定義情報９２を参照するコードを記述するとともに、実行モジュール９０に含まれるいずれの実行コードを利用するのかを指定する。このようなユーザプログラムのソースコード９４における定義および指定によって、実行コード７４および実行コード７８のいずれを利用するのかを切替えることができる。
【０１８７】
図１７は、本実施の形態に係るビルド処理により生成される二重の実行コードを含む実行モジュールを利用する場合のユーザプログラムの作成例を説明するための図である。図１７には、ユーザプログラムの作成時において、実行コードをファンクションブロック形式で指定する例を示す。
【０１８８】
図１７（Ａ）には、分割実行が無効化されている場合のファンクションブロック７９の表示例を示し、図１７（Ｂ）には、分割実行が有効化されている場合のファンクションブロック７９の表示例を示す。
【０１８９】
図１７（Ａ）に示すように、実行モジュール９０に対応するアプリケーションプログラムの分割実行を無効化した場合には、対応するファンクションブロック７９には、分割実行に必要な入出力は表示されない。一方、図１７（Ｂ）に示すように、実行モジュール９０に対応するアプリケーションプログラムの分割実行を有効化した場合には、対応するファンクションブロック７９には、分割実行に必要な入出力（継続フラグ７８２０、分割時間７８２２、完了フラグ７８２４）が表示される。
【０１９０】
このように、二重の実行コードを含む実行モジュール９０であるプログラム部品を利用する場合には、分割実行の有効または無効をユーザが任意に選択することができ、また、その選択に応じて、当該プログラム部品を利用するためのユーザインターフェイスも変化する。このような表示切替は、プログラム定義情報９２（図１６参照）を参照することで実現できる。
【０１９１】
図１７に示すように、本実施の形態においては、実行モジュール９０を参照するユーザプログラムの作成過程において、アプリケーションプログラムをタスク周期内において予め設定された時間だけ実行させた後に中断させる機能が有効化されているか否かに応じて、制御パラメータの設定の受付けを有効化するか否かを変化させる処理が実行される。
【０１９２】
本実施の形態においては、分割実行化されたアプリケーションをファンクションブロック形式（あるいは、ファンクション形式）で利用してプログラミングを行う際に、分割実行が無効化されている状態と、分割実行が有効化されている状態とを任意に選択することができる。
【０１９３】
（ｅ５：分割実行化された実行コードのみ配布）
次に、分割実行化された実行コードのみ配布する場合の手順の一例について説明する。
【０１９４】
図１８は、本実施の形態に係るビルド処理によって生成された実行コードのみを含む実行モジュールをプログラム部品として利用する場合の手順を説明するための図である。
【０１９５】
図１８を参照して、まず、プログラム部品提供者は、任意のアプリケーションプログラムのソースコード７０に対して、分割実行化に対応したビルド処理７６を実行することで、分割実行化されたアプリケーションプログラムの実行コード７８を生成する。
【０１９６】
実行コード７８は、アプリケーションの分割実行の制御を行うための情報を遣り取りするための分割実行化インターフェイス７８２と、分割実行に必要な命令を含む分割実行化コード７８４と、アプリケーションプログラムに対応する実行コード７８６とを含む。
【０１９７】
さらに、プログラム部品提供者は、分割実行化されたアプリケーションプログラムの実行コード７８のみを含む実行モジュール９１を生成する。実行モジュール９１には、実行モジュール９１が分割実行型プログラムであることを示す情報、および、分割実行化されたアプリケーションプログラムの実行コード７８のみが含まれていることを示す情報を含むプログラム定義情報９２を付加するようにしてもよい。
【０１９８】
この実行モジュール９１および関連付けられるプログラム定義情報９２がプログラム部品として、プログラム部品利用者へ提供される。
【０１９９】
一方、プログラム部品利用者は、実行モジュール９１を利用する、任意のユーザプログラムのソースコード９４を作成したとする。そして、プログラム部品利用者は、プログラミングツールを操作して、作成したユーザプログラムのソースコード９４に対して、通常のビルド処理９６を実行することで、ユーザプログラムに対応する実行モジュール９８を生成する。このとき、ユーザプログラム内にて、プログラム定義情報９２を参照するコードを記述するとともに、利用方式に応じて、実行モジュール９１に含まれる実行コード７８を利用する方法を指定する。より具体的には、分割実行を有効化するか、あるいは、無効化するかに応じて、ユーザプログラムのソースコード９４の内容が適宜変更される。
【０２００】
図１９は、本実施の形態に係るビルド処理により生成される分割実行化された実行コードのみを含む実行モジュールを利用する場合のユーザプログラムの作成例を説明するための図である。
【０２０１】
分割実行を有効化する場合のユーザインターフェイスは、図１７（Ｂ）に示すユーザインターフェイスと同様であるので、再度の説明は行わない。一方、図１９には、分割実行を無効化する場合のユーザインターフェイスの一例を示す。
【０２０２】
実行モジュール９１には、分割実行化されたアプリケーションプログラムの実行コード７８のみが含まれるので、そのままでは分割実行を無効化することができない。そこで、プログラミングツールまたはビルド処理にて、ユーザプログラムのソースコードが補間される。
【０２０３】
具体的には、図１９に示すように、分割実行が無効化されると、実行モジュール９１を利用するファンクションブロック７９は、２つのファンクションブロック７９Ａのように解釈される。
【０２０４】
ファンクションブロック７９Ａの分割時間７８２２は、「無限（Ｉｎｆ．）」に設定される。分割時間７８２２が「無限」に設定されることで、分割実行が実質的に無効化される。
【０２０５】
そして、ファンクションブロック７９Ａにおいては、対応するアプリケーションプログラムの実行にあたってメモリの初期化などを指示し、当該アプリケーションプログラムに含まれるすべての命令の実行を指示する。なお、ファンクションブロック７９Ａの完了フラグ７８２４の値は、いずれも利用されない（読み捨てられる）。
【０２０６】
このようなファンクションブロック７９Ａを用いるとともに、それぞれに対して適切な制御パラメータを設定することで、分割実行を無効化した状態と等価な動作を実現できる。
【０２０７】
このように、分割実行化されたアプリケーションプログラムの実行コード７８のみを含む実行モジュール９１自体はそのままで、呼び出し側のソースコードを自動補完することにより、分割実行を無効化した場合と同様の動作を実現できる。
【０２０８】
＜Ｆ．その他の実施の形態＞
上述の説明においては、アプリケーションプログラムのソースコードに対してビルド処理することで、実行コードあるいは実行モジュールが生成される例を説明した。但し、ビルド処理（事前のコンパイル処理の一例）に限られず、例えば、プログラムコードを逐次解釈して実行するインタプリタ実行環境で実現してもよいし、あるいは、事前にソースコードを中間コードに変換しておき、この変換された中間コードを逐次解釈する準インタプリタ実行環境で実現してもよい。
【０２０９】
＜Ｇ．付記＞
上述したような本実施の形態は、以下のような技術思想を含む。
［構成１］
一定のタスク周期毎に周期実行されるタスクに含まれるアプリケーションプログラムを生成する方法であって、
アプリケーションプログラムのソースコード（７０）の入力を受付けるステップと、
前記アプリケーションプログラムのソースコードに、当該アプリケーションプログラムをタスク周期内において予め設定された時間だけ実行させた後に中断させ、次のタスク周期において当該アプリケーションプログラムの実行を再開するための第１の命令（７８４）を付加することで、前記アプリケーションプログラムの実行モジュール（７８）を生成するステップとを備える、方法。
［構成２］
前記第１の命令は、
アプリケーションプログラムの実行開始から前記予め設定された時間が経過すると、当該時点の実行状態を保存する命令と、
前記保存した実行状態を復元する命令とを含む、構成１に記載の方法。
［構成３］
前記第１の命令は、アプリケーションプログラムの実行開始から前記予め設定された時間が経過すると割込イベントを発生するように割込タイマを設定するための命令をさらに含む、構成２に記載の方法。
［構成４］
前記第１の命令は、前記アプリケーションプログラムのソースコードに予め設定された中断ポイント毎に前記予め設定された時間が経過しているか否かを判断する命令をさらに含む、構成２に記載の方法。
［構成５］
前記アプリケーションプログラムのソースコードに対して前記中断ポイント（６８）を挿入するステップをさらに備える、構成４に記載の方法。
［構成６］
前記実行モジュールを生成するステップは、前記第１の命令（７８４）を付加することで生成される第１の実行コード（７８）と、前記第１の命令が付加されていない前記アプリケーションプログラムのソースコード（７０）から生成された第２の実行コード（７４）とを含む、前記実行モジュール（９０）を生成する、構成１〜５のいずれか１項に記載の方法。
［構成７］
前記実行モジュールを生成するステップは、前記実行モジュールに含まれている実行コードの状態を示す情報を含むプログラム定義情報（９２）を前記実行モジュール（９０）に関連付けて生成するステップを含む、構成６に記載の方法。
［構成８］
前記実行モジュールを生成するステップは、前記アプリケーションプログラムのソースコード（７０）に、当該アプリケーションプログラムの実行、中断、再開に係る制御パラメータの設定を受付けるための第２の命令（７８２）をさらに付加するステップを含む、構成１〜７のいずれか１項に記載の方法。
［構成９］
前記制御パラメータは、アプリケーションプログラムの実行を中断した箇所から再開する、および、アプリケーションプログラムを最初から実行する、のいずれかを選択するための情報（７８２０）を含む、構成８に記載の方法。
［構成１０］
前記実行モジュールを参照するユーザプログラムの作成過程において、アプリケーションプログラムをタスク周期内において予め設定された時間だけ実行させた後に中断させる機能が有効化されているか否かに応じて、前記制御パラメータの設定の受付けを有効化するか否かを変化させるステップをさらに備える、構成８または９に記載の方法。
［構成１１］
一定のタスク周期毎に周期実行されるタスクに含まれるアプリケーションプログラムを生成する装置であって、
アプリケーションプログラムのソースコードの入力を受付ける手段と、
前記アプリケーションプログラムのソースコード（７０）に、当該アプリケーションプログラムをタスク周期内において予め設定された時間だけ実行させた後に中断させ、次のタスク周期において当該アプリケーションプログラムの実行を再開するための第１の命令（７８４）を付加することで、前記アプリケーションプログラムの実行モジュール（７８）を生成する手段とを備える、装置。
［構成１２］
コンピュータに、一定のタスク周期毎に周期実行されるタスクに含まれるアプリケーションプログラムを生成させるためのプログラムであって、前記プログラムは前記コンピュータに
アプリケーションプログラムのソースコード（７０）の入力を受付けるステップと、
前記アプリケーションプログラムのソースコードに、当該アプリケーションプログラムをタスク周期内において予め設定された時間だけ実行させた後に中断させ、次のタスク周期において当該アプリケーションプログラムの実行を再開するための第１の命令（７８４）を付加することで、前記アプリケーションプログラムの実行モジュール（７８）を生成するステップとを実行させる、プログラム。
【０２１０】
＜Ｈ．利点＞
本実施の形態によれば、予め定められたタスク周期内に実行が完了しないアプリケーションプログラムを周期実行されるタスクとして登録した場合であっても、各タスク周期内では、予め設定された時間だけ実行させた後に中断させつつ、複数のタスク周期に亘って１回実行するような実行形態を提供できる。アプリケーションプログラムのソースを手作業で変更する必要がなく、このような複数のタスク周期に亘る実行を実現できるため、任意のアプリケーションプログラムを制御装置上で実行させることができ、制御装置をより高機能化させることができる。
【０２１１】
今回開示された実施の形態はすべての点で例示であって制限的なものではないと考えられるべきである。本発明の範囲は、上記した説明ではなく、特許請求の範囲によって示され、特許請求の範囲と均等の意味および範囲内でのすべての変更が含まれることが意図される。
【符号の説明】
【０２１２】
１  制御システム、２  フィールドネットワーク、６  上位ネットワーク、１０  デバイス、１２  リモートＩ／Ｏ装置、１４  リレー群、１８  画像センサ、２０  カメラ、２２  サーボドライバ、２４  サーボモータ、５０  ユーザプログラム、５２  シーケンス命令群、５４，７９，７９Ａ  ファンクションブロック、５６，５８  処理時間、６０，６１，６２，７０，９４  ソースコード、６４，６６  命令群、６８  中断ポイント、７２，７６，９６  ビルド処理、７４，７８，７８６  実行コード、８０  プログラム実行用メモリ、８２  退避用メモリ、８４  実行状態、９０，９１，９８  実行モジュール、９２  プログラム定義情報、１００  制御装置、１０２，２０２  プロセッサ、１０４  メインメモリ、１０６，２０８  ストレージ、１０８  上位ネットワークコントローラ、１１０  フィールドネットワークコントローラ、１１２，２１２  ＵＳＢコントローラ、１１４  メモリカードインターフェイス、１１６  メモリカード、１３０  プロセッサバス、１４０  システムプログラム、２００  サポート装置、２０４  光学ドライブ、２０５  記録媒体、２０６  主メモリ、２１４  ネットワークコントローラ、２１６  入力部、２１８  表示部、２２０  バス、２３０  サポートプログラム、２３２  ビルド処理モジュール、２３４  プログラミングツール、３００，５００  サーバ装置、４００  表示装置、７０２  入力変数、７０４  出力変数、７８２  分割実行化インターフェイス、７８４  分割実行化コード、７８２０  継続フラグ、７８２２  分割時間、７８２４  完了フラグ。
【図１】
2019139365.tif 000003
【図２】
2019139365.tif 000004
【図３】
2019139365.tif 000005
【図４】
2019139365.tif 000006
【図５】
2019139365.tif 000007
【図６】
2019139365.tif 000008
【図７】
2019139365.tif 000009
【図８】
2019139365.tif 000010
【図９】
2019139365.tif 000011
【図１０】
2019139365.tif 000012
【図１１】
2019139365.tif 000013
【図１２】
2019139365.tif 000014
【図１３】
2019139365.tif 000015
【図１４】
2019139365.tif 000016
【図１５】
2019139365.tif 000017
【図１６】
2019139365.tif 000018
【図１７】
2019139365.tif 000019
【図１８】
2019139365.tif 000020
【図１９】
2019139365.tif 000021