(57)【特許請求の範囲】
【請求項１】
プログラマブルコントローラ用の任意のプログラムのソースコードをコンパイルして機械語オブジェクトを生成する支援装置と、プログラマブルコントローラとから成るプログラマブルコントローラ・システムであって、
前記支援装置は、前記プログラマブルコントローラが稼働中にそのプログラムを変更する場合、
前記ソースコードのコンパイルの際に、前記ソースコードに含まれるＰＯＵに、そのＰＯＵに係わる変数の格納領域と予備領域と追加変数格納先記憶領域を相対アドレスで示す領域情報を保持する変数情報記憶手段と、
前記ソースコードのコンパイルの際に、前記ＰＯＵのインスタンスに、そのインスタンスに関して確保された一塊のメモリ領域であるブロックに関する情報として少なくともその先頭アドレスを記憶するインスタンス情報記憶手段と、
前記変数情報記憶手段と前記インスタンス情報記憶手段とを参照して、前記変数を前記インスタンスにメモリ割当てを行いながら、前記任意のプログラムのソースコードを前記機械語オブジェクトに変換するコンパイル手段と、
前記プログラムの修正版／更新版である修正／更新プログラムのソースコードをコンパイルする際に、該ソースコードに含まれるＰＯＵに、前記変数情報記憶手段を参照して追加変数の有無をチェックし、追加変数がある場合には前記予備領域で対応可能か否かを判定し、対応できる場合には該予備領域に追加変数を割当て、対応できない場合には、該ＰＯＵのインスタンスに追加のブロックを確保すると共に、既存のブロックの前記追加変数格納先記憶領域に該追加ブロックの先頭アドレスを格納させる為の情報を生成し記憶する追加変数対応手段と、
を有することを特徴とするプログラマブルコントローラ・システム。
【請求項２】
前記コンパイル手段は、前記修正／更新プログラムの前記機械語オブジェクトへの変換に関しては、前記追加変数の有無に係らず、既存の変数に関しては前記変数情報記憶手段の前記領域情報に基づいて前回コンパイル時と同じアドレスを割り当てることを特徴とする請求項１記載のプログラマブルコントローラ・システム。
【請求項３】
前記コンパイル手段は、前記修正／更新プログラムの前記機械語オブジェクトへの変換に関しては、前記追加変数格納先記憶領域経由で前記追加変数にアクセスする機械語オブジェクトを生成することを特徴とする請求項１記載のプログラマブルコントローラ・システム。
【請求項４】
前記支援装置は、前記追加変数格納先記憶領域のアドレスと該追加変数格納先記憶領域に記憶される前記追加ブロックの先頭アドレスとの対応関係情報を、前記修正／更新プログラムの機械語オブジェクトと共に前記プログラマブルコントローラにダウンロードし、
前記プログラマブルコントローラは、該修正／更新プログラムの機械語オブジェクトを実行開始する前に、前記対応関係情報に基づいて、前記追加変数格納先記憶領域に前記追加ブロックの先頭アドレスを格納することを特徴とする請求項３記載のプログラマブルコントローラ・システム。
【請求項５】
前記コンパイル手段は、前記ＰＯＵの一種であるＰＧに関しては、前記ブロックの先頭アドレスと前記変数の相対アドレスとによって変数の割当位置の実アドレスを求めて、該実アドレスを用いて前記機械語オブジェクトを生成することを特徴とする請求項１記載のプログラマブルコントローラ・システム。
【請求項６】
前記コンパイル手段は、前記ＰＯＵの一種であるファンクションブロックに関しては、ベースポインタと前記変数の相対アドレスとによって変数の割当位置にアクセスさせる機械語オブジェクトを生成すると共に、該ファンクションブロックのインスタンスの呼び出し元ＰＯＵが、該ファンクションブロックのインスタンスに対応する前記ブロックの先頭アドレスを前記ベースポインタにセットしてから該ファンクションブロックのインスタンスを呼び出す機械語オブジェクトを生成することを特徴とする請求項１記載のプログラマブルコントローラ・システム。
【請求項７】
前記変数情報記憶手段には、前記変数に、その変数が前記既存のブロックと前記追加ブロックのどちらに割り当てられたかを示す情報も記憶されることを特徴とする請求項１記載のプログラマブルコントローラ・システム。
【請求項８】
プログラマブルコントローラ用の任意のプログラムのソースコードをコンパイルして機械語オブジェクトを生成する支援装置であって、
プログラマブルコントローラが稼働中にそのプログラムを変更する場合、
前記ソースコードのコンパイルの際に、前記ソースコードに含まれるＰＯＵに、そのＰＯＵに係わる変数の格納領域と予備領域と追加変数格納先記憶領域を相対アドレスで示す領域情報を保持する変数情報記憶手段と、
前記ソースコードのコンパイルの際に、前記ＰＯＵのインスタンスに、そのインスタンスに関して確保された一塊のメモリ領域であるブロックに関する情報として少なくともその先頭アドレスを記憶するインスタンス情報記憶手段と、
前記変数情報記憶手段と前記インスタンス情報記憶手段とを参照して、前記変数を前記インスタンスにメモリ割当てを行いながら、前記任意のプログラムのソースコードを前記機械語オブジェクトに変換するコンパイル手段と、
前記プログラムの修正版／更新版である修正／更新プログラムのソースコードをコンパイルする際に、該ソースコードに含まれるＰＯＵに、前記変数情報記憶手段を参照して追加変数の有無をチェックし、追加変数がある場合には前記予備領域で対応可能か否かを判定し、対応できる場合には該予備領域に追加変数を割当て、対応できない場合には、該ＰＯＵのインスタンスに追加のブロックを確保すると共に、既存のブロックの前記追加変数格納先記憶領域に該追加ブロックの先頭アドレスを格納させる為の情報を生成し記憶する追加変数対応手段と、
を有することを特徴とするプログラマブルコントローラの支援装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラマブルコントローラ・システムに係わり、特にその支援装置に関する。
【背景技術】
【０００２】
ＰＬＣ（プログラマブルコントローラ）の支援ツールは、ユーザが記述したプログラム（ソースコード；変数含む）をコンパイルして、ＰＬＣで動作する機械語オブジェクトを生成し、その際、ＰＬＣ上の有限なメモリに（その任意のアドレスに）各変数を割り付ける。そして、機械語オブジェクトをＰＬＣにダウンロードして記憶させる。これより、ＰＬＣは、このプログラムを実行することで各種処理を実行し、各変数の値のリード／ライト等の処理の際には、その変数に割り付けられたアドレス（割当位置）にアクセスすることになる。
【０００３】
ＰＬＣが稼動中にそのプログラムを変更する場合は（プログラムのバージョンアップ等）、既に割り付けた変数（既存の変数というものとする）のアドレスを変更することができない（変数の割当位置が変化すると、変更前と変更後とで変数の値がプログラムで正常に扱えないため、誤動作する。；変数のアドレスが変更されることにより、アドレスの変更前と変更後とでデータを引き継ぐことができない）。
【０００４】
そのため、従来は、変数を追加しても既存の変数のアドレスが変更されないようにするために予備領域を設けて、追加した変数（追加変数というものとする）をこの予備領域に割り付けるようにしている。予備領域に追加変数を割り付けることにより、既に割り付けた変数（既存の変数）の割当位置を変更しないで、変数の追加が可能になる。予備領域は、プログラム構成単位（以下ＰＯＵと示す）単位で持つため、予備領域のサイズは、大抵、数Ｗ(WORD)から数１０Ｗである。
【０００５】
予備領域は、変数を追加しなければ無駄な領域となる。ＰＬＣのメモリは有限であり、且つ、大規模なシステムではＰＯＵの数も多いため、予備領域を大きく(幾つも)確保することができない。
【０００６】
ユーザが、予備領域の数を越える変数の追加を伴うプログラムの変更を実施すると、既存の変数の割当位置を維持できなくなるため、ＰＬＣの動作を継続しながらプログラムを変更すること（オンライン変更）はできなくなる。
【０００７】
予備領域を大きく確保し、オンライン変更の制限を緩和する方法として、例えば特許文献１に開示されている従来技術が存在するが、予備領域をＰＯＵ単位ではなくタスク単位にまとめて大きめに予備領域を確保する方式のため、予備領域の数を超えるような変数を追加できない課題がある。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開２００８−２６９４４９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
ここで、上記ＰＯＵには、ＰＧ（プログラム）、ＦＢ（ファンクションブロック）、ＦＣＴ（ファンクション）等の種類がある。基本的には、ＰＧがメインプログラムでＦＢやＦＣＴがサブプログラムと見做してよく、ＰＧが、その処理実行中にＦＢやＦＣＴ等を呼び出す。また、ＦＢが、その処理実行中に他のＦＢやＦＣＴを呼び出す場合もある。
【００１０】
ＰＧを例にすると、ＰＧのソースコードを作成するユーザが、ＰＧ中に任意のＦＢ等の呼び出しを記述するものであり、基本的に何種類でも何回でも呼び出すように記述できる。例えば、ＦＢ１、ＦＢ２の２種類のＦＢがあるものとし、ユーザが作成した任意のＰＧでは、ＦＢ１を３回呼び出し、ＦＢ２は２回呼び出すものとする。
【００１１】
あるいは、呼び出されたＦＢ１が、その処理実行中にＦＢ２を呼び出すように、ＦＢ１のソースコードを記述することもできる。
このように、ファンクションブロックＦＢ１のロジック自体は１つでも、ユーザは、複数回利用することができる。同様にファンクションブロックＦＢ２のロジック自体は１つでも、ユーザは、複数回利用することができる。
【００１２】
ここで、上記ＰＧ（プログラム）、ＦＢ（ファンクションブロック）、ＦＣＴ（ファンクション）等の各種ＰＯＵのソースコードには、通常、任意の変数が記述されている。そして、各種ＰＯＵを有するプログラムをコンパイルする際には、コンパイラ機能により各ＰＯＵのインスタンス化（各ＰＯＵの各変数をメモリに割り付ける）を実施する。
【００１３】
これは、例えば上記のようにＦＢ１が３回呼び出される例では、ＦＢ１に関しては３回のインスタンス化が行われる。例えば、ＦＢ１が温度計による計測温度と湿度計による計測湿度とを取得・記憶するロジックであった場合、例えば温度計Ａの計測値を１０００番地、湿度計ａの計測値を１００１番地に記憶するインスタンス、温度計Ｂの計測値を１０１０番地、湿度計ｂの計測値を１０１１番地に記憶するインスタンス、温度計Ｃの計測値を１０２０番地、湿度計ｃの計測値を１０２１番地に記憶するインスタンスの３つのインスタンスが生成されることになる。
【００１４】
コンパイラ機能は、各ＰＯＵをインスタンス化する場合、予備領域も含めて１つの塊としてメモリを割り付ける。上記のようにＦＢを複数回利用する場合にはそれぞれについてインスタンス化が行われる。上記のようにＦＢ１の例の場合には３つのインスタンスが生成され、それぞれについて１つの塊としてメモリを割り付けることになる。上記の例では、各インスタンス毎に、温度計と湿度計それぞれに１ワード（１番地）ずつ計２ワードと、更に予備領域を１ワードの計３ワード分を、１つの塊としてメモリを割り付けることになる。
【００１５】
そして、後にプログラムを修正（バージョンアップ）する等して、任意のＰＯＵにおける変数に追加があった場合、この追加変数を上記予備領域に割り付けることになる。追加変数が多い為に予備領域が不足しても、通常、ＰＬＣのメモリには未だ十分な余裕（空き領域）が残っているため、他のメモリ領域に変数を割り付けることは可能である。
【００１６】
しかし、従来の方式では、予備領域を超えて変数を追加した場合、既存の変数のアドレス（割当位置）を変更する必要があり、既存変数のアドレスが変更されると上記の通り正常なデータ引き継ぎができない為、ＰＬＣを停止し、データの初期化を行い、プログラムをすべてＰＬＣに転送してから、ＰＬＣを起動する必要がある。ＰＬＣが停止すると、システムも停止するため、システムの稼働率、保守性、拡張性の低下や、プラントなどシステムを停止できない場合に問題になる。
【００１７】
本発明の課題は、ＰＬＣシステムに係わりそのＰＬＣ支援装置におけるＰＬＣのプログラムの更新／修正に伴い、既存の変数のアドレス（割当位置）を変更することなく、予備領域では対応できないような変数追加があった場合でもＰＬＣのメモリの空き領域に追加変数を割り付けることで、ＰＬＣを停止しないでプログラム更新を可能とするＰＬＣ（プログラマブルコントローラ）システム、その支援装置を提供することである。
【課題を解決するための手段】
【００１８】
本発明のプログラマブルコントローラ・システムは、プログラマブルコントローラ用の任意のプログラムのソースコードをコンパイルして機械語オブジェクトを生成する支援装置と、プログラマブルコントローラとから成るプログラマブルコントローラ・システムであって、前記支援装置は、前記プログラマブルコントローラが稼働中にそのプログラムを変更する場合、前記ソースコードのコンパイルの際に、前記ソースコードに含まれる各ＰＯＵ毎に、そのＰＯＵに係わる各変数の格納領域と予備領域と追加変数格納先記憶領域の各領域を相対アドレスで示す領域情報を保持する変数情報記憶手段と、前記ソースコードのコンパイルの際に、前記各ＰＯＵの各インスタンス毎に、そのインスタンスに関して確保された一塊のメモリ領域であるブロックに関する情報として少なくともその先頭アドレスを記憶するインスタンス情報記憶手段と、前記変数情報記憶手段と前記インスタンス情報記憶手段とを参照して、前記各変数を前記各インスタンス毎にメモリ割当てを行いながら、前記任意のプログラムのソースコードを前記機械語オブジェクトに変換するコンパイル手段と、前記プログラムの修正版／更新版である修正／更新プログラムのソースコードをコンパイルする際に、該ソースコードに含まれる各ＰＯＵ毎に、前記変数情報記憶手段を参照して追加変数の有無をチェックし、追加変数がある場合には前記予備領域で対応可能か否かを判定し、対応できる場合には該予備領域に追加変数を割当て、対応できない場合には、該ＰＯＵの各インスタンス毎に追加のブロックを確保すると共に、既存のブロックの前記追加変数格納先記憶領域に該追加ブロックの先頭アドレスを格納させる為の情報を生成・記憶する追加変数対応手段とを有する。
【００１９】
上記プログラマブルコントローラ・システムにおいて、例えば、前記コンパイル手段は、前記修正／更新プログラムの前記機械語オブジェクトへの変換に関しては、前記追加変数の有無に係らず、既存の変数に関しては前記変数情報記憶手段の前記領域情報に基づいて前回コンパイル時と同じアドレスを割り当てる。
【００２０】
また、上記プログラマブルコントローラ・システムにおいて、例えば、前記コンパイル手段は、前記修正／更新プログラムの前記機械語オブジェクトへの変換に関しては、前記追加変数格納先記憶領域経由で前記追加変数にアクセスする機械語オブジェクトを生成する。
【００２１】
上記プログラマブルコントローラ・システムでは、例えばその支援装置において、修正／更新プログラムにおいて追加変数がある場合、予備領域で対応できる場合には予備領域を割当て、予備領域では対応できない場合であっても追加ブロックを確保することで対応できる。また、既存の変数に関しては、変数情報記憶手段の領域情報に基づいて前回コンパイル時と同じアドレスを割り当てることができる。
【発明の効果】
【００２２】
本発明のＰＬＣ（プログラマブルコントローラ）システム、その支援装置等によれば、ＰＬＣシステムに係わりそのＰＬＣ支援装置におけるＰＬＣのプログラムの更新／修正に伴い、既存の変数のアドレス（割当位置）を変更することなく、予備領域では対応できないような変数追加があった場合でもＰＬＣのメモリの空き領域に追加変数を割り付けることで、ＰＬＣを停止しないでプログラム更新を可能とする。
【図面の簡単な説明】
【００２３】
【図１】本例のＰＬＣシステムの全体構成図である。
【図２】変数のメモリ割付けの一例を示す図である。
【図３】（ａ），（ｂ）は、追加変数格納領域の割当てを示す図である。
【図４】（ａ）〜（ｃ）は変数情報管理表の具体例を示す図である。
【図５】（ａ）、（ｂ）は、ＰＯＵインスタンスアドレス割付対応表の具体例を示す図である。
【図６】コンパイル処理を説明する為のフローチャート図である。
【図７】ソースコード識別番号対応表の具体例を示す図である。
【図８】修正版プログラムのコンパイル処理を説明する為のフローチャート図である。
【図９】ＰＯＵインスタンスアドレス情報の具体例を示す図である。
【発明を実施するための形態】
【００２４】
以下、図面を参照して本発明の実施の形態について説明する。
尚、本説明では「割当て」と「割付け」はほぼ同義であると見做すものとする。
図１は、本例のプログラマブルコントローラ（ＰＬＣ）システムの全体構成を示す図である。
【００２５】
本例のＰＬＣシステムは、ＰＬＣ（プログラマブルコントローラ）３０と、このＰＬＣ３０用のプログラム（制御プログラム等；以下、制御プログラムを例にして説明する）をユーザが任意に作成できるように支援する機能等を有する開発支援装置（ローダ）１０を有する。
【００２６】
開発支援装置１０は、上記作成された制御プログラムを、コンパイルして機械語に変換した後、不図示の通信線を介してＰＬＣ３０にダウンロードする機能等も備えている。ＰＬＣ３０は、この機械語プログラムを記憶する（後述する機械語オブジェクト４１に相当）。また、ＰＬＣ３０は、制御プログラムの更新／修正等に伴い更新／修正版等の機械語プログラムがダウンロードされた場合には、記憶してあった旧プログラムを削除して新プログラムを記憶する。そして、ＰＬＣ３０は、現在記憶している機械語プログラムを実行することで、制御対象の各種機器を制御する。
【００２７】
尚、特に図示しないが、ＰＬＣ３０は、上記制御対象である何らかの機器または当該機器を接続しているＩ／Ｏユニットと、通信線を介して接続している。
開発支援装置（ローダ）１０は、コンパイラ機能部１１、インタフェース機能部１２、通信機能部１３等の各種機能部と記憶部２０等を有する。また、ユーザに上記制御プログラム等を作成させるための画面等を表示するディスプレイ１４と、キーボード／マウス等の入力装置１５等も有する。また、特に図示しないが、開発支援装置（ローダ）１０は、ＣＰＵ／ＭＰＵ等の演算処理プロセッサも有している。
【００２８】
記憶部２０には、予め不図示のアプリケーションプログラムが記憶されている。上記ＣＰＵ／ＭＰＵ等が、このアプリケーションプログラムを読み出し・実行することにより、上記各種機能部１１，１２、１３の機能（特に後述する図６や図８に示す処理）が実現される。
【００２９】
また、記憶部２０には、図示の各種データ／プログラム等が記憶される。
すなわち、記憶部２０には、上記ユーザによって作成された制御プログラムのソースコード２１、このソースコード２１をコンパイラ機能部１１によってコンパイルした結果である機械語オブジェクト２３等が格納される。
【００３０】
更に、記憶部２０には、図示の各種データ、すなわちソースコード識別番号対応表２２、変数情報管理表２４、ＰＯＵインスタンスアドレス情報２５、ＰＯＵインスタンスアドレス割付対応表２６等が、記憶される。尚、これら各種データについては、後に具体例を参照して説明する。
【００３１】
上記各種機能部のうち、まず、インタフェース機能部１２は、ユーザが任意の制御プログラム（ソースコード２１）を作成する際に作成作業が行い易いように支援する、既存の一般的な機能を有する処理機能部である。例えば上記ディスプレイ１４上に所定の入力画面を表示し、ユーザは上記入力装置１５を操作してこの入力画面上で任意の制御プログラムを記述する。
【００３２】
コンパイラ機能部１１は、ユーザによって作成されたソースコード２１を、ターゲット（ＰＬＣ３０）上で動作する機械語オブジェクト２３に変換する（コンパイルを実行する）。通信機能部１３は、生成された機械語オブジェクト２３を、不図示の通信線を介してターゲット（ＰＬＣ３０）に送信する（ダウンロードする）。
【００３３】
ＰＬＣ（プログラマブルコントローラ）３０は、プログラム実行管理機能部３１、通信機能部３２等の各種機能部と記憶部４０を有する。また、特に図示しないが、ＰＬＣ３０は、ＣＰＵ／ＭＰＵ等の演算処理プロセッサも有している。
【００３４】
記憶部４０には、予め不図示のアプリケーションプログラムが記憶されている。上記ＣＰＵ／ＭＰＵ等が、このアプリケーションプログラムを読み出し・実行することにより、上記各種機能部３１，３２の機能（処理）が実現される。
【００３５】
通信機能部３２は、上記開発支援装置１０（その通信機能部１３）との通信を行って、例えば上記ダウンロードされる機械語オブジェクト２３の受信を行い、これを記憶部４０に記憶する（これが図示の機械語オブジェクト４１である）。また、ＰＯＵインスタンスアドレス情報２５がダウンロードされた場合には、これを記憶部４０に記憶する（これが図示のＰＯＵインスタンスアドレス情報４２である）。
【００３６】
プログラム実行管理機能部３１は、上記のように開発支援装置１０からダウンロードされて記憶部４０に記憶された機械語オブジェクト４１等の実行を管理する。詳しくは後述する。
【００３７】
また、記憶部４０（メモリ）の記憶領域の一部は、ＰＯＵインスタンスメモリ領域４３となっている。この領域４３内に各変数を割当てる（各変数に係るデータ格納領域を割付ける）。これらについても詳しくは後述する。
【００３８】
ここで、ＰＬＣのプログラミングには、プログラム（ＰＧ）、ファンクションブロック（ＦＢ）、ファンクション（ＦＣＴ）の３つのＰＯＵ要素がある。通常、各ＰＯＵには
１以上の変数が含まれている。上記制御プログラム等をＰＬＣ３０上で動作させる為には、開発支援装置１０でコンパイルする際に、その各ＰＯＵの各変数をＰＬＣ３０のメモリ（領域４３内）に割り付けてから（アドレスを割り当てる）、機械語オブジェクト２３を生成する必要がある。コンパイラ機能部１１が、上記コンパイルの際にＰＯＵ毎に（インスタンス毎に）その各変数のメモリ割付けを実施している。
【００３９】
コンパイラ機能部１１は、上記ＰＯＵ毎に各変数をメモリに割付ける際に、各インスタンス毎に、上記のように一塊の領域（ブロック；変数割当領域というものとする）を確保する。これには、既に説明したように、予備領域も含まれる。つまり、各ＰＯＵの各インスタンス毎に、各変数の割付領域と予備領域等から成る変数割当領域を割り当てることになる（例えば後述する図２参照）。そして、本手法では、更に「追加変数格納先アドレス」領域も確保する（これも上記変数割当領域（ブロック）に含まれる）。
【００４０】
例えば、任意の制御プログラムの新規作成時に、そのコンパイルの際に上記メモリ割付けを行うことで、その後にこの制御プログラムの修正／更新時には、そのコンパイルの際に、追加変数があった場合には上記変数割当領域内の予備領域に割り当てるようにする。
【００４１】
しかし、追加変数が多い場合等には、上記予備領域では足りない場合がある。つまり、上記確保してあった変数割当領域内に追加変数全てを割当てることが出来ない場合がある。
【００４２】
本手法では、この様な場合に備えて上記のように上記変数割当領域内に上記「追加変数格納先アドレス」領域も確保している。また、各ＰＯＵの各インスタンス毎に、上記変数割当領域の先頭アドレスやサイズ、その変数等のメモリ割り当て状況を、上記変数情報管理表２４、ＰＯＵインスタンスアドレス割付対応表２６に記憶している。
【００４３】
尚、上記制御プログラムの修正／更新版のコンパイルの際には、これら管理表２４や対応表２６を参照することで、既にメモリ割当て済みの変数（上述した既存の変数）に関しては同じアドレスを割当てることができる。
【００４４】
そして、上記予備領域では足りない様な（対応できないような）変数追加があった場合、ＰＬＣ３０のメモリ（領域４３内）の空き領域に新たな変数割当領域（ブロック）を確保して、この変数割当領域内に追加変数を割り付けると共に、この追加した変数割当領域の先頭アドレスを「追加変数格納先アドレス」に書き込ませる。これより、追加変数は「追加変数格納先アドレス」経由でアクセスすることができる（例えば後述する図３参照）。
【００４５】
ここで、上記コンパイラ機能部１１が上記コンパイルの際にＰＯＵ毎に（各インスタンス毎に）その各変数のメモリ割付を行うのは、上記の通りＰＯＵインスタンスメモリ領域４３内の任意の記憶領域である。図２に、この様なメモリ割付けの一例を示す。
【００４６】
図２に示すように、ＰＯＵインスタンスメモリ領域４３に対してＰＯＵ毎（インスタンス毎に）の変数のメモリ割付けが行われる。
図２の例は、２つのファンクションブロック（ＦＢ１、ＦＢ２）に関して、ＦＢ１は２つ、ＦＢ２は１つ、インスタンス化した場合のメモリ割付例である。
【００４７】
既に従来等で説明したように、ファンクションブロック（ＦＢ）に関しては、ユーザは、複数回利用することができる。複数回利用する場合は、コンパイラ機能により利用毎のインスタンス化（ファンクションブロックの変数をメモリに割り付ける）を実施する。従って、上記の例ではＦＢ１は２度利用され、ＦＢ２は一度だけ利用されていることになる。
【００４８】
そして、変数のメモリ割付けは、各インスタンス毎に行われる。よって、上記の例では、ＦＢ２に関してはＦＢ２のインスタンス２、ＦＢ１に関してはインスタンス１、インスタンス３のインスタンス化が行われ、これら各インスタンス毎に図示のように変数のメモリ割付けが行われる。
【００４９】
コンパイラ機能部１１は、ファンクションブロックをインスタンス化する場合、１つの塊（ブロック；上記変数割当領域）としてメモリを割り付ける。すなわち、例えば図２に示す例のように、各ファンクションブロックをインスタンス化してなる各インスタンス毎に、１つの塊（ブロック）としてメモリ領域を割り付ける。
【００５０】
図２の例では、インスタンス１、インスタンス２、インスタンス３の３つのインスタンス化が行われるものとし、インスタンス１とインスタンス３はファンクションブロックＦＢ１に係るインスタンス、インスタンス２はファンクションブロックＦＢ２に係るインスタンスである。
【００５１】
各インスタンス毎の変数割当領域は、その各変数に対するメモリ割当て領域と予備用領域から成る。図２の例では、予備１と予備２の２つの予備領域が加わる。そして、図示の例ではファンクションブロックＦＢ１に係る変数は変数１と変数２であり、ファンクションブロックＦＢ２に係る変数は変数３と変数４と変数５であるものとしている。これより、図示の通り、インスタンス１とインスタンス３に関しては、変数１と変数２と予備１と予備２とを含む１つの塊（ブロック）として図示のようにメモリを割付ける。インスタンス２に関しては、変数３と変数４と変数５と予備１と予備２とを含む１つの塊（ブロック）として図示のようにメモリを割付ける。
【００５２】
図２に示す例に対して、本手法の場合にはブロック内に更に図３に示すように「追加変数格納先アドレス」が加わる。すなわち、本手法では、上記図１のＰＯＵインスタンスメモリ領域４３に対する各インスタンス毎のメモリ割当ては、例えば図３に示すようになる。
【００５３】
本手法では、図３（ａ）に示すように、各変数１，２，３，４，５に関するメモリ割当ては、上記図２の例と同様である。一方、２つの予備領域に関しては、予備１のみとなっており、上記予備２の割当て領域には図示のように「追加変数格納先アドレス」が割当てられている。但し、この例に限らず、予備領域は予備１、予備２の２つのままで更に「追加変数格納先アドレス」が加わるようにしてもよい。
【００５４】
ここで、ＰＬＣ３０の稼働中に、ユーザが開発支援装置１０上で変数の追加を伴うプログラム修正（例えばバージョンアップしたソースコード２１の作成等）を行った場合であって、特にＰＬＣ３０を止めないでＰＬＣ３０のプログラムの変更を実施するためには、既にメモリに割付けた変数（既存の変数）のメモリ割付け位置を変更しないようにする必要がある。
【００５５】
そこで、本手法では、コンパイラ機能部１１は、ソースコード２１のコンパイル実行の際に行う上記各インスタンス毎のメモリ割当ての際に、上記管理表２４や対応表２６に各変数のメモリ割当て状況を登録しておくと共に、予備領域だけでなく上記「追加変数格納先アドレス」を格納する領域を確保する。新規プログラム（新規ソースコード２１）のコンパイルの際には、基本的には、この「追加変数格納先アドレス」領域には何もデータは格納されない（後述するＮＵＬＬとなる）。
【００５６】
そして、後にこの新規プログラムを修正／更新（バージョンアップ等）したときに、修正／更新版プログラムをコンパイルする際に、追加変数があり且つ予備領域だけでは対応できない場合には、例えば図３（ｂ）に示す「追加変数格納領域」（追加ブロック）を新たに確保すると共に、この「追加変数格納領域」の先頭アドレスを上記「追加変数格納先アドレス」が示す領域に格納させる。これについては、詳しくは後に図９を参照して説明するが、ＰＬＣ３０側において、「ＰＯＵインスタンスアドレス情報」４２（開発支援装置１０側で生成した「ＰＯＵインスタンスアドレス情報」２５をダウンロードしたもの）を用いて「追加変数格納先アドレス」が示す領域に、「追加変数格納領域」の先頭アドレスを格納する。これより、その後は、ＰＬＣ３０では、「追加変数格納先アドレス」経由で「追加変数格納領域」の各追加変数にアクセスすることになる。
【００５７】
尚、本手法では、予備領域は確保せずに「追加変数格納先アドレス」領域だけを確保するようにしてもよい。尚、逐一述べないが、各変数に関する領域割当ては、当然、図２の場合と同様に行っている。
【００５８】
また、コンパイラ機能部１１は、どの変数をどの記憶領域（アドレス）に割当てたのかを示す情報を、テーブル（上記管理表２４等）に記憶しておく。
コンパイラ機能部１１は、上記修正版（バージョンアップ版等）プログラムをコンパイルする際には、特に変数の追加があったＰＯＵのインスタンスに係るメモリ割当てに関しては、既存の変数に関しては上記テーブルを参照することで既に割当てられている記憶領域を変更しないようにする（前回コンパイル時と同じアドレスが割当てられるようにする）。一方、新たに追加された変数（追加変数）に関しては、まず上記予備領域への割当てを試みて、割当て可能であれば予備領域を割当てる。
【００５９】
図３（ｂ）に示す例では、ソースコード２１において上記ファンクションブロックＦＢ１に関して３つの変数が追加されたものとしている。これら追加された３つの変数を、追加変数１、追加変数２、追加変数３と呼ぶものとする。よって、新たなファンクションブロックＦＢ１に関しては、上記既存の変数である変数１、変数２と、これら追加変数１、追加変数２、追加変数３との合計５つの変数が存在する状態となっている。
【００６０】
よって、上記コンパイルの際、新たなファンクションブロックＦＢ１に係るインスタンス１、インスタンス３に関しては、両方とも、５つの変数のメモリ割り当てを行うことになる。
【００６１】
そして、上記の通り（そして図３（ｂ）に示す通り）、既存の変数１、変数２に関しては図示の通り割当位置は図３（ａ）の状態と同じである（変わらない）。一方、追加変数に関しては、上記３つの追加変数のうちの１つ（ここでは追加変数１とする）は予備領域への割当てが可能であるが、他の２つの追加変数（ここでは追加変数２，３）を割当てることはできない。
【００６２】
この様に予備領域では対応できないような変数の追加が行われた場合には、ＰＯＵインスタンスメモリ領域４３内の空き領域に、当該インスタンス用の新たな変数記憶領域（追加変数格納領域／追加ブロックという）を確保し、当該追加ブロックのアドレス（先頭アドレス等）を上記「追加変数格納先アドレス」が示す領域に格納させる。
【００６３】
そして、当該追加ブロック内に上記他の２つの追加変数（ここでは追加変数２，３）を割当てる。これより、例えば図３（ｂ）に示す状態となる。ここで、既に述べた通り、各インスタンス毎に１つの塊（ブロック）としてメモリ領域を割付けるものである為、上記新たな変数記憶領域（追加ブロック）においても、追加変数２，３だけでなく、予備領域（予備１）及び「追加変数格納先アドレス」領域も確保されることになる。
【００６４】
また、本例ではＦＢ１は２つインスタンス化されているため、インスタンス毎に、（予備領域では対応できない）追加変数の格納領域を確保する必要がある。この為、図３（ｂ）に示す通り、ＦＢ１のインスタンス１の追加変数格納領域と、ＦＢ１のインスタンス３の追加変数格納領域とが、新たに確保されることになる。
【００６５】
このようにすることで、最初に各インスタンス毎に１つの塊として割付けられるメモリ領域（初期ブロックという）では、全ての追加変数を割当てることができない場合でも、ＰＯＵインスタンスメモリ領域４３内に空き領域が存在する限りは、追加変数格納領域（追加ブロック）を確保することで、追加変数のメモリ割当てが可能となる。これは、既に存在する変数の割り当て位置は、変更しないで、追加変数のメモリ割当てを殆ど制限なしに（勿論、領域４３の空き領域が無くなれば駄目であるが）行うものとなる。変数の追加の制限を撤廃し、ＰＬＣを停止しないでプログラムの変更が実施できる。
【００６６】
コンパイラ機能部１１は、ユーザが記述したプログラム（ソースコード２１）をコンパイルする際に、当該プログラムにおける各ＰＯＵ毎に、そのＰＯＵが使用している変数の情報管理のため、「変数情報管理表」２４を作成する。「変数情報管理表」２４には、各変数毎に、変数の名前、型（サイズ）、割当位置を示す相対位置などの情報が存在する。
【００６７】
図４（ａ）〜（ｃ）に、「変数情報管理表」２４の具体例を示す。
図４（ａ）、（ｂ）は、上記ファンクションブロックＦＢ１に関する「変数情報管理表」２４の具体例であって、図４（ａ）は図６の新規コンパイル後、図４（ｂ）は図８の修正版等コンパイル後の状態を示す。このようなデータ例については、後に図６や図８の説明の際に説明するものとし、ここでは「変数情報管理表」２４のフォーマットについてのみ説明するものとする。尚、図４（ｃ）は後述するファンクションブロックＦＢＣＡＬＬに関する「変数情報管理表」２４の具体例である。
【００６８】
図４（ａ）〜（ｃ）に示すように、「変数情報管理表」２４のフォーマットは、変数名５１、型５２、相対位置５３、及び格納先ブロック５４の各データ項目より成るものである。尚、特に図示・説明しないが、各「変数情報管理表」２４には、どのＰＯＵの変数情報管理表であるのかを示す情報も含まれている。
【００６９】
変数名５１には、図示の変数１、変数２等の変数名等（名前に限らず、識別番号等であってもよい）が格納される。図４（ａ），（ｂ）の例の場合はファンクションブロックＦＢ１で使用する各変数の変数名が、変数名５１に格納されることになる。
【００７０】
但し、変数名５１には、変数名等に限らず、図示のように「予備領域」、「追加変数格納先アドレス」等も格納される。これら名称やサイズは予め決められているものであり、上記各変数名等の格納が完了したら、続いてこれらの所定の名称や使用領域サイズを変数名５１や型５２に格納する。詳しくは後述する。
【００７１】
型５２には、変数名５１に変数名等が格納されている場合には、当該変数名の変数の型と使用する記憶容量（使用領域のサイズ）とが格納される。例えば、変数１は、ＩＮＴ型であって使用領域サイズが１Ｗ（ワード）であることになる。変数２は、ＷＯＲＤ型であって使用領域サイズが１Ｗ（ワード）であることになる。また、型５２には、変数名５１に変数名以外が格納されている場合には、使用領域サイズのみが格納される。図示の例では、「予備領域」に関しては使用領域サイズが２Ｗ（ワード）となっており、「追加変数格納先アドレス」に関しても使用領域サイズが２Ｗ（ワード）となっている。
【００７２】
相対位置５３には、上記各使用領域の相対アドレスが格納されている。これは、後述する先頭アドレス６３からの相対位置を意味する。つまり、各インスタンス毎に、そのインスタンスに係るブロックの先頭アドレス６３と上記各変数の相対位置５３とによって、そのインスタンスで使用する各変数の割当位置を示す実アドレスが、分かることになる。
【００７３】
例えば、変数２の相対位置５３は‘１’であり、図４（ａ）はファンクションブロックＦＢ１の例であるので、仮にインスタンス３であった場合には先頭アドレス６３は‘1018’番地であることから、変数２の割当位置の実アドレスは、‘1018’番地＋１＝‘1019’番地であることになる。また、この例の場合、予備領域の使用領域の実アドレスは、‘1018’番地＋２＝‘1020’番地であることになる。ここで、予備領域の型５１（使用領域サイズ）は上記の通り２Ｗ（ワード）であるので、予備領域の使用領域は、‘1020’番地〜‘1021’番地ということになる。
【００７４】
格納先ブロック５４は、変数名５１の変数等を格納するブロックを示すものである。すなわち、上記の通り、各インスタンス毎に、最初に１つのブロック（初期ブロック）を確保し、その後、修正版プログラム等のコンパイルの際に場合によっては追加ブロックを確保することになるが、変数名５１の変数の割当位置が、初期ブロック内であるのか追加ブロック内であるのかを示す情報が、格納先ブロック５４に格納されている。
【００７５】
図３（ａ）に示す例では、インスタンス１，２，３の全てが初期ブロックのみである。一方、図３（ｂ）に示す状態では、インスタンス２は初期ブロックのみであるが、インスタンス１，３は各々追加ブロックが新たに確保される為、２つのブロックを有するものとなっている。この例の場合、格納先ブロック５４は、変数名５１の変数等の割当位置が、これら２つのブロックのうちのどちらのブロック内であるのかを示すものとなる。本例では、格納先ブロック５４が‘０’の場合は初期ブロック、格納先ブロック５４が‘１’の場合は追加ブロックであることを示すものとする。尚、この例に限らず、例えば１つの追加ブロックだけでは足りずに２つ目の追加ブロックが確保された場合には、例えば格納先ブロック５４が‘２’の場合には２つ目の追加ブロックを示すものとしてもよい。
【００７６】
尚、特に詳細には説明しないが、後述する変数宣言部分には、図４（ｃ）に示すように変数名として「ＦＢ１インスタンス」、型として「ＦＢ１（２）」等といった情報も含まれていてもよい。尚、これはＦＢ呼出しに係る情報であり、この例ではＦＢＣＡＬＬがＦＢ１を呼び出すことになるが、ここでは特に関係ないので、これ以上詳細には説明しない。
【００７７】
また、コンパイラ機能部１１は、コンパイル時に変数をＰＬＣ３０のメモリに割り付ける際、「変数情報管理表」２４を元に、「ＰＯＵインスタンスアドレス割付対応表」２６を作成する。
【００７８】
当該対応テーブル２６の一例を図５（ａ）、（ｂ）に示す。図５（ａ）は図６の処理後、図５（ｂ）は図８の処理後の状態を示す。ここでは、「ＰＯＵインスタンスアドレス割付対応表」２６のフォーマットのみについて説明するものとし、内容等の説明は図６、図８の説明の際に説明する。
【００７９】
図５（ａ）、（ｂ）に示すように、「ＰＯＵインスタンスアドレス割付対応表」２６は、インスタンス番号６１、ＰＯＵ名６２、先頭アドレス６３、インスタンスサイズ６４、追加変数格納先アドレス６５、追加変数格納先サイズ６６の各データ項目より成る。
【００８０】
まず、上記の通り、各ＰＯＵ毎に１以上のインスタンスが生成されるものであり、インスタンス生成毎にそのインスタンスに識別番号を割付ける。ここでは、インスタンス番号は、インスタンス生成毎に‘１’から順にシリアルに番号が付されるものとする（＋１インクリメントされる）。ここでは上記インスタンス１，２，３の識別番号が、‘１’、‘２’、‘３’であるものとする。よって、図示のインスタンス番号６１＝‘１’、‘３’のレコードは、上記インスタンス１、３に関する情報であり、従ってそのＰＯＵ名６２は両方とも図示の通り“ＦＢ１”となっている。
【００８１】
先頭アドレス６３及びインスタンスサイズ６４には、インスタンス番号６１のインスタンスに割当てられた上記初期ブロックの先頭アドレス（実アドレス）とサイズが格納される。ここで、例えば、最初に生成されたインスタンスである上記インスタンス１に関しては、その先頭アドレスには予め決められたデフォルト値（＝1000番地）が割り当てられるものとする。また、ＦＢ１に関しては、図４（ｂ）に示す例ではそのブロック全体のサイズは６Ｗ（ワード）であるので、インスタンスサイズ６４＝‘６’となっている。つまり、インスタンス１に割当てられる初期ブロックの領域は、1000番地〜1005番地となっている。
【００８２】
これより、次に生成されたインスタンス２に関しては、その先頭アドレス６３は1006番地（1005番地+1あるいは1000番地＋６）となる。
また、追加変数格納先アドレス６５及び追加変数格納先サイズ６６には、上記追加変数格納領域（追加ブロック）の先頭アドレス（実アドレス）とサイズが格納される。尚、追加変数格納先アドレス６５及び追加変数格納先サイズ６６は、上記追加ブロックの数の分だけ存在する。ここでは、未だ追加ブロックは存在しないので、追加変数格納先アドレス６５及び追加変数格納先サイズ６６には図５（ａ）に示すように“ＮＵＬＬ”及び‘０’が格納される。
【００８３】
図２の例では、ＦＢ１についてはインスタンス１，３、ＦＢ２についてはインスタンス２の合計３つのインスタンス化が成されている。
インスタンス１のメモリ割付けを実施する時、ＰＯＵがＦＢ１なので、ＦＢ１の「変数情報管理表」２４から、インスタンス化に必要なサイズ（ブロックのサイズ）を算出する（本例では６Ｗ（ワード））。このサイズを元に、ＰＬＣ３０のメモリ（そのＰＯＵインスタンスメモリ領域４３）にインスタンス１のブロックの領域を確保する。
【００８４】
同様にして、インスタンス２のＰＯＵはＦＢ２なので、ＦＢ２の「変数情報管理表」２４から、インスタンス化に必要なサイズ（ブロックのサイズ）を算出し、このサイズを元に上記インスタンス２のブロックの領域を確保する。
【００８５】
上記の処理を、インスタンスの数分繰り返し実施する。
「ＰＯＵインスタンスアドレス割付対応表」２６には、各インスタンスの割当て領域（ブロック）の先頭アドレスとサイズが設定される。図５（ａ）の段階では、初期ブロックの先頭アドレス６３とサイズ６４が設定される一方で、追加ブロックは未だ存在しないので、追加変数格納先アドレス６５には無効を示すＮＵＬＬ情報が設定されると共に、追加変数格納先サイズ６６には‘０’が設定される。
【００８６】
ユーザが、変数の追加を伴う修正版／更新版の（バージョンアップ版等の）ソースコード２１を作成してコンパイルの実施を指示・操作した時、コンパイラ機能部１１は、各ＰＯＵ毎に、追加変数がある場合にはまず当該追加変数を予備領域に割付けるようにする。予備領域で収まる場合は、「変数情報管理表」２４を更新し（追加変数のメモリ割当て情報を追加し）、予備領域のサイズ（型５２）を減らすと共に予備領域の相対位置５３を変更する。予備領域では収まらないような変数の追加が行われていた場合、コンパイラ機能部１１は、空き領域に追加ブロックの領域を確保すると共に、この追加ブロック領域内に追加変数を割当てる。また、確保した追加ブロックの領域の先頭アドレスとサイズを、追加変数格納先アドレス６５、追加変数格納先サイズ６６に格納する。
【００８７】
これによって、例えば、図５（ａ）の状態から図５（ｂ）の状態へと移行することになる。図５（ｂ）の例では、ＦＢ１に関しては予備領域では対応できないような変数の追加が行われた為に、ＦＢ１の各インスタンス１，３に関しては追加ブロックが新たに確保され、各追加ブロックの先頭アドレスとサイズが、図示のように格納される（図示の例ではアドレス６５が‘1034’と‘1044’）。
【００８８】
尚、この追加ブロックについても、初期ブロックと同様に、変数の格納領域だけでなく、予備領域や上記「追加変数格納先アドレス」の領域が含まれるようにしてもよい。
以下、図６、図８のフローチャート図を参照して、上述したコンパイラ機能部１１の処理についてより詳細に説明する。
【００８９】
図６は、新規作成されたソースコード２１のコンパイル時の処理を示す。
図８は、既存のソースコード２１の一部を修正／更新等（特に変数の追加を伴う修正／更新）して成る修正版（バージョンアップ版）のソースコード２１のコンパイル時の処理を示す。
【００９０】
まず、図６の処理について説明する。
図６において、まず、コンパイル対象のソースコード２１に記述されている各ＰＯＵ毎に、そのソースコードに基づいて「コンパイル（変数宣言）」処理を行うことになる。すなわち、各ＰＯＵのソースコードは、大別して、変数宣言部分と本文部分とから成るものであり、当該「コンパイル（変数宣言）」処理では、この変数宣言部分を参照してステップＳ１２〜Ｓ１５の処理を行うものである。尚、特に図示しないが、変数宣言部分には、各変数の名称と型が宣言されており、更にそのＰＯＵの名称（ＰＯＵ名；プログラム作成者が任意に決めている）も記述されている。
【００９１】
図６の処理では、全ＰＯＵについて「コンパイル（変数宣言）」処理済みであるか否かを判定し（ステップＳ１１）、未だ「コンパイル（変数宣言）」処理を行っていないＰＯＵがある場合には（ステップＳ１１，ＮＯ）、当該未処理のＰＯＵのうちの１つを処理対象として、「コンパイル（変数宣言）」処理（ステップＳ１２〜Ｓ１５の処理）を実行する。
【００９２】
すなわち、処理対象ＰＯＵのソースコードの上記変数宣言部分を読み込み（ステップＳ１２）、これに基づいて「ソースコード識別番号対応表」２２と「変数情報管理表」２４を作成する（ステップＳ１３〜Ｓ１５）。
【００９３】
すなわち、まず、上記ステップＳ１２で読み込んだＰＯＵのソースコードの上記変数宣言部分に基づいて、「ソースコード識別番号対応表」２２にＰＯＵ名と識別番号を登録する（ステップＳ１３）。そして識別番号を更新する（ステップＳ１４）。
【００９４】
ここで、図７に、「ソースコード識別番号対応表」２２の具体例を示す。
図示の例の「ソースコード識別番号対応表」２２は、ＰＯＵ名７１、識別番号７２の各データ項目より成る。ＰＯＵ名７１には、上記処理対象ＰＯＵのソースコードの上記変数宣言部分から得られるＰＯＵ名等（そのＰＯＵの識別情報）が格納される。識別番号７２には、ＰＯＵ名７１のＰＯＵに対して任意に割り当てた識別番号が格納される。ここでは識別番号の初期値を‘１’とし、上記ステップＳ１４の処理で＋１インクリメントする更新を行うものとし、それによって図７に示すように識別番号７２は１，２，３，４等となっている。
【００９５】
上記ステップＳ１４の処理に続いて、上記処理対象ＰＯＵに関する「変数情報管理表」２４を作成する（ステップＳ１５）。すなわち、まず、予め設定されている「変数情報管理表」２４の雛形（図４（ａ）は作成済みの状態を示すが、雛形では未だデータは何も格納されていない）を取得して、これに上記処理対象ＰＯＵのＰＯＵ名／識別番号を付与すると共に、この処理対象ＰＯＵのソースコードの上記変数宣言部分に記述されている各変数に関する情報（上記のように変数名や型など）を、上記取得した雛形に登録する。
【００９６】
例えば図４（ａ）に示す例は、処理対象ＰＯＵがＦＢ１であり、そのソースコードの変数宣言部分に最初に記述されている変数の変数名は変数１であり、その型はＩＮＴ型であり、そのサイズは１Ｗ（ワード）であったものとしている。それ故に図示のように変数名５１と型５２に、それぞれ、変数１、ＩＮＴ（１）が登録される。また、最初に登録される変数に関してはその相対位置５３は必ず‘０’とする。
【００９７】
尚、図６の処理では初期ブロックへの割当てになるので、逐一述べないが、格納先ブロック５４は図４（ａ）に示すように全てのレコードで‘０’となる。
また、ここでは、変数宣言部分に２番目に記述されている変数の変数名は変数２であり、その型はＷＯＲＤ型であり、そのサイズは１Ｗ（ワード）であったものとしている。これより、図示のように変数２に関しては、変数名５１と型５２に、それぞれ、変数２、ＷＯＲＤ（１）が登録される。そして、相対位置５３に関しては、１つ前のレコードにおける型５２（そのサイズ）に相対位置５３を加算した値を登録する。ここでは、１つ前のレコードの型５２はＩＮＴ（１）、相対位置５３は‘０’であるので、１＋０＝１が、図示の通り変数２のレコードの相対位置５３に登録されることになる。
【００９８】
そして、全ての変数の登録が完了したら、続いて、変数名５１に所定の名称（「予備領域」と「追加変数格納先アドレス」）をそれぞれ登録すると共に、それぞれに対応する所定のサイズ（予め決められている）を型５２に登録する。図示の例では両方ともサイズ＝‘２’となっている。そして、上記変数２の場合と同様にして相対位置５３を算出して登録する。これは「予備領域」に関してはＷＯＲＤ（１）＋１＝２が登録され、「追加変数格納先アドレス」に関しては２＋２＝４が登録されることになる。
【００９９】
尚、上記処理の際に、更に、最後のレコード（「追加変数格納先アドレス」のレコード）における型５２（そのサイズ）に相対位置５３を加算した値を、当該対象ＰＯＵ（ここではＦＢ１）に関する上記ブロックの全体サイズとして算出しておき、これを後述する「ＰＯＵインスタンスアドレス割付対応表」２６の作成の際にそのインスタンスサイズ６４に登録するようにしてもよい。上記の例では、「追加変数格納先アドレス」のレコードおける型５２（そのサイズ）は‘２’、相対位置５３は‘４’であるので、このブロックの全体サイズ＝２＋４＝６が求められ、これによって図５（ａ）の例ではＦＢ１に関するインスタンスサイズ６４は‘６’となっている。
【０１００】
コンパイル対象のソースコード２１に記述されている全てのＰＯＵに関して上記コンパイル（変数宣言）処理を実行したならば（ステップＳ１１，ＹＥＳ）、続いて、当該全てのＰＯＵについてステップＳ１７〜Ｓ２０によるインスタンス化処理を実行する。これは、ソースコード２１（例えばＰＧ）を先頭から順次参照していき、ＰＯＵ（ＦＢやＦＣＴ）呼び出しの記述がある毎に（更に呼び出されたＰＯＵに更に他のＰＯＵの呼び出しの記述がある毎に）当該呼び出されるＰＯＵのインスタンス化を実行する。
【０１０１】
例えば、上記の例では例えばＰＧにおいてＦＢ１呼出し、ＦＢ２呼出し、ＦＢ１呼出しの記述があった場合、上記一例のようにＦＢ１に関しては２回のインスタンス化でインスタンス１とインスタンス３が得られ、ＦＢ２に関しては１回のインスタンス化でインスタンス２が得られることになる。
【０１０２】
ソースコード２１に記述されている全てのＰＯＵについてインスタンス化処理を実行したら（ステップＳ１６，ＹＥＳ）、ステップＳ２１以降の処理へと移行する。
以下、ステップＳ１７〜Ｓ２０の処理（インスタンス化処理）について説明する。このインスタンス化処理は、上記各ＰＯＵ毎のインスタンス毎に、その上記ブロックのメモリ領域を確保すると共に、このブロック領域の先頭アドレス（実アドレス）とサイズを「ＰＯＵインスタンスアドレス割付対応表」２６に登録する処理である。
【０１０３】
まず、処理対象ＰＯＵに関する上記「変数情報管理表」２４を読み込む（ステップＳ１７）。そして、処理対象ＰＯＵに関して確保すべきメモリ領域全体の（上記ブロックの）サイズを計算する（ステップＳ１８）。この計算方法は既に述べた通りであり、上記の通り対象ＰＯＵがＦＢ１の場合には全体サイズ（ブロックサイズ）＝‘６’が算出されることになる。
【０１０４】
続いて、「ＰＯＵインスタンスアドレス割付対応表」２６を参照して空きアドレスを検索する（ステップＳ１９）。これは、例えば上記確保すべきブロックの先頭アドレスを求めるものである。
【０１０５】
例えば、ＦＢ１に関する２回目のインスタンス化の場合、図５（ｂ）の例では４つのレコードが登録されているが、ここではそのうちの最初の２つのレコードのみが「ＰＯＵインスタンスアドレス割付対応表」２６に登録されている状態となっていることになる。つまり、インスタンス番号６１が‘１’である先頭レコードと‘２’である２番目のレコードとが登録されている状態である。
【０１０６】
この状態で上記ＦＢ１に関する２回目のインスタンス化処理が行われる場合、ＰＯＵ名は当然「ＦＢ１」であり、またインスタンス番号＝‘３’が割り当てられ、ＦＢ１に関する全体サイズは上記の通り‘６’が算出されているので、当該インスタンス３のブロックの領域の先頭アドレスが分かれば、「ＰＯＵインスタンスアドレス割付対応表」２６への新規登録が行える。この先頭アドレスは、現時点での最後のレコード（ここでは２番目のレコード）における先頭アドレス６３にインスタンスサイズ６４を加算することで求められる。２番目のレコードの先頭アドレス６３は‘1006’、インスタンスサイズ６４は‘１２’であるので、１００６＋１２＝１０１８が算出される。
【０１０７】
以上得られた情報を、図示の通り、３番目のレコードにおけるインスタンス番号６１、ＰＯＵ名６２、先頭アドレス６３、インスタンスサイズ６４に格納する。更に、既に述べたように追加変数格納先アドレス６５には“ＮＵＬＬ”が格納され、追加変数格納先サイズ６６には‘０’を格納する。このようにして「ＰＯＵインスタンスアドレス割付対応表」２６に新規レコードを登録したら（ステップＳ２０）、ステップＳ１６に戻り、全てのインスタンス化が行われたか否かを判定し、全インスタンス化が完了したならば（ステップＳ１６，ＹＥＳ）、ステップＳ２１の処理へ移行する。
【０１０８】
上記インスタンス化処理が完了したら、最後に、コンパイル対象のソースコード２１における各ＰＯＵ毎に「コンパイル（コード）」処理を行う。既に説明した「コンパイル（変数宣言）」処理は上記変数宣言部分に基づく処理であったが、「コンパイル（コード）」処理は上記本文部分を機械語に変換する処理である。
【０１０９】
特に例示はしないが、本文部分には、上記変数宣言部分で宣言された各種変数を用いた任意の処理が記述されており、これを機械語に変換する際にアドレス割り当てを行う必要がある。
【０１１０】
ステップＳ２１では全てのＰＯＵインスタンスについて「コンパイル（コード）」処理を実行したか否かを判定し、全ＰＯＵインスタンスについて実行済みならば（ステップＳ２１，ＹＥＳ）本処理を終了する。一方、未処理のＰＯＵインスタンスがあるならば（ステップＳ２１，ＮＯ）、そのうちの１つを処理対象として、基本的には、この処理対象ＰＯＵのソースコード（本文部分）を読み込み（ステップＳ２２）、このソースコードを機械語に変換するものである（ステップＳ２６）。但し、ステップＳ２６の処理の前に、「ＰＯＵインスタンスアドレス割付対応表」２６の読込み（ステップＳ２４）、及び処理対象ＰＯＵに関する「変数情報管理表」２４の読込みを行ったうえで（ステップＳ２５）、これらを参照して「変数のアドレス解決」処理を行い（ステップＳ２３）、以って１ＰＯＵ分の機械語オブジェクト生成を行う（ステップＳ２６）。
【０１１１】
すなわち、まず、処理対象ＰＯＵのＰＯＵ名を用いて「ＰＯＵインスタンスアドレス割付対応表」２６を検索して、該当するレコードを見つける毎に、そのレコードの先頭アドレス６３や追加変数格納先アドレス６５等を用いて、更に「変数情報管理表」２４も参照して、「変数のアドレス解決」処理を行う。尚、上記該当するレコードとは、そのＰＯＵ名６２が、上記処理対象ＰＯＵのＰＯＵ名と同一であるレコードである。
【０１１２】
基本的には、上記該当レコードの先頭アドレス６３と、各変数毎の型５２及び相対位置５３とによって、各変数のアドレス解決が実現されるが、上記追加変数格納領域に格納される変数に関しては更に追加変数格納先アドレス６５等を用いる処理が必要となる。詳しくは後述する。
【０１１３】
上記「変数のアドレス解決」及び機械語への変換処理については、後に具体例を用いて説明するものとする。
次に、図８の処理について説明する。
【０１１４】
尚、図８では省略しているが、図示のステップＳ３１の判定がＹＥＳとなった場合には、更に続いて図６のステップＳ２１〜Ｓ２６の処理を実行する。
図８の処理の場合、既に述べた通り、コンパイル対象は上記修正版／更新版（バージョンアップ版等）のソースコード２１である。これは例えば人間が判断して指定することで図６と図８の何れかの処理が実行されるようにしている。つまり、特に図示しないが、ユーザがコンパイル処理を指示する操作ボタンには、新規用と修正版用の２種類あり、ユーザが新規用を操作した場合には図６の処理が実行され、修正版用を操作した場合には図８の処理が実行される。
【０１１５】
あるいは、ユーザが特に指定しなくても開発支援装置（ローダ）１０が自動的に図６、図８のどちらの処理を実行するのかを判断するようにしてもよい。これは、例えばオンラインの場合には図８の処理を実行し、オフラインのときには図６の処理を実行するようにしてもよい。尚、オンラインの場合とは、ＰＬＣを保守する為に開発支援装置（ローダ）１０がＰＬＣ３０に接続され且つ両者の通信が確立しているときである。
【０１１６】
上記修正版のソースコード２１のコンパイル時にその各ＰＯＵ毎に本処理（ステップＳ３２〜Ｓ３９の処理）を実行し、全てのＰＯＵについて本処理を実行済みとなったら（ステップＳ３１，ＹＥＳ）、本処理を終了する（上記ステップＳ２１〜Ｓ２６の処理に移行する）ものである。
【０１１７】
未処理のＰＯＵがある場合、そのうちの１つを処理対象として、当該処理対象ＰＯＵのソースコードを読み込み（ステップＳ３２）、更に当該処理対象ＰＯＵに関する上記「変数情報管理表」２４を読み込み（ステップＳ３３）、これらに基づいて追加変数があるか否かを判定する（ステップＳ３４）。すなわち、ステップＳ３２で読み込んだソースコードの変数宣言部分に記述されている全ての変数名を取得して、これらの変数名が全て上記「変数情報管理表」２４の変数名５１に登録されているか否かをチェックする。未登録の変数が１つも無い場合には、追加変数は存在しないと判定し（ステップＳ３４，ＮＯ）、ステップＳ３１に戻る。
【０１１８】
一方、未登録の変数がある場合には、当該未登録の変数が追加変数ということになり、ステップＳ３４の判定はＹＥＳとなり、ステップＳ３５へ移行する。
ステップＳ３５では、全ての追加変数を予備領域に割付可能か否かを判定する。これは、まず、各追加変数の“型”を上記ソースコードから抽出する。“型”は上記ＩＮＴ、ＷＯＲＤ等であり、“型”によってその変数のサイズ（占有領域）が決まるものである。上記の例では、ＩＮＴ、ＷＯＲＤは両方とも、サイズ（占有領域）が１Ｗ（ワード）となるものである。上記“型”によって、各追加変数のサイズが分かるので、これらの合計を求めることで追加変数全体のサイズが分かる。一方、ステップＳ３３で読み込んだ「変数情報管理表」２４において、変数名５１が「予備領域」のレコードにおける型５２を取得することで、予備領域のサイズが分かる。図４（ａ）の例では予備領域のサイズは‘２’であることになる。
【０１１９】
そして、上記追加変数全体のサイズが、予備領域のサイズ以下であるならば、ステップＳ３５の判定はＹＥＳとなり、ステップＳ３６の処理を実行する。
ステップＳ３６では、追加変数のメモリ割当てを行い、それに伴って「変数情報管理表」２４を更新する。
【０１２０】
例えば、図４（ａ）の例に対して、例えば追加変数が１つだけであり（仮に、変数名を“追加変数１”とする）、且つ、その型がＩＮＴであったとしたならば、追加変数全体のサイズ（占有領域）は１Ｗ（ワード）であり、予備領域のサイズは‘２’であることから、上記ステップＳ３５の判定はＹＥＳとなる。
【０１２１】
そして、この例では、特に図示しないが、図４（ａ）に示す「変数２」のレコードの次のレコード（空きレコード）に、“追加変数１”に関する登録を行う。すなわち、特に図示しないがこのレコードでは、変数名５１が“追加変数１”、型５２がＩＮＴ（１）、相対位置５３が‘２’、格納先ブロック５４が‘０’となる。尚、相対位置５３の求め方は既に述べた通りである。
【０１２２】
これに伴って予備領域の確保分を削減しなければならないので、図４（ａ）に示す「予備領域」のレコードの型５２と相対位置５３を更新する。型５２は‘２’であったが、上記追加変数のサイズである１Ｗ（ワード）を差し引くことで、‘１’に更新されることになる。また、相対位置５３は‘３’となる。尚、相対位置５３の求め方は既に述べた通りである。
【０１２３】
一方、例えば追加変数が２つあって（仮に“追加変数１”と“追加変数２”とする）、各サイズ（占有領域）が２Ｗ（ワード）であった場合、合計で４Ｗ（ワード）となる為、上記予備領域では対応できず、ステップＳ３５の判定はＮＯとなる。尚、ここでは“型”がＤＩＮＴである場合には、２Ｗ（ワード）必要であるものとする。
【０１２４】
ステップＳ３５がＮＯの場合には、上記追加変数格納領域（追加ブロック）を確保すると共に、当該追加ブロック領域のアドレス情報や追加変数の割当て情報を、上記各種テーブル２４、２６（管理表２４、対応表２６）などに登録する。
【０１２５】
まず、「変数情報管理表」２４に拡張用の情報を追加する（ステップＳ３７）と共に追加変数を登録する（ステップＳ３８）。これによって、例えば図４（ａ）に示す例の「変数情報管理表」２４は、図４（ｂ）に示す状態になる。図示のように拡張用の情報（レコード）は、格納先ブロック５４を全て‘１’とすることで、上記追加変数格納領域（追加ブロック）における割当て情報であることを示す。追加ブロックの場合も、初期ブロックに関する割当て情報（図４（ａ）に示すもの）と同様に、変数だけでなく、予備領域及び追加変数格納先アドレスの領域も確保して、図示のように相対位置５３と型５２（サイズ）を登録する。
【０１２６】
そして、追加変数を割当てるが、これはまず初期ブロックの予備領域への割当てを試みて、割当て可能であるならば初期ブロックの予備領域への割当てを行う。本例では、追加変数１，２の両方を初期ブロックの予備領域に割当てることは出来ないが、追加変数１のみは割当て可能なので、図４（ｂ）に示すように追加変数１は初期ブロックの予備領域への割当てを行う。これによって初期ブロックでは予備領域は無くなることになる。尚、追加変数１の初期ブロックへの割当て処理は、上記ステップＳ３６と略同様であってよい。但し、本例ではこれによって初期ブロックの予備領域の型５２が‘０’になるので、この場合には初期ブロックの予備領域のレコードを削除する。
【０１２７】
一方、この例では追加変数２は、初期ブロックに割当てることはできないので、追加ブロック内に割当てる。よって、図示の通り、追加変数２に関するレコードの格納先ブロック５４は‘１’となっている。この点を除けば、追加変数２の追加ブロック内への割当て処理は、上記変数１、２の初期ブロックへの割当て処理と略同様であり、ここでは詳細には説明しないが、図示の通り、型５２にはＤＩＮＴ（２）が登録されると共に、相対位置５３には‘０’が登録されることになる。
【０１２８】
尚、予備領域や追加変数格納先アドレスのサイズは、予め任意に決められて設定されているものとし、ここでは予備領域のサイズは、初期ブロックに関しては‘２’であるが、追加ブロックに関しては‘８’が設定されているものとしている。追加変数格納先アドレスに関して、初期ブロック、追加ブロックどちらもサイズ＝‘２’となっている。
【０１２９】
以上、「変数情報管理表」２４の更新を行ったら、続いて、「ＰＯＵインスタンスアドレス割付対応表」２６の更新を行う（ステップＳ３９）。すなわち、図５（ａ）ではＮＵＬＬで‘０’としていた追加変数格納先アドレス６５及び追加変数格納先サイズ６６に、上記追加ブロックの領域の先頭アドレスとサイズを登録する。これによって例えば図５（ｂ）に示す状態となる。
【０１３０】
尚、追加変数格納先サイズ６６は、上記インスタンスサイズ６４と同様に、「変数情報管理表」２４に基づいて求めることができる。また、追加変数格納先アドレス６５は、既に確保済みの領域のなかで最後のブロックの領域情報、すなわち図示の例ではＰＯＵ名が「ＰＧ１」のブロックの先頭アドレス６３＝1024とインスタンスサイズ６４＝１０とに基づいて、１０２４＋１０＝１０３４が求められることになる。
【０１３１】
尚、上記ステップＳ３６またはＳ３９の処理後は、ステップＳ３１に戻る。
上記図８の処理が完了したら、図６におけるステップＳ２１〜Ｓ２６の処理を実行することになる。当然、この場合には、例えば図４（ｂ）と図５（ｂ）に示す状態のテーブル２４、２６を参照して、処理実行することになる。
【０１３２】
以上、図８の処理について説明した。
ここで、上述してあった通り、上記ステップＳ２３〜Ｓ２６の処理について、以下、具体例を示して説明する。換言すれば、コンパイラの機械語コード生成例について以下に説明する。
【０１３３】
まず、以下の何れの例においても、本説明で用いるソースコードは、下記のような単純な例であるものとする。
ソースコード例；  変数２：＝変数１；
すなわち、変数１の値を変数２に代入するという単純な処理である。
【０１３４】
まず最初は、上記ソースコード例がプログラムＰＧ１に記述されたものであるとする。
この場合、まず「ＰＯＵインスタンスアドレス割付対応表」２６（図５（ｂ））を参照することで、ＰＧ１の先頭アドレス（1024）が得られる。また、「変数情報管理表」２４を参照することで、変数１、変数２それぞれのオフセットアドレス（相対位置）が得られる。図４等にはＰＧ１に関する「変数情報管理表」２４の具体例は図示していないが、仮に、変数１の相対位置５３が‘０’、変数２の相対位置５３が‘２’であったとするならば、上記ＰＧ１の先頭アドレス（1024）に、これら各変数のオフセット値を足した値が、各変数の実アドレスとなる。すなわち、１０２４＋０＝１０２４が変数１の格納アドレス（実アドレス）となる。同様に、１０２４＋２＝１０２６が変数２の格納アドレス（実アドレス）となる。
【０１３５】
以上のことからＰＧ１の場合、上記ソースコード例に応じた機械語例は、以下のようになる。
ＬＤ  Ｂ  1024
ＳＴ  Ｂ  1026
尚、よく知られているように、ＬＤ命令は、指定したアドレスの内容を演算用メモリに読み込む命令である。ＳＴ命令は、演算用メモリの内容を指定したアドレスに書き込む命令である。更に、ＬＤ命令と指定アドレス（ここでは1024）との間の‘Ｂ’は、領域サイズを指定する為のオプションであり、‘Ｂ’は１バイト分を意味する。尚、同様にして、Ｗは２バイト分、Ｔは４バイト分を意味する。よって、上記「ＬＤ  Ｂ  1024」は“1024番地から１バイト分の領域の内容を演算用メモリに読み込む”ことを意味する。これはＳＴ命令に関しても同様である。尚、例えば「ＬＤ  Ｗ  1024」は“1024番地から２バイト分の領域（つまり1024番地〜1025番地）の格納データを演算用メモリに読み込む”ことになる。
【０１３６】
プログラム（ＰＧ）の場合は、１ＰＯＵが１つだけインスタンス化されるため、変数にアクセスするコードを直接アドレス（実アドレス）で機械語を生成しても問題が無いが、ＦＢの場合、１つのＰＯＵが複数インスタンス化されるため問題が発生する。
【０１３７】
例えば上記の例でＦＢ１の場合には、図４、図５に示す例より、上記ソースコード例に応じた機械語例は、以下のようになる。
ＬＤ  Ｂ  1000
ＳＴ  Ｂ  1001
ＦＢ１に関して１つだけインスタンス化されるならば、これでも問題はないが、上記の通り、複数インスタンス化された場合、全てのインスタンスが同じアドレスへアクセスするため（ＬＤでは１０００番地、ＳＴでは１００１番地）、ＦＢ内の変数の独立性が保てない（ＦＢ内の内部変数は、独立していることが規約で定められている）。
【０１３８】
そこで、コンパイラ機能部１１は、コンパイル対象ＰＯＵがＦＢ（ここではＦＢ１）の場合には、例えば下記のようにベースポインタ(Base)経由で変数にアクセスする機械語を生成する。
【０１３９】
ＬＤ  Ｂ  Base＋０
ＳＴ  Ｂ  Base＋１
ここで、各ＦＢの実行時には、上記Baseポインタにはインスタンスの先頭アドレスが入ることになり（図４、図５の例の場合、インスタンス１の場合にはBase＝1000、インスタンス２の場合にはBase＝1018が代入されることになる）、これはＦＢを呼び出すＰＯＵが設定するものである。以下、まず、ＦＢ１を呼び出すＰＯＵが、ＰＧである場合について、具体的な機械語コードの生成例を示して説明する。
【０１４０】
ＰＧからＦＢ１（ここではＦＢ１のインスタンス１）を呼び出す場合の例を、以下に示す。この場合、コンパイラ機能部１１はコンパイル時に、上記各種テーブル２２、２６等を参照して、上記ＰＧからＦＢ１を呼出すと共にその際に上記Baseポインタの設定を行う機械語コードを生成する。
【０１４１】
すなわち、基本的に、任意のＦＢ（そのインスタンス）を呼び出す場合は、その識別番号（ＰＯＵの識別番号）とインスタンスアドレス（先頭アドレス）が必要である。これより、まず、図７に示すソースコード識別番号対応表２２を参照して、呼び出すＦＢ（ここではＦＢ１）の識別番号７２（ここでは‘１’）を取得する。また、インスタンスアドレスは、上記「ＰＯＵインスタンスアドレス割付対応表」２６から取得する。図５の例では、ＦＢ１のインスタンス１の先頭アドレス６３は‘1000’となっている。
【０１４２】
これより、ＰＧにおけるＦＢ１（インスタンス１）を呼び出しに係る機械語コードが、以下のように生成されることになる。
ＬＤ      Ｔ１０００
ＳＴ      Ｂａｓｅ
ＣＡＬＬ  １
尚、「ＬＤ  １０００」は１０００番地のデータを演算用メモリに読み込むものであるが、上記「ＬＤ  Ｔ１０００」は、Ｔの後の数値（ここでは１０００）を演算用メモリに読み込むものである。従って、上記機械語は、‘1000’を取得して、これをBaseに代入した後、ＦＢ１を呼び出す処理となる。
【０１４３】
そして、この場合、呼び出されたＦＢ１の上記機械語の処理は、実質的に以下の内容と同等となる。
ＬＤ  Ｂ  １０００＋０
ＳＴ  Ｂ  １０００＋１
尚、ＣＡＬＬ命令は、識別番号（ここでは‘１’）によって指定されたＰＯＵを呼び出す命令である。
【０１４４】
尚、同じＦＢ１を用いる場合でも、インスタンス３の場合には、以下の機械語が生成されることになる。
ＬＤ      Ｔ１０１８
ＳＴ      Ｂａｓｅ
ＣＡＬＬ  １
この場合、呼び出されたＦＢ１の上記機械語の処理は、実質的に以下の内容と同等となる。
【０１４５】
ＬＤ  Ｂ  １０１８＋０
ＳＴ  Ｂ  １０１８＋１
ＰＧの場合、上記「ＬＤ    １０００」のように直接アドレス（実アドレス）をコード上に記述することができる。
【０１４６】
呼び出し元がＦＢの場合も、上記と略同様であってよいので、ここでの説明は省略する。
次に、以下、追加変数へのアクセスに係わる機械語コード生成例について説明する。
【０１４７】
例えば、下記のソースコードをコンパイルして機械語コードを生成する例を用いて説明する。
ソースコード例；
追加変数２：＝変数２；
つまり、変数２の内容を追加変数２に代入する処理である。
【０１４８】
尚、特に説明しないが、本例においても当該ＦＢの呼出元のＰＯＵが、Baseの値を設定している。尚、本例のＦＢは、上記ＦＢ１であるものとする。そして、ＦＢ１に係る変数情報管理表２４は、図４（ｂ）に示す状態となっているものとする。
【０１４９】
この場合、図４（ｂ）に示すＦＢ１の「変数情報管理表」２４を参照して、まず、変数２に関しては、格納先ブロック５４が‘０’であるので、初期ブロックに格納されていると判定し、そのオフセット（相対位置５３）が‘１’であることから、変数２に対応するアドレスは「Base＋１」であると決定する。従って、上記ソースコード例ではまず変数２に対応するアドレスの格納データを読み出すことになるので機械語コード「ＬＤ  Base＋１」が生成される。
【０１５０】
続いて、追加変数２に関しては、図４（ｂ）に示すＦＢ１の「変数情報管理表」２４の例では格納先ブロック５４が‘１’であるので、「追加変数格納先アドレス１」経由でアクセスするものと判定すると共に、そのオフセット（相対位置５３）＝‘０’を取得して一時的に記憶する。そして、「変数情報管理表」２４において変数名５１が“追加変数格納先アドレス１”であるレコードを参照することで、そのオフセット（相対位置５３）が‘４’であることから、対応するアドレスは「Base＋４」であると判定する
以上の処理に基づいて、下記の機械語コードを生成することになる（尚、以下の例では上記ＢやＷ等は省略している）。
【０１５１】
ＬＤ        Base＋１
ＬＤＡＸ    Base＋４
ＡＤＤＡＸ  ０
ＳＴ        ＡＸ
尚、上記機械語コードにおいて、ＬＤＡＸ命令は、指定されたアドレスの格納データを、ＡＸレジスタ（アドレス演算用の内部変数）にセットする命令である。上記の例の場合、アドレス“Base＋４”の格納データを、ＡＸレジスタにセットすることになる。
【０１５２】
ＦＢ１のインスタンス１の場合、Base＝1000が設定されているはずであるので、アドレス“1004”の格納データを、ＡＸレジスタにセットすることになる。尚、アドレス“1004”には予めインスタンス１に係わる追加ブロックの先頭アドレス（本例では‘1034’）が格納されている。これについては後に図９を参照して説明する。
【０１５３】
なお、ＦＢ１のインスタンス３の場合、Base＝1018が設定されているはずであるので、アドレス“1022”の格納データを、ＡＸレジスタにセットすることになる。尚、アドレス“1022”には予めインスタンス３に係わる追加ブロックの先頭アドレス（本例では‘1044’）が格納されている。これについても後に図９を参照して説明する。
【０１５４】
また、ＡＤＤＡＸ命令は、ＡＸレジスタの格納内容に、指定した数字を加算する命令であり、上記機械語においては追加変数２の格納アドレスを演算している。インスタンス１の場合には、アドレス“1004”の格納データ（‘1034’）に‘０’が加算された値が、ＡＸレジスタの新たな格納データとなる。インスタンス３の場合には、アドレス“1022”の格納データ（‘1044’）に‘０’が加算された値が、ＡＸレジスタの新たな格納データとなる。
【０１５５】
また、上記「ＳＴ  ＡＸ」は、ＡＸレジスタの格納データが示すアドレスに、上記１行目のＬＤ命令でロードしたデータ（変数２のデータ）を格納する命令である。従って、本例では、インスタンス１の場合にはアドレス‘1034’に変数２のデータを格納することになり、インスタンス３の場合にはアドレス‘1044’に変数２のデータを格納することになる。
【０１５６】
ここで、上記アドレス“1004”や“1022”には、予めＰＬＣ３０が、開発支援装置１０から機械語オブジェクト２３と共にダウンロードされたＰＯＵインスタンスアドレス情報２５に基づいて、該当データを設定しておく。
【０１５７】
図９に、上記図４（ｂ）、図５（ｂ）の例に応じたＰＯＵインスタンスアドレス情報２５の一例を示す。
図９の例のＰＯＵインスタンスアドレス情報２５は、アドレス８１と値８２から成る。
【０１５８】
アドレス８１には“追加変数格納先アドレス”のアドレスが格納され、値８２には追加変数格納領域の先頭アドレスが格納される。
図４（ｂ）に示すＦＢ１の「変数情報管理表」２４では“追加変数格納先アドレス”のオフセット（相対位置５３）が‘４’である。また、図５（ｂ）の「ＰＯＵインスタンスアドレス割付対応表」２６の例では、ＦＢ１によるインスタンス１の先頭アドレス６３は‘1000’、追加変数格納先アドレス６５は‘1034’となっており、ＦＢ１によるインスタンス３の先頭アドレス６３は‘1018’、追加変数格納先アドレス６５は‘1044’となっている。これより、図９に示すように、アドレス８１が‘1004’（＝1000+4）に対して値８２が‘1034’となっており、アドレス８１が‘1022’（＝1018+4）に対して値８２が‘1044’となっている。
【０１５９】
以上のＰＯＵインスタンスアドレス情報２５生成処理は、例えばコンパイラ機能部１１がコンパイルの際に行うものであり、その後、コンパイル結果として得られる機械語オブジェクト２３と共にＰＯＵインスタンスアドレス情報２５がＰＬＣ３０にダウンロードされる。これより、ＰＬＣ３０側では（例えばプログラム実行管理機能部３１が）、当該新たな機械語オブジェクト２３による運用を開始する前に、ＰＯＵインスタンスアドレス情報２５に基づく設定処理を行う。
【０１６０】
図９に示す例では、アドレス‘1004’にデータ“1034”を格納し、アドレス‘1022’に対してデータ“1044”を格納することになる。この例の場合、上記「ＬＤＡＸ    Base＋４」は、インスタンス１の場合にはアドレス‘1004’の格納データすなわち“1034”を、ＡＸレジスタに格納することになり、インスタンス３の場合にはアドレス‘1022’の格納データすなわち“1044”を、ＡＸレジスタに格納することになる。
【０１６１】
尚、ＰＯＵインスタンスアドレス情報２５の代わりに「ＰＯＵインスタンスアドレス割付対応表」２６をＰＬＣ３０にダウンロードすることで、ＰＬＣ３０側で上記設定処理を行わせるようにしてもよい。但し、「ＰＯＵインスタンスアドレス割付対応表」２６は、
データ量が多い為、ＰＬＣでは扱いにくいので、該当アドレスとその内容（追加変数格納領域の先頭アドレス）を取り出した情報を格納したのが、上記「ＰＯＵインスタンスアドレス情報」２５である。ＰＬＣ３０は、この情報２５を獲得し、ＰＬＣ３０内のメモリに、上記該当アドレスで指定された場所に値を展開する。
【０１６２】
尚、上記のBaseポインタの設定例は、コンパイラ（コード生成）で実施しているが、ＰＬＣ内のシステム（Call内）で同様な動作を実施することも可能である。
以上説明したように、本例のプログラマブルコントローラの支援装置によれば、ユーザが変数追加を伴うプログラムの更新を実施しても、既に割り付けた変数（既存の変数）のアドレス（割当位置）を変更することなく、追加した変数を新しいアドレスに割り付けることが可能になり、ＰＬＣを停止しないで（ＰＬＣを停止することは、システムを停止することになる）、プログラムを更新できるため、システムの稼動性、保守性、拡張性が向上する。特に既に確保済みのブロックのみでは全ての追加変数を割り当てられない場合であっても、追加ブロックを生成して追加変数を格納できるので、最初に確保したブロックのサイズ（予備領域のサイズ）によって制限を受けることなく、変数の追加を行うことができる。
【符号の説明】
【０１６３】
１０  開発支援装置（ローダ）
１１  コンパイラ機能部
１２  インタフェース機能部
１３  通信機能部
１４  ディスプレイ
１５  入力装置
２０  記憶部
２１  ソースコード
２２  ソースコード識別番号対応表
２３  機械語オブジェクト
２４  変数情報管理表
２５  ＰＯＵインスタンスアドレス情報
２６  ＰＯＵインスタンスアドレス割付対応表
３０  ＰＬＣ（プログラマブルコントローラ）
３１  プログラム実行管理機能部
３２  通信機能部
４０  記憶部
４１  機械語オブジェクト
４２  ＰＯＵインスタンスアドレス情報
４３  ＰＯＵインスタンスメモリ領域
５１  変数名
５２  型
５３  相対位置
５４  格納先ブロック
６１  インスタンス番号
６２  ＰＯＵ名
６３  先頭アドレス
６４  インスタンスサイズ
６５  追加変数格納先アドレス
６６  追加変数格納先サイズ
７１  ＰＯＵ名
７２  識別番号
８１  アドレス
８２  値
【図１】
0005790128.tif 000002
【図２】
0005790128.tif 000003
【図４】
0005790128.tif 000004
【図５】
0005790128.tif 000005
【図６】
0005790128.tif 000006
【図７】
0005790128.tif 000007
【図８】
0005790128.tif 000008
【図９】
0005790128.tif 000009
【図３】
0005790128.tif 000010