(57)【特許請求の範囲】
【請求項１】
プログラムに基づいて制御対象を制御するプログラマブルコントローラと、前記プログラマブルコントローラで使用される前記プログラムを管理するプログラミングツールと、を備えるプログラマブルコントローラシステムにおいて、
前記プログラミングツールは、
前記プログラム中で使用されている変数とサイズ、および前記プログラマブルコントローラのデータ記憶手段内のアドレスとを対応付ける変数割付情報を格納する変数割付情報格納手段と、
ユーザによって作成されたプログラムと前記変数割付情報から前記プログラマブルコントローラで実行可能な実行コードを生成するコンパイル手段と、
変更前の前記変数割付情報から前記プログラマブルコントローラの前記データ記憶手段内の前記変数に割付けられている領域のうち断片化されている領域を移動対象領域として抽出する移動対象領域抽出部、前記移動対象領域を他の変数に割付けられている領域と連続するように配置する前記データ記憶手段内の変更先アドレスを取得する変更先アドレス取得部、前記移動対象領域と前記変更先アドレスとを含む割付変更後の変数割付情報と、前記プログラムと、から前記コンパイル手段を通じて割付変更後のプログラムの実行コードを取得する変更後実行コード取得部、前記割付変更後のプログラムの実行コードの前記割付変更前のプログラムの実行コードからの変更箇所を変更情報として取得する変更情報取得部、および前記移動対象領域と前記変更先アドレスとを用いて前記変数の前記データ記憶手段内での割当先の変更に伴って生じる前記プログラムの実行コードの変更箇所を割付変更情報として生成する割付変更情報生成部を有する変数割付管理手段と、
前記変数割付管理手段によって生成される変更情報と割付変更情報とを前記プログラマブルコントローラに送信する通信手段と、
を備え、
前記プログラマブルコントローラは、
前記プログラムの実行コードを記憶するプログラム記憶手段と、
前記プログラムの実行コードを実行するプログラム実行手段と、
前記プログラム実行手段による前記プログラムの実行コードの実行時に使用するデータを格納する前記データ記憶手段と、
前記プログラミングツールからの前記変更情報を用いて前記プログラム記憶手段中の実行コードの書換え処理を行うと同時に、前記プログラミングツールからの前記割付変更情報にしたがって前記データ記憶手段中の前記移動対象領域中のデータを前記変更先アドレスで指定される領域に移動させる処理を行うメモリ整理実行手段と、
を備えることを特徴とするプログラマブルコントローラシステム。
【請求項２】
前記移動対象領域抽出部は、前記変数割付情報を用いて、前記プログラマブルコントローラの前記データ記憶手段中の先頭アドレスから末尾アドレスに向かって前記プログラム中で変数に割り当てられていない未使用領域を検索し、最初に発見した未使用領域の直後にある領域の先頭アドレスからつぎの未使用領域の先頭アドレスまでの領域を前記移動対象領域として抽出することを特徴とする請求項１に記載のプログラマブルコントローラシステム。
【請求項３】
前記移動対象領域抽出部は、前記最初に発見した未使用領域の直後にある領域の先頭アドレスから前記つぎの未使用領域の先頭アドレスまでの領域が所定のサイズよりも大きい場合には、前記所定のサイズ以下の複数の領域に分割し、分割した領域の１つを前記移動対象領域とし、
前記プログラミングツールと前記プログラマブルコントローラは、分割したそれぞれの領域について、前記プログラマブルコントローラの前記データ記憶手段中のデータの移動処理を行うことを特徴とする請求項２に記載のプログラマブルコントローラシステム。
【請求項４】
前記変更先アドレス取得部は、前記変数割付情報を用いて、前記プログラマブルコントローラの前記データ記憶手段中の先頭アドレスから末尾アドレスに向かって前記未使用領域を検索し、最初に発見した未使用領域を前記変更先アドレスとして取得することを特徴とする請求項１から３のいずれか１つに記載のプログラマブルコントローラシステム。
【請求項５】
前記メモリ整理実行手段は、前記プログラム実行手段が前記プログラムを実行中に前記プログラムの実行コードの書換えと、前記データ記憶手段中のデータの移動を行うことを特徴とする請求項１から４のいずれか１つに記載のプログラマブルコントローラシステム。
【請求項６】
プログラムの実行コードを記憶するプログラム記憶手段と、プログラムの実行コードを実行するプログラム実行手段と、プログラム実行手段によるプログラムの実行コードの実行時に使用するデータを格納するデータ記憶手段と、を備え、前記プログラムに基づいて制御対象を制御するプログラマブルコントローラと、前記プログラマブルコントローラで使用される前記プログラムを管理するプログラミングツールと、が通信回線を介して接続されたプログラマブルコントローラシステムでの前記プログラムで使用される変数が割付けられた前記データ記憶手段内の領域を整理するメモリ整理方法において、
前記プログラミングツールは、前記プログラム中で使用されている変数とサイズ、および前記プログラマブルコントローラの前記データ記憶手段内のアドレスとを対応付ける変数割付情報から前記プログラマブルコントローラの前記データ記憶手段内の前記変数に割付けられている領域のうち断片化されている領域を移動対象領域として抽出する工程と、
前記プログラミングツールは、前記移動対象領域を他の変数に割付けられている領域と連続するように配置する前記データ記憶手段内の変更先アドレスを取得する工程と、
前記プログラミングツールは、前記移動対象領域と前記変更先アドレスとを含む割付変更後の変数割付情報と、前記プログラムと、から割付変更後のプログラムの実行コードを取得する工程と、
前記プログラミングツールは、前記割付変更後のプログラムの実行コードの割付変更前のプログラムの実行コードからの変更箇所を変更情報として取得する工程と、
前記プログラミングツールは、前記移動対象領域と前記変更先アドレスとを含む割付変更情報を生成する工程と、
前記プログラミングツールは、前記変更情報と前記割付変更情報を前記プログラマブルコントローラに送信する工程と、
前記プログラマブルコントローラは、前記変更情報と前記割付変更情報を受信する工程と、
前記プログラマブルコントローラは、前記変更情報に基づいて前記プログラム記憶手段中の前記プログラムの実行コードを書換えると同時に、前記割付変更情報にしたがって前記データ記憶手段中の前記移動対象領域中のデータを前記変更先アドレスで指定される領域に移動させる工程と、
を含むことを特徴とするメモリ整理方法。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、プログラマブルコントローラシステムおよびメモリ整理方法に関するものである。
【背景技術】
【０００２】
従来のプログラマブルコントローラのユーザプログラムでは、演算に使用するデータ領域を指定する手段として、メモリアドレスをユーザプログラムに直接記述していた。しかし、近年になって、ユーザプログラム上では変数を使用してロジックを記述し、コンパイル時に変数をメモリアドレスに置き換えることで、ユーザがメモリアドレスを意識せずにプログラムを作成する、いわゆる変数プログラミングが利用されるようになってきた。
【０００３】
一方、プログラマブルコントローラは、装置設備が動作中でも不具合の修正や動作調整のためにユーザプログラムを追加／修正／削除する必要が生じる。その場合、プログラマブルコントローラがユーザプログラムを実行中でも、ユーザプログラムを修正できるＲＵＮ中書込みが利用される。
【０００４】
ＲＵＮ中書込みの従来技術として、ＣＰＵ（Central  Processing  Unit）ユニットのプログラムメモリ内に修正後のユーザプログラムをダウンロードして置き、ＥＮＤ処理にてユーザプログラムを修正前から修正後に差し替えたり、実行中のプログラムを、複数スキャンのＥＮＤ処理にて徐々にずらしていき、必要なスペースができた時点で変更後のプログラムで変更箇所を上書きすることでユーザプログラムを更新したりする方法が知られている（たとえば、特許文献１，２参照）。
【０００５】
変数プログラミングにおけるＲＵＮ中書込みでは、修正したユーザプログラムをコンパイルする際、修正前から使用されている各変数が、修正前と修正後とで、異なるメモリアドレスに割付けられてしまうと、参照するデータが異なるため、ユーザプログラム上での変数の使い方によっては、プログラムが誤動作してしまうという問題がある。
【０００６】
そこで、変数とその変数のメモリアドレスへの割付情報をあらかじめ保存しておき、ＲＵＮ中書込み時のコンパイルでは、既にメモリアドレスに割付けられている変数に対しては、ＣＰＵユニットのメモリアドレスへの割付を変更せず、追加／変更された変数に対してのみ、新たにＣＰＵユニットのメモリアドレスを割付けることでプログラムの誤動作防止を図っている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００１−１４２５１０号公報
【特許文献２】特開平１０−３０１６０５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかしながら、ＲＵＮ中書込による変数の追加／変更／削除が頻繁に行われる場合、データメモリ領域内で変数が割付けられていない未使用の領域が点在し、断片化された状態となる。また、配列変数や構造体変数などの複数の変数をまとめて扱う場合、複数の変数分の連続領域が必要となるため、データメモリ内での未使用の領域も多くなり、データメモリの使用効率の低下が顕著となる。
【０００９】
データメモリ内で未使用の領域が点在する状態で、配列変数や構造体変数を追加する場合、空き容量全体では容量として十分に追加可能であっても、連続領域を確保できず、変数を追加できないという問題点があった。
【００１０】
この発明は、上記に鑑みてなされたもので、配列変数や構造体変数などの高度なデータ構造を扱うプログラマブルコントローラとプログラミングツールとが接続されたプログラマブルコントローラシステムにおいて、変数を追加する際に、断片化されたメモリ領域を整理し、連続領域を確保できるプログラマブルコントローラシステムおよびメモリ整理方法を得ることを目的とする。
【課題を解決するための手段】
【００１１】
上記目的を達成するため、この発明にかかるプログラマブルコントローラシステムは、プログラムに基づいて制御対象を制御するプログラマブルコントローラと、前記プログラマブルコントローラで使用される前記プログラムを管理するプログラミングツールと、を備えるプログラマブルコントローラシステムにおいて、前記プログラミングツールは、前記プログラム中で使用されている変数とサイズ、および前記プログラマブルコントローラのデータ記憶手段内のアドレスとを対応付ける変数割付情報を格納する変数割付情報格納手段と、ユーザによって作成されたプログラムと前記変数割付情報から前記プログラマブルコントローラで実行可能な実行コードを生成するコンパイル手段と、変更前の前記変数割付情報から前記プログラマブルコントローラの前記データ記憶手段内の前記変数に割付けられている領域のうち断片化されている領域を移動対象領域として抽出する移動対象領域抽出部、前記移動対象領域を他の変数に割付けられている領域と連続するように配置する前記データ記憶手段内の変更先アドレスを取得する変更先アドレス取得部、前記移動対象領域と前記変更先アドレスとを含む割付変更後の変数割付情報と、前記プログラムと、から前記コンパイル手段を通じて割付変更後のプログラムの実行コードを取得する変更後実行コード取得部、前記割付変更後のプログラムの実行コードの前記割付変更前のプログラムの実行コードからの変更箇所を変更情報として取得する変更情報取得部、および前記移動対象領域と前記変更先アドレスとを用いて前記変数の前記データ記憶手段内での割当先の変更に伴って生じる前記プログラムの実行コードの変更箇所を割付変更情報として生成する割付変更情報生成部を有する変数割付管理手段と、前記変数割付管理手段によって生成される変更情報と割付変更情報とを前記プログラマブルコントローラに送信する通信手段と、を備え、前記プログラマブルコントローラは、前記プログラムの実行コードを記憶するプログラム記憶手段と、前記プログラムの実行コードを実行するプログラム実行手段と、前記プログラム実行手段による前記プログラムの実行コードの実行時に使用するデータを格納する前記データ記憶手段と、前記プログラミングツールからの前記変更情報を用いて前記プログラム記憶手段中の実行コードの書換え処理を行うと同時に、前記プログラミングツールからの前記割付変更情報にしたがって前記データ記憶手段中の前記移動対象領域中のデータを前記変更先アドレスで指定される領域に移動させる処理を行うメモリ整理実行手段と、を備えることを特徴とする。
【発明の効果】
【００１２】
この発明によれば、変数プログラミングにおいて配列変数や構造体変数などの高度なデータ構造を使用しているユーザプログラムに対してＲＵＮ中書込みを繰り返し実行しても、効率よくデータメモリ領域を使用することが可能となる効果を有する。
【図面の簡単な説明】
【００１３】
【図１】図１は、この実施の形態によるプログラマブルコントローラシステムの機能構成の一例を模式的に示すブロック図である。
【図２】図２は、変数割付情報の一例を示す図である。
【図３−１】図３−１は、実施の形態によるメモリ整理処理の一例を示すフローチャートである（その１）。
【図３−２】図３−２は、実施の形態によるメモリ整理処理の一例を示すフローチャートである（その２）。
【図３−３】図３−３は、実施の形態によるメモリ整理処理の一例を示すフローチャートである（その３）。
【図４】図４は、ＣＰＵユニットのデータメモリの整理状態を模式的に示す図である。
【図５】図５は、移動対象領域を所定のサイズに分割して変更先アドレスへと移動させる場合の例を模式的に示す図である。
【発明を実施するための形態】
【００１４】
以下に添付図面を参照して、この発明の実施の形態にかかるプログラマブルコントローラシステムおよびメモリ整理方法を詳細に説明する。なお、この実施の形態によりこの発明が限定されるものではない。
【００１５】
図１は、この実施の形態によるプログラマブルコントローラシステムの機能構成の一例を模式的に示すブロック図である。プログラマブルコントローラシステムは、ユーザプログラム（シーケンスプログラム）にしたがって制御対象を制御することによって所定の処理を実行させて、製品の加工や製造を行うものである。この例では、プログラマブルコントローラシステムは、ＣＰＵユニット２０で実行されるユーザプログラムのコンパイル処理を行うプログラミングツール１０と、制御対象の制御処理を行う制御データを演算するＣＰＵユニット２０と、を備える。
【００１６】
プログラミングツール１０は、ユーザがユーザプログラムを編集するためのＩ／Ｆを提供するプログラムエディタ部１１と、ユーザプログラムで使用される変数とＣＰＵユニット２０のデータメモリ２４でのメモリアドレスとの間の対応関係を示す変数割付情報を格納する変数割付情報格納部１２と、プログラムエディタ部１１で編集されたユーザプログラムと変数割付情報格納部１２中の変数割付情報とに基づいてＣＰＵユニット２０で実行可能な実行コードを生成するコンパイラ１３と、変数割付情報を管理する変数割付管理部１４と、ＣＰＵユニット２０との間で通信を行う通信部１５と、を備える。
【００１７】
プログラムエディタ部１１で編集されるユーザプログラム中では、メモリアドレスを変数を用いて記述しており、コンパイラ１３での実行コード生成時に変数がＣＰＵユニット２０のデータメモリ２４のメモリアドレスへと変換される。
【００１８】
変数割付情報格納部１２は、現在ＣＰＵユニット２０で使用中の変数割付情報である変更前変数割付情報と、メモリ整理処理時に変数割付管理部１４で生成される変更後変数割付情報と、を記憶することができるものとする。変数割付情報は、データメモリ２４中の格納場所の先頭アドレスと、ユーザプログラムで使用される変数と、を対応付けている。図２は、変数割付情報の一例を示す図である。変数割付情報は、データメモリ２４内の先頭アドレスと、先頭アドレスに対して割付けられた変数の名称（変数名）と、変数のサイズと、を対応付けて管理している。この図２では、データメモリ２４の先頭アドレス「０ｘ１０００」にサイズ２の変数１が割当てられ、先頭アドレス「０ｘ１００６」にサイズ４の変数２が割当てられ、先頭アドレス「０ｘ１００Ｃ」にサイズ４の変数３が割当てられ、先頭アドレス「０ｘ１０１０」にサイズ２の変数４が割当てられ、先頭アドレス「０ｘ１０１４」にサイズ６の変数５が割当てられており、変数１と変数２の間、変数２と変数３の間、および変数４と変数５の間が未使用領域となっている場合が示されている。
【００１９】
変数割付管理部１４は、ＣＰＵユニット２０で動作しているユーザプログラムの変数割付情報から、ＣＰＵユニット２０のデータメモリ２４内に未使用領域が複数箇所に点在する場合に、変数が割付けられていない未使用領域が連続するように変数の割付を変更する。このような機能を達成するために、この実施の形態では変数割付管理部１４は、変数割付情報管理部１４１と、移動対象領域抽出部１４２と、変更先アドレス取得部１４３と、変更後実行コード取得部１４４と、変更情報取得部１４５と、割付変更情報生成部１４６と、を有する。
【００２０】
変数割付情報管理部１４１は、メモリ整理処理の実行時に、ＣＰＵユニット２０で使用されている変数割付情報を変数割付情報格納部２６から取得し、変数割付情報格納部１２に変更前変数割付情報として格納する。また、ＣＰＵユニット２０にメモリ整理後の変更後変数割付情報が登録されると、変更後変数割付情報を変更前変数割付情報として変数割付情報格納部１２に格納する機能も有する。
【００２１】
移動対象領域抽出部１４２は、変数割付情報格納部１２の変更前変数割付情報を用いて、断片化されている使用領域を移動対象領域として抽出する。たとえば、変更前変数割付情報を用いてＣＰＵユニット２０のデータメモリ２４の先頭アドレスから末尾アドレスに向かって未使用領域を検索し、発見した未使用領域の直後にある領域の先頭アドレスからつぎの未使用領域の先頭アドレスまでの領域を移動対象領域として抽出する。
【００２２】
変更先アドレス取得部１４３は、変数が割り付けられていない（空き状態）アドレスを、変数割付情報格納部１２の変更前変数割付情報からＣＰＵユニット２０のデータメモリ２４の先頭アドレスから末尾アドレスに向かって検索し、最初にヒットしたアドレスを上記移動対象領域の変更先アドレスとして取得する。
【００２３】
変更後実行コード取得部１４４は、コンパイラ１３を通じて移動対象領域に割付けられている変数の割付を変更先アドレスに変更したユーザプログラムの実行コード（以下、割付変更後のプログラムという）を生成する。
【００２４】
変更情報取得部１４５は、割付変更後のプログラムが割付変更前のユーザプログラムの実行コード（以下、割付変更前のプログラムという）から変化した分を変更情報として抽出する。割付変更前のプログラムは、変数割付情報格納部１２の変更前変数割付情報を用いてコンパイラ１３を通じて求めてもよいし、ターゲットとなるＣＰＵユニット２０から取得してもよい。
【００２５】
割付変更情報生成部１４６は、移動対象領域抽出部１４２で抽出された移動対象領域の先頭アドレスおよびサイズと、変更先アドレス取得部１４３で取得された変更先先頭アドレスと、から割付変更情報を生成する。なお、変更情報と割付変更情報は、通信部１５を介してＣＰＵユニット２０へと送信される。
【００２６】
ＣＰＵユニット２０は、プログラミングツール１０との間で通信を行う通信部２１と、ユーザプログラムを格納するプログラムメモリ２２と、プログラムメモリ２２中のユーザプログラムを実行するユーザプログラム実行部２３と、ユーザプログラム実行部２３によるユーザプログラムの実行中に使用されるデータを格納するデータメモリ２４と、断片化されたデータメモリ２４を整理するメモリ整理実行部２５と、ＣＰＵユニット２０に書き込まれたユーザプログラムの変数割付情報を保存する変数割付情報格納部２６と、プログラミングツール１０からの割付変更情報を格納する割付変更情報格納部２７と、を備える。
【００２７】
ここで、メモリ整理実行部２５は、プログラミングツール１０から受け取った変更情報（または割付変更後のプログラム）をプログラムメモリ２２内に格納し、ＲＵＮ中書込機能を用いてプログラムメモリ２２中のユーザプログラムを修正すると同時に、プログラミングツール１０から受け取った割付変更情報に基づいてデータメモリ２４内のデータを移動させる。データメモリ２４内のデータの移動は、割付変更情報中の移動対象領域の先頭アドレスとサイズとで特定される移動対象領域中のデータを、割付変更情報中の変更先先頭アドレスで特定される領域へと移動させることによって行われる。
【００２８】
つぎに、このようなプログラマブルコントローラシステムでのメモリ整理処理について説明する。図３−１〜図３−３は、実施の形態によるメモリ整理処理の一例を示すフローチャートである。
【００２９】
まず、プログラミングツール１０にユーザからターゲットとなるＣＰＵユニット２０のデータメモリ整理操作の実行コマンドが入力されると、プログラミングツール１０の通信部１５からＣＰＵユニット２０の通信部２１に対してデータメモリ整理実行コマンドが発行される（ステップＳ１１）。
【００３０】
ＣＰＵユニット２０の通信部２１は、データメモリ整理コマンドを受け付けると（ステップＳ１２）、メモリ整理実行部２５にデータメモリ整理コマンドの実行を依頼する（ステップＳ１３）。また、メモリ整理実行部２５は、データメモリ整理コマンドを受け付けた時点で、データメモリ整理が実行中であるか否かを判定する（ステップＳ１４）。データメモリ整理が実行中でなければ（ステップＳ１４でＮｏの場合）、データメモリ整理処理の実行の有無を示すデータメモリ実行状態を実行中とし（ステップＳ１５）、通信部２１を通じてプログラミングツール１０にデータメモリ実行可能通知を送信する（ステップＳ１６）。なお、既にデータメモリ整理が実行中であれば（ステップＳ１４でＹｅｓの場合）、実行中であることを示すデータメモリ実行中通知を、通信部２１を通じてプログラミングツール１０に送信する（ステップＳ１７）。
【００３１】
ＣＰＵユニット２０からデータメモリ実行可能通知／データメモリ実行中通知を受け取ると（ステップＳ１８）、プログラミングツール１０の変数割付管理部１４の変数割付情報管理部１４１は、変数割付情報格納部１２にＣＰＵユニット２０で使用される変数割付情報（変更前変数割付情報）を保持しているかを確認する（ステップＳ１９）。変更前変数割付情報を保持していない場合（ステップＳ１９でＮｏの場合）には、変数割付情報管理部１４１は、通信部１５を通じてＣＰＵユニット２０に対して変数割付情報取得要求を送信する（ステップＳ２０）。
【００３２】
ＣＰＵユニット２０のメモリ整理実行部２５は、変数割付情報取得要求を受け取ると（ステップＳ２１）、変数割付情報格納部２６から現在動作中のユーザプログラムの変数割付情報を取り出し、通信部２１を通じてプログラミングツール１０に送信する（ステップＳ２２）。プログラミングツール１０の変数割付情報管理部１４１は、ＣＰＵユニット２０で動作しているユーザプログラムの変数割付情報を受信すると（ステップＳ２３）、変更前変数割付情報として変数割付情報格納部１２に格納する。
【００３３】
なお、ＣＰＵユニット２０で動作しているユーザプログラムの変数割付情報（変更前変数割付情報）が、プログラミングツール１０の変数割付情報格納部１２に既に存在する場合（ステップＳ１９でＹｅｓの場合）には、ＣＰＵユニット２０から改めて取得する必要はない。
【００３４】
ステップＳ２３の後またはステップＳ１９でＹｅｓの場合に、ＣＰＵユニット２０の変数割付管理部１４の移動対象領域抽出部１４２は、変更前変数割付情報内でＣＰＵユニット２０のデータメモリ２４内の未使用領域を検索し、未使用領域が複数箇所に点在するか（２つ以上存在するか）を判定する（ステップＳ２４）。
【００３５】
データメモリ２４内に未使用領域が複数箇所に点在する場合（ステップＳ２４でＹｅｓの場合）には、移動対象領域抽出部１４２は、変更前変数割付情報からＣＰＵユニット２０のデータメモリ２４の先頭アドレスから末尾アドレスに向かって未使用領域を検索し、移動対象領域を抽出する。たとえば、最初に発見した未使用領域の直後にある領域の先頭アドレスから、次の未使用領域の先頭アドレスまでの領域を移動対象領域とする。
【００３６】
ついで、変数割付管理部１４の変更先アドレス取得部１４３は、抽出した移動対象領域の変更先先頭アドレスを決定する（ステップＳ２６）。ここでは、データメモリ２４の先頭アドレスから末尾アドレスに向かって未使用領域を検索した場合の最初に発見した未使用領域の先頭アドレスを変更先先頭アドレスとする。
【００３７】
変数割付情報管理部１４１は、移動対象領域抽出部１４２で抽出された移動対象領域に対して付されている変数とサイズを割付変更前の変数割付情報から取得し、取得した変数とサイズを、変更先アドレス取得部１４３で取得した変更先先頭アドレスに新たに対応付けた割付変更後の変数割付情報を生成する（ステップＳ２７）。
【００３８】
その後、変数割付管理部１４の変更後実行コード取得部１４４は、コンパイラ１３を通じて割付変更後の変数割付情報に基づいて、移動対象領域に割付けられている変数を変更先先頭アドレスに変更したユーザプログラムの実行コード（割付変更後のプログラム）を生成する（ステップＳ２８）。
【００３９】
ついで、変数割付管理部１４の変更情報取得部１４５は、割付変更後のプログラムの割付変更前のプログラムから変化した部分である変更情報を抽出する（ステップＳ２９）。割付変更前のプログラムは、たとえばターゲットとするＣＰＵユニット２０から取得してもよいし、割付変更前の変数割付情報からコンパイラ１３を通してプログラムを生成してもよい。
【００４０】
さらに、変数割付管理部１４は、移動対象領域の先頭アドレスとサイズ、および変更先先頭アドレスを含む割付変更情報を生成し（ステップＳ３０）、割付変更後のプログラムと共にＣＰＵユニット２０に送信する（ステップＳ３１）。
【００４１】
ＣＰＵユニット２０のメモリ整理実行部２５は、プログラミングツール１０から割付変更後のプログラムと割付変更情報とを受信すると（ステップＳ３２）、割付変更後のプログラムをプログラムメモリ２２内に格納した後（ステップＳ３３）、ＲＵＮ中書込み機能を使ってプログラムメモリ２２内のユーザプログラムを修正すると同時に、プログラミングツール１０から受け取った割付変更情報に基づいてデータメモリ２４内のデータを移動させる（ステップＳ３４）。データメモリ２４内のデータの移動は、たとえば、割付変更情報中の移動対象領域の先頭アドレスとサイズで特定される範囲に存在するデータを取得して、変更先先頭アドレスで特定される範囲にデータを移動させることによって行われる。
【００４２】
その後、ＣＰＵユニット２０のメモリ整理実行部２５は、ユーザプログラムの修正とデータの移動が完了すると、通信部２１を通じてプログラミングツール１０に対して割付変更完了通知を送信する（ステップＳ３５）。
【００４３】
プログラミングツール１０の変数割付管理部１４の変数割付情報管理部１４１は、通信部１５を通じてＣＰＵユニット２０から割付変更完了通知を受信すると（ステップＳ３６）、変数割付情報を、変更後の変数割付情報に更新する（ステップＳ３７）。具体的には、変数割付情報格納部１２中の変更後の変数割付情報を変更前の変数割付情報に更新する。また、ＣＰＵユニット２０の変数割付情報格納部２６に格納されている変数割付情報も更新する（ステップＳ３８）。
【００４４】
また、移動対象領域抽出部１４２は、変更後の変数割付情報を分析し、データメモリ２４内が、使用領域と未使用領域が共に１つのみになっているかを判定する（ステップＳ３９）。使用領域または未使用領域が１つでない場合（ステップＳ３９でＮｏの場合）には、ステップＳ２５の移動対象領域の検索へと戻り、上記した処理が繰り返し実行される。また、使用領域と未使用領域が共に１つであれば（ステップＳ３９でＹｅｓの場合）、メモリ整理完了とし、ＣＰＵユニット２０に対して通信部１５を通じてメモリ整理完了通知を送信する（ステップＳ４０）。
【００４５】
ＣＰＵユニット２０のメモリ整理実行部２５は、通信部２１を通じてメモリ整理完了通知を受信すると（ステップＳ４１）、データメモリ実行状態を未実行とし（ステップＳ４２）、通信部２１を通じてプログラミングツール１０に正常終了通知を送信する（ステップＳ４３）。
【００４６】
プログラミングツール１０は通信部１５を通じて正常終了通知を受信すると（ステップＳ４４）、ユーザにメモリ整理完了を通知する（ステップＳ４５）。以上で、メモリ整理処理が終了する。
【００４７】
つぎに、具体例として、図２に示される変数割付情報で変数が割付けられたデータメモリ２４についてメモリ整理処理を行う場合を説明する。図４は、ＣＰＵユニットのデータメモリの整理状態を模式的に示す図である。図４で、上段の図は変数割付情報であり、中断の図はＣＰＵユニット２０内のデータメモリ２４内のアドレスの使用状況を模式的に示す図であり、下段の図はプログラムメモリ２２内のプログラムの状態を模式的に示す図である。
【００４８】
図４（ａ）は、メモリ整理処理を行う前の状態であり、ＲＵＮ中書込処理によって断片化されてしまった状態を示している。つまり、先頭アドレス「０ｘ１０００」にはサイズが２バイトの変数１が割付けられ、先頭アドレス「０ｘ１００６」にはサイズが４バイトの変数２が割付けられ、先頭アドレス「０ｘ１００Ｃ」にはサイズが４バイトの変数３が割付けられ、先頭アドレス「０ｘ１０１０」にはサイズが２バイトの変数４が割付けられ、先頭アドレス「０ｘ１０１４」にはサイズが６バイトの変数５が割付けられている。また、変数１と変数２の間、変数２と変数３の間、および変数４と変数５の間は未使用領域となっている。
【００４９】
さらに、プログラムメモリ２２内のプログラムＡでは、変数２（アドレス「０ｘ１００６」）と変数４（アドレス「０ｘ１０１０」）が使用されており、プログラムＢでは、変数２（アドレス「０ｘ１００６」）と変数５（アドレス「０ｘ１０１４」）が使用されている。
【００５０】
このような状態のデータメモリ２４に対して上述したメモリ整理処理が実行されると、まず、データメモリ２４の先頭アドレス（０ｘ１０００）から末尾アドレス（０ｘ１０１９）に向かって最初の未使用領域の後の変数が割付けられた領域が検索される。ここでは、先頭アドレスが「０ｘ１００６」であり、サイズが４バイトの変数２が移動対象領域として抽出される。
【００５１】
また、変更先アドレスとして、データメモリ２４の先頭アドレスから末尾アドレスに向かって最初の未使用領域が検索される。ここでは、先頭アドレスが「０ｘ１００２」であり、サイズが４バイトの未使用領域が抽出され、変更先先頭アドレスとして「０ｘ１００２」が取得される。
【００５２】
以上より、変更前変数割付情報では、変数２はアドレス「０ｘ１００６」から４バイトと割付けられていたが、変更後変数割付情報では、変数２はアドレス「０ｘ１００２」から４バイトと割付けられることになる。また、この変更後変数割付情報を用いて割付変更後のプログラムが生成され、割付変更前のプログラムから変化した部分である変更情報が取得される。さらに、移動対象領域のアドレス「０ｘ１００６」とサイズ４バイト、および変更先先頭アドレス「０ｘ１００２」を含む割付変更情報が生成される。
【００５３】
つぎに、図４（ｂ）に示されるように、プログラムメモリ２２中のユーザプログラムの書換え処理が行われる。この書換え処理は、ＲＵＮ中書込み機能を用いて行われ、取得された変更情報に対応する部分のみ行われる。ここでは、プログラムＡ，Ｂの変数２を含む部分が変更される。また、これと同時にデータメモリ２４中で変数２の移動処理が行われる。この移動処理は、割付変更情報に基づいて行われる。そして、変更後変数割付情報が、変更前変数割付情報とされる。
【００５４】
この処理によって、未使用領域と使用領域とが共に１つとなったかを確認するが、いずれも１つではないので、さらにメモリ整理処理が行われる。図４（ａ）の場合と同様にして、移動対象領域として先頭アドレスが「０ｘ１００Ｃ」であり、サイズが６バイトの変数３，４が抽出され、変更先アドレスとして「０ｘ１００６」が取得される。
【００５５】
これによって、変更前変数割付情報では、変数３はアドレス「０ｘ１００Ｃ」から４バイトと割付けられており、変数４はアドレス「０ｘ１０１０」から２バイトと割付けられていたが、変更後変数割付情報では、変数３はアドレス「０ｘ１００６」から４バイト割付けられ、変数４はアドレス「０ｘ１００Ａ」から２バイト割付けられることになる。また、この変更後変数割付情報を用いて割付変更後のプログラムが生成され、割付変更前のプログラムから変化した部分である変更情報が取得される。さらに、移動対象領域のアドレス「０ｘ１００Ｃ」とサイズ６バイト、および変更先先頭アドレス「０ｘ１００６」を含む割付変更情報が生成される。
【００５６】
つぎに、図４（ｃ）に示されるように、プログラムメモリ２２中のユーザプログラムの書換え処理が行われる。この書換え処理は、ＲＵＮ中書込み機能を用いて行われ、取得された変更情報に対応する部分のみ行われる。ここでは、プログラムＡの変数４を含む部分が変更される。また、これと同時にデータメモリ２４中で変数３，４の移動処理が行われる。この移動処理は、割付変更情報に基づいて行われる。そして、変更後変数割付情報が、変更前変数割付情報とされる。
【００５７】
この処理によって、未使用領域と使用領域とが共に１つとなったかを確認するが、いずれも１つではないので、さらにメモリ整理処理が行われる。図４（ａ）の場合と同様にして、移動対象領域として先頭アドレスが「０ｘ１０１４」であり、サイズが６バイトの変数５が抽出され、変更先アドレスとして「０ｘ１００Ｃ」が取得される。
【００５８】
これによって、変更前変数割付情報では、変数５はアドレス「０ｘ１０１４」から６バイトと割付けられていたが、変更後変数割付情報では、変数５はアドレス「０ｘ１００Ｃ」から６バイト割付けられる。また、この変更後変数割付情報を用いて割付変更後のプログラムが生成され、割付変更前のプログラムから変化した部分である変更情報を取得する。さらに、移動対象領域のアドレス「０ｘ１０１４」とサイズ６バイト、および変更先先頭アドレス「０ｘ１００Ｃ」を含む割付変更情報が生成される。
【００５９】
つぎに、図４（ｄ）に示されるように、プログラムメモリ２２中のユーザプログラムの書換え処理が行われる。この書換え処理は、ＲＵＮ中書込み機能を用いて行われ、取得された変更情報に対応する部分のみ行われる。また、これと同時にデータメモリ２４中で変数５の移動処理が行われる。ここでは、プログラムＢの変数５を含む部分が変更される。この移動処理は、割付変更情報に基づいて行われる。そして、変更後変数割付情報が、変更前変数割付情報とされる。
【００６０】
この処理によって、未使用領域と使用領域とが共に１つとなったかを確認する。以上の処理によって、アドレス「０ｘ１０００」〜「０ｘ１０１０」に連続して変数１〜５が割当てられ、アドレス「０ｘ１０１２」〜「０ｘ１０１８」は未使用領域となっており、使用領域と未使用領域がいずれも１つとなったので、メモリ整理処理が終了する。
【００６１】
なお、移動対象領域が大きい場合には、データを移動させる際に時間がかかり、スキャンタイムが延びてしまうこともある。そのような場合には、ある程度のサイズで移動対象領域を分割し、複数回に分けて領域を移動させることで、スキャンタイムの延びを抑えることができる。このとき、予め実験によってスキャンタイムが延びない様に求められた最大のデータサイズ以下のサイズで移動対象領域を分割することができる。
【００６２】
図５は、移動対象領域を所定のサイズに分割して変更先アドレスへと移動させる場合の例を模式的に示す図である。この図で、上段の図は変数割付情報であり、下断の図はＣＰＵユニット２０内のデータメモリ２４内のアドレスの使用状況を模式的に示す図である。なお、ここでは、移動対象領域を８Ｋバイトずつに分割して、２回に分けて移動させる場合を示す。
【００６３】
まず、図５（ａ）の変数割付情報に示されるように、メモリ整理処理を行う前は、先頭アドレス「０ｘ１００２」にはサイズが１６Ｋバイトの変数１０〜１３が割付けられている。また、変数１０の前、および変数１３の後は未使用領域となっている。
【００６４】
このような状態のデータメモリ２４に対して上述したメモリ整理処理が実行されると、まず、データメモリ２４の先頭アドレス（０ｘ１０００）から末尾アドレス（０ｘ５００２）に向かって最初の未使用領域の後の変数が割付けられた領域が検索される。ここでは、先頭アドレスが「０ｘ１００２」であり、サイズが１６Ｋバイトの変数１０〜１３が移動対象領域として抽出される。しかし、この移動対象領域のサイズは所定のサイズ（＝８Ｋバイト）を超えているので、先頭アドレス「０ｘ１００２」から８Ｋバイトが移動対象領域として選択される。
【００６５】
また、変更先アドレスとして、データメモリ２４の先頭アドレスから末尾アドレスに向かって最初の未使用領域が検索される。ここでは、先頭アドレスが「０ｘ１０００」であり、サイズが２Ｋバイトの未使用領域が抽出され、変更先先頭アドレスとして「０ｘ１０００」が取得される。
【００６６】
以上より、変更前変数割付情報では、変数１０〜１１はアドレス「０ｘ１００２」から８Ｋバイトと割付けられていたが、変更後変数割付情報では、変数１０〜１１はアドレス「０ｘ１０００」から８Ｋバイトと割付けられる。また、この変更後変数割付情報を用いて割付変更後のプログラムが生成され、割付変更前のプログラムから変化した部分である変更情報が取得される。さらに、移動対象領域のアドレス「０ｘ１００２」とサイズ８Ｋバイト、および変更先先頭アドレス「０ｘ１０００」を含む割付変更情報が生成される。
【００６７】
つぎに、プログラムメモリ２２中のユーザプログラムの書換え処理が行われる。この書換え処理は、ＲＵＮ中書込み機能を用いて行われ、取得された変更情報に対応する部分のみ行われる。またこれと同時に、図５（ｂ）に示されるようにデータメモリ２４中で変数１０〜１１の移動処理が行われる。この移動処理は、割付変更情報に基づいて行われる。そして、変更後変数割付情報が、変更前変数割付情報とされる。
【００６８】
この処理によって、未使用領域と使用領域とが共に１つとなったかを確認するが、いずれも１つではないので、さらにメモリ整理処理が行われる。図５（ａ）の場合と同様にして、移動対象領域として先頭アドレスが「０ｘ３００２」であり、サイズが８Ｋバイトの変数１２〜１３が抽出され、変更先アドレスとして「０ｘ３０００」が取得される。
【００６９】
これによって、変更前変数割付情報では、変数１２〜１３はアドレス「０ｘ３００２」から８Ｋバイトと割付けられていたが、変更後変数割付情報では、変数１２〜１３はアドレス「０ｘ３０００」から８Ｋバイト割付けられる。また、この変更後変数割付情報を用いて割付変更後のプログラムが生成され、割付変更前のプログラムから変化した部分である変更情報が取得される。さらに、移動対象領域のアドレス「０ｘ３００２」とサイズ８Ｋバイト、および変更先先頭アドレス「０ｘ３０００」を含む割付変更情報が生成される。
【００７０】
つぎに、プログラムメモリ２２中のユーザプログラムの書換え処理が行われる。この書換え処理は、ＲＵＮ中書込み機能を用いて行われ、取得された変更情報に対応する部分のみ行われる。またこれと同時に、図５（ｃ）に示されるようにデータメモリ２４中で変数１２〜１３の移動処理が行われる。この移動処理は、割付変更情報に基づいて行われる。そして、変更後変数割付情報が、変更前変数割付情報とされる。以上の処理によって、所定の長さ以上のデータが所定の長さに分割されて、スキャンタイムの延びを抑えながら移動される。
【００７１】
この処理によって、未使用領域と使用領域とが共に１つとなったかを確認する。これによって、アドレス「０ｘ１０００」〜「０ｘ５０００」に連続して変数１０〜１３が割当てられ、アドレス「０ｘ５０００」〜「０ｘ５００２」は未使用領域となっており、使用領域と未使用領域がいずれも１つとなったので、メモリ整理処理が終了する。
【００７２】
なお、上記した説明では、データメモリ２４の先頭アドレスから末尾アドレスに向かって未使用領域を検索し、最初の未使用領域の直後に存在する変数を移動対象領域として抽出する場合を示したが、これに限定されるものではなく、未使用領域を挟んで飛び飛びの状態で存在する任意の変数を抽出することができる。
【００７３】
この実施の形態によれば、データメモリ２４中の変数が割付けられた移動対象領域と、データメモリ２４の先頭アドレスに最も近い未使用領域を変更先アドレスとを抽出し、未使用領域が連続するように変数の割付を変更するようにしたので、ＲＵＮ中書込みによる変数の追加削除の繰り返しによって未使用領域が点在するデータメモリ２４内を整理し、連続する未使用領域を確保することができるという効果を有する。
【００７４】
また、移動対象領域が大きい場合は、移動対象領域を複数に分割して、複数回に分けて移動させることで、データの移動によるスキャンタイム延びを抑えることができるという効果も有する。
【産業上の利用可能性】
【００７５】
以上のように、この発明にかかるプログラマブルコントローラは、高度なデータ構造を使用する変数プログラミングの用途に適している。
【符号の説明】
【００７６】
１０  プログラミングツール
１１  プログラムエディタ部
１２  変数割付情報格納部
１３  コンパイラ
１４  変数割付管理部
１５，２１  通信部
２０  ＣＰＵユニット
２２  プログラムメモリ
２３  ユーザプログラム実行部
２４  データメモリ
２５  メモリ整理実行部
２６  変数割付情報格納部
２７  割付変更情報格納部
１４１  変数割付情報管理部
１４２  移動対象領域抽出部
１４３  変更先アドレス取得部
１４４  変更後実行コード取得部
１４５  変更情報取得部
１４６  割付変更情報生成部
【図１】
0005669652.tif 000002
【図２】
0005669652.tif 000003
【図３−１】
0005669652.tif 000004
【図３−２】
0005669652.tif 000005
【図３−３】
0005669652.tif 000006
【図４】
0005669652.tif 000007
【図５】
0005669652.tif 000008