(57)【要約】【課題】ＰＬＣのプログラム更新によるインスタンス削除に伴って生じる無駄な空き領域を解消する【解決手段】コンパイラ機能部１１は、更新版のソースコード２１のコンパイル処理の際に、既存のインスタンスの削除があった場合に、他のインスタンスの割当ブロックのなかで移動対象を決定すると共に移動先を決定し、該決定に基づいてアドレス移動指令情報２７を生成する。そして、通信機能部１３を介して、コンパイル結果（更新版の機械語オブジェクト２３）と共にアドレス移動指令情報２７をＰＬＣ３０にダウンロードする。ＰＬＣ３０は、このアドレス移動指令情報２７に基づいて、移動対象ブロックの格納データを移動先へと移動させる。【選択図】  図１
2015125713.tif 000002
【特許請求の範囲】
【請求項１】
プログラマブルコントローラと、該プログラマブルコントローラ用の任意のプログラムのソースコードをコンパイルして機械語オブジェクトを生成すると共に、該生成の際に該プログラムの各インスタンスに割り当てたメモリ領域である割当ブロックに関する情報であるインスタンス割当情報を生成・記憶する支援装置を有するプログラマブルコントローラシステムであって、
前記支援装置は、
任意の前記プログラムの更新版のソースコードをコンパイルして更新版機械語オブジェクトを生成する際に、前記インスタンス割当情報に基づいて、該更新に伴って削除された既存のインスタンスを判別する削除インスタンス判別手段と、
前記インスタンス割当情報に基づいて、前記既存のインスタンスの削除に対応して移動対象とする前記割当ブロックを１以上決定する移動対象ブロック決定手段と、
前記各移動対象ブロックの移動先を決定して、該移動対象ブロックの前記割当ブロックの情報と該移動先情報とを含む移動指令情報を生成する移動指令情報生成手段と、
該移動指令情報を前記プログラマブルコントローラに転送する転送手段とを有し、
前記プログラマブルコントローラは、
前記移動指令情報に基づいて、前記各移動対象ブロック毎に、そのブロック内の格納データを、前記移動先へ移動するデータ移動手段、
を有することを特徴とするプログラマブルコントローラシステム。
【請求項２】
前記プログラマブルコントローラは、
前記移動対象ブロックの格納データの移動に応じて、前記機械語オブジェクトの該当箇所の修正、あるいは該移動対象ブロックへのリンク情報の修正を行う修正手段を更に有することを特徴とする請求項１記載のプログラマブルコントローラシステム。
【請求項３】
前記削除インスタンスに対応する前記割当ブロックは空き領域となるものであり、
前記移動指令情報生成手段は、少なくとも前記移動対象ブロックの１つを、該空き領域を埋めるように移動させるように前記移動先を決定することを特徴とする請求項１または２記載のプログラマブルコントローラシステム。
【請求項４】
前記移動指令情報生成手段は、任意の前記移動対象ブロックを移動させることで新たな空き領域が生じる場合に、該新たな空き領域を埋めるように他の移動対象ブロックを移動させるようにその移動先を決定することを特徴とする請求項３記載のプログラマブルコントローラシステム。
【請求項５】
前記インスタンス毎に、その前記割当ブロック内にそのインスタンスに係わる各変数のメモリ割当が行われると共に、必要に応じて、そのインスタンスに係わる追加の割当ブロックである追加ブロックが確保されて、その前記割当ブロック内には該追加ブロックへの前記リンク情報が格納され、
前記移動指令情報には更に該リンク情報の格納アドレスが含まれ、
前記修正手段は、前記移動対象ブロックが前記追加ブロックである場合には、該移動指令情報に基づいて、前記リンク情報を修正することを特徴とする請求項２記載のプログラマブルコントローラシステム。
【請求項６】
前記インスタンス毎に、その前記割当ブロック内にそのインスタンスに係わる各変数のメモリ割当が行われて、
前記機械語オブジェクトには、各割当ブロックの先頭アドレスと該先頭アドレスに対する相対アドレスの形で、前記各変数のメモリ割当アドレスが記述されており、
前記修正手段は、前記機械語オブジェクトにおける前記移動対象ブロックの先頭アドレスの記述部分を前記該当箇所として、該先頭アドレスを前記移動後に応じた値へと修正することを特徴とする請求項２記載のプログラマブルコントローラシステム。
【請求項７】
前記転送手段は、更に、前記更新版機械語オブジェクトを前記プログラマブルコントローラへ転送し、
前記プログラマブルコントローラの前記データ移動手段と前記修正手段は、該更新版機械語オブジェクトに切替えて運用中に、該更新版機械語オブジェクトを実行していない空き時間帯において、前記移動対象ブロックの格納データの移動と前記修正を行うことを特徴とする請求項１〜６の何れかに記載のプログラマブルコントローラシステム。
【請求項８】
前記データ移動手段と前記修正手段は、任意の前記空き時間帯中に全ての移動対象ブロックの格納データの移動と該移動に伴う前記修正を実行完了出来ない場合には、中断して、次の前記空き時間帯において残りの移動対象ブロックの格納データの移動と該移動に伴う前記修正を行うことを特徴とする請求項７記載のプログラマブルコントローラシステム。
【請求項９】
プログラマブルコントローラと、該プログラマブルコントローラ用の任意のプログラムのソースコードをコンパイルして機械語オブジェクトを生成すると共に、該生成の際に該プログラムの各インスタンスに割り当てたメモリ領域である割当ブロックに関する情報であるインスタンス割当情報を生成・記憶する支援装置を有するプログラマブルコントローラシステムにおける前記支援装置であって、
任意の前記プログラムの更新版のソースコードをコンパイルして更新版機械語オブジェクトを生成する際に、前記インスタンス割当情報に基づいて、該更新に伴って削除された既存のインスタンスを判別する削除インスタンス判別手段と、
前記インスタンス割当情報に基づいて、前記既存のインスタンスの削除に対応して移動対象とする前記割当ブロックを１以上決定する移動対象ブロック決定手段と、
前記各移動対象ブロックの移動先を決定して、該移動対象ブロックの前記割当ブロックの情報と該移動先情報とを含む移動指令情報を生成する移動指令情報生成手段と、
該移動指令情報を前記プログラマブルコントローラに転送する転送手段と、
を有することを特徴とする支援装置。
【請求項１０】
プログラマブルコントローラと、該プログラマブルコントローラ用の任意のプログラムのソースコードをコンパイルして機械語オブジェクトを生成すると共に、該生成の際に該プログラムの各インスタンスに割り当てたメモリ領域である割当ブロックに関する情報であるインスタンス割当情報を生成・記憶する支援装置を有するプログラマブルコントローラシステムにおける前記プログラマブルコントローラであって、
前記支援装置から転送されてくる、修正版の前記機械語オブジェクトと、該修正に伴う既存のインスタンスの削除に応じた移動対象の前記割当ブロックとその移動先の情報を含む移動指令情報を、受信して記憶する受信手段と、
前記移動指令情報に基づいて、前記各移動対象の割当ブロック毎に、そのブロック内の格納データを、前記移動先へ移動するデータ移動手段と、
を有することを特徴とするプログラマブルコントローラ。
【請求項１１】
前記移動対象の割当ブロックの格納データの移動に応じて、前記修正版の機械語オブジェクトの該当箇所の修正、あるいは該移動対象ブロックへのリンク情報の修正を行う修正手段を更に有することを特徴とする請求項１０記載のプログラマブルコントローラ。
【請求項１２】
プログラマブルコントローラと、該プログラマブルコントローラ用の任意のプログラムのソースコードをコンパイルして機械語オブジェクトを生成すると共に、該生成の際に該プログラムの各インスタンスに割り当てたメモリ領域である割当ブロックに関する情報であるインスタンス割当情報を生成・記憶する支援装置を有するプログラマブルコントローラシステムにおける前記支援装置のコンピュータを、
任意の前記プログラムの更新版のソースコードをコンパイルして更新版機械語オブジェクトを生成する際に、前記インスタンス割当情報に基づいて、該更新に伴って削除された既存のインスタンスを判別する削除インスタンス判別手段と、
前記インスタンス割当情報に基づいて、前記既存のインスタンスの削除に対応して移動対象とする前記割当ブロックを１以上決定する移動対象ブロック決定手段と、
前記各移動対象ブロックの移動先を決定して、該移動対象ブロックの前記割当ブロックの情報と該移動先情報とを含む移動指令情報を生成する移動指令情報生成手段と、
該移動指令情報を前記プログラマブルコントローラに転送する転送手段、
として機能させる為のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラマブルコントローラ・システムに関する。
【背景技術】
【０００２】
ＰＬＣ（プログラマブルコントローラ）の支援ツールは、ユーザが記述したプログラム（ソースコード；変数含む）をコンパイルして、ＰＬＣで動作する機械語オブジェクトを生成し、その際、ＰＬＣ上の有限なメモリに（その任意のアドレスに）各変数を割り付ける。そして、機械語オブジェクトをＰＬＣにダウンロードして記憶させる。これより、ＰＬＣは、このプログラムを実行することで各種処理を実行し、各変数の値のリード／ライト等の処理の際には、その変数に割り付けられたアドレス（割当位置）にアクセスすることになる。
【０００３】
例えばプログラムのバージョンアップ等の為に、ＰＬＣが稼動中にそのプログラムを変更する場合は、既にメモリ割り付け済みの変数（既存の変数）のアドレスを変更することができない。変数の割当位置が変化すると、変更前と変更後とで変数の値がプログラムで正常に扱えないため、誤動作する。変数のアドレスが変更されることにより、アドレスの変更前と変更後とでデータを引き継ぐことができない。
【０００４】
そのため、従来は、変数を追加しても既存の変数のアドレスが変更されないようにするために予備領域を設けて、追加した変数（追加変数）をこの予備領域に割り付けるようにしている。予備領域に追加変数を割り付けることにより、上記既存の変数の割当位置を変更しないで、変数の追加が可能になる。予備領域は、プログラム構成単位（以下、“ＰＯＵ”と記す）で持つため、予備領域のサイズは、大抵、数Ｗ(WORD)から数１０Ｗである。
【０００５】
予備領域は、変数を追加しなければ無駄な領域となる。ＰＬＣのメモリは有限であり、且つ、大規模なシステムではＰＯＵの数も多いため、予備領域を大きく(幾つも)確保することができない。
【０００６】
尚、上記ＰＯＵとは、例えばファンクションブロック（ＦＢ）、ファンクション（ＦＣＴ）等であり、これらは例えば機能単位等のプログラム部品と見做してもよい。例えば一例としては、温度を計測する機能すなわち温度計から計測データを収集する機能のＦＢ等が存在する。そして、温度計が複数ある場合、このＦＢに基づいて、各温度計から計測データを収集する機能が作成されるものであり、これらはインスタンスと呼ばれている。例えば、温度計Ａ、温度計Ｂの２つの温度計があった場合、上記ＦＢに基づいて、温度計Ａから計測データを収集するインスタンス、温度計Ｂから計測データを収集するインスタンスの２つのインスタンスが、開発者等によって作成されることになる。
【０００７】
上記のことは、換言すれば、ＰＯＵとはプログラム部品の雛形であり、開発者はこの雛形を利用してプログラム部品を作成するものである。
ユーザが、予備領域の数を越える変数の追加を伴うプログラムの変更を実施すると、既存の変数の割当位置を維持できなくなるため、ＰＬＣの動作を継続しながらプログラムを変更すること（オンライン変更）はできなくなる。
【０００８】
予備領域を大きく確保し、オンライン変更の制限を緩和する方法として、例えば特許文献２に開示されている従来技術が存在するが、予備領域をＰＯＵ単位ではなくタスク単位にまとめて大きめに予備領域を確保する方式のため、予備領域の数を超えるような変数を追加できない課題がある。
【０００９】
この様な課題を解決する、ＰＬＣ稼働中にプログラムを変更する方式について、本出願人は例えば特許文献１記載の方式を提案している。
特許文献１の方式では、インスタンス毎に１ブロックのメモリ割り当てを行い、１ブロック内には変数の割当て、予備領域、及び追加変数格納先アドレスがある。予備領域では対応できない変数追加があった場合、追加ブロック（追加変数格納領域）を確保して追加変数を割り当てると共に、上記追加変数格納先アドレスに追加ブロックの先頭アドレスを格納する。以後、追加変数格納先アドレスを介して追加ブロックの追加変数にアクセスする。
【００１０】
尚、上記特許文献２に記載の従来技術は、ＰＬＣ（即ち、プログラマブルロジックコントローラ）のメモリ内においてＰＯＵのインスタンス格納領域Ｄ１をタスク毎に確保し、該インスタンス格納領域内に該ＰＯＵのインスタンス領域ｄ１を置いて、該ＰＬＣのメモリを管理するものである。
【先行技術文献】
【特許文献】
【００１１】
【特許文献１】特開２０１２−２３４２７２号公報
【特許文献２】特開２００８−２６９４４９号公報
【発明の概要】
【発明が解決しようとする課題】
【００１２】
ＰＬＣ稼働中に、ユーザが変数を追加し、ＰＬＣを止めないでプログラムの変更を実施するために、上記特許文献１の方式では、追加した変数を、空き領域の後ろに追加するが、変数を削除した場合、削除した変数の領域が空き領域になる（無効な領域としてメモリ上に存在する）。このように変数の追加と削除を繰り返すと、空領域が増加し、有効な変数の合計メモリ使用量が、ＰＬＣが所有しているメモリサイズより小さい場合でも、変数を追加で割り付けられない課題が発生する。
【００１３】
上記特許文献１の方式では、予備領域を確保しなくても、変数の追加が可能であるが、変数のアドレスを固定にするため、上記のように無効な領域が発生してしまう。
本発明の課題は、ＰＬＣのプログラムの更新に伴ってその一部のインスタンスが削除され以ってその割当領域が無効となった場合に、他のインスタンスの割当領域を移動することで、無駄な空き領域が生じないようにできるプログラマブルコントローラシステム、その支援装置、プログラマブルコントローラ、プログラム等を提供することである。
【課題を解決するための手段】
【００１４】
本発明のプログラマブルコントローラシステムは、プログラマブルコントローラと、該プログラマブルコントローラ用の任意のプログラムのソースコードをコンパイルして機械語オブジェクトを生成すると共に、該生成の際に該プログラムの各インスタンスに割り当てたメモリ領域である割当ブロックに関する情報であるインスタンス割当情報を生成・記憶する支援装置を有するプログラマブルコントローラシステムであって、下記の各構成要素を有する。
【００１５】
前記支援装置は、任意の前記プログラムの更新版のソースコードをコンパイルして更新版機械語オブジェクトを生成する際に、前記インスタンス割当情報に基づいて、該更新に伴って削除された既存のインスタンスを判別する削除インスタンス判別手段と、前記インスタンス割当情報に基づいて、前記既存のインスタンスの削除に対応して移動対象とする前記割当ブロックを１以上決定する移動対象ブロック決定手段と、前記各移動対象ブロックの移動先を決定して、該移動対象ブロックの前記割当ブロックの情報と該移動先情報とを含む移動指令情報を生成する移動指令情報生成手段と、該移動指令情報を前記プログラマブルコントローラに転送する転送手段とを有する。
【００１６】
前記プログラマブルコントローラは、前記移動指令情報に基づいて、前記各移動対象ブロック毎に、そのブロック内の格納データを、前記移動先へ移動するデータ移動手段を有する。
【発明の効果】
【００１７】
本発明のプログラマブルコントローラシステム等によれば、ＰＬＣのプログラムの更新に伴ってその一部のインスタンスが削除され以ってその割当領域が無効となった場合に、他のインスタンスの割当領域を移動することで、無駄な空き領域が生じないようにできる。
【図面の簡単な説明】
【００１８】
【図１】本例のプログラマブルコントローラ・システムの構成・機能図である。
【図２】インスタンス毎の一塊の変数割当領域の一例である。
【図３】図２の例に対して、追加ブロックを設けた例である。
【図４】（ａ）は図３の例、（ｂ）はこの例に対してインスタンス３が削除された場合を示す図である。
【図５】変数情報管理表の具体例である。
【図６】（ａ）、（ｂ）は、ＰＯＵインスタンスアドレス割付対応表の具体例（その１）である。
【図７】（ａ）、（ｃ）は、ＰＯＵインスタンスアドレス割付対応表の具体例（その２）、（ｂ）はアドレス移動指令情報の具体例である。
【図８】（ａ）は移動前、（ｂ）は最初の移動後のメモリ割当状況を示す図である。
【図９】最終的な移動後のメモリ割当状況を示す図である。
【図１０】ＰＬＣにおける定周期のプログラム実行を示す図である。
【図１１】削除開始アドレスの決定処理フローチャート図（１／２）である。
【図１２】削除開始アドレスの決定処理フローチャート図（２／２）である。
【図１３】移動元領域の探索・設定処理フローチャート図（１／２）である。
【図１４】移動元領域の探索・設定処理フローチャート図（２／２）である。
【図１５】移動先先頭アドレスの設定処理フローチャート図である。
【図１６】各変数データの移動処理フローチャート図である。
【図１７】本例のプログラマブルコントローラ・システムの機能ブロック図である。
【発明を実施するための形態】
【００１９】
以下、図面を参照して、本発明の実施の形態について説明する。
図１は、本例のプログラマブルコントローラ・システムの構成・機能図である。
本システムは、コンピュータ上で動作する開発環境を有する。開発環境とは、例えば図示の開発支援装置１０である。開発支援装置１０は、ユーザに任意のプログラムのソースコードを作成させる為の既存のユーザインターフェース機能を有し、ユーザが作成したソースコードをターゲット上で動作する機械語オブジェクトに変換するコンパイラ機能を有し、生成された機械語オブジェクトをターゲットに送信する通信機能を有する。尚、ターゲットとは、例えば、図示のＰＬＣ３０である。
【００２０】
尚、本説明では、プログラマブルコントローラを略してＰＬＣと記す場合もあるものとする。
本例のＰＬＣシステムは、ＰＬＣ（プログラマブルコントローラ）３０と、このＰＬＣ３０用のプログラムをユーザが任意に作成できるように支援する機能等を有する開発支援装置（ローダ）１０を有する。上記ＰＬＣ３０用のプログラムは、上記のようにユーザが任意に作成できること等から、ユーザプログラム等と呼ばれる場合もある。また、当該ユーザプログラムの一例が、ＰＬＣ３０の制御プログラム等である。尚、制御プログラムは、ＰＬＣが不図示の各種制御対象機器を制御する為のプログラム等である。以下、制御プログラムを例にして説明するものとする。
【００２１】
また、ユーザプログラムは、上記のように複数のＰＯＵから構成されるものと見做してよい。
開発支援装置１０は、ユーザによって任意に作成された制御プログラムのソースコード２１を、コンパイルして機械語プログラム（機械語オブジェクト２３）に変換する機能を有する。また、この機械語オブジェクト２３を不図示の通信線を介してＰＬＣ３０にダウンロードする機能等も有する。ＰＬＣ３０は、このダウンロードされた機械語プログラムを、図示の機械語オブジェクト４１として記憶する。
【００２２】
上記制御プログラムのソースコードは、新規作成されたもの、あるいは既存のソースコードの更新／修正版（バージョンアップ版等）等である。何れの場合でも、上記のように機械語オブジェクト２３に変換されてＰＬＣ３０にダウンロードされることになる。
【００２３】
ＰＬＣ３０は、現在記憶している機械語プログラム（機械語オブジェクト４１）を実行することで、制御対象の各種機器を制御する。
上述した開発支援装置１０とＰＬＣ３０の機能自体は、既存の一般的な機能である。
【００２４】
ここで、ＰＬＣ３０は、上記開発支援装置１０から更新版（バージョンアップ版等）の機械語プログラムがダウンロードされた場合には、この新プログラムを記憶する。このときには未だ旧プログラムを実行している状態であるが、その後、新プログラムを実行する状態に切替える。そして、旧プログラムを削除する。例えば、このようにして、ＰＬＣ３０の運用を停止することなく、機械語オブジェクト４１を最新版に更新する。尚、この例に限らず、例えば旧プログラムを削除しないで残しておくようにしてもよい。
【００２５】
尚、特に図示しないが、ＰＬＣ３０は、上記制御対象である何らかの機器または当該機器を接続しているＩ／Ｏユニットと、通信線を介して接続している。
開発支援装置（ローダ）１０は、コンパイラ機能部１１、インタフェース機能部１２、通信機能部１３等の各種機能部と記憶部２０等を有する。また、ユーザに上記制御プログラム等を作成させるための画面等を表示するディスプレイ１４と、キーボード／マウス等の入力装置１５等も有する。また、特に図示しないが、開発支援装置（ローダ）１０は、ＣＰＵ／ＭＰＵ等の演算処理プロセッサも有している。また、記憶部２０は、例えばハードディスク、メモリ等である。
【００２６】
記憶部２０には、予め不図示のアプリケーションプログラムが記憶されている。上記不図示のＣＰＵ／ＭＰＵ等が、このアプリケーションプログラムを読み出し・実行することにより、上記各種機能部１１，１２、１３の機能や、後述する図１１〜図１６のフローチャート図の処理や、後述する図１７に示す各種処理機能部の機能などが実現される。
【００２７】
また、記憶部２０には、図示の各種データ／プログラム等が記憶される。
すなわち、記憶部２０には、上記ユーザによって作成された制御プログラムのソースコード２１、このソースコード２１をコンパイラ機能部１１によってコンパイルした結果である機械語オブジェクト２３等が格納される。
【００２８】
更に、記憶部２０には、図示の各種データ、すなわちソースコード識別番号対応表２２、変数情報管理表２４、ＰＯＵインスタンスアドレス情報２５、ＰＯＵインスタンスアドレス割付対応表２６、アドレス移動指令情報２７等が、記憶される。
【００２９】
尚、これら各種データについては、基本的には上記先願（特許文献１）と略同様であってよいが、ＰＯＵインスタンスアドレス割付対応表２６に関しては、データ構成が多少異なると共に、後に修正される場合がある。よって、これについては後に具体例を参照して説明するが、他のデータについては特に説明しないものとする。
【００３０】
上記各種機能部のうち、まず、インタフェース機能部１２は、ユーザによる任意の制御プログラム（ソースコード２１）の作成作業を支援する機能を有する処理機能部である。例えば上記ディスプレイ１４上に所定の入力画面を表示し、ユーザは上記入力装置１５を操作してこの入力画面上で任意の制御プログラムのソースコード２１を記述する。インタフェース機能部１２自体は、一般的な既存機能である。
【００３１】
コンパイラ機能部１１は、ユーザによって作成されたソースコード２１を、ターゲット（ＰＬＣ３０）上で動作する機械語オブジェクト２３に変換するコンパイル処理を実行する。通信機能部１３は、生成された機械語オブジェクト２３を、不図示の通信線を介してＰＬＣ３０に送信する。つまり、新たな制御プログラムをダウンロードする。
【００３２】
また、コンパイラ機能部１１は、上記コンパイル処理実行に伴って、上記各種データ（ソースコード識別番号対応表２２、変数情報管理表２４、ＰＯＵインスタンスアドレス情報２５、ＰＯＵインスタンスアドレス割付対応表２６）を生成する。上記の通り、これらのデータやその生成処理は、先願（特許文献１）に記載されているので、ここでは特に説明しない。すなわち、上記ソースコード識別番号対応表２２、変数情報管理表２４、ＰＯＵインスタンスアドレス情報２５は、それぞれ、特許文献１に記載のソースコード識別番号対応表２２、変数情報管理表２４、ＰＯＵインスタンスアドレス情報２５と同じであってよい。但し、割付対応表２６は、データ構成が先願とは多少異なるが、その生成処理自体は先願と略同様と見做しても構わない。本例の割付対応表２６については、後に具体例を示して説明する。
【００３３】
更に、本手法では、ＰＯＵインスタンスアドレス割付対応表２６を後から修正する場合がある。これについては、後に詳しく説明するが、制御プログラムの更新（バージョンアップ等）に伴って、特に任意のインスタンスが削除された場合に、ＰＬＣ３０側において、他のインスタンスの既存の割当領域（ブロック）を移動することで、空き領域を埋めて、無駄な空き領域が残ったままとなる事態を防止できる。これに伴って、開発支援装置１０側において、ＰＯＵインスタンスアドレス割付対応表２６の修正が行われる。詳しくは後述する。
【００３４】
尚、本説明では、ＰＯＵインスタンスアドレス割付対応表２６を、簡略化して「割付対応表２６」と記す場合もあるものとする。同様に、ソースコード識別番号対応表２２を「番号対応表２２」、変数情報管理表２４を「管理表２４」、ＰＯＵインスタンスアドレス情報２５を「アドレス情報２５」等と簡略化して記す場合もあるものとする。
【００３５】
ここで、本例では、コンパイラ機能部１１は、上記コンパイル処理実行に伴って、更に図示のアドレス移動指令情報２７も生成する。上記ＰＬＣ３０における既存ブロック移動処理や、開発支援装置１０における割付対応表２６の修正処理は、このアドレス移動指令情報２７を用いて実行される。これについて詳しくは後述する。
【００３６】
ＰＬＣ３０は、プログラム実行管理機能部３１、通信機能部３２等の各種機能部と記憶部４０を有する。また、特に図示しないが、ＰＬＣ３０は、ＣＰＵ／ＭＰＵ等の演算処理プロセッサも有している。尚、逐一述べないが、開発支援装置１０との通信処理は、図示の通信機能部３２と、開発支援装置１０の通信機能部１３とによって行われる。
【００３７】
記憶部４０には、予め不図示のアプリケーションプログラムが記憶されている。上記ＣＰＵ／ＭＰＵ等が、このアプリケーションプログラムを読み出し・実行することにより、上記各種機能部３１，３２の機能（処理）が実現される。
【００３８】
通信機能部３２は、上記開発支援装置１０との通信を行って、例えば上記ダウンロードされる機械語オブジェクト２３の受信を行い、これを図示の機械語オブジェクト４１として記憶部４０に記憶する。また、ＰＯＵインスタンスアドレス情報２５がダウンロードされた場合には、これを図示のＰＯＵインスタンスアドレス情報４２として記憶部４０に記憶する。
【００３９】
プログラム実行管理機能部３１は、上記のように開発支援装置１０からダウンロードされて記憶部４０に記憶された機械語オブジェクト４１等の実行を管理する。これ自体は基本的に先願（特許文献１）に開示されている既存機能であるので、ここでは特に説明しない。但し、プログラム実行管理機能部３１は、当該既存機能に加えて更に、任意のインスタンスが削除された場合に、他のインスタンスの既存の割当領域（ブロック）を移動することで、空き領域を埋める処理を行う場合がある。詳しくは後述する。
【００４０】
また、記憶部４０（メモリ）の記憶領域の一部は、図示のＰＯＵインスタンスメモリ領域４３となっている。このメモリ領域４３内に上記制御プログラムの各変数に係るデータ格納領域を、上記ブロック単位（インスタンス単位）でを割付けることになる。これについても先願と同様であり、ここでは説明しない。
【００４１】
ここで、ＰＬＣのプログラミングには、プログラム（ＰＧ）、ファンクションブロック（ＦＢ）、ファンクション（ＦＣＴ）等のＰＯＵ要素がある。通常、各ＰＯＵには１以上の変数が含まれている。上記制御プログラム等をＰＬＣ３０上で動作させる為には、開発支援装置１０上でコンパイルする際に、その各ＰＯＵの各変数をＰＬＣ３０のメモリ（領域４３内）に割り付けて、機械語オブジェクト２３を生成する必要がある。コンパイラ機能部１１が、上記コンパイルの際にＰＯＵ毎に（インスタンス毎に）その各変数のメモリ割付けを実施している。
【００４２】
尚、後述するように、本説明では具体例として、上記ＰＯＵの一例としてＦＢ（ファンクションブロック）を例にして説明するものとする。
コンパイラ機能部１１は、上記インスタンス毎の変数のメモリ割付け処理として、各インスタンス毎に、上記のように一塊の領域（ブロック；インスタンス単位の変数割当領域）を確保する。このブロック内には、そのインスタンスに係わる各変数のメモリ割当領域が含まれるが、既に説明したように、更に予備領域等も含まれる。つまり、各ＰＯＵの各インスタンス毎に、各変数の割付領域と予備領域等から成る上記ブロックを割り当てることになる（例えば後述する図２参照）。各ブロックのサイズは、例えば変数の数に応じたものとなるので、一律で同じサイズとなるものではない。また、先願と同様、ブロック内には更に「追加変数格納先アドレス」領域も確保される（例えば後述する図３参照）。
【００４３】
例えば、任意の制御プログラムの新規作成時に、そのコンパイルの際に上記インスタンス毎のブロック確保とブロック内への各変数のメモリ割付けを行う。その後、この制御プログラムの修正／更新時には、そのコンパイルの際に、任意のインスタンスに関して追加変数があった場合には、基本的にはその上記ブロック内の予備領域に当該追加変数を割り当てる。
【００４４】
しかし、追加変数が多い場合等には、上記予備領域では足りない場合がある。つまり、上記確保してあったブロック内に追加変数全てを割当てることが出来ない場合がある。
本手法では、先願と同様、この様な場合に備えて、上記のように上記ブロック内に上記「追加変数格納先アドレス」領域も確保している。また、先願と同様、各ＰＯＵの各インスタンス毎に、上記ブロックの先頭アドレスやサイズ、その変数等のメモリ割り当て状況を、上記ＰＯＵインスタンスアドレス割付対応表２６、変数情報管理表２４に記憶している。
【００４５】
ここで、上記制御プログラムの修正／更新版のコンパイルの際には、これら管理表２４や割付対応表２６を参照することで、既にメモリ割当て済みの変数（上述した既存の変数）に関しては、同じアドレスを割当てることができる。
【００４６】
そして、上記予備領域では足りないような変数追加があった場合、ＰＬＣ３０のメモリ領域４３内の空き領域に新たなブロック（追加ブロック）を確保して、この追加ブロック内に追加変数を割り付けると共に、この追加ブロックの先頭アドレスを初期ブロック内の「追加変数格納先アドレス」に書き込ませる。これより、追加変数は初期ブロックの「追加変数格納先アドレス」経由でアクセスすることができる（例えば後述する図３参照）。尚、この場合の空き領域は、既存のブロック群の後ろの空き領域であり、後述する無駄な空き領域とは異なるものであり、区別する為に“有効な空き領域”等と呼ぶ場合があるものとする。
【００４７】
また、先願と同様に、上記のように、追加ブロックに対して、元々あったブロックを初期ブロックと呼ぶものとする。
上記のことは先願と同様であるが、本手法では、上記制御プログラムの修正／更新版のコンパイルの際に、任意のインスタンスの削除があったことを検出すると、それによって生じる無駄な空き領域に対して、他のインスタンスの既存の割当領域（ブロック）を移動することで、無駄な空き領域が生じないようにする。詳しくは後述する。
【００４８】
ここで、上記各変数のメモリ割付を行う対象は、上記の通りＰＯＵインスタンスメモリ領域４３である。各変数毎に、当該メモリ領域４３内の上記ブロック内の任意のアドレスの記憶領域が、割り当てられることになる。
【００４９】
図２に、この様な変数メモリ割付けの一例を示す。
図２に示すように、ＰＯＵインスタンスメモリ領域４３に対して、インスタンス毎に、上記一塊の領域（１ブロック）が確保されたうえでその各変数のメモリ割付けが行われる。図２の例は、２つのファンクションブロック（ＦＢ１、ＦＢ２）に関して、ＦＢ１は２つ、ＦＢ２は１つ、インスタンス化した場合のメモリ割付例である。これら３つのインスタンス１，２，３毎に、上記“一塊の領域”（ブロック）が割り当てられるので、図示のように３つのブロックが設けられることになる。
【００５０】
そして、各ブロック毎に、そのインスタンスの各変数に対するメモリ割当てが行われると共に予備の領域が確保される。後に、変数の追加があった場合に、予備の領域が割り当てられる。
【００５１】
既に説明したように、例えばファンクションブロック（ＦＢ）に関して、ユーザは、複数回利用することができる。複数回利用する場合は、コンパイラ機能により利用毎のインスタンス化（ファンクションブロックの変数をメモリに割り付ける）を実施する。上記の例ではＦＢ１は２度利用され、ＦＢ２は一度だけ利用されていることになる。これより、メモリ領域４３における変数割付状況は、例えば図２に示す状態となる。
【００５２】
コンパイラ機能部１１は、任意のＦＢをインスタンス化する際、上記の通り、１つの塊（ブロック）としてメモリを割り付ける。すなわち、例えば図２に示す例のように、各ファンクションブロックをインスタンス化してなる各インスタンス毎に、１つの塊（ブロック）としてメモリ領域を割り付ける。
【００５３】
図２の例では、インスタンス１、インスタンス２、インスタンス３の３つのインスタンス化が行われるものとし、インスタンス１とインスタンス２はファンクションブロックＦＢ１に係るインスタンス、インスタンス３はファンクションブロックＦＢ２に係るインスタンスである。
【００５４】
各インスタンス毎に、上記ブロックは、その各変数に対するメモリ割当て領域と予備用領域から成る。図２の例では、予備１と予備２の２つの予備領域が加わる。そして、図示の例ではファンクションブロックＦＢ１に係る変数は変数１と変数２であり、ファンクションブロックＦＢ２に係る変数は変数３と変数４と変数５であるものとしている。これより、図示の通り、インスタンス１とインスタンス３に関しては、変数１と変数２と予備１と予備２とを含む１つの塊（ブロック）として図示のようにメモリを割付ける。インスタンス２に関しては、変数３と変数４と変数５と予備１と予備２とを含む１つの塊（ブロック）として図示のようにメモリを割付ける。
【００５５】
尚、予備領域を例えば予備１と予備２の２つとすることは予め決められているものである。メモリ割当て領域のサイズは、各ＦＢの変数の数に応じたものとなる。よって、ブロックのサイズは、固定的ではなく、各ＦＢの変数の数に応じたものとなる。
【００５６】
図２に示す例に対して、本手法では先願と同様に、ブロック内に更に図３に示すように「追加変数格納先アドレス」の領域が設けられる。「追加変数格納先アドレス」の領域には、追加ブロックの先頭アドレスが格納される。すなわち、本手法では、上記図１のＰＯＵインスタンスメモリ領域４３に対する各インスタンス毎のメモリ割当ては、例えば図３に示すようになる。
【００５７】
尚、上記追加ブロックに対して、図２に示す元々のブロックを上記先願（特許文献１）と同様に“初期ブロック”と呼ぶものとする。任意のインスタンスに係わる追加ブロックにアクセスするには、基本的には、当該インスタンスの初期ブロック内の「追加変数格納先アドレス」を経由する必要がある。
【００５８】
本手法では、図３に示すように、各変数１，２，３，４，５に関するメモリ割当ては、上記図２の例と同様であるが、その一方で、予備領域は予備１のみとなっており、更に図示のように「追加変数格納先アドレス」が割当てられている。但し、この例に限らず、予備領域は予備１、予備２の２つのままで更に「追加変数格納先アドレス」が加わるようにしてもよい。
【００５９】
ここで、ＰＬＣ３０の稼働中に、ユーザが開発支援装置１０上で変数の追加を伴うプログラム更新（例えばバージョンアップしたソースコード２１の作成等）を行った場合であって、特にＰＬＣ３０を停止しないでＰＬＣ３０の制御プログラムの変更を実施するためには、基本的には、既にメモリに割付けた変数（既存の変数）のメモリ割付け位置を変更しないようにする必要がある。
【００６０】
そこで、先願では、コンパイラ機能部１１は、ソースコード２１のコンパイル実行の際に行う上記各インスタンス毎のメモリ割当ての際に、上記管理表２４や割付対応表２６に各変数のメモリ割当て状況を登録しておくと共に、予備領域だけでなく上記「追加変数格納先アドレス」を格納する領域を確保する。新規プログラム（新規ソースコード２１）のコンパイルの際には、基本的には、この「追加変数格納先アドレス」領域には何もデータは格納されない（後述するＮＵＬＬとなる）。
【００６１】
そして、後にこの新規プログラムを更新（バージョンアップ等）したときに、更新版プログラムをコンパイルする際に、追加変数があり且つ予備領域だけでは対応できない場合には、例えば図３に示す「追加変数格納領域」（追加ブロック）を新たに確保すると共に、この追加ブロックの先頭アドレスを上記初期ブロックの「追加変数格納先アドレス」の領域に格納する。
【００６２】
ＰＬＣ３０側において、「ＰＯＵインスタンスアドレス情報」４２を用いて、「追加変数格納先アドレス」の記憶領域に、追加ブロックの先頭アドレスを格納する。これより、その後は、ＰＬＣ３０では、「追加変数格納先アドレス」経由で追加ブロック内の各追加変数にアクセスすることになる。尚、「ＰＯＵインスタンスアドレス情報」４２は、開発支援装置１０側で生成した「ＰＯＵインスタンスアドレス情報」２５がダウンロードされたものである。尚、具体例は先願（特許文献１）に示してある。
【００６３】
尚、予備領域は確保せずに「追加変数格納先アドレス」の記憶領域だけを確保するようにしてもよい。尚、逐一述べないが、各変数に関するメモリ領域割当ては、当然、図２の場合と同様に行っている。
【００６４】
また、コンパイラ機能部１１は、どの変数をどの記憶領域に割当てたのかを示す情報を、テーブル（上記管理表２４等）に記憶しておく。これも、先願に記載のように、各ブロック毎に、そのブロックの先頭アドレスからの相対アドレスとして記憶しておく。
【００６５】
コンパイラ機能部１１は、上記更新版（バージョンアップ版等）プログラムをコンパイルする際には、特に変数の追加があったＰＯＵのインスタンスに係るメモリ割当てに関しては、既存の変数に関しては上記管理表２４等を参照することで既に割当てられている記憶領域を変更しないようにする。つまり、前回コンパイル時と同じアドレスが割当てられるようにする。一方、新たに追加された変数（追加変数）に関しては、まず上記予備領域への割当てを試みて、割当て可能であれば予備領域を割当てる。
【００６６】
図３に示す例では、ソースコード２１において上記ファンクションブロックＦＢ１に関して３つの変数が追加されたものとしている。これら追加された３つの変数を、追加変数１、追加変数２、追加変数３と呼ぶものとする。よって、新たなファンクションブロックＦＢ１に関しては、上記既存の変数である変数１、変数２と、これら追加変数１、追加変数２、追加変数３との合計５つの変数が存在する状態となっている。
【００６７】
よって、上記コンパイルの際、新たなファンクションブロックＦＢ１に係るインスタンス１、インスタンス２に関しては、両方とも、５つの変数のメモリ割り当てを行うことになる。
【００６８】
そして、既存の変数１、変数２に関しては図示の通り割当位置は変わらない。一方、追加変数に関しては、上記３つの追加変数のうちの１つ（ここでは追加変数１とする）は予備領域への割当てが可能であるが、他の２つの追加変数（ここでは追加変数２，３）は予備領域に割当てることができない。
【００６９】
この様に予備領域では対応できないような変数の追加が行われた場合には、ＰＯＵインスタンスメモリ領域４３内の有効な空き領域に、当該インスタンス用の新たなブロック（追加変数格納領域／追加ブロック）を確保し、当該追加ブロックの先頭アドレス等を上記初期ブロックの「追加変数格納先アドレス」の領域に記憶する。
【００７０】
そして、当該追加ブロック内の任意の記憶領域に上記他の２つの追加変数（ここでは追加変数２，３）を割当てる。これより、例えば図３に示す状態となる。ここで、既に述べた通り、各インスタンス毎に１つの塊（ブロック）としてメモリ領域を割付けるものである為、上記新たな変数記憶領域（追加ブロック）においても、追加変数２，３だけでなく、予備領域（予備１）及び「追加変数格納先アドレス」領域も確保されることになる。
【００７１】
また、本例ではＦＢ１は２つインスタンス化されているため、インスタンス毎に、予備領域では対応できない追加変数の格納領域を確保する必要がある。この為、図３に示す通り、ＦＢ１のインスタンス１の追加ブロックと、ＦＢ１のインスタンス２の追加ブロックとが、新たに確保されることになる。
【００７２】
このようにすることで、最初に各インスタンス毎に１つの塊として割付けられるメモリ領域（初期ブロック）では、全ての追加変数を割当てることができない場合でも、ＰＯＵインスタンスメモリ領域４３内に有効な空き領域が存在する限りは、追加変数格納領域（追加ブロック）を新たに確保することで、追加変数のメモリ割当てが可能となる。これは、既に存在する変数のメモリ割当て位置は、変更しないで、追加変数のメモリ割当てを殆ど制限無しに行うものである（勿論、領域４３内に有効な空き領域が無くなれば駄目であるが）。これより、変数の追加の制限を撤廃し、ＰＬＣ３０を停止しないでプログラムの変更が実施できる。
【００７３】
尚、任意のインスタンスに係わる上記初期ブロック、追加ブロックは、何れも当該インスタンスに係わる割当ブロックと言えるものとする。
尚、以上の説明は、上記アドレス移動指令情報２７とこれを用いた処理以外は、その殆どが先願（特許文献１）と略同様であると見做しても構わない。但し、上記先願では、ＰＬＣを停止しないでプログラムを変更する為には、既存の変数のメモリ割当て位置を変更しないことが必要であるものとしたが、本手法によれば、既存の変数のメモリ割当て位置を変更しても、ＰＬＣ３０を停止しないでプログラムを変更することが可能となる。詳しくは後述する。
【００７４】
以下、本手法について、更に詳しく説明する。
ここで、図３（図４（ａ））に示す状態において、インスタンス３が削除されると、ＰＯＵインスタンスメモリ領域４３における変数割当状況は、図４（ｂ）に示す状態となり、図示の空き領域（無駄な空き領域）が生じることになる。尚、これは、例えば、バージョンアップ版等のソースコード２１では、ＰＯＵ２のインスタンス３に係わる記述が削除されている場合等である。尚、インスタンスの削除に限らず、ＰＯＵが削除される場合も有り得る。
【００７５】
このようにインスタンスの追加・削除をユーザが実施すると、メモリ領域４３に無駄な空き領域が発生し、制御プログラムに係わる各変数の割当領域の合計サイズ、換言すれば全ブロックのサイズの合計値が、ＰＬＣ３０が所有しているメモリサイズ（メモリ領域４３のサイズ等）より小さい場合でも、変数の追加が実施できなくなる場合が起こり得る。
【００７６】
これより、本手法では、上記問題が生じることを防止する為、ＰＬＣ３０側において、他のインスタンスの既存の割当ブロックを、空き領域を埋めるようにして移動させる。この移動によって新たな空き領域が生じた場合には、更に別のインスタンスの既存の割当ブロックを、当該新たな空き領域を埋めるように移動させる。
【００７７】
尚、ここでは、空き領域と記した場合には、基本的に、“無駄な空き領域”を意味するものとする。上記「有効な空き領域」は「有効な空き領域」と記すことで、区別するものとする。「有効な空き領域」は、基本的に、ブロック群の最後のブロックの後に存在する空き領域であり、基本的には新たなブロックを割当て可能であり、無駄には成らないはずである。
【００７８】
尚、上記他のインスタンスや別のインスタンスとは、既存のインスタンスであって上記削除されたインスタンス以外のインスタンスである。
また、開発支援装置１０においては、上記既存の割当ブロックを移動することに応じて、ＰＯＵインスタンスアドレス割付対応表２６を修正する処理を実行する。
【００７９】
上記他のインスタンスの既存の割当ブロックの移動処理は、後にフローチャート図を参照して説明するが、以下、概略的に説明する。
ここで、まず、変数情報管理表２４の具体例を、図５に示す。
【００８０】
尚、ここでは概略的に示すものであり、追加ブロックに関しては示していない。変数情報管理表２４の詳細例は、先願（特許文献１）に示してある。
変数情報管理表２４は、各インスタンス毎に存在する。変数情報管理表２４は、変数名５１、型５２、相対位置５３等から成る。これらについては先願に説明されているので、ここでは特に説明しないが、各インスタンスの各変数の割当アドレスは、そのインスタンスの割当ブロックの先頭アドレスからの相対位置として、変数情報管理表２４に登録されている。つまり、各インスタンス毎に、後述する先頭アドレス６５と相対位置５３とによって、変数名５１の各変数の割当アドレスが決まる。これは、上記「追加変数格納先アドレス」についても同様である。
【００８１】
あるいは、ここでは図示していないが、追加ブロックに関しても、先願に示すように、後述する追加ブロック先頭アドレス６８と相対位置５３とによって、追加ブロックの変数名５１の変数の割当アドレスが決まることになる。これより、後述するように任意のインスタンスに係わる先頭アドレス６５または追加ブロック先頭アドレス６８が変更されると、当該インスタンスに係わる各変数の割当領域が変更されることになる。
【００８２】
ここで、ＰＯＵインスタンスアドレス割付対応表２６の具体例を、図６（ａ）、（ｂ）や図７（ａ）、（ｃ）に示す。
ＰＯＵインスタンスアドレス割付対応表２６は、インスタンス番号６１、状態６２、インスタンス名６３、ＰＯＵ名６４、先頭アドレス６５、インスタンスサイズ６６、追加ブロック情報個数６７、追加ブロック先頭アドレス６８、追加ブロックサイズ６９の各データ項目より成る。これら各データ項目のうち、状態６２とインスタンス名６３と追加ブロック情報個数６７以外は、先願と同じであってよく、ここでは特に説明しない。
【００８３】
尚、割付対応表２６の各レコードは、各インスタンスに対応するものである。よって、図３の例に応じた割付対応表２６は、図６等に示すようにレコード数が３個となる。また、各レコード毎に、対応するインスタンスの識別情報（名称等）がインスタンス名６３に格納される。
【００８４】
状態６２には、「有効」と「削除」の何れかが格納される。新規レコード作成時には、そのレコードの状態６２には「有効」が格納される。その後、既存レコードの中に対応するインスタンスが削除されたものがあった場合には、そのレコードの状態６２を「削除」とする。詳しくは後にフローチャート図を参照して説明する。
【００８５】
例えば、ユーザが既存のソースコード２１に基づいてその更新版（バージョンアップ版等）を作成する際に、何らかのインスタンスに係わる記述を削除する場合がある。本例では、コンパイルの際に、この削除されたインスタンスに対応するレコードの状態６２が「削除」に変更されることになる。更に、後に修正処理の際に、このレコード自体が削除されることになる。
【００８６】
コンパイラ機能部１１は、更新版のソースコード２１のコンパイル処理の際に、削除されたインスタンスに対応するレコードの状態６２を「削除」とする処理を行う。これは、例えば後述するように、処理開始時に全レコードの状態６２を「削除」とし、更新版のソースコード２１に記述された各インスタンス名と、各レコードの上記インスタンス名６３とを比較することで、一致するレコードの状態６２を「有効」に変更する。これによって、処理終了時には、削除されたインスタンスに対応するレコードの状態６２は「削除」のままとなっている。
【００８７】
図６（ａ）には図２に示す状態に応じた割付対応表２６の具体例を示す。つまり、未だ追加ブロックが１つも設けられていない状態での割付対応表２６の具体例を示す。よって、追加ブロック先頭アドレス６８は全レコードで“ＮＵＬＬ”となっていると共に、追加ブロックサイズ６９は初期値‘０’となっている。また、各インスタンス毎の追加ブロックの数を示す追加ブロック情報個数６７は、この状態では当然‘０’となる。
【００８８】
尚、追加ブロック先頭アドレス６８、追加ブロックサイズ６９は、それぞれ、先願（特許文献１）における追加変数格納先アドレス６５、追加変数格納先サイズ６６に相当する。
【００８９】
図６（ｂ）には図３に示す状態に応じた割付対応表２６の具体例を示す。つまり、追加ブロックが設けられた状態での割付対応表２６の具体例を示す。この例では、１番目と２番目のレコードにおいて、追加ブロック先頭アドレス６８にはそのインスタンスに係わる追加ブロックの先頭アドレスが格納されている。また、追加ブロックサイズ６９は、ここでは‘８’とする。
【００９０】
そして、図４（ｂ）に示す例のようにインスタンス３が削除された場合には、コンパイル処理後、割付対応表２６は図７（ａ）に示す状態となる。つまり、インスタンス３に対応するレコードの状態６２が「削除」となる。尚、本例では仮に、インスタンス３のインスタンス名は“Ｉ１＿ＦＢ２”であるものとする。図７（ａ）に示す状態の割付対応表２６等に基づいて、例えば図７（ｂ）に示すアドレス移動指令情報２７が生成され、これがＰＬＣ３０にダウンロードされる。尚、その際、コンパイル結果である機械語オブジェクト２３も一緒に、ＰＬＣ３０にダウンロードしてもよい。
【００９１】
その後、ＰＬＣ３０側では、上記ダウンロードされたアドレス移動指令情報２７に基づいて、既存のブロックの移動を行う。これは、既存ブロックのデータ移動（その各変数のデータの移動）と、この移動に応じたメモリ割当情報の変更等が、行われることになる。一方、開発支援装置１０側では、上記アドレス移動指令情報２７に基づいて、割付対応表２６の修正が行われて、割付対応表２６は例えば図７（ｃ）に示す状態となる。尚、当該修正後の割付対応表２６も、ＰＬＣ３０にダウンロードしてもよい。
【００９２】
ここで、上記制御プログラムの更新等に伴って任意の既存インスタンスが削除されると、ＰＬＣ３０において当該インスタンスに対して割り付けられていた記憶領域が空くことになる。この空き領域を再利用するために、ＰＬＣ３０側では、上記ダウンロードされたアドレス移動指令情報２７等を用いて、空き領域に他のインスタンスの割当ブロックを移動させる。これによって、無駄な空き領域を無くすようにする。
【００９３】
尚、新規追加インスタンスがあったときに、上記空き領域を割り当てることも考えられるが、空き領域の容量が、新規追加インスタンスに関して必要な記憶領域と同じであるとは限らない。むしろ、多いか又は少ない場合が多いと考えられる。それ故、本手法では、既存のインスタンスに既に割り当てられている記憶領域を、移動させることで、空き領域を無くすようにする。尚、この場合の空き領域とは、上記の「無駄な空き領域」であり、例えば図４（ｂ）に示す例のように、既存のブロック群の中にある空き領域を意味する。尚、最後のブロック（図３や図４に示す例では、インスタンス２の追加ブロック）以降の空き領域が、上記「有効な空き領域」に相当する。
【００９４】
上記既存の他のインスタンス割当領域の移動処理をＰＬＣ３０で実行させる為に必要な情報であるアドレス移動指令情報２７を、開発支援装置１０側で作成する。この作成処理については、後にフローチャート図を参照して説明する。
【００９５】
図７（ｂ）に、アドレス移動指令情報２７のデータ構成例を示す。
図示の例では、アドレス移動指令情報２７は、移動元先頭アドレス７１、移動サイズ７２、移動先先頭アドレス７３の各データ項目より成る。尚、これらに加えて更に図示の追加格納アドレス７４が更に設けられていても良い。
【００９６】
移動元先頭アドレス７１と移動サイズ７２には、移動対象のインスタンスに割り当てられていた記憶領域（ブロック）の先頭アドレスとサイズが、格納される。移動先先頭アドレス７３には、移動先の記憶領域の先頭アドレスが格納される。
【００９７】
また、移動元が追加ブロックである場合には、当該追加ブロックの先頭アドレスが格納されている領域のアドレスが、上記追加格納アドレス７４に格納されるものであってもよい。例えば上記の例においてインスタンス１に係わる追加ブロックの場合、その先頭アドレス＝1024は、アドレス1004番地に格納されているので、上記追加格納アドレス７４には‘1004’が格納される。
【００９８】
移動対象の決定方法や、移動先の記憶領域の決定方法は、一例を後述するフローチャート図に示し、後に詳細に説明するが、以下、図４（ｂ）に示す一例を用いて、概略的に説明する。
【００９９】
例えば、図４（ｂ）の例の場合、ＰＯＵ２のインスタンス３（インスタンス名；  I1_FB2）が削除されているので、その割当ブロックが空き領域となると共に、その直後にある割当ブロックは、ＰＯＵ１のインスタンス１の追加ブロックである。よって、この追加ブロックが最初の移動対象となり、その先頭アドレスとサイズを割付対応表２６から取得して、上記移動元先頭アドレス７１と移動サイズ７２に格納することになる。更に、上記ＰＯＵ２のインスタンス３の割当ブロック（空き領域）の先頭アドレスを、割付対応表２６から取得して、移動先先頭アドレス７３に格納することになる。これによって、図７（ｂ）に示すアドレス移動指令情報２７の先頭レコードが生成されることになる。
【０１００】
更に、２番目の移動対象に関して図７（ｂ）に示す２番目のレコードも生成されるが、これについてはここでは説明しない。後にフローチャート図を参照して説明する。また、追加格納アドレス７４についても、ここでは説明しない。後に説明する。
【０１０１】
上記生成されたアドレス移動指令情報２７はＰＬＣ３０にダウンロードされる。ＰＬＣ３０側では、このアドレス移動指令情報２７の先頭レコードを用いて、上記最初の移動対象の割当ブロック内の各領域の格納データを、図８（ａ）に示すように上記空き領域へと移動させる。これによって、メモリ割当状況は図８（ｂ）に示す状態となる。つまり、上記移動を行ったことで、今度は、ＰＯＵ１のインスタンス１の追加ブロックとＰＯＵ１のインスタンス２の追加ブロックとの間に、新たな空き領域が生じることになる。
【０１０２】
この新たな空き領域の直後にある割当ブロックは、ＰＯＵ１のインスタンス２の追加ブロックである。よって、この追加ブロックが上記２番目の移動対象となり、上記アドレス移動指令情報２７の２番目のレコードを用いて、インスタンス２の追加ブロック内の各格納データを、新たな空き領域へと移動させる。これによって、メモリ割当状況は図９に示す状態となる。
【０１０３】
このようにして、削除されたインスタンスの割当ブロック以降の割当ブロックを、空き領域に対して順次詰めていく形で移動させることで、空き領域を無くすようにする。図８の例では、上記インスタンス２の追加ブロックを移動させる処理を行ったことで、図９に示す状態となり、これは空き領域が無くなった状態であるので、移動処理は終了することになる。
【０１０４】
尚、空き領域の定義は上述した通りであり、この例ではＰＯＵ１のインスタンス２の追加ブロック（最後のブロック）以降に、空いている記憶領域があっても、それは上記“空き領域”には相当せず、上記「有効な空き領域」に相当することになる。
【０１０５】
また、上記の通り、“空き領域”に詰めることで新たな“空き領域”が生じる場合もあり、新たな“空き領域”が生じなくなるまで順次詰めていくことになる。また、後に、新規ブロックを作成する必要が生じた場合には、ＰＯＵ１のインスタンス２の追加ブロック以降で空いている記憶領域に、ブロックを割り当てることになる。
【０１０６】
また、ブロックの移動は、上記移動対象の各ブロックの格納データの移動だけでなく、機械語オブジェクト４１の各変数のメモリ割当状況等を、修正する必要がある。あるいは、必要に応じて、「追加変数格納先アドレス」の格納データの修正等も、行う必要がある。これらを修正しないと、その後に制御プログラムを実行すると、変数に関して移動前の領域にアクセスすることになる。これについては、後にフローチャート図の説明の際に説明する。
【０１０７】
更に、ＰＬＣ３０において、制御プログラム実行中に変数データを移動すると、動作が不安定になるため、制御プログラム実行時以外の時間帯に、変数データを移動する処理を行う必要がある。
【０１０８】
ＰＬＣ３０は、例えば図１０に示すように、ユーザが作成したユーザプログラム（制御プログラム）を、ユーザが設定した定周期で繰り返し実行する。この処理機能は、図１のプログラム実行管理機能部３１で実施する。上記各周期内で制御プログラムの実行が完了すると、次の周期開始までの間は、プログラムの実行待ちの状態になる。その間は図１０に示すように「システムの処理」が実行される。
【０１０９】
「システムの処理」では、ＰＬＣ３０のシステムで必要な処理を実施する。これは、ユーザプログラム実行以外であれば、基本的には何でもよい。そこで、「システムの処理」中に、変数データの移動処理を実施することにより、ＰＬＣ３０を停止しないで、変数割当状況の変更が可能になる。
【０１１０】
１つの「システムの処理」時間中に全ての移動対象ブロックを移動することが困難である場合でも、複数の「システムの処理」に渡って各移動対象ブロックを移動させることで、最終的に全ての移動対象ブロックを移動することができる。尚、「システムの処理」時間は、一つのブロックを移動するには、十分な時間があるものとする。
【０１１１】
また、そのままでは制御プログラム（機械語オブジェクト４１）は、各変数に係わるメモリアクセスを、移動前のアドレスに対して行うことになる。これより、上記移動対象ブロックの移動に伴って、機械語オブジェクト４１や関連情報を、修正・更新する必要がある。これは、例えば、1つの移動対象ブロックを移動させる毎に、この移動対象ブロックに係わる機械語オブジェクト４１の該当箇所や関連情報を、上記移動後の状態に対応するものへと変更する。尚、関連情報とは例えば図８等に示す「追加変数格納先アドレス」の領域の格納データであり、詳しくは後述する。この様にすることで、ＰＬＣ３０を停止させることなく変数の割当位置を移動させても、問題なく動作させることができる。この処理の詳細は、後にフローチャート図の説明の際に説明する。
【０１１２】
尚、今回の「システムの処理」内に任意の移動対象ブロックを移動可能か否かを判定する処理は、例えば、今回の「システムの処理」の残り時間をγ、単位（例えば１Ｗ）当たりのデータ移動に掛かる時間をα、上記機械語オブジェクト４１や関連情報の修正・更新処理に掛かる時間をβとした場合、以下の条件が成立する場合に移動可能と判定する。但し、これは一例であり、この例に限らない。
【０１１３】
γ≧移動対象ブロックのサイズ×α＋β
以下、図１１〜図１６のフローチャート図を参照すると共に図６、図７に示す具体例を用いて、更に詳細に説明する。
【０１１４】
尚、以下の説明では、ＰＯＵインスタンスメモリ領域４３において、番地が小さい方を上、番地が大きい方を下と表現するものとする。例えば図２の例では、インスタンス１の割当ブロックはインスタンス２の割当ブロックの上側にあり、インスタンス３の割当ブロックはインスタンス２の割当ブロックの下側にあるものとする。そして、本例では、任意のインスタンスが削除されたことで空き領域が生じた場合、この空き領域の下側の割当ブロックを、順次、上側へと移動させていく処理となる。
【０１１５】
そして、以下に説明する図１１及び図１２の処理は。空き領域の下側の割当ブロックの中で最も上側の割当ブロックの先頭アドレスを、後述する削除開始アドレスβに設定する処理であると見做して構わない。
【０１１６】
以下、まず、図１１及び図１２の処理について説明する。尚、これは１つの処理を図１１と図１２の２つに分けて示しているのであり、よって特に区別せずに図１１等と記す場合もあるものとする。
【０１１７】
図１１等の処理では、まず、ステップＳ１の処理は、新規制御プログラム（新規ソースコード２１）のコンパイル処理に伴って、割付対応表２６を新規作成する処理である。本例では、例えば上記図６（ｂ）に示す内容のＰＯＵインスタンスアドレス割付対応表２６が生成されるものとする。勿論、その際、コンパイル結果（機械語オブジェクト２３）や上記ＰＯＵインスタンスアドレス情報２５等を、ＰＬＣ３０にダウンロードして運用させる処理等も行われるが、この様な先願の既存処理については逐一説明しないものとする。
【０１１８】
後に、上記新規制御プログラムの更新版等が作成されると、そのコンパイル処理の際に図示のステップＳ１１以降の処理が実行される。これによって、上記削除開始アドレスβの設定が行われると共に、本例では割付対応表２６は例えば図７（ａ）に示す状態となる。
【０１１９】
ステップＳ１１以降の処理では、コンパイル対象の制御プログラムに対応する割付対応表２６が、既に存在している状態であるので、コンパイル処理開始直後に、まず、その全レコードの“状態６２”を全て「削除」にする（ステップＳ１１）。
【０１２０】
そして、コンパイル処理実行中、ソースコード２１に基づく任意のインスタンス毎に、そのインスタンスに対応するレコードが割付対応表２６に存在している場合には当該レコードの状態６２を上記「削除」から「有効」に変更する（ステップＳ１２）。これは、例えば、そのインスタンスのインスタンス名等に基づいて、対応するレコードの有無を判断するが、この例に限らない。
【０１２１】
尚、そのインスタンスに対応するレコードが割付対応表２６に存在していない場合、このインスタンスは今回新たに追加されてものと見做して、上記新規制御プログラムのコンパイル時と同様にして新規レコードを作成して割付対応表２６に追加するようにしてもよい。勿論、上記の通り、新規レコードの状態６２は「有効」とする。
【０１２２】
これによって、コンパイル処理対象の制御プログラムに存在するインスタンスに対応する全レコードについて、その状態６２が「有効」となる。そして、以前は存在していたが、今回のコンパイル処理対象の制御プログラムには存在しないＰＯＵのインスタンスに対応するレコードに関しては、その状態６２は上記「削除」のままとなっている。
【０１２３】
そして、削除されたインスタンスに係わる割当ブロック（空き領域）の先頭アドレスを探索する処理（ステップＳ１４〜ステップＳ２５）を実行する。尚、この処理は、空き領域が複数存在する場合には、その中で最も上側の空き領域の先頭アドレスを、探索することになる。
【０１２４】
ここで、上記ステップＳ１１、Ｓ１２の処理によって、割付対応表２６は例えば図７（ａ）に示す状態となっている。
そして、まず、処理対象のインデックスを初期値（＝１）に設定し（ステップＳ１４）、「削除の有無」αを初期化（＝無し）すると共に「削除開始アドレス」βを初期化（＝０）する（ステップＳ１５）。その後、後述するステップＳ２５がＮＯとなるまで、ステップＳ１６〜Ｓ２５の処理を繰り返し実行する。
【０１２５】
尚、上記処理対象のインデックスは、割付対応表２６における処理対象レコードを示すポインタ等に相当し、上記処理対象のインデックス＝１は割付対応表２６の先頭レコード（１行目）を処理対象とすることを意味する。また、上記「削除の有無」α、「削除開始アドレス」βは、本処理に用いる変数と見做してよく、簡略化してα、βと記す場合もあるものとする。上記ステップＳ１５によって、初期状態ではα＝無し、β＝０となっている。
【０１２６】
割付対応表２６を参照して、まず、上記処理対象レコードの状態６２を取得する（ステップＳ１６）。最初は、先頭レコードの状態６２を取得することになるので、図７（ａ）に示す例では「有効」が取得されることになる。
【０１２７】
そして、ステップＳ１６で取得した状態６２が「有効」であれば（ステップＳ１７，ＹＥＳ）そのままステップＳ２４の処理へ移行し、「削除」であれば（ステップＳ１７、ＮＯ）、ステップＳ１８の処理へ移行する。
【０１２８】
ステップＳ１８では、「削除の有無」αが“無し”（初期状態）であるか否かを判定する。
α＝“無し”である場合には（ステップＳ１８，ＹＥＳ）、α＝“有り”に設定すると共に（ステップＳ２２）、処理対象レコードの先頭アドレス６５を上記「削除開始アドレス」βに設定する（ステップＳ２３）。
【０１２９】
ここで、図７（ａ）の例の場合、処理対象が先頭レコードと２番目のレコードのときにはステップＳ１７がＹＥＳとなり、そのままステップＳ２４へ移行する。そして、処理対象が３番目のレコードのときに、ステップＳ１７がＮＯとなり、αは初期状態のまま（＝“無し”）であるのでステップＳ１８はＹＥＳとなり、ステップＳ２３ではその先頭アドレス６５（＝１０１２）が「削除開始アドレス」βに設定されることになる。つまり、これによって「削除開始アドレス」β＝‘1012’の状態となる。
【０１３０】
一方、既にステップＳ２２の処理が実行済みでα＝“有り”になっている場合には（ステップＳ１８，ＮＯ）、処理対象レコードの先頭アドレス６５のデータを取得して（ステップＳ１９）、当該取得データが「削除開始アドレス」βの値より小さい場合には（ステップＳ２０，ＮＯ）、「削除開始アドレス」βの値を更新して（当該取得データの値とする）（ステップＳ２１）、ステップＳ２４へ移行する。一方、取得データがβの値より大きい場合には（ステップＳ２０，ＹＥＳ）、そのままステップＳ２４へ移行する。
【０１３１】
尚、この処理は、既に述べたように、空き領域が複数ある場合には、その中で最も上側の空き領域の先頭アドレスを探索する為である。つまり、最終的に「削除開始アドレス」βには、当該最も上側の空き領域の先頭アドレスが設定されているようにする。
【０１３２】
ステップＳ２４では、上記処理対象のインデックスを＋１インクリメントする。つまり、次のレコードを新たな処理対象レコードとする。但し、次のレコードが無い場合には（ステップＳ２５，ＮＯ）、本処理を終了する。次のレコードがある場合には（ステップＳ２５，ＹＥＳ）、ステップＳ１６に戻る。
【０１３３】
次に、以下、図１３及び図１４の処理について説明する。尚、これは１つの処理を図１３と図１４の２つに分けて示しているのであり、よって特に区別せずに図１３等と記す場合もあるものとする。図１３等の処理は、アドレス移動指令情報２７の一部（移動元先頭アドレス７１と移動サイズ７２）を、設定するための処理である。
【０１３４】
図１３等の処理では、まず、「削除の有無」αをチェックして、αが上記初期状態（＝“無し”）のままである場合には（ステップＳ３１，ＹＥＳ）、何も処理を行うことなく本処理を終了する。これは上記ステップＳ２２の処理が実行されなかった場合であり、つまり割付対応表２６の全レコードの状態６２が「有効」であった場合であるからである。
【０１３５】
αが上記“有り”となっている場合には（ステップＳ３１，ＮＯ）、まず、処理対象のインデックスに初期値（＝１）に設定すると共に（ステップＳ３２）、移動指令処理対象インデックスに初期値（＝１）に設定する（ステップＳ３３）。
【０１３６】
上記処理対象のインデックスは、既に説明した通り、割付対応表２６における処理対象レコードを示すポインタ等である。上記移動指令処理対象インデックスは、アドレス移動指令情報２７における処理対象レコードを示すポインタ等である。
【０１３７】
その後は、後述するステップＳ４７の判定がＮＯとなるまで、上記処理対象のインデックスを＋インクリメントしつつ（ステップＳ４６）、ステップＳ３４〜Ｓ４７の処理を繰り返し実行する。
【０１３８】
まず、割付対応表２６における現在の処理対象レコードの“状態”６２を参照して、これが上記「有効」であれば（ステップＳ３４，ＹＥＳ）ステップＳ３５へ移行し、これが上記「削除」であれば（ステップＳ３４，ＮＯ）そのままステップＳ４６の処理へ移行する。
【０１３９】
上記の通り最初は先頭レコードが処理対象であるので、図７（ａ）の例では“状態”６２は「有効」であるので、ステップＳ３５に移行することになる。
ステップＳ３５では、現在の処理対象レコードの“先頭アドレス”６５を取得する。そして、この取得データを、上記「削除開始アドレス」βと大小比較する（ステップＳ３６）。
【０１４０】
上記ステップＳ３５で取得した“先頭アドレス”６５が、「削除開始アドレス」βより大きい場合には（ステップＳ３６，ＹＥＳ）、まず、処理対象レコードのデータに基づいて、アドレス移動指令情報２７にデータ登録する（ステップＳ３７）。このステップＳ３７の処理は、例えば、移動元先頭アドレス７１に処理対象レコードの先頭アドレス６５を格納すると共に、移動サイズ７２に処理対象レコードのインスタンスサイズ６６を格納するものである。
【０１４１】
そして、上記移動指令処理対象インデックスを＋１インクリメントする（ステップＳ３８）。
尚、上記処理は、既存の各初期ブロックであって削除されたブロック以外の各初期ブロックのなかで、上記最も上側の空き領域よりも下側に位置する初期ブロックを見つけて、当該初期ブロックの先頭アドレスとサイズを、移動元先頭アドレス７１と移動サイズ７２に格納する処理である。追加ブロックに関しては、後述するステップＳ４０〜Ｓ４５によって同様の処理を行うことになる。
【０１４２】
尚、“先頭アドレス”６５が、「削除開始アドレス」βより小さい場合には（ステップＳ３６，ＮＯ）、そのままステップＳ４０以降の処理へ移行する。すなわち、処理対象レコードに係わる追加ブロックに関する処理へと移行する。
【０１４３】
続いて、上記処理対象レコードに係わる追加ブロックに関して、ステップＳ４０以降の処理を行う。これは、処理対象レコードに係わる追加ブロックの数の分だけ、ステップＳ４１〜Ｓ４５の処理を繰り返すものである。
【０１４４】
すなわち、まず、追加変数処理インデックスに初期値（＝１）に設定する（ステップＳ４０）。そして、ステップＳ４１の判定がＮＯとなるまで、ステップＳ４１〜Ｓ４５の処理を繰り返す。尚、上記追加変数処理インデックスは、処理対象レコードの追加ブロック情報を示すポインタであり、上記ステップＳ４０によって最初の追加ブロック情報を示すことになる。追加ブロック情報とは、図６や図７（ａ）等における「追加ブロック先頭アドレス６８＋追加ブロックサイズ６９」である。追加ブロック情報個数６７の数の分だけ、追加ブロック情報が存在し、上記ステップＳ４０はそのなかで最初の追加ブロック情報を処理対象に指定するものである。その後、後述するステップＳ４５の処理によって、処理対象の追加ブロック情報を変えていくことになる。
【０１４５】
但し、（未処理の）追加ブロック情報が存在するか否かを判定する（ステップＳ４１）。これは、例えば処理対象レコードの追加ブロック情報個数６７等に基づいて判定する。例えば、追加ブロック情報個数６７が‘０’である場合には、ステップＳ４１の判定はＮＯとなる。また、追加ブロック情報個数６７が‘１’以上であっても、「追加ブロック情報個数６７＜追加変数処理インデックス」となった場合にも、ステップＳ４１の判定はＮＯとなる。つまり、追加ブロック情報個数６７が‘１’以上であり、且つ、「追加ブロック情報個数６７≧追加変数処理インデックス」である場合に、ステップＳ４１の判定はＹＥＳとなる。
【０１４６】
上記ステップＳ４１の判定がＹＥＳの場合には、当該処理対象レコードの処理対象の追加ブロック情報における追加ブロック先頭アドレス６８を取得して、当該取得データと「削除開始アドレス」βとの大小比較を行う（ステップＳ４２）。
【０１４７】
そして、追加ブロック先頭アドレス６８が「削除開始アドレス」βより大きい場合には（ステップＳ４２，ＹＥＳ）、まず、処理対象レコードの処理対象の追加ブロック情報のデータに基づいて、アドレス移動指令情報２７にデータ登録する（ステップＳ４３）。
【０１４８】
このステップＳ４３の処理は、例えば、処理対象レコードの処理対象の追加ブロック情報における追加ブロック先頭アドレス６８と追加ブロックサイズ６９のデータを、それぞれ、アドレス移動指令情報２７の処理対象レコードにおける移動元先頭アドレス７１と移動サイズ７２に格納するものである。
【０１４９】
ステップＳ４３では、上記処理に加えて更に、処理対象レコードのＰＯＵ名６４と先頭アドレス６５とに基づいて、処理対象の追加ブロックの先頭アドレスを格納している領域のアドレス（初期ブロックにおける「追加変数格納先アドレス」のアドレス等）を判別して、これを追加格納アドレス７４に格納する処理を行ってもよい。
【０１５０】
これは、処理対象レコードのＰＯＵ名６４より、このＰＯＵ用の上記変数情報管理表２４を参照して、その変数名５１が「追加変数格納先アドレス」であるレコードの相対位置５３を取得する。そして、この相対位置５３を上記先頭アドレス６５に加算することで、追加ブロックの先頭アドレスの格納領域を求める。図７（ａ）の先頭レコードと図５の例の場合、１０００＋４＝１００４が求められることになり、これが図７（ｂ）に示すようにアドレス移動指令情報２７の先頭レコードの追加格納アドレス７４に格納されることになる。
【０１５１】
尚、この様な追加ブロックの先頭アドレスの格納領域の求め方自体は、先願（特許文献１）と略同様である。追加ブロックの先頭アドレスの格納領域は、リンク元の初期ブロック内等にあり、図３、図４に示す「追加変数格納先アドレス」がこれに相当する。
【０１５２】
尚、アドレス移動指令情報２７の処理対象レコードは、上記のように、上記移動指令処理対象インデックスによって示されるものである。
そして、上記移動指令処理対象インデックスを＋１インクリメントする（ステップＳ４４）。更に、上記追加変数処理インデックスを＋１インクリメントする（ステップＳ４５）。
【０１５３】
尚、追加ブロック先頭アドレス６８が、「削除開始アドレス」βより小さい場合には（ステップＳ４２，ＮＯ）、そのままステップＳ４５へ移行する。
そして、今度は、例えば、「追加変数処理インデックス＞追加ブロック情報個数６７」である場合には上記ステップＳ４１の判定がＮＯとなり、ステップＳ４６へ移行して、未処理のレコードが残っていればステップＳ３４に戻って、上記処理を繰り返すことになる。
【０１５４】
上記ステップＳ４０〜Ｓ４５の処理によって、追加ブロックに関しても、上記最も上側の空き領域よりも下側の追加ブロックは全て、移動対象ブロックとしてアドレス移動指令情報２７に登録される。尚、各移動対象ブロックの移動先の決定と当該移動先のアドレス移動指令情報２７への登録は、後述する図１５の処理によって実現する。
【０１５５】
ここで、図７（ａ）の例において上記図１３等の処理を実行した場合、まず、先頭レコードに関しては、状態６２は「有効」であるが先頭アドレス６５は‘1000’であり、β（＝1012）より小さいので、ステップＳ３６の判定はＮＯとなる。よって、このときにはアドレス移動指令情報２７にデータ登録されない。よって、この段階ではアドレス移動指令情報２７にはデータは存在しない状態である。
【０１５６】
引き続き上記先頭レコードに関してステップＳ４０以降の処理が実行されると、追加ブロック先頭アドレス６８は‘1024’であるので、βより大きい為、上記ステップＳ４２の判定はＹＥＳとなる。よって、ステップＳ４３の処理が実行されるので、アドレス移動指令情報２７には図７（ｂ）に示す先頭レコードの一部が登録されることになる。すなわち、先頭レコードの移動元先頭アドレス７１には上記追加ブロック先頭アドレス６８（＝‘1024’）が登録され、移動サイズ７２には追加ブロックサイズ６９（＝８）が登録されることになる。尚、本処理では移動先先頭アドレス７３には未だデータは登録されない。これは後に後述する図１５の処理で登録されることになる。
【０１５７】
そして、ステップＳ４４で移動指令処理対象インデックスが‘２’に更新される。これによって、次回にアドレス移動指令情報２７にデータ登録されるときには２番目のレコードに登録されることになる。
【０１５８】
また、ステップＳ４５で追加変数処理インデックスが‘２’に更新されるので、これは追加ブロック情報個数６７（＝‘１’）より大きい為、ステップＳ４１はＮＯとなり、ステップＳ４６で処理対象が２番目のレコードとなり、ステップＳ３４に戻る。
【０１５９】
割付対応表２６における２番目のレコードに関しては、まず、状態６２は「有効」であるが先頭アドレス６５は‘1006’であり、β（＝1012）より小さいので、ステップＳ３６の判定はＮＯとなる。
【０１６０】
引き続き上記２番目のレコードに関してステップＳ４０以降の処理が実行されると、追加ブロック先頭アドレス６８は‘1032’であるので、βより大きい為、上記ステップＳ４２の判定はＹＥＳとなる。よって、ステップＳ４３の処理が実行されるので、アドレス移動指令情報２７には図７（ｂ）に示す２番目のレコードの一部が登録されることになる。すなわち、２番目のレコードの移動元先頭アドレス７１には上記追加ブロック先頭アドレス６８（＝‘1032’）が登録され、移動サイズ７２には追加ブロックサイズ６９（＝８）が登録されることになる。
【０１６１】
その後は上記先頭レコードの場合と略同様にしてステップＳ４１の判定がＮＯとなり、ステップＳ４６で処理対象は３番目のレコードとなってステップＳ３４に戻るが、今度は状態６２が「削除」であるので、そのままステップＳ４６へ移行し、４番目のレコードは存在しないことから、本処理を終了することになる。
【０１６２】
上記の通り、上記処理では移動先先頭アドレス７３にはデータ登録されないので、図１３等の処理を実行完了した時点では、アドレス移動指令情報２７は未完成の状態である。続いて、図１５の処理を実行することでアドレス移動指令情報２７を完成させる。
【０１６３】
図１５の処理では、まず、上記ステップＳ３１と同じく、「削除の有無」αをチェックして、αが上記初期状態（＝“無し”）のままである場合には（ステップＳ５１，ＹＥＳ）、何も処理を行うことなく本処理を終了する。
【０１６４】
一方、α＝“有り”となっている場合には（ステップＳ５１，ＮＯ）、まず、上記移動指令処理対象インデックスに初期値（＝１）に設定する（ステップＳ５２）。そして、ステップＳ５３の判定がＮＯとなるまで、ステップＳ５３〜Ｓ５６の処理を繰り返し実行する。すなわち、まず、アドレス移動指令情報２７において、現在の移動指令処理対象インデックスが示す位置にレコードが存在するか否かを判定する（ステップＳ５３）。換言すれば、アドレス移動指令情報２７に処理対象レコードがあるか否かを判定する。処理対象レコードが無い場合には（ステップＳ５３，ＮＯ）、本処理を終了する。
【０１６５】
処理対象レコードがある場合（ステップＳ５３，ＹＥＳ）、アドレス移動指令情報２７における当該処理対象レコードの移動先先頭アドレス７３に、上記「削除開始アドレス」βの値を登録する（ステップＳ５４）。最初は、図７（ｂ）に示す先頭レコードが処理対象レコードであり、「削除開始アドレス」βは上記‘1012’であるので、図７（ｂ）に示すように先頭レコードの移動先先頭アドレス７３に‘1012’が登録されることになる。
【０１６６】
そして、「削除開始アドレス」βを更新する（ステップＳ５５）。これは、例えば、現在のβに、処理対象レコードの移動サイズ７２を加算したものを、新たなβとする（ステップＳ５５）。つまり「β＝β＋移動サイズ７２」によってβを更新する。上記の例では現在のβは上記の通り‘1012’であり、上記先頭レコードの移動サイズ７２は‘８’であるので、新たなβ＝１０１２＋８＝１０２０となる。
【０１６７】
そして、移動指令処理対象インデックスを＋１インクリメントして（ステップＳ５６）、ステップＳ５３に戻る。今度は２番目のレコードが処理対象レコードとなり、その移動先先頭アドレス７３に上記更新後の「削除開始アドレス」β＝‘1020’が登録されることになる。そして、３番目のレコードは存在しないので、ステップＳ５３はＮＯとなり、本処理を終了する。
【０１６８】
上記処理によって、アドレス移動指令情報２７は、図７（ｂ）に示す状態となり、完成したことになる。
そして、上記完成したアドレス移動指令情報２７を、ＰＬＣ３０にダウンロードする。
【０１６９】
ＰＬＣ３０が、このアドレス移動指令情報２７を用いて、例えば図１６の処理を実行することで、上記インスタンスの削除によって生じるＰＯＵインスタンスメモリ領域４３内の空き領域を、他のインスタンスの既存の割当ブロックを移動させることで埋めて、無駄な空き領域を無くすことができる。
【０１７０】
尚、上記図１１、図１２、図１３、図１４、図１５の処理は、開発支援装置１０が実行し、図１６の処理はＰＬＣ３０が実行するが、この例に限らない。
更に、フローチャート図等は特に示さないが、開発支援装置１０は更に、上記生成したアドレス移動指令情報２７を用いて、割付対応表２６の修正処理を実行する。これについては後に説明するが、この処理によって、割付対応表２６は、ＰＬＣ３０側での上記割当ブロック移動後の各変数のメモリ割当て状況に、対応する内容へと修正されることになる。よって、その後に更に当該制御プログラムの更新等が行われた場合に、割付対応表２６を用いて既存の変数には既存の割当てアドレスを割当てても、特に問題が生じることはない。
【０１７１】
図１６の処理について、以下、説明する。
尚、開発支援装置１０では、任意の更新版等のソースコード２１のコンパイル処理に伴って上記のようにアドレス移動指令情報２７を生成してＰＬＣ３０にダウンロードするが、コンパイル結果である機械語オブジェクト２３も一緒に、ＰＬＣ３０にダウンロードする。そして、上述したようにＰＬＣ３０側では、その運用を停止することなく、旧プログラムから新プログラム（上記ダウンロードしたもの）に切替える処理を行う。
【０１７２】
そして、この切替処理を実行した後の任意のときに、図１６の処理を実行する。従って、図１６の処理実行時には、上記図１０の「ユーザプログラム実行」周期内では上記新プログラム（新たな機械語オブジェクト４１）を実行していることになる。従って、上記一例の場合、インスタンス３は実行されないことになる（削除されているので）。そして、上記メモリ領域４３における各変数のメモリ割当状況は、未だ図４（ｂ）に示す状態となっている。この様な状況で、例えば以下に説明するような図１６の処理が、実行されることになる。
【０１７３】
また、図１６の処理は、例えばプログラム実行管理機能部３１が実行するが、この例に限らない。また、上記図１１〜図１５の処理は、例えばコンパイラ機能部１１が実行するが、この例に限らない。
【０１７４】
図１６の処理において、まず、図示のステップＳ６１、Ｓ６２の処理は、上記ステップＳ５２、Ｓ５３の処理と略同様の処理である。すなわち、まず、上記移動指令処理対象インデックスに初期値（＝１）に設定する（ステップＳ６１）。そして、ステップＳ６２の判定がＮＯとなるまで、ステップＳ６２〜Ｓ６７の処理を繰り返し実行する。すなわち、まず、アドレス移動指令情報２７において、現在の移動指令処理対象インデックスが示す位置にレコードが存在するか否かを判定する（ステップＳ６２）。換言すれば、アドレス移動指令情報２７に処理対象レコードがあるか否かを判定する。処理対象レコードが無い場合には（ステップＳ６２，ＮＯ）、本処理を終了する。
【０１７５】
一方、処理対象レコードがある場合（ステップＳ６２，ＹＥＳ）、アドレス移動指令情報２７において上記処理対象レコードの全データを取得する（ステップＳ６３）。全データとは、例えば上記移動元先頭アドレス７１、移動サイズ７２、移動先先頭アドレス７３、及び追加格納アドレス７４である。
【０１７６】
続いて、上記取得した移動サイズ７２に基づいて、今回の「システムの処理」内に移動処理を実行完了できるか否かを判定する（ステップＳ６４）。ここで、図１０で説明したように、ＰＬＣ３０が定周期で「ユーザプログラム実行」処理及び「システムの処理」を繰り返し実行している。そして、任意の「システムの処理」内で図１６の処理を実行するが、移動対象のブロックが複数ある場合、最初の移動対象ブロックは今回の「システムの処理」内で移動完了出来るが、当然、残りの時間で残りの移動対象ブロックも全て移動処理を実行完了できるとは限らない。
【０１７７】
これより、上記ステップＳ６４の判定処理を実行する。尚、ステップＳ６４の判定処理の具体例については、既に説明してある。尚、この判定処理は、上記処理対象レコード毎、換言すれば移動対象ブロック毎に、その移動処理を今回の「システムの処理」の残り時間で実行完了できるか否かを判定するものと言える。そして、実行完了できると判定された場合には、その移動対象ブロックの移動を行う。但し、この例に限らない。例えば、全ての移動対象ブロックの移動処理を、今回の「システムの処理」の残り時間で実行完了できるか否かを判定する方法等であっても構わない。
【０１７８】
そして、今回の「システムの処理」内で移動完了出来ないと判定した場合には（ステップＳ６６）、処理を中断して（ステップＳ６６）、今回の「システムの処理」内ではそれ以上は図１６の処理を実行しないようにする。
【０１７９】
尚、ステップＳ６６の処理の際に、処理中断を示す不図示のフラグをＯＮするようにしてもよい。更に、ステップＳ６３で取得したデータを所定の記憶領域に保持させるようにしてもよい。
【０１８０】
そして、今回の「システムの処理」の期間が終了し、「ユーザプログラム実行」期間を経て、次の「システムの処理」の期間になったら、上記中断状態を解除して、上記ステップＳ６４の処理から開始する。今度は上記“残り時間”ではないので、ステップＳ６４の判定はＹＥＳとなり、上記ステップＳ６３で取得した情報を用いて、データの移動等を行うことになる（ステップＳ６５）。
【０１８１】
例えば図７（ｂ）に示すように、移動対象ブロックが２つある場合、最初の移動対象ブロックに関してはステップＳ６４がＹＥＳとなりステップＳ６５で移動処理等を行ったが、２番目の移動対象ブロックに関してはステップＳ６４がＮＯとなった場合には、処理を中断する。そして、次の「システムの処理」内で、２番目の移動対象ブロックに関してステップＳ６５で移動処理等を行うことになる。尚、ステップＳ６５の処理を実行する毎に、移動指令処理対象インデックスを＋１インクリメントして（ステップＳ６７）ステップＳ６２に戻る。
【０１８２】
ここで、ステップＳ６５の処理について説明する。
ステップＳ６５の処理は、上記処理対象レコードに基づいて、移動元先頭アドレス７１から移動サイズ７２分の領域のデータを移動対象として、メモリ領域４３において当該移動対象データを、移動先先頭アドレス７３を先頭とする領域（移動先領域）へと移動させる。
【０１８３】
尚、この処理は、例えば、初期状態では移動元＝移動元先頭アドレス７１、移動先＝移動先先頭アドレス７３に設定して、移動元のデータを移動先にコピーする処理を行う毎に、移動元、移動先を各々＋１インクリメントする処理等としてもよい。つまり、１アドレス毎に順次データ移動させるようにしてもよい。勿論、上記インクリメントする回数は、“移動サイズ７２−１”回となる。
【０１８４】
ステップＳ６５では、上記データの移動処理だけでなく更に、このデータ移動に応じた修正処理も実行する必要がある。これは、移動対象ブロックが追加ブロックの場合には、これに対応する上記「追加変数格納先アドレス」の格納データを、修正する処理となる。以下、まず、この処理について説明する。
【０１８５】
まず一例として、上記ステップＳ６５で最初の移動対象ブロックの移動処理を実行したことで、例えば図８（ｂ）に示す状態になったものとする。つまり、インスタンス１に係わる追加ブロックのデータが、図８（ａ）に示す位置から図８（ｂ）に示す位置へと移動したものとする。これは、図６や図７等の例の場合、この追加ブロックの先頭アドレスが、‘１０２４’から‘１０１２’に変更されたことになる。
【０１８６】
しかしながら、当該追加ブロックへのリンク情報（対応する初期ブロックにおける上記「追加変数格納先アドレス」の格納データ；本例ではアドレス‘１００４’の格納データ）は、元の‘１０２４’のままであり、このままでは問題となる。つまり、図８（ａ）に示す移動前の状態では、図示のインスタンス１の初期ブロック内の「追加変数格納先アドレス」の領域（アドレス‘１００４’の領域）には、データ‘１０２４’が格納されている。これより、インスタンス１の追加ブロックにアクセスする際には、このデータ‘１０２４’を参照することで、その先頭アドレスが‘１０２４’であるブロックである図示の“インスタンス１の追加ブロック”にアクセスすることになる。
【０１８７】
しかしながら、このままでは、図８（ｂ）に示す状態となっても、上記‘１０２４’を用いて追加ブロックにアクセスすることになるので、間違った領域にアクセスすることになる。つまり、この例では、インスタンス１の初期ブロック内の「追加変数格納先アドレス」の領域の格納データを、‘１０２４’から‘１０１２’に変更する必要があることになる。
【０１８８】
例えばこの様な変更を実現する為に、上記追加格納アドレス７４を用いる。これによって、図７（ｂ）の先頭レコードの例の場合、インスタンス１の初期ブロック内の「追加変数格納先アドレス」の領域のアドレスが‘１００４’であることが分かるので、当該アドレス‘１００４’の格納データを、移動先先頭アドレス７３（＝１０１２）に変更する。尚、その前に、当該アドレス‘１００４’の格納データが、移動元先頭アドレス７１（＝１０２４）と同一であることを確認するようにしてもよい。
【０１８９】
尚、先願（特許文献１）に記載のように、追加ブロックへのアクセスに関しては、機械語オブジェクト４１には追加ブロックの先頭アドレスが記述されているわけではなく、上記「追加変数格納先アドレス」の領域の格納データを参照することで、追加ブロックの先頭アドレスを認識できるものである。従って、追加ブロックに関しては、機械語オブジェクト４１自体は修正しなくても、上記「追加変数格納先アドレス」の領域の格納データを修正することで対応可能となる。
【０１９０】
これに対して、移動させたブロックが初期ブロックの場合には、例えば、機械語オブジェクト４１の該当箇所を修正する必要がある。以下、機械語オブジェクト４１の該当箇所を修正する処理について説明する。
【０１９１】
例えば一例として先願（特許文献１）に記載の手法の場合、例えばその段落０１４２等に記載のことから、機械語オブジェクト４１において、初期ブロックの先頭アドレスは、“Ｔ＋先頭アドレス”の形で記述されている。上記のように図７（ｂ）に示す先頭レコードは追加ブロックに関するものであるが、ここでは仮にこれが初期ブロックに関するものであるとした場合、移動元先頭アドレス７１が‘１０２４’であることから、機械語オブジェクト４１の何処かに「Ｔ１０２４」の記述があるはずである。よって、機械語オブジェクト４１を検索して、「Ｔ１０２４」の記述箇所を見つけ出して、これを「Ｔ１０１２」に変更する処理を行う。尚、「Ｔ１０１２」とする理由は、移動先先頭アドレス７３が‘１０１２’であるからである。
【０１９２】
尚、初期ブロックに関するレコードにおいては、追加格納アドレス７４には何もデータは格納されていない（例えば、ＮＵＬＬである）。これより、追加格納アドレス７４を参照すれば、そのレコードが初期ブロックと追加ブロックのどちらに関するものであるのかを判別できる。よって、この判別結果に応じて、上記追加ブロックの場合の処理または上記初期ブロックの場合の処理の何れかの処理を実行すればよい。
【０１９３】
何れにしても、上記の通り相対位置を用いているので、各変数毎に割当アドレスを変更する必要は無く、上記移動したブロックの先頭アドレスに係わる記述／データ等を変更すればよい。
【０１９４】
任意の移動対象ブロックのデータを移動させる毎に、当該移動したブロックの先頭アドレスに係わる記述／データ等を変更するので、全ての移動対象ブロックを移動出来ずにステップＳ６６の中断が行われた場合でも、何も問題はない。例えば、図８（ｂ）に示す状態で中断が行われても、このときの各追加ブロックへのリンクは、図上矢印で示すように正しい位置を指しており、問題が生じることはない。
【０１９５】
最後に、開発支援装置１０側で上記ブロック移動に応じて割付対応表２６を修正する処理について説明する。これは、アドレス移動指令情報２７を用いて修正する。例えば、図７（ａ）に示す内容の割付対応表２６を、図７（ｂ）に示す内容のアドレス移動指令情報２７を用いて修正することで、図７（ｃ）に示す内容へと更新される。
【０１９６】
これは、例えば、まず、割付対応表２６において、状態６２が「削除」となっているレコードは全て削除する。続いて、アドレス移動指令情報２７の各レコードを順次、処理対象レコードとして、処理対象レコードの移動元先頭アドレス７１のデータを用いて、割付対応表２６においてこのデータと一致する箇所を探索して求める。探索対象は先頭アドレス６５及び追加ブロック先頭アドレス６８である。そして、上記データ一致箇所を変更箇所として、処理対象レコードの移動先先頭アドレス７３のデータを用いて書き換える。
【０１９７】
図７（ｂ）の例では、先頭レコードの移動元先頭アドレス７１のデータは‘１０２４’であるので、割付対応表２６において‘１０２４’を探索すると、先頭レコードの追加ブロック先頭アドレス６８に‘１０２４’がある。これより、当該先頭レコードの追加ブロック先頭アドレス６８を変更箇所として、上記先頭レコードの移動先先頭アドレス７３のデータ（＝１０２４）によって書き換える。
【０１９８】
同様にして、アドレス移動指令情報２７の２番目のレコードが処理対象のときには、割付対応表２６の２番目のレコードの追加ブロック先頭アドレス６８を、‘１０３２’から‘１０２０’に書き換えることになる。
【０１９９】
以上の処理によって、割付対応表２６は、図７（ａ）に示す状態から図７（ｃ）に示す状態へと更新されることになる。よって、後に更にプログラムの更新が行われる場合でも、そのコンパイルの際に既存の変数に関しては図７（ｃ）に示す状態の割付対応表２６を用いてメモリ割当てが行われるので、ＰＬＣ３０側の変数割当状況と合致したメモリ割当てとなるので、問題が生じることはない。
【０２００】
上述したように、本例のプログラマブルコントローラシステムは、プログラマブルコントローラ３０と、その開発支援装置１０とを有するシステムであって、まず前提として、例えば上記先願（特許文献１）と同様の特徴を有する。すなわち、開発支援装置１０は、プログラマブルコントローラ３０用の任意のプログラムのソースコード２１をコンパイルして機械語オブジェクト２３を生成する。その際に、該生成の際に該プログラムの各インスタンスに割り当てたメモリ領域である割当ブロックに関する情報であるインスタンス割当情報を生成・記憶する。そして、後に更新版プログラムをコンパイルする際には、このインスタンス割当情報を参照して変数のメモリ割当て等を行う。尚、インスタンス割当情報に相当する一例が、上記割付対応表２６である。
【０２０１】
そして、本例のプログラマブルコントローラシステムは、例えば図１７に示す各種機能部を有するものと見做すこともできる。
図１７は、本例のプログラマブルコントローラシステムの機能ブロック図である。
【０２０２】
図示の例の開発支援装置１０は、削除インスタンス判別部１０１、移動対象ブロック決定部１０２、移動指令情報生成部１０３、転送部１０４等の各種処理機能部を有する。
尚、開発支援装置１０は、不図示のＣＰＵ／ＭＰＵや上記記憶部２０等を有しており、記憶部２０には、予め不図示のアプリケーションプログラムが記憶されている。上記ＣＰＵ／ＭＰＵ等が、このアプリケーションプログラムを読み出し・実行することにより、上記各種機能部１０１，１０２、１０３、１０４等の各種機能部が実現される。
【０２０３】
削除インスタンス判別部１０１は、任意の上記プログラムの更新版のソースコードをコンパイルして更新版機械語オブジェクトを生成する際に、上記インスタンス割当情報に基づいて、該更新に伴って削除された既存のインスタンスを判別する。上記具体例では、例えば図１１等の処理を行うことで、図７（ａ）の割付対応表２６が得られることで、削除されたインスタンスが判別出来る。
【０２０４】
また、移動対象ブロック決定部１０２は、上記インスタンス割当情報に基づいて、上記既存のインスタンスの削除に対応して移動対象とする前記割当ブロックを１以上決定する。つまり、１以上の移動対象ブロックを決定する。
【０２０５】
更に、移動指令情報生成部１０３が、上記各移動対象ブロックの移動先を決定して、該移動対象ブロックの前記割当ブロックの情報と該移動先情報とを含む移動指令情報を生成する。この移動指令情報の一例が上記アドレス移動指令情報２７である。尚、アドレス移動指令情報２７は、図７（ｂ）に示す一例に限るわけではない。
【０２０６】
上記具体例では、図１３等の処理によって、１以上の移動対象ブロックが決定されて、その割当ブロックの情報が上記ステップＳ３７やＳ４３の処理によってアドレス移動指令情報２７に登録される。更に、図１５の処理によって、移動先が決定されると共に、ステップＳ５４やＳ５５の処理によって該移動先情報がアドレス移動指令情報２７に登録される。
【０２０７】
転送部１０４は、上記生成されたアドレス移動指令情報２７を、プログラマブルコントローラ３０に転送する。また、転送部１０４は、更に、上記生成された更新版機械語オブジェクトも、プログラマブルコントローラ３０に転送する。
【０２０８】
また、プログラマブルコントローラ３０は、データ移動部１１１、修正部１１２等を有する。ＰＬＣ３０も、不図示のＣＰＵ／ＭＰＵや上記記憶部４０等を有しており、記憶部４０には、予め不図示のアプリケーションプログラムが記憶されている。上記ＣＰＵ／ＭＰＵ等が、このアプリケーションプログラムを読み出し・実行することにより、上記各種機能部１１１，１１２等の各種機能部が実現される。
【０２０９】
データ移動部１１１は、例えば、上記アドレス移動指令情報２７等に基づいて、上記各移動対象ブロック毎に、そのブロック内の格納データを上記移動先へ移動する。
修正部１１２は、例えば、上記移動対象ブロックの格納データの移動に応じて、上記機械語オブジェクトの該当箇所の修正、あるいは該移動対象ブロックへのリンク情報の修正を行う。但し、リンク情報は、移動対象ブロックが上記追加ブロックの場合に存在する。すなわち、リンク情報の一例が、上記図８等に示す「追加変数格納先アドレス」の格納データである。また、上記機械語オブジェクトの該当箇所の修正は、例えば上述したように、「Ｔ＋（移動前の）先頭アドレス」の記述部分を該当箇所として、これを「Ｔ＋（移動後の）先頭アドレス」に修正するものであるが、この例に限らない。
【０２１０】
また、上述したように、削除インスタンス対応する割当ブロックは空き領域となるものであり、基本的には無駄な空き領域となるものである。これより、例えば、上記移動指令情報生成部１０３は、少なくとも移動対象ブロックの１つを、該空き領域を埋めるように移動させるように上記移動先を決定する。この処理の具体例が上記ステップＳ２３やＳ５４の処理等である。
【０２１１】
更に、この様に空き領域を埋めるように移動させることで、新たな空き領域が生じる場合がある。これより、例えば、上記移動指令情報生成部１０３は、該新たな空き領域を埋めるように他の移動対象ブロックを移動させるようにその移動先を決定する。この処理の具体例が上記ステップＳ５５の処理等である。つまり、任意の移動対象ブロックの移動先の直後に、他の移動対象ブロックを移動させるように、移動先を決定する。これによって新たな空き領域が生じないようにできる。
【０２１２】
また、プログラマブルコントローラ３０側では、上記転送された更新版機械語オブジェクトに切替えて運用中に、該更新版機械語オブジェクトを実行していない空き時間帯（一例が上記「システムの処理」中）において、上記データ移動部１１１と修正部１１２の処理を実行する。
【０２１３】
また、上記データ移動部１１１と修正部１１２は、例えば、任意の上記空き時間帯中に全ての移動対象ブロックの格納データの移動と該移動に伴う上記修正を実行完了出来ない場合には、中断して、次の空き時間帯において残りの移動対象ブロックの格納データの移動と該移動に伴う修正を行う。
【０２１４】
この様に、本例のプログラマブルコントローラシステムによれば、例えば先願（特許文献１）に記載のプログラマブルコントローラシステムにおいて、プログラム更新に伴って既存のインスタンスが削除された場合でも、これによって生じる空き領域を、他の既存のインスタンスの割当ブロックを移動させることで、無駄な空き領域を無くすことができる。この処理を、ＰＬＣ３０を停止することなく、実現させることができる。ＰＬＣ３０を停止しないで（ＰＬＣ３０を停止することは、システムを停止することになる）、ＰＬＣ３０のプログラムの更新と変数割当状況の改善を実現できるので、システムの稼動性、保守性、拡張性が向上する。
【０２１５】
また、移動対象ブロックに係わる変数データの移動は、ユーザのプログラムの動作に影響が無いように、ＰＬＣの「システムの処理」時間内で移動可能なメモリ量（インスタンス単位）に分けて実施することができる。
【符号の説明】
【０２１６】
１０  開発支援装置（ローダ）
１１  コンパイラ機能部
１２  インタフェース機能部
１３  通信機能部
１４  ディスプレイ
１５  入力装置
２０  記憶部
２１  ソースコード
２２  ソースコード識別番号対応表
２３  機械語オブジェクト
２４  変数情報管理表
２５  ＰＯＵインスタンスアドレス情報
２６  ＰＯＵインスタンスアドレス割付対応表
２７  アドレス移動指令情報
３０  ＰＬＣ
３１  プログラム実行管理機能部
３２  通信機能部
４０  記憶部
４１  機械語オブジェクト
４２  ＰＯＵインスタンスアドレス情報
４３  ＰＯＵインスタンスメモリ領域
５１  変数名
５２  型
５３  相対位置
６１  インスタンス番号
６２  状態
６３  インスタンス名
６４  ＰＯＵ名
６５  先頭アドレス
６６  インスタンスサイズ
６７  追加ブロック情報個数
６８  追加ブロック格納先アドレス
６９  追加ブロックサイズ
７１  移動元先頭アドレス
７２  移動サイズ
７３  移動先先頭アドレス
７４  追加格納アドレス
１０１  削除インスタンス判別部
１０２  移動対象ブロック決定部
１０３  移動指令情報生成部
１０４  転送部
１１１  データ移動部
１１２  修正部
【図１】
2015125713.tif 000003
【図２】
2015125713.tif 000004
【図３】
2015125713.tif 000005
【図４】
2015125713.tif 000006
【図５】
2015125713.tif 000007
【図６】
2015125713.tif 000008
【図７】
2015125713.tif 000009
【図８】
2015125713.tif 000010
【図９】
2015125713.tif 000011
【図１０】
2015125713.tif 000012
【図１１】
2015125713.tif 000013
【図１２】
2015125713.tif 000014
【図１３】
2015125713.tif 000015
【図１４】
2015125713.tif 000016
【図１５】
2015125713.tif 000017
【図１６】
2015125713.tif 000018
【図１７】
2015125713.tif 000019