(57)【特許請求の範囲】
【請求項１】
複数のタスク間で共有するデータに対してアクセスする構成とされたユーザプログラムを実行するプログラマブルコントローラの前記ユーザプログラムを前記プログラマブルコントローラで実行可能なコードに変換する変換手段を備えたユーザプログラム開発支援装置であって、
前記ユーザプログラムは、
前記複数のタスクのうち、一のタスクのユーザプログラムが前記データにアクセスを開始する前に、他のタスクのユーザプログラムの実行を排他する排他制御のロックを指示するタスク間排他命令と、
前記一のタスクのユーザプログラムが前記データへのアクセスを終了した後に前記排他制御のロック状態の解除を指示するタスク間排他解除命令と
を含み、
前記変換手段は、前記タスク間排他命令及び前記タスク間排他解除命令を含む前記ユーザプログラムを前記プログラマブルコントローラで実行可能なコードに変換し、
前記データは、複数のデータとされており、
前記タスク間排他命令及び前記タスク間排他解除命令は、前記複数のデータへのそれぞれのアクセスの前記排他制御のロック及びロック状態の解除を指示するものであり、
前記タスク間排他命令及び前記タスク間排他解除命令には、前記複数のデータに対応させて識別符号が付されており、
前記タスク間排他命令及び前記タスク間排他解除命令は、対応関係にある前記タスク間排他命令及び前記タスク間排他解除命令の間に、他の対応関係にある前記タスク間排他命令及び前記タスク間排他解除命令が入るネスティング構造を構成し、
前記タスク間排他命令及び前記タスク間排他解除命令は、同一の前記識別符号に対して、前記ネスティング構造を構成する
ことを特徴とするユーザプログラム開発支援装置。
【請求項２】
ユーザプログラム開発支援装置における制御部を、複数のタスク間で共有するデータに対してアクセスする構成とされたユーザプログラムを実行するプログラマブルコントローラの前記ユーザプログラムを前記プログラマブルコントローラで実行可能なコードに変換する変換手段として機能させるユーザプログラム開発支援用プログラムであって、
前記ユーザプログラムは、
前記複数のタスクのうち、一のタスクのユーザプログラムが前記データにアクセスを開始する前に、他のタスクのユーザプログラムの実行を排他する排他制御のロックを指示するタスク間排他命令と、
前記一のタスクのユーザプログラムが前記データへのアクセスを終了した後に前記排他制御のロック状態の解除を指示するタスク間排他解除命令と
を含み、
前記変換手段は、前記タスク間排他命令及び前記タスク間排他解除命令を含む前記ユーザプログラムを前記プログラマブルコントローラで実行可能なコードに変換し、
前記データは、複数のデータとされており、
前記タスク間排他命令及び前記タスク間排他解除命令は、前記複数のデータへのそれぞれのアクセスの前記排他制御のロック及びロック状態の解除を指示するものであり、
前記タスク間排他命令及び前記タスク間排他解除命令には、前記複数のデータに対応させて識別符号が付されており、
前記タスク間排他命令及び前記タスク間排他解除命令は、対応関係にある前記タスク間排他命令及び前記タスク間排他解除命令の間に、他の対応関係にある前記タスク間排他命令及び前記タスク間排他解除命令が入るネスティング構造を構成し、
前記タスク間排他命令及び前記タスク間排他解除命令は、同一の前記識別符号に対して、前記ネスティング構造を構成する
ことを特徴とするユーザプログラム開発支援用プログラム。
【請求項３】
請求項２に記載のユーザプログラム開発支援用プログラムを記録したコンピュータ読み取り可能な記録媒体。
【請求項４】
請求項１に記載のユーザプログラム開発支援装置と、前記プログラマブルコントローラとを備えた
ことを特徴とするプログラマブルコントローラシステム。
【請求項５】
複数のタスク間で共有するデータに対してアクセスする構成とされたユーザプログラムを実行するプログラマブルコントローラであって、
前記複数のタスクのうち、一のタスクのユーザプログラムが前記データにアクセスを開始する前に、他のタスクのユーザプログラムの実行を排他する排他制御のロックを指示するタスク間排他命令によって前記排他制御のロックを開始する排他制御手段と、
前記一のタスクのユーザプログラムが前記データへのアクセスを終了した後に前記排他制御のロック状態の解除を指示するタスク間排他解除命令によって前記排他制御のロック状態を解除する排他制御解除手段と、
前記一のタスクの実行終了時に前記排他制御のロック状態を強制的に解除する強制解除手段と
を備える
ことを特徴とするプログラマブルコントローラ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数のタスク間で共有するデータに対してアクセスするユーザプログラムを実行可能なプログラマブルコントローラの制御に関する。
【背景技術】
【０００２】
ファクトリーオートメーション（ＦＡ）の制御装置として、プログラマブルコントローラ（以下、「ＰＬＣ」ということがある）が広く利用されている。ＰＬＣは、例えば、電源供給源の電源ユニット、ＰＬＣ全体の制御を司るＣＰＵユニット、ＦＡの生産装置や設備装置の適所に取り付けたスイッチやセンサの信号を入力する入力ユニット、アクチュエータなどに制御出力を出す出力ユニット、通信ネットワークに接続するための通信ユニットといった複数のユニットを適宜組み合わせて構成されることが多い。
【０００３】
ＰＬＣのＣＰＵユニットにおける制御は、入力ユニットで入力した信号をＣＰＵユニットのＩ／Ｏメモリに取り込み（ＩＮリフレッシュ）、予め登録されたＰＬＣ制御用の言語（例えばラダー言語）が組まれたユーザプログラムに基づき論理演算を実行し、その演算の実行結果をＩ／Ｏメモリに書き込んで出力ユニットに送り出し（ＯＵＴリフレッシュ）、その後、いわゆる周辺処理を行うといった一連のサイクリック処理を繰り返し行う。ユーザプログラムは、ユーザプログラム開発支援装置によって、作成、編集され、さらに、ＰＬＣに実行可能なオブジェクトコードに変換されてＰＬＣで実行される。そして、ユーザプログラムは、タスク毎に割り当てられて実行される。
【０００４】
図１９は、ユーザプログラムがタスク毎に割り当てられる状態を説明するための説明図である。図１９に示すように、ユーザプログラム全体は、複数のユーザプログラムから構成される。各ユーザプログラムは、タスク毎に割り当てられる。
【０００５】
また、タスクは、周期的に実行される周期実行型タスクと、何らかのイベントが発生したときに実行されるイベント実行型タスクとに大別される。
【０００６】
また、タスク処理として、シングルコアで行う場合には、同時に一つのタスクしか実行できないために、優先度が高いタスクのユーザプログラムと、そのタスクより優先度が低いタスクのユーザプログラムとを同時期に実行した場合の重なった時間において、優先度の低いタスクのユーザプログラムが実行している全体の処理を中断して、優先度の高いタスクのユーザプログラムを実行する割込制御が行われる。
【０００７】
ところで、複数のタスクが実行される場合には、複数のタスクのユーザプログラムがデータに対して順にアクセスする場合には支障がないが、複数のタスク間で共有するデータに対して少なくとも二つのユーザプログラムがデータに対して同時にアクセスする場合に、次のような不都合が生じる。
【０００８】
図２０は、複数のタスクＴ１〜Ｔｎ間で共有するデータＤに対して少なくとも二つのユーザプログラムがアクセスする場合での不都合を説明するための説明図である。なお、ｎは２以上の整数である。図２０（ａ）は、複数のタスクＴ１〜Ｔｎ間で共有するデータＤに対して二つのユーザプログラムＰ１，Ｐ３がアクセスする状態を示している。図２０（ｂ）は、二つのタスクＴ１，Ｔ３のユーザプログラムＰ１，Ｐ３がデータＤに順にアクセスする処理例を示している。図２０（ｃ）は、二つのユーザプログラムＰ１，Ｐ３がデータＤに同時にアクセスする処理例を示している。
【０００９】
図２０（ａ）に示すように、複数のタスクＴ１〜Ｔｎ間で共有するデータＤに対して二つのユーザプログラムＰ１，Ｐ３がアクセスする場合において、図２０（ｂ）に示す例では、二つのタスクＴ１，Ｔ３のユーザプログラムＰ１，Ｐ３を順にアクセスするので、〔１〕「ユーザプログラムＰ１がデータＤ（例えば５）を取り出す」→〔２〕「ユーザプログラムＰ１がデータＤをインクリメント（例えば５に１を加算してＤ＝５＋１＝６を算出）する」→〔３〕「ユーザプログラムＰ３がデータＤ（例えば６）を取り出す」→〔４〕「ユーザプログラムＰ３がデータＤをインクリメント（例えば６に１を加算してＤ＝６＋１＝７を算出）する」という処理手順になる。
【００１０】
すなわち、ユーザプログラムＰ３は、ユーザプログラムＰ１の処理が終わってからデータＤを取り出しているために、データＤは正確に処理（例えば５に１が２回加算されてＤ＝５＋２＝７が算出）される。よって、この例では支障なくデータ処理を行える。
【００１１】
これに対して、図２０（ｃ）に示す例では、二つのタスクＴ１，Ｔ３のユーザプログラムＰ１，Ｐ３が一つのデータＤに同時にアクセスするので、〔１〕「ユーザプログラムＰ１がデータＤ（例えば５）を取り出す」→〔２〕「ユーザプログラムＰ３がデータＤ（例えば５）を取り出す」→〔３〕「ユーザプログラムＰ１がデータＤをインクリメント（例えば５に１を加算してＤ＝５＋１＝６を算出）する」→〔４〕「ユーザプログラムＰ３がデータＤをインクリメント（例えば５に１を加算してＤ＝５＋１＝６を算出）する」という処理手順になることがある。
【００１２】
すなわち、ユーザプログラムＰ３は、ユーザプログラムＰ１の処理が終わる前にデータＤ（例えば５）を取り出しているために、ユーザプログラムＰ３はユーザプログラムＰ１がデータＤを処理する前の情報（例えば５）に基づきデータＤを処理してしまう。この結果、ユーザプログラムＰ１が処理したデータ処理が失われてしまうことになる。つまり、ユーザプログラムＰ１，Ｐ３の双方がデータＤに処理を行った（例えば１を加算した）にも拘わらず、データＤは本来の処理（例えば５に１が２回加算されてＤ＝５＋２＝７が算出）に対して正確に処理（例えば５に１が１回しか加算）されないことになる。
【００１３】
このような不都合を回避するために、従来では、複数のタスクのうち、一のタスクのユーザプログラムがデータにアクセスを開始する前に、その後にアクセスする他の優先度の高いタスクのユーザプログラムに対して割込制御を禁止するようにしている（特許文献１参照）。
【００１４】
図２１は、複数のタスクＴ１〜Ｔｎ間で共有するデータＤに対して少なくとも二つユーザプログラムが同時にアクセスする場合での一のタスクのユーザプログラムへの従来の割込制御を時系列的に示す概念図である。なお、図２１において、「斜線」は、割込制御が必要な区間を表しており、「二重線」は、ユーザプログラムＰ１〜Ｐｎの実行完了を表している。
【００１５】
図２１に示すように、複数のタスクＴ１〜Ｔｎ間で共有するデータＤ（図２０（ａ）参照）に対して二つタスクＴ１，Ｔ３のユーザプログラムＰ１，Ｐ３がデータＤに同時にアクセスする場合には、ユーザプログラムＰ３がデータＤにアクセスを開始する前に、他の優先度の高いタスクＴ１のユーザプログラムＰ１に対して割込制御の禁止を指示する割込実行禁止命令Ａによって割込制御の禁止を開始し、タスクＴ３のユーザプログラムＰ３がデータＤへのアクセスを終了した後に、データＤへの割込制御の禁止の解除を指示する割込許可命令Ｂによって割込制御の禁止を解除する。こうすることで、二つのユーザプログラムＰ１，Ｐ３の双方が同時にデータＤにアクセスしても、データＤが正確に処理されないといった不都合を回避することが可能となる。
【先行技術文献】
【特許文献】
【００１６】
【特許文献１】特開２０１０−０２６６６０号公報
【発明の概要】
【発明が解決しようとする課題】
【００１７】
しかしながら、このような従来の割込制御では、図２１に示すように、他のタスクＴ１のユーザプログラムＰ１は、割込制御が禁止されている間、区間αでデータＤへアクセスしない（データＤへのアクセスに関与しない処理を行える）にも拘わらず、全体の処理が（データＤへアクセスする処理だけでなく、データＤへのアクセスに関与しない処理も）待たされることになる。すなわち、ユーザプログラムＰ１は、区間αにおいてデータＤへのアクセスに関与しない処理が遅延することになり、これにより、区間αでの他のタスクＴ１のユーザプログラムＰ１によるデータＤへのアクセスに関与しない処理の高速性及び高精度性の低下を招く。
【００１８】
そこで、本発明は、複数のタスク間で共有するデータに対して少なくとも二つのユーザプログラムが前記データに対して同時にアクセスする場合に、一のタスクのユーザプログラムが前記データにアクセスするにあたって、他のタスクのユーザプログラムによる前記データへのアクセスに関与しない処理の高速性及び高精度性を維持できるユーザプログラム開発支援装置、ユーザプログラム開発支援用プログラム、記録媒体、プログラマブルコントローラシステム及びプログラマブルコントローラを提供することを目的とする。
【課題を解決するための手段】
【００１９】
本発明は、前記課題を解決するために、次のユーザプログラム開発支援装置、ユーザプログラム開発支援用プログラム、記録媒体、プログラマブルコントローラシステム及びプログラマブルコントローラを提供する。
【００２１】
（１）ユーザプログラム開発支援装置
複数のタスク間で共有するデータに対してアクセスする構成とされたユーザプログラムを実行するプログラマブルコントローラの前記ユーザプログラムを前記プログラマブルコントローラで実行可能なコードに変換する変換手段を備えたユーザプログラム開発支援装置であって、前記ユーザプログラムは、前記複数のタスクのうち、一のタスクのユーザプログラムが前記データにアクセスを開始する前に、他のタスクのユーザプログラムの実行を排他する排他制御のロックを指示するタスク間排他命令と、前記一のタスクのユーザプログラムが前記データへのアクセスを終了した後に前記排他制御のロック状態の解除を指示するタスク間排他解除命令とを含み、前記変換手段は、前記タスク間排他命令及び前記タスク間排他解除命令を含む前記ユーザプログラムを前記プログラマブルコントローラで実行可能なコードに変換し、前記データは、複数のデータとされており、前記タスク間排他命令及び前記タスク間排他解除命令は、前記複数のデータへのそれぞれのアクセスの前記排他制御のロック及びロック状態の解除を指示するものであり、前記タスク間排他命令及び前記タスク間排他解除命令には、前記複数のデータに対応させて識別符号が付されており、前記タスク間排他命令及び前記タスク間排他解除命令は、対応関係にある前記タスク間排他命令及び前記タスク間排他解除命令の間に、他の対応関係にある前記タスク間排他命令及び前記タスク間排他解除命令が入るネスティング構造を構成し、前記タスク間排他命令及び前記タスク間排他解除命令は、同一の前記識別符号に対して、前記ネスティング構造を構成することを特徴とするユーザプログラム開発支援装置。
【００２２】
（２）ユーザプログラム開発支援用プログラム
ユーザプログラム開発支援装置における制御部を、複数のタスク間で共有するデータに対してアクセスする構成とされたユーザプログラムを実行するプログラマブルコントローラの前記ユーザプログラムを前記プログラマブルコントローラで実行可能なコードに変換する変換手段として機能させるユーザプログラム開発支援用プログラムであって、前記ユーザプログラムは、前記複数のタスクのうち、一のタスクのユーザプログラムが前記データにアクセスを開始する前に、他のタスクのユーザプログラムの実行を排他する排他制御のロックを指示するタスク間排他命令と、前記一のタスクのユーザプログラムが前記データへのアクセスを終了した後に前記排他制御のロック状態の解除を指示するタスク間排他解除命令とを含み、前記変換手段は、前記タスク間排他命令及び前記タスク間排他解除命令を含む前記ユーザプログラムを前記プログラマブルコントローラで実行可能なコードに変換し、前記データは、複数のデータとされており、前記タスク間排他命令及び前記タスク間排他解除命令は、前記複数のデータへのそれぞれのアクセスの前記排他制御のロック及びロック状態の解除を指示するものであり、前記タスク間排他命令及び前記タスク間排他解除命令には、前記複数のデータに対応させて識別符号が付されており、前記タスク間排他命令及び前記タスク間排他解除命令は、対応関係にある前記タスク間排他命令及び前記タスク間排他解除命令の間に、他の対応関係にある前記タスク間排他命令及び前記タスク間排他解除命令が入るネスティング構造を構成し、前記タスク間排他命令及び前記タスク間排他解除命令は、同一の前記識別符号に対して、前記ネスティング構造を構成することを特徴とするユーザプログラム開発支援用プログラム。
【００２３】
（３）記録媒体
前記本発明に係るユーザプログラム開発支援用プログラムを記録したコンピュータ読み取り可能な記録媒体。
【００２４】
（４）プログラマブルコントローラシステム
前記本発明に係るユーザプログラム開発支援装置と、前記プログラマブルコントローラとを備えたことを特徴とするプログラマブルコントローラシステム。
【００２５】
（５）プログラマブルコントローラ
複数のタスク間で共有するデータに対してアクセスする構成とされたユーザプログラムを実行するプログラマブルコントローラであって、前記複数のタスクのうち、一のタスクのユーザプログラムが前記データにアクセスを開始する前に、他のタスクのユーザプログラムの実行を排他する排他制御のロックを指示するタスク間排他命令によって前記排他制御のロックを開始する排他制御手段と、前記一のタスクのユーザプログラムが前記データへのアクセスを終了した後に前記排他制御のロック状態の解除を指示するタスク間排他解除命令によって前記排他制御のロック状態を解除する排他制御解除手段と、前記一のタスクの実行終了時に前記排他制御のロック状態を強制的に解除する強制解除手段とを備えることを特徴とするプログラマブルコントローラ。
【００２６】
本発明によれば、前記一のタスクのユーザプログラムが前記データにアクセスを開始する前に前記他のタスクのユーザプログラムに対して割込制御を禁止しなくても、前記タスク間排他命令によって、前記一のタスクのユーザプログラムが前記データにアクセスを開始する前に前記排他制御のロックを開始し、前記タスク間排他解除命令によって、前記一のタスクのユーザプログラムが前記データへのアクセスを終了した後に前記排他制御のロック状態を解除することができ、これにより、前記一のタスクのユーザプログラムが先に前記データにアクセスするときでも、前記他のタスクのユーザプログラムによる前記データへのアクセスに関与しない処理が待たされることがないようにすることができる。すなわち、前記他のタスクのユーザプログラムによる前記データへのアクセスに関与しない処理の遅延をなくすことができ、これにより、前記他のタスクのユーザプログラムによる前記データへのアクセスに関与しない処理の高速性及び高精度性を維持することが可能となる。
【００２８】
さらに、本発明に係るユーザプログラム開発支援装置、ユーザプログラム開発支援用プログラム、記録媒体及びプログラマブルコントローラシステムでは、前記タスク間排他命令及び前記タスク間排他解除命令は、前記複数のデータへのそれぞれのアクセスの前記排他制御のロック及びロック状態の解除を指示するものであるので、ユーザによる前記ユーザプログラムの作成において前記複数のデータに対応する用途ごとに別々に前記排他制御を行うことが可能となる。
【００３０】
さらに、本発明に係るユーザプログラム開発支援装置、ユーザプログラム開発支援用プログラム、記録媒体及びプログラマブルコントローラシステムでは、前記タスク間排他命令及び前記タスク間排他解除命令を前記ネスティング構造とするので、ユーザによる前記ユーザプログラムの作成にあたって前記排他制御の利用範囲を広げることができる。
【００３２】
しかも、本発明に係るユーザプログラム開発支援装置、ユーザプログラム開発支援用プログラム、記録媒体及びプログラマブルコントローラシステムでは、同一の前記識別符号の前記タスク間排他命令及び前記タスク間排他解除命令を前記ネスティング構造とするので、ユーザが前記ネスティング構造において同一の前記識別符号の前記タスク間排他命令及び前記タスク間排他解除命令を複数使用することがあっても、その使用を許容することが可能となり、前記ネスティング構造を使用するにあたって利便性を向上させることが可能となる。
【００３４】
また、本発明に係るプログラマブルコントローラでは、前記一のタスクの実行終了時に前記排他制御のロック状態を強制的に解除するので、例えば、ユーザが前記ユーザプログラムの誤りにより、前記タスク間排他解除命令を入れ忘れたり、ロジック上の不都合があったりしても、次の前記タスク以降では前記排他制御のロック状態が解除された状態となり、ユーザによるユーザプログラムの誤りを補填することが可能となる。
【発明の効果】
【００３５】
以上説明したように、本発明によると、前記一のタスクのユーザプログラムが前記データにアクセスを開始する前に前記他のタスクのユーザプログラムに対して割込制御を禁止しなくても、前記タスク間排他命令によって、前記一のタスクのユーザプログラムが前記データにアクセスを開始する前に前記排他制御のロックを開始し、前記タスク間排他解除命令によって、前記一のタスクのユーザプログラムが前記データへのアクセスを終了した後に前記排他制御のロック状態を解除することができ、これにより、前記一のタスクのユーザプログラムが先に前記データにアクセスするときでも、前記他のタスクのユーザプログラムによる前記データへのアクセスに関与しない処理が待たされることがないようにすることができる。すなわち、前記他のタスクのユーザプログラムによる前記データへのアクセスに関与しない処理の遅延をなくすことができ、これにより、前記他のタスクのユーザプログラムによる前記データへのアクセスに関与しない処理の高速性及び高精度性を維持することができる。
【図面の簡単な説明】
【００３６】
【図１】プログラマブルコントローラシステムにおけるユーザプログラム開発支援装置及びそれと通信するプログラマブルコントローラを概念的に示す概略構成図である。
【図２】ＰＬＣにおけるＣＰＵユニットのハードウェア構成を示すブロック図である。
【図３】マイクロプロセッサにより実行されるＰＬＣ全体の処理例を示すフローチャートである。
【図４】プロジェクトのファイルのデータ構造を示す模式図である。
【図５】ＰＬＣと通信するユーザプログラム開発支援装置の概略構成を示すシステムブロック図である。
【図６】ユーザプログラムのラダー言語、ＳＴ言語及びＳＦＣ言語がタスクに割り当てられた状態の一例を示す概念図である。
【図７】複数のタスク間で共有するデータに対して二つのユーザプログラムがデータに対して同時にアクセスする場合での排他制御を説明するための概念図である。
【図８】タスク間排他命令及びタスク間排他解除命令を用いたユーザプログラムのＳＴ言語によるプログラム例を説明するための説明図であって、（ａ）は、プログラム処理の概念図であり、（ｂ）は、プログラム処理で使用するテーブルを示す図であり、（ｃ）は、一のタスクでのユーザプログラム及び他のタスクでのユーザプログラムを示す図である。
【図９】複数のタスク間で共有するデータに対して少なくとも二つユーザプログラムが同時にアクセスする場合での排他制御の一例を時系列的に示す概念図である。
【図１０】ＰＬＣにおけるマイクロプロセッサで実行されるユーザプログラムにおけるタスク間排他命令及びタスク間排他解除命令による排他制御の処理の流れを示すフローチャートである。
【図１１】図１０に示す排他制御を説明するための概念図である。
【図１２】二つのタスクのユーザプログラムが同時にアクセスしない場合での排他制御の一例を時系列的に示す概念図である。
【図１３】複数のデータへのアクセスの排他制御のロック及びロック解除を指示するタスク間排他命令及びタスク間排他解除命令による排他制御の一例を時系列的に示す概念図である。
【図１４】同一のユーザプログラム内に記載されたタスク間排他命令及びタスク間排他解除命令のプログラム例を示す概念図である。
【図１５】複数のデータへのアクセスの排他制御のロック及びロック解除を指示するタスク間排他命令及びタスク間排他解除命令のネスティング構造のプログラム例を示す概念図である。
【図１６】タスク間排他命令及びタスク間排他解除命令の同一のロック番号に対するネスティング構造による排他制御の一例を時系列的に示す概念図である。
【図１７】タスクの実行終了時にタスク間排他命令によって排他制御のロック状態にある場合に排他制御のロック状態を強制的に解除する排他制御の一例を時系列的に示す概念図である。
【図１８】図１０に示す排他制御の処理のフローチャートに対して、タスク実行終了時でのロック状態の強制的な解除の処理を加えたフローチャートである。
【図１９】ユーザプログラムがタスク毎に割り当てられる状態を説明するための説明図である。
【図２０】複数のタスク間で共有するデータに対して少なくとも二つのユーザプログラムがアクセスする場合での不都合を説明するための説明図であって、（ａ）は、複数のタスク間で共有するデータに対して二つのユーザプログラムがアクセスする状態を示す図であり、（ｂ）は、二つのタスクのユーザプログラムがデータに順にアクセスする処理例を示す図であり、（ｃ）は、二つのユーザプログラムがデータに同時にアクセスする処理例を示す図である。
【図２１】複数のタスク間で共有するデータに対して少なくとも二つユーザプログラムが同時にアクセスする場合での一のタスクのユーザプログラムへの従来の割込制御を時系列的に示す概念図である。
【発明を実施するための形態】
【００３７】
以下、本発明の実施の形態について添付図面を参照しつつ説明する。なお、以下の実施の形態は、本発明を具体化した例であって、本発明の技術的範囲を限定する性格のものではない。
【００３８】
［プログラマブルコントローラシステムの全体構成］
図１は、プログラマブルコントローラシステム３００におけるユーザプログラム開発支援装置２００及びそれと通信するプログラマブルコントローラ１００を概念的に示す概略構成図である。
【００３９】
図１に示すように、プログラマブルコントローラシステム３００は、プログラマブルコントローラ（以下、「ＰＬＣ」という）１００とユーザプログラム開発支援装置２００（ここではコンピュータ）とを備えている。
【００４０】
プログラマブルコントローラシステム３００において、ＰＬＣ１００は、入出力ユニット１３０で入力した信号をＣＰＵユニット１１０の入出力メモリ１１７（後述する図２参照）に取り込み（ＩＮリフレッシュ）、予め登録されたラダー言語等のＰＬＣ制御用の言語が組まれたユーザプログラムＰ（図２参照）に基づき論理演算を行い（演算実行）、その演算実行結果を入出力メモリ１１７に書き込んで入出力ユニット１３０に送り出し（ＯＵＴリフレッシュ）、その後、いわゆる周辺サービス処理を行うといった一連のサイクリック処理に繰り返し行う。ユーザプログラム開発支援装置２００は、ＰＬＣ１００に通信ケーブルＣＢを介して接続され、ユーザプログラムＰをダウンロードし、ＰＬＣ１００におけるＣＰＵユニット１１０のバックアップメモリ１１４（図２参照）やユーザメモリ１１６（図２参照）に格納させる。また、ユーザプログラム開発支援装置２００は、ＰＬＣ１００に格納されているユーザプログラムＰを修正等する場合には、ＰＬＣ１００に格納されているユーザプログラムＰをアップロードし、必要な修正をした後、修正後のユーザプログラムＰをＰＬＣ１００に再度ダウンロードする。なお、図１において、符号２１０，２１１，２１２，２３０，２３１は、それぞれ、操作入力部、キーボード、ポインティングデバイス、表示出力部及び表示装置を示している。
【００４１】
［ＰＬＣのハードウェア構成］
ＰＬＣ１００は、ＣＰＵ（Central Processing Unit）部分（入出力更新処理、ユーザプログラム実行処理、周辺サービス処理などを司る部分）、入出力回路部分、通信回路部分、各種高機能回路部分等々を単一のハウジングに収容してなるオールインワンタイプのものと、それらの部分をそれぞれ専用のユニットハウジングに収容してなるビルディングブロックタイプのものとが知られている。本発明はいずれのタイプのＰＬＣにも適用できるが、本実施の形態では、ビルディングブロックタイプのものを例にとって以下に説明する。また、本発明は、マルチタスク処理において、同時に一つのタスクしか実行できないシングルコアプロセッサ（以下単にシングルコアという。）による処理の他、複数のタスクを並行して実行するマルチコアプロセッサ（以下単にマルチコアという。）による処理にも適用することができる。
【００４２】
本実施の形態では、ＰＬＣ１００は、ＣＰＵユニット１１０、通信ユニット１２０、複数の入出力ユニット１３０及び電源ユニット１４０を含んで構成されている。
【００４３】
ＣＰＵユニット１１０は、ＰＬＣ１００の全体を統括制御するものであり、後ほど図３に示すフローチャートを参照して説明するように、入出力更新処理、ユーザプログラム実行処理、周辺サービス処理などを実行するように構成される。
【００４４】
通信ユニット１２０は、ＬＡＮ（Local Area Network）等のネットワークを介してユーザプログラム開発支援装置２００との間における通信を制御する他、図示していないが、ＰＬＣ１００に対して他のＰＬＣ又はリモートＩＯターミナル等が接続されている場合には、それらとの間における通信制御にも供される。
【００４５】
入出力ユニット（Ｉ／Ｏユニット）１３０は、外部入出力回路及び図示しない端子台を備えており、この端子台には図示しない光電スイッチ、リミットスイッチ、マイクロスイッチ等々のような各種の外部入力機器とリレー、ランプ、ソレノイド等の各種外部出力機器が配線される。
【００４６】
図２は、ＰＬＣ１００におけるＣＰＵユニット１１０のハードウェア構成を示すブロック図である。
【００４７】
図２に示すように、ＣＰＵユニット１１０は、マイクロプロセッサ（ＭＰＵ）１１１、システムメモリ（ＳＲＯＭ）１１２、バックアップメモリ（ＢＲＯＭ）１１４、ワークメモリ（ＷＲＡＭ）１１５、ユーザメモリ（ＵＲＡＭ）１１６及び入出力メモリ（ＩＯＲＡＭ）１１７を備えている。
【００４８】
マイクロプロセッサ１１１は、ＣＰＵユニット１１０の全体を統括制御するものであり、システムメモリ１１２に格納されたシステムプログラムＳＰを実行することによって、ＣＰＵユニット１１０に必要な各種の機能を実現するように構成されている。
【００４９】
システムメモリ１１２は、この例ではフラッシュメモリなどの不揮発性メモリで構成されており、先に述べたように、マイクロプロセッサ１１１で実行される各種のシステムプログラムＳＰが格納されている。
【００５０】
バックアップメモリ１１４は、フラッシュメモリなどの不揮発性メモリで構成され、電源オフ時にはバッテリが存在しない状態でも内容を保持するように構成されている。バックアップメモリ１１４には、ＰＬＣ１００の制御仕様に対応したユーザプログラムＰが、所定のプログラム言語（例えば、ラダー言語など）にて作成され、マイクロプロセッサ１１１で実行可能なオブジェクトコードに変換されて格納される。
【００５１】
ワークメモリ１１５は、マイクロプロセッサ１１１がシステムメモリ１１２から読み出されたシステムプログラムＳＰを実行する際のワークエリアとして機能するものであり、書き換え可能なＲＡＭで構成されている。
【００５２】
ユーザメモリ１１６は、ユーザプログラムＰの実行用メモリとされている。ユーザメモリ１１６は、揮発性メモリとして作用するスタティックＲＡＭ（Static Random Access Memory）で構成されており、電源オフ時には内容を保持することができない。ユーザメモリ１１６には、電源が投入されたときに、バックアップメモリ１１４から転送されたユーザプログラムＰが格納される。
【００５３】
入出力メモリ１１７は、マイクロプロセッサ１１１がユーザメモリ１１６から読み出されたユーザプログラムＰを実行する際に参照するものであり、その内部には、ＩＯバス１１８を介して接続された入出力ユニット１３０（図１参照）の入出力端子のデータと対応する入出力データエリア、内部演算のみに使用される補助リレーエリア、演算途中で使用される各種の設定データ、カウントデータ等を格納するデータエリアの他に、特殊補助リレーエリアが設けられている。なお、これらのデータへのアクセスの排他制御については、図２に示す排他制御手段Ｑｂ１、排他制御解除手段Ｑｂ２及び強制解除手段Ｑｂ３と共に後ほど説明する。
【００５４】
［ＰＬＣ全体の処理例］
次に、マイクロプロセッサ１１１により実行されるＰＬＣ１００全体の処理について図３を参照しながら以下に説明する。
【００５５】
図３は、マイクロプロセッサ１１１により実行されるＰＬＣ１００全体の処理例を示すフローチャートである。
【００５６】
図３に示すように、ＰＬＣ１００の状態の変化は、電源投入時、動作モード変更時、ユーザプログラム開発支援装置２００からＰＬＣ１００へのダウンロード時等に発生する。すなわち、ＰＬＣ１００では、電源投入（Ｐｏｗｅｒ Ｏｎ）により処理が開始されると、まず、各種のフラグやレジスタ類の初期設定を行うために初期化処理を実行し、その後「運転可能状態」に移行する。「運転可能状態」において動作モードは、ユーザプログラム開発支援装置２００から到来するリクエストにより「プログラムモード」と「運転モード」との間で変更される。なお、電源投入時には、予め設定された動作モードが実行される。「プログラムモード」では、ＰＬＣ１００のシステム設定などを転送したり、ユーザプログラムＰのＰＬＣ１００へのダウンロードやＰＬＣ１００からのアップロードを行ったり、入出力テーブルを作成したり、入力（ＩＮ）リフレッシュ、出力（ＯＵＴ）リフレッシュを行ったりする処理を実行する。一方、「運転モード」では、入力更新処理や出力更新処理を実行したり、ユーザメモリ１１６からユーザプログラムＰを構成するオブジェクトコードの各命令を順次に読み出し、読み出した命令を、入出力メモリ１１７の入出力データを参照して実行し、その実行結果に基づいて入出力データの書き換えを行う各命令対応処理を実行したり、ユーザプログラム開発支援装置２００と適宜やり取りを行うことによって、ユーザプログラム開発支援装置２００から到来するリクエストに対応した様々な処理を実行したりする。
【００５７】
そして、「運転モード」においてユーザプログラムＰがマルチタスク処理として実行される。シングルコアでは、マルチタスク処理を逐次実行する一方、マルチコアでは、マルチタスク処理を並列実行する。具体的には、複数のタスクをタスクＡ，Ｂ，Ｃとする場合において、タスクＡをタスクＢ及びタスクＣよりも優先的に実行する場合には、所定の最短周期（例えば１ｍｓ）の第１周期でユーザプログラムを実行することができる。例えば、タスクＡは、１回分の制御サイクル（１ｍｓの時間間隔）を実行サイクルとすることができる。また、タスクＢをタスクＣよりも優先的に実行する場合には、第１周期よりも大きい周期（例えば２ｍｓ）の第２周期でユーザプログラムを実行することができる。例えば、タスクＢは、２回分の制御サイクル（２ｍｓの時間間隔）を実行サイクルとすることができる。また、タスクＣをタスクＡ及びタスクＢよりも劣後して実行する場合には、第２周期よりも大きい周期（例えば４ｍｓ）の第３周期でユーザプログラムを実行することができる。例えば、タスクＣは、４回分の制御サイクル（４ｍｓの時間間隔）を実行サイクルとすることができる。そして、タスクＡ、タスクＢ及びタスクＣを並行に実行する場合には、タスクＡを第１周期で、タスクＢを第２周期で、タスクＣを第３周期で並行に実行することができる。なお、優先度の高いタスクの周期を小さくする場合を例示したが、優先度と周期とは依存関係はなく、周期は優先度の低いタスクに比べ優先度の高いタスクの方が大きい場合もある。
【００５８】
［ユーザプログラム開発支援装置のハードウェア構成］
ユーザプログラム開発支援装置２００は、既述したように、本実施の形態では、ユーザプログラムＰの作成、編集、ＰＬＣ１００へのダウンロード、ＰＬＣ１００からのアップロード、その他各種のパラメータ設定又は変更などに供される。
【００５９】
一般に、この種のユーザプログラム開発支援装置２００は、パーソナルコンピュータ等の通信機能を備えたコンピュータに所定のプログラムを格納（インストール）することにより構成される。
【００６０】
ユーザプログラム開発支援装置２００を用いてユーザプログラムＰを作成する場合、複数のユーザプログラムＰ（Ｐ１〜Ｐｎ）（後述する図４及び図５参照）からなるユーザプログラム全体の情報を１つのプロジェクトＰＲとして管理する構成とされている。なお、ｎは２以上の整数である。
【００６１】
プロジェクトＰＲのファイルデータ（以下、単にファイルという）には、複数のユーザプログラムＰ（Ｐ１〜Ｐｎ）からなるユーザプログラム全体が変数（データ）などの情報と共に保存される。ユーザプログラム全体が保存されたプロジェクトＰＲのファイルは、ハードディスク装置２２４（後述する図５参照）に格納される。
【００６２】
図４は、プロジェクトＰＲのファイルのデータ構造を示す模式図である。図４に示すプロジェクトＰＲのファイルは、複数のユーザプログラムＰ１〜Ｐｎからなるユーザプログラム全体及び変数テーブル、ＰＬＣシステム設定、Ｉ／Ｏテーブル、Ｉ／Ｏメモリデータなどの他の設定データを含んでいる。
【００６３】
ユーザプログラム開発支援装置２００は、ＰＬＣ１００と通信し、ＰＬＣ１００上で実行させるユーザプログラムＰ（Ｐ１〜Ｐｎ）を作成、編集してオブジェクトコードに変換する機能を有している。
【００６４】
図５は、ＰＬＣ１００と通信するユーザプログラム開発支援装置２００の概略構成を示すシステムブロック図である。
【００６５】
図５に示すように、ユーザプログラム開発支援装置２００は、操作入力部２１０（図１も参照）と、記憶部２２０と、表示出力部２３０（図１も参照）と、通信部２４０と、制御部２５０と、読み取り部２６０とを備えている。
【００６６】
操作入力部２１０は、キーボード２１１やポインティングデバイス２１２等の入力装置を備えており、制御部２５０の入力系に接続されている。操作入力部２１０は、ユーザによる入力操作を受け付けて入力された操作情報を制御部２５０に送信する構成とされている。
【００６７】
記憶部２２０は、ＲＯＭ２２１、ＲＡＭ２２２、フラッシュメモリ等のデータ書き換え可能な不揮発性メモリ２２３等の記憶装置及びこれも不揮発性メモリとして作用するハードディスク装置２２４等の大容量記憶装置を備えている。なお、ハードディスク装置２２４には、後述するユーザプログラム開発支援用プログラムＢＰが記録されたＣＤ（Compact Disc）−ＲＯＭ等の記録媒体Ｍを読み出す読み取り部２６０によって読み出されたユーザプログラム開発支援用プログラムＢＰを含むソフトウェアが予め格納（インストール）されている。また、記録媒体Ｍは、ＵＳＢ（Universal Serial Bus）メモリやＳＤ（Secure Digital）メモリカードであってもよい。
【００６８】
表示出力部２３０は、液晶表示パネルやＥＬ（Electro Luminescence）表示パネル等の表示装置２３１を備えており、制御部２５０の出力系に接続されている。表示装置２３１は、制御部２５０からの出力表示情報を表示画面に表示する構成とされている。なお、表示装置２３１における表示画面には、タッチパネル等のタッチ入力操作装置が設けられていてもよい。タッチ入力操作装置は、表示画面に表示される画面の表示状態に応じた入力操作を行うことができ、操作入力部として作用する構成とされる。
【００６９】
通信部２４０は、インターフェイス部２４１（具体的にはＬＡＮポート）を有しており、通信ケーブルＣＢ（具体的にはＬＡＮケーブル）を介して制御部２５０とＰＬＣ１００における通信ユニット１２０（図１参照）との間でデータの通信ができるようになっている。なお、ＰＬＣ１００及びユーザプログラム開発支援装置２００は、例えば、ＵＳＢポートやＲＳ２３２Ｃなどのシリアルインターフェイスを介して相互に接続されるようになっていてもよい。
【００７０】
制御部２５０は、ＣＰＵ等の演算処理装置で構成されており、記憶部２２０のハードディスク装置２２４に予め格納されたユーザプログラム開発支援用プログラムＢＰ等のソフトウェアプログラムを記憶部２２０のＲＡＭ２２２上にロードして実行することにより、各種の処理を行うようになっている。記憶部２２０のＲＡＭ２２２は、制御部２５０に対して作業用のワークエリアを提供する。
【００７１】
［ユーザプログラム開発支援装置のソフトウェア構成］
そして、ユーザプログラム開発支援装置２００における制御部２５０は、変換手段Ｑａ（具体的にはコンパイル手段）として機能する。すなわち、ユーザプログラム開発支援用プログラムＢＰは、変換手段Ｑａに対応する変換ステップを制御部２５０に実行させる。
【００７２】
（変換ステップ）
変換ステップでは、複数のタスク間で共有するデータに対してアクセスする構成とされたユーザプログラムＰを実行するＰＬＣ１００のユーザプログラムＰをＰＬＣ１００で実行可能なオブジェクトコードに変換（具体的にはコンパイル）する。
【００７３】
変換ステップは、本実施の形態では、ユーザプログラムＰのラダー言語、ＳＴ（ストラクチャード・テキスト）言語、ＳＦＣ（シーケンシャル・ファンクション・チャート）言語をオブジェクトコードに変換する。ここで、オブジェクトコードは、ＰＬＣ１００におけるマイクロプロセッサ１１１に理解できる言語（マシン語）で記述されたプログラムのコードである。具体的には、変換ステップは、ユーザプログラムＰがラダー言語である場合には、ラダー言語に対応するコンパイル処理（コンパイラ）によってラダー言語をオブジェクトコードに変換し、ユーザプログラムＰがＳＴ言語である場合には、ＳＴ言語に対応するコンパイル処理（コンパイラ）によってＳＴ言語をオブジェクトコードに変換し、ユーザプログラムＰがＳＦＣ言語である場合には、ＳＦＣ言語に対応するコンパイル処理（コンパイラ）によってＳＦＣ言語をオブジェクトコードに変換する。
【００７４】
そして、変換ステップは、ユーザプログラムＰのラダー言語、ＳＴ言語及びＳＦＣ言語から、対応するコンパイラによって変換されたユーザプログラムＰのオブジェクトコードを実行単位としてのタスクに割り当てる。
【００７５】
図６は、ユーザプログラムＰ１〜Ｐｎのラダー言語、ＳＴ言語及びＳＦＣ言語がタスクＴ１〜Ｔｎに割り当てられた状態の一例を示す概念図である。
【００７６】
図６に示すように、ユーザプログラム開発支援装置２００では、ユーザプログラムＰをラダー言語、ＳＴ言語又はＳＦＣ言語で記述することが可能であり、これにより、ユーザがラダー言語、ＳＴ言語及びＳＦＣ言語の何れかの言語を適宜使い分けることによって、処理に応じて最適な言語を使用することが可能となる。ユーザプログラムＰ１〜Ｐｎは、オブジェクトコードに変換されてタスクＴ１〜Ｔｎに割り当てられる。なお、本実施の形態では、１つのタスクに、１つのユーザプログラムを指定しているが、１つのタスクに、複数のユーザプログラムを指定してもよい。
【００７７】
こうして作成されたユーザプログラムＰは、コンパイラによって、ＰＬＣ１００におけるマイクロプロセッサ１１１で実行可能なオブジェクトコードに変換され、変換されたユーザプログラムＰのオブジェクトコードは、ＰＬＣ１００へダウンロードされ、マイクロプロセッサ１１１（図２参照）で実行される。
【００７８】
（データへのアクセスの排他制御）
次に、複数のタスクＴ１〜Ｔｎ（後述する図７参照）間で共有するデータＤに対して少なくとも二つのユーザプログラムがデータＤに対して同時にアクセスする場合でのデータＤへのアクセスの排他制御について以下に説明する。
【００７９】
複数のタスクＴ１〜Ｔｎ間で共有するデータＤに対してアクセスする構成とされたユーザプログラムＰを実行するＰＬＣ１００の制御方法は、複数のタスクＴ１〜Ｔｎのうち、一のタスクのユーザプログラムがデータＤにアクセスを開始する前に、他のタスクのユーザプログラムの実行を排他する排他制御のロックを指示するタスク間排他命令（Ｌｏｃｋ）によって排他制御のロックを開始する排他制御ステップと、一のタスクのユーザプログラムがデータＤへのアクセスを終了した後に排他制御のロック状態の解除を指示するタスク間排他解除命令（Ｕｎｌｏｃｋ）によって排他制御のロック状態を解除する排他制御解除ステップとを実施する。詳しくは、ＰＬＣ１００におけるマイクロプロセッサ１１１は、ユーザプログラムＰに記述されたタスク間排他命令（Ｌｏｃｋ）によって排他制御のロックを開始する排他制御手段Ｑｂ１（図２参照）、及び、ユーザプログラムＰに記述されたタスク間排他解除命令（Ｕｎｌｏｃｋ）によって排他制御のロック状態を解除する排他制御解除手段Ｑｂ２（図２参照）として機能する。すなわち、システムプログラムＳＰは、排他制御手段Ｑｂ１に対応する排他制御ステップと、排他制御解除手段Ｑｂ２に対応する排他制御解除ステップとをマイクロプロセッサ１１１に実行させる。なお、ここでは、複数のタスクＴ１〜Ｔｎのうち、一のタスクＴ３のユーザプログラムＰ３及び他の優先度の高いタスクＴ２のユーザプログラムＰ２を例にとって説明する。
【００８０】
図７は、複数のタスクＴ１〜Ｔｎ間で共有するデータＤに対して二つのユーザプログラムＰ２，Ｐ３がデータＤに対して同時にアクセスする場合での排他制御を説明するための概念図である。
【００８１】
図７に示すように、ユーザプログラムＰ２，Ｐ３は、タスクＴ１〜Ｔｎ間で共有するデータＤへのアクセスの排他制御が必要な処理の区間に限定して、排他制御を実行できる命令として、タスク間排他命令Ｌｏｃｋ（１）と、タスク間排他解除命令Ｕｎｌｏｃｋ（１）とを含んでいる。本実施の形態では、タスク間排他命令Ｌｏｃｋ（１）及びタスク間排他解除命令Ｕｎｌｏｃｋ（１）には、データＤに対応させて識別符号（具体的にはロック番号１）が付されている。
【００８２】
タスク間排他命令Ｌｏｃｋ（１）及びタスク間排他解除命令Ｕｎｌｏｃｋ（１）は、本実施の形態では、ラダー言語及びＳＴ言語に適用されている。
【００８３】
タスク間排他命令Ｌｏｃｋ（１）は、他のタスクのユーザプログラムの実行を排他して該ユーザプログラムによるデータＤへのアクセスの排他制御のためにデータＤへのアクセスを受け付けない排他制御をロックする。タスク間排他解除命令Ｕｎｌｏｃｋ（１）は、他のタスクのユーザプログラムの実行の排他を解除してデータＤへのアクセスの排他制御のためのロック状態を解除する。タスク間排他命令Ｌｏｃｋ（１）及びタスク間排他解除命令Ｕｎｌｏｃｋ（１）は、互いに組み合わせて使用する。
【００８４】
そして、ＰＬＣ１００において、排他制御ステップは、複数のタスクＴ１〜Ｔｎのうち何れかのタスク（例えばＴ３）のユーザプログラム（例えばＰ３）のタスク間排他命令Ｌｏｃｋ（１）によってデータＤへのアクセス開始前に他のタスク（例えばＴ２）のユーザプログラム（例えばＰ２）の実行を排他してユーザプログラム（例えばＰ２）によるデータＤへのアクセスの排他制御をロックし、排他制御解除ステップは、ユーザプログラム（例えばＰ３）のタスク間排他解除命令Ｕｎｌｏｃｋ（１）によってユーザプログラム（例えばＰ３）の実行の排他を解除してデータＤへのアクセス終了後に排他制御のロック状態を解除する。
【００８５】
図８は、タスク間排他命令Ｌｏｃｋ（１）及びタスク間排他解除命令Ｕｎｌｏｃｋ（１）を用いたユーザプログラムＰ２，Ｐ３のＳＴ言語によるプログラム例を説明するための説明図である。図８（ａ）は、プログラム処理の概念図を示しており、図８（ｂ）は、プログラム処理で使用するテーブルを示しており、図８（ｃ）は、一のタスクＴ３でのユーザプログラムＰ３及び他のタスクＴ２でのユーザプログラムＰ２を示している。
【００８６】
図８に示す例では、ユーザプログラムＰ２及びユーザプログラムＰ３は、それぞれ、タスクＴ２及びタスクＴ３で動作する。データＤの一例であるグローバル変数ＧＴａｂｌｅ１にタスクＴ２のユーザプログラムＰ２及びタスクＴ３のユーザプログラムＰ３からアクセスするにあたって、ユーザプログラムＰ２でＧＴａｂｌｅ１にレコードを追加し、ユーザプログラムＰ３でＧＴａｂｌｅ１の最新レコードを取り出す（図８（ａ）参照）。
【００８７】
データ型テーブルの「ＵＳＥＲ＿ＴＡＢＬＥ」には、メンバーとしてデータ型がＩＮＴ（整数）の「ｉｎｄｅｘ」と、データ型がＬＲＥＡＬ（倍長浮動小数点数）の「Ｒｅｃｏｒｄ［０．．９９］」とが含まれており、変数テーブルの「ＧＴａｂｌｅ１」が「ＵＳＥＲ＿ＴＡＢＬＥ」とされている（図８（ｂ）参照）。
【００８８】
そして、タスクＴ２では「ＧＴａｂｌｅ１」にレコードを追加するユーザプログラムＰ２が実行され、また、タスクＴ３では「ＧＴａｂｌｅ１」から最新レコードを取り出すユーザプログラムＰ３が実行される（図８（ｃ）参照）。
【００８９】
図９は、複数のタスクＴ１〜Ｔｎ間で共有するデータＤに対して少なくとも二つユーザプログラムが同時にアクセスする場合での排他制御の一例を時系列的に示す概念図である。なお、図９において、「斜線」は、排他制御が必要な区間を表しており、「二重線」は、ユーザプログラムＰ１〜Ｐｎの実行完了を表している。
【００９０】
図９に示すように、タスク間排他命令Ｌｏｃｋ（１）は、タスクＴ３のユーザプログラムＰ３がデータＤ（図７参照）にアクセスを開始する前に、ユーザプログラムＰ３によるデータＤへのアクセスより遅れてデータＤにアクセスする他のタスクＴ２のユーザプログラムＰ２の実行を排他してユーザプログラムＰ２によるデータＤへのアクセスを受け付けない排他制御の開始（排他制御のロック）を指示する。また、タスク間排他解除命令Ｕｎｌｏｃｋ（１）は、タスクＴ３のユーザプログラムＰ３がデータＤへのアクセスを終了した後に、他のタスクＴ２のユーザプログラムＰ２によるデータＤへのアクセスを受け付けない排他制御の終了（排他制御のロック状態の解除）を指示する。こうすることで、二つのユーザプログラムＰ２，Ｐ３の双方が同時にデータＤにアクセスしても、データＤが正確に処理されないといった不都合を回避することが可能となる。
【００９１】
具体的には、タスクＴ３のユーザプログラムＰ３において、タスク間排他命令Ｌｏｃｋ（１）の実行時に指定したロック番号（具体的には１）がロック状態ならば、他のタスクＴ２のユーザプログラムＰ２は、そのロック番号（具体的には１）のロックが解除されるまで、データＤへのアクセスを待つ。すなわち、タスクＴ３のユーザプログラムＰ３でタスク間排他命令Ｌｏｃｋ（１）によるデータＤへのアクセスの排他制御が先に指定され、後に他のタスクＴ２のユーザプログラムＰ２でタスク間排他命令Ｌｏｃｋ（１）によるデータＤへのアクセスの排他制御が指定されると、タスクＴ３のユーザプログラムＰ３でタスク間排他解除命令Ｕｎｌｏｃｋ（１）によるデータＤへのアクセスの排他制御のロック解除が指定されるまでは、タスクＴ２のユーザプログラムＰ２でのタスク間排他命令Ｌｏｃｋ（１）によるデータＤへのアクセスが行えず、その間、タスクＴ２のユーザプログラムＰ２でのタスク間排他命令Ｌｏｃｋ（１）によるデータＤへのアクセスの排他制御のみが待たされる。
【００９２】
つまり、他のタスクＴ２のユーザプログラムＰ２は、割込制御が禁止されていないので、タスクＴ２のユーザプログラムＰ２によるデータＤへのアクセス開始から、タスクＴ３のユーザプログラムＰ３のタスク間排他解除命令Ｕｎｌｏｃｋ（１）までの区間β１でデータＤへのアクセスに関与しない処理を行える。ユーザプログラムＰ２は、ユーザプログラムＰ２のタスク間排他命令Ｌｏｃｋ（１）とユーザプログラムＰ３のタスク間排他解除命令Ｕｎｌｏｃｋ（１）との間の区間γでデータＤへのアクセスに関与する処理が待たされるものの、区間β１ではデータＤへのアクセスに関与しない処理は待たされることがない。よって、ユーザプログラムＰ２は、区間β１においてデータＤへのアクセスに関与しない処理が遅延することがなく、これにより、高精度性（定時性）が要求されるＩ／Ｏリフレッシュに影響を与えることがなく、しかも、データＤへのアクセスに関与しないユーザプログラムを実行できるので、タスクＴ３の実行により、他のタスクＴ２のユーザプログラムの実行がタスク周期内に完了しないというケースを少なくすることができる。
【００９３】
ここで、区間β１においては、タスクＴ３のユーザプログラムＰ３によるデータＤへのアクセスに関与する処理は優先的に行える一方で、タスクＴ３のユーザプログラムＰ３によるデータＤへのアクセスに関与しない処理について、例えばシングルコアによる処理ではタスクＴ２のユーザプログラムＰ２によるデータＤへのアクセスに関与しない処理が優先されるために待ち状態となる。なお、例えばマルチコアによる処理を行う場合には、区間β１においてタスクＴ２のユーザプログラムＰ２によるデータＤへのアクセスに関与しない処理と、タスクＴ３のユーザプログラムＰ３によるデータＤへのアクセスに関与しない処理とが並行して処理される。
【００９４】
図１０は、ＰＬＣ１００におけるマイクロプロセッサ１１１で実行されるユーザプログラムＰにおけるタスク間排他命令Ｌｏｃｋ（１）及びタスク間排他解除命令Ｕｎｌｏｃｋ（１）による排他制御の処理の流れを示すフローチャートである。また、図１１は、図１０に示す排他制御を説明するための概念図である。
【００９５】
図１０に示すタスク間排他命令Ｌｏｃｋ（１）及びタスク間排他解除命令Ｕｎｌｏｃｋ（１）による排他制御の処理では、先ず、複数のタスクＴ１〜Ｔｎのうち、一のタスク（例えばＴ３）のユーザプログラム（例えばＰ３）がデータＤにアクセスするにあたり、処理Ｓ１１では、命令を読み出し、処理Ｓ１２では、処理Ｓ１１で読み出した命令を認識し、処理Ｓ１３では、他のタスク（例えばＴ２）のユーザプログラム（例えばＰ２）の実行を排他してデータＤへのアクセスを受け付けない排他制御のロック中か否かを判断する。処理Ｓ１４では、排他制御のロック中とし、処理Ｓ１５では、排他制御のロック中の他のタスク（例えばＴ２）のユーザプログラム（例えばＰ２）をタスク間排他解除命令Ｕｎｌｏｃｋ（１）まで実行する。また、処理Ｓ１６では、排他制御のロック待ちがあるか否かを判断し、処理Ｓ１７では、他のタスク（例えばＴ２）のユーザプログラム（例えばＰ２）の実行の排他を解除してユーザプログラム（例えばＰ２）によるデータＤへのアクセスの排他制御のロック状態を解除する。そして、処理Ｓ１８では、全命令実行が完了か否かを判断する。
【００９６】
ところで、タスクは、周期的に実行される周期実行型タスクと、何らかのイベントが発生したときに実行されるイベント実行型タスクとに大別されるが、周期実行型タスクは、最小単位の周期（制御サイクル）でかつ最も優先度が高い定周期タスクを含んでいる。周期実行型タスクでは、ＩＮリフレッシュ／ＯＵＴリフレッシュを定期的に行う。このことから、周期実行型タスクは、高速で高精度（定時的）な処理が要求される。すなわち、優先度が高いタスクほど、高速で高精度な処理が求められる。一方、イベント実行型タスクは、タスクの実行条件が成立したときに１回だけ実行するイベントタスクを含んでいる。イベント実行型タスクでは、発生したイベントに対する応答性能が要求される。
【００９７】
この点に関し、従来の割込制御では、図２１に示すように、他のタスクＴ１のユーザプログラムＰ１は、割込制御が禁止されている間、区間αでデータＤへアクセスしない（データＤへのアクセスに関与しない処理を行える）にも拘わらず、全体の処理が（データＤへアクセスする処理だけでなく、データＤへのアクセスに関与しない処理も）待たされる。これに対し、本実施の形態では、タスク間排他命令Ｌｏｃｋ（１）及びタスク間排他解除命令Ｕｎｌｏｃｋ（１）を用いることで、図２１に示すユーザプログラムＰ１は、区間αにおいてデータＤへのアクセスに関与しない処理が遅延することがなく、これにより、図２１に示す区間αでの他のタスクＴ１のユーザプログラムＰ１によるデータＤへのアクセスに関与しない処理の高速性及び高精度性を維持することができる。
【００９８】
以上説明したように、本実施の形態によると、例えば、一のタスクＴ３のユーザプログラムＰ３がデータＤにアクセスを開始する前に他のタスクＴ２のユーザプログラムＰ２に対して割込制御を禁止しなくても、タスク間排他命令Ｌｏｃｋ（１）によって、タスクＴ３のユーザプログラムＰ３がデータＤにアクセスを開始する前に、他のタスクＴ２のユーザプログラムＰ２の実行を排他してデータＤへのアクセスを受け付けない排他制御をロックし、タスク間排他解除命令Ｕｎｌｏｃｋ（１）によって、タスクＴ３のユーザプログラムＰ３がデータＤへのアクセスを終了した後に、他のタスクＴ２のユーザプログラムＰ２の実行の排他を解除してデータＤへのアクセスの排他制御のロック状態を解除することで、タスクＴ３のユーザプログラムＰ３が先にデータＤにアクセスするときでも、他のタスクＴ２のユーザプログラムＰ２によるデータＤへのアクセスに関与しない処理が待たされることがないようにすることができる。すなわち、他のタスクＴ２のユーザプログラムＰ２によるデータＤへのアクセスに関与しない処理の遅延をなくすことができ、これにより、他のタスクＴ２のユーザプログラムＰ２によるデータＤへのアクセスに関与しない処理の高速性及び高精度性を維持することが可能となる。
【００９９】
なお、二つのタスク（例えばＴ２，Ｔ３）のユーザプログラム（例えばＰ２，Ｐ３）が同時にアクセスしない場合には次のような排他制御を行う。
【０１００】
図１２は、二つのタスクＴ２，Ｔ３のユーザプログラムＰ２，Ｐ３が同時にアクセスしない場合での排他制御の一例を時系列的に示す概念図である。なお、図１２において、「斜線」は、指定したロック番号でロックしている区間を示している。
【０１０１】
図１２に示すように、タスクＴ２のユーザプログラムＰ２は、タスクＴ３のユーザプログラムＰ３によるタスク間排他命令Ｌｏｃｋ（１）実行時に指定したロック番号（具体的には１）がタスク間排他解除命令Ｕｎｌｏｃｋ（１）によって排他制御のロック状態が解除され、排他制御がロック状態でない場合には、タスク間排他命令Ｌｏｃｋ（１）によってロック状態にしてデータＤへアクセスする。そして、タスクＴ２のユーザプログラムＰ２は、データＤへアクセスした後、タスク間排他解除命令Ｕｎｌｏｃｋ（１）によってロック状態を解除する。
【０１０２】
（複数のデータへのアクセスの排他制御）
本実施の形態では、データＤは、複数のデータＤ１〜Ｄｍ（ｍは２以上の整数）とされている。タスク間排他命令Ｌｏｃｋ（ｉ）及びタスク間排他解除命令Ｕｎｌｏｃｋ（ｉ）は、それぞれ、他のタスクのユーザプログラムの実行の排他による複数のデータＤ１〜Ｄｍへのアクセスの排他制御のロック及びロック状態の解除（ロック解除）を指示するものとされている。なお、ｉは１〜ｍの整数である。タスク間排他命令Ｌｏｃｋ（ｉ）及びタスク間排他解除命令Ｕｎｌｏｃｋ（ｉ）には、互いに異なる複数種類のデータＤ１〜Ｄｍに対応させて一意の（ユニークな）識別符号（具体的にはロック番号１〜ｍ）が付されている。さらに説明すると、タスク間排他命令Ｌｏｃｋ（１）が指定されると、他のタスクのユーザプログラムの実行を排他してデータＤ１へのアクセスの排他制御をロックし、タスク間排他解除命令Ｕｎｌｏｃｋ（１）が指定されると、他のタスクのユーザプログラムの実行の排他を解除してデータＤ１へのアクセスの排他制御のロック状態を解除する。また、タスク間排他命令Ｌｏｃｋ（２）が指定されると、データＤ２へのアクセスの排他制御をロックし、タスク間排他解除命令Ｕｎｌｏｃｋ（２）が指定されると、他のタスクのユーザプログラムの実行の排他を解除してデータＤ２へのアクセスの排他制御のロック状態を解除する。以降のロック番号３〜ｍのタスク間排他命令Ｌｏｃｋ（３）〜Ｌｏｃｋ（ｍ）及びタスク間排他解除命令Ｕｎｌｏｃｋ（３）〜Ｕｎｌｏｃｋ（ｍ）についても、対応するデータＤ３〜Ｄｍに対して同様に作用させることができる。
【０１０３】
そして、変換ステップ並びに排他制御ステップ及び排他制御解除ステップは、タスク間排他命令Ｌｏｃｋ（ｉ）及びタスク間排他解除命令Ｕｎｌｏｃｋ（ｉ）に付したロック番号１〜ｍにより、複数のデータＤ１〜Ｄｍへのアクセスの排他制御のうち何れのデータへのアクセスの排他制御であるかを区別する。すなわち、タスク間排他命令Ｌｏｃｋ（ｉ）とタスク間排他解除命令Ｕｎｌｏｃｋ（ｉ）との間に挟まれたデータが排他制御の対象となるデータとなる。ここでは、タスクＴ３のユーザプログラムＰ３がデータＤ２へアクセスし、他のタスクＴ２のユーザプログラムＰ２がデータＤ１へアクセスする場合を例にとって説明する。
【０１０４】
図１３は、複数のデータＤ１，Ｄ２へのアクセスの排他制御のロック及びロック解除を指示するタスク間排他命令Ｌｏｃｋ（１），Ｌｏｃｋ（２）及びタスク間排他解除命令Ｕｎｌｏｃｋ（１），Ｕｎｌｏｃｋ（２）による排他制御の一例を時系列的に示す概念図である。なお、図１３において、「斜線」は、指定したロック番号でロックしている区間を示している。
【０１０５】
変換ステップ並びに排他制御ステップ及び排他制御解除ステップは、図１３に示すように、タスク間排他命令Ｌｏｃｋ（１），Ｌｏｃｋ（２）及びタスク間排他解除命令Ｕｎｌｏｃｋ（１），Ｕｎｌｏｃｋ（２）をそれぞれタスクＴ２，Ｔ３間で共有するデータＤ１，Ｄ２へのアクセスの排他制御をロック番号ごとに別々に区別することができる。そして、複数のデータＤ１，Ｄ２に対応する用途ごとにロック番号１，２を割り当てる。
【０１０６】
図１３の例では、タスクＴ２のユーザプログラムＰ２は、アクセスするデータＤ１に対応して、タスク間排他命令及びタスク間排他解除命令がそれぞれＬｏｃｋ（１）及びＵｎｌｏｃｋ（１）とされている。また、タスクＴ３のユーザプログラムＰ３は、アクセスするデータＤ２に対応して、タスク間排他命令及びタスク間排他解除命令がそれぞれＬｏｃｋ（２）及びＵｎｌｏｃｋ（２）とされている。タスクＴ２のユーザプログラムＰ２によるデータＤ１へのアクセスは、ロック番号がタスクＴ３のユーザプログラムＰ３のロック番号とは異なるので、タスクＴ３のユーザプログラムＰ３によるデータＤ２へのアクセス排他制御のロック状態の場合でも、該排他制御のロック解除を待たず（該排他制御のロック状態に関係なく）行うことができる。
【０１０７】
このような排他制御では、タスク間排他命令（例えばＬｏｃｋ（１），Ｌｏｃｋ（２））及びタスク間排他解除命令（例えばＵｎｌｏｃｋ（１），Ｕｎｌｏｃｋ（２））は、それぞれ、複数のデータ（例えばＤ１，Ｄ２）へのアクセスの排他制御のロック及びロック解除を指示するものであるので、ユーザによるユーザプログラム（例えばＰ２，Ｐ３）の作成において複数のデータ（例えばＤ１，Ｄ２）に対応する用途ごとに別々に排他制御を行うことが可能となる。また、タスク間排他命令（例えばＬｏｃｋ（１），Ｌｏｃｋ（２））及びタスク間排他解除命令（例えばＵｎｌｏｃｋ（１），Ｕｎｌｏｃｋ（２））に複数のデータ（例えばＤ１，Ｄ２）に対応させて付してあるロック番号（例えば１，２）にて複数のデータ（例えばＤ１，Ｄ２）へのアクセスの排他制御のうち、何れのデータへのアクセスの排他制御であるかを区別するので、タスク間排他命令（例えばＬｏｃｋ（１），Ｌｏｃｋ（２））及びタスク間排他解除命令（例えばＵｎｌｏｃｋ（１），Ｕｎｌｏｃｋ（２））に対応するそれぞれのデータ（例えばＤ１，Ｄ２）に対する排他制御を確実に行うことが可能となる。
【０１０８】
なお、同一のユーザプログラム（例えばＰ１）内において異なるロック番号（例えば３，４）のタスク間排他命令（例えばＬｏｃｋ（３），Ｌｏｃｋ（４））及びタスク間排他解除命令（例えばＵｎｌｏｃｋ（３），Ｕｎｌｏｃｋ（４））を指定してもよい。
【０１０９】
図１４は、同一のユーザプログラムＰ１内に記載されたタスク間排他命令Ｌｏｃｋ（３），Ｌｏｃｋ（４）及びタスク間排他解除命令Ｕｎｌｏｃｋ（３），Ｕｎｌｏｃｋ（４）のプログラム例を示す概念図である。
【０１１０】
図１４に示すように、ユーザプログラムＰ１では、データＤ３，Ｄ４に対応して異なるロック番号３，４のタスク間排他命令Ｌｏｃｋ（３），Ｌｏｃｋ（４）及びタスク間排他解除命令Ｕｎｌｏｃｋ（３），Ｕｎｌｏｃｋ（４）を指定することができる。
【０１１１】
（ネスティング構造による排他制御）
また、本実施の形態では、複数のデータＤ１〜Ｄｍへのアクセスの排他制御のロック及びロック解除を指示するタスク間排他命令Ｌｏｃｋ（ｉ）及びタスク間排他解除命令Ｕｎｌｏｃｋ（ｉ）は、対応関係にあるタスク間排他命令（例えばＬｏｃｋ（１））及びタスク間排他解除命令（例えばＵｎｌｏｃｋ（１））の間に、他の対応関係にあるタスク間排他命令（例えばＬｏｃｋ（２））及びタスク間排他解除命令（例えばＵｎｌｏｃｋ（２））が入るネスティング構造を構成する。すなわち、ユーザプログラム開発支援装置２００では、変換ステップによりネスティング構造を構成するユーザプログラムがオブジェクトコードに変換され、ＰＬＣ１００では、変換されたユーザプログラムのオブジェクトコードにより排他制御ステップ及び排他制御解除ステップが実行される。
【０１１２】
図１５は、複数のデータＤ１，Ｄ２へのアクセスの排他制御のロック及びロック解除を指示するタスク間排他命令Ｌｏｃｋ（１），Ｌｏｃｋ（２）及びタスク間排他解除命令Ｕｎｌｏｃｋ（１），Ｕｎｌｏｃｋ（２）のネスティング構造のプログラム例を示す概念図である。
【０１１３】
図１５の例では、タスクＴ１のユーザプログラムＰ１におけるタスク間排他命令Ｌｏｃｋ（１）及びタスク間排他解除命令Ｕｎｌｏｃｋ（１）の中に、タスクＴ２のユーザプログラムＰ２におけるタスク間排他命令Ｌｏｃｋ（２）及びタスク間排他解除命令Ｕｎｌｏｃｋ（２）が挿入されている。
【０１１４】
このような排他制御では、タスク間排他命令（例えばＬｏｃｋ（１），Ｌｏｃｋ（２））及びタスク間排他解除命令（例えばＵｎｌｏｃｋ（１），Ｕｎｌｏｃｋ（２））をネスティング構造とするので、ユーザによるユーザプログラム（例えばＰ１）の作成にあたって排他制御の利用範囲を広げることができる。
【０１１５】
なお、ユーザプログラム開発支援装置２００において、変換手段Ｑａの実行時（具体的にはユーザプログラムＰをＰＬＣ１００で実行可能なオブジェクトコードに変換するためのコンパイル手段によるコンパイル時）にタスク間排他命令Ｌｏｃｋ（ｉ）とタスク間排他解除命令Ｕｎｌｏｃｋ（ｉ）との対応関係の組み合わせが合致しているか否かを検出し、対応関係の組み合わせが合致していない（例えば、Ｌｏｃｋ（１）が存在するがＵｎｌｏｃｋ（１）がない、或いは、Ｕｎｌｏｃｋ（２）が存在するがＬｏｃｋ（２）がない）ときには、その旨（例えば、何れのロック番号で対応関係の組み合わせが合致していないか）をユーザ（通常はベンダ及びエンドユーザ）に報知（具体的には表示装置２３１に表示）するようにしてもよい。例えば、ユーザプログラム開発支援装置２００において、ロジック上の不都合については回避することはできないものの、変換手段Ｑａの実行時（具体的にはユーザプログラムＰをＰＬＣ１００で実行可能なオブジェクトコードに変換するためのコンパイル手段によるコンパイル時）にタスク間排他解除命令（具体的にはＵｎｌｏｃｋ（１））の入れ忘れを検出し、入れ忘れを検出したときには、その旨（具体的には何れのロック番号で入れ忘れを検出したか）をユーザ（通常はベンダ及びエンドユーザ）に報知（具体的には表示装置２３１に表示）するようにしてもよい。
【０１１６】
（利便性向上処理について）
ところで、ＰＬＣ１００のタスクＴ１〜Ｔｎで実行するユーザプログラムＰ１〜Ｐｎは、通常はベンダやエンドユーザが作成するものである。そのため、タスク間排他命令Ｌｏｃｋ（ｉ）及びタスク間排他解除命令Ｕｎｌｏｃｋ（ｉ）の使われ方を考慮して、以下の利便性向上処理を組み込んでいる。
【０１１７】
（同一ロック番号でのネスティング構造による排他制御）
本実施の形態では、プログラムを部品化して使用するファンクションブロックや、入力パラメータに基づき出力パラメータに出力するファンクションにおいて、タスク間排他命令Ｌｏｃｋ（ｉ）及びタスク間排他解除命令Ｕｎｌｏｃｋ（ｉ）を使用することができる。つまり、ファンクションブロックやファンクションにおいてタスク間排他命令Ｌｏｃｋ（ｉ）及びタスク間排他解除命令Ｕｎｌｏｃｋ（ｉ）が使用されるだけでなく、ファンクションブロックやファンクションを利用する上位のユーザプログラムにおいてもタスク間排他命令Ｌｏｃｋ（ｉ）及びタスク間排他解除命令Ｕｎｌｏｃｋ（ｉ）が使用されることもある。そうすると、タスク間排他命令Ｌｏｃｋ（ｉ）及びタスク間排他解除命令Ｕｎｌｏｃｋ（ｉ）のネスティング構造において、例えば、ユーザプログラムとファンクションブロックやファンクションとの間でユーザ（通常はベンダ及びエンドユーザ）が同一のロック番号のタスク間排他命令及びタスク間排他解除命令を複数使用してしまうことがある。このような使用を禁止してしまうと、ネスティング構造においてユーザが同一のロック番号のタスク間排他命令及びタスク間排他解除命令を一対にするように配慮する必要があり、ネスティング構造を使用するにあたって利便性が良くない。
【０１１８】
そこで、本実施の形態では、タスク間排他命令Ｌｏｃｋ（ｉ）及びタスク間排他解除命令Ｕｎｌｏｃｋ（ｉ）は、同一のロック番号に対して、ネスティング構造を構成するようにしている。
【０１１９】
図１６は、タスク間排他命令Ｌｏｃｋ（ｉ）及びタスク間排他解除命令Ｕｎｌｏｃｋ（ｉ）の同一のロック番号に対するネスティング構造による排他制御の一例を時系列的に示す概念図である。なお、図１６において、「斜線」は、指定したロック番号でロックしている区間を示している。ここでは、ユーザプログラムＰ１においてデータＤ１に対応するタスク間排他命令Ｌｏｃｋ（１）及びタスク間排他解除命令Ｕｎｌｏｃｋ（１）のネスティング構造を例にとって説明する。
【０１２０】
図１６に示す例では、ユーザプログラムＰ１において、同じロック番号１でタスク間排他命令Ｌｏｃｋ（１）及びタスク間排他解除命令Ｕｎｌｏｃｋ（１）をネスティングしてロックしている。そして、タスク間排他命令Ｌｏｃｋ（１）の実行回数分（この例では２回）、タスク間排他解除命令Ｕｎｌｏｃｋ（１）を実行しないと、排他制御のロック状態は解除することができない。なお、実行回数は、３回以上であってもよい。
【０１２１】
タスク間排他命令Ｌｏｃｋ（１）及びタスク間排他解除命令Ｕｎｌｏｃｋ（１）の同一ロック番号でのネスティング構造は、例えば、タスク間排他命令Ｌｏｃｋ（１）についてネストの段数の回数だけカウントして排他制御のロックを行った後、同じロック番号のタスク間排他解除命令Ｕｎｌｏｃｋ（１）についてネストの段数の回数だけカウントし、タスク間排他解除命令Ｕｎｌｏｃｋ（１）のカウント数がタスク間排他命令Ｌｏｃｋ（１）のカウント数と等しくなると、排他制御のロック状態を解除することで実現することができる。或いは、同じロック番号を後入れ先出し (LIFO: Last In First Out; FILO: First In Last Out) の構造でＰｕｃｈ操作及びＰｏｐ操作を行うスタックのデータ構造を用いることでも実現することができる。
【０１２２】
このような排他制御では、同一のロック番号のタスク間排他命令（例えばＬｏｃｋ（１））及びタスク間排他解除命令（例えばＵｎｌｏｃｋ（１））をネスティング構造とするので、ユーザ（通常はベンダやエンドユーザ）がネスティング構造において同一のロック番号のタスク間排他命令（例えばＬｏｃｋ（１））及びタスク間排他解除命令（例えばＵｎｌｏｃｋ（１））を複数使用することがあっても、その使用を許容することが可能となり、例えば、タスク間排他命令Ｌｏｃｋ（ｉ）及びタスク間排他解除命令Ｕｎｌｏｃｋ（ｉ）をユーザプログラムとファンクションブロックやファンクションとの間でロック番号を意識することなく使用することができ、いわば構造化プログラミングに好適に利用することができる。これにより、ネスティング構造を使用するにあたって利便性を向上させることが可能となる。
【０１２３】
なお、本実施の形態では、同一ロック番号でのネスティング構造におけるネストの段数の回数は上限があり、それを超えるとエラーとなるが、その回数は一千万回以上であり、タスク間排他命令（例えばＬｏｃｋ（１））及びタスク間排他解除命令（例えばＵｎｌｏｃｋ（１））の複数使用を実質的に許容することができる。
【０１２４】
（タスク実行終了時でのロック状態の強制的な解除）
また、タスク（例えばＴ１）の１又は複数のユーザプログラムＰ１〜Ｐｊ（ｊは１又は２以上の整数）の実行終了時には、通常は排他制御のロック状態が解除されている必要がある。しかし、ユーザがユーザプログラム（例えばＰ２）においてデータＤへのアクセスに対してタスク間排他解除命令（例えばＵｎｌｏｃｋ（１））を入れ忘れると、タスク（例えばＴ１）の実行終了時にタスク間排他命令（例えばＬｏｃｋ（１））によって排他制御のロック状態のままとなり、或いは、所定条件を満たしたときのみにタスク間排他解除命令（例えばＵｎｌｏｃｋ（１））が実行されるようなロジックとされていたりすると、条件によっては、タスク（例えばＴ１）の実行終了時にタスク間排他命令（例えばＬｏｃｋ（１））によって排他制御のロック状態のままとなり、そうすると、次のユーザプログラムＰ３以降、さらには次のタスク（例えばＴ２）以降では排他制御のロック状態が維持されることになる。すなわち、排他制御のロック状態が次のタスク以降に影響を及ぼしてしまう。
【０１２５】
そこで、本実施の形態では、ＰＬＣ１００におけるマイクロプロセッサ１１１は、タスク（例えばＴ１）の実行終了時にタスク間排他命令（例えばＬｏｃｋ（１））によって排他制御のロック状態にある場合には、排他制御のロック状態を強制的に解除する強制解除手段Ｑｂ３（図２参照）として機能する。すなわち、システムプログラムＳＰは、強制解除手段Ｑｂ３に対応する強制解除ステップをマイクロプロセッサ１１１に実行させる。
【０１２６】
図１７は、タスクＴ１の実行終了時にタスク間排他命令Ｌｏｃｋ（１）によって排他制御のロック状態にある場合に排他制御のロック状態を強制的に解除する排他制御の一例を時系列的に示す概念図である。なお、図１７において、「斜線」は、データＤへのアクセスの排他制御のロック状態を表しており、「二重線」は、タスクＴ１の実行終了を表している。また、図１８は、図１０に示す排他制御の処理のフローチャートに対して、タスク実行終了時でのロック状態の強制的な解除の処理を加えたフローチャートである。
【０１２７】
図１８に示すフローチャートは、図１０に示すフローチャートにおいて、処理Ｓ１８の後に、処理Ｓ１９，Ｓ２０を設けたものである。なお、図１８において、図１０と同一処理には、同じ参照符号を付し、説明を省略する。
【０１２８】
図１８に示す排他制御の処理において、処理Ｓ１９では、一のタスク（例えばＴ１）について、タスク間排他命令（例えばＬｏｃｋ（１））によって排他制御のロック状態にあるか否かを判断し、排他制御のロック状態にない場合には（処理Ｓ１９：Ｎｏ）、そのままタスク（例えばＴ１）を終了する。一方、排他制御のロック状態にある場合には（処理Ｓ１９：Ｙｅｓ）（図１７参照）、排他制御のロック状態を強制的に解除し（処理Ｓ２０）、処理を終了する。なお、タスク実行終了時にロック状態にあるか否かに拘わらず、排他制御のロック状態を強制的に解除してもよい。この場合、図１８のフローチャートにおいて、処理Ｓ１９を省略して処理Ｓ１８の後に、処理Ｓ２０を設けることができる。
【０１２９】
このような排他制御では、タスク（例えばＴ１）の実行終了時にタスク間排他命令（例えばＵｎｌｏｃｋ（１））によって排他制御のロック状態が継続している場合には、排他制御のロック状態を強制的に解除するので、例えば、ユーザが複数のユーザプログラムＰ１〜Ｐｊのうち、何れかのユーザプログラム（例えばＰ２）の誤りにより、タスク間排他解除命令（例えばＵｎｌｏｃｋ（１））を入れ忘れたり、ロジック上の不都合があったりしても、次のタスク（例えばＴ２）以降では排他制御のロック状態が解除された状態となり、ユーザによるユーザプログラム（例えばＰ２）の誤りを補填することが可能となる。
【符号の説明】
【０１３０】
１〜ｍ              ロック番号（識別符号の一例）
１００              プログラマブルコントローラ
２００              ユーザプログラム開発支援装置
３００              プログラマブルコントローラシステム
ＢＰ                プログラム開発支援用プログラム
Ｄ                  データ
Ｄ１〜Ｄｍ          データ
Ｌｏｃｋ（ｉ）      タスク間排他命令
Ｍ                  記録媒体
Ｐ                  ユーザプログラム
Ｐ１〜Ｐｎ          ユーザプログラム
Ｑａ                変換手段
Ｑｂ１              排他制御手段
Ｑｂ２              排他制御解除手段
Ｑｂ３              強制解除手段
Ｔ１〜Ｔｎ          タスク
Ｕｎｌｏｃｋ（ｉ）  タスク間排他解除命令
【図１】
0005928031.tif 000002
【図２】
0005928031.tif 000003
【図３】
0005928031.tif 000004
【図４】
0005928031.tif 000005
【図５】
0005928031.tif 000006
【図６】
0005928031.tif 000007
【図７】
0005928031.tif 000008
【図８】
0005928031.tif 000009
【図９】
0005928031.tif 000010
【図１０】
0005928031.tif 000011
【図１１】
0005928031.tif 000012
【図１２】
0005928031.tif 000013
【図１３】
0005928031.tif 000014
【図１４】
0005928031.tif 000015
【図１５】
0005928031.tif 000016
【図１６】
0005928031.tif 000017
【図１７】
0005928031.tif 000018
【図１８】
0005928031.tif 000019
【図１９】
0005928031.tif 000020
【図２０】
0005928031.tif 000021
【図２１】
0005928031.tif 000022