(57)【要約】【課題】負荷を複数の演算処理部に分散させるうえで、自動的に適切な負荷配分を行えるようにする。【解決手段】出力変数抽出機能部１３は、その「処理単位」に係わる出力変数を抽出する。出力参照関係生成部１４は、任意の「処理単位」の上記出力変数を参照する他の「処理単位」を求めることで、出力参照関係を生成することで、「処理単位」をグループ分けする。負荷配分機能部１５は、上記各「処理単位」を、上記グループ単位で各ＣＰＵに割り当てる。【選択図】図１
2018180706.tif 000002
【特許請求の範囲】
【請求項１】
複数の演算処理部を有するプログラマブルコントローラにおける負荷分散を図る支援装置であって、
前記プログラマブルコントローラで実行されるアプリケーションを構成する複数の処理単位について、各処理単位が係わる出力変数に基づき関連性がある処理単位を同じグループに所属させるグループ化手段と、
前記複数の処理単位を前記グループごとに、前記複数の演算処理部の何れかに割り当てる負荷配分手段と、
を有することを特徴とする支援装置。
【請求項２】
前記グループ化手段は、任意の出力変数を出力する処理単位と参照する処理単位とを同じグループに所属させることを特徴とする請求項１記載の支援装置。
【請求項３】
前記グループ化手段は、
前記処理単位毎に、その処理単位からの出力変数、その処理単位が参照する出力変数を抽出し、該抽出結果に基づいて任意の出力変数を出力する処理単位と参照する処理単位とを前記関連性のある処理単位とすることを特徴とする請求項１または２記載の支援装置。
【請求項４】
前記グループ化手段は、
前記処理単位毎に、その処理単位で使用する出力変数と参照する出力変数を抽出し、該抽出結果と予め登録される該処理単位の実行順序に基づいて、任意の前段の処理単位からの出力変数を参照する後段の処理単位を求めて該処理単位間を接続することで出力参照関係がある処理単位間を接続し、該出力参照関係に基づいて前記グループを生成することを特徴とする請求項３記載の支援装置。
【請求項５】
前記グループ化手段は、
前記処理単位毎に、その処理単位の命令群の中で前記出力変数に係わる命令の変数名とリード／ライトを、その処理単位名と共に第１記憶部に登録する第１登録手段と、
該第１記憶部の格納データを前記登録された各変数名に基づいてソートするソート手段と、
該ソート後の第１記憶部の各データを順次対象にして、変数名が同一且つリード／ライトが異なるデータの組を抽出して、該抽出したデータの前記処理単位名を該変数名に対応付けて第２記憶部に登録する第２記憶部登録手段と、
該第２記憶部に基づいて、任意の処理単位の処理単位名に対応する変数名を全て抽出すると共に、該抽出した変数名に対応付けられた処理単位名を全て抽出して、該抽出した処理単位名の処理単位を全て同じグループに入れるグループ分け手段と、
を有することを特徴とする請求項１記載の支援装置。
【請求項６】
支援装置と複数の演算処理部を有し、任意のアプリケーションの実行に係わる負荷を該複数の演算処理部に分散させ実行するＰＬＣシステムにおける該支援装置のコンピュータを、
前記アプリケーションを構成する複数の処理単位を、任意の出力変数と関連性のある処理単位は全て同一のグループとなるようにグループ分けするグループ化手段と、
前記複数の処理単位を前記グループ単位で前記複数の演算処理部の何れかに割り当てる負荷配分手段、
として機能させる為のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラマブルコントローラの支援装置に関する。
【背景技術】
【０００２】
近年、マイクロコントローラやＬＳＩを使用した組込システムにおいては、ハードウェアでのクロック周波数の向上などによる実行速度の改善は、限界に近づきつつあり、その為、複数のＣＰＵを並列実行することで全体の実行速度を上げるマルチコア方式が用いられるようになってきている。その際、複数のＣＰＵを有するシステムを効率的に利用するために、各ＣＰＵに掛かる負荷を調整することが求められる場合がある。
【０００３】
しかしながら、シーケンシャルな処理が多く、且つリアルタイム性能を要求されることが多いＰＬＣにおいては、負荷の調整には、入出力機器等を含めたシステム構成に依存した処理のノウハウが必要で難易度が高く、システム規模の増大に伴い、調整工数も増大傾向にある。
【０００４】
この工数を削減するために考案された負荷の自動分散方式については、例えば特許文献１に記載の手法が提案されている。
【０００５】
特許文献１の発明では、任意のアプリケーションをコンパイラがコンパイルして実行オブジェクトコードを生成する。これに伴って、各ＰＯＵ（Program Organization Unit）それぞれの実行オブジェクトコードのサイズを求め、「ＰＯＵの呼び出し情報」を生成する。これら実行オブジェクトコードサイズと「ＰＯＵの呼び出し情報」とに基づいて、複数のＣＰＵに対して実行オブジェクトコードを配分する。
【０００６】
特許文献１では、ＰＬＣアプリケーションを実行負荷の観点で、開発支援装置が自動的に複数のＣＰＵリソースに分散し、以ってユーザのアプリケーション開発効率を上げつつ、アプリケーションの実行負荷を低減する方式を提案している。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２０１２−５９０７８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
プログラマブルコントローラのアプリケーション（ＰＬＣアプリケーション）は、近年、複雑化・大容量化してきており、複数のＣＰＵに負荷を分配して処理効率を向上させようとしても、その配分を決定することが難しい。また、試行錯誤的に負荷の配分を行った場合、多大な時間が掛かるためユーザの負担になり、アプリケーションプログラムの開発難易度が増大するだけでなく開発効率が低下する。
【０００９】
近年、ＰＬＣのアプリケーションは、従来のラダー言語などによる処理単位で記述された単純構造のプログラムではなく、ＩＥＣ61131-3のような多言語を駆使した機能単位の構造化設計が行われるようになってきており、ユーザが処理全体の流れを把握することが困難になってきている。構造化設計の場合、同一の機能単位、関数等が別々のプログラムから呼び出されることが多く、プログラム作成者が複数にわたる開発も多くなってきている。
【００１０】
このような状況では、複数のＣＰＵリソースを持つシステムであっても、アプリケーションプログラム作成者が自力で負荷配分を行うことは難易度が高く、結果的に処理負荷のアンバランスによるトータルシステム処理性能の低下、またシステム立ち上げ工数の増加が考えられる。
【００１１】
また、ＰＬＣアプリケーションにおいて、そのシーケンス性に着目し、前段のプログラムの出力変数への書き込みを後段のプログラムが参照する場合がある。このようなアプリケーションの場合、単純に演算負荷のみに着目してプログラムを複数のＣＰＵリソースに分散配置すると、演算の前後関係が崩れ、１つのＣＰＵリソースで実行した場合と複数のＣＰＵリソースで演算を行った場合とで、演算結果が異なる可能性がある。
【００１２】
本発明は、ＰＬＣシステムの複数の演算処理部に、自動的に適切な負荷配分を行うことを目的とする。
【課題を解決するための手段】
【００１３】
本発明は、複数の演算処理部を有するプログラマブルコントローラにおける負荷分散を図る支援装置であって、下記の各手段を有する。
【００１４】
・前記プログラマブルコントローラで実行されるアプリケーションを構成する複数の処理単位について、各処理単位が係わる出力変数に基づき関連性がある処理単位を同じグループに所属させるグループ化手段；
・前記複数の処理単位を前記グループごとに、前記複数の演算処理部の何れかに割り当てる負荷配分手段：
【発明の効果】
【００１５】
本発明の支援装置、プログラム等によれば、ＰＬＣシステムの複数の演算処理部に、自動的に適切な負荷配分を行うことができる。
【図面の簡単な説明】
【００１６】
【図１】本例のＰＬＣシステムのシステム構成例である。
【図２】開発支援装置の処理フローチャート図である。
【図３】ＰＬＣアプリケーションの実行順序と変数の出力／参照の具体例を示す図である。
【図４】出力変数とこの出力変数を参照するＰＧの関係を示す図である。
【図５】出力参照関係があるＰＧ間を接続した図である。
【図６】（ａ）は本例の負荷配分結果、（ｂ）は従来の負荷配分結果を示す図である。
【図７】ＰＧとタスクの割り付け例を示す図である。
【図８】（ａ）（ｃ）はＦＢＤ図で記述されたＰＧの例を示す図、（ｂ）は変数設定画面例である。
【図９】（ａ）はＰＧ２に対応する変数シート、（ｂ）はグローバル変数の変数シート７０である。
【図１０】図８（ｃ）に示すＰＧ２の疑似ニーモニック表記例である。
【図１１】出力変数参照表の生成処理フローチャート図である。
【図１２】生成途中の出力変数参照表（その１）である。
【図１３】生成途中の出力変数参照表（その２）である。
【図１４】完成した出力変数参照表である。
【図１５】（ａ）、（ｂ）は対応ＰＧ表作成処理のフローチャート図である。
【図１６】出力変数対応ＰＧ表の一例を示す図である。
【図１７】グループ生成処理のフローチャート図である。
【図１８】グループ生成処理の具体例の処理イメージを示す図（その１）である。
【図１９】グループ生成処理の具体例の処理イメージを示す図（その２）である。
【図２０】グループ生成処理の具体例の処理イメージを示す図（その３）である。
【図２１】開発支援装置のハードウェア構成図である。
【図２２】本発明の支援装置の機能ブロック図である。
【発明を実施するための形態】
【００１７】
以下、図面を参照して、本発明の実施の形態について説明する。
図１は、本例のＰＬＣ（プログラマブルコントローラ）システムのシステム構成例である。
【００１８】
図１に示すＰＬＣシステムは、複数の演算処理部（ＣＰＵ等）と、開発支援装置１０を有する。尚、図示の例では１つの演算モジュール内に複数の演算処理部（ＣＰＵ等）がある構成となっているが、この例に限らない。本例のＰＬＣシステムは、演算処理部が複数存在するＰＬＣシステムであり、任意のアプリケーションプログラムを実行する場合に、複数の演算処理部（ＣＰＵ等）に負荷を分散させて処理効率を向上させる為に、複数の演算処理部（ＣＰＵ等）への負荷配分を行うものであることを前提とする。
【００１９】
本例のＰＬＣシステム（その開発支援装置１０）は、運用中に動的に負荷配分を行うものではなく、運用前に静的に負荷配分を行うものである。
【００２０】
図１に示すＰＬＣシステムは、開発支援装置１０と１つのＰＬＣモジュール２がネットワーク１に接続しており、ネットワーク１を介して相互に通信可能となっている。このＰＬＣモジュール２が複数のＣＰＵ２ａ，２ｂを有することで、複数の演算処理部（ＣＰＵ等）がある構成となっている。但し、この例に限らず、例えば各々が１つ又は複数のＣＰＵを有するＰＬＣモジュールが、複数設けられた構成であってもよい。尚、ＰＬＣモジュール２は、Ｉ／Ｏモジュール３に接続している。
【００２１】
図１に示す開発支援装置１０は、ユーザ等に任意のアプリケーションプログラムを作成させ、これをコンパイルして実行オブジェクトコードを生成した後、ネットワーク１を介して実行オブジェクトコードをＰＬＣモジュール２に転送する。この転送処理は、予め登録されるシステム定義に従って行われるが、これについては特に説明しない。但し、転送した実行オブジェクトコードの一部は上記ＣＰＵ２ａで実行させ、残りは上記ＣＰＵ２ｂで実行させるようにする（負荷配分を行う）。
【００２２】
図１に示す開発支援装置１０は、コンパイラ１１、リンカ１２、出力変数抽出機能部１３、出力参照関係生成部１４、負荷配分機能部１５等を有する。
【００２３】
コンパイラ１１とリンカ１２は、従来の開発支援装置でも備えられている一般的な機能であり、ここでは特に説明しないが、上記任意のアプリケーションプログラムから実行オブジェクトコードを生成する機能部である。また、特に図示・説明しないが、従来の開発支援装置でも備えられている一般的な機能として、更に、ユーザに任意のアプリケーションを作成させる機能を有するものであってもよい。ユーザにより任意のアプリケーションプログラム（ソースコード）が作成された後、コンパイラ１１等によりこのアプリケーションが実行オブジェクトコードに変換される。
【００２４】
負荷配分は、上記アプリケーションプログラムを構成する各ＰＯＵ（その実行オブジェクトコード）を、各ＣＰＵ２ａ、２ｂに分配するものである。
【００２５】
ここで、上記ＰＯＵとは、ＩＥＣ61131-3に規定されている、プログラムの最小単位であり、プログラム（ＰＧ）、ファンクション（ＦＣＴ）、ファンクションブロック（ＦＢ）の総称である。そして、本例では、上記アプリケーションプログラムは、複数のプログラム（ＰＧ）より成り、一例ではＰＧ１、ＰＧ２、ＰＧ３、ＰＧ４、ＰＧ５の５つのプログラム（ＰＧ）より成るものとする。
【００２６】
つまり、本例では上記ＰＧ１、ＰＧ２、ＰＧ３、ＰＧ４、ＰＧ５それぞれを１つの「処理単位」（１つのまとまった処理）としてアプリケーション処理が実行されるものであり、この様な「処理単位」を更に分割して複数のＣＰＵに分配・実行させることは困難であるものとして説明する。勿論、これは一例であり、この様な例に限るものではない。本例では上記ＰＧ１〜ＰＧ５の各プログラム（ＰＧ）を「処理単位」とするが、この例に限るものではない。
【００２７】
そして、本例では、出力変数抽出機能部１３と出力参照関係生成部１４とによって上記複数の「処理単位」（ＰＯＵ）をグループ分けし、負荷配分機能部１５がこのグループ単位で複数のＣＰＵ２ａ，２ｂへのＰＧ分配を行うものである。例えば、任意の処理単位とその出力変数を参照する処理単位とが同一のグループとなるようにグループ分けする
出力変数抽出機能部１３は、上記「処理単位」毎に、その「処理単位」が出力／参照する出力変数を抽出する。尚、本説明において“／”は基本的に“または、あるいは”等を意味する。各「処理単位」は、所定の出力変数の値を出力する場合もあれば、他の「処理単位」が出力した出力変数の値を参照（入力）する場合もある。
【００２８】
出力参照関係生成部１４は、任意の「処理単位」の上記出力変数を参照する他の「処理単位」を求めることで、「処理単位」同士の出力参照関係を生成する。そして、この出力参照関係に基づいて「処理単位」をグループ分けする。例えば同じ出力変数に係わる「処理単位」同士は同じグループとなるようにグループ分けする。
【００２９】
負荷配分機能部１５は、上記各「処理単位」（ＰＯＵ等；その実行オブジェクトコード）を、上記グループ単位で各ＣＰＵ２ａ、２ｂに割り当てる。これより、あるグループに属する「処理単位」は、全て、同じＣＰＵリソースに割り付けられることになる。
【００３０】
上記「処理単位」の実行順序が、予めユーザによって任意に登録されている。ここでは上記一例に関して「ＰＧ１→ＰＧ２→ＰＧ３→ＰＧ４→ＰＧ５」という実行順序が登録されているものとする。後述するグループ分けが行われた後、各グループ毎に、そのグループ内での「処理単位」の実行順序は、上記登録された実行順序に準じたものとする。例えば、任意のグループに“ＰＧ３、ＰＧ５、ＰＧ１”が属する場合、このグループ内では“ＰＧ１→ＰＧ３→ＰＧ５”の順で「処理単位」（ＰＯＵ）が実行されることになる。
【００３１】
上記登録された処理単位順序に基づいて、各「処理単位」の前後関係は分かるので、上記出力変数抽出機能部１３と出力参照関係生成部１４とによって、前段の「処理単位」で出力された出力変数が後段の「処理単位」で参照されているか否かを判定し、関連のある処理単位間を接続することで、処理単位のグループを生成することができる。
【００３２】
図２は、開発支援装置１０の処理フローチャート図である。
図示の例では、ユーザにより任意のＰＬＣアプリケーションが作成されたのち、コンパイラ１１によりＰＬＣアプリケーションが実行オブジェクトコード（機械語など）に変換される（ステップＳ１）。ＰＬＣアプリケーションは、通常、取得した入力データに基づき、演算を実行し、その結果を出力データへ反映する。
【００３３】
上記出力変数抽出機能部１３と出力参照関係生成部１４とによって、出力変数参照関係が生成される（ステップＳ２）。出力変数参照関係は、演算出力・出力参照表２１、出力参照関係グラフ２２である。演算出力・出力参照表２１の一例を図４、出力参照関係グラフ２２の一例を図５に示し、後に説明する。
【００３４】
ステップＳ２の処理について、以下、図３、図４、図５に示す具体例を参照して説明する。
【００３５】
図３に、ＰＬＣアプリケーションの実行順序と変数の出力／参照の具体例を示す。
ここでは、上記５つのＰＧ（ＰＧ１→ＰＧ２→ＰＧ３→ＰＧ４→ＰＧ５）を用いる。つまり、もし、これらのＰＧを１つのＣＰＵで実行する場合には、図３に示すように、ＰＧ１→ＰＧ２→ＰＧ３→ＰＧ４→ＰＧ５の順番で実行されることになる。
【００３６】
また、図３には、各ＰＧを矩形４０で示すと共に、そのＰＧに係わる出力変数、参照出力の具体例をその矩形（ＰＧ）４０内に示す。矩形４０内において上側に参照出力（入力変数）４２、下側に出力変数４１を示す。出力変数４１はそのＰＧ（矩形４０）が例えば自己の演算の結果を外部に出力する為に用いられる出力変数の変数名である。また、各ＰＧ（矩形４０）は他のＰＧの演算出力（出力変数４１）の値を参照（入力）して自己の演算に用いる場合があり、当該入力する出力変数の変数名が参照出力（入力変数）４２である。
【００３７】
図示の例では、例えばＰＧ１は、参照出力４２は無く、出力変数４１は“OutA”“OutB”の２つである。ＰＧ２は、参照出力４２は“OutA”、出力変数４１は“OutC”であり、ＰＧ４は、参照出力４２は“OutB”“OutC”の２つであり、出力変数４１は“OutG”である。
【００３８】
つまり、上記の例では、ＰＧ１がその演算結果として出力変数“OutA”“OutB”の値を出力する。ＰＧ２は、この出力変数“OutA”の値を参照（入力）して、この値に基づいて所定の演算等を実行し、この演算結果として変数“OutC”の値を出力する。
【００３９】
ＰＧ４は、上記ＰＧ１の出力変数“OutB”の値と上記ＰＧ２の出力変数“OutC”の値とを参照（入力）して、この値に基づいて所定の演算等を実行し、この演算結果として出力変数“OutG”の値を出力する。
【００４０】
上記図３の例において上記の様な“出力変数とこの出力変数を参照するＰＧの関係”を、抽出して接続したものが、図４である。
【００４１】
図４においては、図示の矢印で示すように、例えば上記ＰＧ１の出力変数“OutA”を、ＰＧ２が参照（入力）している。出力変数“OutA”の値は、ＰＧ１を実行する毎に更新される。従って、この例では、図示の通りにＰＧ１実行後にＰＧ２が実行される場合と、ＰＧ１実行前にＰＧ２が実行される場合とでは、ＰＧ２が参照する出力変数“OutA”の値が異なる可能性があり、以ってＰＧ２の演算結果（変数“OutC”の値）も違ってくる可能性がある。更に、変数“OutC”の値を参照するＰＧ４の演算結果も、違ってくる可能性がある。
【００４２】
上記出力変数抽出機能部１３と出力参照関係生成部１４とによって、まず、図４に矢印で示すような、上述した出力変数とそれを参照するＰＧとの関係を抽出する。例えば、演算の処理単位であるプログラム(ＰＧ)のレベルにて、各ＰＧが出力する出力変数４１及び参照する出力変数(参照出力４２)をピックアップする。そして、これらを各ＰＧの呼出し順序を勘案し、グラフ化すると、例えば図５に示すグラフが得られることになる。
【００４３】
図５の例では、変数名を省略し、単純に前段のＰＧの出力を後段以降の何れかのＰＧが参照している場合に（出力参照関係がある場合に）、これらＰＧ間を図示の矢印で接続している。これより、図５に示す矢印から、ＰＧ１−ＰＧ２間、ＰＧ２−ＰＧ４間、ＰＧ１−ＰＧ４間、ＰＧ３−ＰＧ５間に、それぞれ、出力参照関係があることが分かる。
【００４４】
尚、後段のＰＧの出力を前段のＰＧが参照している場合は、後段ＰＧの前回出力を前段ＰＧが参照していることになるので、接続しない(前回の演算結果はそのＰＧが実行されるまではいつ参照しても変わらないので)。
【００４５】
このように出力変数の参照関係をグラフ化すると、ＰＧ１、ＰＧ２、ＰＧ４に対し、ＰＧ３、ＰＧ５が関連のないことが分かる。換言すれば、ＰＧ１とＰＧ２とＰＧ４とには関連性があり、ＰＧ３とＰＧ５とには関連性があることが分かる。これより、ＰＧ１とＰＧ２とＰＧ４とで１グループとし、ＰＧ３とＰＧ５とで別の１グループとする。このようなグラフの独立性の判定は、先頭ＰＧから矢印で接続されたＰＧをたどりつつ、最後尾のＰＧまでをチェックすれば確認可能であるが、グラフ理論等で一般的なアルゴリズムであるので、ここでは詳しく述べない。
【００４６】
例えば上述したようにして上記出力変数抽出機能部１３と出力参照関係生成部１４とによってＰＧのグループ化が行われたら、負荷配分機能部１５が、このグループ化結果に基づいて、各ＰＧをＣＰＵ２ａ，２ｂの何れかに割り当てる（負荷配分を実行する）（ステップＳ３）。これは、グループ単位で割り当てる。従って、あるグループに属する全てのＰＧは、必ず、同じＣＰＵ２に割り当てられる。
【００４７】
開発支援装置１０は、上記負荷配分結果に応じて、各ＰＧを、割り当てられたＣＰＵ２に転送する等のプログラム割り振りを行うが（ステップＳ４）、この処理自体は既存の処理であり、ここでは特に説明しない。
【００４８】
上記具体例に応じた負荷配分結果の一例を図６（ａ）に示す。
ここに示す例では、負荷の配分としてはアンバランスであるが、出力と出力参照の関係の前後関係が対応づけられており、一つのＣＰＵで実行した場合と変わらない演算結果が得られ、かつ複数のＣＰＵで演算を実行することによる全体処理時間の短縮も行える。
【００４９】
尚、図６（ｂ）には、従来手法による負荷配分結果の具体例を示す。図示のように、負荷の配分としては図６（ａ）に比べてバランスがよいが、例えばＰＧ２は、ＰＧ１と同時に開始され、且つ、ＰＧ１が終了する前に終了している。この例では、ＰＧ１とＰＧ２とが相互に異なるＣＰＵリソースにて並列に実行されることとなる。このように、従来手法の場合、出力変数参照において因果関係のあるＰＧ１とＰＧ２のプログラムが並列に実行されることとなり、ＰＧ１における出力(上記Out A)の出力反映タイミングが、ＰＧ２の演算終了後となることがある。
【００５０】
尚、図６（ａ）に示す例では、上記の通り負荷配分がアンバランスとなるが、グループ数がある程度多くなれば、アンバランスはある程度は解消される。例えば、上記一例のようにＣＰＵ数が２個である例に対して、グループ数が例えば５個や１０個などであれば、グループ単位で例えば上記特許文献１の手法を用いて負荷配分を行えば、本手法の上記効果を維持したまま特許文献１の発明の効果も得られることになる。グループ単位とすることで、出力と出力参照の因果関係があるＰＧ同士は、同じＣＰＵリソースに割り当てられることになる。
【００５１】
以下、具体例を示しながら、更に詳細に説明する。
開発支援装置１０は、プログラム構成要素（ＰＯＵ）であるプログラム（ＰＧ）、ファンクションブロック（ＦＢ）、ファンクション（ＦＣＴ）などの単位で、ユーザプログラムを記述可能である。本例では、演算処理部（ＣＰＵ等）への最小割付単位をＰＧとしているが、他のＰＯＵが独立して演算実行可能であれば、これらを割付単位としてもよい。
【００５２】
図７に、ＰＧとタスクの割り付け例を示す。
ＰＧは、その実行周期やレベルを指定した任意のタスクに割り付けられる。
【００５３】
図７では、DEFAULTと名称付けられたタスク５１に対して、５つのＰＧ５２（PG1〜PG5）が割り付けられている。ここでの割付順序は、ユーザプログラムの実行順序を示しており、図７の例では、PG1→PG2→PG3→PG4→PG5の順番で実行されるように定義されている。各ＰＧは、ラダー図やＦＢＤ図、ＳＴ言語等のＩＥＣで規格化された言語で記述される。
【００５４】
図８（ａ）（ｃ）に、ＦＢＤ図で記述されたＰＧの例を示す。また、図８（ｂ）には図８（ａ）のＰＧの変数に関する設定画面の一例である。
【００５５】
通常、ＰＬＣアプリケーションでは、図８（ａ）や図８（ｃ）等に示すＰＧの入力は、入力モジュールから入力されるデータか、それらの入力値をもとにした内部変数データとなるが、前段のＰＧの演算出力結果である上記出力変数の値となる。
【００５６】
図８（ｂ）の設定画面上ではユーザが、上記ＰＧの各変数について、名前（変数名）、データ型、種別、アドレス等を、任意に設定できる。
【００５７】
例えば図８（ａ）に示すＰＧにおける変数V000には、図８（ｂ）に示すように、アドレス「％QW2.0」に割り付けられている。尚、このアドレス「％QW2.0」は、「出力領域(Q)の2局目、0Word」を意味している。
【００５８】
この変数V000が例えば図３に示す任意の矩形（ＰＧ）４０の参照出力（入力変数）４２であった場合には、この参照出力（入力変数）４２を出力変数４１とする他の矩形（ＰＧ）４０の演算結果が、入力値となる。この為、任意の矩形（ＰＧ）４０が演算実行するタイミングが、他の矩形（ＰＧ）４０の任意の演算の実行前であるか実行後であるかによって、演算結果が異なる可能性がある。
【００５９】
図８（ｃ）は、単純なＡＤＤ演算をアプリケーションとして実装した例（その２）である。ここでは上記ＰＧ２の例を示すものとする。本例では、ＰＧ２は、２入力１出力のＡＤＤ演算であるものとする。
【００６０】
ここで、図示のOutA、TempA、OutCは、変数名を示している。OutA、TempAが入力に係わる変数、OutCが出力に係わる変数である。これら変数名（OutA等）や各種設定データは、上記図８（ｂ）等の設定画面上でユーザ等によって任意に設定／定義される。各種設定データは、例えばデータ型や変数の種別、アドレスなどである。
これらユーザ等による各種設定データ等は、変数シートに登録される。
【００６１】
図９（ａ）はＰＧ２に対応する変数シート６０、図９（ｂ）はユーザプロジェクト全体で共有するグローバル変数の変数シート７０を示している。グローバル変数は、複数のＰＧが相互にアクセス可能な変数である。
【００６２】
変数シート６０は、各ＰＧ毎に設けられるものであり、ここではＰＧ２用のみ示すが、ＰＧ１，ＰＧ３，ＰＧ４，ＰＧ５についても、それぞれ、変数シート６０が存在する。
【００６３】
変数シート６０は、変数名６１、データ型６２、種別６３、アドレス６４、初期値６５等のデータ項目から成る。
【００６４】
変数名６１には上記各変数名OutA、TempA、OutCが格納される。これら各変数毎に、変数宣言として、データ型６２、変数の種別６３、アドレス６４等が格納される。データ型６２は例えばＩＮＴ等である。
【００６５】
グローバル変数の変数シート７０も、データ構成は上記変数シート６０と同じであってよく、変数名７１、データ型７２、種別７３、アドレス７４、初期値７５等のデータ項目から成る。アドレス７４は、変数名７１の変数に対して任意に割り当てられたメモリ領域のアドレスである。上記ＰＧからの出力変数の値の出力先は、例えばアドレス７４のメモリ領域である。上記出力変数の値を参照する場合も、例えばアドレス７４のメモリ領域から値を読み出すことになる。また、上記「出力変数」は、例えばグローバル変数である。
【００６６】
変数シート７０には、上記ＰＧ２の変数OutAとOutCも登録されており、ＰＧ２で使用する変数のなかでOutAとOutCはグローバル変数であることが分かる。一方、グローバル変数ではない上記TempAは、演算途中で使用する一時的変数などである。
【００６７】
そして、例えば変数OutAは、ＩＮＴ型のデータ型を持ち、％QW2.0番地（出力（Q）、WORDサイズ（W）、2局目、0番地）にアクセスする変数であることが示されている。アドレス「％QW2.0」は、「出力領域(Q)の2局目、0Word」を意味している。
【００６８】
演算途中で使用する一時的変数と異なり、「出力変数」（グローバル変数等）は、ある意図をもってシステム上構成されているので、通常、ユーザはアドレス指定して使用する。
【００６９】
このように、本例の開発支援装置１０は、前提として、ＰＧの演算アプリケーション、使用する変数に関する情報（変数のデータ型、アドレス／名称、グローバル変数であるか否かなど）、ＰＧの実行順序の情報が定義されている。また、上記ＰＧの演算アプリケーションには、上記各変数のリード／ライトを示す情報（命令コード等）も含まれている。本手法では、例えば一例としては、これらの情報を使用する。詳しくは後述する。
【００７０】
上記のように、例えば変数OutAはグローバル変数であるので、ＰＧ２以外の他のＰＧでも使用し得るものであり、上記図３の例ではＰＧ１でも使用している。この為、変数OutA に関しては、ＰＧ１の演算前と後でデータが変わっている可能性があり、これらの前後関係を無視した分割実行は、シングルコアによる演算実行結果と異なる結果をもたらすことがある。
【００７１】
図１０は、上述した図８（ｃ）に示すＰＧ２（FBD表記）の疑似ニーモニック表記例である。
【００７２】
ここでは、上記図８（ｃ）のＰＧ２は、実行オブジェクトコードに変換した場合、ニーモニック表記すると図１０に示すように下記のようになるものとする。
ＬＤ          Ｑ，ＷＩ，２
ＡＤＤ        Ｍ，ＷＩ，１０００
ＳＴ          Ｑ，ＷＩ，４
【００７３】
ここで、ＬＤ、ＡＤＤなどは命令コードを、Ｑ，Ｍなどはメモリ種別を、ＷＩはデータ型（１６bit型など）を、そのあとの数値（2,1000,4）はアドレスを示しているものとする。尚、メモリ種別Ｑは、出力変数を示している。出力変数は、ユーザによりアドレス指定され、システム内の全ＰＯＵからアクセス可能であり、例えばグローバル変数等である。また、上記アドレスの数値（2,1000,4）は、単に一例を示しているだけであり、例えば「％QW2.0」（出力領域(Q)の2局目、0Word）に対してはアドレス‘２’が割り当てられているが、これはコンパイラ１１が割り当てた具体例に過ぎない。尚、この様な割当て結果は記憶されている。
【００７４】
本手法では、出力領域に着目するので、メモリ種別Ｑとなる命令コードに対し処理を行う。命令コードはその種類によって変数に対する挙動が決まり、図１０の例の場合、ＬＤ、ＡＤＤは変数に対し読み出し（リード）のアクションを行い、ＳＴは書き込み（ライト）のアクションを行う。これらはニーモニックとしてあらかじめ規定されており、命令を判別することで、一意に読み出し／書き込みを判別することができる。
【００７５】
そこで、図１１に示すフローチャートの処理により、図１３に示す出力変数参照表８０が作成可能となる。図１２は出力変数参照表８０を作成途中の状態を示し、図１３は図１１の処理完了時の出力変数参照表８０を示すが、これも未だ作成途中と言える。図１１の処理間完了後に不図示のソート処理を行うことで、出力変数参照表８０は図１４に示す完成状態となる。図１２は図１１の処理をＰＧ２に適用した結果を示し、図１３は図１１の処理を他のＰＧ１，ＰＧ３，ＰＧ４，ＰＧ５にも適用して１つに纏めた結果を示す。図１３を、変数名（アドレス）をキーにソートしたものが、図１４となる。
【００７６】
図１２〜図１４に示すように、出力変数参照表８０は、ＰＧ名８１、変数名８２、アドレス８３、Ｒ／Ｗ方向８４の各データ項目より成る。
【００７７】
図１１は、出力変数参照表の生成処理フローチャート図である。
以下、図１１の処理について説明する。尚、ここでは図１０に示すようなニーモニック表記を用いて説明するが、実際のコンピュータ処理では実行オブジェクトコード（機械語命令群）を用いることになる。この機械語命令群には、ＬＤやＡＤＤ等に相当する機械語コード、Ｑ，Ｍ等に相当する機械語コード等が含まれていることになる。
【００７８】
図１１では、概略的には、処理対象のＰＧから１行ずつ命令を読み出してステップＳ１２〜Ｓ１５の処理を実行するものである。まず、処理対象のＰＧから先頭の行の命令を読み出す（ステップＳ１１）。図１０の例では上記「ＬＤ       Ｑ，ＷＩ，２」が読み出されることになる。そして、読み出した命令（処理対象の命令）のメモリ種別が“Ｑ”であれば出力変数（グローバル変数など）に係わる命令と見做して（ステップＳ１２，ＹＥＳ）ステップＳ１３へ移行し、“Ｑ”以外であれば（ステップＳ１２，ＮＯ）そのままステップＳ１６へ移行する。
【００７９】
尚、ステップＳ１２の処理は、基本的に、処理対象の命令が上記出力変数（グローバル変数等）に係わる命令であるか否かを判定するものであり、その為の一例が上記メモリ種別が“Ｑ”であるか否かを判定するものであるが、この例に限るものではない。
【００８０】
ステップＳ１３は、処理対象の命令が読み出し系であるか否かを判定する。そして、処理対象の命令が読み出し系であれば（ステップＳ１３，ＹＥＳ）ステップＳ１４を実行してステップＳ１６を実行し、書込み系であれば（ステップＳ１３，ＮＯ）ステップＳ１５を実行してステップＳ１６を実行する。
【００８１】
上記の通り、ＬＤやＡＤＤは読み込み系、ＳＴは書込み系であるので、上記先頭の行の場合にはステップＳ１３はＹＥＳとなり、ステップＳ１４を実行することになる。ステップＳ１４の処理は、出力変数参照表８０に新規レコードを追加して、アドレスをリード登録する処理である。これより、上記の例では出力変数参照表８０には図１２に示す１行目のレコードが追加登録されることになる。つまり、Ｒ／Ｗ方向８４にはＲ（リード）が登録され、アドレス８３には「％QW2.0」が登録される。更に、グローバル変数の変数シート７０より、アドレス７４＝「％QW2.0」に対応する変数名７１はOutAであるので、変数名８２にはOutAが登録される。更に、処理対象のＰＧ名（ここではＰＧ２）が、ＰＧ名８１に登録される。
【００８２】
そして、処理対象を次の行の命令にして（ステップＳ１６）ステップＳ１２に戻る。但し、次の行の命令が無ければ（ステップＳ１７，ＹＥＳ）本処理を終了する。ここでは、図１０の２行目の「ＡＤＤ     Ｍ，ＷＩ，１０００」が処理対象となって（ステップＳ１７，ＮＯ）ステップＳ１２に戻ることになる。そして、メモリ種別がＭであることからステップＳ１２がＮＯとなって、そのままステップＳ１６に移行することになり、次の処理対象が上記「ＳＴ   Ｑ，ＷＩ，４」となってステップＳ１２に戻る。
【００８３】
今度はステップＳ１２がＹＥＳでステップＳ１３がＮＯとなるので、出力変数参照表８０に新規レコードを追加して、アドレスをライト登録する（ステップＳ１５）。これより、出力変数参照表８０には図１２に示す２行目のレコードが追加登録されることになる。つまり、Ｒ／Ｗ方向８４にはＷ（ライト）が登録され、アドレス８３には「％QW2.１」が登録され、変数名８２にはOutCが登録され、ＰＧ名８１にはＰＧ２が登録される。
【００８４】
以上のＰＧ２を対象とする図１１の処理によって出力変数参照表８０は図１２に示す状態となる。更にＰＧ１，ＰＧ３，ＰＧ４，ＰＧ５についても順次、図１１の処理を行うことで、出力変数参照表８０は図１３に示す状態となる。そして、出力変数参照表８０のレコードを、アドレス８３（または変数名８２）をキーにしてソートすることで、図１４に示す状態（完成状態）となる。ここではアドレス８３が小さいものから順に並べるようにソートした例を示すが、この例に限らない。
【００８５】
そして、完成状態の出力変数参照表８０を用いて、図１５の対応ＰＧ表作成処理を実行することで、例えば図１６に示す出力変数対応ＰＧ表９０を作成する。同一の変数に対して読み出し方向と書き込み方向が混在すると、プログラムの実行関係を維持する必要性があるので、図１５の処理によってＰＧのグループ表を作成する。
【００８６】
図１５の処理例では、概略的には、２つの処理用変数（第１変数、第２変数）を用い、これら各処理用変数に出力変数参照表８０の変数名（あるいはアドレスであってもよい）とＲ／Ｗ方向を格納し、２つの処理用変数を比較しながら所定の処理を実行する。グループ化すべきＰＧは、同一変数にアクセスしており、且つ、Ｒ／Ｗ方向が異なるものである（Ｒのみの場合、データ変更無しなのでグループ化の必要なし。Ｗのみ複数の場合、出力競合状態でありアプリケーション不具合となる）。
【００８７】
図１５（ａ）は対応ＰＧ表作成処理のフローチャート図であり、図１５（ｂ）はそのステップＳ２６のＰＧ登録処理の詳細フローチャート図である。
【００８８】
本処理では、処理中に２つの処理用変数（第１変数、第２変数）を用いる。
そして、まず、出力変数参照表８０の先頭レコードの変数名８２とＲ／Ｗ方向８４を第１変数に代入すると共に（ステップＳ２１）、２番目のレコードの変数名８２とＲ／Ｗ方向８４を第２変数に代入する（ステップＳ２２）。これより、図１４の例の場合には、第１変数には「OutA，W」、第２変数には「OutA，R」が代入された状態となる。
【００８９】
そして、まず、第１変数と第２変数とで変数名が同一か否かを判定し（ステップＳ２３）、同一であれば（ステップＳ２３，ＹＥＳ）ステップＳ２４へ移行し、異なる場合には（ステップＳ２３，ＮＯ）そのままステップＳ２７へ移行する。上記の例では変数名は両方とも「OutA」であるので、ステップＳ２３はＹＥＳとなる。
【００９０】
ステップＳ２４では第１変数と第２変数とでＲ／Ｗ方向が同一か否かを判定し、同一である場合には（ステップＳ２４，ＹＥＳ）ステップＳ２５へ移行し、異なる場合には（ステップＳ２４，ＮＯ）ステップＳ２６へ移行する。上記の例ではＲ／Ｗ方向は、第１変数が「Ｗ」、第２変数が［Ｒ］であるので、ステップＳ２４はＮＯとなり、ＰＧ登録処理を行う（ステップＳ２６）。一方、Ｒ／Ｗ方向が同一である場合には（ステップＳ２４，ＹＥＳ）、出力変数参照表８０における次のレコードの変数名８２とＲ／Ｗ方向８４を、第２変数に代入したうえで（ステップＳ２５）ステップＳ２３に戻る。
【００９１】
ここで、上記ステップＳ２６のＰＧ登録処理の具体例を、図１５（ｂ）に示し、以下、説明する。
【００９２】
図１５（ｂ）に示すＰＧ登録処理では、まず、第１変数を第２変数に代入する（ステップＳ３０）。上記の例では、第１変数＝「OutA，W」であるので、これが第２変数に代入されることになり、以って第１変数と第２変数が両方とも「OutA，W」の状態となる。従って最初は必ず後述するステップＳ３１の判定はＹＥＳとなることになる。その後も、次のレコードの変数名が第１変数と同じであればステップＳ３１の判定はＹＥＳとなることになる。
【００９３】
ステップＳ３１では第１変数と第２変数とで変数名が同一であるか否かを判定し、同一であれば（ステップＳ３１，ＹＥＳ）、この変数名に対応するＰＧ名８１を出力変数参照表８０から抽出して出力変数対応ＰＧ表９０に登録する（ステップＳ３２）。上記一例では、出力変数対応ＰＧ表９０には変数名＝OutAに対応付けてＰＧ１とＰＧ２が登録されることになる。つまり、図１６における１行目のデータが登録されることになる。尚、図１６では、各変数名に対応付けられるＰＧ名には図示の“○”が記される。尚、出力変数対応ＰＧ表９０は、初期状態では何もデータは無い。
【００９４】
上記ステップＳ３２の処理が完了したら、上記第２変数に対応するレコードを次のレコードにする。つまり、出力変数参照表８０における次のレコードの変数名８２とＲ／Ｗ方向８４を、第２変数に代入したうえでステップＳ３１に戻る。上記一例では次は３行目のレコードが対象となるので、第２変数には「OutB，W」が代入された状態となる。従って、今度はステップＳ３１の判定はＮＯとなるので、本処理を終了し、図１５（ａ）におけるステップＳ２７の処理へ移行する。
【００９５】
ステップＳ２７では、第２変数を第１変数に代入する。上記一例では現在の第２変数は「OutB，W」となっているので、ステップＳ２７の処理によって第１変数も「OutB，W」となる。そして、第２変数に対応するレコードを次のレコードにする（ステップＳ２８）。つまり、出力変数参照表８０における次のレコードの変数名８２とＲ／Ｗ方向８４を、第２変数に代入する。上記一例では、４行目のレコードにより第２変数には「OutB，R」が代入されることになる。
【００９６】
上記ステップＳ２７，Ｓ２８の処理により、上記一例では第１変数＝「OutB，W」、第２変数＝「OutB，R」の状態となる。そして、ステップＳ２３に戻る。但し、次のレコードが無い場合には（ステップＳ２９，ＹＥＳ）、本処理を終了する。次のレコードがある場合に（ステップＳ２９，ＮＯ）ステップＳ２３に戻る。
【００９７】
上記のように、今度は第１変数＝「OutB，W」、第２変数＝「OutB，R」の状態でステップＳ２３以降の処理を行うと、出力変数対応ＰＧ表９０には変数名＝OutBに対応付けてＰＧ１とＰＧ４が登録されることになる。つまり、図１６における２行目のレコードが登録されることになる。その後、図１４に示す出力変数参照表８０の５行目以降のレコードについても順次処理対象として上述した処理を実行することで、最終的に、出力変数対応ＰＧ表９０は図１６に示す状態となり、以って完成したことになる。
【００９８】
図１６に示すように、出力変数対応ＰＧ表９０には、各出力変数毎に、その出力変数に係わる（出力する、又は、参照する）ＰＧが、登録されることになる。これより、この出力変数対応ＰＧ表９０より、任意の「出力変数」に関して相互に関連性のあるＰＧ同士が、判別できることになる。
【００９９】
これより、この様に生成した出力変数対応ＰＧ表９０を用いて、例えば図１７に示すグループ生成処理を実行することで、ＰＧのグループ化を実現する。
【０１００】
図１７は、グループ生成処理のフローチャート図である。
以下、図１７の処理について、図１６に示す出力変数対応ＰＧ表９０の具体例と、これに応じた処理中の具体的イメージ（図１８、図１９、図２０）を参照して説明する。
【０１０１】
図１８、図１９、図２０は、グループ生成処理の具体例の処理イメージを示す図である。
【０１０２】
図１７の処理では、まず最初に、全てのＰＧ（上記一例ではPG1,PG2,PG3,PG4,PG5）を、未割付けＰＧとして登録する（ステップＳ４１）。これら全てのＰＧが割付済みの状態となったら（未割付けＰＧが無くなったら）（ステップＳ４８，ＹＥＳ）本処理は終了となる。
【０１０３】
次に、処理対象とする「処理グループ」を１つ生成する（ステップＳ４２）。例えば図１８に示す「処理グループ１」を生成する。そして、未割付けＰＧ集合から最初のＰＧ（ＰＧ１）を取得し、現在の処理対象グループである「処理グループ１」にキュー登録する（図１８の下側にイメージを示す）（ステップＳ４３）。尚、未割付けＰＧ集合からのＰＧ取得は、例えば図７で定義された順番で行う。
【０１０４】
そして、現在の処理対象グループ（処理グループ１）にキュー登録されたＰＧ番号を順番に取得して処理対象とし、処理対象ＰＧについてステップＳ４４，Ｓ４５の処理を行うことを繰り返すことで、現在の処理対象グループへの該当ＰＧ割当てが行われる。
【０１０５】
これは、まず、出力変数対応ＰＧ表９０において処理対象ＰＧ番号が有効（“○”）となっている変数を求めることで、フィルタリングを行う（ステップＳ４４）。つまり、出力変数対応ＰＧ表９０において処理対象ＰＧ番号が有効（“○”）となっている変数のレコードを全て抽出する。最初は、処理対象ＰＧはＰＧ１であるので、図１６に示す出力変数対応ＰＧ表９０から図１９（ａ）に示す２つのレコードが抽出されることになる。
【０１０６】
そして、抽出したレコードにおいて処理対象ＰＧ番号以外で有効（“○”）となっているＰＧ番号を全て、処理グループのキューに追加登録していく（ステップＳ４５）。図１９（ａ）に示す例ではＰＧ１以外にはＰＧ２とＰＧ４が有効（○）となっているので、図１９（ｂ）に示すように、ＰＧ２とＰＧ４が「処理グループ１」のキューに追加登録されることになる。つまり、「処理グループ１」には最初はＰＧ１のみ登録されていたが、図１９（ｂ）に示すように、更にＰＧ２とＰＧ４も登録された状態となる。但し、ステップＳ４５の処理では、既に処理対象グループに登録済みであるＰＧ番号は、キュー登録しない。
【０１０７】
そして、「処理グループ１」に次の登録ＰＧ番号がある場合には、これを次の処理対象ＰＧにして（ステップＳ４６）（ステップＳ４７，ＮＯ）ステップＳ４４に戻る。上記の例では現在の処理対象であるＰＧ１の次にＰＧ２が登録された状態となっているので、ＰＧ２が次の処理対象となる。そして、ＰＧ２について上記ステップＳ４４、Ｓ４５の処理を実行すると、図１６に示す１行目と３行目（OutAとOutC）のレコードが抽出され、ＰＧ２以外にはＰＧ１とＰＧ４が有効になっているが、これらは既に「処理グループ１」に登録済みであるので、追加登録は行わない。
【０１０８】
続いて、ＰＧ４が次の処理対象となりステップＳ４４に戻ると、今度は図１６に示す２行目と３行目（OutBとOutC）のレコードが抽出され、ＰＧ４以外にはＰＧ１とＰＧ２が有効になっているが、これらは既に「処理グループ１」に登録済みであるので、追加登録は行わない。
【０１０９】
そして、キューには次の登録ＰＧ番号は無いので（ステップＳ４７，ＹＥＳ）ステップＳ４８へ移行する。ステップＳ４８では、未割付けＰＧの有無をチェックし、未割付けＰＧが無ければ（ステップＳ４８，ＹＥＳ）本処理を終了し、未割付けＰＧがあれば（ステップＳ４８，ＮＯ）ステップＳ４２に戻る。
【０１１０】
上記一例では、ＰＧ１，ＰＧ２，ＰＧ４が「処理グループ１」に登録済みであるので、未割付けＰＧとしてＰＧ３とＰＧ５が残っているので、ステップＳ４８はＮＯとなり、ステップＳ４２に戻ることになる。そして、今度は、ステップＳ４２で「処理グループ２」が生成され、ステップＳ４３でＰＧ３が「処理グループ２」にキュー登録される。そして、上記ステップＳ４４〜Ｓ４７の処理が行われることで、最終的には、「処理グループ２」には図２０に示すようにＰＧ３とＰＧ５が登録されることになる。
【０１１１】
このように、上記ステップＳ４２〜Ｓ４８の処理を、未割付けＰＧが無くなるまで繰り返すことで、全てのＰＧが任意の処理グループに割り付けられる（仮に、出力変数を他と共有していないＰＧがある場合は、このＰＧのみが任意の処理グループに割り付けられることになる；単独処理可能なＰＧとして、個別に処理グループを割り付けられることになる）。
【０１１２】
そして、上記のように生成された処理グループ単位で、各ＰＧを任意のＣＰＵに割り付ける。ある処理グループに属するＰＧは、全て、同じＣＰＵに割り付けられることになる。換言すれば、出力変数を共有する（関連がある）ＰＧ同士は、同じＣＰＵに割り付けられることになる。これより、上記課題を解決できることになる。
【０１１３】
図２１は、開発支援装置１０のハードウェア構成図である。
図示の例では、開発支援装置１０は、ＣＰＵ１０１、メモリ１０２、入力部１０３、出力部１０４、記憶部１０５、記憶媒体駆動部１０６、ネットワーク接続部１０８等を有する。入力部１０３はたとえばキーボード／マウス等、出力部１０４は例えば液晶ディスプレイ、記憶部１０５は例えばハードディスク等であるが、これらの例に限らない。
【０１１４】
ネットワーク接続部１０８は、例えばネットワーク１に接続し、ネットワーク１を介してＰＬＣモジュール２等との通信を実現する。記憶媒体駆動部１０６は、例えばＣＤ−ＲＯＭ等の記憶媒体１０７に対してデータ・リード／ライト等を行う。
【０１１５】
記憶部１０５には、予め所定のアプリケーションプログラムが記憶されている。ＣＰＵ１０１が、このアプリケーションプログラムを実行することで、上述した開発支援装置１０の各種処理機能（図１の各種処理機能部、図２や図１１や図１５のフローチャート図の処理など）を実現できる。
【０１１６】
本手法の支援装置は、当該支援装置と複数の演算処理部を有するＰＬＣシステムに係わるコンピュータ装置である。任意のアプリケーションの実行に係わる負荷を該複数の演算処理部に分散させ実行する。この支援装置のハードウェア構成は、例えば図２１と同様であって構わない。よって、例えば上記記憶部１０５に記憶されている所定のアプリケーションプログラムを、ＣＰＵ１０１が実行することで、下記の各種処理機能部が実現される。
【０１１７】
尚、本手法の支援装置の一例が上記開発支援装置１０であるが、この例に限らない。
また、本手法の支援装置は、例えば、図２２に示す各種処理機能部を有するものと見做しても構わない。
【０１１８】
図２２に示す例の支援装置２００は、上記アプリケーションを構成する複数の処理単位を、任意の出力変数と関連性のある処理単位は全て同一のグループとなるようにグループ分けするグループ化機能部２０１と、上記複数の処理単位を上記グループ単位で上記複数の演算処理部の何れかに割り当てる負荷配分機能部２０２とを有する。
【０１１９】
上記グループ化機能部２０１は、例えば、任意の上記処理単位とその上記出力変数を参照する処理単位とが同一のグループとなるように上記グループ分けを行う。
【０１２０】
上記グループ化機能部２０１は、例えば、上記処理単位毎に、その処理単位からの出力変数、その処理単位が参照する出力変数を抽出し、該抽出結果に基づいて任意の出力変数を出力する処理単位と参照する処理単位とを上記関連性のある処理単位とする。
【０１２１】
上記グループ化機能部２０１は、例えば、上記処理単位毎に、その処理単位で使用する出力変数と参照する出力変数を抽出し、該抽出結果と予め登録される該処理単位の実行順序に基づいて、任意の前段の処理単位からの出力変数を参照する後段の処理単位を求めて該処理単位間を接続することで出力参照関係がある処理単位間を接続し、該出力参照関係に基づいてグループを生成する。
【０１２２】
上記グループ化機能部２０１は、例えば下記の各処理機能部を有するものであってもよい。
【０１２３】
・上記処理単位毎に、その処理単位の命令群の中で上記出力変数に係わる命令の変数名とリード／ライトを、その処理単位名と共に第１記憶部に登録する第１登録機能部２０３；
【０１２４】
・該第１記憶部の格納データを上記登録された各変数名に基づいてソートするソート機能部２０４；
【０１２５】
・該ソート後の第１記憶部の各データを順次対象にして、変数名が同一且つリード／ライトが異なるデータの組を抽出して、該抽出データの上記処理単位名を該変数名に対応付けて第２記憶部に登録する第２記憶部登録機能部２０５；
【０１２６】
該第２記憶部に基づいて、任意の処理単位の処理単位名に対応する変数名を全て抽出すると共に、該抽出した変数名に対応付けられた処理単位名を全て抽出して、該抽出した処理単位名の処理単位を全て同じグループに入れるグループ分け機能部２０６。
尚、上記第１登録機能部２０３による処理の一例が、上記図１１の処理である。
【０１２７】
上記ソート機能部２０４の処理の一例が、上記図１３から図１４を生成する処理である。
上記第２記憶部登録機能部２０５の処理の一例が上記図１５の処理である。
上記グループ分け機能部２０６の処理の一例が上記図１７の処理である。
【０１２８】
以上説明した本例のＰＬＣシステム、その開発支援装置１０、支援装置２００、プログラム等によれば、任意のアプリケーション実行に係わる負荷を複数の演算処理部に分散させるＰＬＣシステムにおいて、自動的に適切な負荷配分を行えるようにできる。
【０１２９】
適切な負荷配分とは、例えば上記のように、出力変数の参照関係において関連性がある処理単位同士は同一の演算処理部に割り当てられることである。これによって、上記課題を解決できる。すなわち、「演算の前後関係が崩れ、１つのＣＰＵリソースで実行した場合と複数のＣＰＵリソースで演算を行った場合の、制御結果が異なる可能性がある」という問題が、起こらないようにできる。以って、ユーザのアプリケーション配分設計の効率を向上させることができる。
【符号の説明】
【０１３０】
１  ネットワーク
２  ＰＬＣモジュール
２ａ，２ｂ  ＣＰＵ
１０  開発支援装置
１１  コンパイラ
１２  リンカ
１３  出力変数抽出機能部
１４  出力参照関係生成部
１５  負荷配分機能部
２１  演算出力・出力参照表
２２  出力参照関係グラフ
４０  矩形
４１  出力変数
４２  参照出力（入力変数）
５１  タスク
５２  ＰＧ
６０  変数シート
６１  変数名
６２  データ型
６３  変数の種別
６４  アドレス
７０  グローバル変数の変数シート
７１  変数名
７２  データ型
７３  種別
７４  アドレス
７５  初期値
８０  出力変数参照表
８１  ＰＧ名
８２  変数名
８３  アドレス
８４  Ｒ／Ｗ方向
９０  出力変数対応ＰＧ表
１０１  ＣＰＵ
１０２  メモリ
１０３  入力部
１０４  出力部
１０５  記憶部
１０６  記憶媒体駆動部
１０７  記憶媒体
１０８  ネットワーク接続部
２００  支援装置
２０１  グループ化機能部
２０２  負荷配分機能部
２０３  第１登録機能部
２０４  ソート機能部
２０５  第２記憶部登録機能部
２０６  グループ分け機能部
【図１】
2018180706.tif 000003
【図２】
2018180706.tif 000004
【図３】
2018180706.tif 000005
【図４】
2018180706.tif 000006
【図５】
2018180706.tif 000007
【図６】
2018180706.tif 000008
【図７】
2018180706.tif 000009
【図８】
2018180706.tif 000010
【図９】
2018180706.tif 000011
【図１０】
2018180706.tif 000012
【図１１】
2018180706.tif 000013
【図１２】
2018180706.tif 000014
【図１３】
2018180706.tif 000015
【図１４】
2018180706.tif 000016
【図１５】
2018180706.tif 000017
【図１６】
2018180706.tif 000018
【図１７】
2018180706.tif 000019
【図１８】
2018180706.tif 000020
【図１９】
2018180706.tif 000021
【図２０】
2018180706.tif 000022
【図２１】
2018180706.tif 000023
【図２２】
2018180706.tif 000024