"プログラマブルコントローラ用の任意のプログラムのソースコードをコンパイルして機械語オブジェクトを生成する支援装置と、プログラマブルコントローラとから成るプログラマブルコントローラシステムであって、前記支援装置は、前記ソースコードのコンパイルの際に、前記ソースコードに含まれるPOUに、そのPOUに係わる変数の格納領域と予備領域と追加変数格納先記憶領域を相対アドレスで示す領域情報を保持する変数情報記憶手段と、前記ソースコードのコンパイルの際に、前記POUのインスタンスに、そのインスタンスに関して確保された一塊のメモリ領域であるブロックに関する情報として少なくともその先頭アドレスを記憶するインスタンス情報記憶手段と、前記変数情報記憶手段と前記インスタンス情報記憶手段とを参照して、前記変数を前記インスタンスにメモリ割当てを行いながら、前記任意のプログラムのソースコードを前記機械語オブジェクトに変換するコンパイル手段と、前記プログラムの修正版/更新版である修正/更新プログラムのソースコードをコンパイルする際に、該ソースコードに含まれるPOUに、前記変数情報記憶手段を参照して追加変数の有無をチェックし、追加変数がある場合には前記予備領域で対応可能か否かを判定し、対応できる場合には該予備領域に追加変数を割当て、対応できない場合には、該POUのインスタンスに追加のブロックを確保すると共に、既存のブロックの前記追加変数格納先記憶領域に該追加ブロックの先頭アドレスを格納させる為の情報を生成し記憶する追加変数対応手段と、を有することを特徴とするプログラマブルコントローラシステム。前記コンパイル手段は、前記修正/更新プログラムの前記機械語オブジェクトへの変換に関しては、前記追加変数の有無に係らず、既存の変数に関しては前記変数情報記憶手段の前記領域情報に基づいて前回コンパイル時と同じアドレスを割り当てることを特徴とする請求項1記載のプログラマブルコントローラシステム。前記コンパイル手段は、前記修正/更新プログラムの前記機械語オブジェクトへの変換に関しては、前記追加変数格納先記憶領域経由で前記追加変数にアクセスする機械語オブジェクトを生成することを特徴とする請求項1記載のプログラマブルコントローラシステム。前記支援装置は、前記追加変数格納先記憶領域のアドレスと該追加変数格納先記憶領域に記憶される前記追加ブロックの先頭アドレスとの対応関係情報を、前記修正/更新プログラムの機械語オブジェクトと共に前記プログラマブルコントローラにダウンロードし、前記プログラマブルコントローラは、該修正/更新プログラムの機械語オブジェクトを実行開始する前に、前記対応関係情報に基づいて、前記追加変数格納先記憶領域に前記追加ブロックの先頭アドレスを格納することを特徴とする請求項3記載のプログラマブルコントローラシステム。前記コンパイル手段は、前記POUの一種であるPGに関しては、前記ブロックの先頭アドレスと前記変数の相対アドレスとによって変数の割当位置の実アドレスを求めて、該実アドレスを用いて前記機械語オブジェクトを生成することを特徴とする請求項1記載のプログラマブルコントローラシステム。前記コンパイル手段は、前記POUの一種であるファンクションブロックに関しては、ベースポインタと前記変数の相対アドレスとによって変数の割当位置にアクセスさせる機械語オブジェクトを生成すると共に、該ファンクションブロックのインスタンスの呼び出し元POUが、該ファンクションブロックのインスタンスに対応する前記ブロックの先頭アドレスを前記ベースポインタにセットしてから該ファンクションブロックのインスタンスを呼び出す機械語オブジェクトを生成することを特徴とする請求項1記載のプログラマブルコントローラシステム。前記変数情報記憶手段には、前記変数に、その変数が前記既存のブロックと前記追加ブロックのどちらに割り当てられたかを示す情報も記憶されることを特徴とする請求項1記載のプログラマブルコントローラシステム。プログラマブルコントローラ用の任意のプログラムのソースコードをコンパイルして機械語オブジェクトを生成する支援装置であって、前記ソースコードのコンパイルの際に、前記ソースコードに含まれるPOUに、そのPOUに係わる変数の格納領域と予備領域と追加変数格納先記憶領域を相対アドレスで示す領域情報を保持する変数情報記憶手段と、前記ソースコードのコンパイルの際に、前記POUのインスタンスに、そのインスタンスに関して確保された一塊のメモリ領域であるブロックに関する情報として少なくともその先頭アドレスを記憶するインスタンス情報記憶手段と、前記変数情報記憶手段と前記インスタンス情報記憶手段とを参照して、前記変数を前記インスタンスにメモリ割当てを行いながら、前記任意のプログラムのソースコードを前記機械語オブジェクトに変換するコンパイル手段と、前記プログラムの修正版/更新版である修正/更新プログラムのソースコードをコンパイルする際に、該ソースコードに含まれるPOUに、前記変数情報記憶手段を参照して追加変数の有無をチェックし、追加変数がある場合には前記予備領域で対応可能か否かを判定し、対応できる場合には該予備領域に追加変数を割当て、対応できない場合には、該POUのインスタンスに追加のブロックを確保すると共に、既存のブロックの前記追加変数格納先記憶領域に該追加ブロックの先頭アドレスを格納させる為の情報を生成し記憶する追加変数対応手段と、を有することを特徴とするプログラマブルコントローラの支援装置。ここで、上記POUには、PGプログラム、FBファンクションブロック、FCTファンクション等の種類がある。基本的には、PGがメインプログラムでFBやFCTがサブプログラムと見做してよく、PGが、その処理実行中にFBやFCT等を呼び出す。また、FBが、その処理実行中に他のFBやFCTを呼び出す場合もある。PGを例にすると、PGのソースコードを作成するユーザが、PG中に任意のFB等の呼び出しを記述するものであり、基本的に何種類でも何回でも呼び出すように記述できる。例えば、FB1、FB2の2種類のFBがあるものとし、ユーザが作成した任意のPGでは、FB1を3回呼び出し、FB2は2回呼び出すものとする。あるいは、呼び出されたFB1が、その処理実行中にFB2を呼び出すように、FB1のソースコードを記述することもできる。このように、ファンクションブロックFB1のロジック自体は1つでも、ユーザは、複数回利用することができる。同様にファンクションブロックFB2のロジック自体は1つでも、ユーザは、複数回利用することができる。ここで、上記PGプログラム、FBファンクションブロック、FCTファンクション等の各種POUのソースコードには、通常、任意の変数が記述されている。そして、各種POUを有するプログラムをコンパイルする際には、コンパイラ機能により各POUのインスタンス化各POUの各変数をメモリに割り付けるを実施する。これは、例えば上記のようにFB1が3回呼び出される例では、FB1に関しては3回のインスタンス化が行われる。例えば、FB1が温度計による計測温度と湿度計による計測湿度とを取得記憶するロジックであった場合、例えば温度計Aの計測値を1000番地、湿度計aの計測値を1001番地に記憶するインスタンス、温度計Bの計測値を1010番地、湿度計bの計測値を1011番地に記憶するインスタンス、温度計Cの計測値を1020番地、湿度計cの計測値を1021番地に記憶するインスタンスの3つのインスタンスが生成されることになる。コンパイラ機能は、各POUをインスタンス化する場合、予備領域も含めて1つの塊としてメモリを割り付ける。上記のようにFBを複数回利用する場合にはそれぞれについてインスタンス化が行われる。上記のようにFB1の例の場合には3つのインスタンスが生成され、それぞれについて1つの塊としてメモリを割り付けることになる。上記の例では、各インスタンス毎に、温度計と湿度計それぞれに1ワード1番地ずつ計2ワードと、更に予備領域を1ワードの計3ワード分を、1つの塊としてメモリを割り付けることになる。そして、後にプログラムを修正バージョンアップする等して、任意のPOUにおける変数に追加があった場合、この追加変数を上記予備領域に割り付けることになる。追加変数が多い為に予備領域が不足しても、通常、PLCのメモリには未だ十分な余裕空き領域が残っているため、他のメモリ領域に変数を割り付けることは可能である。しかし、従来の方式では、予備領域を超えて変数を追加した場合、既存の変数のアドレス割当位置を変更する必要があり、既存変数のアドレスが変更されると上記の通り正常なデータ引き継ぎができない為、PLCを停止し、データの初期化を行い、プログラムをすべてPLCに転送してから、PLCを起動する必要がある。PLCが停止すると、システムも停止するため、システムの稼働率、保守性、拡張性の低下や、プラントなどシステムを停止できない場合に問題になる。本発明の課題は、PLCシステムに係わりそのPLC支援装置におけるPLCのプログラムの更新/修正に伴い、既存の変数のアドレス割当位置を変更することなく、予備領域では対応できないような変数追加があった場合でもPLCのメモリの空き領域に追加変数を割り付けることで、PLCを停止しないでプログラム更新を可能とするPLCプログラマブルコントローラシステム、その支援装置を提供することである。本発明のプログラマブルコントローラシステムは、プログラマブルコントローラ用の任意のプログラムのソースコードをコンパイルして機械語オブジェクトを生成する支援装置と、プログラマブルコントローラとから成るプログラマブルコントローラシステムであって、前記支援装置は、前記ソースコードのコンパイルの際に、前記ソースコードに含まれる各POU毎に、そのPOUに係わる各変数の格納領域と予備領域と追加変数格納先記憶領域の各領域を相対アドレスで示す領域情報を保持する変数情報記憶手段と、前記ソースコードのコンパイルの際に、前記各POUの各インスタンス毎に、そのインスタンスに関して確保された一塊のメモリ領域であるブロックに関する情報として少なくともその先頭アドレスを記憶するインスタンス情報記憶手段と、前記変数情報記憶手段と前記インスタンス情報記憶手段とを参照して、前記各変数を前記各インスタンス毎にメモリ割当てを行いながら、前記任意のプログラムのソースコードを前記機械語オブジェクトに変換するコンパイル手段と、前記プログラムの修正版/更新版である修正/更新プログラムのソースコードをコンパイルする際に、該ソースコードに含まれる各POU毎に、前記変数情報記憶手段を参照して追加変数の有無をチェックし、追加変数がある場合には前記予備領域で対応可能か否かを判定し、対応できる場合には該予備領域に追加変数を割当て、対応できない場合には、該POUの各インスタンス毎に追加のブロックを確保すると共に、既存のブロックの前記追加変数格納先記憶領域に該追加ブロックの先頭アドレスを格納させる為の情報を生成記憶する追加変数対応手段とを有する。上記プログラマブルコントローラシステムにおいて、例えば、前記コンパイル手段は、前記修正/更新プログラムの前記機械語オブジェクトへの変換に関しては、前記追加変数の有無に係らず、既存の変数に関しては前記変数情報記憶手段の前記領域情報に基づいて前回コンパイル時と同じアドレスを割り当てる。また、上記プログラマブルコントローラシステムにおいて、例えば、前記コンパイル手段は、前記修正/更新プログラムの前記機械語オブジェクトへの変換に関しては、前記追加変数格納先記憶領域経由で前記追加変数にアクセスする機械語オブジェクトを生成する。上記プログラマブルコントローラシステムでは、例えばその支援装置において、修正/更新プログラムにおいて追加変数がある場合、予備領域で対応できる場合には予備領域を割当て、予備領域では対応できない場合であっても追加ブロックを確保することで対応できる。また、既存の変数に関しては、変数情報記憶手段の領域情報に基づいて前回コンパイル時と同じアドレスを割り当てることができる。本発明のPLCプログラマブルコントローラシステム、その支援装置等によれば、PLCシステムに係わりそのPLC支援装置におけるPLCのプログラムの更新/修正に伴い、既存の変数のアドレス割当位置を変更することなく、予備領域では対応できないような変数追加があった場合でもPLCのメモリの空き領域に追加変数を割り付けることで、PLCを停止しないでプログラム更新を可能とする。以下、図面を参照して本発明の実施の形態について説明する。尚、本説明では割当てと割付けはほぼ同義であると見做すものとする。図1は、本例のプログラマブルコントローラPLCシステムの全体構成を示す図である。本例のPLCシステムは、PLCプログラマブルコントローラ30と、このPLC30用のプログラム制御プログラム等;以下、制御プログラムを例にして説明するをユーザが任意に作成できるように支援する機能等を有する開発支援装置ローダ10を有する。開発支援装置10は、上記作成された制御プログラムを、コンパイルして機械語に変換した後、不図示の通信線を介してPLC30にダウンロードする機能等も備えている。PLC30は、この機械語プログラムを記憶する後述する機械語オブジェクト41に相当。また、PLC30は、制御プログラムの更新/修正等に伴い更新/修正版等の機械語プログラムがダウンロードされた場合には、記憶してあった旧プログラムを削除して新プログラムを記憶する。そして、PLC30は、現在記憶している機械語プログラムを実行することで、制御対象の各種機器を制御する。尚、特に図示しないが、PLC30は、上記制御対象である何らかの機器または当該機器を接続しているI/Oユニットと、通信線を介して接続している。開発支援装置ローダ10は、コンパイラ機能部11、インタフェース機能部12、通信機能部13等の各種機能部と記憶部20等を有する。また、ユーザに上記制御プログラム等を作成させるための画面等を表示するディスプレイ14と、キーボード/マウス等の入力装置15等も有する。また、特に図示しないが、開発支援装置ローダ10は、CPU/MPU等の演算処理プロセッサも有している。記憶部20には、予め不図示のアプリケーションプログラムが記憶されている。上記CPU/MPU等が、このアプリケーションプログラムを読み出し実行することにより、上記各種機能部11,12、13の機能特に後述する図6や図8に示す処理が実現される。また、記憶部20には、図示の各種データ/プログラム等が記憶される。すなわち、記憶部20には、上記ユーザによって作成された制御プログラムのソースコード21、このソースコード21をコンパイラ機能部11によってコンパイルした結果である機械語オブジェクト23等が格納される。更に、記憶部20には、図示の各種データ、すなわちソースコード識別番号対応表22、変数情報管理表24、POUインスタンスアドレス情報25、POUインスタンスアドレス割付対応表26等が、記憶される。尚、これら各種データについては、後に具体例を参照して説明する。上記各種機能部のうち、まず、インタフェース機能部12は、ユーザが任意の制御プログラムソースコード21を作成する際に作成作業が行い易いように支援する、既存の一般的な機能を有する処理機能部である。例えば上記ディスプレイ14上に所定の入力画面を表示し、ユーザは上記入力装置15を操作してこの入力画面上で任意の制御プログラムを記述する。コンパイラ機能部11は、ユーザによって作成されたソースコード21を、ターゲットPLC30上で動作する機械語オブジェクト23に変換するコンパイルを実行する。通信機能部13は、生成された機械語オブジェクト23を、不図示の通信線を介してターゲットPLC30に送信するダウンロードする。PLCプログラマブルコントローラ30は、プログラム実行管理機能部31、通信機能部32等の各種機能部と記憶部40を有する。また、特に図示しないが、PLC30は、CPU/MPU等の演算処理プロセッサも有している。記憶部40には、予め不図示のアプリケーションプログラムが記憶されている。上記CPU/MPU等が、このアプリケーションプログラムを読み出し実行することにより、上記各種機能部31,32の機能処理が実現される。通信機能部32は、上記開発支援装置10その通信機能部13との通信を行って、例えば上記ダウンロードされる機械語オブジェクト23の受信を行い、これを記憶部40に記憶するこれが図示の機械語オブジェクト41である。また、POUインスタンスアドレス情報25がダウンロードされた場合には、これを記憶部40に記憶するこれが図示のPOUインスタンスアドレス情報42である。プログラム実行管理機能部31は、上記のように開発支援装置10からダウンロードされて記憶部40に記憶された機械語オブジェクト41等の実行を管理する。詳しくは後述する。また、記憶部40メモリの記憶領域の一部は、POUインスタンスメモリ領域43となっている。この領域43内に各変数を割当てる各変数に係るデータ格納領域を割付ける。これらについても詳しくは後述する。ここで、PLCのプログラミングには、プログラムPG、ファンクションブロックFB、ファンクションFCTの3つのPOU要素がある。通常、各POUには1以上の変数が含まれている。上記制御プログラム等をPLC30上で動作させる為には、開発支援装置10でコンパイルする際に、その各POUの各変数をPLC30のメモリ領域43内に割り付けてからアドレスを割り当てる、機械語オブジェクト23を生成する必要がある。コンパイラ機能部11が、上記コンパイルの際にPOU毎にインスタンス毎にその各変数のメモリ割付けを実施している。コンパイラ機能部11は、上記POU毎に各変数をメモリに割付ける際に、各インスタンス毎に、上記のように一塊の領域ブロック;変数割当領域というものとするを確保する。これには、既に説明したように、予備領域も含まれる。つまり、各POUの各インスタンス毎に、各変数の割付領域と予備領域等から成る変数割当領域を割り当てることになる例えば後述する図2参照。そして、本手法では、更に追加変数格納先アドレス領域も確保するこれも上記変数割当領域ブロックに含まれる。例えば、任意の制御プログラムの新規作成時に、そのコンパイルの際に上記メモリ割付けを行うことで、その後にこの制御プログラムの修正/更新時には、そのコンパイルの際に、追加変数があった場合には上記変数割当領域内の予備領域に割り当てるようにする。しかし、追加変数が多い場合等には、上記予備領域では足りない場合がある。つまり、上記確保してあった変数割当領域内に追加変数全てを割当てることが出来ない場合がある。本手法では、この様な場合に備えて上記のように上記変数割当領域内に上記追加変数格納先アドレス領域も確保している。また、各POUの各インスタンス毎に、上記変数割当領域の先頭アドレスやサイズ、その変数等のメモリ割り当て状況を、上記変数情報管理表24、POUインスタンスアドレス割付対応表26に記憶している。尚、上記制御プログラムの修正/更新版のコンパイルの際には、これら管理表24や対応表26を参照することで、既にメモリ割当て済みの変数上述した既存の変数に関しては同じアドレスを割当てることができる。そして、上記予備領域では足りない様な対応できないような変数追加があった場合、PLC30のメモリ領域43内の空き領域に新たな変数割当領域ブロックを確保して、この変数割当領域内に追加変数を割り付けると共に、この追加した変数割当領域の先頭アドレスを追加変数格納先アドレスに書き込ませる。これより、追加変数は追加変数格納先アドレス経由でアクセスすることができる例えば後述する図3参照。ここで、上記コンパイラ機能部11が上記コンパイルの際にPOU毎に各インスタンス毎にその各変数のメモリ割付を行うのは、上記の通りPOUインスタンスメモリ領域43内の任意の記憶領域である。図2に、この様なメモリ割付けの一例を示す。図2に示すように、POUインスタンスメモリ領域43に対してPOU毎インスタンス毎にの変数のメモリ割付けが行われる。図2の例は、2つのファンクションブロックFB1、FB2に関して、FB1は2つ、FB2は1つ、インスタンス化した場合のメモリ割付例である。既に従来等で説明したように、ファンクションブロックFBに関しては、ユーザは、複数回利用することができる。複数回利用する場合は、コンパイラ機能により利用毎のインスタンス化ファンクションブロックの変数をメモリに割り付けるを実施する。従って、上記の例ではFB1は2度利用され、FB2は一度だけ利用されていることになる。そして、変数のメモリ割付けは、各インスタンス毎に行われる。よって、上記の例では、FB2に関してはFB2のインスタンス2、FB1に関してはインスタンス1、インスタンス3のインスタンス化が行われ、これら各インスタンス毎に図示のように変数のメモリ割付けが行われる。コンパイラ機能部11は、ファンクションブロックをインスタンス化する場合、1つの塊ブロック;上記変数割当領域としてメモリを割り付ける。すなわち、例えば図2に示す例のように、各ファンクションブロックをインスタンス化してなる各インスタンス毎に、1つの塊ブロックとしてメモリ領域を割り付ける。図2の例では、インスタンス1、インスタンス2、インスタンス3の3つのインスタンス化が行われるものとし、インスタンス1とインスタンス3はファンクションブロックFB1に係るインスタンス、インスタンス2はファンクションブロックFB2に係るインスタンスである。各インスタンス毎の変数割当領域は、その各変数に対するメモリ割当て領域と予備用領域から成る。図2の例では、予備1と予備2の2つの予備領域が加わる。そして、図示の例ではファンクションブロックFB1に係る変数は変数1と変数2であり、ファンクションブロックFB2に係る変数は変数3と変数4と変数5であるものとしている。これより、図示の通り、インスタンス1とインスタンス3に関しては、変数1と変数2と予備1と予備2とを含む1つの塊ブロックとして図示のようにメモリを割付ける。インスタンス2に関しては、変数3と変数4と変数5と予備1と予備2とを含む1つの塊ブロックとして図示のようにメモリを割付ける。図2に示す例に対して、本手法の場合にはブロック内に更に図3に示すように追加変数格納先アドレスが加わる。すなわち、本手法では、上記図1のPOUインスタンスメモリ領域43に対する各インスタンス毎のメモリ割当ては、例えば図3に示すようになる。本手法では、図3aに示すように、各変数1,2,3,4,5に関するメモリ割当ては、上記図2の例と同様である。一方、2つの予備領域に関しては、予備1のみとなっており、上記予備2の割当て領域には図示のように追加変数格納先アドレスが割当てられている。但し、この例に限らず、予備領域は予備1、予備2の2つのままで更に追加変数格納先アドレスが加わるようにしてもよい。ここで、PLC30の稼働中に、ユーザが開発支援装置10上で変数の追加を伴うプログラム修正例えばバージョンアップしたソースコード21の作成等を行った場合であって、特にPLC30を止めないでPLC30のプログラムの変更を実施するためには、既にメモリに割付けた変数既存の変数のメモリ割付け位置を変更しないようにする必要がある。そこで、本手法では、コンパイラ機能部11は、ソースコード21のコンパイル実行の際に行う上記各インスタンス毎のメモリ割当ての際に、上記管理表24や対応表26に各変数のメモリ割当て状況を登録しておくと共に、予備領域だけでなく上記追加変数格納先アドレスを格納する領域を確保する。新規プログラム新規ソースコード21のコンパイルの際には、基本的には、この追加変数格納先アドレス領域には何もデータは格納されない後述するNULLとなる。そして、後にこの新規プログラムを修正/更新バージョンアップ等したときに、修正/更新版プログラムをコンパイルする際に、追加変数があり且つ予備領域だけでは対応できない場合には、例えば図3bに示す追加変数格納領域追加ブロックを新たに確保すると共に、この追加変数格納領域の先頭アドレスを上記追加変数格納先アドレスが示す領域に格納させる。これについては、詳しくは後に図9を参照して説明するが、PLC30側において、POUインスタンスアドレス情報42開発支援装置10側で生成したPOUインスタンスアドレス情報25をダウンロードしたものを用いて追加変数格納先アドレスが示す領域に、追加変数格納領域の先頭アドレスを格納する。これより、その後は、PLC30では、追加変数格納先アドレス経由で追加変数格納領域の各追加変数にアクセスすることになる。尚、本手法では、予備領域は確保せずに追加変数格納先アドレス領域だけを確保するようにしてもよい。尚、逐一述べないが、各変数に関する領域割当ては、当然、図2の場合と同様に行っている。また、コンパイラ機能部11は、どの変数をどの記憶領域アドレスに割当てたのかを示す情報を、テーブル上記管理表24等に記憶しておく。コンパイラ機能部11は、上記修正版バージョンアップ版等プログラムをコンパイルする際には、特に変数の追加があったPOUのインスタンスに係るメモリ割当てに関しては、既存の変数に関しては上記テーブルを参照することで既に割当てられている記憶領域を変更しないようにする前回コンパイル時と同じアドレスが割当てられるようにする。一方、新たに追加された変数追加変数に関しては、まず上記予備領域への割当てを試みて、割当て可能であれば予備領域を割当てる。図3bに示す例では、ソースコード21において上記ファンクションブロックFB1に関して3つの変数が追加されたものとしている。これら追加された3つの変数を、追加変数1、追加変数2、追加変数3と呼ぶものとする。よって、新たなファンクションブロックFB1に関しては、上記既存の変数である変数1、変数2と、これら追加変数1、追加変数2、追加変数3との合計5つの変数が存在する状態となっている。よって、上記コンパイルの際、新たなファンクションブロックFB1に係るインスタンス1、インスタンス3に関しては、両方とも、5つの変数のメモリ割り当てを行うことになる。そして、上記の通りそして図3bに示す通り、既存の変数1、変数2に関しては図示の通り割当位置は図3aの状態と同じである変わらない。一方、追加変数に関しては、上記3つの追加変数のうちの1つここでは追加変数1とするは予備領域への割当てが可能であるが、他の2つの追加変数ここでは追加変数2,3を割当てることはできない。この様に予備領域では対応できないような変数の追加が行われた場合には、POUインスタンスメモリ領域43内の空き領域に、当該インスタンス用の新たな変数記憶領域追加変数格納領域/追加ブロックというを確保し、当該追加ブロックのアドレス先頭アドレス等を上記追加変数格納先アドレスが示す領域に格納させる。そして、当該追加ブロック内に上記他の2つの追加変数ここでは追加変数2,3を割当てる。これより、例えば図3bに示す状態となる。ここで、既に述べた通り、各インスタンス毎に1つの塊ブロックとしてメモリ領域を割付けるものである為、上記新たな変数記憶領域追加ブロックにおいても、追加変数2,3だけでなく、予備領域予備1及び追加変数格納先アドレス領域も確保されることになる。また、本例ではFB1は2つインスタンス化されているため、インスタンス毎に、予備領域では対応できない追加変数の格納領域を確保する必要がある。この為、図3bに示す通り、FB1のインスタンス1の追加変数格納領域と、FB1のインスタンス3の追加変数格納領域とが、新たに確保されることになる。このようにすることで、最初に各インスタンス毎に1つの塊として割付けられるメモリ領域初期ブロックというでは、全ての追加変数を割当てることができない場合でも、POUインスタンスメモリ領域43内に空き領域が存在する限りは、追加変数格納領域追加ブロックを確保することで、追加変数のメモリ割当てが可能となる。これは、既に存在する変数の割り当て位置は、変更しないで、追加変数のメモリ割当てを殆ど制限なしに勿論、領域43の空き領域が無くなれば駄目であるが行うものとなる。変数の追加の制限を撤廃し、PLCを停止しないでプログラムの変更が実施できる。コンパイラ機能部11は、ユーザが記述したプログラムソースコード21をコンパイルする際に、当該プログラムにおける各POU毎に、そのPOUが使用している変数の情報管理のため、変数情報管理表24を作成する。変数情報管理表24には、各変数毎に、変数の名前、型サイズ、割当位置を示す相対位置などの情報が存在する。図4a~cに、変数情報管理表24の具体例を示す。図4a、bは、上記ファンクションブロックFB1に関する変数情報管理表24の具体例であって、図4aは図6の新規コンパイル後、図4bは図8の修正版等コンパイル後の状態を示す。このようなデータ例については、後に図6や図8の説明の際に説明するものとし、ここでは変数情報管理表24のフォーマットについてのみ説明するものとする。尚、図4cは後述するファンクションブロックFBCALLに関する変数情報管理表24の具体例である。図4a~cに示すように、変数情報管理表24のフォーマットは、変数名51、型52、相対位置53、及び格納先ブロック54の各データ項目より成るものである。尚、特に図示説明しないが、各変数情報管理表24には、どのPOUの変数情報管理表であるのかを示す情報も含まれている。変数名51には、図示の変数1、変数2等の変数名等名前に限らず、識別番号等であってもよいが格納される。図4a,bの例の場合はファンクションブロックFB1で使用する各変数の変数名が、変数名51に格納されることになる。但し、変数名51には、変数名等に限らず、図示のように予備領域、追加変数格納先アドレス等も格納される。これら名称やサイズは予め決められているものであり、上記各変数名等の格納が完了したら、続いてこれらの所定の名称や使用領域サイズを変数名51や型52に格納する。詳しくは後述する。型52には、変数名51に変数名等が格納されている場合には、当該変数名の変数の型と使用する記憶容量使用領域のサイズとが格納される。例えば、変数1は、INT型であって使用領域サイズが1Wワードであることになる。変数2は、WORD型であって使用領域サイズが1Wワードであることになる。また、型52には、変数名51に変数名以外が格納されている場合には、使用領域サイズのみが格納される。図示の例では、予備領域に関しては使用領域サイズが2Wワードとなっており、追加変数格納先アドレスに関しても使用領域サイズが2Wワードとなっている。相対位置53には、上記各使用領域の相対アドレスが格納されている。これは、後述する先頭アドレス63からの相対位置を意味する。つまり、各インスタンス毎に、そのインスタンスに係るブロックの先頭アドレス63と上記各変数の相対位置53とによって、そのインスタンスで使用する各変数の割当位置を示す実アドレスが、分かることになる。例えば、変数2の相対位置53は‘1’であり、図4aはファンクションブロックFB1の例であるので、仮にインスタンス3であった場合には先頭アドレス63は‘1018’番地であることから、変数2の割当位置の実アドレスは、‘1018’番地1=‘1019’番地であることになる。また、この例の場合、予備領域の使用領域の実アドレスは、‘1018’番地2=‘1020’番地であることになる。ここで、予備領域の型51使用領域サイズは上記の通り2Wワードであるので、予備領域の使用領域は、‘1020’番地~‘1021’番地ということになる。格納先ブロック54は、変数名51の変数等を格納するブロックを示すものである。すなわち、上記の通り、各インスタンス毎に、最初に1つのブロック初期ブロックを確保し、その後、修正版プログラム等のコンパイルの際に場合によっては追加ブロックを確保することになるが、変数名51の変数の割当位置が、初期ブロック内であるのか追加ブロック内であるのかを示す情報が、格納先ブロック54に格納されている。図3aに示す例では、インスタンス1,2,3の全てが初期ブロックのみである。一方、図3bに示す状態では、インスタンス2は初期ブロックのみであるが、インスタンス1,3は各々追加ブロックが新たに確保される為、2つのブロックを有するものとなっている。この例の場合、格納先ブロック54は、変数名51の変数等の割当位置が、これら2つのブロックのうちのどちらのブロック内であるのかを示すものとなる。本例では、格納先ブロック54が‘0’の場合は初期ブロック、格納先ブロック54が‘1’の場合は追加ブロックであることを示すものとする。尚、この例に限らず、例えば1つの追加ブロックだけでは足りずに2つ目の追加ブロックが確保された場合には、例えば格納先ブロック54が‘2’の場合には2つ目の追加ブロックを示すものとしてもよい。尚、特に詳細には説明しないが、後述する変数宣言部分には、図4cに示すように変数名としてFB1インスタンス、型としてFB12等といった情報も含まれていてもよい。尚、これはFB呼出しに係る情報であり、この例ではFBCALLがFB1を呼び出すことになるが、ここでは特に関係ないので、これ以上詳細には説明しない。また、コンパイラ機能部11は、コンパイル時に変数をPLC30のメモリに割り付ける際、変数情報管理表24を元に、POUインスタンスアドレス割付対応表26を作成する。当該対応テーブル26の一例を図5a、bに示す。図5aは図6の処理後、図5bは図8の処理後の状態を示す。ここでは、POUインスタンスアドレス割付対応表26のフォーマットのみについて説明するものとし、内容等の説明は図6、図8の説明の際に説明する。図5a、bに示すように、POUインスタンスアドレス割付対応表26は、インスタンス番号61、POU名62、先頭アドレス63、インスタンスサイズ64、追加変数格納先アドレス65、追加変数格納先サイズ66の各データ項目より成る。まず、上記の通り、各POU毎に1以上のインスタンスが生成されるものであり、インスタンス生成毎にそのインスタンスに識別番号を割付ける。ここでは、インスタンス番号は、インスタンス生成毎に‘1’から順にシリアルに番号が付されるものとする1インクリメントされる。ここでは上記インスタンス1,2,3の識別番号が、‘1’、‘2’、‘3’であるものとする。よって、図示のインスタンス番号61=‘1’、‘3’のレコードは、上記インスタンス1、3に関する情報であり、従ってそのPOU名62は両方とも図示の通りFB1となっている。先頭アドレス63及びインスタンスサイズ64には、インスタンス番号61のインスタンスに割当てられた上記初期ブロックの先頭アドレス実アドレスとサイズが格納される。ここで、例えば、最初に生成されたインスタンスである上記インスタンス1に関しては、その先頭アドレスには予め決められたデフォルト値=1000番地が割り当てられるものとする。また、FB1に関しては、図4bに示す例ではそのブロック全体のサイズは6Wワードであるので、インスタンスサイズ64=‘6’となっている。つまり、インスタンス1に割当てられる初期ブロックの領域は、1000番地~1005番地となっている。これより、次に生成されたインスタンス2に関しては、その先頭アドレス63は1006番地1005番地1あるいは1000番地6となる。また、追加変数格納先アドレス65及び追加変数格納先サイズ66には、上記追加変数格納領域追加ブロックの先頭アドレス実アドレスとサイズが格納される。尚、追加変数格納先アドレス65及び追加変数格納先サイズ66は、上記追加ブロックの数の分だけ存在する。ここでは、未だ追加ブロックは存在しないので、追加変数格納先アドレス65及び追加変数格納先サイズ66には図5aに示すようにNULL及び‘0’が格納される。図2の例では、FB1についてはインスタンス1,3、FB2についてはインスタンス2の合計3つのインスタンス化が成されている。インスタンス1のメモリ割付けを実施する時、POUがFB1なので、FB1の変数情報管理表24から、インスタンス化に必要なサイズブロックのサイズを算出する本例では6Wワード。このサイズを元に、PLC30のメモリそのPOUインスタンスメモリ領域43にインスタンス1のブロックの領域を確保する。同様にして、インスタンス2のPOUはFB2なので、FB2の変数情報管理表24から、インスタンス化に必要なサイズブロックのサイズを算出し、このサイズを元に上記インスタンス2のブロックの領域を確保する。上記の処理を、インスタンスの数分繰り返し実施する。POUインスタンスアドレス割付対応表26には、各インスタンスの割当て領域ブロックの先頭アドレスとサイズが設定される。図5aの段階では、初期ブロックの先頭アドレス63とサイズ64が設定される一方で、追加ブロックは未だ存在しないので、追加変数格納先アドレス65には無効を示すNULL情報が設定されると共に、追加変数格納先サイズ66には‘0’が設定される。ユーザが、変数の追加を伴う修正版/更新版のバージョンアップ版等のソースコード21を作成してコンパイルの実施を指示操作した時、コンパイラ機能部11は、各POU毎に、追加変数がある場合にはまず当該追加変数を予備領域に割付けるようにする。予備領域で収まる場合は、変数情報管理表24を更新し追加変数のメモリ割当て情報を追加し、予備領域のサイズ型52を減らすと共に予備領域の相対位置53を変更する。予備領域では収まらないような変数の追加が行われていた場合、コンパイラ機能部11は、空き領域に追加ブロックの領域を確保すると共に、この追加ブロック領域内に追加変数を割当てる。また、確保した追加ブロックの領域の先頭アドレスとサイズを、追加変数格納先アドレス65、追加変数格納先サイズ66に格納する。これによって、例えば、図5aの状態から図5bの状態へと移行することになる。図5bの例では、FB1に関しては予備領域では対応できないような変数の追加が行われた為に、FB1の各インスタンス1,3に関しては追加ブロックが新たに確保され、各追加ブロックの先頭アドレスとサイズが、図示のように格納される図示の例ではアドレス65が‘1034’と‘1044’。尚、この追加ブロックについても、初期ブロックと同様に、変数の格納領域だけでなく、予備領域や上記追加変数格納先アドレスの領域が含まれるようにしてもよい。以下、図6、図8のフローチャート図を参照して、上述したコンパイラ機能部11の処理についてより詳細に説明する。図6は、新規作成されたソースコード21のコンパイル時の処理を示す。図8は、既存のソースコード21の一部を修正/更新等特に変数の追加を伴う修正/更新して成る修正版バージョンアップ版のソースコード21のコンパイル時の処理を示す。まず、図6の処理について説明する。図6において、まず、コンパイル対象のソースコード21に記述されている各POU毎に、そのソースコードに基づいてコンパイル変数宣言処理を行うことになる。すなわち、各POUのソースコードは、大別して、変数宣言部分と本文部分とから成るものであり、当該コンパイル変数宣言処理では、この変数宣言部分を参照してステップS12~S15の処理を行うものである。尚、特に図示しないが、変数宣言部分には、各変数の名称と型が宣言されており、更にそのPOUの名称POU名;プログラム作成者が任意に決めているも記述されている。図6の処理では、全POUについてコンパイル変数宣言処理済みであるか否かを判定しステップS11、未だコンパイル変数宣言処理を行っていないPOUがある場合にはステップS11,NO、当該未処理のPOUのうちの1つを処理対象として、コンパイル変数宣言処理ステップS12~S15の処理を実行する。すなわち、処理対象POUのソースコードの上記変数宣言部分を読み込みステップS12、これに基づいてソースコード識別番号対応表22と変数情報管理表24を作成するステップS13~S15。すなわち、まず、上記ステップS12で読み込んだPOUのソースコードの上記変数宣言部分に基づいて、ソースコード識別番号対応表22にPOU名と識別番号を登録するステップS13。そして識別番号を更新するステップS14。ここで、図7に、ソースコード識別番号対応表22の具体例を示す。図示の例のソースコード識別番号対応表22は、POU名71、識別番号72の各データ項目より成る。POU名71には、上記処理対象POUのソースコードの上記変数宣言部分から得られるPOU名等そのPOUの識別情報が格納される。識別番号72には、POU名71のPOUに対して任意に割り当てた識別番号が格納される。ここでは識別番号の初期値を‘1’とし、上記ステップS14の処理で1インクリメントする更新を行うものとし、それによって図7に示すように識別番号72は1,2,3,4等となっている。上記ステップS14の処理に続いて、上記処理対象POUに関する変数情報管理表24を作成するステップS15。すなわち、まず、予め設定されている変数情報管理表24の雛形図4aは作成済みの状態を示すが、雛形では未だデータは何も格納されていないを取得して、これに上記処理対象POUのPOU名/識別番号を付与すると共に、この処理対象POUのソースコードの上記変数宣言部分に記述されている各変数に関する情報上記のように変数名や型などを、上記取得した雛形に登録する。例えば図4aに示す例は、処理対象POUがFB1であり、そのソースコードの変数宣言部分に最初に記述されている変数の変数名は変数1であり、その型はINT型であり、そのサイズは1Wワードであったものとしている。それ故に図示のように変数名51と型52に、それぞれ、変数1、INT1が登録される。また、最初に登録される変数に関してはその相対位置53は必ず‘0’とする。尚、図6の処理では初期ブロックへの割当てになるので、逐一述べないが、格納先ブロック54は図4aに示すように全てのレコードで‘0’となる。また、ここでは、変数宣言部分に2番目に記述されている変数の変数名は変数2であり、その型はWORD型であり、そのサイズは1Wワードであったものとしている。これより、図示のように変数2に関しては、変数名51と型52に、それぞれ、変数2、WORD1が登録される。そして、相対位置53に関しては、1つ前のレコードにおける型52そのサイズに相対位置53を加算した値を登録する。ここでは、1つ前のレコードの型52はINT1、相対位置53は‘0’であるので、10=1が、図示の通り変数2のレコードの相対位置53に登録されることになる。そして、全ての変数の登録が完了したら、続いて、変数名51に所定の名称予備領域と追加変数格納先アドレスをそれぞれ登録すると共に、それぞれに対応する所定のサイズ予め決められているを型52に登録する。図示の例では両方ともサイズ=‘2’となっている。そして、上記変数2の場合と同様にして相対位置53を算出して登録する。これは予備領域に関してはWORD11=2が登録され、追加変数格納先アドレスに関しては22=4が登録されることになる。尚、上記処理の際に、更に、最後のレコード追加変数格納先アドレスのレコードにおける型52そのサイズに相対位置53を加算した値を、当該対象POUここではFB1に関する上記ブロックの全体サイズとして算出しておき、これを後述するPOUインスタンスアドレス割付対応表26の作成の際にそのインスタンスサイズ64に登録するようにしてもよい。上記の例では、追加変数格納先アドレスのレコードおける型52そのサイズは‘2’、相対位置53は‘4’であるので、このブロックの全体サイズ=24=6が求められ、これによって図5aの例ではFB1に関するインスタンスサイズ64は‘6’となっている。コンパイル対象のソースコード21に記述されている全てのPOUに関して上記コンパイル変数宣言処理を実行したならばステップS11,YES、続いて、当該全てのPOUについてステップS17~S20によるインスタンス化処理を実行する。これは、ソースコード21例えばPGを先頭から順次参照していき、POUFBやFCT呼び出しの記述がある毎に更に呼び出されたPOUに更に他のPOUの呼び出しの記述がある毎に当該呼び出されるPOUのインスタンス化を実行する。例えば、上記の例では例えばPGにおいてFB1呼出し、FB2呼出し、FB1呼出しの記述があった場合、上記一例のようにFB1に関しては2回のインスタンス化でインスタンス1とインスタンス3が得られ、FB2に関しては1回のインスタンス化でインスタンス2が得られることになる。ソースコード21に記述されている全てのPOUについてインスタンス化処理を実行したらステップS16,YES、ステップS21以降の処理へと移行する。以下、ステップS17~S20の処理インスタンス化処理について説明する。このインスタンス化処理は、上記各POU毎のインスタンス毎に、その上記ブロックのメモリ領域を確保すると共に、このブロック領域の先頭アドレス実アドレスとサイズをPOUインスタンスアドレス割付対応表26に登録する処理である。まず、処理対象POUに関する上記変数情報管理表24を読み込むステップS17。そして、処理対象POUに関して確保すべきメモリ領域全体の上記ブロックのサイズを計算するステップS18。この計算方法は既に述べた通りであり、上記の通り対象POUがFB1の場合には全体サイズブロックサイズ=‘6’が算出されることになる。続いて、POUインスタンスアドレス割付対応表26を参照して空きアドレスを検索するステップS19。これは、例えば上記確保すべきブロックの先頭アドレスを求めるものである。例えば、FB1に関する2回目のインスタンス化の場合、図5bの例では4つのレコードが登録されているが、ここではそのうちの最初の2つのレコードのみがPOUインスタンスアドレス割付対応表26に登録されている状態となっていることになる。つまり、インスタンス番号61が‘1’である先頭レコードと‘2’である2番目のレコードとが登録されている状態である。この状態で上記FB1に関する2回目のインスタンス化処理が行われる場合、POU名は当然FB1であり、またインスタンス番号=‘3’が割り当てられ、FB1に関する全体サイズは上記の通り‘6’が算出されているので、当該インスタンス3のブロックの領域の先頭アドレスが分かれば、POUインスタンスアドレス割付対応表26への新規登録が行える。この先頭アドレスは、現時点での最後のレコードここでは2番目のレコードにおける先頭アドレス63にインスタンスサイズ64を加算することで求められる。2番目のレコードの先頭アドレス63は‘1006’、インスタンスサイズ64は‘12’であるので、100612=1018が算出される。以上得られた情報を、図示の通り、3番目のレコードにおけるインスタンス番号61、POU名62、先頭アドレス63、インスタンスサイズ64に格納する。更に、既に述べたように追加変数格納先アドレス65にはNULLが格納され、追加変数格納先サイズ66には‘0’を格納する。このようにしてPOUインスタンスアドレス割付対応表26に新規レコードを登録したらステップS20、ステップS16に戻り、全てのインスタンス化が行われたか否かを判定し、全インスタンス化が完了したならばステップS16,YES、ステップS21の処理へ移行する。上記インスタンス化処理が完了したら、最後に、コンパイル対象のソースコード21における各POU毎にコンパイルコード処理を行う。既に説明したコンパイル変数宣言処理は上記変数宣言部分に基づく処理であったが、コンパイルコード処理は上記本文部分を機械語に変換する処理である。特に例示はしないが、本文部分には、上記変数宣言部分で宣言された各種変数を用いた任意の処理が記述されており、これを機械語に変換する際にアドレス割り当てを行う必要がある。ステップS21では全てのPOUインスタンスについてコンパイルコード処理を実行したか否かを判定し、全POUインスタンスについて実行済みならばステップS21,YES本処理を終了する。一方、未処理のPOUインスタンスがあるならばステップS21,NO、そのうちの1つを処理対象として、基本的には、この処理対象POUのソースコード本文部分を読み込みステップS22、このソースコードを機械語に変換するものであるステップS26。但し、ステップS26の処理の前に、POUインスタンスアドレス割付対応表26の読込みステップS24、及び処理対象POUに関する変数情報管理表24の読込みを行ったうえでステップS25、これらを参照して変数のアドレス解決処理を行いステップS23、以って1POU分の機械語オブジェクト生成を行うステップS26。すなわち、まず、処理対象POUのPOU名を用いてPOUインスタンスアドレス割付対応表26を検索して、該当するレコードを見つける毎に、そのレコードの先頭アドレス63や追加変数格納先アドレス65等を用いて、更に変数情報管理表24も参照して、変数のアドレス解決処理を行う。尚、上記該当するレコードとは、そのPOU名62が、上記処理対象POUのPOU名と同一であるレコードである。基本的には、上記該当レコードの先頭アドレス63と、各変数毎の型52及び相対位置53とによって、各変数のアドレス解決が実現されるが、上記追加変数格納領域に格納される変数に関しては更に追加変数格納先アドレス65等を用いる処理が必要となる。詳しくは後述する。上記変数のアドレス解決及び機械語への変換処理については、後に具体例を用いて説明するものとする。次に、図8の処理について説明する。尚、図8では省略しているが、図示のステップS31の判定がYESとなった場合には、更に続いて図6のステップS21~S26の処理を実行する。図8の処理の場合、既に述べた通り、コンパイル対象は上記修正版/更新版バージョンアップ版等のソースコード21である。これは例えば人間が判断して指定することで図6と図8の何れかの処理が実行されるようにしている。つまり、特に図示しないが、ユーザがコンパイル処理を指示する操作ボタンには、新規用と修正版用の2種類あり、ユーザが新規用を操作した場合には図6の処理が実行され、修正版用を操作した場合には図8の処理が実行される。あるいは、ユーザが特に指定しなくても開発支援装置ローダ10が自動的に図6、図8のどちらの処理を実行するのかを判断するようにしてもよい。これは、例えばオンラインの場合には図8の処理を実行し、オフラインのときには図6の処理を実行するようにしてもよい。尚、オンラインの場合とは、PLCを保守する為に開発支援装置ローダ10がPLC30に接続され且つ両者の通信が確立しているときである。上記修正版のソースコード21のコンパイル時にその各POU毎に本処理ステップS32~S39の処理を実行し、全てのPOUについて本処理を実行済みとなったらステップS31,YES、本処理を終了する上記ステップS21~S26の処理に移行するものである。未処理のPOUがある場合、そのうちの1つを処理対象として、当該処理対象POUのソースコードを読み込みステップS32、更に当該処理対象POUに関する上記変数情報管理表24を読み込みステップS33、これらに基づいて追加変数があるか否かを判定するステップS34。すなわち、ステップS32で読み込んだソースコードの変数宣言部分に記述されている全ての変数名を取得して、これらの変数名が全て上記変数情報管理表24の変数名51に登録されているか否かをチェックする。未登録の変数が1つも無い場合には、追加変数は存在しないと判定しステップS34,NO、ステップS31に戻る。一方、未登録の変数がある場合には、当該未登録の変数が追加変数ということになり、ステップS34の判定はYESとなり、ステップS35へ移行する。ステップS35では、全ての追加変数を予備領域に割付可能か否かを判定する。これは、まず、各追加変数の型を上記ソースコードから抽出する。型は上記INT、WORD等であり、型によってその変数のサイズ占有領域が決まるものである。上記の例では、INT、WORDは両方とも、サイズ占有領域が1Wワードとなるものである。上記型によって、各追加変数のサイズが分かるので、これらの合計を求めることで追加変数全体のサイズが分かる。一方、ステップS33で読み込んだ変数情報管理表24において、変数名51が予備領域のレコードにおける型52を取得することで、予備領域のサイズが分かる。図4aの例では予備領域のサイズは‘2’であることになる。そして、上記追加変数全体のサイズが、予備領域のサイズ以下であるならば、ステップS35の判定はYESとなり、ステップS36の処理を実行する。ステップS36では、追加変数のメモリ割当てを行い、それに伴って変数情報管理表24を更新する。例えば、図4aの例に対して、例えば追加変数が1つだけであり仮に、変数名を追加変数1とする、且つ、その型がINTであったとしたならば、追加変数全体のサイズ占有領域は1Wワードであり、予備領域のサイズは‘2’であることから、上記ステップS35の判定はYESとなる。そして、この例では、特に図示しないが、図4aに示す変数2のレコードの次のレコード空きレコードに、追加変数1に関する登録を行う。すなわち、特に図示しないがこのレコードでは、変数名51が追加変数1、型52がINT1、相対位置53が‘2’、格納先ブロック54が‘0’となる。尚、相対位置53の求め方は既に述べた通りである。これに伴って予備領域の確保分を削減しなければならないので、図4aに示す予備領域のレコードの型52と相対位置53を更新する。型52は‘2’であったが、上記追加変数のサイズである1Wワードを差し引くことで、‘1’に更新されることになる。また、相対位置53は‘3’となる。尚、相対位置53の求め方は既に述べた通りである。一方、例えば追加変数が2つあって仮に追加変数1と追加変数2とする、各サイズ占有領域が2Wワードであった場合、合計で4Wワードとなる為、上記予備領域では対応できず、ステップS35の判定はNOとなる。尚、ここでは型がDINTである場合には、2Wワード必要であるものとする。ステップS35がNOの場合には、上記追加変数格納領域追加ブロックを確保すると共に、当該追加ブロック領域のアドレス情報や追加変数の割当て情報を、上記各種テーブル24、26管理表24、対応表26などに登録する。まず、変数情報管理表24に拡張用の情報を追加するステップS37と共に追加変数を登録するステップS38。これによって、例えば図4aに示す例の変数情報管理表24は、図4bに示す状態になる。図示のように拡張用の情報レコードは、格納先ブロック54を全て‘1’とすることで、上記追加変数格納領域追加ブロックにおける割当て情報であることを示す。追加ブロックの場合も、初期ブロックに関する割当て情報図4aに示すものと同様に、変数だけでなく、予備領域及び追加変数格納先アドレスの領域も確保して、図示のように相対位置53と型52サイズを登録する。そして、追加変数を割当てるが、これはまず初期ブロックの予備領域への割当てを試みて、割当て可能であるならば初期ブロックの予備領域への割当てを行う。本例では、追加変数1,2の両方を初期ブロックの予備領域に割当てることは出来ないが、追加変数1のみは割当て可能なので、図4bに示すように追加変数1は初期ブロックの予備領域への割当てを行う。これによって初期ブロックでは予備領域は無くなることになる。尚、追加変数1の初期ブロックへの割当て処理は、上記ステップS36と略同様であってよい。但し、本例ではこれによって初期ブロックの予備領域の型52が‘0’になるので、この場合には初期ブロックの予備領域のレコードを削除する。一方、この例では追加変数2は、初期ブロックに割当てることはできないので、追加ブロック内に割当てる。よって、図示の通り、追加変数2に関するレコードの格納先ブロック54は‘1’となっている。この点を除けば、追加変数2の追加ブロック内への割当て処理は、上記変数1、2の初期ブロックへの割当て処理と略同様であり、ここでは詳細には説明しないが、図示の通り、型52にはDINT2が登録されると共に、相対位置53には‘0’が登録されることになる。尚、予備領域や追加変数格納先アドレスのサイズは、予め任意に決められて設定されているものとし、ここでは予備領域のサイズは、初期ブロックに関しては‘2’であるが、追加ブロックに関しては‘8’が設定されているものとしている。追加変数格納先アドレスに関して、初期ブロック、追加ブロックどちらもサイズ=‘2’となっている。以上、変数情報管理表24の更新を行ったら、続いて、POUインスタンスアドレス割付対応表26の更新を行うステップS39。すなわち、図5aではNULLで‘0’としていた追加変数格納先アドレス65及び追加変数格納先サイズ66に、上記追加ブロックの領域の先頭アドレスとサイズを登録する。これによって例えば図5bに示す状態となる。尚、追加変数格納先サイズ66は、上記インスタンスサイズ64と同様に、変数情報管理表24に基づいて求めることができる。また、追加変数格納先アドレス65は、既に確保済みの領域のなかで最後のブロックの領域情報、すなわち図示の例ではPOU名がPG1のブロックの先頭アドレス63=1024とインスタンスサイズ64=10とに基づいて、102410=1034が求められることになる。尚、上記ステップS36またはS39の処理後は、ステップS31に戻る。上記図8の処理が完了したら、図6におけるステップS21~S26の処理を実行することになる。当然、この場合には、例えば図4bと図5bに示す状態のテーブル24、26を参照して、処理実行することになる。以上、図8の処理について説明した。ここで、上述してあった通り、上記ステップS23~S26の処理について、以下、具体例を示して説明する。換言すれば、コンパイラの機械語コード生成例について以下に説明する。まず、以下の何れの例においても、本説明で用いるソースコードは、下記のような単純な例であるものとする。ソースコード例;変数2:=変数1;すなわち、変数1の値を変数2に代入するという単純な処理である。まず最初は、上記ソースコード例がプログラムPG1に記述されたものであるとする。この場合、まずPOUインスタンスアドレス割付対応表26図5bを参照することで、PG1の先頭アドレス1024が得られる。また、変数情報管理表24を参照することで、変数1、変数2それぞれのオフセットアドレス相対位置が得られる。図4等にはPG1に関する変数情報管理表24の具体例は図示していないが、仮に、変数1の相対位置53が‘0’、変数2の相対位置53が‘2’であったとするならば、上記PG1の先頭アドレス1024に、これら各変数のオフセット値を足した値が、各変数の実アドレスとなる。すなわち、10240=1024が変数1の格納アドレス実アドレスとなる。同様に、10242=1026が変数2の格納アドレス実アドレスとなる。以上のことからPG1の場合、上記ソースコード例に応じた機械語例は、以下のようになる。LDB1024STB1026尚、よく知られているように、LD命令は、指定したアドレスの内容を演算用メモリに読み込む命令である。ST命令は、演算用メモリの内容を指定したアドレスに書き込む命令である。更に、LD命令と指定アドレスここでは1024との間の‘B’は、領域サイズを指定する為のオプションであり、‘B’は1バイト分を意味する。尚、同様にして、Wは2バイト分、Tは4バイト分を意味する。よって、上記LDB1024は1024番地から1バイト分の領域の内容を演算用メモリに読み込むことを意味する。これはST命令に関しても同様である。尚、例えばLDW1024は1024番地から2バイト分の領域つまり1024番地~1025番地の格納データを演算用メモリに読み込むことになる。プログラムPGの場合は、1POUが1つだけインスタンス化されるため、変数にアクセスするコードを直接アドレス実アドレスで機械語を生成しても問題が無いが、FBの場合、1つのPOUが複数インスタンス化されるため問題が発生する。例えば上記の例でFB1の場合には、図4、図5に示す例より、上記ソースコード例に応じた機械語例は、以下のようになる。LDB1000STB1001FB1に関して1つだけインスタンス化されるならば、これでも問題はないが、上記の通り、複数インスタンス化された場合、全てのインスタンスが同じアドレスへアクセスするためLDでは1000番地、STでは1001番地、FB内の変数の独立性が保てないFB内の内部変数は、独立していることが規約で定められている。そこで、コンパイラ機能部11は、コンパイル対象POUがFBここではFB1の場合には、例えば下記のようにベースポインタ経由で変数にアクセスする機械語を生成する。LDBBase0STBBase1ここで、各FBの実行時には、上記Baseポインタにはインスタンスの先頭アドレスが入ることになり図4、図5の例の場合、インスタンス1の場合にはBase=1000、インスタンス2の場合にはBase=1018が代入されることになる、これはFBを呼び出すPOUが設定するものである。以下、まず、FB1を呼び出すPOUが、PGである場合について、具体的な機械語コードの生成例を示して説明する。PGからFB1ここではFB1のインスタンス1を呼び出す場合の例を、以下に示す。この場合、コンパイラ機能部11はコンパイル時に、上記各種テーブル22、26等を参照して、上記PGからFB1を呼出すと共にその際に上記Baseポインタの設定を行う機械語コードを生成する。すなわち、基本的に、任意のFBそのインスタンスを呼び出す場合は、その識別番号POUの識別番号とインスタンスアドレス先頭アドレスが必要である。これより、まず、図7に示すソースコード識別番号対応表22を参照して、呼び出すFBここではFB1の識別番号72ここでは‘1’を取得する。また、インスタンスアドレスは、上記POUインスタンスアドレス割付対応表26から取得する。図5の例では、FB1のインスタンス1の先頭アドレス63は‘1000’となっている。これより、PGにおけるFB1インスタンス1を呼び出しに係る機械語コードが、以下のように生成されることになる。LDT1000STBaseCALL1尚、LD1000は1000番地のデータを演算用メモリに読み込むものであるが、上記LDT1000は、Tの後の数値ここでは1000を演算用メモリに読み込むものである。従って、上記機械語は、‘1000’を取得して、これをBaseに代入した後、FB1を呼び出す処理となる。そして、この場合、呼び出されたFB1の上記機械語の処理は、実質的に以下の内容と同等となる。LDB10000STB10001尚、CALL命令は、識別番号ここでは‘1’によって指定されたPOUを呼び出す命令である。尚、同じFB1を用いる場合でも、インスタンス3の場合には、以下の機械語が生成されることになる。LDT1018STBaseCALL1この場合、呼び出されたFB1の上記機械語の処理は、実質的に以下の内容と同等となる。LDB10180STB10181PGの場合、上記LD1000のように直接アドレス実アドレスをコード上に記述することができる。呼び出し元がFBの場合も、上記と略同様であってよいので、ここでの説明は省略する。次に、以下、追加変数へのアクセスに係わる機械語コード生成例について説明する。例えば、下記のソースコードをコンパイルして機械語コードを生成する例を用いて説明する。ソースコード例;追加変数2:=変数2;つまり、変数2の内容を追加変数2に代入する処理である。尚、特に説明しないが、本例においても当該FBの呼出元のPOUが、Baseの値を設定している。尚、本例のFBは、上記FB1であるものとする。そして、FB1に係る変数情報管理表24は、図4bに示す状態となっているものとする。この場合、図4bに示すFB1の変数情報管理表24を参照して、まず、変数2に関しては、格納先ブロック54が‘0’であるので、初期ブロックに格納されていると判定し、そのオフセット相対位置53が‘1’であることから、変数2に対応するアドレスはBase1であると決定する。従って、上記ソースコード例ではまず変数2に対応するアドレスの格納データを読み出すことになるので機械語コードLDBase1が生成される。続いて、追加変数2に関しては、図4bに示すFB1の変数情報管理表24の例では格納先ブロック54が‘1’であるので、追加変数格納先アドレス1経由でアクセスするものと判定すると共に、そのオフセット相対位置53=‘0’を取得して一時的に記憶する。そして、変数情報管理表24において変数名51が追加変数格納先アドレス1であるレコードを参照することで、そのオフセット相対位置53が‘4’であることから、対応するアドレスはBase4であると判定する以上の処理に基づいて、下記の機械語コードを生成することになる尚、以下の例では上記BやW等は省略している。LDBase1LDAXBase4ADDAX0STAX尚、上記機械語コードにおいて、LDAX命令は、指定されたアドレスの格納データを、AXレジスタアドレス演算用の内部変数にセットする命令である。上記の例の場合、アドレスBase4の格納データを、AXレジスタにセットすることになる。FB1のインスタンス1の場合、Base=1000が設定されているはずであるので、アドレス1004の格納データを、AXレジスタにセットすることになる。尚、アドレス1004には予めインスタンス1に係わる追加ブロックの先頭アドレス本例では‘1034’が格納されている。これについては後に図9を参照して説明する。なお、FB1のインスタンス3の場合、Base=1018が設定されているはずであるので、アドレス1022の格納データを、AXレジスタにセットすることになる。尚、アドレス1022には予めインスタンス3に係わる追加ブロックの先頭アドレス本例では‘1044’が格納されている。これについても後に図9を参照して説明する。また、ADDAX命令は、AXレジスタの格納内容に、指定した数字を加算する命令であり、上記機械語においては追加変数2の格納アドレスを演算している。インスタンス1の場合には、アドレス1004の格納データ‘1034’に‘0’が加算された値が、AXレジスタの新たな格納データとなる。インスタンス3の場合には、アドレス1022の格納データ‘1044’に‘0’が加算された値が、AXレジスタの新たな格納データとなる。また、上記STAXは、AXレジスタの格納データが示すアドレスに、上記1行目のLD命令でロードしたデータ変数2のデータを格納する命令である。従って、本例では、インスタンス1の場合にはアドレス‘1034’に変数2のデータを格納することになり、インスタンス3の場合にはアドレス‘1044’に変数2のデータを格納することになる。ここで、上記アドレス1004や1022には、予めPLC30が、開発支援装置10から機械語オブジェクト23と共にダウンロードされたPOUインスタンスアドレス情報25に基づいて、該当データを設定しておく。図9に、上記図4b、図5bの例に応じたPOUインスタンスアドレス情報25の一例を示す。図9の例のPOUインスタンスアドレス情報25は、アドレス81と値82から成る。アドレス81には追加変数格納先アドレスのアドレスが格納され、値82には追加変数格納領域の先頭アドレスが格納される。図4bに示すFB1の変数情報管理表24では追加変数格納先アドレスのオフセット相対位置53が‘4’である。また、図5bのPOUインスタンスアドレス割付対応表26の例では、FB1によるインスタンス1の先頭アドレス63は‘1000’、追加変数格納先アドレス65は‘1034’となっており、FB1によるインスタンス3の先頭アドレス63は‘1018’、追加変数格納先アドレス65は‘1044’となっている。これより、図9に示すように、アドレス81が‘1004’=10004に対して値82が‘1034’となっており、アドレス81が‘1022’=10184に対して値82が‘1044’となっている。以上のPOUインスタンスアドレス情報25生成処理は、例えばコンパイラ機能部11がコンパイルの際に行うものであり、その後、コンパイル結果として得られる機械語オブジェクト23と共にPOUインスタンスアドレス情報25がPLC30にダウンロードされる。これより、PLC30側では例えばプログラム実行管理機能部31が、当該新たな機械語オブジェクト23による運用を開始する前に、POUインスタンスアドレス情報25に基づく設定処理を行う。図9に示す例では、アドレス‘1004’にデータ1034を格納し、アドレス‘1022’に対してデータ1044を格納することになる。この例の場合、上記LDAXBase4は、インスタンス1の場合にはアドレス‘1004’の格納データすなわち1034を、AXレジスタに格納することになり、インスタンス3の場合にはアドレス‘1022’の格納データすなわち1044を、AXレジスタに格納することになる。尚、POUインスタンスアドレス情報25の代わりにPOUインスタンスアドレス割付対応表26をPLC30にダウンロードすることで、PLC30側で上記設定処理を行わせるようにしてもよい。但し、POUインスタンスアドレス割付対応表26は、データ量が多い為、PLCでは扱いにくいので、該当アドレスとその内容追加変数格納領域の先頭アドレスを取り出した情報を格納したのが、上記POUインスタンスアドレス情報25である。PLC30は、この情報25を獲得し、PLC30内のメモリに、上記該当アドレスで指定された場所に値を展開する。尚、上記のBaseポインタの設定例は、コンパイラコード生成で実施しているが、PLC内のシステムCall内で同様な動作を実施することも可能である。以上説明したように、本例のプログラマブルコントローラの支援装置によれば、ユーザが変数追加を伴うプログラムの更新を実施しても、既に割り付けた変数既存の変数のアドレス割当位置を変更することなく、追加した変数を新しいアドレスに割り付けることが可能になり、PLCを停止しないでPLCを停止することは、システムを停止することになる、プログラムを更新できるため、システムの稼動性、保守性、拡張性が向上する。特に既に確保済みのブロックのみでは全ての追加変数を割り当てられない場合であっても、追加ブロックを生成して追加変数を格納できるので、最初に確保したブロックのサイズ予備領域のサイズによって制限を受けることなく、変数の追加を行うことができる。"