(57)【要約】【課題】  プログラム構成要素単位でＲＵＮ中更新を行うコントローラが、異常な動作を行う可能性を極めて少なくする。【解決手段】  コントローラ支援装置１０は、コントローラ３で実行する制御プログラムを、プログラム構成要素単位で更新させ、これをコンパイラ１でコンパイルさせた後、コントローラ３に転送して、旧版のプログラム構成要素と置き換えさせる。その際、転送対象要素探索部１４は、該プログラム構成要素の更新によって影響を受ける可能性がある全てのプログラム構成要素を判別する。支援装置１０は、これらを一括してコンパイル１にてコンパイルさせた後、コントローラ３に転送させる。【選択図】図１
2006318197.tif 000002
【特許請求の範囲】
【請求項１】
複数のプログラム構成要素を用いる構造化プログラムを実行するコントローラに対して、更新されたプログラム構成要素を転送して旧版のプログラム構成要素と置き換えさせるものであって、該転送の際に前記プログラム構成要素をコンパイルさせるコントローラ支援装置であって、
前記構造化プログラムで用いる各プログラム構成要素の更新の有無を検出する更新有無検出手段と、
少なくとも１つのプログラム構成要素が更新された場合に、該プログラム構成要素の更新によって影響を受ける可能性がある全てのプログラム構成要素を判別して、これらプログラム構成要素を一括してコンパイルさせてコントローラ側に格納させる転送対象要素探索手段と、
を有することを特徴とするコントローラ支援装置。
【請求項２】
前記プログラム構成要素の更新によって影響を受ける可能性があるプログラム構成要素は、少なくとも前記更新されたプログラム構成要素の呼び出し元のプログラム構成要素であることを特徴とする請求項１記載のコントローラ支援装置。
【請求項３】
コンピュータに、
構造化プログラムで用いる各プログラム構成要素の更新の有無を検出する機能と、
少なくとも１つのプログラム構成要素が更新された場合に、該プログラム構成要素の更新によって影響を受ける可能性がある全てのプログラム構成要素を判別して、これらプログラム構成要素を一括してコンパイルさせてコントローラ側に格納させる機能と、
を実現させる為のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラマブルコントローラのユーザプログラム更新において、特に、プログラマブルコントローラの運転中にプログラム構成要素を更新する手法に関する。
【背景技術】
【０００２】
プログラマブルコントローラは、FA(Factory Automation)等の用途に使われるコンピュータであり、その適用システムは、ユーザの要求仕様により、24時間稼動等、極力停止が望まれないシステムが多く存在する。
【０００３】
しかしながら、システムで稼動するユーザプログラムは、ユーザの単純なプログラムミスや動作仕様の変更、機器の経年変化による設定値の変更など、さまざまな理由により、プログラムの更新が要求される。
【０００４】
これらの条件を満たすため、プログラマブルコントローラにおいては、コントローラの運転中のプログラム更新(以下RUN中更新と呼ぶ)機能が具備されているものがある。現在、一般的に行われているRUN中更新には、その変更範囲からおおよそ以下の3パターンが考えられる。
【０００５】
すなわち
・プログラム内の1命令(ステップ)単位、又はプログラム構成要素単位で命令を置き換える。
・複数あるプログラムのうちの1プログラムを全て変更する。
・ひとつのプログラマブルコントローラにある複数のプログラムを同時に変更する。
である。
【０００６】
このようなRUN中のプログラム更新に関して、特許文献１においては、コントローラ上にプログラムコード用メモリを2バンク持ち、いずれかのプログラムコード用メモリを書き換え、プログラム格納バンクテーブルを変更することで、複数プログラムを同時更新する手法が提案されている。
【０００７】
また、特許文献２においては、実際のコントローラの実行コードであるプログラムを格納する領域と、各プログラムの先頭アドレスを示したテーブルを持ち、更新プログラムをプログラム格納領域に書き込み完了した時点で、プログラムアドレステーブルのアドレスを変更する手法を提案している。
【特許文献１】特開平１０−２０７５１２号公報
【特許文献２】特開２００１−１４２５１０号公報
【発明の開示】
【発明が解決しようとする課題】
【０００８】
また、本出願の出願人は、特願２００５−０１６１２２号（以下、先願と呼ぶ）の発明を提案している。この発明では、例えば図１２（ａ）〜（ｃ）に示すように、コントローラのプログラムメモリに格納されているプログラムの一部をＲＵＮ中更新する為に、プログラム変更要求キューを用いている。図示の例では、ＰＧ１、ＰＧ３、ＰＧ８、及びＰＧ９がプログラムメモリに格納されていた状態で、ＰＧ３の更新版であるＰＧ３’、ＰＧ９の更新版であるＰＧ９’を、コントローラ支援装置側からコントローラにダウンロードして、これをコントローラにおいてプログラムメモリに格納し、旧版のＰＧ３、ＰＧ９と置き換えている。
【０００９】
ここで、図示のＰＧ１、ＰＧ３、ＰＧ８、及びＰＧ９は、それぞれが１つのプログラムを意味するものであってもよいし、それぞれがプログラム構成要素を意味するものであってもよい。プログラム構成要素とは、ファンクション、ファンクションブロック等のことである。すなわち、例えばIEC61131-3に示されるように、制御プログラムにおいても、従来のラダー図のように１つのプログラムで全ての制御シーケンスを記述するスタイルから、ファンクションやファンクションブロックを使い、構造化されたプログラムを作成するスタイルが推奨されてきている。この様な構造化プログラムの実行の際には、任意のプログラム構成要素から別のプログラム構成要素（サブルーチンとなる子ノード等）を呼び出して実行させる。
【００１０】
上記プログラム規格ＩＥＣ６１１３１−３では、プログラムの構造化、カプセル化によるプログラムの可読性の向上並びにメンテナンス性の向上、基本機能のファンクションブロックライブラリ化によるプログラム品質の向上、納期の短期化等の面から、ファンクションブロックによるプログラミングを推奨している。このファンクションブロックによるプログラミングを行う場合には、まず、機能単位等でファンクションブロックを作成し、これらのファンクションブロックを呼び出すプログラム（これもプログラム構成要素の１つとして扱うものとする）を作成し、このプログラムを、定周期、割り込み、イベント等その実行タイミングの制御単位であるタスクに割りつけることで、制御プログラムを作成している。
【００１１】
ファンクションブロックは、プログラムを構造化するためのプログラミング手法であって、データ入力領域とデータ出力領域と内部変数領域とからなるデータ構造（インスタンス）と、これらのデータを用いて実行されるプログラムとから構成されている。
【００１２】
制御プログラムとして、この様な構造化プログラムを用いる場合には、上記の通り、制御プログラムの一部のみを（すなわちプログラム構成要素単位で）更新させることができる。
【００１３】
ここで、上記任意のプログラム構成要素から他のプログラム構成要素の呼び出しや復帰の際に、このプログラム構成要素間で、上記データ構造（インスタンス）を用いて、パラメータや戻り値の交換を行うことが必須となる。上記データ構造における各領域の割り当ては、コンパイルの際に行われ、呼び出されるプログラム構成要素と呼び出し元のプログラム構成要素とを一緒にコンパイルすれば、パラメータや戻り値の交換が正常に行われるように、オブジェクトコードが生成される。しかし、変更のあったプログラム構成要素のみをコンパイルしてダウンロードすると、インタフェースが呼び出し元と呼び出し先とで不一致となる可能性があり、上記パラメータや戻り値の交換が正常に行われず、コントローラが異常な動作を行う可能性がある。
【００１４】
これを防ぐ為には、支援装置において任意のプログラム構成要素が変更されたときに、この変更されたプログラム構成要素だけでなく、当該プログラム構成要素の変更によって上記パラメータや戻り値の交換に関する影響を受ける全てのプログラム構成要素を一括して、コントローラ側にダウンロードして更新させればよい。尚、説明していなかったが、支援装置においてはプログラム構成要素のソースファイルが作成されるものであり、これをコントローラ側にダウンロードする際には、当該ソースファイルをコンパイラによってコンパイルしてオブジェクトコードを生成し、このオブジェクトコードをコントローラ側に渡すようにしている（以下の説明では、逐一言わなくても、ダウンロードする場合には必ずコンパイルが行われているものとする）。よって、上記変更されたプログラム構成要素及び影響を受ける全てのプログラム構成要素を一括してコンパイルすることで、インタフェースが呼び出し元と呼び出し先とで一致するようなオブジェクトコードが生成されるので、上記問題が解決されることになる。
【００１５】
しかしながら、従来では、上記影響を受ける全てのプログラム構成要素を、ユーザが判断して指定しなければならなかったが、ユーザの指定に漏れがあった場合、必要なプログラム構成要素をダウンロードせずに更新を行ってしまい、インタフェースが呼び出し元と呼び出し先とで不一致となり、コントローラが異常な動作を行う可能性がある。このリスクを回避する為には、結局、ＲＵＮ中更新を諦めて、コントローラを停止させた上、全プログラム構成要素をコントローラに転送して更新しなければならなかった。
【００１６】
本発明の課題は、制御プログラムとして構造化プログラムを用い、プログラム構成要素単位でＲＵＮ中更新を行うプログラマブルコントローラ・システムにおいて、支援装置側で、更新されたプログラム構成要素の影響を受ける全てのプログラム構成要素を判別して、これらを一括してコンパイルさせてコントローラ側にダウンロードすることで、コントローラが異常な動作を行う可能性を極めて小さくすることができるコントローラ支援装置、プログラム等を提供することである。
【課題を解決するための手段】
【００１７】
本発明のコントローラ支援装置は、複数のプログラム構成要素を用いる構造化プログラムを実行するコントローラに対して、更新されたプログラム構成要素を転送して旧版のプログラム構成要素と置き換えさせるものであって、該転送の際に前記プログラム構成要素をコンパイルさせるコントローラ支援装置であって、前記構造化プログラムで用いる各プログラム構成要素の更新の有無を検出する更新有無検出手段と、少なくとも１つのプログラム構成要素が更新された場合に、該プログラム構成要素の更新によって影響を受ける可能性がある全てのプログラム構成要素を判別して、これらプログラム構成要素を一括してコンパイルさせてコントローラ側に格納させる転送対象要素探索手段とを有するように構成する。
【００１８】
例えば、前記プログラム構成要素の更新によって影響を受ける可能性があるプログラム構成要素は、少なくとも前記更新されたプログラム構成要素の呼び出し元のプログラム構成要素である。
【００１９】
上述してある通り、更新されたプログラム構成要素のみをコンパイルしてコントローラ側に渡すと、データ構造が変化して、呼び出し元のプログラム構成要素との入出力関係が不一致となり誤動作を引き起こす可能性があるが、上記コントローラ支援装置では、該プログラム構成要素の更新によって影響を受ける可能性がある全てのプログラム構成要素（少なくとも呼び出し元のプログラム構成要素）を判別して、これらを一括してコンパイルさせるので、人間によるミスが生じることもなく、この問題を解決できる。
【発明の効果】
【００２０】
本発明のコントローラ支援装置、プログラム等によれば、制御プログラムとして構造化プログラムを用い、プログラム構成要素単位でＲＵＮ中更新を行うプログラマブルコントローラ・システムにおいて、支援装置側で、更新されたプログラム構成要素の影響を受ける全てのプログラム構成要素を判別して、これらを一括してコンパイルさせてコントローラ側にダウンロードすることで、コントローラが異常な動作を行う可能性を極めて小さくすることができる。
【発明を実施するための最良の形態】
【００２１】
以下、図面を参照して、本発明の実施の形態について説明する。
図１は、本例のプログラマブルコントローラ・システムの概略構成図である。
図１において、コントローラ支援装置１０は、ユーザが所望の制御プログラムを作成したり所望の指示を行う為の入力装置１２と、図示表現される制御プログラム等を表示する表示装置１１、および所定のアプリケーション・プログラムを記憶するための記憶媒体１３（ハードディスク、ＣＤ−ＲＯＭ等）等を有し、本例では更に転送対象要素探索部１４を有する。
【００２２】
コンパイラ１は、コントローラ支援装置１０で作成された制御プログラム（ソースファイル）を、コントローラ３（プログラマブル・コントローラ本体等）で実行できるコード（オブジェクトコード）に変換する。このようにして変換したコードを伝送装置２を介してコントローラ３に転送し、コントローラ３はこれを格納する。尚、以下の説明では、伝送装置２に関しては省略して説明する。
【００２３】
尚、図では、コンパイラ１とコントローラ支援装置１０とを別に示しているが、これらは同一のハード(たとえばパソコン上)で構成されていてもよい。また、本発明の特徴である転送対象要素探索部１４は、図示の例ではコントローラ支援装置１０が備えるものとしているが、これをコンパイラ１が備えるようにしてもよい。
【００２４】
尚、コントローラ支援装置１０は、例えばパソコン等のコンピュータにより実現されるものであり、従って特に図示していないが、当然、ＣＰＵ、メモリ、通信インタフェース等も有しており、ＣＰＵが上記記憶媒体１３に格納されている所定のアプリケーション・プログラムを読出し・実行することにより、上記転送対象要素探索部１４の機能が実現される他、従来よりある機能、すなわちユーザに上記制御プログラム（コントローラ３で実行される、不図示の各種制御対象を制御する為のプログラムであり、例えば定周期プログラム等である）を作成させ、この制御プログラムをコンパイラ１等を介してコントローラ３側に送信する機能を実現させるものである。
【００２５】
同様に、コントローラ３も、特に図示していないが、ＣＰＵ／ＭＰＵ、メモリ等の記憶装置、通信インタフェース等を有している。この記憶装置は、例えば制御プログラムを格納するプログラムメモリ等である。
【００２６】
本例では、上記制御プログラムは、上述してあるIEC61131-3に準拠する、ファンクションやファンクションブロック等のプログラム構成要素を用いる構造化プログラムである。そして、コントローラ支援装置１０は、制御プログラムをプログラム構成要素単位で更新し、この更新版のプログラム構成要素をコントローラ３に転送して、旧版と置き換えさせることができる。よって、勿論、本例のコントローラ３は、この様な構造化プログラムを実行可能な装置であり、また転送されてきた更新版のプログラム構成要素をプログラム構成要素単位でプログラムメモリに格納して旧版と置き返える機能を備える。
【００２７】
上記転送対象要素探索部１４は、複数のプログラム構成要素のうち、少なくとも１つのプログラム構成要素が更新（バージョンアップ版や不具合箇所の修正版等）された場合に、更新されたプログラム構成要素の影響を受ける全てのプログラム構成要素を判別して、これらをまとめてコンパイラ１に渡すことで、これらを一括してコンパイルさせてオブジェクトコードを生成させる。これによって、インタフェースが呼び出し元と呼び出し先とで一致するようなオブジェクトコードが生成される。
【００２８】
生成されたオブジェクトコードは、伝送装置２を介してコントローラ３に転送される。コントローラ３は、受信したオブジェクトコードを用いて、例えば上記先願に記載された手法によって（あるいは他の従来技術（例えば特開平10-207512号公報）の手法によって）、プログラムメモリに格納されているプログラムのＲＵＮ中更新処理を実行する。
【００２９】
以下、上記転送対象要素探索部１４の処理・機能について詳細に説明するが、その前に、上述してあるファンクションやファンクションブロック等のプログラム構成要素を用いる構造化プログラムについて、一例を示して説明しておく。
【００３０】
図２に、コントローラ３に格納される制御プログラムの構成例を示す。
既に述べてある通り、制御プログラムは、通常、タスク２１上に構成される。タスク２１は、予めコントローラ３に内蔵されており、不図示のプログラムメモリに格納されている各プログラムを、所定のスケジュールに従って呼び出す。ここでは、仮に、プログラムＡ２２、プログラムＢ２３がプログラムメモリに格納されているものとする。尚、上述してある通り、タスク２１が呼び出すこれらプログラムＡ２２、プログラムＢ２３も、プログラム構成要素の１つと見做すものとする。また、プログラムメモリには、これら各プログラムＡ２２、プログラムＢ２３が実行中に呼び出すファンクションやファンクションブロックも格納される。呼び出されたファンクションブロックが、更に別のファンクションブロックやファンクションを呼び出す場合もある。
【００３１】
図示の例では、プログラムＡ２２は、ファンクションブロック“ＦＢ１”２４を呼び出し、呼び出された“ＦＢ１”２４は更にファンクション“ＦＣＴ10”２８を呼び出す。また、プログラムＡ２２は更にファンクションブロック“ＦＢ２”２５も呼び出す。
【００３２】
同様に、プログラムＢ２３は、ファンクションブロック“ＦＢ３”２６を呼び出し、呼び出された“ＦＢ３”２６は更にファンクションブロック“ＦＢ１”２９を呼び出し、呼び出された“ＦＢ１”２９は更にファンクション“ＦＣＴ10”３０を呼び出す。また、プログラムＢ２３は更にファンクション“ＦＣＴ10”２７も呼び出す。
【００３３】
“ＦＢ１”２４と“ＦＢ１”２９は同一のものである。“ＦＣＴ10”２８とＦＣＴ10”３０と“ＦＣＴ10”２７は同一のものである。すなわち、ファンクションブロックやファンクションは、再利用可能なものである。また、同一のファンクションブロック／ファンクションから呼び出されるファンクションブロック／ファンクションは、当然、同一となる（上記の例では“ＦＢ１”は必ずファンクション“ＦＣＴ10”を呼び出す）。
【００３４】
図３に、ファンクションブロックの一例を示す。
ファンクションブロックやファンクションは、プログラムの中で繰返し用いられるような処理をまとめ、入出力のインタフェースのみを外部に示すことで、制御プログラムのメンテナンス性、再利用性を高めるものである。ファンクションブロックとファンクションとの違いは、ファンクションブロックでは後述するように内部変数を保持しており、入力値と内部変数とに基づいてそのプログラムが処理を実行する為、たとえ入力値が同じであっても、処理結果が同じになるとは限らない。一方、ファンクションは、関数機能に相当するものであり、内部変数は無く、従って入力値が同じであれば処理結果は同じとなる。
【００３５】
図示の例のファンクションブロックは、外部に示す入出力インタフェース（外部端子）として、３つの入力端子ＣＵ、Ｒ、ＰＶと、２つの出力端子Ｑ、ＣＶを有している。尚、ＣＵ、Ｒ、ＰＶは入力変数名を意味し、Ｑ、ＣＶは出力変数名を意味するものとも言える。尚、ＢＯＯＬやＩＮＴ等は、これら入力端子ＣＵ、Ｒ、ＰＶに入力させる入力値（パラメータ）や処理結果としての出力値（戻り値）のデータ型を意味するものであり、例えばＩＮＴは整数型を意味する。また、尚、ＣＴＵは、当該ファンクションブロックを識別する為の名称である。
【００３６】
ここで、呼び出し元のプログラム又はファンクションブロックは、呼び出し先のファンクションブロック又はファンクションに対してパラメータ（入力値等）を渡す。呼び出されたファンクションブロック又はファンクションは、このパラメータを用いて所定の処理を実行し、処理結果として戻り値を呼び出し元のプログラム又はファンクションブロックに返す。これらプログラム構成要素間のパラメータや返り値の受け渡しは、既に述べた通り、データ入力領域とデータ出力領域と内部変数領域とからなるデータ構造（インスタンス）を介して行われる。この為、コントローラ支援装置１０側で任意のファンクションブロック等が更新されたときに、この更新されたファンクションブロック等のみをコンパイルしてコントローラ３に転送して格納させて旧版と置き換えさせた場合、以下に述べる問題が生じる。
【００３７】
例えば、仮に図３のファンクションブロックが更新された場合、たとえ図３に示す各外部端子名には変更が無かったとしても、図４（ａ）、（ｂ）に示すように、内部変数の増加等により、外部端子のアドレスが変更される可能性がある。
【００３８】
図４（ａ）、（ｂ）は図３のファンクションブロックが用いるデータフォーマットの一例であり、図４（ａ）は更新前、図４（ｂ）は更新後のデータフォーマットを示す。図４（ａ）に示す例では、１番地〜３番地にはそれぞれ上記外部変数のうちの入力端子ＣＵ、Ｒ、ＰＶが割り当てられ、４番地〜９番地には特に図示しない内部変数が割り当てられ、１０番地、１１番地には出力端子Ｑ、ＣＶが割り当てられている。この様なアドレスの割り当ては、コンパイルの際に行われている。そして、この例では、更新されたファンクションブロックをコンパイルすると、図４（ｂ）に示すように、内部変数が増加したことにより、出力端子Ｑ、ＣＶに割り当てられる番地が、１２番地、１３番地となっているものとする。
【００３９】
この為、仮に図３のファンクションブロックが図２における“ＦＢ１”であるとした場合、呼び出し元の“ＦＢ３”２６においては、出力端子Ｑ、ＣＶの割り当て番地は１０番地、１１番地であると認識しているので、プログラム上は一見正しくても、コントローラ上の入出力関係が不一致となり、誤動作の原因となる。この問題を防ぐ為には、変更後のファンクションブロック“ＦＢ１”だけでなく、“ＦＢ３”２６も一緒にコンパイラ１に渡してコンパイルさせればよい。勿論、コンパイル後はコントローラ３に転送して、そのプログラムメモリに格納して、旧版と置き換えさせる。
【００４０】
上記転送対象要素探索部１４は、この様な更新されたプログラム構成要素（ＦＢ１）の影響を受ける全てのプログラム構成要素（ＦＢ３等）を判別するものである。尚、上記の例では“ＦＢ３”２６も一緒にコンパイルするものとしたが、今度は、“ＦＢ３”２６のデータ構造が変わる可能性があり、プログラムＢも影響を受ける可能性があるので、上記例において影響を受けるのが“ＦＢ３”２６のみとは限らない。
【００４１】
転送対象要素探索部１４は、図８に示す処理を実行するが、この処理中に行う接続ノード判定に用いるプログラム構造ツリーの一例を図５、図６に示し、同じくこの処理中に参照するプログラム更新テーブルの一例を図７に示す。図８の説明の前に図５〜図７について説明しておく。
【００４２】
図５は、図２に示すプログラム構成のうちプログラムＢ２３に係るツリー構造を示す。
各プログラム構成要素（以下、ノードと呼ぶ）には、そのノードの処理機能を実現させるプログラム以外に、他のノードとの接続関係を示すプログラムが記述されており、この様なプログラムの記述例を図６に示し、図５にはこの様なプログラムにより規定されるノード間の接続関係を示す。
【００４３】
図６において、pou_no61は、そのプログラム構成要素（ノード）を識別する為の識別番号を意味する。これは、図５に示すノード４１における「プログラムＢ」やノード４２における「ＦＢ３」等に相当する（つまり、番号に限らず、識別名等であってもよい）。node_num63は、そのノードに接続されている子ノードの数、すなわちそのノードから呼び出すノードの数を意味する。これは図５におけるプログラムＢのノード４１においては、‘２’となっている。＊ptr64は、上記各子ノードへのポインタを示している。これは、図５におけるプログラムＢのノード４１においては、ptr_1がノード４２（ＦＢ３）へのポインタを示し、ptr_2がノード４３（ＦＣＴ10）へのポインタを示す。尚、このポインタは、子ノードの識別番号としてもよい。
尚、CALL_MAXは、例えば仕様により制限される、そのプログラム構成要素から呼び出せるプログラム構成要素の数の最大値である。これは、勿論、動的に確保してもよい。
【００４４】
図７に示すプログラム更新テーブル７０は、例えば不図示の更新有無検出部による各プログラム構成要素の更新の有無の判別結果を格納するものである。この更新の有無の判別方法自体は、簡単なものであり、例えば各プログラム構成要素毎に、そのプログラム構成要素のソースファイルの更新日付とオブジェクトコードの生成日付とを比較して、ソースファイルの日付の方が新しければ、変更があったものと判定する（尚、オブジェクトコードの生成日付は、例えばコンパイラ１に保存されている）。図示の例では、ファンクションブロック“ＦＢ１”のみが、更新があったことになる。しかし、このテーブル７０に従うと、“ＦＢ１”のみがコントローラにダウンロードされるので、上述した問題が発生する。この為、本例では、少なくとも１つのプログラム構成要素に変更があった場合には、図８の処理を実行し、図８に示す処理の結果として、図１０に示す様なダウンロード用のプログラム更新テーブル８０を生成することで、このダウンロード用のプログラム更新テーブル８０に従ってダウンロードすることで、上記問題を解決する。
【００４５】
以下、図８に示す転送対象要素探索部１４による処理について説明する。
図８に示す処理は、図５に示すツリー構造における最上位のノード、すなわち図２においてタスク２１が呼び出すプログラム構成要素を処理対象とする。図５の例では、プログラムＡ、プログラムＢがそれぞれ処理対象となり、ここではプログラムＢが処理対象となった場合を具体例にして説明する。
【００４６】
また、図８に示す処理は、再帰呼び出しとなっている。すなわち、図８のステップＳ１６の処理は、処理対象のノード（最初は上記最上位ノード）の子ノードを処理対象として図８の処理を実行することを意味する。更に、この子ノードの子ノード（孫ノードと呼ぶ）が存在する場合には、子ノードを処理対象とする図８の処理中のステップＳ１６の処理は、この孫ノードを処理対象として図８の処理を実行することを意味する。
【００４７】
図８に示す更新判定処理は、最初はパラメータとして上記任意の最上位ノードを指定して、当該更新判定処理をコールすることで開始される。まず、処理対象のノードの更新有無を、図７に示すプログラム更新テーブル７０を参照して求める（ステップＳ１１）。尚、ここでは、図７に示すプログラム更新テーブル７０における更新有無のフィールドには、更新有／無を示す更新フラグが格納されているものとし、更新有りの場合はフラグＯＮ（１）、更新無しの場合はフラグＯＦＦ（０）であり、上記ステップＳ１１では、この更新フラグをこの処理の返り値としてセットする。上記例では、プログラムＢが処理対象であり、プログラムＢは更新無しなので、返り値＝０となる。
【００４８】
続いて、ループ処理用のインデックスｉを初期化し（ｉ＝０）（ステップＳ１２）、図５、図６に示す接続関係をチェックすることで、処理対象ノードに接続されている子ノード数を求め、この接続ノード数が０である場合、すなわち処理対象ノードには子ノードが無い場合には（ステップＳ１３，ＹＥＳ）、ステップＳ１１でセットした返り値を、すなわち当該処理対象ノードに対応する更新フラグを、そのまま、処理対象ノードに対応する更新判定フラグ領域に反映して（ステップＳ１９）、本処理を終了する。尚、更新判定フラグ領域は、上記ダウンロード用のプログラム更新テーブル８０を作成する為に、図８の処理の開始時等にメモリ上で取得される領域である。上記の例では、プログラムＢの接続ノード数は‘２’であるので、ステップＳ１３の判定はＮＯとなり、ステップＳ１４以降の処理に進む。
【００４９】
ステップＳ１４〜Ｓ１８の処理は、上記処理対象ノードの子ノード全てについて、繰返し実行され（その都度、ステップＳ１８でｉを＋１インクリメントする）、全ての子ノードについて処理が実行されたら（すなわち、ステップＳ１４の「ｉ＜接続ノード数？」の判定がＮＯとなったら）、ループを抜けてステップＳ１９の処理に移るものである。
【００５０】
ステップＳ１５〜Ｓ１７の処理は、まず上記処理対象ノードの子ノードのうちの１つを（ｉ番目の接続ノードを）処理対象ノードとして指定して（ステップＳ１５）、当該更新判定処理をコールすることで（ステップＳ１６）、ｉ番目の接続ノードを対象とした図８の処理を実行させ、処理結果（更新判定結果；すなわちステップＳ１９の更新フラグ領域への書込み内容）とステップＳ１１で取得した返り値とのＯＲをとり（ステップＳ１７）、このＯＲ結果を返り値とするものである。後のステップＳ１９の処理は、上記の通り、返り値を更新判定フラグ領域に反映するものであるから、この場合にはＯＲ結果が更新判定フラグ領域に反映されることになる。
【００５１】
但し、本処理は上記の通り再帰呼び出しとなっているので、ステップＳ１５で指定した子ノードから更にその子ノード、更にそのまた子ノードというように遡って処理が実行された結果として得られる上記処理結果を、ステップＳ１７で受取ることになる。
【００５２】
上記の例では、まず、プログラムＢの１番目の子ノードとして“ＦＢ３”が指定され、この“ＦＢ３”を処理対象ノードとして図８の処理が実行される。この処理では、ステップＳ１１において返り値＝０となり、更にステップＳ１５において“ＦＢ３”の子ノードである“ＦＢ１”が処理対象ノードとされて図８の処理が実行される。この処理では、ステップＳ１１において返り値＝０となり、更にステップＳ１５において“ＦＢ３”の子ノードである“ＦＢ１”が処理対象ノードとされて図８の処理が実行される。この処理では、ステップＳ１１において返り値＝１となり、更にステップＳ１５において“ＦＢ１”の子ノードである“ＦＣＴ10”が処理対象ノードとされて図８の処理が実行される。
【００５３】
“ＦＣＴ10”を処理対象とする図８の処理では、まず、ステップＳ１１において返り値＝０であり、ステップＳ１３の判定はＮＯとなるので、そのままステップＳ１９の処理に移り、図９（ａ）に示すように、上記返り値（＝０）を処理対象ノード（ここではＦＣＴ10）に対応する更新判定フラグ領域に反映させる。
【００５４】
この様にして更新判定フラグ領域に格納された値を、“ＦＢ１”を処理対象ノードとした図８の処理におけるステップＳ１７において上記処理結果として取得し、上記の通り、返り値とのＯＲをとることになる。この場合、返り値＝１であり、処理結果は０であるので、これらのＯＲは１となる。そして、ステップＳ１８によってｉ＝２となり、“ＦＢ１”の接続ノード数は１であることからステップＳ１４の判定がＮＯになるので、ステップＳ１９に進む。ステップＳ１９では、図９（ｂ）に示すように、上記ＯＲ結果（＝１）を処理対象ノード（ＦＢ１）に対応する更新判定フラグ領域に反映させる。
【００５５】
この様にして更新判定フラグ領域に格納された値を、“ＦＢ３”を処理対象ノードとした図８の処理におけるステップＳ１７において上記処理結果として取得し、上記の通り、返り値とのＯＲをとることになる。この場合、返り値＝０であり、処理結果は１であるので、これらのＯＲは１となる。そして、ステップＳ１８によってｉ＝２となり、“ＦＢ３”の接続ノード数は１であることからステップＳ１４の判定がＮＯになるので、ステップＳ１９に進む。ステップＳ１９では、図９（ｃ）に示すように、上記ＯＲ結果（＝１）を処理対象ノード（ＦＢ３）に対応する更新判定フラグ領域に反映させる。
【００５６】
この様にして更新判定フラグ領域に格納された値を、“プログラムＢ”を処理対象ノードとした図８の処理におけるステップＳ１７において上記処理結果として取得し、上記の通り、返り値とのＯＲをとることになる。この場合、返り値＝０であり、処理結果は１であるので、これらのＯＲは１となり、このＯＲ結果が返り値として新たにセットされる（返り値＝１となる）。そして、ステップＳ１８によってｉ＝２となり、“プログラムＢ”の接続ノード数は２であることからステップＳ１４の判定がＹＥＳとなり、今度は“ＦＣＴ10”が処理対象ノードとされて図８の処理が実行される。この処理結果は０となり、返り値は上記処理により１となっているので、これらのＯＲは１となり、このＯＲ結果が返り値として新たにセットされる（返り値＝１のままである）。
【００５７】
そして、ステップＳ１９の処理に進み、図９（ｄ）に示すように、上記ＯＲ結果（＝１）を処理対象ノード（プログラムＢ）に対応する更新判定フラグ領域に反映させる。
【００５８】
以上、プログラムＢを処理対象ノードとした場合を例にして説明したが、プログラムＡについても同様にして図８の処理を実行すると、プログラムＡに対応する更新判定フラグ領域には‘１’が、“ＦＢ２” に対応する更新判定フラグ領域には‘０’が、反映されることになる。この様にして、全てのノードについて、対応する更新判定フラグ領域に‘０’又は‘１’が反映された結果、図１０に示すようなダウンロード用のプログラム更新テーブル８０が作成されることになる。
【００５９】
尚、図１０に示す例において、ＦＢ１の呼び出し元であるＦＢ３だけでなく、プログラムＢもコンパイル対象となっているのは、もしＦＢ１とＦＢ３のみをコンパイルした場合、図４で説明したようなＦＢ１のデータ構造の変化に対応して、ＦＢ３のデータ構造も変化する可能性があるからである。但し、この変化は、必ず起こるとは限らないので、図８の処理に代えて、更新があったプログラム構成要素の呼び出し元のプログラム構成要素のみをコンパイル対象とする処理を行っても良い。すなわち、本手法は、更新があったプログラム構成要素をコンパイルすることは当然のこととして、少なくとも更新があったプログラム構成要素の呼び出し元のプログラム構成要素は、コンパイル対象として判別するものである。
【００６０】
その後、コントローラ支援装置１０は、図１０に示すダウンロード用のプログラム更新テーブル８０を参照して、更新有りとなっている全てのプログラム構成要素をまとめてコンパイラに渡し、コンパイルを実行させ、実行結果（オブジェクトコード）をコントローラ３に転送させる。
【００６１】
以上説明したように、制御プログラムとして構造化プログラムを用い、プログラム構成要素単位でＲＵＮ中更新を行うプログラマブルコントローラ・システムにおいて、支援装置１０側で、更新されたプログラム構成要素の影響を受ける全てのプログラム構成要素を判別して、これらを一括してコンパイルさせてコントローラ３にダウンロードすることで、コントローラ３が異常な動作を行う可能性を極めて小さくすることができる。
【００６２】
図１１は、コントローラ支援装置１０（コンピュータ）のハードウェア構成図である。
同図に示すコンピュータ１００は、ＣＰＵ１０１、メモリ１０２、入力部１０３、出力部１０４、記憶部１０５、記録媒体駆動部１０６、及びネットワーク接続部１０７を有し、これらがバス１０８に接続された構成となっている。同図に示す構成は一例であり、これに限るものではない。
【００６３】
ＣＰＵ１０１は、当該コンピュータ１００全体を制御する中央処理装置である。
メモリ１０２は、プログラム実行、データ更新等の際に、記憶部１０５（あるいは可搬型記録媒体１０９）に記憶されているプログラムあるいはデータを一時的に格納するＲＡＭ等のメモリである。ＣＰＵ１０１は、メモリ１０２に読み出したプログラム／データを用いて、上述してある各種機能・処理を実行する。
【００６４】
出力部１０４は、例えばディスプレイ等である。入力部１０３は、例えば、キーボード、マウス等である。これらは、図１の表示装置１１、入力装置１２に相当する構成である。
ネットワーク接続部１０７は、例えばイントラネットやインターネット等のネットワークに接続して、他の情報処理装置とのコマンド／データ送受信を行う為の構成である。
記憶部１０５は、例えばハードディスク等であり、上述した図８等の処理を上記ＣＰＵ１０１により実行させるための所定のアプリケーション・プログラムや各種データ（図７、図１０に示すテーブル等）が格納される。
【００６５】
あるいは、これらプログラム／データは、可搬型記録媒体１０９に記憶されているものであってもよい。この場合、可搬型記録媒体１０９に記憶されているプログラム／データは、記録媒体駆動部１０６によって読み出される。可搬型記録媒体１０９とは、例えば、ＦＤ（フレキシブル・ディスク）１０９ａ、ＣＤ−ＲＯＭ１０９ｂ、その他、ＤＶＤ、光磁気ディスク等である。
【００６６】
あるいは、また、上記プログラム／データは、ネットワーク接続部１０７により接続しているネットワークを介して、他の装置内に記憶されているものをダウンロードするものであってもよい。あるいは、更に、インターネットを介して、外部の他の装置内に記憶されているものをダウンロードするものであってもよい。
また、本発明は、上記本発明の各種処理をコンピュータ上で実現するプログラムを記録した可搬型記憶媒体として構成できるだけでなく、当該プログラム自体として構成することもできる。
【図面の簡単な説明】
【００６７】
【図１】プログラマブルコントローラ・システムの概略構成図である。
【図２】コントローラに格納される制御プログラムの構成例である。
【図３】ファンクションブロックの一例である。
【図４】（ａ）、（ｂ）は、プログラム構成要素が用いるデータ構成の一例である。
【図５】制御プログラムのツリー構造である。
【図６】他ノードとの接続関係を示すプログラムの記述例である。
【図７】プログラム更新テーブルの一例である。
【図８】転送対象要素探索部による処理を示すフローチャート図である。
【図９】（ａ）〜（ｄ）は、処理結果を更新判定フラグ領域に反映させていく様子を示す図である。
【図１０】図８の処理により作成される、ダウンロード用のプログラム更新テーブルの一例である。
【図１１】コントローラ支援装置（コンピュータ）のハードウェア構成図である。
【図１２】（ａ）〜（ｃ）は、先願のＲＵＮ中更新を説明する為の図である。
【符号の説明】
【００６８】
１  コンパイラ
２  伝送装置
３  コントローラ
１０  コントローラ支援装置
１１  表示装置
１２  入力装置
１３  記憶媒体
１４  転送対象要素探索部
２１  タスク
２２  プログラムＡ
２３  プログラムＢ
２４  ＦＢ１
２５  ＦＢ２
２６  ＦＢ３
２７  ＦＣＴ10
２８  ＦＣＴ10
２９  ＦＢ１
３０  ＦＣＴ10
４１  ノード（プログラムＢ）
４２  ノード（ＦＢ３）
４３  ノード（ＦＣＴ10）
６１  pou_no
６３  node_num
６４  ＊ptr
７０  プログラム更新テーブル
８０  ダウンロード用のプログラム更新テーブル
１００  コンピュータ
１０１  ＣＰＵ
１０２  メモリ
１０３  入力部
１０４  出力部
１０５  記憶部
１０６  記録媒体駆動部
１０７  ネットワーク接続部
１０８  バス
１０９  可搬型記録媒体
１０９ａ  ＦＤ（フレキシブル・ディスク）
１０９ｂ  ＣＤ−ＲＯＭ
【図１】
2006318197.tif 000003
【図２】
2006318197.tif 000004
【図３】
2006318197.tif 000005
【図４】
2006318197.tif 000006
【図５】
2006318197.tif 000007
【図６】
2006318197.tif 000008
【図７】
2006318197.tif 000009
【図８】
2006318197.tif 000010
【図９】
2006318197.tif 000011
【図１０】
2006318197.tif 000012
【図１１】
2006318197.tif 000013
【図１２】
2006318197.tif 000014