以下、図面を参照して、本発明の実施の形態について説明する。
図1は、本例のPLC(プログラマブルコントローラ)システムのシステム構成例である。
図1に示すPLCシステムは、複数の演算処理部(CPU等)と、開発支援装置10を有する。尚、図示の例では1つの演算モジュール内に複数の演算処理部(CPU等)がある構成となっているが、この例に限らない。本例のPLCシステムは、演算処理部が複数存在するPLCシステムであり、任意のアプリケーションプログラムを実行する場合に、複数の演算処理部(CPU等)に負荷を分散させて処理効率を向上させる為に、複数の演算処理部(CPU等)への負荷配分を行うものであることを前提とする。
本例のPLCシステム(その開発支援装置10)は、運用中に動的に負荷配分を行うものではなく、運用前に静的に負荷配分を行うものである。
図1に示すPLCシステムは、開発支援装置10と1つのPLCモジュール2がネットワーク1に接続しており、ネットワーク1を介して相互に通信可能となっている。このPLCモジュール2が複数のCPU2a,2bを有することで、複数の演算処理部(CPU等)がある構成となっている。但し、この例に限らず、例えば各々が1つ又は複数のCPUを有するPLCモジュールが、複数設けられた構成であってもよい。尚、PLCモジュール2は、I/Oモジュール3に接続している。
図1に示す開発支援装置10は、ユーザ等に任意のアプリケーションプログラムを作成させ、これをコンパイルして実行オブジェクトコードを生成した後、ネットワーク1を介して実行オブジェクトコードをPLCモジュール2に転送する。この転送処理は、予め登録されるシステム定義に従って行われるが、これについては特に説明しない。但し、転送した実行オブジェクトコードの一部は上記CPU2aで実行させ、残りは上記CPU2bで実行させるようにする(負荷配分を行う)。
図1に示す開発支援装置10は、コンパイラ11、リンカ12、出力変数抽出機能部13、出力参照関係生成部14、負荷配分機能部15等を有する。
コンパイラ11とリンカ12は、従来の開発支援装置でも備えられている一般的な機能であり、ここでは特に説明しないが、上記任意のアプリケーションプログラムから実行オブジェクトコードを生成する機能部である。また、特に図示・説明しないが、従来の開発支援装置でも備えられている一般的な機能として、更に、ユーザに任意のアプリケーションを作成させる機能を有するものであってもよい。ユーザにより任意のアプリケーションプログラム(ソースコード)が作成された後、コンパイラ11等によりこのアプリケーションが実行オブジェクトコードに変換される。
負荷配分は、上記アプリケーションプログラムを構成する各POU(その実行オブジェクトコード)を、各CPU2a、2bに分配するものである。
ここで、上記POUとは、IEC61131-3に規定されている、プログラムの最小単位であり、プログラム(PG)、ファンクション(FCT)、ファンクションブロック(FB)の総称である。そして、本例では、上記アプリケーションプログラムは、複数のプログラム(PG)より成り、一例ではPG1、PG2、PG3、PG4、PG5の5つのプログラム(PG)より成るものとする。
つまり、本例では上記PG1、PG2、PG3、PG4、PG5それぞれを1つの「処理単位」(1つのまとまった処理)としてアプリケーション処理が実行されるものであり、この様な「処理単位」を更に分割して複数のCPUに分配・実行させることは困難であるものとして説明する。勿論、これは一例であり、この様な例に限るものではない。本例では上記PG1〜PG5の各プログラム(PG)を「処理単位」とするが、この例に限るものではない。
そして、本例では、出力変数抽出機能部13と出力参照関係生成部14とによって上記複数の「処理単位」(POU)をグループ分けし、負荷配分機能部15がこのグループ単位で複数のCPU2a,2bへのPG分配を行うものである。例えば、任意の処理単位とその出力変数を参照する処理単位とが同一のグループとなるようにグループ分けする
出力変数抽出機能部13は、上記「処理単位」毎に、その「処理単位」が出力/参照する出力変数を抽出する。尚、本説明において“/”は基本的に“または、あるいは”等を意味する。各「処理単位」は、所定の出力変数の値を出力する場合もあれば、他の「処理単位」が出力した出力変数の値を参照(入力)する場合もある。
出力参照関係生成部14は、任意の「処理単位」の上記出力変数を参照する他の「処理単位」を求めることで、「処理単位」同士の出力参照関係を生成する。そして、この出力参照関係に基づいて「処理単位」をグループ分けする。例えば同じ出力変数に係わる「処理単位」同士は同じグループとなるようにグループ分けする。
負荷配分機能部15は、上記各「処理単位」(POU等;その実行オブジェクトコード)を、上記グループ単位で各CPU2a、2bに割り当てる。これより、あるグループに属する「処理単位」は、全て、同じCPUリソースに割り付けられることになる。
上記「処理単位」の実行順序が、予めユーザによって任意に登録されている。ここでは上記一例に関して「PG1→PG2→PG3→PG4→PG5」という実行順序が登録されているものとする。後述するグループ分けが行われた後、各グループ毎に、そのグループ内での「処理単位」の実行順序は、上記登録された実行順序に準じたものとする。例えば、任意のグループに“PG3、PG5、PG1”が属する場合、このグループ内では“PG1→PG3→PG5”の順で「処理単位」(POU)が実行されることになる。
上記登録された処理単位順序に基づいて、各「処理単位」の前後関係は分かるので、上記出力変数抽出機能部13と出力参照関係生成部14とによって、前段の「処理単位」で出力された出力変数が後段の「処理単位」で参照されているか否かを判定し、関連のある処理単位間を接続することで、処理単位のグループを生成することができる。
図2は、開発支援装置10の処理フローチャート図である。
図示の例では、ユーザにより任意のPLCアプリケーションが作成されたのち、コンパイラ11によりPLCアプリケーションが実行オブジェクトコード(機械語など)に変換される(ステップS1)。PLCアプリケーションは、通常、取得した入力データに基づき、演算を実行し、その結果を出力データへ反映する。
上記出力変数抽出機能部13と出力参照関係生成部14とによって、出力変数参照関係が生成される(ステップS2)。出力変数参照関係は、演算出力・出力参照表21、出力参照関係グラフ22である。演算出力・出力参照表21の一例を図4、出力参照関係グラフ22の一例を図5に示し、後に説明する。
ステップS2の処理について、以下、図3、図4、図5に示す具体例を参照して説明する。
図3に、PLCアプリケーションの実行順序と変数の出力/参照の具体例を示す。
ここでは、上記5つのPG(PG1→PG2→PG3→PG4→PG5)を用いる。つまり、もし、これらのPGを1つのCPUで実行する場合には、図3に示すように、PG1→PG2→PG3→PG4→PG5の順番で実行されることになる。
また、図3には、各PGを矩形40で示すと共に、そのPGに係わる出力変数、参照出力の具体例をその矩形(PG)40内に示す。矩形40内において上側に参照出力(入力変数)42、下側に出力変数41を示す。出力変数41はそのPG(矩形40)が例えば自己の演算の結果を外部に出力する為に用いられる出力変数の変数名である。また、各PG(矩形40)は他のPGの演算出力(出力変数41)の値を参照(入力)して自己の演算に用いる場合があり、当該入力する出力変数の変数名が参照出力(入力変数)42である。
図示の例では、例えばPG1は、参照出力42は無く、出力変数41は“OutA”“OutB”の2つである。PG2は、参照出力42は“OutA”、出力変数41は“OutC”であり、PG4は、参照出力42は“OutB”“OutC”の2つであり、出力変数41は“OutG”である。
つまり、上記の例では、PG1がその演算結果として出力変数“OutA”“OutB”の値を出力する。PG2は、この出力変数“OutA”の値を参照(入力)して、この値に基づいて所定の演算等を実行し、この演算結果として変数“OutC”の値を出力する。
PG4は、上記PG1の出力変数“OutB”の値と上記PG2の出力変数“OutC”の値とを参照(入力)して、この値に基づいて所定の演算等を実行し、この演算結果として出力変数“OutG”の値を出力する。
上記図3の例において上記の様な“出力変数とこの出力変数を参照するPGの関係”を、抽出して接続したものが、図4である。
図4においては、図示の矢印で示すように、例えば上記PG1の出力変数“OutA”を、PG2が参照(入力)している。出力変数“OutA”の値は、PG1を実行する毎に更新される。従って、この例では、図示の通りにPG1実行後にPG2が実行される場合と、PG1実行前にPG2が実行される場合とでは、PG2が参照する出力変数“OutA”の値が異なる可能性があり、以ってPG2の演算結果(変数“OutC”の値)も違ってくる可能性がある。更に、変数“OutC”の値を参照するPG4の演算結果も、違ってくる可能性がある。
上記出力変数抽出機能部13と出力参照関係生成部14とによって、まず、図4に矢印で示すような、上述した出力変数とそれを参照するPGとの関係を抽出する。例えば、演算の処理単位であるプログラム(PG)のレベルにて、各PGが出力する出力変数41及び参照する出力変数(参照出力42)をピックアップする。そして、これらを各PGの呼出し順序を勘案し、グラフ化すると、例えば図5に示すグラフが得られることになる。
図5の例では、変数名を省略し、単純に前段のPGの出力を後段以降の何れかのPGが参照している場合に(出力参照関係がある場合に)、これらPG間を図示の矢印で接続している。これより、図5に示す矢印から、PG1−PG2間、PG2−PG4間、PG1−PG4間、PG3−PG5間に、それぞれ、出力参照関係があることが分かる。
尚、後段のPGの出力を前段のPGが参照している場合は、後段PGの前回出力を前段PGが参照していることになるので、接続しない(前回の演算結果はそのPGが実行されるまではいつ参照しても変わらないので)。
このように出力変数の参照関係をグラフ化すると、PG1、PG2、PG4に対し、PG3、PG5が関連のないことが分かる。換言すれば、PG1とPG2とPG4とには関連性があり、PG3とPG5とには関連性があることが分かる。これより、PG1とPG2とPG4とで1グループとし、PG3とPG5とで別の1グループとする。このようなグラフの独立性の判定は、先頭PGから矢印で接続されたPGをたどりつつ、最後尾のPGまでをチェックすれば確認可能であるが、グラフ理論等で一般的なアルゴリズムであるので、ここでは詳しく述べない。
例えば上述したようにして上記出力変数抽出機能部13と出力参照関係生成部14とによってPGのグループ化が行われたら、負荷配分機能部15が、このグループ化結果に基づいて、各PGをCPU2a,2bの何れかに割り当てる(負荷配分を実行する)(ステップS3)。これは、グループ単位で割り当てる。従って、あるグループに属する全てのPGは、必ず、同じCPU2に割り当てられる。
開発支援装置10は、上記負荷配分結果に応じて、各PGを、割り当てられたCPU2に転送する等のプログラム割り振りを行うが(ステップS4)、この処理自体は既存の処理であり、ここでは特に説明しない。
上記具体例に応じた負荷配分結果の一例を図6(a)に示す。
ここに示す例では、負荷の配分としてはアンバランスであるが、出力と出力参照の関係の前後関係が対応づけられており、一つのCPUで実行した場合と変わらない演算結果が得られ、かつ複数のCPUで演算を実行することによる全体処理時間の短縮も行える。
尚、図6(b)には、従来手法による負荷配分結果の具体例を示す。図示のように、負荷の配分としては図6(a)に比べてバランスがよいが、例えばPG2は、PG1と同時に開始され、且つ、PG1が終了する前に終了している。この例では、PG1とPG2とが相互に異なるCPUリソースにて並列に実行されることとなる。このように、従来手法の場合、出力変数参照において因果関係のあるPG1とPG2のプログラムが並列に実行されることとなり、PG1における出力(上記Out A)の出力反映タイミングが、PG2の演算終了後となることがある。
尚、図6(a)に示す例では、上記の通り負荷配分がアンバランスとなるが、グループ数がある程度多くなれば、アンバランスはある程度は解消される。例えば、上記一例のようにCPU数が2個である例に対して、グループ数が例えば5個や10個などであれば、グループ単位で例えば上記特許文献1の手法を用いて負荷配分を行えば、本手法の上記効果を維持したまま特許文献1の発明の効果も得られることになる。グループ単位とすることで、出力と出力参照の因果関係があるPG同士は、同じCPUリソースに割り当てられることになる。
以下、具体例を示しながら、更に詳細に説明する。
開発支援装置10は、プログラム構成要素(POU)であるプログラム(PG)、ファンクションブロック(FB)、ファンクション(FCT)などの単位で、ユーザプログラムを記述可能である。本例では、演算処理部(CPU等)への最小割付単位をPGとしているが、他のPOUが独立して演算実行可能であれば、これらを割付単位としてもよい。
図7に、PGとタスクの割り付け例を示す。
PGは、その実行周期やレベルを指定した任意のタスクに割り付けられる。
図7では、DEFAULTと名称付けられたタスク51に対して、5つのPG52(PG1〜PG5)が割り付けられている。ここでの割付順序は、ユーザプログラムの実行順序を示しており、図7の例では、PG1→PG2→PG3→PG4→PG5の順番で実行されるように定義されている。各PGは、ラダー図やFBD図、ST言語等のIECで規格化された言語で記述される。
図8(a)(c)に、FBD図で記述されたPGの例を示す。また、図8(b)には図8(a)のPGの変数に関する設定画面の一例である。
通常、PLCアプリケーションでは、図8(a)や図8(c)等に示すPGの入力は、入力モジュールから入力されるデータか、それらの入力値をもとにした内部変数データとなるが、前段のPGの演算出力結果である上記出力変数の値となる。
図8(b)の設定画面上ではユーザが、上記PGの各変数について、名前(変数名)、データ型、種別、アドレス等を、任意に設定できる。
例えば図8(a)に示すPGにおける変数V000には、図8(b)に示すように、アドレス「%QW2.0」に割り付けられている。尚、このアドレス「%QW2.0」は、「出力領域(Q)の2局目、0Word」を意味している。
この変数V000が例えば図3に示す任意の矩形(PG)40の参照出力(入力変数)42であった場合には、この参照出力(入力変数)42を出力変数41とする他の矩形(PG)40の演算結果が、入力値となる。この為、任意の矩形(PG)40が演算実行するタイミングが、他の矩形(PG)40の任意の演算の実行前であるか実行後であるかによって、演算結果が異なる可能性がある。
図8(c)は、単純なADD演算をアプリケーションとして実装した例(その2)である。ここでは上記PG2の例を示すものとする。本例では、PG2は、2入力1出力のADD演算であるものとする。
ここで、図示のOutA、TempA、OutCは、変数名を示している。OutA、TempAが入力に係わる変数、OutCが出力に係わる変数である。これら変数名(OutA等)や各種設定データは、上記図8(b)等の設定画面上でユーザ等によって任意に設定/定義される。各種設定データは、例えばデータ型や変数の種別、アドレスなどである。
これらユーザ等による各種設定データ等は、変数シートに登録される。
図9(a)はPG2に対応する変数シート60、図9(b)はユーザプロジェクト全体で共有するグローバル変数の変数シート70を示している。グローバル変数は、複数のPGが相互にアクセス可能な変数である。
変数シート60は、各PG毎に設けられるものであり、ここではPG2用のみ示すが、PG1,PG3,PG4,PG5についても、それぞれ、変数シート60が存在する。
変数シート60は、変数名61、データ型62、種別63、アドレス64、初期値65等のデータ項目から成る。
変数名61には上記各変数名OutA、TempA、OutCが格納される。これら各変数毎に、変数宣言として、データ型62、変数の種別63、アドレス64等が格納される。データ型62は例えばINT等である。
グローバル変数の変数シート70も、データ構成は上記変数シート60と同じであってよく、変数名71、データ型72、種別73、アドレス74、初期値75等のデータ項目から成る。アドレス74は、変数名71の変数に対して任意に割り当てられたメモリ領域のアドレスである。上記PGからの出力変数の値の出力先は、例えばアドレス74のメモリ領域である。上記出力変数の値を参照する場合も、例えばアドレス74のメモリ領域から値を読み出すことになる。また、上記「出力変数」は、例えばグローバル変数である。
変数シート70には、上記PG2の変数OutAとOutCも登録されており、PG2で使用する変数のなかでOutAとOutCはグローバル変数であることが分かる。一方、グローバル変数ではない上記TempAは、演算途中で使用する一時的変数などである。
そして、例えば変数OutAは、INT型のデータ型を持ち、%QW2.0番地(出力(Q)、WORDサイズ(W)、2局目、0番地)にアクセスする変数であることが示されている。アドレス「%QW2.0」は、「出力領域(Q)の2局目、0Word」を意味している。
演算途中で使用する一時的変数と異なり、「出力変数」(グローバル変数等)は、ある意図をもってシステム上構成されているので、通常、ユーザはアドレス指定して使用する。
このように、本例の開発支援装置10は、前提として、PGの演算アプリケーション、使用する変数に関する情報(変数のデータ型、アドレス/名称、グローバル変数であるか否かなど)、PGの実行順序の情報が定義されている。また、上記PGの演算アプリケーションには、上記各変数のリード/ライトを示す情報(命令コード等)も含まれている。本手法では、例えば一例としては、これらの情報を使用する。詳しくは後述する。
上記のように、例えば変数OutAはグローバル変数であるので、PG2以外の他のPGでも使用し得るものであり、上記図3の例ではPG1でも使用している。この為、変数OutA に関しては、PG1の演算前と後でデータが変わっている可能性があり、これらの前後関係を無視した分割実行は、シングルコアによる演算実行結果と異なる結果をもたらすことがある。
図10は、上述した図8(c)に示すPG2(FBD表記)の疑似ニーモニック表記例である。
ここでは、上記図8(c)のPG2は、実行オブジェクトコードに変換した場合、ニーモニック表記すると図10に示すように下記のようになるものとする。
LD Q,WI,2
ADD M,WI,1000
ST Q,WI,4
ここで、LD、ADDなどは命令コードを、Q,Mなどはメモリ種別を、WIはデータ型(16bit型など)を、そのあとの数値(2,1000,4)はアドレスを示しているものとする。尚、メモリ種別Qは、出力変数を示している。出力変数は、ユーザによりアドレス指定され、システム内の全POUからアクセス可能であり、例えばグローバル変数等である。また、上記アドレスの数値(2,1000,4)は、単に一例を示しているだけであり、例えば「%QW2.0」(出力領域(Q)の2局目、0Word)に対してはアドレス‘2’が割り当てられているが、これはコンパイラ11が割り当てた具体例に過ぎない。尚、この様な割当て結果は記憶されている。
本手法では、出力領域に着目するので、メモリ種別Qとなる命令コードに対し処理を行う。命令コードはその種類によって変数に対する挙動が決まり、図10の例の場合、LD、ADDは変数に対し読み出し(リード)のアクションを行い、STは書き込み(ライト)のアクションを行う。これらはニーモニックとしてあらかじめ規定されており、命令を判別することで、一意に読み出し/書き込みを判別することができる。
そこで、図11に示すフローチャートの処理により、図13に示す出力変数参照表80が作成可能となる。図12は出力変数参照表80を作成途中の状態を示し、図13は図11の処理完了時の出力変数参照表80を示すが、これも未だ作成途中と言える。図11の処理間完了後に不図示のソート処理を行うことで、出力変数参照表80は図14に示す完成状態となる。図12は図11の処理をPG2に適用した結果を示し、図13は図11の処理を他のPG1,PG3,PG4,PG5にも適用して1つに纏めた結果を示す。図13を、変数名(アドレス)をキーにソートしたものが、図14となる。
図12〜図14に示すように、出力変数参照表80は、PG名81、変数名82、アドレス83、R/W方向84の各データ項目より成る。
図11は、出力変数参照表の生成処理フローチャート図である。
以下、図11の処理について説明する。尚、ここでは図10に示すようなニーモニック表記を用いて説明するが、実際のコンピュータ処理では実行オブジェクトコード(機械語命令群)を用いることになる。この機械語命令群には、LDやADD等に相当する機械語コード、Q,M等に相当する機械語コード等が含まれていることになる。
図11では、概略的には、処理対象のPGから1行ずつ命令を読み出してステップS12〜S15の処理を実行するものである。まず、処理対象のPGから先頭の行の命令を読み出す(ステップS11)。図10の例では上記「LD Q,WI,2」が読み出されることになる。そして、読み出した命令(処理対象の命令)のメモリ種別が“Q”であれば出力変数(グローバル変数など)に係わる命令と見做して(ステップS12,YES)ステップS13へ移行し、“Q”以外であれば(ステップS12,NO)そのままステップS16へ移行する。
尚、ステップS12の処理は、基本的に、処理対象の命令が上記出力変数(グローバル変数等)に係わる命令であるか否かを判定するものであり、その為の一例が上記メモリ種別が“Q”であるか否かを判定するものであるが、この例に限るものではない。
ステップS13は、処理対象の命令が読み出し系であるか否かを判定する。そして、処理対象の命令が読み出し系であれば(ステップS13,YES)ステップS14を実行してステップS16を実行し、書込み系であれば(ステップS13,NO)ステップS15を実行してステップS16を実行する。
上記の通り、LDやADDは読み込み系、STは書込み系であるので、上記先頭の行の場合にはステップS13はYESとなり、ステップS14を実行することになる。ステップS14の処理は、出力変数参照表80に新規レコードを追加して、アドレスをリード登録する処理である。これより、上記の例では出力変数参照表80には図12に示す1行目のレコードが追加登録されることになる。つまり、R/W方向84にはR(リード)が登録され、アドレス83には「%QW2.0」が登録される。更に、グローバル変数の変数シート70より、アドレス74=「%QW2.0」に対応する変数名71はOutAであるので、変数名82にはOutAが登録される。更に、処理対象のPG名(ここではPG2)が、PG名81に登録される。
そして、処理対象を次の行の命令にして(ステップS16)ステップS12に戻る。但し、次の行の命令が無ければ(ステップS17,YES)本処理を終了する。ここでは、図10の2行目の「ADD M,WI,1000」が処理対象となって(ステップS17,NO)ステップS12に戻ることになる。そして、メモリ種別がMであることからステップS12がNOとなって、そのままステップS16に移行することになり、次の処理対象が上記「ST Q,WI,4」となってステップS12に戻る。
今度はステップS12がYESでステップS13がNOとなるので、出力変数参照表80に新規レコードを追加して、アドレスをライト登録する(ステップS15)。これより、出力変数参照表80には図12に示す2行目のレコードが追加登録されることになる。つまり、R/W方向84にはW(ライト)が登録され、アドレス83には「%QW2.1」が登録され、変数名82にはOutCが登録され、PG名81にはPG2が登録される。
以上のPG2を対象とする図11の処理によって出力変数参照表80は図12に示す状態となる。更にPG1,PG3,PG4,PG5についても順次、図11の処理を行うことで、出力変数参照表80は図13に示す状態となる。そして、出力変数参照表80のレコードを、アドレス83(または変数名82)をキーにしてソートすることで、図14に示す状態(完成状態)となる。ここではアドレス83が小さいものから順に並べるようにソートした例を示すが、この例に限らない。
そして、完成状態の出力変数参照表80を用いて、図15の対応PG表作成処理を実行することで、例えば図16に示す出力変数対応PG表90を作成する。同一の変数に対して読み出し方向と書き込み方向が混在すると、プログラムの実行関係を維持する必要性があるので、図15の処理によってPGのグループ表を作成する。
図15の処理例では、概略的には、2つの処理用変数(第1変数、第2変数)を用い、これら各処理用変数に出力変数参照表80の変数名(あるいはアドレスであってもよい)とR/W方向を格納し、2つの処理用変数を比較しながら所定の処理を実行する。グループ化すべきPGは、同一変数にアクセスしており、且つ、R/W方向が異なるものである(Rのみの場合、データ変更無しなのでグループ化の必要なし。Wのみ複数の場合、出力競合状態でありアプリケーション不具合となる)。
図15(a)は対応PG表作成処理のフローチャート図であり、図15(b)はそのステップS26のPG登録処理の詳細フローチャート図である。
本処理では、処理中に2つの処理用変数(第1変数、第2変数)を用いる。
そして、まず、出力変数参照表80の先頭レコードの変数名82とR/W方向84を第1変数に代入すると共に(ステップS21)、2番目のレコードの変数名82とR/W方向84を第2変数に代入する(ステップS22)。これより、図14の例の場合には、第1変数には「OutA,W」、第2変数には「OutA,R」が代入された状態となる。
そして、まず、第1変数と第2変数とで変数名が同一か否かを判定し(ステップS23)、同一であれば(ステップS23,YES)ステップS24へ移行し、異なる場合には(ステップS23,NO)そのままステップS27へ移行する。上記の例では変数名は両方とも「OutA」であるので、ステップS23はYESとなる。
ステップS24では第1変数と第2変数とでR/W方向が同一か否かを判定し、同一である場合には(ステップS24,YES)ステップS25へ移行し、異なる場合には(ステップS24,NO)ステップS26へ移行する。上記の例ではR/W方向は、第1変数が「W」、第2変数が[R]であるので、ステップS24はNOとなり、PG登録処理を行う(ステップS26)。一方、R/W方向が同一である場合には(ステップS24,YES)、出力変数参照表80における次のレコードの変数名82とR/W方向84を、第2変数に代入したうえで(ステップS25)ステップS23に戻る。
ここで、上記ステップS26のPG登録処理の具体例を、図15(b)に示し、以下、説明する。
図15(b)に示すPG登録処理では、まず、第1変数を第2変数に代入する(ステップS30)。上記の例では、第1変数=「OutA,W」であるので、これが第2変数に代入されることになり、以って第1変数と第2変数が両方とも「OutA,W」の状態となる。従って最初は必ず後述するステップS31の判定はYESとなることになる。その後も、次のレコードの変数名が第1変数と同じであればステップS31の判定はYESとなることになる。
ステップS31では第1変数と第2変数とで変数名が同一であるか否かを判定し、同一であれば(ステップS31,YES)、この変数名に対応するPG名81を出力変数参照表80から抽出して出力変数対応PG表90に登録する(ステップS32)。上記一例では、出力変数対応PG表90には変数名=OutAに対応付けてPG1とPG2が登録されることになる。つまり、図16における1行目のデータが登録されることになる。尚、図16では、各変数名に対応付けられるPG名には図示の“○”が記される。尚、出力変数対応PG表90は、初期状態では何もデータは無い。
上記ステップS32の処理が完了したら、上記第2変数に対応するレコードを次のレコードにする。つまり、出力変数参照表80における次のレコードの変数名82とR/W方向84を、第2変数に代入したうえでステップS31に戻る。上記一例では次は3行目のレコードが対象となるので、第2変数には「OutB,W」が代入された状態となる。従って、今度はステップS31の判定はNOとなるので、本処理を終了し、図15(a)におけるステップS27の処理へ移行する。
ステップS27では、第2変数を第1変数に代入する。上記一例では現在の第2変数は「OutB,W」となっているので、ステップS27の処理によって第1変数も「OutB,W」となる。そして、第2変数に対応するレコードを次のレコードにする(ステップS28)。つまり、出力変数参照表80における次のレコードの変数名82とR/W方向84を、第2変数に代入する。上記一例では、4行目のレコードにより第2変数には「OutB,R」が代入されることになる。
上記ステップS27,S28の処理により、上記一例では第1変数=「OutB,W」、第2変数=「OutB,R」の状態となる。そして、ステップS23に戻る。但し、次のレコードが無い場合には(ステップS29,YES)、本処理を終了する。次のレコードがある場合に(ステップS29,NO)ステップS23に戻る。
上記のように、今度は第1変数=「OutB,W」、第2変数=「OutB,R」の状態でステップS23以降の処理を行うと、出力変数対応PG表90には変数名=OutBに対応付けてPG1とPG4が登録されることになる。つまり、図16における2行目のレコードが登録されることになる。その後、図14に示す出力変数参照表80の5行目以降のレコードについても順次処理対象として上述した処理を実行することで、最終的に、出力変数対応PG表90は図16に示す状態となり、以って完成したことになる。
図16に示すように、出力変数対応PG表90には、各出力変数毎に、その出力変数に係わる(出力する、又は、参照する)PGが、登録されることになる。これより、この出力変数対応PG表90より、任意の「出力変数」に関して相互に関連性のあるPG同士が、判別できることになる。
これより、この様に生成した出力変数対応PG表90を用いて、例えば図17に示すグループ生成処理を実行することで、PGのグループ化を実現する。
図17は、グループ生成処理のフローチャート図である。
以下、図17の処理について、図16に示す出力変数対応PG表90の具体例と、これに応じた処理中の具体的イメージ(図18、図19、図20)を参照して説明する。
図18、図19、図20は、グループ生成処理の具体例の処理イメージを示す図である。
図17の処理では、まず最初に、全てのPG(上記一例ではPG1,PG2,PG3,PG4,PG5)を、未割付けPGとして登録する(ステップS41)。これら全てのPGが割付済みの状態となったら(未割付けPGが無くなったら)(ステップS48,YES)本処理は終了となる。
次に、処理対象とする「処理グループ」を1つ生成する(ステップS42)。例えば図18に示す「処理グループ1」を生成する。そして、未割付けPG集合から最初のPG(PG1)を取得し、現在の処理対象グループである「処理グループ1」にキュー登録する(図18の下側にイメージを示す)(ステップS43)。尚、未割付けPG集合からのPG取得は、例えば図7で定義された順番で行う。
そして、現在の処理対象グループ(処理グループ1)にキュー登録されたPG番号を順番に取得して処理対象とし、処理対象PGについてステップS44,S45の処理を行うことを繰り返すことで、現在の処理対象グループへの該当PG割当てが行われる。
これは、まず、出力変数対応PG表90において処理対象PG番号が有効(“○”)となっている変数を求めることで、フィルタリングを行う(ステップS44)。つまり、出力変数対応PG表90において処理対象PG番号が有効(“○”)となっている変数のレコードを全て抽出する。最初は、処理対象PGはPG1であるので、図16に示す出力変数対応PG表90から図19(a)に示す2つのレコードが抽出されることになる。
そして、抽出したレコードにおいて処理対象PG番号以外で有効(“○”)となっているPG番号を全て、処理グループのキューに追加登録していく(ステップS45)。図19(a)に示す例ではPG1以外にはPG2とPG4が有効(○)となっているので、図19(b)に示すように、PG2とPG4が「処理グループ1」のキューに追加登録されることになる。つまり、「処理グループ1」には最初はPG1のみ登録されていたが、図19(b)に示すように、更にPG2とPG4も登録された状態となる。但し、ステップS45の処理では、既に処理対象グループに登録済みであるPG番号は、キュー登録しない。
そして、「処理グループ1」に次の登録PG番号がある場合には、これを次の処理対象PGにして(ステップS46)(ステップS47,NO)ステップS44に戻る。上記の例では現在の処理対象であるPG1の次にPG2が登録された状態となっているので、PG2が次の処理対象となる。そして、PG2について上記ステップS44、S45の処理を実行すると、図16に示す1行目と3行目(OutAとOutC)のレコードが抽出され、PG2以外にはPG1とPG4が有効になっているが、これらは既に「処理グループ1」に登録済みであるので、追加登録は行わない。
続いて、PG4が次の処理対象となりステップS44に戻ると、今度は図16に示す2行目と3行目(OutBとOutC)のレコードが抽出され、PG4以外にはPG1とPG2が有効になっているが、これらは既に「処理グループ1」に登録済みであるので、追加登録は行わない。
そして、キューには次の登録PG番号は無いので(ステップS47,YES)ステップS48へ移行する。ステップS48では、未割付けPGの有無をチェックし、未割付けPGが無ければ(ステップS48,YES)本処理を終了し、未割付けPGがあれば(ステップS48,NO)ステップS42に戻る。
上記一例では、PG1,PG2,PG4が「処理グループ1」に登録済みであるので、未割付けPGとしてPG3とPG5が残っているので、ステップS48はNOとなり、ステップS42に戻ることになる。そして、今度は、ステップS42で「処理グループ2」が生成され、ステップS43でPG3が「処理グループ2」にキュー登録される。そして、上記ステップS44〜S47の処理が行われることで、最終的には、「処理グループ2」には図20に示すようにPG3とPG5が登録されることになる。
このように、上記ステップS42〜S48の処理を、未割付けPGが無くなるまで繰り返すことで、全てのPGが任意の処理グループに割り付けられる(仮に、出力変数を他と共有していないPGがある場合は、このPGのみが任意の処理グループに割り付けられることになる;単独処理可能なPGとして、個別に処理グループを割り付けられることになる)。
そして、上記のように生成された処理グループ単位で、各PGを任意のCPUに割り付ける。ある処理グループに属するPGは、全て、同じCPUに割り付けられることになる。換言すれば、出力変数を共有する(関連がある)PG同士は、同じCPUに割り付けられることになる。これより、上記課題を解決できることになる。
図21は、開発支援装置10のハードウェア構成図である。
図示の例では、開発支援装置10は、CPU101、メモリ102、入力部103、出力部104、記憶部105、記憶媒体駆動部106、ネットワーク接続部108等を有する。入力部103はたとえばキーボード/マウス等、出力部104は例えば液晶ディスプレイ、記憶部105は例えばハードディスク等であるが、これらの例に限らない。
ネットワーク接続部108は、例えばネットワーク1に接続し、ネットワーク1を介してPLCモジュール2等との通信を実現する。記憶媒体駆動部106は、例えばCD−ROM等の記憶媒体107に対してデータ・リード/ライト等を行う。
記憶部105には、予め所定のアプリケーションプログラムが記憶されている。CPU101が、このアプリケーションプログラムを実行することで、上述した開発支援装置10の各種処理機能(図1の各種処理機能部、図2や図11や図15のフローチャート図の処理など)を実現できる。
本手法の支援装置は、当該支援装置と複数の演算処理部を有するPLCシステムに係わるコンピュータ装置である。任意のアプリケーションの実行に係わる負荷を該複数の演算処理部に分散させ実行する。この支援装置のハードウェア構成は、例えば図21と同様であって構わない。よって、例えば上記記憶部105に記憶されている所定のアプリケーションプログラムを、CPU101が実行することで、下記の各種処理機能部が実現される。
尚、本手法の支援装置の一例が上記開発支援装置10であるが、この例に限らない。
また、本手法の支援装置は、例えば、図22に示す各種処理機能部を有するものと見做しても構わない。
図22に示す例の支援装置200は、上記アプリケーションを構成する複数の処理単位を、任意の出力変数と関連性のある処理単位は全て同一のグループとなるようにグループ分けするグループ化機能部201と、上記複数の処理単位を上記グループ単位で上記複数の演算処理部の何れかに割り当てる負荷配分機能部202とを有する。
上記グループ化機能部201は、例えば、任意の上記処理単位とその上記出力変数を参照する処理単位とが同一のグループとなるように上記グループ分けを行う。
上記グループ化機能部201は、例えば、上記処理単位毎に、その処理単位からの出力変数、その処理単位が参照する出力変数を抽出し、該抽出結果に基づいて任意の出力変数を出力する処理単位と参照する処理単位とを上記関連性のある処理単位とする。
上記グループ化機能部201は、例えば、上記処理単位毎に、その処理単位で使用する出力変数と参照する出力変数を抽出し、該抽出結果と予め登録される該処理単位の実行順序に基づいて、任意の前段の処理単位からの出力変数を参照する後段の処理単位を求めて該処理単位間を接続することで出力参照関係がある処理単位間を接続し、該出力参照関係に基づいてグループを生成する。
上記グループ化機能部201は、例えば下記の各処理機能部を有するものであってもよい。
・上記処理単位毎に、その処理単位の命令群の中で上記出力変数に係わる命令の変数名とリード/ライトを、その処理単位名と共に第1記憶部に登録する第1登録機能部203;
・該第1記憶部の格納データを上記登録された各変数名に基づいてソートするソート機能部204;
・該ソート後の第1記憶部の各データを順次対象にして、変数名が同一且つリード/ライトが異なるデータの組を抽出して、該抽出データの上記処理単位名を該変数名に対応付けて第2記憶部に登録する第2記憶部登録機能部205;
該第2記憶部に基づいて、任意の処理単位の処理単位名に対応する変数名を全て抽出すると共に、該抽出した変数名に対応付けられた処理単位名を全て抽出して、該抽出した処理単位名の処理単位を全て同じグループに入れるグループ分け機能部206。
尚、上記第1登録機能部203による処理の一例が、上記図11の処理である。
上記ソート機能部204の処理の一例が、上記図13から図14を生成する処理である。
上記第2記憶部登録機能部205の処理の一例が上記図15の処理である。
上記グループ分け機能部206の処理の一例が上記図17の処理である。
以上説明した本例のPLCシステム、その開発支援装置10、支援装置200、プログラム等によれば、任意のアプリケーション実行に係わる負荷を複数の演算処理部に分散させるPLCシステムにおいて、自動的に適切な負荷配分を行えるようにできる。
適切な負荷配分とは、例えば上記のように、出力変数の参照関係において関連性がある処理単位同士は同一の演算処理部に割り当てられることである。これによって、上記課題を解決できる。すなわち、「演算の前後関係が崩れ、1つのCPUリソースで実行した場合と複数のCPUリソースで演算を行った場合の、制御結果が異なる可能性がある」という問題が、起こらないようにできる。以って、ユーザのアプリケーション配分設計の効率を向上させることができる。