"プログラムに基づいて制御対象を制御するプログラマブルコントローラと、前記プログラマブルコントローラで使用される前記プログラムを管理するプログラミングツールと、を備えるプログラマブルコントローラシステムにおいて、前記プログラミングツールは、前記プログラム中で使用される変数に割当てられている前記プログラマブルコントローラのデータ記憶手段内の使用領域が連続した領域となるように、前記プログラム中で使用される前記変数の前記データ記憶手段内での割当先を変更する割付変更情報を生成すると共に、前記変数の前記データ記憶手段内での割当先の変更に伴って生じる前記プログラムの実行コードの変更箇所を変更情報として取得し、前記プログラマブルコントローラに送信する変数割付管理手段を備え、前記プログラマブルコントローラは、前記プログラムの実行コードを記憶するプログラム記憶手段と、前記プログラムの実行コードを実行するプログラム実行手段と、前記プログラム実行手段による前記プログラムの実行コードの実行時に使用するデータを格納する前記データ記憶手段と、前記プログラミングツールからの前記変更情報に基づいて、前記プログラム記憶手段中の前記プログラムの実行コードを書換えると同時に、前記データ記憶手段中の割当先の変更前のアドレスに記憶されていたデータを前記割付変更情報に基づいて移動するメモリ整理実行手段と、を備えることを特徴とするプログラマブルコントローラシステム。前記プログラミングツールは、前記プログラム中で使用されている前記変数とそのサイズ、および前記プログラマブルコントローラの前記データ記憶手段内のアドレスとを対応付ける変数割付情報を格納する変数割付情報格納手段と、ユーザによって作成されたプログラムと前記変数割付情報から前記プログラマブルコントローラで実行可能な実行コードを生成するコンパイル手段と、前記変数割付管理手段によって生成される変更情報と割付変更情報とを前記プログラマブルコントローラに送信する通信手段と、をさらに備え、前記変数割付管理手段は、変更前の前記変数割付情報から前記プログラマブルコントローラの前記データ記憶手段内の前記変数に割付けられている領域のうち断片化されている領域を移動対象領域として抽出する移動対象領域抽出手段と、前記移動対象領域を他の変数に割付けられている領域と連続するように配置する前記データ記憶手段内の変更先アドレスを取得する変更先アドレス取得手段と、前記移動対象領域と前記変更先アドレスとを含む割付変更後の変数割付情報と、前記プログラムと、から前記コンパイル手段を通じて割付変更後のプログラムの実行コードを取得する変更後実行コード取得手段と、前記割付変更後のプログラムの実行コードの前記割付変更前のプログラムの実行コードからの変更箇所を前記変更情報として取得する変更情報取得手段と、前記移動対象領域と前記変更先アドレスとを用いて前記割付変更情報を生成する割付変更情報生成手段と、を有し、前記プログラマブルコントローラの前記メモリ整理実行手段は、前記プログラミングツールからの前記変更情報を用いて前記プログラム記憶手段中の実行コードの書換え処理を行うと同時に、前記プログラミングツールからの前記割付変更情報にしたがって前記データ記憶手段中の前記移動対象領域中のデータを前記変更先アドレスで指定される領域に移動させる処理を行うことを特徴とする請求項1に記載のプログラマブルコントローラシステム。前記移動対象領域抽出手段は、前記変数割付情報を用いて、前記プログラマブルコントローラの前記データ記憶手段中の先頭アドレスから末尾アドレスに向かって前記プログラム中で変数に割り当てられていない未使用領域を検索し、最初に発見した未使用領域の直後にある領域の先頭アドレスからつぎの未使用領域の先頭アドレスまでの領域を移動対象領域として抽出することを特徴とする請求項2に記載のプログラマブルコントローラシステム。前記移動対象領域抽出手段は、前記最初に発見した未使用領域の直後にある領域の先頭アドレスから前記つぎの未使用領域の先頭アドレスまでの領域が所定のサイズよりも大きい場合には、前記所定の大きさ以下のサイズの複数の領域に分割し、分割した領域の1つを前記移動対象領域とし、前記プログラミングツールと前記プログラマブルコントローラは、分割したそれぞれの領域について、前記プログラマブルコントローラの前記データメモリ記憶手段中のデータの移動処理を行うことを特徴とする請求項3に記載のプログラマブルコントローラシステム。前記変更先アドレス取得手段は、前記変数割付情報を用いて、前記プログラマブルコントローラの前記データ記憶手段中の先頭アドレスから末尾アドレスに向かって前記未使用領域を検索し、最初に発見した未使用領域を前記変更先アドレスとして取得することを特徴とする請求項2~4のいずれか1つに記載のプログラマブルコントローラシステム。前記メモリ整理実行手段は、前記プログラム実行手段が前記プログラムを実行中に前記プログラムの実行コードの書換えと、前記データ記憶手段中のデータの移動を行うことを特徴とする請求項1~5のいずれか1つに記載のプログラマブルコントローラシステム。プログラムの実行コードを記憶するプログラム記憶手段と、プログラムの実行コードを実行するプログラム実行手段と、プログラム実行手段によるプログラムの実行コードの実行時に使用するデータを格納するデータ記憶手段と、を備え、前記プログラムに基づいて制御対象を制御するプログラマブルコントローラと、前記プログラマブルコントローラで使用される前記プログラムを管理するプログラミングツールと、が通信回線を介して接続されたプログラマブルコントローラシステムでの前記プログラムで使用される変数が割付けられた前記データ記憶手段内の領域を整理するメモリ整理方法において、前記プログラミングツールは、前記プログラム中で使用されている変数とそのサイズ、および前記プログラマブルコントローラの前記データ記憶手段内のアドレスとを対応付ける変数割付情報から前記プログラマブルコントローラの前記データ記憶手段内の前記変数に割付けられている領域のうち断片化されている領域を移動対象領域として抽出する工程と、前記プログラミングツールは、前記移動対象領域を他の変数に割付けられている領域と連続するように配置する前記データ記憶手段内の変更先アドレスを取得する工程と、前記プログラミングツールは、前記移動対象領域と前記変更先アドレスとを含む割付変更後の変数割付情報と、前記プログラムと、から割付変更後のプログラムの実行コードを取得する工程と、前記プログラミングツールは、前記割付変更後のプログラムの実行コードの割付変更前のプログラムの実行コードからの変更箇所を変更情報として取得する工程と、前記プログラミングツールは、前記移動対象領域と前記変更先アドレスとを含む割付変更情報を生成する工程と、前記プログラミングツールは、前記変更情報と前記割付変更情報を前記プログラマブルコントローラに送信する工程と、前記プログラマブルコントローラは、前記変更情報と前記割付変更情報を受信する工程と、前記プログラマブルコントローラは、前記変更情報に基づいて前記プログラム記憶手段中の前記プログラムの実行コードを書換えると同時に、前記割付変更情報にしたがって前記データ記憶手段中の前記移動対象領域中のデータを前記変更先アドレスで指定される領域に移動させる工程と、を含むことを特徴とするメモリ整理方法。しかしながら、RUN中書込による変数の追加/変更/削除が頻繁に行われる場合、データメモリ領域内で変数が割付けられていない未使用の領域が点在し、断片化された状態となる。また、配列変数や構造体変数などの複数の変数をまとめて扱う場合、複数の変数分の連続領域が必要となるため、データメモリ内での未使用の領域も多くなり、データメモリの使用効率の低下が顕著となる。データメモリ内で未使用の領域が点在する状態で、配列変数や構造体変数を追加する場合、空き容量全体では容量として十分に追加可能であっても、連続領域を確保できず、変数を追加できないという問題点があった。この発明は、上記に鑑みてなされたもので、配列変数や構造体変数などの高度なデータ構造を扱うプログラマブルコントローラとプログラミングツールとが接続されたプログラマブルコントローラシステムにおいて、変数を追加する際に、断片化されたメモリ領域を整理し、連続領域を確保できるプログラマブルコントローラシステムおよびメモリ整理方法を得ることを目的とする。上記目的を達成するため、この発明にかかるプログラマブルコントローラシステムは、プログラムに基づいて制御対象を制御するプログラマブルコントローラと、前記プログラマブルコントローラで使用される前記プログラムを管理するプログラミングツールと、を備えるプログラマブルコントローラシステムにおいて、前記プログラミングツールは、前記プログラム中で使用される変数に割当てられている前記プログラマブルコントローラのデータ記憶手段内の使用領域が連続した領域となるように、前記プログラム中で使用される前記変数の前記データ記憶手段内での割当先を変更する割付変更情報を生成すると共に、前記変数の前記データ記憶手段内での割当先の変更に伴って生じる前記プログラムの実行コードの変更箇所を変更情報として取得し、前記プログラマブルコントローラに送信する変数割付管理手段を備え、前記プログラマブルコントローラは、前記プログラムの実行コードを記憶するプログラム記憶手段と、前記プログラムの実行コードを実行するプログラム実行手段と、前記プログラム実行手段による前記プログラムの実行コードの実行時に使用するデータを格納する前記データ記憶手段と、前記プログラミングツールからの前記変更情報に基づいて、前記プログラム記憶手段中の前記プログラムの実行コードを書換えると同時に、前記データ記憶手段中の割当先の変更前のアドレスに記憶されていたデータを前記割付変更情報に基づいて移動するメモリ整理実行手段と、を備えることを特徴とする。この発明によれば、変数プログラミングにおいて配列変数や構造体変数などの高度なデータ構造を使用しているユーザプログラムに対してRUN中書込みを繰り返し実行しても、効率よくデータメモリ領域を使用することが可能となる効果を有する。以下に添付図面を参照して、この発明の実施の形態にかかるプログラマブルコントローラシステムおよびメモリ整理方法を詳細に説明する。なお、この実施の形態によりこの発明が限定されるものではない。図1は、この実施の形態によるプログラマブルコントローラシステムの機能構成の一例を模式的に示すブロック図である。プログラマブルコントローラシステムは、ユーザプログラムシーケンスプログラムにしたがって制御対象を制御することによって所定の処理を実行させて、製品の加工や製造を行うものである。この例では、プログラマブルコントローラシステムは、CPUユニット20で実行されるユーザプログラムのコンパイル処理を行うプログラミングツール10と、制御対象の制御処理を行う制御データを演算するCPUユニット20と、を備える。プログラミングツール10は、ユーザがユーザプログラムを編集するためのI/Fを提供するプログラムエディタ部11と、ユーザプログラムで使用される変数とCPUユニット20のデータメモリ24でのメモリアドレスとの間の対応関係を示す変数割付情報を格納する変数割付情報格納部12と、プログラムエディタ部11で編集されたユーザプログラムと変数割付情報格納部12中の変数割付情報とに基づいてCPUユニット20で実行可能な実行コードを生成するコンパイラ13と、変数割付情報を管理する変数割付管理部14と、CPUユニット20との間で通信を行う通信部15と、を備える。プログラムエディタ部11で編集されるユーザプログラム中では、メモリアドレスを変数を用いて記述しており、コンパイラ13での実行コード生成時に変数がCPUユニット20のデータメモリ24のメモリアドレスへと変換される。変数割付情報格納部12は、現在CPUユニット20で使用中の変数割付情報である変更前変数割付情報と、メモリ整理処理時に変数割付管理部14で生成される変更後変数割付情報と、を記憶することができるものとする。変数割付情報は、データメモリ24中の格納場所の先頭アドレスと、ユーザプログラムで使用される変数と、を対応付けている。図2は、変数割付情報の一例を示す図である。変数割付情報は、データメモリ24内の先頭アドレスと、先頭アドレスに対して割付けられた変数の名称変数名と、変数のサイズと、を対応付けて管理している。この図2では、データメモリ24の先頭アドレス0x1000にサイズ2の変数1が割当てられ、先頭アドレス0x1006にサイズ4の変数2が割当てられ、先頭アドレス0x100Cにサイズ4の変数3が割当てられ、先頭アドレス0x1010にサイズ2の変数4が割当てられ、先頭アドレス0x1014にサイズ6の変数5が割当てられており、変数1と変数2の間、変数2と変数3の間、および変数4と変数5の間が未使用領域となっている場合が示されている。変数割付管理部14は、CPUユニット20で動作しているユーザプログラムの変数割付情報から、CPUユニット20のデータメモリ24内に未使用領域が複数箇所に点在する場合に、変数が割付けられていない未使用領域が連続するように変数の割付を変更する。このような機能を達成するために、この実施の形態では変数割付管理部14は、変数割付情報管理部141と、移動対象領域抽出部142と、変更先アドレス取得部143と、変更後実行コード取得部144と、変更情報取得部145と、割付変更情報生成部146と、を有する。変数割付情報管理部141は、メモリ整理処理の実行時に、CPUユニット20で使用されている変数割付情報を変数割付情報格納部26から取得し、変数割付情報格納部12に変更前変数割付情報として格納する。また、CPUユニット20にメモリ整理後の変更後変数割付情報が登録されると、変更後変数割付情報を変更前変数割付情報として変数割付情報格納部12に格納する機能も有する。移動対象領域抽出部142は、変数割付情報格納部12の変更前変数割付情報を用いて、断片化されている使用領域を移動対象領域として抽出する。たとえば、変更前変数割付情報を用いてCPUユニット20のデータメモリ24の先頭アドレスから末尾アドレスに向かって未使用領域を検索し、発見した未使用領域の直後にある領域の先頭アドレスからつぎの未使用領域の先頭アドレスまでの領域を移動対象領域として抽出する。変更先アドレス取得部143は、変数が割り付けられていない空き状態アドレスを、変数割付情報格納部12の変更前変数割付情報からCPUユニット20のデータメモリ24の先頭アドレスから末尾アドレスに向かって検索し、最初にヒットしたアドレスを上記移動対象領域の変更先アドレスとして取得する。変更後実行コード取得部144は、コンパイラ13を通じて移動対象領域に割付けられている変数の割付を変更先アドレスに変更したユーザプログラムの実行コード以下、割付変更後のプログラムというを生成する。変更情報取得部145は、割付変更後のプログラムが割付変更前のユーザプログラムの実行コード以下、割付変更前のプログラムというから変化した分を変更情報として抽出する。割付変更前のプログラムは、変数割付情報格納部12の変更前変数割付情報を用いてコンパイラ13を通じて求めてもよいし、ターゲットとなるCPUユニット20から取得してもよい。割付変更情報生成部146は、移動対象領域抽出部142で抽出された移動対象領域の先頭アドレスおよびサイズと、変更先アドレス取得部143で取得された変更先先頭アドレスと、から割付変更情報を生成する。なお、変更情報と割付変更情報は、通信部15を介してCPUユニット20へと送信される。CPUユニット20は、プログラミングツール10との間で通信を行う通信部21と、ユーザプログラムを格納するプログラムメモリ22と、プログラムメモリ22中のユーザプログラムを実行するユーザプログラム実行部23と、ユーザプログラム実行部23によるユーザプログラムの実行中に使用されるデータを格納するデータメモリ24と、断片化されたデータメモリ24を整理するメモリ整理実行部25と、CPUユニット20に書き込まれたユーザプログラムの変数割付情報を保存する変数割付情報格納部26と、プログラミングツール10からの割付変更情報を格納する割付変更情報格納部27と、を備える。ここで、メモリ整理実行部25は、プログラミングツール10から受け取った変更情報または割付変更後のプログラムをプログラムメモリ22内に格納し、RUN中書込機能を用いてプログラムメモリ22中のユーザプログラムを修正すると同時に、プログラミングツール10から受け取った割付変更情報に基づいてデータメモリ24内のデータを移動させる。データメモリ24内のデータの移動は、割付変更情報中の移動対象領域の先頭アドレスとサイズとで特定される移動対象領域中のデータを、割付変更情報中の変更先先頭アドレスで特定される領域へと移動させることによって行われる。つぎに、このようなプログラマブルコントローラシステムでのメモリ整理処理について説明する。図3-1~図3-3は、実施の形態によるメモリ整理処理の一例を示すフローチャートである。まず、プログラミングツール10にユーザからターゲットとなるCPUユニット20のデータメモリ整理操作の実行コマンドが入力されると、プログラミングツール10の通信部15からCPUユニット20の通信部21に対してデータメモリ整理実行コマンドが発行されるステップS11。CPUユニット20の通信部21は、データメモリ整理コマンドを受け付けるとステップS12、メモリ整理実行部25にデータメモリ整理コマンドの実行を依頼するステップS13。また、メモリ整理実行部25は、データメモリ整理コマンドを受け付けた時点で、データメモリ整理が実行中であるか否かを判定するステップS14。データメモリ整理が実行中でなければステップS14でNoの場合、データメモリ整理処理の実行の有無を示すデータメモリ実行状態を実行中としステップS15、通信部21を通じてプログラミングツール10にデータメモリ実行可能通知を送信するステップS16。なお、既にデータメモリ整理が実行中であればステップS14でYesの場合、実行中であることを示すデータメモリ実行中通知を、通信部21を通じてプログラミングツール10に送信するステップS17。CPUユニット20からデータメモリ実行可能通知/データメモリ実行中通知を受け取るとステップS18、プログラミングツール10の変数割付管理部14の変数割付情報管理部141は、変数割付情報格納部12にCPUユニット20で使用される変数割付情報変更前変数割付情報を保持しているかを確認するステップS19。変更前変数割付情報を保持していない場合ステップS19でNoの場合には、変数割付情報管理部141は、通信部15を通じてCPUユニット20に対して変数割付情報取得要求を送信するステップS20。CPUユニット20のメモリ整理実行部25は、変数割付情報取得要求を受け取るとステップS21、変数割付情報格納部26から現在動作中のユーザプログラムの変数割付情報を取り出し、通信部21を通じてプログラミングツール10に送信するステップS22。プログラミングツール10の変数割付情報管理部141は、CPUユニット20で動作しているユーザプログラムの変数割付情報を受信するとステップS23、変更前変数割付情報として変数割付情報格納部12に格納する。なお、CPUユニット20で動作しているユーザプログラムの変数割付情報変更前変数割付情報が、プログラミングツール10の変数割付情報格納部12に既に存在する場合ステップS19でYesの場合には、CPUユニット20から改めて取得する必要はない。ステップS23の後またはステップS19でYesの場合に、CPUユニット20の変数割付管理部14の移動対象領域抽出部142は、変更前変数割付情報内でCPUユニット20のデータメモリ24内の未使用領域を検索し、未使用領域が複数箇所に点在するか2つ以上存在するかを判定するステップS24。データメモリ24内に未使用領域が複数箇所に点在する場合ステップS24でYesの場合には、移動対象領域抽出部142は、変更前変数割付情報からCPUユニット20のデータメモリ24の先頭アドレスから末尾アドレスに向かって未使用領域を検索し、移動対象領域を抽出する。たとえば、最初に発見した未使用領域の直後にある領域の先頭アドレスから、次の未使用領域の先頭アドレスまでの領域を移動対象領域とする。ついで、変数割付管理部14の変更先アドレス取得部143は、抽出した移動対象領域の変更先先頭アドレスを決定するステップS26。ここでは、データメモリ24の先頭アドレスから末尾アドレスに向かって未使用領域を検索した場合の最初に発見した未使用領域の先頭アドレスを変更先先頭アドレスとする。変数割付情報管理部141は、移動対象領域抽出部142で抽出された移動対象領域に対して付されている変数とサイズを割付変更前の変数割付情報から取得し、取得した変数とサイズを、変更先アドレス取得部143で取得した変更先先頭アドレスに新たに対応付けた割付変更後の変数割付情報を生成するステップS27。その後、変数割付管理部14の変更後実行コード取得部144は、コンパイラ13を通じて割付変更後の変数割付情報に基づいて、移動対象領域に割付けられている変数を変更先先頭アドレスに変更したユーザプログラムの実行コード割付変更後のプログラムを生成するステップS28。ついで、変数割付管理部14の変更情報取得部145は、割付変更後のプログラムの割付変更前のプログラムから変化した部分である変更情報を抽出するステップS29。割付変更前のプログラムは、たとえばターゲットとするCPUユニット20から取得してもよいし、割付変更前の変数割付情報からコンパイラ13を通してプログラムを生成してもよい。さらに、変数割付管理部14は、移動対象領域の先頭アドレスとサイズ、および変更先先頭アドレスを含む割付変更情報を生成しステップS30、割付変更後のプログラムと共にCPUユニット20に送信するステップS31。CPUユニット20のメモリ整理実行部25は、プログラミングツール10から割付変更後のプログラムと割付変更情報とを受信するとステップS32、割付変更後のプログラムをプログラムメモリ22内に格納した後ステップS33、RUN中書込み機能を使ってプログラムメモリ22内のユーザプログラムを修正すると同時に、プログラミングツール10から受け取った割付変更情報に基づいてデータメモリ24内のデータを移動させるステップS34。データメモリ24内のデータの移動は、たとえば、割付変更情報中の移動対象領域の先頭アドレスとサイズで特定される範囲に存在するデータを取得して、変更先先頭アドレスで特定される範囲にデータを移動させることによって行われる。その後、CPUユニット20のメモリ整理実行部25は、ユーザプログラムの修正とデータの移動が完了すると、通信部21を通じてプログラミングツール10に対して割付変更完了通知を送信するステップS35。プログラミングツール10の変数割付管理部14の変数割付情報管理部141は、通信部15を通じてCPUユニット20から割付変更完了通知を受信するとステップS36、変数割付情報を、変更後の変数割付情報に更新するステップS37。具体的には、変数割付情報格納部12中の変更後の変数割付情報を変更前の変数割付情報に更新する。また、CPUユニット20の変数割付情報格納部26に格納されている変数割付情報も更新するステップS38。また、移動対象領域抽出部142は、変更後の変数割付情報を分析し、データメモリ24内が、使用領域と未使用領域が共に1つのみになっているかを判定するステップS39。使用領域または未使用領域が1つでない場合ステップS39でNoの場合には、ステップS25の移動対象領域の検索へと戻り、上記した処理が繰り返し実行される。また、使用領域と未使用領域が共に1つであればステップS39でYesの場合、メモリ整理完了とし、CPUユニット20に対して通信部15を通じてメモリ整理完了通知を送信するステップS40。CPUユニット20のメモリ整理実行部25は、通信部21を通じてメモリ整理完了通知を受信するとステップS41、データメモリ実行状態を未実行としステップS42、通信部21を通じてプログラミングツール10に正常終了通知を送信するステップS43。プログラミングツール10は通信部15を通じて正常終了通知を受信するとステップS44、ユーザにメモリ整理完了を通知するステップS45。以上で、メモリ整理処理が終了する。つぎに、具体例として、図2に示される変数割付情報で変数が割付けられたデータメモリ24についてメモリ整理処理を行う場合を説明する。図4は、CPUユニットのデータメモリの整理状態を模式的に示す図である。図4で、上段の図は変数割付情報であり、中断の図はCPUユニット20内のデータメモリ24内のアドレスの使用状況を模式的に示す図であり、下段の図はプログラムメモリ22内のプログラムの状態を模式的に示す図である。図4aは、メモリ整理処理を行う前の状態であり、RUN中書込処理によって断片化されてしまった状態を示している。つまり、先頭アドレス0x1000にはサイズが2バイトの変数1が割付けられ、先頭アドレス0x1006にはサイズが4バイトの変数2が割付けられ、先頭アドレス0x100Cにはサイズが4バイトの変数3が割付けられ、先頭アドレス0x1010にはサイズが2バイトの変数4が割付けられ、先頭アドレス0x1014にはサイズが6バイトの変数5が割付けられている。また、変数1と変数2の間、変数2と変数3の間、および変数4と変数5の間は未使用領域となっている。さらに、プログラムメモリ22内のプログラムAでは、変数2アドレス0x1006と変数4アドレス0x1010が使用されており、プログラムBでは、変数2アドレス0x1006と変数5アドレス0x1014が使用されている。このような状態のデータメモリ24に対して上述したメモリ整理処理が実行されると、まず、データメモリ24の先頭アドレス0x1000から末尾アドレス0x1019に向かって最初の未使用領域の後の変数が割付けられた領域が検索される。ここでは、先頭アドレスが0x1006であり、サイズが4バイトの変数2が移動対象領域として抽出される。また、変更先アドレスとして、データメモリ24の先頭アドレスから末尾アドレスに向かって最初の未使用領域が検索される。ここでは、先頭アドレスが0x1002であり、サイズが4バイトの未使用領域が抽出され、変更先先頭アドレスとして0x1002が取得される。以上より、変更前変数割付情報では、変数2はアドレス0x1006から4バイトと割付けられていたが、変更後変数割付情報では、変数2はアドレス0x1002から4バイトと割付けられることになる。また、この変更後変数割付情報を用いて割付変更後のプログラムが生成され、割付変更前のプログラムから変化した部分である変更情報が取得される。さらに、移動対象領域のアドレス0x1006とサイズ4バイト、および変更先先頭アドレス0x1002を含む割付変更情報が生成される。つぎに、図4bに示されるように、プログラムメモリ22中のユーザプログラムの書換え処理が行われる。この書換え処理は、RUN中書込み機能を用いて行われ、取得された変更情報に対応する部分のみ行われる。ここでは、プログラムA,Bの変数2を含む部分が変更される。また、これと同時にデータメモリ24中で変数2の移動処理が行われる。この移動処理は、割付変更情報に基づいて行われる。そして、変更後変数割付情報が、変更前変数割付情報とされる。この処理によって、未使用領域と使用領域とが共に1つとなったかを確認するが、いずれも1つではないので、さらにメモリ整理処理が行われる。図4aの場合と同様にして、移動対象領域として先頭アドレスが0x100Cであり、サイズが6バイトの変数3,4が抽出され、変更先アドレスとして0x1006が取得される。これによって、変更前変数割付情報では、変数3はアドレス0x100Cから4バイトと割付けられており、変数4はアドレス0x1010から2バイトと割付けられていたが、変更後変数割付情報では、変数3はアドレス0x1006から4バイト割付けられ、変数4はアドレス0x100Aから2バイト割付けられることになる。また、この変更後変数割付情報を用いて割付変更後のプログラムが生成され、割付変更前のプログラムから変化した部分である変更情報が取得される。さらに、移動対象領域のアドレス0x100Cとサイズ6バイト、および変更先先頭アドレス0x1006を含む割付変更情報が生成される。つぎに、図4cに示されるように、プログラムメモリ22中のユーザプログラムの書換え処理が行われる。この書換え処理は、RUN中書込み機能を用いて行われ、取得された変更情報に対応する部分のみ行われる。ここでは、プログラムAの変数4を含む部分が変更される。また、これと同時にデータメモリ24中で変数3,4の移動処理が行われる。この移動処理は、割付変更情報に基づいて行われる。そして、変更後変数割付情報が、変更前変数割付情報とされる。この処理によって、未使用領域と使用領域とが共に1つとなったかを確認するが、いずれも1つではないので、さらにメモリ整理処理が行われる。図4aの場合と同様にして、移動対象領域として先頭アドレスが0x1014であり、サイズが6バイトの変数5が抽出され、変更先アドレスとして0x100Cが取得される。これによって、変更前変数割付情報では、変数5はアドレス0x1014から6バイトと割付けられていたが、変更後変数割付情報では、変数5はアドレス0x100Cから6バイト割付けられる。また、この変更後変数割付情報を用いて割付変更後のプログラムが生成され、割付変更前のプログラムから変化した部分である変更情報を取得する。さらに、移動対象領域のアドレス0x1014とサイズ6バイト、および変更先先頭アドレス0x100Cを含む割付変更情報が生成される。つぎに、図4dに示されるように、プログラムメモリ22中のユーザプログラムの書換え処理が行われる。この書換え処理は、RUN中書込み機能を用いて行われ、取得された変更情報に対応する部分のみ行われる。また、これと同時にデータメモリ24中で変数5の移動処理が行われる。ここでは、プログラムBの変数5を含む部分が変更される。この移動処理は、割付変更情報に基づいて行われる。そして、変更後変数割付情報が、変更前変数割付情報とされる。この処理によって、未使用領域と使用領域とが共に1つとなったかを確認する。以上の処理によって、アドレス0x1000~0x1010に連続して変数1~5が割当てられ、アドレス0x1012~0x1018は未使用領域となっており、使用領域と未使用領域がいずれも1つとなったので、メモリ整理処理が終了する。なお、移動対象領域が大きい場合には、データを移動させる際に時間がかかり、スキャンタイムが延びてしまうこともある。そのような場合には、ある程度のサイズで移動対象領域を分割し、複数回に分けて領域を移動させることで、スキャンタイムの延びを抑えることができる。このとき、予め実験によってスキャンタイムが延びない様に求められた最大のデータサイズ以下のサイズで移動対象領域を分割することができる。図5は、移動対象領域を所定のサイズに分割して変更先アドレスへと移動させる場合の例を模式的に示す図である。この図で、上段の図は変数割付情報であり、下断の図はCPUユニット20内のデータメモリ24内のアドレスの使用状況を模式的に示す図である。なお、ここでは、移動対象領域を8Kバイトずつに分割して、2回に分けて移動させる場合を示す。まず、図5aの変数割付情報に示されるように、メモリ整理処理を行う前は、先頭アドレス0x1002にはサイズが16Kバイトの変数10~13が割付けられている。また、変数10の前、および変数13の後は未使用領域となっている。このような状態のデータメモリ24に対して上述したメモリ整理処理が実行されると、まず、データメモリ24の先頭アドレス0x1000から末尾アドレス0x5002に向かって最初の未使用領域の後の変数が割付けられた領域が検索される。ここでは、先頭アドレスが0x1002であり、サイズが16Kバイトの変数10~13が移動対象領域として抽出される。しかし、この移動対象領域のサイズは所定のサイズ=8Kバイトを超えているので、先頭アドレス0x1002から8Kバイトが移動対象領域として選択される。また、変更先アドレスとして、データメモリ24の先頭アドレスから末尾アドレスに向かって最初の未使用領域が検索される。ここでは、先頭アドレスが0x1000であり、サイズが2Kバイトの未使用領域が抽出され、変更先先頭アドレスとして0x1000が取得される。以上より、変更前変数割付情報では、変数10~11はアドレス0x1002から8Kバイトと割付けられていたが、変更後変数割付情報では、変数10~11はアドレス0x1000から8Kバイトと割付けられる。また、この変更後変数割付情報を用いて割付変更後のプログラムが生成され、割付変更前のプログラムから変化した部分である変更情報が取得される。さらに、移動対象領域のアドレス0x1002とサイズ8Kバイト、および変更先先頭アドレス0x1000を含む割付変更情報が生成される。つぎに、プログラムメモリ22中のユーザプログラムの書換え処理が行われる。この書換え処理は、RUN中書込み機能を用いて行われ、取得された変更情報に対応する部分のみ行われる。またこれと同時に、図5bに示されるようにデータメモリ24中で変数10~11の移動処理が行われる。この移動処理は、割付変更情報に基づいて行われる。そして、変更後変数割付情報が、変更前変数割付情報とされる。この処理によって、未使用領域と使用領域とが共に1つとなったかを確認するが、いずれも1つではないので、さらにメモリ整理処理が行われる。図5aの場合と同様にして、移動対象領域として先頭アドレスが0x3002であり、サイズが8Kバイトの変数12~13が抽出され、変更先アドレスとして0x3000が取得される。これによって、変更前変数割付情報では、変数12~13はアドレス0x3002から8Kバイトと割付けられていたが、変更後変数割付情報では、変数12~13はアドレス0x3000から8Kバイト割付けられる。また、この変更後変数割付情報を用いて割付変更後のプログラムが生成され、割付変更前のプログラムから変化した部分である変更情報が取得される。さらに、移動対象領域のアドレス0x3002とサイズ8Kバイト、および変更先先頭アドレス0x3000を含む割付変更情報が生成される。つぎに、プログラムメモリ22中のユーザプログラムの書換え処理が行われる。この書換え処理は、RUN中書込み機能を用いて行われ、取得された変更情報に対応する部分のみ行われる。またこれと同時に、図5cに示されるようにデータメモリ24中で変数12~13の移動処理が行われる。この移動処理は、割付変更情報に基づいて行われる。そして、変更後変数割付情報が、変更前変数割付情報とされる。以上の処理によって、所定の長さ以上のデータが所定の長さに分割されて、スキャンタイムの延びを抑えながら移動される。この処理によって、未使用領域と使用領域とが共に1つとなったかを確認する。これによって、アドレス0x1000~0x5000に連続して変数10~13が割当てられ、アドレス0x5000~0x5002は未使用領域となっており、使用領域と未使用領域がいずれも1つとなったので、メモリ整理処理が終了する。なお、上記した説明では、データメモリ24の先頭アドレスから末尾アドレスに向かって未使用領域を検索し、最初の未使用領域の直後に存在する変数を移動対象領域として抽出する場合を示したが、これに限定されるものではなく、未使用領域を挟んで飛び飛びの状態で存在する任意の変数を抽出することができる。この実施の形態によれば、データメモリ24中の変数が割付けられた移動対象領域と、データメモリ24の先頭アドレスに最も近い未使用領域を変更先アドレスとを抽出し、未使用領域が連続するように変数の割付を変更するようにしたので、RUN中書込みによる変数の追加削除の繰り返しによって未使用領域が点在するデータメモリ24内を整理し、連続する未使用領域を確保することができるという効果を有する。また、移動対象領域が大きい場合は、移動対象領域を複数に分割して、複数回に分けて移動させることで、データの移動によるスキャンタイム延びを抑えることができるという効果も有する。"