(57)【要約】      （修正有）【課題】マルチタスク実行中に、同期性を確保した複数の変数の更新後の値を読み出す。【解決手段】ＰＬＣ（１０）は、複数のタスクを、前記タスクごとの周期で繰り返し並行して実行することにより制御対象機器を制御する。ＰＬＣ（１０）は、変数Ａ〜Ｃの各々の更新後の値の読出を完了する時点が全て、周期の間隔が最も小さいタスクの、１つの周期の開始時点から終了時点までの間に含まれるように、変数Ａ〜Ｃの各々の更新後の値を読み出し、読み出した変数Ａ〜Ｃの各々の値を外部に出力する。【選択図】図４
2019079256.tif 000002
【特許請求の範囲】
【請求項１】
複数のタスクを、前記タスクごとの周期で繰り返し並行して実行することにより制御対象機器を制御する制御装置であって、
各々の値が前記複数のタスクの少なくとも１つにおいて更新される、複数の変数について、前記タスクの実行中における各々の値を一括して問い合わせる要求を外部から受け付ける受付部と、
前記受付部が前記要求を受け付けると、前記複数の変数の各々の値の読出を完了する時点が全て、前記複数のタスクのうち前記周期の間隔が最も小さいタスクの、１つの周期の開始時点から終了時点までの間に含まれるように、前記複数の変数の各々の、前記複数のタスクの少なくとも１つにおいて更新された値を読み出す読出部と、
前記読出部が読み出した前記複数の変数の各々の値を外部に出力する出力部と、を備えることを特徴とする制御装置。
【請求項２】
前記読出部は、前記複数のタスクの各々の周期が揃う時点から、前記複数の変数の各々の値を全て読み出すのに要する期間として予想された予想読出期間を差し引いた時点までに、前記複数の変数の各々の値の読出を開始することを特徴とする請求項１に記載の制御装置。
【請求項３】
前記変数と、前記変数の値を更新する前記タスクと、を対応付けた対応情報を取得する取得部をさらに備え、
前記読出部は、前記取得部の取得した前記対応情報を用いて、前記複数の変数の各々の値を、前記複数の変数の各々の値を更新する前記タスクの前記周期において、読み出すことを特徴とする請求項１または２に記載の制御装置。
【請求項４】
前記対応情報において、前記複数の変数のうちの或る変数に対し、前記或る変数の値を更新する前記タスクが２つ以上対応付けられている場合、
前記読出部は、前記或る変数の値を更新する２つ以上の前記タスクの各々の前記周期が揃う時点の直前に、前記或る変数の値の読出を完了することを特徴とする請求項３に記載の制御装置。
【請求項５】
ＯＰＣＵＡサーバ機能を備え、
前記受付部は、ＯＰＣＵＡクライアント装置から、ＯＰＣＵＡ規格に準拠した接続方式で前記要求を受け付け、
前記出力部は、前記ＯＰＣＵＡクライアント装置に、前記複数の変数の各々の値をＯＰＣＵＡ規格に準拠した接続方式で出力することを特徴とする請求項１から４のいずれか１項に記載の制御装置。
【請求項６】
前記複数のタスクは、基準のタスクと、基準のタスク以外のタスクとを含み、
前記基準のタスク以外のタスクの周期は、前記基準のタスクの周期の整数倍に設定されていることを特徴とする請求項１から５のいずれか１項に記載の制御装置。
【請求項７】
複数のタスクを、前記タスクごとの周期で繰り返し並行して実行することにより制御対象機器を制御する制御装置の制御方法であって、
各々の値が前記複数のタスクの少なくとも１つにおいて更新される、複数の変数について、前記タスクの実行中における各々の値を一括して問い合わせる要求を外部から受け付ける受付ステップと、
前記受付ステップにて前記要求が受け付けられると、前記複数の変数の各々の値の読出を完了する時点が全て、前記複数のタスクのうち前記周期の間隔が最も小さいタスクの、１つの周期の開始時点から終了時点までの間に含まれるように、前記複数の変数の各々の、前記複数のタスクの少なくとも１つにおいて更新された値を読み出す読出ステップと、
前記読出ステップにて読み出された前記複数の変数の各々の値を外部に出力する出力ステップと、を含むことを特徴とする制御方法。
【請求項８】
請求項１から６のいずれか１項に記載の制御装置としてコンピュータを機能させるための情報処理プログラムであって、前記各部としてコンピュータを機能させるための情報処理プログラム。
【請求項９】
請求項８に記載の情報処理プログラムを記録したコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、機械および設備等の動作を制御するために用いられる制御装置に関する。
【背景技術】
【０００２】
従来、プログラマブルコントローラ（Programmable Logic Controller、以下「ＰＬＣ」と略記）等の産業用制御装置について、情報化（すなわち、産業用制御装置が取得・生成した情報の外部装置での利用等）と高性能化とを両立させるための種々の試みが知られている。
【０００３】
例えば、下掲の特許文献１には、ＰＬＣの情報化への試みとして、産業用の機器間通信のプロトコルであるＯＰＣＵＡ（OPC Unified Architecture）に準拠して、サーバ装置としてのＰＬＣ等とクライアント装置とが接続する技術が開示されている。
【０００４】
また、特許文献２には、ＰＬＣの高性能化への試みとして、時分割により複数のタスクを並行して実行するとともに、各タスクを各タスクに応じた周期で実行する、つまり、マルチタスクで処理を実行するＰＬＣが開示されている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１７−８４１４３号公報（２０１７年５月１８日公開）
【特許文献２】特開２００９−１８１４４３号公報（２００９年８月１３日公開）
【発明の概要】
【発明が解決しようとする課題】
【０００６】
ここで、特許文献２に開示されるようなＰＬＣについて、並行して実行される複数のタスクの各々において略同時に更新された複数の変数の各々の更新後の値を把握したい、つまり、同期性の確保された複数の変数の各々の更新後の値を把握したいとの要望がある。
【０００７】
しかしながら、特許文献１の従来技術には、複数のタスクを並行して周期的に実行する産業用制御装置に対し、タスク実行中に複数の変数の各々の更新後の値を一括して問合せた場合、応答中の複数の変数の各々の値の同期が保証されていないという問題がある。言い換えれば、上述の従来技術には、複数のタスクを並行して周期的に実行する産業用制御装置が、「各々が少なくとも１つのタスクにおいて更新される」複数の変数について、複数の変数の各々の更新後の値を読み出す時点を制御していないという問題がある。
【０００８】
本発明の一態様は、複数のタスクを並行して周期的に実行する産業用制御装置において、タスク実行中に複数の変数の各々の更新後の値を一括して問合せた場合、前記産業用制御装置が応答する複数の変数の各々の更新後の値の間の同期を実現することを目的とする。
【課題を解決するための手段】
【０００９】
上記の課題を解決するために、本発明の一態様に係る制御装置は、複数のタスクを、前記タスクごとの周期で繰り返し並行して実行することにより制御対象機器を制御する制御装置であって、各々の値が前記複数のタスクの少なくとも１つにおいて更新される、複数の変数について、前記タスクの実行中における各々の値を一括して問い合わせる要求を外部から受け付ける受付部と、前記受付部が前記要求を受け付けると、前記複数の変数の各々の値の読出を完了する時点が全て、前記複数のタスクのうち前記周期の間隔が最も小さいタスクの、１つの周期の開始時点から終了時点までの間に含まれるように、前記複数の変数の各々の、前記複数のタスクの少なくとも１つにおいて更新された値を読み出す読出部と、前記読出部が読み出した前記複数の変数の各々の値を外部に出力する出力部と、を備えることを特徴としている。
【００１０】
前記の構成によれば、複数のタスクを、前記タスクごとの周期で繰り返し並行して実行することにより制御対象機器を制御する。また、前記制御装置は、前記要求を受け付けると、前記複数の変数の各々の値の読出を完了する時点が全て、前記複数のタスクのうち前記周期の間隔が最も小さいタスクの、１つの周期の開始時点から終了時点までの間に含まれるように、前記複数の変数の各々の、前記複数のタスクの少なくとも１つにおいて更新された値を読み出し、読み出した前記複数の変数の各々の値を外部に出力する。
【００１１】
したがって、前記制御装置は、複数のタスクを並行して周期的に実行することができ、かつ、タスク実行中に複数の変数の各々の更新後の値を一括して問い合わせる要求を外部から受け付けると、複数の変数の各々の更新後の値であって、同期させた値を応答することができるとの効果を奏する。
【００１２】
ここで、前記複数の変数の各々の更新後の値の読出完了時点が、２つ以上の「前記周期の間隔が最も小さいタスクの周期」（以下、「基本周期」と呼ぶ）にまたがっている場合、読み出された複数の値の間で同期が確保されない。すなわち、前記複数の変数の各々の更新後の値の読出完了時点の間の時間間隔が、前記基本周期の間隔以上である場合、読み出された複数の値の間で同期が確保されない。
【００１３】
このことは、例えば、「前記基本周期に対応し、変数Ａの値を更新する」タスクＴｐと、「前記基本周期と異なる周期に対応し、変数Ａとは異なる変数Ｃの値を更新する」タスクＴｓと、が並行して周期的に実行される場合を想定すると、明確となる。
【００１４】
つまり、変数Ａの更新後の値の読出完了時点と、変数Ｃの更新後の値の読出完了時点と、の間の時間間隔が、前記基本周期の間隔以上である場合、前記時間間隔において１回以上、タスクＴｐが実行されることになる。そのため、ユーザは、変数Ａの値と、「変数Ａの値が読み出された後、変数Ａの値を更新するタスクＴｐが１回以上実行された後の、変数Ｃの値」と、を取得することになる。したがって、読み出された変数Ａの値と変数Ｃの値との間の同期は確保されておらず、ユーザは、同期する「複数の変数の各々の更新後の値」の間の関係を把握することができない。言い換えれば、ユーザは、並行して周期的に実行されるタスクＴｐおよびＴｓの各々において略同時に更新された変数Ａおよび変数Ｃの各々の更新後の値を、把握することができない。前述の例では、ユーザが取得するのは、変数Ａの値と、「変数Ａの値が読み出された後、変数Ａの値を更新するタスクＴｐが１回以上実行された後の、変数Ｃの値」と、である。
【００１５】
これに対して、前記制御装置は、前記複数の変数の各々の値の読出を完了する時点が全て、前記複数のタスクのうち前記周期の間隔が最も小さいタスクの、１つの周期内に含まれるように、前記複数の変数の各々の、前記複数のタスクの少なくとも１つにおいて更新された値を読み出し、読み出した前記複数の変数の各々の値を外部に出力する。すなわち、前記制御装置は、前記複数の変数の各々の更新後の値の読出完了時点の間の時間間隔が、前記基本周期の時間間隔よりも小さくなるように、前記複数の変数の各々の更新後の値を読み出し、読み出した前記複数の変数の各々の値を外部に出力する。
【００１６】
上述の例に即して言えば、前記制御装置は、変数Ａの更新後の値の読出完了時点と、変数Ｃの更新後の値の読出完了時点と、の間の時間間隔が、前記基本周期の時間間隔よりも小さくなるように、変数Ａおよび変数Ｃの各々の更新後の値を読み出す。前記制御装置が変数Ａの更新後の値の読出を完了した時点から、変数Ｃの更新後の値の読出を完了した時点までの間に、タスクＴｐもタスクＴｓも実行されないように、前記制御装置は変数ＡおよびＣの各々の更新後の値を読み出す。
【００１７】
したがって、前記制御装置により、ユーザは、並行して実行される複数のタスクの各々において略同時に更新された複数の変数の各々の更新後の値を把握することができ、つまり、同期性の確保された複数の変数の各々の更新後の値を把握することができる。言い換えれば、前記制御装置に対して、タスク実行中に複数の変数の各々の更新後の値を一括して問合せた場合、前記制御装置が応答する複数の変数の各々の更新後の値の間の同期が実現されている。
【００１８】
上述の例に即して言えば、前記制御装置により、ユーザは、タスクＴｐにおいて更新された変数Ａの更新後の値と、変数Ａが更新された時点と略同時にタスクＴｓにおいて更新された変数Ｃの更新後の値と、を把握することができる。つまり、前記制御装置により、ユーザは、変数Ａおよび変数Ｃの各々について、「同期性が確保された、更新後の値」を把握することができる。
【００１９】
本発明の一態様に係る制御装置について、前記読出部は、前記複数のタスクの各々の周期が揃う時点から、前記複数の変数の各々の値を全て読み出すのに要する期間として予想された予想読出期間を差し引いた時点までに、前記複数の変数の各々の値の読出を開始してもよい。
【００２０】
前記の構成によれば、前記制御装置は、前記複数のタスクの各々の周期が揃う時点から、前記複数の変数の各々の値を全て読み出すのに要する期間として予想された予想読出期間を差し引いた時点までに、前記複数の変数の各々の値の読出を開始する。
【００２１】
つまり、前記制御装置は、前記複数のタスクの各々の周期が揃う時点についての情報と、前記複数の変数の各々の値を全て読み出すのに要する期間として予想された予想読出期間についての情報と、を用いて、前記複数の変数の各々の更新後の値を読み出す。言い換えれば、前記制御装置は、前記複数の変数の各々の更新後の値を読み出すために、「前記複数の変数の各々の値が、前記複数のタスクのうちのいずれのタスクにおいて更新されるか」を把握する必要が無い。
【００２２】
したがって、前記制御装置は、「前記複数の変数の各々の値が、前記複数のタスクのうちのいずれのタスクにおいて更新されるか」を把握する場合に比べて実現の容易な処理によって、前記複数の変数の各々の更新後の値を読み出すことができるとの効果を奏する。
【００２３】
本発明の一態様に係る制御装置は、前記変数と、前記変数の値を更新する前記タスクと、を対応付けた対応情報を取得する取得部をさらに備え、前記読出部は、前記取得部の取得した前記対応情報を用いて、前記複数の変数の各々の値を、前記複数の変数の各々の値を更新する前記タスクの前記周期において、読み出してもよい。
【００２４】
前記の構成によれば、前記制御装置は、前記変数と、前記変数の値を更新する前記タスクと、を対応付けた対応情報を取得し、取得した前記対応情報を用いて、前記複数の変数の各々の値を、前記複数の変数の各々の値を更新する前記タスクの前記周期において、読み出す。
【００２５】
したがって、前記制御装置は、前記対応情報を用いて、前記複数の変数の各々の値を、前記複数の変数の各々の値を更新する前記タスクの前記周期において、読み出すことができるとの効果を奏する。
【００２６】
本発明の一態様に係る制御装置について、前記対応情報において、前記複数の変数のうちの或る変数に対し、前記或る変数の値を更新する前記タスクが２つ以上対応付けられている場合、前記読出部は、前記或る変数の値を更新する２つ以上の前記タスクの各々の前記周期が揃う時点の直前に、前記或る変数の値の読出を完了してもよい。
【００２７】
前記の構成によれば、前記制御装置は、前記対応情報において、前記複数の変数のうちの或る変数に対し、前記或る変数の値を更新する前記タスクが２つ以上対応付けられている場合、前記或る変数の値を更新する２つ以上の前記タスクの各々の前記周期が揃う時点の直前に、前記或る変数の値の読出を完了する。
【００２８】
ここで、前記或る変数について、前記或る変数の値を更新する２つ以上の前記タスクのうち、前記周期の間隔が最も小さいタスクにおいて、前記或る変数の更新後の値を読み出した場合、以下の事態が発生する。すなわち、読み出した値は、「前記周期の間隔が最も小さいタスク」が再実行される前に、「前記周期の間隔が最も小さいタスク」以外のタスクにおいて、さらに値が更新されることになる。
【００２９】
これに対し、前記制御装置は、前記或る変数の値を更新する２つ以上の前記タスクの各々の前記周期が揃う時点までに、前記或る変数の値を読み出す。したがって、前記制御装置は、前記或る変数の、或るタスクにおいて更新された後の値を読み出した後、前記或るタスクが再実行される前に、「前記或るタスク」以外のタスクにおいて、前記或る変数の値が更新されるという事態を防ぐことができるとの効果を奏する。
【００３０】
本発明の一態様に係る制御装置は、ＯＰＣＵＡサーバ機能を備え、前記受付部は、ＯＰＣＵＡクライアント装置から、ＯＰＣＵＡ規格に準拠した接続方式で前記要求を受け付け、前記出力部は、前記ＯＰＣＵＡクライアント装置に、前記複数の変数の各々の値をＯＰＣＵＡ規格に準拠した接続方式で出力してもよい。
【００３１】
前記の構成によれば、前記制御装置は、ＯＰＣＵＡサーバ機能を備え、ＯＰＣＵＡクライアント装置から、ＯＰＣＵＡ規格に準拠した接続方式で前記要求を受け付け、前記ＯＰＣＵＡクライアント装置に、前記複数の変数の各々の値をＯＰＣＵＡ規格に準拠した接続方式で出力する。
【００３２】
したがって、前記制御装置は、メーカおよびプラットフォームから独立した、安全で信頼性の高い、産業用の機器間通信のプロトコルであるＯＰＣＵＡ規格に準拠した接続方式で前記要求を受け付け、前記複数の変数の各々の値をＯＰＣＵＡ規格に準拠した接続方式で出力することができるとの効果を奏する。
【００３３】
本発明の一態様に係る制御装置について、前記複数のタスクは、基準のタスクと、基準のタスク以外のタスクとを含み、前記基準のタスク以外のタスクの周期は、前記基準のタスクの周期の整数倍に設定されていてもよい。
【００３４】
前記の構成によれば、前記制御装置において、前記複数のタスクは、基準のタスクと、基準のタスク以外のタスクとを含み、前記基準のタスク以外のタスクの周期は、前記基準のタスクの周期の整数倍に設定されている。
【００３５】
したがって、前記制御装置は、前記複数のタスクを同期させやすくすることができ、つまり、前記複数のタスクの各々の周期を揃えやすくすることができるとの効果を奏する。
【００３６】
上記の課題を解決するために、本発明の一態様に係る制御方法は、複数のタスクを、前記タスクごとの周期で繰り返し並行して実行することにより制御対象機器を制御する制御装置の制御方法であって、各々の値が前記複数のタスクの少なくとも１つにおいて更新される、複数の変数について、前記タスクの実行中における各々の値を一括して問い合わせる要求を外部から受け付ける受付ステップと、前記受付ステップにて前記要求が受け付けられると、前記複数の変数の各々の値の読出を完了する時点が全て、前記複数のタスクのうち前記周期の間隔が最も小さいタスクの、１つの周期の開始時点から終了時点までの間に含まれるように、前記複数の変数の各々の、前記複数のタスクの少なくとも１つにおいて更新された値を読み出す読出ステップと、前記読出ステップにて読み出された前記複数の変数の各々の値を外部に出力する出力ステップと、を含むことを特徴としている。
【００３７】
前記の方法によれば、前記制御方法は、複数のタスクを、前記タスクごとの周期で繰り返し並行して実行することにより制御対象機器を制御する。また、前記制御方法は、前記要求を受け付けると、前記複数の変数の各々の値の読出を完了する時点が全て、前記複数のタスクのうち前記周期の間隔が最も小さいタスクの、１つの周期の開始時点から終了時点までの間に含まれるように、前記複数の変数の各々の、前記複数のタスクの少なくとも１つにおいて更新された値を読み出し、読み出した前記複数の変数の各々の値を外部に出力する。
【００３８】
したがって、前記制御方法は、複数のタスクを並行して周期的に実行することができ、かつ、タスク実行中に複数の変数の各々の更新後の値を一括して問い合わせる要求を外部から受け付けると、複数の変数の各々の更新後の値であって、同期させた値を応答することができるとの効果を奏する。
【００３９】
ここで、前記複数の変数の各々の更新後の値の読出完了時点が、２つ以上の基本周期にまたがっている場合、読み出された複数の値の間で同期が確保されない。すなわち、前記複数の変数の各々の更新後の値の読出完了時点の間の時間間隔が、前記基本周期の間隔以上である場合、読み出された複数の値の間で同期が確保されない。
【００４０】
このことは、例えば、「前記基本周期に対応し、変数Ａの値を更新する」タスクＴｐと、「前記基本周期と異なる周期に対応し、変数Ａとは異なる変数Ｃの値を更新する」タスクＴｓと、が並行して周期的に実行される場合を想定すると、明確となる。
【００４１】
つまり、変数Ａの更新後の値の読出完了時点と、変数Ｃの更新後の値の読出完了時点と、の間の時間間隔が、前記基本周期の間隔以上である場合、前記時間間隔において１回以上、タスクＴｐが実行されることになる。そのため、ユーザは、変数Ａの値と、「変数Ａの値が読み出された後、変数Ａの値を更新するタスクＴｐが１回以上実行された後の、変数Ｃの値」と、を取得することになる。したがって、読み出された変数Ａの値と変数Ｃの値との間の同期は確保されておらず、ユーザは、同期する「複数の変数の各々の更新後の値」の間の関係を把握することができない。言い換えれば、ユーザは、並行して周期的に実行されるタスクＴｐおよびＴｓの各々において略同時に更新された変数Ａおよび変数Ｃの各々の更新後の値を、把握することができない。前述の例では、ユーザが取得するのは、変数Ａの値と、「変数Ａの値が読み出された後、変数Ａの値を更新するタスクＴｐが１回以上実行された後の、変数Ｃの値」と、である。
【００４２】
これに対して、前記制御方法は、前記複数の変数の各々の値の読出を完了する時点が全て、前記複数のタスクのうち前記周期の間隔が最も小さいタスクの、１つの周期内に含まれるように、前記複数の変数の各々の、前記複数のタスクの少なくとも１つにおいて更新された値を読み出し、読み出した前記複数の変数の各々の値を外部に出力する。すなわち、前記制御方法は、前記複数の変数の各々の更新後の値の読出完了時点の間の時間間隔が、前記基本周期の時間間隔よりも小さくなるように、前記複数の変数の各々の更新後の値を読み出し、読み出した前記複数の変数の各々の値を外部に出力する。
【００４３】
上述の例に即して言えば、前記制御方法は、変数Ａの更新後の値の読出完了時点と、変数Ｃの更新後の値の読出完了時点と、の間の時間間隔が、前記基本周期の時間間隔よりも小さくなるように、変数Ａおよび変数Ｃの各々の更新後の値を読み出す。前記制御方法が変数Ａの更新後の値の読出を完了した時点から、変数Ｃの更新後の値の読出を完了した時点までの間に、タスクＴｐもタスクＴｓも実行されないように、前記制御方法は変数ＡおよびＣの各々の更新後の値を読み出す。
【００４４】
したがって、前記制御方法により、ユーザは、並行して実行される複数のタスクの各々において略同時に更新された複数の変数の各々の更新後の値を把握することができ、つまり、同期性の確保された複数の変数の各々の更新後の値を把握することができる。言い換えれば、前記制御装置に対して、タスク実行中に複数の変数の各々の更新後の値を一括して問合せた場合、前記制御方法によって、応答における複数の変数の各々の更新後の値の間の同期が実現されている。
【００４５】
上述の例に即して言えば、前記制御方法により、ユーザは、タスクＴｐにおいて更新された変数Ａの更新後の値と、変数Ａが更新された時点と略同時にタスクＴｓにおいて更新された変数Ｃの更新後の値と、を把握することができる。つまり、前記制御方法により、ユーザは、変数Ａおよび変数Ｃの各々について、「同期性が確保された、更新後の値」を把握することができる。
【発明の効果】
【００４６】
本発明の一態様によれば、複数のタスクを並行して周期的に実行する産業用制御装置において、タスク実行中に複数の変数の各々の更新後の値を一括して問合せた場合、前記産業用制御装置が応答する複数の変数の各々の更新後の値の間の同期を実現することができるという効果を奏する。
【図面の簡単な説明】
【００４７】
【図１】本発明の実施形態１に係るＣＰＵユニットの要部構成等を示すブロック図である。
【図２】図１のＣＰＵユニットを備えるＰＬＣを含む管理システムの全体概要を示す図である。
【図３】図１のＣＰＵユニットのハードウェア構成を示す図である。
【図４】図１のＣＰＵユニットが実行する処理の概要を示す図である。
【図５】本発明の実施形態２に係るＣＰＵユニットの要部構成等を示すブロック図である。
【図６】図５のＣＰＵユニットの記憶部に格納される変数管理テーブルのデータ構造を示す図である。
【図７】図５のＣＰＵユニットが実行する処理の概要を示す図である。
【図８】図７に示した処理について、その詳細を説明する図である。
【図９】図５のＣＰＵユニットが実行する処理について、或る１つの変数の値を更新するタスクが複数ある場合の処理の概要を示す図である。
【図１０】図９に示した処理について、その詳細を説明する図である。
【発明を実施するための形態】
【００４８】
〔実施形態１〕
以下、本発明の一側面に係る実施の形態（以下、「本実施形態」とも表記する）を、図面に基づいて説明し、先ず、本発明の実施形態１について、図１から図４に基づいて詳細に説明する。なお、図中同一または相当部分には同一符号を付してその説明は繰返さない。本実施の形態においては、機械および設備等の制御対象を制御するＰＬＣ（プログラマブル・ロジック・コントローラ、Programmable Logic Controller）を制御装置（コントローラ）の典型例として説明を行う。
§１．適用例
本発明の一態様に係るＰＬＣ１０（制御装置）についての理解を容易にするため、先ず、本発明が適用される場面の一例について、具体的には、ＰＬＣ１０を含む管理システム１の概要について、図２を用いて説明する。
【００４９】
図２は、管理システム１の全体概要を示す図である。管理システム１は、以下の２つのシステムを含む。すなわち、１つ以上のＰＬＣ１０により生産設備内の入力機器および出力機器が制御される制御システム２と、制御システム２において取得、生成された各種の情報について、蓄積、解析等を実施し、制御システム２の運用等に利用する情報システム３と、を含む。
【００５０】
ＰＬＣ１０は、制御システム２と情報システム３との両方に接続され、情報システム３から、制御システム２（特に、制御システム２において使用されるデータ（変数））へのアクセスを実現する。ＰＬＣ１０とクライアント装置８０とは、例えば、ＯＰＣＵＡプロトコルを利用して、相互に接続している。
【００５１】
情報システム３のクライアント装置８０は、ＰＬＣ１０が制御処理を実行する際に使用する変数について、ＰＬＣ１０の稼働中における「複数の変数の各々の、同期生が確保された更新後の値」を一括して、ＰＬＣ１０に問い合わす。言い換えれば、クライアント装置８０は、ＰＬＣ１０による制御処理の実行に際して値が更新される変数について、複数の変数の間の関係を把握する等の目的により、更新時点が略同時である複数の変数の各々の更新後の値を一括して、ＰＬＣ１０に問い合わす。例えば、クライアント装置８０は、変数Ａ、Ｂ、および、Ｃ（以下、「変数Ａ〜Ｃ」と略記する）について、更新時点が略同時である変数Ａ〜Ｃの各々の更新後の値を、ＰＬＣ１０に一括して問い合わせる。
【００５２】
ここで、１つのタスクのみを繰り返し実行する制御装置であれば、そのタスクにおいて各々の値が更新される複数の変数の各々の更新後の値は、そのタスクの１周期の終了時点（または、開始時点）で全て読み出すことで、読み出した値の間の同期を確保できる。
【００５３】
しかしながら、制御システム２においてＰＬＣ１０による制御には厳しいリアルタイム性が要求され、ＰＬＣ１０はこの要求に応えるためにマルチタスクで処理を実行する。そして、マルチタスクで処理が実行される場合、複数の変数について、単に「各タスクの１周期の終了時点（または、開始時点）で、そのタスクにおいて更新された変数の値を読み出す」だけでは、読み出した値の間の同期は確保することができない。例えば、変数ＡおよびＢが更新されるタスクＴｐと、変数Ｃが更新されるタスクＴｓとが並行して実行される場合、「各タスクの１周期の終了時点（または、開始時点）で、そのタスクにおいて更新された変数の値を読み出す」だけでは、以下の事態が発生し得る。
【００５４】
すなわち、変数ＡおよびＢの更新後の値の読出を完了した時点（例えば、タスクＴｐの１回目の周期の終了時点）から、変数Ｃの読出を完了する時点（例えば、タスクＴｓの１回目の周期の終了時点）までの間に、タスクＴｐが１回以上実行されていることがある。
【００５５】
ＰＬＣ１０は、このような事態が発生するのを防ぎ、読み出した複数の変数の各々の更新後の値の間の同期が確保されるように、複数の変数の各々の更新後の値を読み出し、読み出した値をクライアント装置８０に出力する。
【００５６】
すなわち、ＰＬＣ１０は、複数の変数の各々の値の読出を完了する時点が全て、複数のタスクのうち周期の間隔が最も小さいタスクの周期内に含まれるようにして、それら複数の変数の各々の更新後の値を読み出す。例えば、ＰＬＣ１０は、タスクＴｐにおいて更新された変数ＡおよびＢの更新後の値の読出完了時点から、タスクＴｓにおいて更新された変数Ｃの更新後の値の読出完了時点までの間に、タスクＴｐおよびＴｓの各々が１回も実行されないように、読出を実行する。そして、ＰＬＣ１０は、読み出した「複数の変数の各々の更新後の値」を、クライアント装置８０に出力する。
【００５７】
これにより、クライアント装置８０は、「同期の確保された（つまり、更新時点が略同時である）」複数の変数の各々の更新後の値を、一括してＰＬＣ１０から取得することができる。すなわち、管理システム１において情報システム３は、制御システム２において使用される複数の変数の各々の更新後の値であって、各々の値の間の同期が確保された更新後の値を、一括して把握することができる。
【００５８】
読み出した複数の値の間で「同期」が確保されているとは、例えば、変数Ｐの更新後の値Ｐ１の読出を完了してから、変数Ｑの更新後の値Ｑ１の読出を完了するまでの間に、変数ＰおよびＱの少なくとも一方の値が更新されていないことをいう。つまり、「Ｐ１の読出を完了してから、Ｑ１の読出を完了するまでの間に、変数Ｐの値がＰ２に更新されたり、変数Ｑの値がＱ２に更新されたりしていることがない」ことを、「読み出した変数ＰおよびＱの各々の更新後の値の間の同期が確保されている」という。
【００５９】
なお、「マルチタスクで処理を実行する」とは、「複数のタスクを並行に実行する」ことをいい、具体的には、「複数のタスクを同時に並行して実行する」場合と、「時分割により複数のタスクを並行して実行する」場合とを含む。以下の説明においては、ＰＬＣ１０が「時分割により複数のタスクを並行して実行する」場合について説明する。しかしながら、「複数のタスクを同時に並行して実行する」場合においても、ＰＬＣ１０は、複数の変数の各々の更新後の値であって、各々の値の間の同期が確保された更新後の値を、一括して読み出す。
【００６０】
ＰＬＣ１０は、例えば、シングルコアを採用し、マルチタスクについて、或るタスクの実行中は他のタスクを実行しない「並行実行」を行なう場合、複数の変数の各々の更新後の値であって、各々の値の間の同期が確保された更新後の値を、一括して読み出す。また、ＰＬＣ１０は、例えば、マルチコアを採用し、マルチタスクについて、或るタスクの実行中に他のタスクを実行する「並列実行」を行なう場合、複数の変数の各々の更新後の値であって、各々の値の間の同期が確保された更新後の値を、一括して読み出す。すなわち、ＰＬＣ１０は、マルチタスクについて、並行実行を行なう場合であっても、並列実行を行なう場合であっても、複数の変数の各々の更新後の値であって、各々の値の間の同期が確保された更新後の値を、一括して読み出す。ＰＬＣ１０について、「複数のタスクを、タスクごとの周期で繰り返し並行して実行する」とは、並行実行を行なう場合と、並列実行を行なう場合と、の両方を含む。
§２．構成例
（制御システムの概要）
制御システム２は、ＰＬＣ１０と、ＰＬＣ１０とフィールドネットワーク２０を介して接続されるサーボドライバ３３および３４およびリモートＩＯターミナル３５と、フィールド機器であるデバイス３１および３２と、を含む。また、ＰＬＣ１０には、接続ケーブル５０を介して、サポート装置６０が接続される。制御システム２において、生産設備内の入力機器及び出力機器の制御を司る、１つ以上のＰＬＣ１０と、ＰＬＣ１０により動作が制御される機器とは、フィールドネットワーク２０等の制御系のネットワークに接続される。ＰＬＣ１０と機器とは、その制御系のネットワークを介してサイクリックに通信を行なうことで、ＩＮデータ及びＯＵＴデータ（以下、「ＩＯデータ」という）の送受信を行ない、生産設備を制御する。
【００６１】
ＰＬＣ１０は、制御システム２において、機械および設備などの制御対象を制御する制御装置であり、制御システム２における、フィールドネットワーク２０を介したデータ伝送を管理するマスタ装置である。ＰＬＣ１０は、主たる演算処理を実行するＣＰＵユニット１００と、電源ユニット１０１と、１つ以上のＩＯユニット（図２の例では、ＩＯユニット１０２〜１０４）と、特殊ユニット１０５と、を含む。ＣＰＵユニット１００と、ＩＯユニット１０２〜１０４の各々と、特殊ユニット１０５とは、ＰＬＣシステムバス１０６を介して、互いにデータを遣り取りできるように構成される。
【００６２】
ＣＰＵユニット１００は、制御対象の状態等に係る種々の処理を実行し、例えば、「出力データの送信と、入力データの受信と、入力データを使用して出力データを生成する制御プログラムの実行とを繰り返すことによって制御対象を制御する」処理を実行する。ＣＰＵユニット１００の詳細については、図１を参照して後述する。
【００６３】
電源ユニット１０１は、ＣＰＵユニット１００、ＩＯユニット１０２〜１０４、および、特殊ユニット１０５に、適切な電圧の電源を供給する。
【００６４】
ＩＯユニット１０２〜１０４は、各々、一般的な入出力処理に関するユニットであり、オン／オフといったデータ（つまり、２値化されたデータ）の入出力を司る。具体的には、ＩＯユニット１０２〜１０４の各々は、センサなどの入力機器であるデバイス３１が何らかの対象物を検出している状態（オン）、および、何らの対象物も検出していない状態（オフ）のいずれであるかという情報を収集する。また、ＩＯユニット１０２〜１０４の各々は、リレー、アクチュエータといった出力機器であるデバイス３２に対して、活性化するための指令（オン）、および、不活性化するための指令（オフ）のいずれかを出力する。
【００６５】
特殊ユニット１０５は、ＩＯユニット１０２〜１０４が処理するデータとは異なるデータ（例えば、アナログデータ）の入出力、温度制御、特定の通信方式による通信といった、ＩＯユニット１０２〜１０４ではサポートしない機能を有する。
【００６６】
デバイス３１および３２は、各々、ＰＬＣ１０によって制御される入出力機器である。入力機器であるデバイス３１は、例えば、温度センサ、光センサなどの「検出器」、「スイッチ（押ボタンスイッチ、リミットスイッチ、圧力スイッチなど）」などである。出力機器であるデバイス３２は、例えば、「アクチュエータ」、「リレー」、「電磁弁」、「表示器」、「表示灯」などである。
【００６７】
フィールドネットワーク２０は、ＣＰＵユニット１００とフィールド機器（サーボドライバ３３および３４、およびリモートＩＯターミナル３５）との間で遣り取りされる各種データを伝送する。フィールドネットワーク２０としては、典型的には、各種の産業用イーサネット（登録商標）を用いることができる。産業用イーサネット（登録商標）としては、たとえば、ＥｔｈｅｒＣＡＴ（登録商標）、Ｐｒｏｆｉｎｅｔ  ＩＲＴ、ＭＥＣＨＡＴＲＯＬＩＮＫ（登録商標）−ＩＩＩ、Ｐｏｗｅｒｌｉｎｋ、ＳＥＲＣＯＳ（登録商標）−ＩＩＩ、ＣＩＰ  Ｍｏｔｉｏｎなどが知られており、これらのうちのいずれを採用してもよい。さらに、産業用イーサネット（登録商標）以外のフィールドネットワークを用いてもよい。たとえば、モーション制御を行わない場合であれば、ＤｅｖｉｃｅＮｅｔ、ＣｏｍｐｏＮｅｔ／ＩＰ（登録商標）などを用いてもよい。制御システム２では、典型的に、産業用イーサネット（登録商標）であるＥｔｈｅｒＣＡＴ（登録商標）をフィールドネットワーク２０として採用する場合の構成について例示する。
【００６８】
なおＰＬＣ１０は、ＣＰＵユニット１００にＩＯユニット１０２〜１０４の各々の機能およびサーボドライバ３３および３４の機能を持たせることにより、そのような内蔵機能でまかなえる範囲については、ＣＰＵユニット１００が直接制御対象を制御してもよい。
【００６９】
サーボドライバ３３および３４の各々は、フィールドネットワーク２０を介してＣＰＵユニット１００と接続されるとともに、ＣＰＵユニット１００からの指令値に従ってサーボモータ４１および４２の各々を駆動する。
【００７０】
より具体的には、サーボドライバ３３および３４の各々は、ＰＬＣ１０から一定の時間間隔で繰り返し（つまり、周期的に）、位置指令値、速度指令値、トルク指令値といった指令値を受ける。また、サーボドライバ３３および３４の各々は、サーボモータ４１および４２の各々に接続されている各種検出器（デバイス３１）から、サーボモータ４１および４２の各々の動作に係る各種検出値（実測値）を取得する。例えば、サーボモータ４１および４２の各々の軸に接続されている位置センサ（ロータリーエンコーダ）およびトルクセンサ等の検出器から、位置、速度、トルクといったサーボモータ４１および４２の各々の動作に係る実測値を取得する。速度に係る実測値は、今回位置と前回位置との差から算出されてもよい。
【００７１】
そして、サーボドライバ３３および３４の各々は、ＣＰＵユニット１００からの指令値を目標値に設定し、実測値をフィードバック値として、フィードバック制御を行う。すなわち、サーボドライバ３３および３４の各々は、実測値が目標値に近づくようにサーボモータ４１および４２の各々を駆動するための電流を調整する。なお、サーボドライバ３３および３４の各々は、サーボモータアンプと称されることもある。
【００７２】
なお、図２には、サーボモータ４１および４２の各々とサーボドライバ３３および３４の各々とを組み合わせたシステム例を示すが、その他の構成、たとえば、パルスモータとパルスモータドライバとを組み合わせたシステムを採用することもできる。
【００７３】
リモートＩＯターミナル３５は、基本的には、ＩＯユニット１０２〜１０４と同様に、一般的な入出力処理に関する処理を行う。より具体的には、リモートＩＯターミナル３５は、フィールドネットワーク２０でのデータ伝送に係る処理を行うための通信カプラ３６と、１つ以上のＩＯユニット（図２の例では、ＩＯユニット３７および３８）とを含む。通信カプラ３６と、ＩＯユニット３７および３８の各々とは、リモートＩＯターミナルバス３９を介して、データを互いに遣り取りできるように構成される。
【００７４】
サポート装置６０は、ＰＬＣ１０に接続可能な情報処理装置である。サポート装置６０は、例えばＵＳＢ（Universal Serial Bus）ケーブルである接続ケーブル５０を介して、ＰＬＣ１０に接続され、ＰＬＣ１０との間で各種パラメータの設定、プログラミング、モニタ、デバッグなどの処理を実行する。
【００７５】
サポート装置６０で実行される各種プログラムは、ＣＤ−ＲＯＭ６１に格納されて流通してもよい。ＣＤ−ＲＯＭ６１に格納されたプログラムは、サポート装置６０のＣＤ−ＲＯＭ（Compact Disk-Read Only Memory）ドライブによって読取られ、サポート装置６０のハードディスク（ＨＤＤ）等へ格納されてもよい。あるいは、サポート装置６０は、上位のホストコンピュータ等からネットワークを通じて、サポート装置６０で実行されるプログラムをダウンロードしてもよい。
【００７６】
サポート装置６０は、例えば、パーソナルコンピュータであり、ＰＬＣ１０において実行されるユーザプログラムの作成・編集処理を実行する。また、サポート装置６０は、ユーザプログラムをＰＬＣ１０からダウンロードする処理を実行するとともに、ユーザプログラムをＰＬＣ１０にアップロードする処理を実行する。
【００７７】
ユーザは、サポート装置６０を用いて、ＰＬＣ１０（特に、ＣＰＵユニット１００）におけるプログラムの実行単位であるタスクを設定することができる。ＰＬＣ１０（特に、ＣＰＵユニット１００の制御部１３０）は、タスクを実行することにより制御対象を制御するように構成されており、タスクには、制御対象を制御するためのユーザプログラム等の実行が含まれている。ユーザプログラムは、制御対象機器を制御するための制御プログラムの一つである。ユーザは、サポート装置６０を用いて、タスクの実行周期および実行タイミング、タスクで実行するプログラム、タスクで実行する入出力のリフレッシュ、タスク間で共有する変数等（グローバル変数等）に係る各種設定を定義することができる。サポート装置６０は、ユーザにより定義された上述の各種設定を、ＰＬＣ１０に通知する（アップロードする）。
【００７８】
（情報システムの概要）
情報システム３は、ＰＬＣ１０と、クライアント装置８０と、を含んでいる。ＰＬＣ１０とクライアント装置８０とは、任意の通信ケーブル７０によって接続されており、例えば、EtherIP（登録商標）により通信接続されていてもよい。ＰＬＣ１０とクライアント装置８０とは、通信ケーブル７０を介して互いにデータを送受信することができる。例えば、両者のデータ交換は、産業向けのデータ交換に用いる通信プロトコルであるＯＰＣＵＡ（OPC Unified Architecture）に準拠して行われる。ＯＰＣＵＡは、メーカおよびプラットフォームから独立した、安全で信頼性の高い、産業用の機器間通信のプロトコルである。ＯＰＣＵＡは、従来のＯＰＣ（Object Linking and Embedding for Process Control）を、汎用化・広範囲にしたアーキテクチャである。
【００７９】
ＰＬＣ１０は、情報システム３において、ＯＰＣＵＡをサポートしており、ＯＰＣＵＡサーバ機能（ＯＰＣＵＡクライアントとの接続機能）を備えている。具体的には、ＰＬＣ１０は、ＯＰＣＵＡクライアントとしてのクライアント装置８０とＯＰＣＵＡ規格に基づいた接続を行ない、クライアント装置８０からのサービス要求（例えば、データ読み取り要求）に対し、そのサービスを実行し応答を行う。
【００８０】
クライアント装置８０は、管理システム１（情報システム３）において、ＯＰＣＵＡをサポートしており、ＯＰＣＵＡサーバとしてのＰＬＣ１０に対し、サービス要求（例えば、データ読出要求）を発行する。クライアント装置８０には、ＳＣＡＤＡ（Supervisory Control And Data Acquisition）ソフトがインストールされていてもよい。また、クライアント装置８０は、ＭＥＳ（Manufacturing Execution System、製造実行システム）を実現するための装置であってもよい。
【００８１】
ＰＬＣ１０（特に、ＣＰＵユニット１００）は、接続方式の汎用性とセキュリティリスク対応とを同時に実現したＯＰＣＵＡ通信をサポートしている。そのため、ＰＬＣ１０は、ＳＣＡＤＡ、ＭＥＳ等のＯＰＣＵＡ対応の上位システムとしてのクライアント装置８０からの製造進捗情報収集への要求に対し、セキュアに応答を出力することができる。また、ＰＬＣ１０は、クライアント装置８０からの製造指示などを、セキュアに受信することができる。一方、ＯＰＣＵＡクライアントであるクライアント装置８０は、ＯＰＣＵＡサーバとしてのＰＬＣ１０（特に、ＣＰＵユニット１００）に通信ケーブル７０を介して接続し、ＯＰＣＵＡ通信を使用して、ＣＰＵユニット１００内の変数を読み書きすることができる。
【００８２】
具体的には、クライアント装置８０は、「ＰＬＣ１０によるタスクの実行中における、複数の変数（例えば、変数Ａ〜Ｃ）の各々の値を一括して問い合わせる」要求を、例えばＯＰＣＵＡ規格に準拠した接続方式で、ＰＬＣ１０に出力する。ＰＬＣ１０は、上記の要求を受信すると、この要求において指定されている複数の変数（例えば、変数Ａ〜Ｃ）の各々の値を、制御処理の実行中に、読み出した値の間の同期が確保されるように読み出す。そして、ＰＬＣ１０は、読み出した複数の変数の各々の値を一括して、例えばＯＰＣＵＡ規格に準拠した接続方式で、クライアント装置８０に出力する。クライアント装置８０は、ＰＬＣ１０が制御処理に用いている複数の変数の各々の値を、特に、制御処理の実行により値が更新された後の複数の変数の各々の値を、一括して取得することができる。
【００８３】
これまで、図２を用いて、ＰＬＣ１０を含む管理システム１の全体概要を説明してきた。次に、図３を参照して、ＰＬＣ１０におけるＣＰＵユニット１００のハードウェア構成について説明する。
【００８４】
（ＣＰＵユニットのハードウェア構成）
図３は、本実施の形態に係るＣＰＵユニット１００のハードウェア構成の一例を示す図である。ＣＰＵユニット１００は、プロセッサ１５１と、チップセット１５２と、不揮発性メモリ１５３と、メインメモリ１５４と、クロック１５５と、上位通信コントローラ１５６と、ＰＬＣシステムバスコントローラ１５７と、フィールドバスコントローラ１５８と、ＵＳＢコネクタ１６１と、上位通信コネクタ１６２と、ＰＬＣシステムバスコネクタ１６３と、メモリカードインターフェイス１６４と、フィールドバスコネクタ１６５と、を含む。チップセット１５２と他のコンポーネントとの間は、各種のバスを介してそれぞれ結合されている。
【００８５】
プロセッサ１５１およびチップセット１５２は、典型的には、汎用的なコンピュータアーキテクチャに準じて構成される。すなわち、プロセッサ１５１は、チップセット１５２から内部クロックに従って順次供給される命令コードを解釈して実行する。
【００８６】
チップセット１５２は、接続されている各種コンポーネントとの間で内部的なデータを遣り取りするとともに、プロセッサ１５１に必要な命令コードを生成する。さらに、チップセット１５２は、プロセッサ１５１での演算処理の実行の結果得られたデータなどをキャッシュする機能を有する。
【００８７】
ＣＰＵユニット１００は、記憶手段として、メインメモリ１５４および不揮発性メモリ１５３を備えている。メインメモリ１５４は、揮発性の記憶領域（ＲＡＭ）であり、ＣＰＵユニット１００へ電源投入後にプロセッサ１５１で実行されるべき各種プログラムを保持する。また、メインメモリ１５４は、プロセッサ１５１による各種プログラムの実行時の作業用メモリとしても使用される。このようなメインメモリ１５４として、例えば、ＤＲＡＭ（Dynamic Random Access Memory）、ＳＲＡＭ（Static Random Access Memory）等を用いることができる。
【００８８】
一方、不揮発性メモリ１５３は、ＩＯ（入出力）制御などのシステムプログラム、ユーザプログラム、モーション演算プログラム、各種のアプリケーション、およびシステム設定パラメータといったデータを不揮発的に保持する。これらのプログラムおよびデータは、必要に応じて、プロセッサ１５１がアクセスできるようにメインメモリ１５４にコピーされる。このような不揮発性メモリ１５３は、フラッシュメモリのような半導体メモリを用いることができる。あるいは、ハードディスクドライブのような磁気記録媒体、ＤＶＤ−ＲＡＭ（Digital Versatile Disk Random Access Memory）のような光学記録媒体などを用いることもできる。
【００８９】
クロック１５５は、予め定められた周期のシステムクロックを発生してプロセッサ１５１に提供し、具体的には、一定の時間間隔（周期）ごとに割り込み信号を発生してプロセッサ１５１に提供する。クロック１５５は、典型的には、ハードウェアの仕様によって、複数の異なる時間間隔でそれぞれ割り込み信号を発生するように構成される。ただし、クロック１５５は、ＯＳ（Operating System）、ＢＩＯＳ（Basic Input Output System）等によって、任意の時間間隔で割り込み信号を発生するように設定することもできる。クロック１５５が発生する割り込み信号を利用して、後述するような実行周期ごとの制御動作が実現される。
【００９０】
ＣＰＵユニット１００は、通信手段として、上位通信コントローラ１５６、ＰＬＣシステムバスコントローラ１５７、および、フィールドバスコントローラ１５８を有する。上位通信コントローラ１５６、ＰＬＣシステムバスコントローラ１５７、および、フィールドバスコントローラ１５８は、各々、不図示のバッファメモリ（送受信バッファメモリ）と、通信制御回路と、ＤＭＡ（Dynamic Memory  Access）制御回路と、を含んでいる。これらの通信手段は、ＣＰＵユニット１００以外のユニットおよびＰＬＣ１０以外の装置へ出力データを送信し、また、ＣＰＵユニット１００以外のユニットおよびＰＬＣ１０以外の装置からの入力データを受信する。さらに、これらの通信手段は、メインメモリ１５４との間でデータの送受信を実行する。
【００９１】
上位通信コントローラ１５６、ＰＬＣシステムバスコントローラ１５７、および、フィールドバスコントローラ１５８の各々において、ＤＭＡ制御回路は、メインメモリ１５４から、各々のバッファメモリへの出力データの転送を行なう。また、ＤＭＡ制御回路は、各々のバッファメモリからメインメモリ１５４への入力データの転送を行う。上位通信コントローラ１５６、ＰＬＣシステムバスコントローラ１５７、および、フィールドバスコントローラ１５８の各々において、バッファメモリは、以下の２つの機能を実現する。すなわち、バッファメモリは、ＰＬＣ１０以外の装置、および、ＣＰＵユニット１００以外のユニットへ出力されるデータ（出力データ）の送信バッファとしての機能を実現する。また、バッファメモリは、ＰＬＣ１０以外の装置、および、ＣＰＵユニット１００以外のユニットから入力されるデータ（入力データ）の受信バッファとしての機能を実現する。
【００９２】
上位通信コントローラ１５６は、上位通信コネクタ１６２を介して通信ケーブル７０と接続され、例えば、ＯＰＣＵＡクライアントとしてのクライアント装置８０とＯＰＣＵＡ規格に基づいた接続を行なう。具体的には、上位通信コントローラ１５６は、クライアント装置８０からのサービス要求（例えば、データ読出要求）を受信し、そのサービスの実行結果をクライアント装置８０に送信する（クライアント装置８０に応答を行う）。
【００９３】
ＰＬＣシステムバスコントローラ１５７は、ＰＬＣシステムバスコネクタ１６３を介してＰＬＣシステムバス１０６と接続され、ＰＬＣシステムバス１０６を介したデータの遣り取りを制御する。ＰＬＣシステムバスコントローラ１５７は、例えば、ＰＬＣシステムバス１０６における物理層およびデータリンク層の機能を提供する。すなわち、ＰＬＣシステムバスコントローラ１５７は、ＰＬＣシステムバス１０６に接続されるＣＰＵユニット１００以外のユニットと、ＣＰＵユニット１００との間の送受信を制御する。
【００９４】
ＰＬＣシステムバスコントローラ１５７は、自らのバッファメモリに格納されているデータ（出力データ）を、ＩＯユニット１０２〜１０４および特殊ユニット１０５の各々に、ＰＬＣシステムバス１０６を介して送信する。また、ＰＬＣシステムバスコントローラ１５７は、ＰＬＣシステムバス１０６を介して、ＩＯユニット１０２〜１０４および特殊ユニット１０５の各々から入力されるデータ（入力データ）を受信して、自らのバッファメモリに格納する。
【００９５】
フィールドバスコントローラ１５８は、フィールドバスコネクタ１６５を介してフィールドネットワーク２０と接続され、フィールドネットワーク２０を介したデータの遣り取りを制御する。フィールドバスコントローラ１５８は、例えば、フィールドネットワーク２０における物理層およびデータリンク層の機能を提供する。すなわち、フィールドバスコントローラ１５８は、用いられるフィールドネットワーク２０の規格に従い、出力データの送信および入力データの受信を制御する。具体的には、フィールドバスコントローラ１５８は、フィールドネットワーク２０に接続されるフィールド機器との間で、自らのバッファメモリの出力データを送信し、また、入力データを受信して自らのバッファメモリに格納する。
【００９６】
ＵＳＢコネクタ１６１は、サポート装置６０とＣＰＵユニット１００とを接続するためのインターフェイスであり、接続ケーブル５０が接続される。例えば、サポート装置６０から転送される実行可能なプログラム等は、接続ケーブル５０を介して、ＣＰＵユニット１００に取込まれる。メモリカードインターフェイス１６４は、ＣＰＵユニット１００に対して着脱可能なメモリカード９０とプロセッサ１５１とを接続する。
【００９７】
これまで、図３を用いて、ＣＰＵユニット１００のハードウェア構成を説明してきた。次に、図１を参照して、ＣＰＵユニット１００を備えるＰＬＣ１０の構成および処理の内容等を、図１等を用いて説明していく。図１を参照して詳細を説明する前に、ＰＬＣ１０についての理解を容易にするため、その概要について以下のように整理しておく。
【００９８】
（制御装置の機能構成の概要について）
ＰＬＣ１０（制御装置）は、複数のタスクを、前記タスクごとの周期で繰り返し並行して実行することにより制御対象機器を制御する制御装置であって、各々の値が前記複数のタスクの少なくとも１つにおいて更新される、複数の変数について、前記タスクの実行中における各々の値を一括して問い合わせる要求を外部（例えば、クライアント装置８０）から受け付けるＯＰＣＵＡ入力部１１１（受付部）と、ＯＰＣＵＡ入力部１１１が前記要求を受け付けると、前記複数の変数の各々の値の読出を完了する時点が全て、前記複数のタスクのうち前記周期の間隔が最も小さいタスクの（例えば、タスクＴｐ）、１つの周期の開始時点から終了時点までの間に含まれるように、前記複数の変数の各々の、前記複数のタスクの少なくとも１つにおいて更新された値を読み出す読出部１１２と、読出部１１２が読み出した前記複数の変数の各々の値を外部に出力するＯＰＣＵＡ出力部１１３（出力部）と、を備えている。
【００９９】
前記の構成によれば、ＰＬＣ１０は、複数のタスクを、前記タスクごとの周期で繰り返し並行して実行することにより制御対象機器を制御する。また、ＰＬＣ１０は、前記要求を受け付けると、前記複数の変数の各々の値の読出を完了する時点が全て、前記複数のタスクのうち前記周期の間隔が最も小さいタスクの、１つの周期の開始時点から終了時点までの間に含まれるように、前記複数の変数の各々の、前記複数のタスクの少なくとも１つにおいて更新された値を読み出す。そして、ＰＬＣ１０は、読み出した前記複数の変数の各々の値を外部に出力する。
【０１００】
したがって、ＰＬＣ１０は、複数のタスクを並行して周期的に実行することができ、かつ、タスク実行中に複数の変数の各々の更新後の値を一括して問い合わせる要求を外部から受け付けると、複数の変数の各々の更新後の値であって、同期させた値を応答することができるとの効果を奏する。
【０１０１】
ここで、前記複数の変数の各々の更新後の値の読出完了時点が、２つ以上の「前記周期の間隔が最も小さいタスクの周期」（以下、「基本周期」と呼ぶ）にまたがっている場合、読み出された複数の値の間で同期が確保されない。すなわち、前記複数の変数の各々の更新後の値の読出完了時点の間の時間間隔が、前記基本周期の間隔以上である場合、読み出された複数の値の間で同期が確保されない。
【０１０２】
このことは、例えば、「前記基本周期に対応し、変数Ａの値を更新する」タスクＴｐと、「前記基本周期と異なる周期に対応し、変数Ａとは異なる変数Ｃの値を更新する」タスクＴｓと、が並行して周期的に実行される場合を想定すると、明確となる。
【０１０３】
つまり、変数Ａの更新後の値の読出完了時点と、変数Ｃの更新後の値の読出完了時点と、の間の時間間隔が、前記基本周期の間隔以上である場合、前記時間間隔において１回以上、タスクＴｐが実行されることになる。そのため、ユーザは、（１）変数Ａの値と、（２）「変数Ａの値が読み出された後、変数Ａの値を更新するタスクＴｐが１回以上実行された後の、変数Ｃの値」と、を取得することになる。したがって、読み出された変数Ａの値と変数Ｃの値との間の同期は確保されておらず、ユーザは、同期する「複数の変数の各々の更新後の値」の間の関係を把握することができない。言い換えれば、ユーザは、並行して周期的に実行されるタスクＴｐおよびＴｓの各々において略同時に更新された変数Ａおよび変数Ｃの各々の更新後の値を、把握することができない。前述の例では、ユーザが取得するのは、（１）変数Ａの値と、（２）「変数Ａの値が読み出された後、変数Ａの値を更新するタスクＴｐが１回以上実行された後の、変数Ｃの値」と、である。
【０１０４】
これに対して、ＰＬＣ１０は、前記複数の変数の各々の値の読出を完了する時点が全て、前記複数のタスクのうち前記周期の間隔が最も小さいタスクの、１つの周期内に含まれるように、前記複数の変数の各々の、前記複数のタスクの少なくとも１つにおいて更新された値を読み出し、読み出した前記複数の変数の各々の値を外部に出力する。すなわち、ＰＬＣ１０は、前記複数の変数の各々の更新後の値の読出完了時点の間の時間間隔が、前記基本周期の時間間隔よりも小さくなるように、前記複数の変数の各々の更新後の値を読み出し、読み出した前記複数の変数の各々の値を外部に出力する。
【０１０５】
上述の例に即して言えば、ＰＬＣ１０は、変数Ａの更新後の値の読出完了時点と、変数Ｃの更新後の値の読出完了時点と、の間の時間間隔が、前記基本周期の時間間隔よりも小さくなるように、変数Ａおよび変数Ｃの各々の更新後の値を読み出す。ＰＬＣ１０が変数Ａの更新後の値の読出を完了した時点から、変数Ｃの更新後の値の読出を完了した時点までの間に、タスクＴｐもタスクＴｓも実行されないように、ＰＬＣ１０は変数ＡおよびＣの各々の更新後の値を読み出す。
【０１０６】
したがって、ＰＬＣ１０により、ユーザは、並行して実行される複数のタスクの各々において略同時に更新された複数の変数の各々の更新後の値を把握することができ、つまり、同期性の確保された複数の変数の各々の更新後の値を把握することができる。言い換えれば、ＰＬＣ１０に対して、タスク実行中に複数の変数の各々の更新後の値を一括して問合せた場合、ＰＬＣ１０が応答する複数の変数の各々の更新後の値の間の同期が実現されている。
【０１０７】
上述の例に即して言えば、ＰＬＣ１０により、ユーザは、タスクＴｐにおいて更新された変数Ａの更新後の値と、変数Ａが更新された時点と略同時にタスクＴｓにおいて更新された変数Ｃの更新後の値と、を把握することができる。つまり、ＰＬＣ１０により、ユーザは、変数Ａおよび変数Ｃの各々について、「同期性が確保された、更新後の値」を把握することができる。
【０１０８】
ここで、ＰＬＣ１０の読出部１１２は、前記複数のタスクの各々の周期が揃う時点から、前記複数の変数の各々の値を全て読み出すのに要する期間として予想された予想読出期間を差し引いた時点までに、前記複数の変数の各々の値の読出を開始する。
【０１０９】
前記の構成によれば、ＰＬＣ１０は、前記複数のタスクの各々の周期が揃う時点から、前記複数の変数の各々の値を全て読み出すのに要する期間として予想された予想読出期間を差し引いた時点までに、前記複数の変数の各々の値の読出を開始する。
【０１１０】
つまり、ＰＬＣ１０は、前記複数のタスクの各々の周期が揃う時点についての情報と、前記複数の変数の各々の値を全て読み出すのに要する期間として予想された予想読出期間についての情報と、を用いて、前記複数の変数の各々の更新後の値を読み出す。言い換えれば、ＰＬＣ１０は、前記複数の変数の各々の更新後の値を読み出すために、「前記複数の変数の各々の値が、前記複数のタスクのうちのいずれのタスクにおいて更新されるか」を把握する必要が無い。
【０１１１】
したがって、ＰＬＣ１０は、「前記複数の変数の各々の値が、前記複数のタスクのうちのいずれのタスクにおいて更新されるか」を把握する場合に比べて実現の容易な処理によって、前記複数の変数の各々の更新後の値を読み出すことができるとの効果を奏する。
【０１１２】
ＰＬＣ１０は、ＯＰＣＵＡサーバ機能を備え、ＯＰＣＵＡ入力部１１１は、クライアント装置８０（ＯＰＣＵＡクライアント装置）から、ＯＰＣＵＡ規格に準拠した接続方式で前記要求を受け付け、ＯＰＣＵＡ出力部１１３は、クライアント装置８０に、前記複数の変数の各々の値をＯＰＣＵＡ規格に準拠した接続方式で出力する。
【０１１３】
前記の構成によれば、ＰＬＣ１０は、ＯＰＣＵＡサーバ機能を備え、クライアント装置８０から、ＯＰＣＵＡ規格に準拠した接続方式で前記要求を受け付け、クライアント装置８０に、前記複数の変数の各々の値をＯＰＣＵＡ規格に準拠した接続方式で出力する。
【０１１４】
したがって、ＰＬＣ１０は、メーカおよびプラットフォームから独立した、安全で信頼性の高い、産業用の機器間通信のプロトコルであるＯＰＣＵＡ規格に準拠した接続方式で前記要求を受け付け、前記複数の変数の各々の値をＯＰＣＵＡ規格に準拠した接続方式で出力することができるとの効果を奏する。
【０１１５】
ＰＬＣ１０について、前記複数のタスクは、基準のタスク（例えば、タスクＴｐ）と、基準のタスク以外のタスク（例えば、タスクＴｓ）とを含み、前記基準のタスク以外のタスクの周期は、前記基準のタスクの周期の整数倍に設定されていてもよい。
【０１１６】
前記の構成によれば、ＰＬＣ１０において、前記複数のタスクは、基準のタスクと、基準のタスク以外のタスクとを含み、前記基準のタスク以外のタスクの周期は、前記基準のタスクの周期の整数倍に設定されている。
【０１１７】
したがって、ＰＬＣ１０は、前記複数のタスクを同期させやすくすることができ、つまり、前記複数のタスクの各々の周期を揃えやすくすることができるとの効果を奏する。
【０１１８】
これまでに概要を整理してきたＰＬＣ１０について、次に、ＰＬＣ１０の構成等の詳細について、特に、ＣＰＵユニット１００の構成等の詳細について、図１等を用いて説明していく。
【０１１９】
（制御装置の機能構成の詳細）
図１は、本発明の実施形態１に係るＣＰＵユニット１００の要部構成を示すブロック図である。図１に示すように、ＣＰＵユニット１００は、機能ブロックとして、ＯＰＣＵＡサーバ部１１０、記憶部１２０、および、制御部１３０を備えている。ＣＰＵユニット１００は、制御対象機器を制御する制御処理の実行主体である。制御部１３０は、プログラムを含むタスクを実行し、特に、複数のタスク（例えば、タスクＴｐおよびＴｓ）を並行に実行し、かつ、複数のタスクの各々を、各タスクに応じた周期で、実行する。記憶部１２０は、プログラムにおいて参照および更新することが可能な変数を記憶する。ＯＰＣＵＡサーバ部１１０は、制御部１３０によりプログラムを含むタスクが実行されているときに、記憶部１２０の変数テーブル１２２に格納されている変数を収集する等、クライアント装置８０と通信し、クライアント装置８０から要求された処理を実行する。
【０１２０】
なお、記載の簡潔性を担保するため、本実施の形態に直接関係のない構成は、説明およびブロック図から省略している。ただし、実施の実情に則して、ＣＰＵユニット１００は、当該省略された構成を備えてもよい。図１に例示したＯＰＣＵＡサーバ部１１０および制御部１３０は、例えば、図３に例示したプロセッサ１５１（ＣＰＵ、central processing unit）等が、ＲＯＭ（read only memory）、ＮＶＲＡＭ（non-Volatile random access memory）等で実現された不揮発性メモリ１５３（記憶部１２０）に記憶されているプログラムを、ＲＡＭ等により実現されるメインメモリ１５４に読み出して実行することで実現できる。以下、ＣＰＵユニット１００における各機能ブロックについて説明する。
【０１２１】
（記憶部以外の機能ブロックの詳細（１）−ＯＰＣＵＡサーバ機能）
ＯＰＣＵＡサーバ部１１０は、情報システム３（特に、クライアント装置８０）と制御システム２（特に、ＰＬＣ１０）との間の通信を実現し、例えば、ＰＬＣ１０を「ＯＰＣＵＡサーバ」として動作させるＯＰＣＵＡサーバ機能を実現する。具体的には、ＯＰＣＵＡサーバ部１１０は、クライアント装置８０からのＯＰＣＵＡのサービス要求を受け取り、受け取ったサービス要求に従ってＯＰＣＵＡのサービス処理を実行し、実行結果を示す応答を、要求元のクライアント装置８０に出力する。
【０１２２】
本実施の形態において、クライアント装置８０からＰＬＣ１０に実行を要求するＯＰＣＵＡのサービス（処理）は、例えば「Ｓｕｂｓｃｒｉｐｔｉｏｎ」と呼ばれる処理である。「Ｓｕｂｓｃｒｉｐｔｉｏｎ」とは、「ＰＬＣ１０（特に、制御部１３０）が実行する制御処理に関するデータ（特に、制御処理において使用される変数の値、具体的には、制御処理において値が更新される変数の値）を、読み出す」処理である。なお、以下の説明においては、「変数の値を更新する」処理を「Ｗｒｉｔｅ」と称し、「変数の値を読み出す」処理を「Ｒｅａｄ」と称することがある。
【０１２３】
クライアント装置８０がＰＬＣ１０に実行を要求する「Ｓｕｂｓｃｒｉｐｔｉｏｎ」は、例えば「複数の変数の各々の値を一括して、読み出す（つまり、Ｒｅａｄする）」ものであってもよい。以下の説明においては、クライアント装置８０がＰＬＣ１０に実行を要求する、「変数Ａ〜Ｃの各々の値を一括して読み出す」Ｓｕｂｓｃｒｉｐｕｔｉｏｎを、「ＳｕｂＸ」と略記することがある。
【０１２４】
図１に例示するＯＰＣＵＡサーバ部１１０は、機能ブロックとして、ＯＰＣＵＡ入力部１１１、読出部１１２、ＯＰＣＵＡ出力部１１３、読出期間算出部１１４、および、読出時点決定部１１５を含んでいる。ＯＰＣＵＡサーバ部１１０のＯＰＣＵＡ入力部１１１は、本発明の「受付部」の一例であり、読出部１１２は、本発明の「読出部」の一例であり、ＯＰＣＵＡ出力部１１３は、本発明の「出力部」の一例である。
【０１２５】
クライアント装置８０とＣＰＵユニット１００との情報のやり取りはＯＰＣＵＡ入力部１１１およびＯＰＣＵＡ出力部１１３を介して行なわれる。すなわち、ＯＰＣＵＡ入力部１１１およびＯＰＣＵＡ出力部１１３は、ＯＰＣＵＡクライアント機能を有するクライアント装置８０とＯＰＣＵＡ規格に基づいて接続して通信を行なう機能ブロックである。
【０１２６】
ＯＰＣＵＡ入力部１１１は、通信ケーブル７０を経由してクライアント装置８０から所定の処理の実行要求を受け取り、受け取った実行要求に対応する所定の処理の実行を読出部１１２に指示する。ＯＰＣＵＡ入力部１１１は、例えば、クライアント装置８０からのＯＰＣＵＡのサービス要求（ＯＰＣＵＡの要求メッセージ）を受け取り、受け取ったサービス要求に対応する処理の実行を読出部１１２に指示する。本実施の形態において、ＯＰＣＵＡのサービス要求は、例えば、ＰＬＣ１０（特に、ＣＰＵユニット１００）の制御処理の実行時に使用される変数（特に、制御機能の実行時に値が更新される変数）に対する読出等のシステム内データへのアクセスを伴う要求である。具体的には、ＯＰＣＵＡ入力部１１１は、クライアント装置８０から、ＳｕｂＸの実行要求（要求メッセージ）を、つまり、「変数Ａ〜Ｃの各々の値を一括して読み出す（Ｒｅａｄする）」処理の実行要求を受け付ける。
【０１２７】
ＯＰＣＵＡ出力部１１３は、ＯＰＣＵＡ入力部１１１がクライアント装置８０から受け取った所定の処理の実行要求（サービス要求）に対応する処理の実行結果を、その実行要求への応答として、通信ケーブル７０を経由してクライアント装置８０に送信する。具体的には、ＯＰＣＵＡ出力部１１３は、ＯＰＣＵＡ入力部１１１が読出部１１２に指示した処理の実行結果を読出部１１２から取得し、取得した実行結果をクライアント装置８０に送信する。ＯＰＣＵＡ出力部１１３は、読出部１１２から取得した実行結果を、例えばＯＰＣＵＡ規格に準拠した接続方式で、クライアント装置８０に送信する。
【０１２８】
ＯＰＣＵＡ入力部１１１がクライアント装置８０からＳｕｂＸの要求メッセージを受け付けると、ＯＰＣＵＡ出力部１１３は、ＳｕｂＸの実行結果をクライアント装置８０に送信する。すなわち、ＯＰＣＵＡ出力部１１３は、読出部１１２が読み出した「制御部１３０による制御処理の実行中における、変数Ａ〜Ｃの各々の値」を、一括してクライアント装置８０に送信する。
【０１２９】
読出部１１２、読出期間算出部１１４、および、読出時点決定部１１５は、ＯＰＣＵＡ入力部１１１がクライアント装置８０から受け取った「所定の処理の実行要求」に対応する処理を実行し、例えばＯＰＣＵＡのサービス処理（ここでは、ＳｕｂＸ）を実行する。すなわち、読出部１１２、読出期間算出部１１４、および、読出時点決定部１１５によって、「制御部１３０による制御処理の実行中における、変数Ａ〜Ｃの各々の値」の読出（Ｒｅａｄ）が実行される。
【０１３０】
読出部１１２は、変数の値の読み出しに係るＯＰＣＵＡサービスの実行手段であり、読出時点決定部１１５から通知された読出時点で、各タスクにおいて値が更新される変数の値（特に、更新後の値）を収集し、つまり、変数の値を読み出す。特に、読出部１１２は、制御部１３０（特に、演算部１３１）によりタスクが実行されているときに、読出時点決定部１１５から通知された読出時点で、各タスクにおいて値が更新された変数の値を読み出し、つまり、Ｒｅａｄする。具体的には、読出部１１２は、読出時点決定部１１５から指示された読出時点で記憶部１２０の変数テーブル１２２を参照して、変数Ａ〜Ｃの各々の値を読み出す。言い換えれば、読出部１１２は、読出時点決定部１１５から指示された読出時点で、記憶部１２０の変数テーブル１２２を参照し、変数Ａ〜Ｃの各々の値の読出処理を開始する。
【０１３１】
読出期間算出部１１４は、「読出部１１２が変数テーブル１２２を参照して所望の変数（例えば、変数Ａ〜Ｃ）の値の読出処理を実行する」のに要する時間（期間）である予想読出期間を算出する。読出期間算出部１１４は、例えば、読出部１１２が値を読み出す各変数のデータ型（具体的には、Ｂｙｔｅ、Ｉｎｔ、Ｌｏｎｇ等）に基づいて、予想読出期間を算出してもよい。また、読出期間算出部１１４は、例えば、読出部１１２が値を読み出す変数の数（具体的には、読出部１１２が値を読み出す変数が変数Ａ〜Ｃであれば、「３」）に基づいて、予想読出期間を算出してもよい。さらに、読出期間算出部１１４は、例えば、読出部１１２が値を読み出す各変数のデータ型と、読出部１１２が値を読み出す変数の数と、に基づいて、予想読出期間を算出してもよい。
【０１３２】
例えば、読出期間算出部１１４は、「読出部１１２が変数テーブル１２２を参照して変数Ａ〜Ｃの各々の値を読み出すのに要する時間Ｙａ、Ｙｂ、およびＹｃ」の和を、読出部１１２がＳｕｂＸの実行に要する時間として算出する。「読出部１１２がＳｕｂＸの実行に要する時間」を「予想読出期間Ｙ」μｓ（「μｓ」は単位）とすると、読出期間算出部１１４は、「予想読出期間Ｙ＝Ｙａ＋Ｙｂ＋Ｙｃ」として、予想読出期間Ｙを算出する。読出期間算出部１１４は、算出した予想読出期間Ｙμｓを、読出時点決定部１１５に通知する。
【０１３３】
読出時点決定部１１５は、読出部１１２が実行する読出処理の開始時点である読出時点を決定し、決定した読出時点を読出部１１２に通知する。読出時点決定部１１５は、制御部１３０による制御処理の実行中において、以下の条件が満たされるように、読出部１１２が実行する読出処理の開始時点である読出時点を決定する。
【０１３４】
すなわち、読出時点決定部１１５は、読出処理の対象である複数の変数の内の或る１つの変数Ｐの値の読出完了時点から、変数Ｐとは異なる変数Ｑの値の読出完了時点までに、変数ＰまたはＱの値が更新されないように、変数ＰおよびＱの各々の読出時点を決定する。言い換えれば、読出時点決定部１１５は、変数Ｐの値の読出完了時点から、変数Ｑの値の読出完了時点までに、変数ＰまたはＱの値を更新するタスク（特に、プログラム）が実行されないように、変数ＰおよびＱの各々の読出時点を決定する。
【０１３５】
具体的には、制御部１３０が複数のタスクを、タスクごとの周期で繰り返し並行して実行する場合、読出時点決定部１１５は、以下のように、変数ＰおよびＱの各々の読出時点を決定する。すなわち、変数Ｐの値の読出完了時点から、変数Ｑの値の読出完了時点までの時間間隔が、それら複数のタスクのうち周期の間隔が最も小さいタスクの周期（上述までの例では「１ｍｓ」）よりも小さくなるように、変数ＰおよびＱの各々の読出時点を決定する。
【０１３６】
特に、制御部１３０が、時分割により複数のタスクを、タスクごとの周期で繰り返し並行して実行する場合、読出時点決定部１１５は、以下のように、変数ＰおよびＱの各々の読出時点を決定する。すなわち、変数Ｐの値の読出完了時点から、変数Ｑの値の読出完了時点までの時間間隔が、それら複数のタスクのうち優先度が最も高いタスクの周期（上述までの例では「１ｍｓ」）よりも小さくなるように、変数ＰおよびＱの各々の読出時点を決定する。
【０１３７】
具体的には、読出時点決定部１１５は、読出部１１２が実行するＳｕｂＸ（「制御部１３０による制御処理の実行中における、変数Ａ〜Ｃの各々の値」の読出（Ｒｅａｄ））について、その実行開始時点である読出時点を、以下のように決定する。すなわち、読出時点決定部１１５は、読出部１１２が変数Ａ〜Ｃの各々の値の読出を完了する時点が全て、タスクＴｐの１つの周期の開始時点から終了時点までの間に含まれるように、読出時点を決定する。つまり、読出時点決定部１１５は、変数Ａ〜Ｃの値の読出完了時点が全て、制御部１３０により実行される複数のタスクのうち周期の間隔が最も小さいタスクであるタスクＴｐの１つの周期の開始時点から終了時点までの間に含まれるように、読出時点を決定する。
【０１３８】
ここで特に、読出時点決定部１１５は、読出期間算出部１１４から通知された予想読出期間Ｙμｓを用いて、読出時点を決定する。具体的には、読出時点決定部１１５は、制御部１３０により実行される複数のタスクの各々の周期が揃う時点から、変数Ａ〜Ｃの各々の値を全て読み出すのに要する期間として予想された予想読出期間Ｙμｓを差し引いた時点を、読出時点に決定する。例えば、読出時点決定部１１５は、タスクＴｐおよびＴｓの各々の周期が揃う時点である「ｔ＝２ｍｓ」から、予想読出期間Ｙμｓを差し引いた時点を、読出時点に決定する。詳細は図４を用いて後述するが、「制御部１３０により実行される複数のタスクの各々の周期が揃う時点から、予想読出期間Ｙμｓを差し引いた時点」で読出部１１２が変数Ａ〜Ｃの各々の値を読み出すことにより、読み出された値の間の同期が保証される。
【０１３９】
（記憶部以外の機能ブロックの詳細（２）−制御機能）
制御部１３０は、機械および設備などの制御対象を制御する制御処理の実行主体であり、出力データの送信と、入力データの受信と、入力データを使用して出力データを生成する制御プログラムの実行とを繰り返すことによって制御対象を制御する。制御部１３０は、「入力データを使用して出力データを生成する制御プログラムを実行する演算部１３１」と、「出力データの送信と、入力データの受信と、を実行するフィールド通信部１３２」と、を含む。制御部１３０は、ＯＰＣＵＡサーバ機能を備えていない従来までのＣＰＵユニット（ＰＬＣ）の制御部（機械および設備などの制御対象を制御する制御処理の実行主体）と同様である。
【０１４０】
演算部１３１は、フィールド通信部１３２の取得した入力データを使用して制御プログラム等の各種プログラムを実行して出力データを生成し、生成した出力データをフィールド通信部１３２に出力する。演算部１３１は、「各種プログラムの実行」として、具体的には、複数のタスクを並行に実行するとともに、各タスクを各タスクに応じた周期で実行する。演算部１３１は、例えば、時分割により複数のタスクを並行して実行するとともに、各タスクを各タスクに応じた周期で実行する。すなわち、演算部１３１は、マルチタスクで処理を実行する。なお、タスクには、各タスクに応じたユーザプログラム等の制御プログラムの実行が含まれている。
【０１４１】
演算部１３１は、例えば、時分割によりタスクＴｐおよびＴｓを並行に実行する。また、演算部１３１は、タスクＴｐを１ｍｓの周期で実行し、タスクＴｓを２ｍｓの周期で実行する。さらに、演算部１３１は、タスクＴｐおよびＴｓのいずれとも異なるタスクＴｔを４ｍｓの周期で実行してもよい。
【０１４２】
なお、演算部１３１が実行するタスクには、定期的に繰り返し実行されるタスク（周期的に実行されるタスク、具体的には、タスクＴｐおよびＴｓ）に加えて、予め設定された実行条件が成立した場合に実行されるタスクが含まれてもよい。予め設定された実行条件が成立した場合に実行されるタスクは、例えば「イベントタスク」と呼ばれ、具体的には、タスクＴｅがイベントタスクであってもよい。
【０１４３】
フィールド通信部１３２は、ＰＬＣシステムバス１０６およびフィールドネットワーク２０の少なくとも一方を介して、各種のフィールド機器（例えば、デバイス３１、デバイス３２、サーボドライバ３３、およびサーボドライバ３４等）との間でデータを遣り取りする。これらのフィールド機器は、制御対象に対して何らかの処理を行うためのアクチュエータ、制御対象から各種情報を取得するためのセンサなどを含む。
【０１４４】
フィールド通信部１３２は、例えば、入力機器であるデバイス３１から入力データを取得し、出力機器であるデバイス３２、サーボドライバ３３、およびサーボドライバ３４等に出力データを出力する。
【０１４５】
（記憶部の詳細）
記憶部１２０は、ＣＰＵユニット１００が使用する各種データを格納する記憶装置である。記憶部１２０は、ＣＰＵユニット１００が実行する（１）制御プログラム、（２）ＯＳプログラム、（３）ＣＰＵユニット１００が有する各種機能を実行するためのアプリケーションプログラム、および、（４）該アプリケーションプログラムを実行するときに読み出す各種データを非一時的に記憶してもよい。記憶部１２０はさらに、プログラムテーブル１２１、変数テーブル１２２、およびタスクテーブル１２３を格納している。
【０１４６】
プログラムテーブル１２１は、制御部１３０（特に、演算部１３１）によって実行される各種プログラムである。なお、ＯＰＣＵＡサーバ部１１０によって実行されるプログラムは、プログラムテーブル１２１とは別に、例えばアプリケーションプログラム（ＯＰＣＵＡサーバ機能を実現するアプリケーションプログラム）として、記憶部１２０に格納されていてもよい。
【０１４７】
制御部１３０（特に、演算部１３１）によって実行される各種プログラムであるプログラムテーブル１２１は、リアルタイムＯＳと、システムプログラムと、ユーザプログラムとの３階層になっていてもよい。
【０１４８】
リアルタイムＯＳは、ＣＰＵユニット１００のコンピュータアーキテクチャに応じて設計されており、プロセッサ１５１がシステムプログラムおよびユーザプログラムを実行するための基本的な実行環境を提供する。このリアルタイムＯＳは、典型的には、ＰＬＣのメーカあるいは専門のソフトウェア会社などによって提供される。
【０１４９】
システムプログラムは、ＰＬＣ１０（特に、ＣＰＵユニット１００）としての機能を提供するためのソフトウェア群である。具体的には、システムプログラムは、スケジューラプログラムと、出力処理プログラムと、入力処理プログラムと、シーケンス命令演算プログラムと、モーション演算プログラムと、その他のシステムプログラムとを含む。出力処理プログラムは、ＣＰＵユニット１００による演算結果を出力ユニットとしてのＩＯユニット１０２〜１０４に出力する処理を実行するためのプログラムを含む。入力処理プログラムは、入力ユニットとしてのＩＯユニット１０２〜１０４に入力された信号をＣＰＵユニット１００に取り込む処理を実行するためのプログラムを含む。なお、一般には出力処理プログラムおよび入力処理プログラムは、連続的（一体として）に実行されるので、出力処理プログラムおよび入力処理プログラムは、ＩＯ処理プログラムと総称してもよい。
【０１５０】
ユーザプログラムは、ユーザにおける制御目的に応じて作成され、言い換えれば、制御システム２を用いて制御する対象のライン（プロセス）などに応じて、任意に設計されるプログラムである。ユーザプログラムは、ＣＰＵユニット１００に接続されるサポート装置６０により編集可能に構成されており、例えば、ラダー言語、ＳＦＣ言語、ストラクチャードテキスト等で記述され、複数の言語が混在していてもよい。
【０１５１】
ユーザプログラムは、シーケンス命令演算プログラムおよびモーション演算プログラムと協働して、ユーザにおける制御目的を実現する。すなわち、ユーザプログラムは、シーケンス命令演算プログラムおよびモーション演算プログラムによって提供される命令、関数、機能モジュールなどを利用することで、プログラムされた動作を実現する。そのため、ユーザプログラム、シーケンス命令演算プログラム、およびモーション演算プログラムは、制御プログラムと総称する場合もある。
【０１５２】
変数テーブル１２２は、プログラム（特に、ユーザプログラム等の制御プログラム）によって使用される変数であり、つまり、変数テーブル１２２における各変数の値は、ユーザプログラム等の制御プログラムの実行に際して更新される（つまり、Ｗｒｉｔｅされる）。
【０１５３】
タスクテーブル１２３は、タスクに関する情報であり、例えば、各タスクの名称と、各タスクの優先度と、各タスクが実行される周期（制御サイクル）と、各タスクで実行されるユーザプログラム等のプログラムの構成と、が含まれている。また、ＣＰＵユニット１００では、予め設定された時間間隔（たとえば、１ｍｓ）の制御サイクルを処理全体の共通サイクルとして採用していてもよい。この共通サイクルは「基準の周期」と称されることがあり、制御サイクル（つまり周期）が「基準の周期」であるタスクは「基準のタスク」と称されることがある。
【０１５４】
ＰＬＣ１０（ＣＰＵユニット１００）の演算部１３１は、プログラムテーブル１２１における種々のプログラムを「タスク」という実行単位で実行する。すなわち、ＰＬＣ１０において、ユーザプログラム等の制御プログラムは、タスク毎に割り当てられて実行される。例えば、ユーザプログラムの全体は、複数のユーザプログラムから構成され、各ユーザプログラムは、複数のタスクの各々に割り当てられる。また、ＰＬＣ１０において、タスクは、周期的に実行される周期実行型タスクと、何らかのイベントが発生したときに実行されるイベント実行型タスクとに大別される。
【０１５５】
演算部１３１が「タスク」において実行可能な処理・プログラムであるプログラムテーブル１２１は、前述の通り、「ＩＯ処理プログラム」、「制御プログラム」、および、「それ以外の処理・プログラム」を含む。
【０１５６】
ユーザは、サポート装置６０を用いて、プログラムの実行単位であるタスクを設定することができる。具体的には、タスクの実行周期および実行タイミング、タスクで実行するプログラム（例えば、制御プログラム）、タスク内でのＩＯ制御の実行要否等を設定・定義することができる。ユーザは、サポート装置６０を用いて、１タスクあたり、例えば最大１２８のプログラムを割り当てることができてもよい。タスクの設定は、サポート装置６０から例えば接続ケーブル５０を介してＣＰＵユニット１００へ転送され、不揮発性メモリ１５３などにより実現された記憶部１２０の、タスクテーブル１２３に格納される。
【０１５７】
ここで、ユーザは、サポート装置６０を用いて、複数のタスクの間に優先順位を設定することができる。具体的には、ユーザは、サポート装置６０を用いて、優先順位が互いに異なる「プライマリ定周期タスクであるタスクＴｐ」と、「定周期タスクであるタスクＴｓ」と、「イベントタスクであるタスクＴｅ」という３種類のタスクを設定できてもよい。タスク処理について、優先度が高いタスクのユーザプログラムと、そのタスクより優先度が低いタスクのユーザプログラムとを同時期に実行した場合の重なった時間において、ＰＬＣ１０の演算部１３１は以下の処理を実行してもよい。すなわち、演算部１３１は、優先度の低いタスクに割り当てられているプログラムの実行を中断し、優先度の高いタスクに割り当てられているプログラムを実行する割込制御を行なってもよい。
【０１５８】
プライマリ定周期タスクと、定周期タスクとは共に周期実行型タスクであり、プライマリ定周期タスクの優先度は、定周期タスクの優先度よりも高い。言い換えれば、プライマリ定周期タスクの優先度の値は、定周期タスクの優先度の値よりも小さい。なお、演算部１３１は、複数のタスクのうち、優先度の値が小さいタスクを優先的に実行してもよい。
【０１５９】
タスクＴｐは、例えば、「ＩＯ制御、ユーザプログラム、モーション演算プログラム（、および、システムサービス）」を主な処理内容（実行内容）としてもよい。タスクＴｓは、例えば、「ＩＯ制御、ユーザプログラム（、および、システムサービス）」を主な処理内容としてもよい。タスクＴｅは、例えば、「ユーザプログラム（、および、システムサービス）」を主な処理内容としてもよい。ＰＬＣ１０の演算部１３１は、タスクＴｐを最優先で実行し、タスクＴｓとタスクＴｅとの間の優先関係はユーザが指定できてもよい。さらに、周期的に実行される周期実行型タスクは、タスクＴｐおよびタスクＴｓの２つに限られるわけではない。３つ以上の周期実行型タスク（例えば、タスクＴｐ、Ｔｓ、および、Ｔｔ）の間に実行順位に係る優先度が設定されてもよく、各周期実行型タスクについて周期（実行周期）が設定されてもよい。      
【０１６０】
これまでに構成を説明してきたＰＬＣ１０（特に、ＣＰＵユニット１００）について、次にその処理（動作）の概要を、図４を用いて説明していく。
§３．動作例
（制御装置が実行する処理の概要）
図４は、ＰＬＣ１０（特に、ＣＰＵユニット１００）が実行する処理の概要を示す図である。図４を参照しながら、ＰＬＣ１０の実行するマルチタスク処理について、先ず説明する。
【０１６１】
（マルチタスクについて）
ＣＰＵユニット１００（特に、演算部１３１）は、時分割により複数のタスク（図４に示す例では、タスクＴｐおよびＴｓ）を並行して、各タスクの周期で繰り返し、実行する。すなわち、ＣＰＵユニット１００は、マルチタスクで処理を実行し、ＣＰＵユニット１００が実行する各タスクの周期は異なる。
【０１６２】
図４の例では、タスクＴｐは、タスクＴｓよりも優先的に実行されるとともに、例えば１ｍｓの周期で実行される。すなわち、タスクＴｐは、１回分の制御サイクル（１ｍｓの時間間隔）を実行サイクルとしている。また、タスクＴｐは、ユーザプログラム等のプログラムＰｐを含んでおり、つまり、ユーザプログラム等のプログラムＰｐがタスクＴｐに割り当てられている。なお、タスクＴｐは、本発明の「基準のタスク」の一例である。
【０１６３】
また、タスクＴｓは、タスクＴｐよりも劣後して実行されるとともに、例えば２ｍｓの周期で実行され、すなわち、２回分の制御サイクル（２ｍｓの時間間隔）を実行サイクルとしている。また、タスクＴｓの周期は、タスクＴｐの周期の整数倍（例えば、２倍）に設定されている。また、タスクＴｓは、ユーザプログラム等のプログラムＰｓを含んでおり、つまり、ユーザプログラム等のプログラムＰｓがタスクＴｓに割り当てられている。なお、タスクＴｓは、本発明の「基準のタスク以外のタスク」の一例である。
【０１６４】
さらに、ＣＰＵユニット１００（特に、演算部１３１）は、タスクＴｐおよびＴｓよりも劣後するタスクＴｔを、４ｍｓの周期で実行してもよい。すなわち、ＣＰＵユニット１００は、タスクＴｔを、４回分の制御サイクル（４ｍｓの時間間隔）を実行サイクルとして、実行してもよい。ここで、タスクＴｔの周期は、タスクＴｐの周期の整数倍（例えば、４倍）に設定されていてもよい。また、タスクＴｔは、プログラム（ユーザプログラム等）を含んでいてもよい。なお、タスクＴｔは、本発明の「基準のタスク以外のタスク」の一例である。
【０１６５】
ここで、タスクＴｓおよびＴｔの周期を、タスクＴｐの周期の整数倍にすることによって、タスクＴｐ、ＴｓおよびＴｔを同期させやすくすることができる。「タスクＴｐ、ＴｓおよびＴｔが同期する」とは、「タスクＴｐ、ＴｓおよびＴｔの周期（実行サイクル）が同時に開始される（開始時点が同じになる）」こと、または「タスクＴｐ、ＴｓおよびＴｔの周期が同時に終了する（終了時点が同じになる）」ことをいう。
【０１６６】
（図中の表現について）
図４において、一点鎖線で示されているのは、プライマリ定周期タスクであるタスクＴｐの周期であり、特に、タスクＴｐの周期の開始時点であり、終了時点である。また、二点鎖線で示されているのは定周期タスクであるタスクＴｓの周期であり、特に、タスクＴｓの周期の開始時点であり、終了時点である。図４において、縦縞で示している領域は、プライマリ定周期タスクであるタスクＴｐにおいて実行されるプログラムＰｐが、つまり、タスクＴｐに割り当てられているプログラムＰｐが、実行されている期間を示している。また、横縞で示している領域は、定周期タスクであるタスクＴｓにおいて実行されるプログラムＰｓが、つまり、タスクＴｓに割り当てられているプログラムＰｓが、実行されている期間を示している。さらに、互いに交差する２つ以上の斜線で示している領域は、「変数Ａ〜ＣをまとめてＲｅａｄする（Ｓｕｂｓｃｒｉｐｔｉｏｎ：ＳｕｂＸ）」が実行される期間を示している。
【０１６７】
図４に示す例では、タスクＴｐは１ｍｓの周期で実行され、タスクＴｓは２ｍｓの周期で実行される。図４においては、制御部１３０（特に、演算部１３１）による制御処理の開始時点（ｔ＝０）から、タスクＴｐの１回目の周期（開始時点：ｔ＝０から、終了時点：ｔ＝１ｍｓまでの間）に実行されるプログラムＰｐを特に「プログラムＰｐ１」と表現している。同様に、タスクＴｐの２回目の周期（開始時点：ｔ＝１ｍｓから、終了時点：ｔ＝２ｍｓまでの間）に実行されるプログラムＰｐを「プログラムＰｐ２」と、３回目の周期に実行されるプログラムＰｐを「プログラムＰｐ３」と表現している。すなわち、「ｎ」を自然数として、タスクＴｐのｎ回目の周期（開始時点：ｔ＝「ｎ−１」ｍｓから、終了時点：ｔ＝「ｎ」ｍｓまでの間）に実行されるプログラムＰｐを「プログラムＰｐｎ」と表現している。
【０１６８】
また、制御部１３０による制御処理の開始時点（ｔ＝０）から、タスクＴｓの１回目の周期（開始時点：ｔ＝０から、終了時点：ｔ＝２ｍｓまでの間）に実行されるプログラムＰｓを特に「プログラムＰｓ１」と表現している。同様に、タスクＴｓの２回目の周期（開始時点：ｔ＝２ｍｓから、終了時点：ｔ＝４ｍｓまでの間）に実行されるプログラムＰｓを「プログラムＰｓ２」と、３回目の周期に実行されるプログラムＰｓを「プログラムＰｓ３」と表現している。すなわち、「ｎ」を自然数として、タスクＴｓのｎ回目の周期（開始時点：ｔ＝「２×（ｎ−１）」ｍｓから、終了時点：ｔ＝「２×ｎ」ｍｓまでの間）に実行されるプログラムＰｓを「プログラムＰｓｎ」と表現している。
【０１６９】
（変数の読出処理の概要について）
以下、図４に示した管理システム１において実行される処理の概要について説明する。
【０１７０】
第１に、クライアント装置８０は、「変数Ａ〜ＣをまとめてＲｅａｄする（Ｓｕｂｓｃｒｉｐｔｉｏｎ：ＳｕｂＸ）」とのサービス要求をＰＬＣ１０に出力する。ＰＬＣ１０は、クライアント装置８０からのこのサービス要求（ＳｕｂＸ）を受け付ける（Ｓｔｅｐ１）。
【０１７１】
第２に、ＰＬＣ１０のＯＰＣＵＡ入力部１１１がサービス要求：ＳｕｂＸを受信すると、ＰＬＣ１０の読出期間算出部１１４は、ＳｕｂＸの実行時間、つまり、「変数Ａ〜Ｃの読出に要する時間」である読出期間（Ｐｒｏｃ：Ｙμｓ）を算出する（Ｓｔｅｐ２）。
【０１７２】
読出時点決定部１１５は、読出期間算出部１１４から通知された予想読出期間Ｙμｓを用いて、読出時点を決定する。すなわち、ＰＬＣ１０の読出時点決定部１１５は、「タスクＴｐおよびＴｓの周期が揃うタイミング（時点）から、予想読出期間Ｙμｓ前の時点」を、読出時点に決定する。
【０１７３】
図４に示す例では、タスクＴｐは１ｍｓの周期で実行され、タスクＴｓは２ｍｓの周期で実行されるため、「制御部１３０の制御処理の実行中に、『タスクＴｐおよびＴｓの周期が揃う時点』」は、例えば、「ｔ＝２ｍｓ、４ｍｓ、６ｍｓ、・・・」である。つまり、図４に示す例では、制御部１３０により実行されている複数のタスクの実行サイクル（周期）が揃う時点（複数のタスクが同期する時点）は、例えば、「ｔ＝２ｍｓ、４ｍｓ、６ｍｓ、・・・」である。
【０１７４】
したがって、図４に示す例で、読出時点決定部１１５は、「ｔ＝２ｍｓから、予想読出期間Ｙμｓ前の時点」、つまり「２ｍｓからＹμｓを差し引いた時点（ｔ＝２ｍｓ−Ｙμｓである時点）」を、読出時点に決定する。読出時点決定部１１５は、決定した読出時点を読出部１１２に指示する。
【０１７５】
第３に、読出部１１２は、読出時点決定部１１５から指示された読出時点、つまり、「ｔ＝２ｍｓから、予想読出期間Ｙμｓ前の時点」で、記憶部１２０の変数テーブル１２２を参照して、変数Ａ〜Ｃの各々の値を読み出す（Ｒｅａｄする）。すなわち、ＰＬＣ１０のＯＰＣＵＡサーバ部１１０は、複数のタスクの周期が揃うタイミングからＹμｓ前に割込みを入れ、ＳｕｂＸを実行する（Ｓｔｅｐ３）。
【０１７６】
第４に、ＰＬＣ１０のＯＰＣＵＡ出力部１１３は、読出部１１２が読み出した「変数Ａ〜Ｃの各々の値」を一括してクライアント装置８０に送信する。すなわち、ＰＬＣ１０のＯＰＣＵＡサーバ部１１０は、ＳｕｂＸの実行結果（Ｒｅａｄ結果）を、クライアント装置８０に返す（Ｓｔｅｐ４）。
【０１７７】
以上に概要を説明してきたＰＬＣ１０の実行する処理は、次のように整理することができる。すなわち、ＰＬＣ１０の実行する制御方法は、複数のタスクを、前記タスクごとの周期で繰り返し並行して実行することにより制御対象機器を制御する制御装置の制御方法であって、各々の値が前記複数のタスクの少なくとも１つにおいて更新される、複数の変数について、前記タスクの実行中における各々の値を一括して問い合わせる要求を外部から受け付ける受付ステップ（Ｓｔｅｐ１）と、前記受付ステップにて前記要求が受け付けられると、前記複数の変数の各々の値の読出を完了する時点が全て、前記複数のタスクのうち前記周期の間隔が最も小さいタスクの、１つの周期の開始時点から終了時点までの間に含まれるように、前記複数の変数の各々の、前記複数のタスクの少なくとも１つにおいて更新された値を読み出す読出ステップ（Ｓｔｅｐ３）と、前記読出ステップにて読み出された前記複数の変数の各々の値を外部に出力する出力ステップ（Ｓｔｅｐ４）と、を含んでいる。
【０１７８】
前記の方法によれば、前記制御方法は、複数のタスクを、前記タスクごとの周期で繰り返し並行して実行することにより制御対象機器を制御する。また、前記制御方法は、前記要求を受け付けると、前記複数の変数の各々の値の読出を完了する時点が全て、前記複数のタスクのうち前記周期の間隔が最も小さいタスクの、１つの周期の開始時点から終了時点までの間に含まれるように、前記複数の変数の各々の、前記複数のタスクの少なくとも１つにおいて更新された値を読み出し、読み出した前記複数の変数の各々の値を外部に出力する。
【０１７９】
したがって、前記制御方法は、複数のタスクを並行して周期的に実行することができ、かつ、タスク実行中に複数の変数の各々の更新後の値を一括して問い合わせる要求を外部から受け付けると、複数の変数の各々の更新後の値であって、同期させた値を応答することができるとの効果を奏する。
【０１８０】
ここで、前記複数の変数の各々の更新後の値の読出完了時点が、２つ以上の基本周期にまたがっている場合、読み出された複数の値の間で同期が確保されない。すなわち、前記複数の変数の各々の更新後の値の読出完了時点の間の時間間隔が、前記基本周期の間隔以上である場合、読み出された複数の値の間で同期が確保されない。
【０１８１】
このことは、例えば、「前記基本周期に対応し、変数Ａの値を更新する」タスクＴｐと、「前記基本周期と異なる周期に対応し、変数Ａとは異なる変数Ｃの値を更新する」タスクＴｓと、が並行して周期的に実行される場合を想定すると、明確となる。
【０１８２】
つまり、変数Ａの更新後の値の読出完了時点と、変数Ｃの更新後の値の読出完了時点と、の間の時間間隔が、前記基本周期の間隔以上である場合、前記時間間隔において１回以上、タスクＴｐが実行されることになる。そのため、ユーザは、変数Ａの値と、「変数Ａの値が読み出された後、変数Ａの値を更新するタスクＴｐが１回以上実行された後の、変数Ｃの値」と、を取得することになる。したがって、読み出された変数Ａの値と変数Ｃの値との間の同期は確保されておらず、ユーザは、同期する「複数の変数の各々の更新後の値」の間の関係を把握することができない。言い換えれば、ユーザは、並行して周期的に実行されるタスクＴｐおよびＴｓの各々において略同時に更新された変数Ａおよび変数Ｃの各々の更新後の値を、把握することができない。前述の例では、ユーザが取得するのは、変数Ａの値と、「変数Ａの値が読み出された後、変数Ａの値を更新するタスクＴｐが１回以上実行された後の、変数Ｃの値」と、である。
【０１８３】
これに対して、前記制御方法は、前記複数の変数の各々の値の読出を完了する時点が全て、前記複数のタスクのうち前記周期の間隔が最も小さいタスクの、１つの周期内に含まれるように、前記複数の変数の各々の、前記複数のタスクの少なくとも１つにおいて更新された値を読み出し、読み出した前記複数の変数の各々の値を外部に出力する。すなわち、前記制御方法は、前記複数の変数の各々の更新後の値の読出完了時点の間の時間間隔が、前記基本周期の時間間隔よりも小さくなるように、前記複数の変数の各々の更新後の値を読み出し、読み出した前記複数の変数の各々の値を外部に出力する。
【０１８４】
上述の例に即して言えば、前記制御方法は、変数Ａの更新後の値の読出完了時点と、変数Ｃの更新後の値の読出完了時点と、の間の時間間隔が、前記基本周期の時間間隔よりも小さくなるように、変数Ａおよび変数Ｃの各々の更新後の値を読み出す。前記制御方法が変数Ａの更新後の値の読出を完了した時点から、変数Ｃの更新後の値の読出を完了した時点までの間に、タスクＴｐもタスクＴｓも実行されないように、前記制御方法は変数ＡおよびＣの各々の更新後の値を読み出す。
【０１８５】
したがって、前記制御方法により、ユーザは、並行して実行される複数のタスクの各々において略同時に更新された複数の変数の各々の更新後の値を把握することができ、つまり、同期性の確保された複数の変数の各々の更新後の値を把握することができる。言い換えれば、ＰＬＣ１０に対して、タスク実行中に複数の変数の各々の更新後の値を一括して問合せた場合、前記制御方法によって、応答における複数の変数の各々の更新後の値の間の同期が実現されている。
【０１８６】
上述の例に即して言えば、前記制御方法により、ユーザは、タスクＴｐにおいて更新された変数Ａの更新後の値と、変数Ａが更新された時点と略同時にタスクＴｓにおいて更新された変数Ｃの更新後の値と、を把握することができる。つまり、前記制御方法により、ユーザは、変数Ａおよび変数Ｃの各々について、「同期性が確保された、更新後の値」を把握することができる。
【０１８７】
（変数の読出処理の詳細について）
以下、さらに詳細に図４について説明していく。図４において、制御部１３０（特に、演算部１３１）により、ｔ＝０の時点で、つまり、制御処理の開始時点で、タスクＴｐおよびＴｓの実行サイクル（つまり、周期）が同時に開始される。
【０１８８】
具体的には、ｔ＝０の時点で先ず、演算部１３１により、タスクＴｓよりも優先度の高いタスクＴｐの処理が開始される。このとき、タスクＴｓは、タスクＴｐよりも優先度が低いことから、実際の処理が開始されることなく待機状態となる。
【０１８９】
そして、演算部１３１は、タスクＴｐのユーザプログラムを含むプログラムＰｐ（特に、Ｐｐ１）を実行し、タスクＴｐの処理を完了すると、演算部１３１は、タスクＴｐの次に優先度が高いタスクＴｓの処理を開始する。つまり、演算部１３１は、タスクＴｓのユーザプログラムを含むプログラムＰｓ（特に、Ｐｓ１）を実行する。ここで、図４に示す例では、演算部１３１は、タスクＴｐおよびＴｓの実行サイクルが同時に開始されてから１ｍｓ経過するまでに、つまり、ｔ＝１ｍｓまでに、タスクＴｓの処理を完了している。
【０１９０】
次に、タスクＴｐおよびＴｓの実行サイクルが同時に開始されてから１ｍｓ経過すると（ｔ＝１ｍｓ）、タスクＴｐの実行サイクルが経過することから、演算部１３１により、タスクＴｐの実行が開始される。すなわち、「ｔ＝１ｍｓ」の時点から、タスクＴｐのプログラムＰｐ（特に、Ｐｐ２）が実行され、タスクＴｐの処理が完了する。
【０１９１】
前述の通り、読出時点決定部１１５は、「タスクＴｐおよびＴｓの周期が揃うタイミング（時点）から、予想読出期間Ｙμｓ前の時点」を、読出時点に決定する。図４に示す例では、読出時点決定部１１５は、「タスクＴｐおよびＴｓの周期が揃う『ｔ＝２ｍｓ』の時点から、予想読出期間Ｙμｓ前の時点」を読出時点に決定し、読出部１１２は、この読出時点で、変数Ａ〜Ｃの各々の値をＲｅａｄする。
【０１９２】
したがって、読出部１１２は、タスクＴｐにおいて更新された変数ＡおよびＢの各々の更新後の値（特に、プログラムＰｐ１の実行により更新された変数ＡおよびＢの各々の更新後の値）を読み出す。また、読出部１１２は、タスクＴｓにおいて更新された変数Ｃの更新後の値（特に、プログラムＰｓ１の実行により更新された変数Ｃの更新後の値）を読み出す。特に、読出部１１２は、変数Ａ〜Ｃの各々の値を、変数Ａ〜Ｃの各々の値を更新するプログラムの実行完了時点から、変数Ａ〜Ｃの各々の値を更新するプログラムを含むタスクの次の開始時点までに、読み出す。具体的には、読出部１１２は、変数Ａ〜Ｃの各々の値を、変数Ａ〜Ｃの各々の値を更新するプログラムＰｐおよびＰｓの各々の実行完了時点から、プログラムＰｐおよびＰｓの各々を含むタスクＴｐおよびＴｓの各々の次の開始時点までに、読み出す。
【０１９３】
ここで、読出部１１２が変数ＡおよびＢの各々の値の読出を完了してから、変数Ｃの値の読出を完了するまでの間に、変数Ａ〜Ｃのいずれも、タスクＴｐまたはＴｓにより値が更新されていない。つまり、読出部１１２は、変数Ａ〜Ｃの各々の、同期している更新後の値を、読み出す。
【０１９４】
〔実施形態２〕
本発明の他の実施形態について、以下に説明する。なお、説明の便宜上、上記実施形態にて説明した部材と同じ機能を有する部材については、同じ符号を付記し、その説明を省略する。
【０１９５】
図５は、本発明の実施形態２に係るＰＬＣ１１のＣＰＵユニット２００の要部構成等を示すブロック図である。本実施形態におけるＣＰＵユニット２００は、上述の実施形態１におけるＣＰＵユニット１００の備える構成に加えて、機能ブロックとして取得部２１０をさらに備え、また、記憶部２２０には、変数管理テーブル２２１が格納されている。ＣＰＵユニット２００は、取得部２１０を備え、記憶部２２０に変数管理テーブル２２１が格納されている点を除いて、上述のＣＰＵユニット１００と同様の構成であるため、以下では、取得部２１０および変数管理テーブル２２１について、重点的に説明を行なう。
【０１９６】
（制御装置の概要）
先ず、ＰＬＣ１１についての理解を容易にするため、その概要について以下のように整理しておく。すなわち、ＰＬＣ１１は、「読出対象の複数の変数（例えば、変数Ａ〜Ｃ）について、各変数の値がどのタスクにおいて更新されるのか」に係る情報（つまり、対応情報）を用いて、それら複数の変数の各々の更新後の値を読み出す時点を決定する。
【０１９７】
より詳細には、ＰＬＣ１１は、前記変数と、前記変数の値を更新する前記タスクと、を対応付けた対応情報を取得する取得部２１０をさらに備え、読出部１１２は、取得部２１０の取得した前記対応情報を用いて、前記複数の変数の各々の値を、前記複数の変数の各々の値を更新する前記タスクの前記周期において、読み出す。
【０１９８】
前記の構成によれば、ＰＬＣ１１は、前記変数と、前記変数の値を更新する前記タスクと、を対応付けた対応情報を取得し、取得した前記対応情報を用いて、前記複数の変数の各々の値を、前記複数の変数の各々の値を更新する前記タスクの前記周期において、読み出す。
【０１９９】
したがって、ＰＬＣ１１は、前記対応情報を用いて、前記複数の変数の各々の値を、前記複数の変数の各々の値を更新する前記タスクの前記周期において、読み出すことができるとの効果を奏する。
【０２００】
ＰＬＣ１１について、前記対応情報において、前記複数の変数のうちの或る変数（例えば、変数Ｃ）に対し、前記或る変数の値を更新する前記タスクが２つ以上対応付けられている場合、読出部１１２は、前記或る変数の値を更新する２つ以上の前記タスクの各々の前記周期が揃う時点の直前に、前記或る変数の値の読出を完了してもよい。
【０２０１】
前記の構成によれば、ＰＬＣ１１は、前記対応情報において、前記複数の変数のうちの或る変数に対し、前記或る変数の値を更新する前記タスクが２つ以上対応付けられている場合、前記或る変数の値を更新する２つ以上の前記タスクの各々の前記周期が揃う時点の直前に、前記或る変数の値の読出を完了する。
【０２０２】
ここで、前記或る変数について、前記或る変数の値を更新する２つ以上の前記タスクのうち、前記周期の間隔が最も小さいタスクにおいて、前記或る変数の更新後の値を読み出した場合、以下の事態が発生する。すなわち、読み出した値は、「前記周期の間隔が最も小さいタスク」が再実行される前に、「前記周期の間隔が最も小さいタスク」以外のタスクにおいて、さらに値が更新されることになる。
【０２０３】
これに対し、ＰＬＣ１１は、前記或る変数の値を更新する２つ以上の前記タスクの各々の前記周期が揃う時点までに、前記或る変数の値を読み出す。したがって、ＰＬＣ１１は、前記或る変数の、或るタスクにおいて更新された後の値を読み出した後、前記或るタスクが再実行される前に、「前記或るタスク」以外のタスクにおいて、前記或る変数の値が更新されるという事態を防ぐことができるとの効果を奏する。
【０２０４】
（制御装置の詳細）
取得部２１０は、サポート装置６０等から、複数の変数の各々と、各変数の値を更新するタスクと、を対応付けた対応情報を取得し、取得した対応情報を記憶部２２０の変数管理テーブル２２１に格納する。
【０２０５】
例えば、サポート装置６０は、ユーザにより作成された制御プログラムをコンパイル・ビルドして実行ファイルを作成する際に、対応情報を生成し、生成した対応情報を、取得部２１０に出力する。サポート装置６０は、ユーザプログラム等の制御プログラムによって値が更新される変数について、複数の変数の各々の値が、どの制御プログラムによって更新され、その制御プログラムがどのタスクに割り当てられているのかを把握して、対応情報を生成する。
【０２０６】
読出時点決定部１１５は、変数管理テーブル２２１に格納されている対応情報を用いて、「読出部１１２が、変数Ａ〜Ｃの各々の更新後の値を読み出す時点」を、変数Ａ〜Ｃの各々の値を更新するタスクＴｐおよびＴｓの各々の周期内に決定する。読出時点決定部１１５は、決定した「変数Ａ〜Ｃの各々の更新後の値の読出時点」を読出部１１２に通知する。
【０２０７】
読出部１１２は、読出時点決定部１１５から通知された「変数Ａ〜Ｃの各々の更新後の値の読出時点」で、変数Ａ〜Ｃの各々の更新後の値を読み出す。
【０２０８】
図６は、ＣＰＵユニット２００の記憶部２２０に格納される変数管理テーブル２２１のデータ構造を示す図である。変数管理テーブル２２１には、取得部２１０によって対応情報が格納され、例えば、取得部２１０がサポート装置６０から取得した対応情報が格納される。対応情報は、変数テーブル１２２に格納されている複数の変数の各々について、各変数の値を更新するタスクを示す情報である。例えば、対応情報は、「変数Ａ、Ｂ、Ｃ（ユーザ変数Ａ、Ｂ、Ｃ）の各々が、どのタスクにおいて実行されるユーザプログラムでＷｒｉｔｅされているか（つまり、どのタスクにおいて値が更新されるか）についての情報」である。対応情報は、変数テーブル１２２に格納されている複数の変数の各々について、さらに、各変数のデータ型を示してもよい。
【０２０９】
図６の（Ａ）に例示される対応情報は、「変数Ａがプライマリ定周期タスクであるタスクＴｐにおいて更新される」ことを示し、さらに、「変数Ａのデータ型は『Ｉｎｔ』である」ことを示している。また、図６の（Ａ）に例示される対応情報は、「変数Ｂがプライマリ定周期タスクであるタスクＴｐにおいて更新される」ことを示し、さらに、「変数Ｂのデータ型は『Ｉｎｔ』である」ことを示している。さらに、図６の（Ａ）に例示される対応情報は、「変数Ｃが定周期タスクであるタスクＴｓにおいて更新される」ことを示し、さらに、「変数Ｃのデータ型は『Ｌｏｎｇ』である」ことを示している。
【０２１０】
ここで、或る変数の値を更新するタスクが或る１つのタスクであるとは限られない。或る変数の値を、複数のタスクが更新することもあり得る。
【０２１１】
例えば、図６の（Ｂ）に例示される対応情報は、変数ＡおよびＢについては、図６の（Ａ）に例示される対応情報と同様の内容を示しているが、変数Ｃが複数のタスクにおいて更新される（変数Ｃの値は２つ以上のタスクにおいて更新される）ことを示している。すなわち、図６の（Ｂ）に例示される対応情報は、「変数Ｃが、『プライマリ定周期タスクであるタスクＴｐ』および『定周期タスクであるタスクＴｓ』において更新される」ことを示し、さらに、「変数Ｃのデータ型は『Ｌｏｎｇ』である」ことを示している。
【０２１２】
なお、対応情報は、複数のタスクにおいて値が更新される変数について、その変数に対応するタスク（タスク名）を「Ｕｎｋｎｏｗｎ」としてもよい。図６の（Ｃ）に例示される対応情報は、変数Ｃに対応するタスク（タスク名）を「Ｕｎｋｎｏｗｎ」としているが、これは、変数Ｃの値が複数のタスクにおいて更新されることを示している。
【０２１３】
取得部２１０は、本発明の「取得部」の一例であり、変数管理テーブル２２１に格納される対応情報は、本発明の「対応情報」の一例である。
【０２１４】
（制御装置の実行する処理について）
（１．各変数の値が、１つのタスクにおいて更新される場合）
図７は、ＰＬＣ１１（特に、ＣＰＵユニット２００）が実行する処理の概要を示す図である。図７に示す例において、ＰＬＣ１１（ＣＰＵユニット２００）の記憶部２２０に格納される変数管理テーブル２２１には、図６の（Ａ）に例示される対応情報が格納されている。すなわち、図７に示す例において、変数ＡおよびＢは、プライマリ定周期タスクであるタスクＴｐにおいて更新され、変数Ｃは、定周期タスクであるタスクＴｓにおいて更新される。
【０２１５】
（図中の表現について）
図７における表現について、図４と同様であるものについては、説明を省略する。図７において、紙面左上から右下へと延びる斜線で示している領域は、プライマリ定周期タスクであるタスクＴｐにおいて実行されるプログラムＰｐにより値が更新される変数ＡおよびＢのＲｅａｄが実行される期間を示している。紙面右上から左下へと延びる斜線で示している領域は、定周期タスクであるタスクＴｓにおいて実行されるプログラムＰｓにより値が更新される変数ＣのＲｅａｄが実行される期間を示している。
【０２１６】
図７において、タスクＴｐは、タスクＴｓよりも優先的に実行されるとともに、例えば１ｍｓの周期で実行される。また、タスクＴｓは、タスクＴｐよりも劣後して実行されるとともに、例えば２ｍｓの周期で実行される。
【０２１７】
（変数の読出処理の概要について）
以下、図７において例示しているＰＬＣ１１が実行する処理の概要について説明する。
【０２１８】
第１に、サポート装置６０は、タスクと変数との対応情報をＰＬＣ１１に通知する。前述の通り、図７に示す例において、サポート装置６０は、「変数ＡおよびＢは、プライマリ定周期タスクであるタスクＴｐにおいて更新され、変数Ｃは、定周期タスクであるタスクＴｓにおいて更新される」との対応情報をＰＬＣ１１に通知する。取得部２１０は、この対応情報を、記憶部２２０の変数管理テーブル２２１に格納する。
【０２１９】
第２に、クライアント装置８０は、「変数Ａ〜ＣをまとめてＲｅａｄする（Ｓｕｂｓｃｒｉｐｔｉｏｎ：ＳｕｂＸ）」とのサービス要求をＰＬＣ１０に出力する。
【０２２０】
第３に、ＰＬＣ１１のＯＰＣＵＡ入力部１１１がサービス要求：ＳｕｂＸを受信すると、ＰＬＣ１１は、変数管理テーブル２２１に格納されている対応情報に基づいて、変数Ａ〜Ｃの各々がＷｒｉｔｅされるタスクにおいて、変数Ａ〜Ｃの各々をＲｅａｄする。
【０２２１】
具体的には、読出時点決定部１１５は、「読出部１１２が、変数Ａ〜Ｃの各々をＲｅａｄする」時点を、以下のように決定する。
【０２２２】
（１）タスクＴｐにおいて値が更新される変数ＡおよびＢについて、読出時点決定部１１５は、「読出部１１２が、変数ＡおよびＢの各々をＲｅａｄする」時点を、以下のように決定する。すなわち、読出時点決定部１１５は、「読出部１１２が、変数ＡおよびＢの各々をＲｅａｄする」時点を、タスクＴｐの周期内であって、プログラムＰｐの実行が完了した後の時点に、決定する。言い換えれば、読出時点決定部１１５は、変数ＡおよびＢの各々の更新後の値を読み出す時点を、タスクＴｐの周期内の時点に、決定する。
【０２２３】
（２）タスクＴｓにおいて値が更新される変数Ｃについて、読出時点決定部１１５は、「読出部１１２が、変数ＣをＲｅａｄする」時点を、以下のように決定する。すなわち、読出時点決定部１１５は、「読出部１１２が、変数ＣをＲｅａｄする」時点を、タスクＴｓの周期内であって、プログラムＰｓの実行が完了した後の時点に、決定する。言い換えれば、読出時点決定部１１５は、変数Ｃの更新後の値を読み出す時点を、タスクＴｓの周期内の時点に、決定する。
【０２２４】
ここで、読出時点決定部１１５は、変数Ａ〜Ｃの値の読出完了時点が全て、制御部１３０により実行される複数のタスクのうち周期の間隔が最も小さいタスクであるタスクＴｐの１つの周期の開始時点から終了時点までの間に含まれるように、読出時点を決定する。例えば、読出時点決定部１１５は、変数ＡおよびＢの各々の更新後の値の読出完了時点から、変数Ｃの更新後の値の読出完了時点までの間に、変数ＡおよびＢの少なくとも一方の値が更新されることがないように、変数Ａ〜Ｃの各々の読出時点を決定する。言い換えれば、読出時点決定部１１５は、変数Ａ〜Ｃの各々の更新後の値について、読み出された変数Ａ〜Ｃの各々の更新後の値の間の同期が確保されるように、各々の更新後の値の読出時点を決定する。
【０２２５】
図７において、読出時点決定部１１５は、変数Ａ〜Ｃの各々の更新後の値の読出時点について、以下のように決定している。すなわち、図７において、制御部１３０（特に、演算部１３１）により、ｔ＝０の時点で、つまり、制御処理の開始時点で、タスクＴｐおよびＴｓの実行サイクル（つまり、周期）が同時に開始される。具体的には、ｔ＝０の時点で先ず、演算部１３１により、タスクＴｓよりも優先度の高いタスクＴｐの処理が開始される。このとき、タスクＴｓは、タスクＴｐよりも優先度が低いことから、実際の処理が開始されることなく待機状態となる。そして、演算部１３１は、タスクＴｐのユーザプログラムを含むプログラムＰｐ（特に、Ｐｐ１）を実行し、タスクＴｐの処理を完了すると、演算部１３１は、タスクＴｐの次に優先度が高いタスクＴｓの処理を開始する。つまり、演算部１３１は、タスクＴｓのユーザプログラムを含むプログラムＰｓ（特に、Ｐｓ１）を実行する。ここで、図７に示す例では、演算部１３１は、タスクＴｐおよびＴｓの実行サイクルが同時に開始されてから１ｍｓ経過するまでに、つまり、ｔ＝１ｍｓまでに、タスクＴｓの処理を完了している。
【０２２６】
読出時点決定部１１５は、タスクＴｓにおいて値が更新される変数Ｃの読出時点について、タスクＴｓの周期内（つまり、Ｔ＝０ｍｓ〜２ｍｓ）であって、プログラムＰｓ（例えば、プログラムＰｓ１）の実行が完了した後の時点に、決定する。読出部１１２は、読出時点決定部１１５によって決定された読出時点で、記憶部１２０の変数テーブル１２２を参照して、変数Ｃの値の読出（Ｒｅａｄ）を開始する（図７において、紙面右上から左下へと延びる斜線で示している領域の開始）。
【０２２７】
ここで、読出部１１２が変数Ｃを読み出している途中に、「ｔ＝１ｍｓ」の時点に達すると、タスクＴｐの実行サイクルが経過することから、「ｔ＝１ｍｓ」の時点から、演算部１３１により、タスクＴｐの実行が開始される。すなわち、「ｔ＝１ｍｓ」の時点において、読出部１１２による変数Ｃの読出（Ｒｅａｄ）が中断され、演算部１３１によってタスクＴｐのプログラムＰｐ（特に、Ｐｐ２）の実行が開始され、演算部１３１によってタスクＴｐの処理が完了する。すなわち、読出部１１２が変数Ｃを読み出している途中に、「ｔ＝１ｍｓ」の時点に達すると、読出部１１２による変数Ｃの読出（Ｒｅａｄ）が完了する時点は、早くとも「ｔ＝１ｍｓ〜２ｍｓ」の間となる。
【０２２８】
読出時点決定部１１５は、変数ＡおよびＢの各々の値の読出完了時点と、変数Ｃの読出完了時点との間が、「タスクＴｐの１周期分（つまり、１ｍｓ）」よりも小さくなるように、変数ＡおよびＢの各々の値の読出時点を決定する。具体的には、読出時点決定部１１５は、タスクＴｐにおいて値が更新される変数ＡおよびＢの各々の値の読出時点について、タスクＴｐの周期内（図７に示す例では「ｔ＝１ｍｓ〜２ｍｓ」）であって、プログラムＰｓ２の実行が完了した後の時点に、決定する。すなわち、図７の「紙面左上から右下へと延びる斜線で示している領域」において、読出部１１２は、変数ＡおよびＢの更新後の値を読み出す。
【０２２９】
なお、読出部１１２による変数Ｃの読出が中断されてから、読出部１１２による変数Ｃの読出が再開されるまでの間には、変数Ｃの値を更新するタスクＴｓ（特に、プログラムＰｓ）は実行されない。したがって、読出部１１２による変数Ｃの読出中に、タスクＴｓ（特に、プログラムＰｓ）によって変数Ｃの値が更新されることはない。
【０２３０】
以上に示した通り、図７において、読出部１１２は、（１）変数ＡおよびＢの各々の「プログラムＰｐ２によって更新された後の値」を読み出し、また、（２）変数Ｃの「プログラムＰｓ１によって更新された後の値」を読み出す。変数ＡおよびＢの各々の値の読出完了時点と、変数Ｃの読出完了時点との間は、「タスクＴｐの１周期分」よりも小さいため、この間にタスクＴｐが実行されることはなく、つまり、読み出された変数Ａ〜Ｃの各々の更新後の値の間の同期が確保される。
【０２３１】
第４に、ＰＬＣ１１のＯＰＣＵＡ出力部１１３は、読出部１１２が読み出した「変数Ａ〜Ｃの各々の値」を一括してクライアント装置８０に送信する。すなわち、ＰＬＣ１１のＯＰＣＵＡサーバ部１１０は、ＳｕｂＸの実行結果（Ｒｅａｄ結果）を、クライアント装置８０に返す。
【０２３２】
図７に示す例では、変数Ｃの読出完了時点が「ｔ＝１ｍｓ〜２ｍｓ」の間であるため、変数ＡおよびＢの各々の値の読出時点は、タスクＴｐの周期内（具体的には、「ｔ＝１ｍｓ〜２ｍｓ」）であって、プログラムＰｓ２の実行が完了した後の時点となる。「ｔ＝１ｍｓ」の時点までに変数Ｃの読出が完了する場合、変数ＡおよびＢの各々の値の読出時点は、タスクＴｐの周期内（具体的には、「ｔ＝０ｍｓ〜１ｍｓ」）であって、プログラムＰｓ１の実行が完了した後の時点となる。
【０２３３】
すなわち、読出時点決定部１１５は、読出処理の対象である複数の変数の内の或る１つの変数Ｐの値の読出完了時点から、変数Ｐとは異なる変数Ｑの値の読出完了時点までに、変数ＰまたはＱの値が更新されないように、変数ＰおよびＱの各々の読出時点を決定する。言い換えれば、読出時点決定部１１５は、変数Ｐの値の読出完了時点から、変数Ｑの値の読出完了時点までに、変数ＰまたはＱの値を更新するタスク（特に、プログラム）が実行されないように、変数ＰおよびＱの各々の読出時点を決定する。
【０２３４】
（変数の読出処理の詳細について）
図８は、図７に示した処理について、その詳細を説明する図である。
【０２３５】
サポート装置６０は、予め、タスクと変数との対応情報をＰＬＣ１１に通知しておく（Ｓ１）。具体的には、サポート装置６０は、ユーザプログラム等の制御プログラムのビルド時に、「変数Ａ〜Ｃの各々が、どのタスクにおいて実行される制御プログラムでＷｒｉｔｅされているか（値が更新されるか）」をＳｅａｒｃｈ（検索）する（Ｓ１１）。サポート装置６０は、対応情報を生成し、例えば、ユーザ変数管理テーブルに「変数Ａ〜Ｃの各々がＷｒｉｔｅされるタスク」の情報を、変数Ａ〜Ｃの各々と対応付けて格納する（Ｓ１２）。サポート装置６０は、対応情報（例えば、変数管理テーブル）を含む、各種の設定情報をＰＬＣ１１にダウンロードし、つまり、ＰＬＣ１１に出力する（Ｓ１３）。
【０２３６】
次に、クライアント装置８０は、「変数Ａ〜ＣをまとめてＲｅａｄしたい（Ｓｕｂｓｃｒｉｐｔｉｏｎ：ＳｕｂＸ）」とのサービス要求をＰＬＣ１１に出力する（Ｓ２）。具体的には、クライアント装置８０は、ＳｕｂＸの実行要求をＰＬＣ１１に出力する（Ｓ１４）。
【０２３７】
ＰＬＣ１１のＯＰＣＵＡ入力部１１１がサービス要求：ＳｕｂＸを受信すると、読出部１１２は、Ｓ１によりサポート装置６０から取得した対応情報に基づいて、各変数がＷｒｉｔｅされるタスク内で変数Ａ〜Ｃの各々の値をＲｅａｄする（Ｓ３）。
【０２３８】
具体的には、読出時点決定部１１５は、変数Ａ〜Ｃの各々がＷｒｉｔｅされるタスクを変数管理テーブル２２１から導き出す（Ｓ１５）。すなわち、読出時点決定部１１５は、変数管理テーブル２２１に格納されている対応情報に基づいて、変数Ａ〜Ｃの各々がＷｒｉｔｅされるタスクを取得し、言い換えれば、変数Ａ〜Ｃの各々の値がどのタスクにおいて更新されるのかを把握する。
【０２３９】
ＯＰＣＵＡサーバ部１１０は、変数管理テーブル２２１を参照して、変数Ａ〜Ｃの各々がＷｒｉｔｅされるタスク内でＳｕｂＸを実行し、つまり、変数Ａ〜Ｃの各々がＷｒｉｔｅされるタスク内で変数Ａ〜Ｃの各々をＲｅａｄする（Ｓ１６）。すなわち、先ず、読出時点決定部１１５が、変数管理テーブル２２１に格納されている対応情報を用いて、「読出部１１２が、変数Ａ〜Ｃの各々の更新後の値を読み出す時点」を、変数Ａ〜Ｃの各々の値を更新するタスクＴｐおよびＴｓの各々の周期内に決定する。そして、読出部１１２は、読出時点決定部１１５が決定した「変数Ａ〜Ｃの各々の更新後の値の読出時点」で、変数Ａ〜Ｃの各々の更新後の値を読み出す。読出時点決定部１１５による「変数Ａ〜Ｃの各々の更新後の値の読出時点」の決定方法については、既に図７を用いて説明したので、詳細は略記する。
【０２４０】
最後に、ＰＬＣ１１のＯＰＣＵＡ出力部１１３は、クライアント装置８０に、ＳｕｂＸの実行結果を返す（Ｓ４）。具体的には、ＯＰＣＵＡ出力部１１３は、変数Ａ〜Ｃの各々のＲｅａｄ結果をクライアント装置８０に出力する（Ｓ１７）。
【０２４１】
（２．各変数の値が、２つ以上のタスクにおいて更新される場合）
図９は、ＰＬＣ１１（特に、ＣＰＵユニット２００）が実行する処理について、或る１つの変数の値を更新するタスクが複数ある場合の処理の概要を示す図である。図９に示す例において、ＰＬＣ１１（ＣＰＵユニット２００）の記憶部２２０に格納される変数管理テーブル２２１には、図６の（Ｃ）に例示される対応情報が格納されている。すなわち、図７に示す例において、（１）変数ＡおよびＢは、プライマリ定周期タスクであるタスクＴｐにおいて更新され、（２）変数Ｃは、プライマリ定周期タスクであるタスクＴｐ、および、定周期タスクであるタスクＴｓにおいて更新される。
【０２４２】
（図中の表現について）
図９における表現について、図４または図７と同様であるものについては、説明を省略する。図９において、タスクＴｐは、タスクＴｓよりも優先的に実行されるとともに、例えば１ｍｓの周期で実行される。また、タスクＴｓは、タスクＴｐよりも劣後して実行されるとともに、例えば２ｍｓの周期で実行される。
【０２４３】
（変数の読出処理の概要について）
以下、図９において例示しているＰＬＣ１１が実行する処理の概要について説明する。
【０２４４】
第１に、サポート装置６０は、タスクと変数との対応情報をＰＬＣ１１に通知する。前述の通り、図９に示す例において、サポート装置６０は、「変数ＡおよびＢはタスクＴｐにおいて更新され、変数ＣはタスクＴｐおよびＴｓにおいて更新される」との対応情報をＰＬＣ１１に通知する。取得部２１０は、この対応情報を、記憶部２２０の変数管理テーブル２２１に格納する。
【０２４５】
第２に、クライアント装置８０は、「変数Ａ〜ＣをまとめてＲｅａｄする（Ｓｕｂｓｃｒｉｐｔｉｏｎ：ＳｕｂＸ）」とのサービス要求をＰＬＣ１０に出力する。
【０２４６】
第３に、ＰＬＣ１１のＯＰＣＵＡ入力部１１１がサービス要求：ＳｕｂＸを受信すると、ＰＬＣ１１は、変数管理テーブル２２１に格納されている対応情報に基づいて、変数Ａ〜Ｃの各々がＷｒｉｔｅされるタスクにおいて、変数Ａ〜Ｃの各々をＲｅａｄする。
【０２４７】
具体的には、読出時点決定部１１５は、「読出部１１２が、変数Ａ〜Ｃの各々をＲｅａｄする」時点を、以下のように決定する。
【０２４８】
（１）タスクＴｐにおいて値が更新される変数ＡおよびＢについて、読出時点決定部１１５は、「読出部１１２が、変数ＡおよびＢの各々をＲｅａｄする」時点を、以下のように決定する。すなわち、読出時点決定部１１５は、「読出部１１２が、変数ＡおよびＢの各々をＲｅａｄする」時点を、タスクＴｐの周期内であって、プログラムＰｐの実行が完了した後の時点に、決定する。言い換えれば、読出時点決定部１１５は、変数ＡおよびＢの各々の更新後の値を読み出す時点を、タスクＴｐの周期内の時点に、決定する。
【０２４９】
（２）タスクＴｐおよびＴｓにおいて値が更新される変数Ｃについて、読出時点決定部１１５は、「読出部１１２が、変数ＣをＲｅａｄする」時点を、以下のように決定する。すなわち、読出時点決定部１１５は、タスクＴｐおよびＴｓの周期が揃うタイミングの直前を、「読出部１１２が、変数ＣをＲｅａｄする」時点に決定する。
【０２５０】
図９に示す例では、タスクＴｐは１ｍｓの周期で実行され、タスクＴｓは２ｍｓの周期で実行されるため、「制御部１３０の制御処理の実行中に、『タスクＴｐおよびＴｓの周期が揃う時点』」は、例えば、「ｔ＝２ｍｓ、４ｍｓ、６ｍｓ、・・・」である。つまり、図９に示す例では、制御部１３０により実行されている複数のタスクの実行サイクル（周期）が揃う時点（複数のタスクが同期する時点）は、例えば、「ｔ＝２ｍｓ、４ｍｓ、６ｍｓ、・・・」である。そこで、図９に示す例において読出時点決定部１１５は、タスクＴｐおよびＴｓの周期が揃うタイミングである「ｔ＝２ｍｓ」の直前を、「読出部１１２が、変数ＣをＲｅａｄする」時点に決定する。
【０２５１】
図９において、制御部１３０（特に、演算部１３１）により、ｔ＝０の時点で、つまり、制御処理の開始時点で、タスクＴｐおよびＴｓの実行サイクル（つまり、周期）が同時に開始される。具体的には、ｔ＝０の時点で先ず、演算部１３１により、タスクＴｓよりも優先度の高いタスクＴｐの処理が開始される。このとき、タスクＴｓは、タスクＴｐよりも優先度が低いことから、実際の処理が開始されることなく待機状態となる。そして、演算部１３１は、タスクＴｐのユーザプログラムを含むプログラムＰｐ（特に、Ｐｐ１）を実行し、タスクＴｐの処理を完了すると、演算部１３１は、タスクＴｐの次に優先度が高いタスクＴｓの処理を開始する。つまり、演算部１３１は、タスクＴｓのユーザプログラムを含むプログラムＰｓ（特に、Ｐｓ１）を実行する。ここで、図９に示す例では、演算部１３１は、タスクＴｐおよびＴｓの実行サイクルが同時に開始されてから１ｍｓ経過するまでに、つまり、ｔ＝１ｍｓまでに、タスクＴｓの処理を完了している。
【０２５２】
読出時点決定部１１５は、タスクＴｐおよびＴｓにおいて値が更新される変数Ｃの読出時点について、タスクＴｐおよびＴｓの周期が揃うタイミングである「ｔ＝２ｍｓ」の直前に、決定する。具体的には、読出時点決定部１１５は、「読出部１１２が変数Ｃの値の読出処理を実行する」のに要する時間である予想読出期間Ｙｃを読出期間算出部１１４から取得する。そして、読出時点決定部１１５は、タスクＴｐおよびＴｓの各々の周期が揃う時点である「ｔ＝２ｍｓ」から、予想読出期間Ｙｃを差し引いた時点を、変数Ｃの値の読出時点に決定する。読出部１１２は、読出時点決定部１１５によって決定された読出時点で、記憶部１２０の変数テーブル１２２を参照して、変数Ｃの値の読出（Ｒｅａｄ）を開始する（図９において、紙面右上から左下へと延びる斜線で示している領域の開始）。
【０２５３】
また、読出時点決定部１１５は、変数ＡおよびＢの各々の値の読出完了時点と、変数Ｃの読出完了時点との間が、「タスクＴｐの１周期分（つまり、１ｍｓ）」よりも小さくなるように、変数ＡおよびＢの各々の値の読出時点を決定する。具体的には、読出時点決定部１１５は、変数ＡおよびＢの各々の値の読出時点について、タスクＴｐの周期内（図９に示す例では「ｔ＝１ｍｓ〜２ｍｓ」）であって、プログラムＰｓ２の実行が完了した後の時点に、決定する。すなわち、図９の「紙面左上から右下へと延びる斜線で示している領域」において、読出部１１２は、変数ＡおよびＢの更新後の値を読み出す。
【０２５４】
なお、変数Ｃの値はタスクＴｐおよびＴｓにおいて更新されるから、図９において、プログラムＰｐ２の実行によって変数Ｃの値は更新されている。
【０２５５】
以上に示した通り、図９において、読出部１１２は、（１）変数ＡおよびＢの各々の「プログラムＰｐ２によって更新された後の値」を読み出し、また、（２）変数Ｃの「プログラムＰｐ２によって更新された後の値」を読み出す。変数ＡおよびＢの各々の値の読出完了時点と、変数Ｃの読出完了時点との間は、「タスクＴｐの１周期分」よりも小さいため、この間にタスクＴｐが実行されることはなく、つまり、読み出された変数Ａ〜Ｃの各々の更新後の値の間の同期が確保される。
【０２５６】
第４に、ＰＬＣ１１のＯＰＣＵＡ出力部１１３は、読出部１１２が読み出した「変数Ａ〜Ｃの各々の値」を一括してクライアント装置８０に送信する。すなわち、ＰＬＣ１１のＯＰＣＵＡサーバ部１１０は、ＳｕｂＸの実行結果（Ｒｅａｄ結果）を、クライアント装置８０に返す。
【０２５７】
すなわち、読出時点決定部１１５は、読出処理の対象である複数の変数の内の或る１つの変数Ｐの値の読出完了時点から、変数Ｐとは異なる変数Ｑの値の読出完了時点までに、変数ＰまたはＱの値が更新されないように、変数ＰおよびＱの各々の読出時点を決定する。言い換えれば、読出時点決定部１１５は、変数Ｐの値の読出完了時点から、変数Ｑの値の読出完了時点までに、変数ＰまたはＱの値を更新するタスク（特に、プログラム）が実行されないように、変数ＰおよびＱの各々の読出時点を決定する。
【０２５８】
（変数の読出処理の詳細について）
図１０は、図９に示した処理について、その詳細を説明する図である。
【０２５９】
図８に例示したのと同様に、サポート装置６０は、予め、タスクと変数との対応情報をＰＬＣ１１に通知しておく（Ｓ１）。具体的には、サポート装置６０は、ユーザプログラム等の制御プログラムのビルド時に、「変数Ａ〜Ｃの各々が、どのタスクにおいて実行される制御プログラムでＷｒｉｔｅされているか（値が更新されるか）」をＳｅａｒｃｈ（検索）する（Ｓ１１）。サポート装置６０は、対応情報を生成し、例えば、ユーザ変数管理テーブルに「変数Ａ〜Ｃの各々がＷｒｉｔｅされるタスク」の情報を、変数Ａ〜Ｃの各々と対応付けて格納する。ここで、サポート装置６０は、複数のタスク（例えば、タスクＴｐおよびＴｓ）からＷｒｉｔｅされる変数（例えば、変数Ｃ）には、タスク：Ｕｎｋｎｏｗｎを対応付ける（Ｓ１２’）。サポート装置６０は、対応情報（例えば、変数管理テーブル）を含む、各種の設定情報をＰＬＣ１１にダウンロードし、つまり、ＰＬＣ１１に出力する（Ｓ１３）。
【０２６０】
次に、クライアント装置８０は、「変数Ａ〜ＣをまとめてＲｅａｄしたい（Ｓｕｂｓｃｒｉｐｔｉｏｎ：ＳｕｂＸ）」とのサービス要求をＰＬＣ１１に出力する（Ｓ２）。具体的には、クライアント装置８０は、ＳｕｂＸの実行要求をＰＬＣ１１に出力する（Ｓ１４）。
【０２６１】
ＰＬＣ１１のＯＰＣＵＡ入力部１１１がサービス要求：ＳｕｂＸを受信すると、読出部１１２は、Ｓ１によりサポート装置６０から取得した対応情報に基づいて、各変数がＷｒｉｔｅされるタスク内で変数Ａ〜Ｃの各々の値をＲｅａｄする（Ｓ３）。
【０２６２】
具体的には、読出時点決定部１１５は、変数Ａ〜Ｃの各々がＷｒｉｔｅされるタスクを変数管理テーブル２２１から導き出す（Ｓ１５）。すなわち、読出時点決定部１１５は、変数管理テーブル２２１に格納されている対応情報に基づいて、変数Ａ〜Ｃの各々がＷｒｉｔｅされるタスクを取得し、言い換えれば、変数Ａ〜Ｃの各々の値がどのタスクにおいて更新されるのかを把握する。
【０２６３】
ＯＰＣＵＡサーバ部１１０は、変数管理テーブル２２１を参照して、変数Ａ〜Ｃの各々がＷｒｉｔｅされるタスク内でＳｕｂＸを実行し、つまり、変数Ａ〜Ｃの各々がＷｒｉｔｅされるタスク内で変数Ａ〜Ｃの各々をＲｅａｄする。ここで、タスク：Ｕｎｋｎｏｗｎが対応付けられている変数Ｃは、複数のタスクの周期が揃うタイミングでＲｅａｄする（Ｓ１６’）。
【０２６４】
すなわち、読出時点決定部１１５は、変数管理テーブル２２１に格納されている対応情報を用いて「変数Ｃの値はタスクＴｐおよびＴｓにおいて更新される」ことを把握すると、変数Ｃの読出時点を、以下のように決定する。読出時点決定部１１５は、タスクＴｐおよびＴｓにおいて値が更新される変数Ｃの読出時点を、タスクＴｐおよびＴｓの周期が揃うタイミング（例えば、「ｔ＝２ｍｓ」）の直前に、決定する。
【０２６５】
読出部１１２は、読出時点決定部１１５が決定した「変数Ａ〜Ｃの各々の更新後の値の読出時点」で、変数Ａ〜Ｃの各々の更新後の値を読み出す。読出時点決定部１１５による「変数Ａ〜Ｃの各々の更新後の値の読出時点」の決定方法については、既に図９を用いて説明したので、詳細は略記する。
【０２６６】
最後に、ＰＬＣ１１のＯＰＣＵＡ出力部１１３は、クライアント装置８０に、ＳｕｂＸの実行結果を返す（Ｓ４）。具体的には、ＯＰＣＵＡ出力部１１３は、変数Ａ〜Ｃの各々のＲｅａｄ結果をクライアント装置８０に出力する（Ｓ１７）。
§４．変形例
（制御装置について）
これまでに説明してきた実施形態においては、本発明に係る制御装置（コントローラ）としてＰＬＣ１０およびＰＬＣ１１について説明を行なってきたが、本発明に係る制御装置は、ＰＬＣに限られることなく、各種の制御装置へ適用可能である。
【０２６７】
（制御装置の台数について）
図２に例示する管理システム１おいては、１台のＰＬＣ１０が、クライアント装置８０と、制御システム２内の入力機器および出力機器と、に接続している。しかしながら、管理システム１おいてＰＬＣ１０が１台であることは必須ではなく、管理システム１は、複数台のＰＬＣ１０を含んでもよい。管理システム１において、複数のＰＬＣ１０の各々は、フィールドネットワーク２０を介して、相互に通信可能に接続されていてもよい。
【０２６８】
例えば、制御システム２における制御を主体的に担うＰＬＣ１０と、情報システム３においてクライアント装置８０からのサービス要求（例えば、ＳｕｂＸの実行要求）を受け付けるＰＬＣ１０と、が１台の同じＰＬＣ１０であることも必須ではない。クライアント装置８０からＳｕｂＸの実行要求を受け付けたＰＬＣ１０Ａが、制御システム２における制御を主体的に担っているＰＬＣ１０ＢにＳｕｂＸを実行させ、ＰＬＣ１０Ａが、ＳｕｂＸの実行結果をクライアント装置８０に出力してもよい。その場合、ＰＬＣ１０ＡとＰＬＣ１０Ｂとは、例えば、フィールドネットワーク２０を介して、相互に通信可能に接続されていてもよい。
【０２６９】
（マルチタスクについて）
ＰＬＣ１０およびＰＬＣ１１は、「マルチタスクで処理を実行する」ことができればよく、「時分割により複数のタスクを並行して実行する」だけでなく、「複数のタスクを同時に並行して実行する」ことができてもよい。例えば、プロセッサ１５１は、シングルコアであり、時分割により複数のタスクを並行して実行してもよく、すなわち、プロセッサ１５１は、マルチタスクで処理を実行してもよい。また、プロセッサ１５１は、マルチコアであり、複数のタスクを同時に並行して実行し、すなわち、プロセッサ１５１は、マルチタスクで処理を実行してもよい。プロセッサ１５１は、複数のタスクを同時に並行して実行することによって、タスクの処理能力の向上を図ることができる。
【０２７０】
ＰＬＣ１０およびＰＬＣ１１は、シングルコアを採用し、マルチタスクについて、或るタスクの実行中は他のタスクを実行しない「並行実行」を行なってもよい。また、ＰＬＣ１０およびＰＬＣ１１は、マルチコアを採用し、マルチタスクについて、或るタスクの実行中に他のタスクを実行する「並列実行」を行なってもよい。ＰＬＣ１０およびＰＬＣ１１は、マルチタスクについて、並行実行を行なう場合であっても、並列実行を行なう場合であっても、複数の変数の各々の更新後の値であって、各々の値の間の同期が確保された更新後の値を、一括して読み出す。
【０２７１】
〔ソフトウェアによる実現例〕
ＰＬＣ１０および１１（特に、ＣＰＵユニット１００およびＣＰＵユニット２００）の機能ブロック（特に、ＯＰＣＵＡサーバ部１１０、制御部１３０、および取得部２１０）は、集積回路（ＩＣチップ）等に形成された論理回路（ハードウェア）によって実現してもよいし、ソフトウェアによって実現してもよい。
【０２７２】
後者の場合、ＰＬＣ１０および１１は、各機能を実現するソフトウェアであるプログラムの命令を実行するコンピュータを備えている。このコンピュータは、例えば１つ以上のプロセッサを備えていると共に、上記プログラムを記憶したコンピュータ読み取り可能な記録媒体を備えている。そして、上記コンピュータにおいて、上記プロセッサが上記プログラムを上記記録媒体から読み取って実行することにより、本発明の目的が達成される。上記プロセッサとしては、例えばＣＰＵ（Central Processing Unit）を用いることができる。上記記録媒体としては、「一時的でない有形の媒体」、例えば、ＲＯＭ（Read Only Memory）等の他、テープ、ディスク、カード、半導体メモリ、プログラマブルな論理回路などを用いることができる。また、上記プログラムを展開するＲＡＭ（Random Access Memory）などをさらに備えていてもよい。また、上記プログラムは、該プログラムを伝送可能な任意の伝送媒体（通信ネットワークや放送波等）を介して上記コンピュータに供給されてもよい。なお、本発明の一態様は、上記プログラムが電子的な伝送によって具現化された、搬送波に埋め込まれたデータ信号の形態でも実現され得る。
【０２７３】
本発明は上述した各実施形態に限定されるものではなく、請求項に示した範囲で種々の変更が可能であり、異なる実施形態にそれぞれ開示された技術的手段を適宜組み合わせて得られる実施形態についても本発明の技術的範囲に含まれる。
【符号の説明】
【０２７４】
１０、１０Ａ、１０Ｂ、１１  ＰＬＣ（制御装置）
８０  クライアント装置（ＯＰＣＵＡクライアント装置）
１１１  ＯＰＣＵＡ入力部（受付部）
１１２  読出部
１１３  ＯＰＣＵＡ出力部（出力部）
２１０  取得部
Ｔｐ  タスク（基準のタスク）
Ｔｓ  タスク（基準のタスク以外のタスク）
Ｙμｓ  予想読出期間
Ｓｔｅｐ１  受付ステップ
Ｓｔｅｐ３  読出ステップ
Ｓｔｅｐ４  出力ステップ
【図１】
2019079256.tif 000003
【図２】
2019079256.tif 000004
【図３】
2019079256.tif 000005
【図４】
2019079256.tif 000006
【図５】
2019079256.tif 000007
【図６】
2019079256.tif 000008
【図７】
2019079256.tif 000009
【図８】
2019079256.tif 000010
【図９】
2019079256.tif 000011
【図１０】
2019079256.tif 000012