(57)【要約】  グローバル変数の宣言を含むシーケンスプログラム（Ｐ，Ｑ）をコンパイルしてＰＬＣ（２０）で実行される実行プログラム（３１）を生成する処理を、コンピュータに実行させるコンパイラ（１１Ｘ）であって、グローバル変数の宣言の編集前後で、グローバル変数に対して割付けられるＰＬＣ（２０）内のメモリアドレスが変化した場合、編集前のグローバル変数に割付けられるメモリアドレスに格納される第１の値と、編集後のグローバル変数に割付けられるメモリアドレスに格納される第２の値とを同期させる実行コードを、編集後のグローバル変数を参照するシーケンスプログラム（Ｐ）に対応する実行プログラムに付与する。
2019215919.tif 000002
【特許請求の範囲】
【請求項１】
グローバル変数の宣言を含むシーケンスプログラムをコンパイルして制御装置で実行される実行プログラムを生成する処理を、コンピュータに実行させるコンパイラであって、
前記グローバル変数の宣言の編集前後で、前記グローバル変数に対して割付けられる前記制御装置内のメモリアドレスが変化した場合、編集前のグローバル変数に割付けられるメモリアドレスに格納される第１の値と、編集後のグローバル変数に割付けられるメモリアドレスに格納される第２の値とを同期させる実行コードを、前記編集後のグローバル変数を参照するシーケンスプログラムに対応する実行プログラムに付与する処理を前記コンピュータに実行させる、
ことを特徴とするコンパイラ。
【請求項２】
前記グローバル変数および前記グローバル変数の宣言を含むシーケンスプログラムが変更または追加されたことを示す変更有無情報に基づいて、複数のシーケンスプログラムを含んだシーケンスプログラム群の中から前記実行コードを付与する対象となる、前記編集後のグローバル変数を参照するシーケンスプログラムを選択可能なことを特徴とする請求項１に記載のコンパイラ。
【請求項３】
前記実行コードは、単一の命令で構成される、
ことを特徴とする請求項１または２に記載のコンパイラ。
【請求項４】
前記実行コードは、複数の命令で構成される、
ことを特徴とする請求項１または２に記載のコンパイラ。
【請求項５】
前記編集前のグローバル変数と、前記編集後のグローバル変数とでデータ型が同じである場合、前記実行コードにコピー命令を用いることによって、前記第２の値をコピーして前記編集前のグローバル変数に割付けられるメモリアドレスに書き込むか、または前記第１の値をコピーして前記編集後のグローバル変数に割付けられるメモリアドレスに書き込むことで、前記第２の値と、前記第１の値とを同期させる、
ことを特徴とする請求項１から４のいずれか１つに記載のコンパイラ。
【請求項６】
前記編集前のグローバル変数と、前記編集後のグローバル変数とで、データ型が異なる場合、前記実行コードにデータ型を変換して値を書き込む命令を用いることによって、前記第２の値をコピーしたうえでデータ型を変換して前記編集前のグローバル変数に割付けられるメモリアドレスに書き込むか、または前記第１の値をコピーしたうえでデータ型を変換して、前記編集後のグローバル変数に割付けられるメモリアドレスに書き込むことで、前記第２の値と、前記第１の値とを同期させる、
ことを特徴とする請求項１から４のいずれか１つに記載のコンパイラ。
【請求項７】
請求項１に記載のコンパイラと、
ユーザからの指示に従って、前記グローバル変数および前記グローバル変数の宣言を含むシーケンスプログラムを編集するとともに、ユーザからの指示に従って、複数のシーケンスプログラムを含んだシーケンスプログラム群の中から前記実行コードを付与する対象となる、前記編集後のグローバル変数を参照するシーケンスプログラムを選択可能な編集装置と、
を備えることを特徴とするプログラミング支援装置。
【請求項８】
グローバル変数の宣言を含むシーケンスプログラムをコンパイルして制御装置で実行される実行プログラムを生成するコンパイラを備えるプログラミング支援装置であって、
当該プログラミング支援装置とは別のプログラミング支援装置によって宣言された前記グローバル変数と、前記グローバル変数に対して割付けられる前記制御装置内のメモリアドレス割付けられる前記制御装置内のメモリアドレスと、を取得する取得部を備え、
前記コンパイラは、
前記グローバル変数の宣言の編集前後で、前記グローバル変数に対して割付けられる前記制御装置内のメモリアドレスが変化した場合、編集前のグローバル変数に割付けられるメモリアドレスに格納される第１の値と、編集後のグローバル変数に割付けられるメモリアドレスに格納される第２の値とを同期させる実行コードを、前記編集後のグローバル変数を参照するシーケンスプログラムに対応する実行プログラムに付与する、
ことを特徴とするプログラミング支援装置。
【請求項９】
前記取得部は、前記別のプログラミング支援装置から、前記グローバル変数と、前記グローバル変数に対して前記制御装置内のメモリに割付けられるメモリアドレスと、を受信する、
ことを特徴とする請求項８に記載のプログラミング支援装置。
【請求項１０】
前記取得部は、前記別のプログラミング支援装置によって生成された実行プログラムが書き込まれた前記制御装置から、前記グローバル変数と、前記グローバル変数に対して前記制御装置内のメモリに割付けられるメモリアドレスと、を読み出す、
ことを特徴とする請求項８に記載のプログラミング支援装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、グローバル変数の宣言を含んだシーケンスプログラムをコンパイルするコンパイラおよびプログラミング支援装置に関する。
【背景技術】
【０００２】
制御装置であるＰＬＣ（Programmable  Logic  Controller：プログラマブルロジックコントローラ）は、シーケンスプログラムを用いてシーケンス制御を実行する。このシーケンスプログラムは、プログラミング装置で作成およびコンパイルが行われた後、ＰＬＣに書き込まれる。【０００３】
シーケンスプログラムには、全てのシーケンスプログラムから参照可能なグローバル変数が含まれる場合がある。このグローバル変数は、コンパイルによってＰＬＣのメモリ領域に割付けられる。シーケンスプログラムがグローバル変数にアクセスする際には、グローバル変数の割付先のメモリアドレスが参照される。【０００４】
特許文献１に記載の情報処理装置は、複数のグローバル変数のうち一部のみが更新された状況を防ぐため、グローバル変数を公開領域と作業領域との２箇所に割付けておき、上位優先度のタスクは、作業領域を用いてグローバル変数を更新し、下位優先度のタスクは、公開領域を用いてグローバル変数を参照している。この情報処理装置は、下位優先度のタスクによるグローバル変数の参照が完了すると、作業領域と公開領域とを切換えることによって、グローバル変数の参照時の同時性（一貫性または無矛盾性とも呼ばれる）を確保している。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００２−１４９４２１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかしながら、上記特許文献１の技術を含め従来一般的に、グローバル変数の宣言が編集されてグローバル変数に割付けられるメモリアドレスが変化した場合、再度、グローバル変数を参照している全てのシーケンスプログラムに対してコンパイルを実行していた。このため、コンパイルに要する時間が長くなるという問題があった。【０００７】
本発明は、上記に鑑みてなされたものであって、コンパイルに要する時間を抑制することができるコンパイラを得ることを目的とする。
【課題を解決するための手段】
【０００８】
上述した課題を解決し、目的を達成するために、本発明は、グローバル変数の宣言を含むシーケンスプログラムをコンパイルして制御装置で実行される実行プログラムを生成する処理を、コンピュータに実行させるコンパイラであって、グローバル変数の宣言の編集前後で、グローバル変数に対して割付けられる制御装置内のメモリアドレスが変化した場合、編集前のグローバル変数に割付けられるメモリアドレスに格納される第１の値と、編集後のグローバル変数に割付けられるメモリアドレスに格納される第２の値とを同期させる実行コードを、編集後のグローバル変数を参照するシーケンスプログラムに対応する実行プログラムに付与する処理をコンピュータに実行させる、ことを特徴とする。
【発明の効果】
【０００９】
本発明にかかるコンパイラは、コンパイルに要する時間を抑制することができるという効果を奏する。
【図面の簡単な説明】
【００１０】
【図１】本発明の実施の形態１にかかるプログラミング装置の構成を示すブロック図
【図２】実施の形態１にかかるプログラミング装置の動作手順の概略を示すフローチャート
【図３】実施の形態１にかかるグローバル変数の宣言を説明するための図
【図４】図３のグローバル変数を参照するシーケンスプログラムの例を示す図
【図５】実施の形態１にかかるメモリ割付情報の更新前の構成を示す図
【図６】グローバル変数が編集される前の、実施の形態１にかかる、実行プログラムと参照先のメモリアドレスとの関係を示す図
【図７】図３に示したグローバル変数が編集された後の、実施の形態１にかかるグローバル変数宣言の例を説明するための図
【図８】図４に示したシーケンスプログラムが編集された後のシーケンスプログラムの例を説明するための図
【図９】実施の形態１にかかるメモリ割付情報の更新後の構成を示す図
【図１０】実施の形態１にかかるプログラミング装置によるグローバル変数の割付処理手順を示すフローチャート
【図１１】グローバル変数が編集された後の、実施の形態１にかかる、実行プログラムと参照先のメモリアドレスとの関係を示す図
【図１２】実施の形態１にかかるプログラミング装置による実行プログラムの生成処理手順を示すフローチャート
【図１３】実施の形態２にかかるプログラミング装置の構成を示すブロック図
【図１４】図３に示したグローバル変数が編集された後の、実施の形態２にかかるグローバル変数宣言の例を説明するための図
【図１５】グローバル変数が編集された後の、実施の形態２にかかる、実行プログラムと参照先のメモリアドレスとの関係を示す図
【図１６】実施の形態３にかかるプログラミングシステムの構成を示すブロック図
【図１７】実施の形態１から３にかかるプログラミング装置のハードウェア構成例を示す図
【発明を実施するための形態】
【００１１】
以下に、本発明の実施の形態にかかるコンパイラおよびプログラミング支援装置を図面に基づいて詳細に説明する。なお、これらの実施の形態によりこの発明が限定されるものではない。
【００１２】
実施の形態１．
図１は、本発明の実施の形態１にかかるプログラミング装置の構成を示すブロック図である。プログラミング支援装置であるプログラミング装置１０Ｘは、シーケンスプログラム群３５Ｘに含まれるシーケンスプログラムの作成を支援するコンピュータである。プログラミング装置１０Ｘは、コンパイラ１１Ｘを用いて、シーケンスプログラム群３５Ｘに含まれるシーケンスプログラムをコンパイルする。
【００１３】
プログラミング装置１０Ｘは、制御装置であるＰＬＣ２０に接続されている。プログラミング装置１０Ｘは、シーケンスプログラム群３５Ｘおよびグローバル変数群３６Ｘを作成する機能と、シーケンスプログラム群３５Ｘに含まれるシーケンスプログラムを編集する機能と、グローバル変数群３６Ｘに含まれるグローバル変数の宣言を編集する機能とを有している。また、プログラミング装置１０Ｘは、シーケンスプログラム群３５Ｘおよびグローバル変数群３６ＸをコンパイルすることによってＰＬＣ２０で実行可能な実行プログラム３１を生成する機能を有している。なお、本実施の形態におけるグローバル変数の編集は、グローバル変数の値を変更する処理ではなく、グローバル変数の宣言の編集である。グローバル変数を宣言する情報には、後述するデータ型または属性などが含まれている。
【００１４】
プログラミング装置１０Ｘは、コンパイラ１１Ｘと、編集装置３０と、通信部３２と、プログラム格納部３１０とを備えている。編集装置３０は、ユーザからの指示に従って、シーケンスプログラム群３５Ｘおよびグローバル変数群３６Ｘを作成し、ユーザからの指示に従って、シーケンスプログラム群３５Ｘおよびグローバル変数群３６Ｘを編集する。編集装置３０は、作成または編集された、シーケンスプログラム群３５Ｘおよびグローバル変数群３６Ｘを記憶しておく。なお、編集装置３０は、プログラミング装置１０Ｘから独立した構成としてもよい。この場合、編集装置３０は、プログラミング装置１０Ｘに接続される。
【００１５】
シーケンスプログラム群３５Ｘには、シーケンスプログラムＰ，Ｑのように複数のシーケンスプログラムが含まれている。また、グローバル変数群３６Ｘは、シーケンスプログラム群３５Ｘで使用されるグローバル変数の集合である。グローバル変数群３６Ｘには、後述するgVar1〜gVar4のように複数のグローバル変数が含まれている。グローバル変数群３６Ｘ内の各グローバル変数は、大域的なスコープを持つ変数であり、シーケンスプログラム群３５Ｘ内の複数のシーケンスプログラムによって参照可能となっている。したがって、グローバル変数群３６Ｘ内の各グローバル変数は、ＰＬＣ２０内に書き込まれた複数の実行プログラム３１から参照可能である。
【００１６】
シーケンスプログラム群３５Ｘのプログラミング言語仕様は、例えば、国際電気標準会議によりIEC（International  Electrotechnical  Commission）61131-3として規格化されており、シーケンスプログラム群３５Ｘは、データを保持する変数を使用することが可能である。シーケンスプログラム群３５Ｘを記述するプログラミング言語としては、例えばIEC61131-3規格では、インストラクションリスト、ストラクチャードテキスト、ラダーダイアグラム、ファンクションブロックダイアグラム、シーケンシャルファンクションチャートが規定されているが、本実施の形態においてはこれらに限定されない。
【００１７】
コンパイラ１１Ｘは、ＰＬＣ２０で実行可能な実行プログラム３１を生成するプログラムである。コンパイラ１１Ｘは、シーケンスプログラム群３５Ｘおよびグローバル変数群３６Ｘをコンパイルすることによって、シーケンスプログラム群３５Ｘおよびグローバル変数群３６Ｘを実行プログラム３１に変換する。コンパイラ１１Ｘは、シーケンスプログラム群３５Ｘに含まれる一部のシーケンスプログラムのみを、コンパイルすることもできる。
【００１８】
コンパイラ１１Ｘは、参照関係管理部１２と、メモリ割付部１４と、プログラム選択部１７と、実行プログラム生成部１６とを備えている。参照関係管理部１２は、シーケンスプログラムとグローバル変数との参照関係を管理する。参照関係管理部１２は、シーケンスプログラムとグローバル変数との参照関係を示す参照関係情報１３を作成する。具体的には、参照関係管理部１２は、シーケンスプログラム群３５Ｘに含まれる全てのシーケンスプログラムと、グローバル変数群３６Ｘに含まれる全てのグローバル変数との間の参照関係を参照関係情報１３に登録する。
【００１９】
参照関係管理部１２は、シーケンスプログラム群３５Ｘまたはグローバル変数群３６Ｘが編集されて、シーケンスプログラム群３５Ｘに含まれるシーケンスプログラムとグローバル変数群３６Ｘに含まれるグローバル変数との参照関係が変更された場合には、参照関係情報１３を更新する。
【００２０】
参照関係情報１３には、何れのシーケンスプログラムおよびグローバル変数が変更または追加されたことを示す変更有無情報が付加されている。また、参照関係情報１３には、シーケンスプログラムおよびグローバル変数の変更内容を示す変更内容情報が付加されている。変更内容情報は、例えば、グローバル変数と、グローバル変数の変更後の属性とが対応付けされた情報である。属性に関しては後述する。参照関係管理部１２は、コンパイルの完了したシーケンスプログラムおよびグローバル変数に対しては、参照関係情報１３内から変更有無情報および変更内容情報を削除する。
【００２１】
メモリ割付部１４は、グローバル変数群３６Ｘに含まれている全てのグローバル変数に対し、参照関係情報１３に基づいて、ＰＬＣ２０のデータメモリ２４または不揮発性データメモリ２５への割付けを実行し、割付けの結果であるメモリ割付情報１５を作成する。割付けの結果は、データメモリ２４または不揮発性データメモリ２５のメモリアドレスである。したがって、メモリ割付部１４は、データメモリ２４または不揮発性データメモリ２５のメモリアドレスをメモリ割付情報１５に登録する。このように、メモリ割付部１４は、グローバル変数にメモリアドレスを設定してメモリ割付情報１５に登録する。
【００２２】
メモリ割付部１４は、グローバル変数群３６Ｘが編集されて、グローバル変数に割付けられるメモリアドレスが変化した場合には、参照関係情報１３に基づいてメモリ割付情報１５を更新する。メモリ割付部１４は、例えば、グローバル変数の属性に許容されるメモリアドレスを設定する。
【００２３】
プログラム選択部１７は、参照関係情報１３に付加されている変更有無情報に基づいて、シーケンスプログラム群３５Ｘ内からコンパイル対象とするシーケンスプログラムを選択する。なお、コンパイル対象とするシーケンスプログラムは、編集装置３０がユーザからの指示に従って選択してもよい。
【００２４】
プログラム選択部１７は、シーケンスプログラム群３５Ｘが最初に作成された際には、シーケンスプログラム群３５Ｘに含まれる全てのシーケンスプログラムをコンパイル対象として選択する。
【００２５】
実行プログラム生成部１６は、メモリ割付情報１５と、プログラム選択部１７によってシーケンスプログラム群３５Ｘ内から選択されたシーケンスプログラムとを用いて、ＰＬＣ２０にて動作させる実行プログラム３１を生成する。実行プログラム３１は、ＰＬＣ２０が解釈および実行可能な命令列である実行コードによって構成される。なお、実行プログラム３１の命令列は、ＰＬＣ２０のアーキテクチャに応じたものであれば、何れの形式の命令列であってもよい。
【００２６】
実行プログラム生成部１６は、作成した実行プログラム３１をプログラム格納部３１０に格納する。プログラム格納部３１０は、実行プログラム３１を記憶するメモリである。通信部３２は、実行プログラム生成部１６が生成した実行プログラム３１を、ＰＬＣ２０に送信する。
【００２７】
ＰＬＣ２０は、プログラミング装置１０Ｘで生成された実行プログラム３１を用いてシーケンス制御を実行する。ＰＬＣ２０は、プログラムメモリ２１と、通信部２２と、プログラム実行部２３と、データメモリ２４と、不揮発性データメモリ２５とを備えている。データメモリ２４および不揮発性データメモリ２５は、グローバル変数を含む実行プログラム３１が参照する変数を記憶するメモリである。データメモリ２４は、揮発性のメモリであり、不揮発性データメモリ２５は、不揮発性のメモリである。
【００２８】
通信部２２は、プログラミング装置１０Ｘの通信部３２から送信されてきた実行プログラム３１を受信し、プログラムメモリ２１に格納する。プログラムメモリ２１は、実行プログラム３１を記憶するメモリである。
【００２９】
プログラム実行部２３は、プログラムメモリ２１から実行プログラム３１を読み出し、実行プログラム３１を構成する命令を実行する。データメモリ２４は、シーケンスプログラム群３５Ｘで使用されるグローバル変数のうち、停電保持属性のないものが割付けられるメモリである。不揮発性データメモリ２５は、シーケンスプログラム群３５Ｘで使用されるグローバル変数のうち、停電保持属性のあるものが割付けられる不揮発性のメモリである。停電保持属性は、停電が発生した際にも消えることなくデータを保持させることを指定するための属性である。したがって、停電保持属性が設定されているグローバル変数は、停電が発生した際にも消えることなくデータを保持するグローバル変数である。停電保持属性があるグローバル変数とは、例えばIEC61131-3規格におけるRETAIN属性を持つグローバル変数であるが、停電保持属性の表現はRETAIN属性に限定されるものではない。
【００３０】
ここで、実行プログラム３１に含まれる、データメモリ２４および不揮発性データメモリ２５を参照するためのメモリアクセス命令を、以下のように表現することとする。
write（Ｘ，Ａｘ)：「Ｘ」の値を、メモリアドレスＡｘの領域に書き込む。
read（Ａｙ，Ｙ）：メモリアドレスＡｙの領域の値を読み出して「Ｙ」の領域に書き込む。
【００３１】
このように、「Ｘ」は、writeの命令（書き込み命令）によってメモリアドレスＡｘの領域に書き込まれる値を示し、「Ｙ」は、readの命令（読み出し命令）によってメモリアドレスＡｙの領域から読み出された値が書き込まれる領域を示す。ここで、「Ｘ」および「Ｙ」は、ＰＬＣ２０のアーキテクチャに応じたものであれば、何れの形式で示される値であってもよい。
【００３２】
データメモリ２４への参照は、メモリアドレスＡｘまたはメモリアドレスＡｙがデータメモリ２４のメモリアドレス範囲である場合のwrite命令または、read命令の実行によって実現される。また、不揮発性データメモリ２５への参照は、メモリアドレスＡｘまたはメモリアドレスＡｙが不揮発性データメモリ２５のメモリアドレス範囲である場合のwrite命令またはread命令の実行によって実現される。ここで、メモリアドレスＡｘおよびメモリアドレスＡｙは、ＰＬＣ２０のアーキテクチャに応じたものであれば、何れの形式のメモリアドレスであってもよい。
【００３３】
つぎに、プログラミング装置１０Ｘの動作手順について説明する。図２は、実施の形態１にかかるプログラミング装置の動作手順の概略を示すフローチャートである。プログラミング装置１０Ｘでは、ユーザからの指示に従って、編集装置３０がシーケンスプログラム群３５Ｘおよびグローバル変数群３６Ｘを作成する（ステップＳ１０）。コンパイラ１１Ｘでは、参照関係管理部１２がシーケンスプログラム群３５Ｘ内のシーケンスプログラムとグローバル変数群３６Ｘ内のグローバル変数との参照関係を示す参照関係情報１３を作成する。また、メモリ割付部１４が、グローバル変数群３６Ｘのグローバル変数にメモリアドレスを割付ける。さらに、メモリ割付部１４が、グローバル変数に割付けたメモリアドレスと、参照関係情報１３とに基づいて、メモリ割付情報１５を作成する（ステップＳ２０）。
【００３４】
実行プログラム生成部１６は、シーケンスプログラム群３５Ｘに含まれる全てのシーケンスプログラムに対して実行プログラム３１を生成する（ステップＳ３０）。具体的には、実行プログラム生成部１６は、作成されたシーケンスプログラム群３５Ｘおよびグローバル変数群３６Ｘを用いて、実行プログラム３１を生成する。そして、通信部３２が、生成された実行プログラム３１をＰＬＣ２０に送信する（ステップＳ４０）。これにより、ＰＬＣ２０は、実行プログラム３１を実行することが可能となる。
【００３５】
この後、プログラミング装置１０Ｘでは、ユーザからの指示に従って、編集装置３０がグローバル変数群３６Ｘの一部およびシーケンスプログラム群３５Ｘの一部を編集する。すなわち、編集装置３０は、ユーザからの指示に従って、シーケンスプログラムおよびグローバル変数の宣言の編集を行う（ステップＳ５０）。ここでは、グローバル変数群３６Ｘのうちの一部のグローバル変数が編集されて、データメモリ２４または不揮発性データメモリ２５へのメモリアドレスの割付先が変更される場合について説明する。本実施の形態では、グローバル変数が、gVar1、gVar2、gVar3、gVar4を含んでおり、これらのうちのgVar1の属性などが編集によって変更され、gVar2、gVar3、gVar4は変更されないものとする。また、本実施の形態では、シーケンスプログラム群３５ＸがシーケンスプログラムＰ，Ｑであり、gVar1の編集と同時にシーケンスプログラムＰが編集されてgVar1の書き込み先および読出し元のメモリアドレスが変更され、シーケンスプログラムＱは変更されないものとする。
【００３６】
gVar1およびシーケンスプログラムＰが編集された後、参照関係管理部１２は、参照関係情報１３を更新し、メモリ割付部１４は、メモリ割付情報１５を更新する（ステップＳ６０）。具体的には、参照関係管理部１２は、参照関係情報１３内の変更有無情報および変更内容情報を更新する。また、メモリ割付部１４は、参照関係情報１３に基づいて、メモリ割付情報１５内のシーケンスプログラムＰのgVar1に対し、参照先のメモリアドレスを新たに割付ける。
【００３７】
プログラム選択部１７は、参照関係情報１３に基づいて、シーケンスプログラム群３５Ｘ内からコンパイル対象とするシーケンスプログラムＰを選択する。プログラム選択部１７が選択するシーケンスプログラムＰは、割付先のメモリアドレスが変更されたグローバル変数を参照するシーケンスプログラムである。したがって、実行プログラム生成部１６は、割付先のメモリアドレスが変更されたグローバル変数を参照するシーケンスプログラムに対して、実行プログラムを生成する（ステップＳ７０）。以下では、シーケンスプログラムＰを用いて生成された実行プログラムを実行プログラムＥＰという。このように、本実施の形態の実行プログラム生成部１６は、複数のシーケンスプログラムＰ，Ｑを含んだシーケンスプログラム群３５Ｘのうち、参照するグローバル変数の割付先のメモリアドレスが変更されたシーケンスプログラムＰに対してのみコンパイルを行う。そして、通信部３２が、生成された実行プログラムＥＰをＰＬＣ２０に送信する（ステップＳ８０）。これにより、ＰＬＣ２０は、実行プログラムＥＰに対応する古い実行プログラム３１を、受信した実行プログラムＥＰで置き換える。
【００３８】
つぎに、プログラミング装置１０Ｘが実行する具体的な処理について説明する。図３は、実施の形態１にかかるグローバル変数の宣言を説明するための図である。図３では、IEC61131-3規格におけるグローバル変数の宣言方法に従ったグローバル変数の宣言例を示している。グローバル変数宣言３６１は、プログラミング装置１０Ｘにおけるグローバル変数群３６Ｘに相当する。ここでは、ＩＮＴ型のグローバル変数としてgVar1が宣言され、初期値が１０．０のＲＥＡＬ型のグローバル変数としてgVar2が宣言され、停電保持属性を持つＩＮＴ型のグローバル変数としてgVar3が宣言され、停電保持属性を持つＷＯＲＤ型のグローバル変数としてgVar4が宣言されている場合を示している。データ型である、ＩＮＴ型、ＲＥＡＬ型、ＷＯＲＤ型は、例えば、グローバル変数のデータサイズ等の意味を示す。本実施の形態では、編集前のグローバル変数と、編集後のグローバル変数とで、データ型が同じであり、グローバル変数に設定可能なデータサイズが編集前後で同じである場合について説明する。なお、本実施の形態におけるグローバル変数の宣言方法は、図３の形式に限定されるものではない。
【００３９】
図４は、図３のグローバル変数を参照するシーケンスプログラムの例を示す図である。図４では、IEC61131-3規格におけるストラクチャードテキストで規定されたシーケンスプログラムの例を示している。図４に示すシーケンスプログラム群３５Ｘは、シーケンスプログラム１１１Ｐ，１１１Ｑを含んでいる。シーケンスプログラム１１１Ｐは、変更前のシーケンスプログラムＰの例であり、図４に示すシーケンスプログラム１１１Ｑは、変更前のシーケンスプログラムＱの例である。
【００４０】
シーケンスプログラム１１１Ｐでは、グローバル変数のgVar1に「Ｐ１」を書き込み、その後グローバル変数のgVar1の値を「Ｐ２」に読み出している。同様に、シーケンスプログラム１１１Ｑは、グローバル変数のgVar1に「Ｑ１」を書き込み、その後グローバル変数のgVar1の値を「Ｑ２」に読み出している。なお、図４では、gVar1以外のグローバル変数への参照は省略している。なお、グローバル変数への参照は図４の形式に限定されるものではない。
【００４１】
グローバル変数宣言３６１内で宣言されているグローバル変数は、メモリ割付部１４によってデータメモリ２４または不揮発性データメモリ２５のメモリアドレスに割付けられ、コンパイルによって実行プログラム３１が生成されると、実行プログラム３１の実行時に、割付先のメモリアドレスが参照される。ここでは、メモリ割付部１４が、グローバル変数宣言３６１に基づいて、データメモリ２４にgVar1およびgVar2を割付け、不揮発性データメモリ２５にgVar3およびgVar4を割付ける。
【００４２】
図５は、実施の形態１にかかるメモリ割付情報の更新前の構成を示す図である。図５では、メモリ割付部１４が、グローバル変数宣言３６１に基づいて作成したメモリ割付情報１５１の構成例を示している。メモリ割付情報１５１は、メモリ割付情報１５の一例である。メモリ割付情報１５１は、データメモリ２４または不揮発性データメモリ２５に割付けられたメモリアドレスを保持している。
【００４３】
メモリ割付情報１５１は、グローバル変数群３６Ｘ内のグローバル変数と、グローバル変数の割付先のメモリアドレスと、このメモリアドレスを参照するシーケンスプログラムと、の対応関係を示す情報である。
【００４４】
メモリ割付情報１５１には、グローバル変数の変数名としてgVar1、gVar2、gVar3、gVar4が登録されている。また、メモリ割付情報１５１では、各グローバル変数に対して、データ型、種類、属性、初期値、メモリアドレス、参照プログラムが対応付けされている。
【００４５】
データ型は、ＩＮＴ型、ＲＥＡＬ型、ＷＯＲＤ型などのグローバル変数のデータの型を示し、種類は、変数のスコープまたは使用方法を示し、属性は、変数の停電保持または定数といった性質を示す。ここでは、各グローバル変数に、グローバル変数を示すVAR_GLOBALが登録され、停電保持属性を有するグローバル変数に、RETAINが登録されている。初期値は、グローバル変数の初期値である。
【００４６】
メモリアドレスは、グローバル変数に割付けられるメモリアドレスを示し、参照プログラムは、メモリアドレスを参照するシーケンスプログラムを示している。ここでは、メモリアドレスにメモリアドレスＡａ，Ａｂ，Ａｃ，Ａｄを示す「Ａａ」、「Ａｂ」、「Ａｃ」、「Ａｄ」が登録されている場合を示している。また、参照プログラムにおける「Ｐ」は、シーケンスプログラムＰを示し、「Ｑ」は、シーケンスプログラムＱを示している。ここでの参照プログラムは、シーケンスプログラム１１１Ｐと、シーケンスプログラム１１１Ｑである。
【００４７】
ここでは、gVar1は、データメモリ２４のメモリアドレスＡａに割付けられ、gVar2はデータメモリ２４のメモリアドレスＡｂに割付けられ、gVar3は不揮発性データメモリ２５のメモリアドレスＡｃに割付けられ、gVar4は不揮発性データメモリ２５のメモリアドレスＡｄに割付けられたことを示している。なお、メモリ割付情報１５の形式は、図５に示した形式に限定されるものではない。
【００４８】
参照関係情報１３では、gVar1、gVar2、gVar3、gVar4が、それぞれシーケンスプログラム１１１Ｐ，１１１Ｑから参照されることが示されているものとする。この場合、参照関係情報１３を用いて作成されるメモリ割付情報１５１でも、gVar1、gVar2、gVar3、gVar4が、シーケンスプログラム１１１Ｐおよびシーケンスプログラム１１１Ｑに参照されていることを示す。
【００４９】
ここで、シーケンスプログラム１１１Ｐ，１１１Ｑから生成された実行プログラムと、これらの実行プログラムによって参照されるメモリアドレスとの関係について説明する。図６は、グローバル変数が編集される前の、実施の形態１にかかる、実行プログラムと参照先のメモリアドレスとの関係を示す図である。図６では、編集前のグローバル変数が、データメモリ２４または不揮発性データメモリ２５に割付けられているイメージを示している。
【００５０】
ここでは、シーケンスプログラム１１１Ｐがコンパイルされて生成された実行プログラムＥＰ５１と、シーケンスプログラム１１１Ｑがコンパイルされて生成された実行プログラムＥＱ５１と、データメモリ２４と、不揮発性データメモリ２５との関係を示している。
【００５１】
実行プログラムＥＰ５１のwriteは、gVar1が割付けられたメモリアドレスＡａへの「Ｐ１」の書き込みを実行させる命令であり、readは、gVar1が割付けられたメモリアドレスＡａの値を読み出して「Ｐ２」への書き込みを実行させる命令である。これらは、それぞれ実行プログラムＥＰ５１のソースプログラムであるシーケンスプログラム１１１Ｐにおける、gVar1への「Ｐ１」の書き込みと、gVar1から読み出した値の「Ｐ２」への書き込みとを意味している。
【００５２】
同様に、実行プログラムＥＱ５１のwriteは、gVar1が割付けられたメモリアドレスＡａへ「Ｑ１」の書き込みを実行させる命令であり、readは、gVar1が割付けられたメモリアドレスＡａの値を読み出して「Ｑ２」への書き込みを実行させる命令である。これらは、それぞれ実行プログラムＥＱ５１のソースプログラムであるシーケンスプログラム１１１Ｑにおける、gVar1への「Ｑ１」への書き込みと、gVar1から読み出した値の「Ｑ２」への書き込みとを意味している。なお、図６では、gVar1以外のグローバル変数の参照は省略している。
【００５３】
図７は、図３に示したグローバル変数が編集された後の、実施の形態１にかかるグローバル変数宣言の例を説明するための図である。ここでは、図３に示したグローバル変数宣言３６１に対して、gVar1が停電保持属性を持つよう変更された場合のグローバル変数宣言３６２を示している。グローバル変数宣言３６２では、図３にて宣言されていたgVar1が、コメントとして扱われることによって削除され、停電保持属性を持つグローバル変数としてgVar1が宣言されている。
【００５４】
図８は、図４に示したシーケンスプログラムが編集された後のシーケンスプログラムの例を説明するための図である。図８に示すシーケンスプログラム群３５Ｘは、シーケンスプログラム１１２Ｐ，１１１Ｑを含んでいる。図８に示すシーケンスプログラム１１２Ｐは、変更後のシーケンスプログラムＰの例である。
【００５５】
前述のgVar1の編集とともに、図４に示したシーケンスプログラム１１１Ｐが、図８に示すシーケンスプログラム１１２Ｐに変更されたものとする。すなわち、gVar1に書き込まれる値が「Ｐ１」から「Ｐ３」に変更され、gVar1の値を読み出して書き込む領域が「Ｐ２」から「Ｐ４」に変更されたものとする。なお、図８に示すシーケンスプログラム１１１Ｑは変更されていない。
【００５６】
図９は、実施の形態１にかかるメモリ割付情報の更新後の構成を示す図である。図９では、メモリ割付部１４が、グローバル変数宣言３６２に基づいて作成したメモリ割付情報１５２の構成例を示している。メモリ割付情報１５２は、メモリ割付情報１５の一例である。メモリ割付情報１５２は、グローバル変数宣言３６１がグローバル変数宣言３６２に変更されるとともにシーケンスプログラム１１１Ｐがシーケンスプログラム１１２Ｐに変更された場合に、メモリ割付部１４がメモリ割付情報１５１を更新することによって作成される。したがって、ここでの参照プログラムは、シーケンスプログラム１１２Ｐと、シーケンスプログラム１１１Ｑである。メモリ割付情報１５２は、メモリ割付情報１５１と同様に、データメモリ２４または不揮発性データメモリ２５に割付けられたメモリアドレスを保持している。
【００５７】
グローバル変数宣言３６２およびシーケンスプログラム１１２Ｐでは、gVar1の箇所が編集されているので、メモリ割付情報１５２では、メモリ割付情報１５１と比較して、gVar1に対応する項目が更新されている。ここでは、メモリ割付部１４が、gVar1に対して新たにメモリアドレスＡｅを割り付ける場合について説明する。
【００５８】
gVar1に対応する項目のうち、割付先のメモリアドレスの項目は、gVar1を編集する前のメモリアドレスとgVar1を編集した後のメモリアドレスとが登録されている。具体的には、gVar1に対応するメモリアドレスの箇所には、gVar1を編集する前のメモリアドレスであるメモリアドレスＡａと、gVar1を編集した後のメモリアドレスであるメモリアドレスＡｅとが登録されている。そして、gVar1の参照プログラムの箇所には、gVar1を編集する前のメモリアドレスＡａに対応付けされた第１のプログラムであるシーケンスプログラムＱと、gVar1を編集した後のメモリアドレスＡｅに対応付けされた第２のプログラムであるシーケンスプログラムＰとが登録されている。
【００５９】
また、メモリ割付情報１５２では、gVar1においてシーケンスプログラムＱに参照されるメモリアドレスＡａは、メモリアドレスＡｅに変更されたことを示す情報が登録される。この情報は、メモリアドレスＡａの値とメモリアドレスＡｅの値とが同期される必要があることを示している。
【００６０】
つぎに、プログラミング装置１０Ｘによる、グローバル変数の割付処理手順について説明する。図１０は、実施の形態１にかかるプログラミング装置によるグローバル変数の割付処理手順を示すフローチャートである。
【００６１】
ここでは、メモリ割付部１４の動作手順について説明する。メモリ割付部１４は、編集後のグローバル変数群３６Ｘにおいてグローバル変数が存在するか否かを判定する（ステップＳ１００）。換言すると、メモリ割付部１４は、グローバル変数が宣言されているか否かを判定する。
【００６２】
グローバル変数が存在する場合（ステップＳ１００、Ｙｅｓ）、メモリ割付部１４は、メモリアドレスの割付対象となるグローバル変数を取得する（ステップＳ１１０）。この処理は、グローバル変数群３６Ｘから、割付対象となるグローバル変数、すなわちコンパイル前に編集されたグローバル変数を取得する処理である。具体的には、メモリ割付部１４は、グローバル変数群３６Ｘの中から、編集によってメモリアドレスの新たな割付けが必要となったグローバル変数を取得する。
【００６３】
続いて、メモリ割付部１４は、取得したグローバル変数に割付先のメモリアドレスが設定されているか否かを判定する（ステップＳ１２０）。メモリアドレスが設定されている場合（ステップＳ１２０、Ｙｅｓ）、このメモリアドレスが設定されているグローバル変数は、既存のものである。メモリアドレスの割付対象となるグローバル変数は、既存のグローバル変数に編集が行われたグローバル変数である。このため、メモリ割付部１４は、既存の割付先のメモリアドレスを維持したまま新規にメモリアドレスを割付けるため、新規のメモリアドレスを登録するための登録先である登録領域をメモリ割付情報１５２に作成する（ステップＳ１３０）。なお、メモリ割付情報１５における登録領域は、メモリ割付情報１５に応じたものであれば何れの領域であってもよい。
【００６４】
メモリ割付部１４は、新規に作成した登録領域に対して、参照プログラムを登録する（ステップＳ１４０）。ここでのメモリ割付部１４は、参照関係情報１３を参照することで参照プログラムを特定し、特定した参照プログラムをメモリ割付情報１５２に登録する。
【００６５】
さらに、メモリ割付部１４は、コンパイル対象であるグローバル変数の割付先のメモリアドレスを決定し、作成済みの登録領域に対して登録する（ステップＳ１５０）。
【００６６】
一方、ステップＳ１２０において、メモリアドレスが設定されていない場合（ステップＳ１２０、Ｎｏ）、メモリ割付部１４が取得したグローバル変数は、初めてメモリアドレスの割付対象となるグローバル変数である。この場合、メモリ割付部１４は、割付先のメモリアドレスを決定し、メモリ割付情報１５２に登録する（ステップＳ１５０）。なお、割付先のメモリアドレスの決定方法は、ＰＬＣ２０のアーキテクチャに応じた方法であれば、何れの方法が適用されてもよい。
【００６７】
この後、メモリ割付部１４は、グローバル変数群３６Ｘにおいてグローバル変数が残っているか否か、すなわち、割付処理が必要なグローバル変数が存在するか否かを判定する（ステップＳ１００）。
【００６８】
グローバル変数が存在する場合（ステップＳ１００、Ｙｅｓ）、上述したステップＳ１１０からＳ１５０およびステップＳ１００の処理を繰り返す。一方、グローバル変数が存在しない場合（ステップＳ１００、Ｎｏ）、メモリ割付部１４は、割付処理を終了する。すなわち、メモリアドレスの割付が全てのグローバル変数に対して完了した場合、メモリ割付部１４は、割付処理を終了する。上述したグローバル変数の割付処理によって、全てのグローバル変数に対して、割付先のメモリアドレスを設定することができる。また、編集が行われたグローバル変数に対しては、割付先となる複数のメモリアドレスを設定することが可能となる。
【００６９】
この図１０で説明した処理により、本実施の形態では、メモリ割付情報１５２のgVar1に対して、メモリアドレスＡｅと参照プログラムであるシーケンスプログラムＰとが登録される。この後、実行プログラム生成部１６は、シーケンスプログラム１１１Ｐから編集されたシーケンスプログラム１１２Ｐに対してメモリ割付情報１５２を用いて実行プログラムＥＰを作成する。
【００７０】
ここで、シーケンスプログラム群３５Ｘおよびグローバル変数群３６Ｘが編集された後に生成された実行プログラムと、これらの実行プログラムによって参照されるメモリアドレスとの関係について説明する。図１１は、グローバル変数が編集された後の、実施の形態１にかかる、実行プログラムと参照先のメモリアドレスとの関係を示す図である。図１１では、編集後のグローバル変数がデータメモリ２４または不揮発性データメモリ２５に割付けられているイメージを示している。ここでは、シーケンスプログラム１１２Ｐがコンパイルされて生成された実行プログラムＥＰ５２と、作成済みの実行プログラムＥＱ５１と、データメモリ２４と、不揮発性データメモリ２５との関係を示している。なお、図１１では、gVar1以外のグローバル変数の参照は省略している。
【００７１】
本実施の形態では、シーケンスプログラム１１１Ｐが編集されてシーケンスプログラム１１２Ｐが作成されているが、シーケンスプログラム１１１Ｑは編集されていない。したがって、コンパイルされるのは、シーケンスプログラム１１２Ｐであり、シーケンスプログラム１１１Ｑはコンパイルする必要がない。
【００７２】
図１１において、実行プログラムＥＰ５２のwriteは、gVar1が割付けられたメモリアドレスＡｅへの「Ｐ３」の書き込みを実行させる命令であり、readは、gVar1が割付けられたメモリアドレスＡｅの値を読み出して「Ｐ４」への書き込みを実行させる命令である。これらは、それぞれ実行プログラムＥＰ５２のソースプログラムであるシーケンスプログラム１１２Ｐにおける、gVar1への「Ｐ３」の書き込みと、gVar1から読み出した値の「Ｐ４」への書き込みとを意味している。実行プログラムＥＱ５１は、編集されていないので、図６で説明したものと同様のものである。
【００７３】
図１１に示すように、編集によって更新された実行プログラムＥＰ５２が参照するgVar1は、不揮発性データメモリ２５内のメモリアドレスＡｅに割付けられ、編集されていない実行プログラムＥＱ５１が参照するgVar1は、データメモリ２４内のメモリアドレスＡａへの割付けが維持される。このように、編集前のグローバル変数の割付先を維持したまま、編集後のグローバル変数の割付けが実行される。
【００７４】
コンパイル対象となるシーケンスプログラム１１２ＰのgVar1の参照は、gVar1に新規に割付けられる不揮発性データメモリ２５内のメモリアドレスＡｅへの参照として実現される。すなわち、実行プログラムＥＰ５２では、gVar1への書き込みはメモリアドレスＡｅへのwriteとして、gVar1からの読み出しはメモリアドレスＡｅへのreadとして実行コードが付与される。
【００７５】
また、本実施の形態の実行プログラム生成部１６は、新規に割付けられたグローバル変数を参照する命令に対して、変更前のメモリアドレスＡａに格納される値と、変更後のメモリアドレスＡｅに格納される値とを同期させるための命令を挿入する。具体的には、実行プログラム生成部１６は、writeの直後およびreadの直前に、copy（Ｂｃ，Ｂｄ）の命令（コピー命令）を挿入する。
copy（Ｂｃ，Ｂｄ）：メモリアドレスＢｃの値を、メモリアドレスＢｄの領域に書き込む。
【００７６】
図１１では、ＢｃおよびＢｄの一方が、Ａｅであり他方がＡａである場合を示している。なお、ここで挿入されるcopyは、直前のwrite、または直後のreadと不可分に動作する命令とする。図１１の実行プログラムＥＰ５２において、copy（Ａｅ，Ａａ）の命令は、write（Ｐ３，Ａｅ）の直後に挿入される。このcopy（Ａｅ，Ａａ）が実行されると、不揮発性データメモリ２５のメモリアドレスＡｅに割付けられたgVar1の値がコピーされて、データメモリ２４のメモリアドレスＡａに割付けられたgVar1に書きまれる（ｓ１）。
【００７７】
同様に、図１１の実行プログラムＥＰ５２において、copy（Ａａ，Ａｅ）の命令は、read（Ａｅ，Ｐ４）の直前に挿入される。このcopy（Ａａ，Ａｅ）が実行されると、データメモリ２４のメモリアドレスＡａに割付けられたgVar1の値がコピーされて、不揮発性データメモリ２５のメモリアドレスＡｅに割付けられたgVar1に書きまれる（ｓ２）。
【００７８】
これにより、シーケンスプログラム１１２Ｐで参照されるgVar1の値と、シーケンスプログラム１１１Ｑで参照されるgVar1の値とが同じ値となる。この結果、gVar1への編集があった場合でも、編集後の実行プログラムＥＰ５２と編集前の実行プログラムＥＱ５１とで同じ値のgVar1を参照することが可能となる。
【００７９】
ここで、実行プログラムＥＰ５２の生成処理手順について説明する。図１２は、実施の形態１にかかるプログラミング装置による実行プログラムの生成処理手順を示すフローチャートである。
【００８０】
ここでは、実行プログラム生成部１６がシーケンスプログラム１１２Ｐから実行プログラムＥＰ５２を生成する処理について説明する。実行プログラム生成部１６は、コンパイル対象のシーケンスプログラム１１２Ｐに対し、特定単位毎にステップＳ２００からＳ２８０の処理を実行する。ここで、シーケンスプログラム１１２Ｐの特定単位は、シーケンスプログラム１１２Ｐを記述するプログラミング言語に応じたものであれば、何れの単位であってもよい。特定単位の例は、シーケンスプログラム１１２Ｐの１行である。
【００８１】
実行プログラム生成部１６は、シーケンスプログラム１１２Ｐの特定単位に対して、ＰＬＣ２０で実行可能な実行コードを生成する（ステップＳ２００）。この実行コードを生成する際にグローバル変数が現れた場合、実行プログラム生成部１６は、割付先であるメモリアドレスを任意の値にしておく。
【００８２】
続いて、実行プログラム生成部１６は、コンパイル対象の特定単位がグローバル変数を含むか否かを判定する（ステップＳ２１０）。具体的には、実行プログラム生成部１６は、ステップＳ２００で用いられた特定単位がグローバル変数を含むか否かを判定する。
【００８３】
コンパイル対象がグローバル変数を含む場合（ステップＳ２１０、Ｙｅｓ）、実行プログラム生成部１６は、コンパイル対象の参照プログラムに合致するメモリアドレスを取得して実行コードを決定する（ステップＳ２２０）。ここでの、実行プログラム生成部１６は、メモリ割付情報１５２に基づいて、コンパイル対象となるgVar1の割付先のメモリアドレスＡａ，Ａｅのうち、コンパイル対象となるシーケンスプログラムＰに対応付けされているメモリアドレスＡｅを取得する。換言すると、実行プログラム生成部１６は、コンパイル対象となるグローバル変数に割付けられたメモリアドレスの中から、コンパイル対象となる参照プログラムが対応付けされているものを取得する。そして、実行プログラム生成部１６は、ステップＳ２００で任意の値としていたグローバル変数の割付先のメモリアドレスを、取得したメモリアドレスに置き換えるとともに、置き換えたメモリアドレスに対応する実行コードを決定する。これにより、グローバル変数が複数のメモリアドレスに割付けられていた場合であっても、コンパイル対象のシーケンスプログラムが参照するメモリアドレスを設定できる。
【００８４】
続いて、実行プログラム生成部１６は、コンパイル対象のグローバル変数に、複数のメモリアドレスが割付けられているか否かを判定する（ステップＳ２３０）。メモリアドレスＡａ，Ａｅのように複数のメモリアドレスが割付けられている場合（ステップＳ２３０、Ｙｅｓ）、メモリアドレスＡａ，Ａｅ間で同じ値を格納するために、実行プログラム生成部１６は、実行プログラムＥＰ５２内にcopyの命令を作成する。
【００８５】
実行プログラム生成部１６は、実行プログラムＥＰ５２内に生成済みの命令がwriteであるか否かを判定する（ステップＳ２４０）。実行プログラムＥＰ５２内に生成済みの命令がwriteの場合（ステップＳ２４０、Ｙｅｓ）、実行プログラム生成部１６は、writeの直後にcopyを挿入する（ステップＳ２５０）。ここで、実行プログラム生成部１６は、copyによる値の取得元のメモリアドレスをステップＳ２２０で取得したメモリアドレスＡｅとし、copyによる値の書き込み先のメモリアドレスをメモリ割付情報１５２に基づいて設定する。このとき、実行プログラム生成部１６は、ステップＳ２３０で複数のメモリアドレスが割付けられていると判定されたメモリアドレスＡａ，Ａｅのうち、ステップＳ２２０で取得されたメモリアドレスＡｅ以外のメモリアドレスＡａを、copyによる値の書き込み先に設定する。このようにメモリアドレスが複数存在する場合、実行プログラム生成部１６は、メモリアドレスの数だけ実行プログラムＥＰ５２内にcopyを挿入する。
【００８６】
実行プログラムＥＰ５２内に生成済みの命令がwriteでない場合（ステップＳ２４０、Ｎｏ）、実行プログラム生成部１６は、実行プログラムＥＰ５２内に生成済みの命令がreadであるか否かを判定する（ステップＳ２６０）。実行プログラムＥＰ５２内に生成済みの命令がreadの場合（ステップＳ２６０、Ｙｅｓ）、実行プログラム生成部１６は、readの直前にcopyを挿入する（ステップＳ２７０）。
【００８７】
ここで、実行プログラム生成部１６は、ステップＳ２５０と同様の方法によって、copyによる値の取得元のメモリアドレスＡａと、copyによる値の書き込み先のメモリアドレスＡｅとを設定する。実行プログラム生成部１６は、ステップＳ２５０またはステップＳ２７０の処理の後にステップＳ２８０の処理を行う。
【００８８】
また、ステップＳ２６０において、実行プログラムＥＰ５２内に生成済みの命令がreadでない場合（ステップＳ２６０、Ｎｏ）、copyの命令は必要がない。この場合、実行プログラム生成部１６は、copyの命令を挿入することなく、ステップＳ２８０の処理を行う。
【００８９】
また、ステップＳ２３０において、複数のメモリアドレスが割付けられていない場合（ステップＳ２３０、Ｎｏ）、コンパイル対象のグローバル変数は唯一のメモリアドレスに割り付けられているので、copyの命令は必要がない。この場合、実行プログラム生成部１６は、copyの命令を挿入することなく、ステップＳ２８０の処理を行う。
【００９０】
また、ステップＳ２１０において、コンパイル対象がグローバル変数を含まない場合（ステップＳ２１０、Ｎｏ）、実行プログラム生成部１６は、copyの命令を挿入することなく、ステップＳ２８０の処理を行う。
【００９１】
ステップＳ２５０の後、ステップＳ２７０の後、ステップＳ２６０でＮｏの場合、ステップＳ２３０でＮｏの場合、またはステップＳ２１０でＮｏの場合、実行プログラム生成部１６は、コンパイル対象が残っているか否かを判定する（ステップＳ２８０）。実行プログラム生成部１６は、シーケンスプログラム１１２Ｐの特定単位毎にステップＳ２００からＳ２８０の処理を繰り返すので、コンパイル対象となる特定単位がシーケンスプログラム１１２Ｐ内に残っているか否かを判定する。すなわち、実行プログラム生成部１６は、コンパイル対象のうち、ステップＳ２００からＳ２８０の処理を行っていない特定単位が存在するか否かを判定する。
【００９２】
コンパイル対象が残っている場合（ステップＳ２８０、Ｙｅｓ）、実行プログラム生成部１６は、残っているコンパイル対象の中の特定単位に対してステップＳ２００からＳ２８０の処理を繰り返す。コンパイル対象が残っていない場合（ステップＳ２８０、Ｎｏ）、実行プログラム生成部１６は、実行プログラムＥＰ５２の生成処理を終了する。
【００９３】
このように、実行プログラム生成部１６は、複数のメモリアドレスにて保持される値をcopyによってメモリアドレス間で同期させるので、複数のシーケンスプログラム１１２Ｐ，１１１Ｑが参照するグローバル変数の値を唯一の値とすることができる。
【００９４】
複数のメモリアドレスにて保持される値をcopyによってメモリアドレス間で同期させない場合、グローバル変数が更新されると、グローバル変数が割付けられるメモリアドレスが変更されるので、グローバル変数を参照しているシーケンスプログラムの全てをコンパイルする必要がある。
【００９５】
特に、シーケンスプログラムの個数が多い大規模システムでは、特定のグローバル変数が編集された場合、コンパイルの対象およびＰＬＣへの書き込み対象は、グローバル変数を参照している全てのシーケンスプログラムとなる。このため、大規模システムでは、コンパイルおよびＰＬＣへの書き込みに要する時間が長くなる。
【００９６】
また、シーケンスプログラムを用いるシステムにおいては、ＰＬＣによって制御される装置を立ち上げる際の動作調整またはデバッグのため、コンパイルおよびＰＬＣへの書き込みが頻繁に繰り返される。このため、デバッグまたは調整の際にもコンパイルおよびＰＬＣへの書き込み時間が長くなる。
【００９７】
これに対し、本実施の形態のプログラミング装置１０Ｘは、コンパイル対象を、割付先のメモリアドレスが変更されたシーケンスプログラム１１２Ｐに限定することができる。なお、本実施の形態では、copyをwriteの直後に挿入することによって複数の命令でグローバル変数の同期を行う場合について説明したが、copyおよびwriteの代わりに、copyおよびwriteを実行させるための単一の命令を挿入してもよい。同様に、本実施の形態では、copyをreadの直前に挿入することによって複数の命令でグローバル変数の同期を行う場合について説明したが、readおよびcopyの代わりに、readおよびcopyを実行させるための単一の命令を挿入してもよい。このように、プログラミング装置１０Ｘは、実行コードを単一の命令で構成してもよいし、複数の命令で構成してもよい。
【００９８】
このように、実施の形態１では、グローバル変数の宣言の編集前後で、グローバル変数に割付けられるメモリアドレスが変化した場合、編集前からの割付先であるメモリアドレスＡａで保持する値と、編集後の割付先であるメモリアドレスＡｅで保持する値とを、copyの命令にて同期させている。これにより、グローバル変数が編集される前のメモリアドレスＡａへ割付けられている未編集のシーケンスプログラム１１１Ｑをコンパイル対象から除外できる。したがって、シーケンスプログラムのコンパイルの処理時間を抑制することができる。
【００９９】
また、ＰＬＣ２０は、未編集のシーケンスプログラム１１１Ｑに対応する実行プログラムＥＱ５１をそのまま用いてシーケンス制御を実行することができる。したがって、実行プログラムＥＰ５２をＰＬＣ２０に書き込む際に、実行プログラムＥＱ５１のＰＬＣ２０への書き込みを省略することができる。
【０１００】
実施の形態２．
つぎに、図１３から図１５を用いてこの発明の実施の形態２について説明する。実施の形態２では、ユーザによって設定されたコンパイル方法で、シーケンスプログラムをコンパイルする。また、特定のコンパイル方法が選択された場合には、編集の前後でグローバル変数に設定可能なデータサイズが異なる場合であっても、データ型変換を実行する命令を用いて、実施の形態１のようにグローバル変数を複数のメモリアドレスに割付ける。
【０１０１】
図１３は、実施の形態２にかかるプログラミング装置の構成を示すブロック図である。図１３の各構成要素のうち図１に示す実施の形態１のプログラミング装置１０Ｘと同一機能を達成する構成要素については同一符号を付しており、重複する説明は省略する。
【０１０２】
プログラミング支援装置であるプログラミング装置１０Ｙは、プログラミング装置１０Ｘと比較して、コンパイルオプション４１に基づいて、コンパイル方法を選択するコンパイルオプション判定部１８を備える点が異なる。具体的には、プログラミング装置１０Ｙは、コンパイラ１１Ｙと、編集装置３０と、通信部３２と、プログラム格納部３１０とを備えている。コンパイラ１１Ｙは、コンパイラ１１Ｘの構成要素に加えて、コンパイルオプション判定部１８を備えている。
【０１０３】
コンパイルオプション４１は、コンパイルの方法を選択するための情報である。コンパイルオプション４１では、第１のオプションと第２のオプションとの何れかが設定されている。第１のオプションは、各グローバル変数に唯一のメモリアドレスを割付けるコンパイル方法を示す値で示され、第２のオプションは、各グローバル変数に複数のメモリアドレスを割付けるコンパイル方法を示す値で示される。したがって、コンパイルオプション４１には、予めユーザが第１のオプションを示す値または第２のオプションを示す値を格納しておく。
【０１０４】
第１のオプションによるコンパイルでは、各グローバル変数に唯一のメモリアドレスが割付けられるので、割付先のメモリアドレスが変更された全てのシーケンスプログラムがコンパイル対象となる。
【０１０５】
第２のオプションによるコンパイルでは、実施の形態１と同様に、グローバル変数を複数のメモリアドレスに割付可能とし、コンパイル対象となるシーケンスプログラムを限定する。なお、複数のメモリアドレスに割付けられているグローバル変数の値は、これを参照するシーケンスプログラム間で一致しない場合があるものとする。
【０１０６】
コンパイルオプション判定部１８は、コンパイルオプション４１に基づいて、第１のオプションで指定された方法でコンパイルを実行するか、第２のオプションで指定された方法でコンパイルを実行するかを判定する。コンパイルオプション判定部１８は、判定結果として、第１のオプションを指定した第１の指示情報または第２のオプションを指定した第２の指示情報を、メモリ割付部１４、プログラム選択部１７、および実行プログラム生成部１６に送信する。
【０１０７】
メモリ割付部１４、プログラム選択部１７、および実行プログラム生成部１６は、コンパイルオプション判定部１８からの第１の指示情報または第２の指示情報に従って処理を実行する。具体的には、メモリ割付部１４は、コンパイルオプション判定部１８から第１の指示情報を受信すると、各グローバル変数に唯一のメモリアドレスを割付ける。また、メモリ割付部１４は、コンパイルオプション判定部１８から第２の指示情報を受信すると、実施の形態１と同様の方法によってグローバル変数にメモリアドレスを割付ける。
【０１０８】
また、プログラム選択部１７は、コンパイルオプション判定部１８から第１の指示情報を受信すると、割付先のメモリアドレスが変更されたグローバル変数を参照する全てのシーケンスプログラムを選択する。また、プログラム選択部１７は、コンパイルオプション判定部１８から第２の指示情報を受信すると、実施の形態１と同様の方法によってシーケンスプログラムを選択する。
【０１０９】
また、実行プログラム生成部１６は、コンパイルオプション判定部１８から第１の指示情報を受信すると、割付先のメモリアドレスが変更されたグローバル変数を参照する全てのシーケンスプログラムにコンパイルを実行する。
【０１１０】
また、実行プログラム生成部１６は、コンパイルオプション判定部１８から第２の指示情報を受信すると、実施の形態１と同様の方法によってシーケンスプログラムをコンパイルする。
【０１１１】
実行プログラム生成部１６は、第１のオプションの場合、実施の形態１におけるcopyを挿入しない実行プログラムを生成し、第２のオプションの場合、実施の形態１で生成したcopyの命令の代わりに、データ型変換を実行させる命令を生成する。
【０１１２】
図１４は、図３に示したグローバル変数が編集された後の、実施の形態２にかかるグローバル変数宣言の例を説明するための図である。ここでは、図３に示したグローバル変数宣言３６１に対し、gVar1のデータ型が変更された場合のグローバル変数宣言３６３を示している。グローバル変数宣言３６３では、図３にて宣言されていたgVar1が、コメントとして扱われることによって命令としては削除され、データ型がＲＥＡＬ型であるグローバル変数としてgVar1が宣言されたものとする。IEC61131-3規格では、ＩＮＴ型は１６ビット符号付き整数であり、ＲＥＡＬ型は３２ビット単精度浮動小数点数である。なお、ここで示したデータ型は、一例であり、他のデータ型が適用されてもよい。
【０１１３】
各データ型が要求するデータサイズは、IEC61131-3規格のＩＮＴ型およびＲＥＡＬ型のように、データ型によって異なるので、グローバル変数に割付けるメモリ量はデータ型ごとに異なる。このため、本実施の形態において、グローバル変数がデータ型の編集によって複数の割付先を持つこととなる場合、それぞれの割付先のデータサイズが異なる場合がある。
【０１１４】
この場合、実施の形態１で説明したコピーに相当する処理は、適合するデータ型の値を同期することができる処理でなければならない。しかしながら、異なるデータサイズであるデータ型における値のコピーでは、コピー元の値とコピー先の値とは必ずしも一致しない場合がある。例えば、データサイズの大きいデータ型の値をデータサイズの小さいデータ型にコピーする場合、データサイズの小さいデータ型で取りうる範囲の値を越えたものは、データサイズの小さいデータ型に正しくコピーできない。このため、本実施の形態では、第１のオプションを示す値と、第２のオプションを示す値との何れかをコンパイルオプション４１に格納しておくことで、ユーザが所望するコンパイル方法でコンパイルを実行する。
【０１１５】
ここで、第２のオプションについて詳細に説明する。前述したように、データサイズが異なるデータ型同士では、値のコピーを実行しても必ずしもその値は一致しない場合がある。しかしながら、特定の種類のデータ型、例えば数値を表すデータ型においては、異なるデータ型であっても特定の範囲においては同じ値を表現することができる。本実施の形態では、この点に着目し、グローバル変数がシーケンスプログラム毎に同じ値となることを保証しないことで、実施の形態１と同様に、未編集のシーケンスプログラムをコンパイル対象としないこととする。
【０１１６】
図１４に示したようにgVar1のデータ型がＩＮＴ型からＲＥＡＬ型に編集された場合、実行プログラム生成部１６は、図１１で示した実行プログラムＥＰ５２において、writeの直後のcopyの代わりに、ＲＥＡＬ型をＩＮＴ型に変換する以下のREAL2INT（Ｃｃ，Ｃｄ）の命令を挿入する。
REAL2INT（Ｃｃ，Ｃｄ）：メモリアドレスＣｃのＲＥＡＬ型の値を、メモリアドレスＣｄの領域にＩＮＴ型として書き込む。
【０１１７】
同様に、実行プログラム生成部１６は、図１１で示した実行プログラムＥＰ５２において、readの直前のcopyの代わりに、ＩＮＴ型をＲＥＡＬ型に変換する以下のINT2REAL（Ｃｃ，Ｃｄ）の命令を挿入する。
INT2REAL（Ｃｃ，Ｃｄ）：メモリアドレスＣｃのＩＮＴ型の値を、メモリアドレスＣｄの領域にＲＥＡＬ型として書き込む。
【０１１８】
このように、実行プログラム生成部１６は、データ型を変換したうえで値を書き込む命令を用いて、編集前からの割付先であるメモリアドレスで保持する値と、編集後の割付先であるメモリアドレスで保持する値とを同期させる。
【０１１９】
上述のREAL2INTおよびINT2REALは、ＰＬＣ２０のアーキテクチャに従って、単一の命令または複数の命令から構成された命令群の何れかで実現される。ただし、これらの命令は、REAL2INTの直前のwrite、またはINT2REALの直後のreadと不可分に実行されるものとする。
【０１２０】
図１５は、グローバル変数が編集された後の、実施の形態２にかかる、実行プログラムと参照先のメモリアドレスとの関係を示す図である。図１５では、グローバル変数が、第２のオプションによって、データメモリ２４または不揮発性データメモリ２５に割付けられているイメージを示している。
【０１２１】
本実施の形態も実施の形態１と同様に、シーケンスプログラム１１１Ｐが編集されてシーケンスプログラム１１２Ｐが作成され、シーケンスプログラム１１１Ｑは編集されていないものとする。第２のオプションが用いられる場合、コンパイルされるのは、シーケンスプログラム１１２Ｐであり、シーケンスプログラム１１１Ｑはコンパイルする必要がない。
【０１２２】
図１５に示すように、編集によって更新された実行プログラムＥＰ５３のgVar1は、データメモリ２４内のメモリアドレスＡｅに割付けられ、編集されていない実行プログラムＥＱ５１のgVar1は、データメモリ２４内のメモリアドレスＡａへの割付けが維持される。このように、本実施の形態でも実施の形態１と同様に、編集前のグローバル変数の割付先を維持したまま、編集後のグローバル変数の割付けが実行される。
【０１２３】
実施の形態１における図１１のwriteの直後のcopyは、本実施の形態では、REAL2INTになり、実施の形態１における図１１のreadの直前のcopyは、本実施の形態では、INT2REALとなる。
【０１２４】
REAL2INTにより、実行プログラムＥＰ５３が参照するメモリアドレスＡｅにwriteにてＲＥＡＬ型として書き込まれる値は、実行プログラムＥＱ５１が参照するメモリアドレスＡａにＩＮＴ型として同期される（ｓ３）。すなわち、REAL2INTにより、メモリアドレスＡｅの値がコピーされたうえでデータ型が変換されてメモリアドレスＡａに書き込まれる。
【０１２５】
また、INT2REALにより、実行プログラムＥＱ５１が参照するメモリアドレスＡａにreadにてＩＮＴ型として読み出される値は、実行プログラムＥＰ５３が参照するメモリアドレスＡｅにＲＥＡＬ型として同期される（ｓ４）。すなわち、INT2REALにより、メモリアドレスＡａの値がコピーされたうえでデータ型が変換されてメモリアドレスＡｅに書き込まれる。
【０１２６】
なお、本実施の形態で例示した、データ型変換を実行する命令である、REAL2INTおよびINT2REALは、シーケンスプログラムで使用可能なデータ型およびＰＬＣ２０のアーキテクチャに応じたものであれば、何れの命令であってもよい。
【０１２７】
このように、実施の形態２では、ユーザがコンパイルオプション４１によって第１のオプションと第２のオプションとを選択することができる。また、第２のオプションでコンパイルが実行される場合、編集前からの割付先であるメモリアドレスＡａで保持する値と、編集後の割付先であるメモリアドレスＡｅで保持する値とを、データ型変換を実行する命令にて同期させている。これにより、編集の前後でデータ型のデータサイズが異なる場合であっても、編集されていないシーケンスプログラム１１１Ｑをコンパイル対象から除外できる。したがって、シーケンスプログラムのコンパイルの処理時間を抑制することができる。
【０１２８】
実施の形態３．
つぎに、図１６を用いてこの発明の実施の形態３について説明する。実施の形態３では、複数のプログラミング装置がＰＬＣ２０に接続されている場合に、特定のプログラミング装置が特定のシーケンスプログラムにコンパイルを実行する。
【０１２９】
図１６は、実施の形態３にかかるプログラミングシステムの構成を示すブロック図である。図１６の各構成要素のうち図１に示す実施の形態１のプログラミング装置１０Ｘと同一機能を達成する構成要素については同一符号を付しており、重複する説明は省略する。
【０１３０】
プログラミング支援システムであるプログラミングシステム１は、プログラミング装置１０Ａ，１０Ｂと、ＰＬＣ２０とを備えている。プログラミング装置１０Ａ，１０Ｂは、プログラミング装置１０Ｘと同様の機能を有している。なお、プログラミング装置１０Ａ，１０Ｂの少なくとも一方は、プログラミング装置１０Ｙと同様の機能を有した装置であってもよい。プログラミング装置１０Ａ，１０Ｂは、ＰＬＣ２０に接続されており、これによりプログラミング装置１０Ａ，１０ＢはＰＬＣ２０を介した情報の送受信を行うことができる。なお、プログラミング装置１０Ａ，１０Ｂは、直接接続されてもよいし、ＰＬＣ２０以外の装置を介して接続されてもよい。
【０１３１】
プログラミングシステム１では、プログラミング装置１０Ａが作成したグローバル変数群３６Ｘと、メモリ割付情報１５とを、以下の（１−ａ）または（１−ｂ）の方法でプログラミング装置１０Ｂにコピーする。プログラミング装置１０Ａからプログラミング装置１０Ｂにコピーされるグローバル変数群３６Ｘの例は、グローバル変数宣言３６１である。また、プログラミング装置１０Ａからプログラミング装置１０Ｂにコピーされるメモリ割付情報１５には、割付先のメモリアドレスと、参照プログラムを示す情報とが含まれている。また、プログラミング装置１０Ａは、メモリ割付情報１５内に、図５で説明した項目に加えて、メモリ割付情報１５がプログラミング装置１０Ａで作成されたことを示す情報をグローバル変数に対応付けして格納しておく。
【０１３２】
（１−ａ）
プログラミング装置１０Ａが、グローバル変数群３６Ｘおよびメモリ割付情報１５を格納したファイルを、プログラミング装置１０Ｂに送信する。プログラミング装置１０Ｂでは、取得部である通信部３２がプログラミング装置１０Ａからのファイルを受信する。このとき、プログラミング装置１０Ａ，１０Ｂは、ネットワーク上でのコピー、メールでの送付等、何れの方法でグローバル変数群３６Ｘおよびメモリ割付情報１５を送受信してもよい。
【０１３３】
（１−ｂ）
プログラミング装置１０Ａが、グローバル変数群３６Ｘおよびメモリ割付情報１５をＰＬＣ２０に書き込む。プログラミング装置１０Ｂでは、取得部である通信部３２が、プログラミング装置１０ＡによってＰＬＣ２０に書き込まれたグローバル変数群３６Ｘおよびメモリ割付情報１５をＰＬＣ２０から読み出す。この場合、ＰＬＣ２０は、書き込まれたグローバル変数群３６Ｘおよびメモリ割付情報１５がプログラミング装置１０Ｂに読み出された後もグローバル変数群３６Ｘおよびメモリ割付情報１５を記憶しておく。
【０１３４】
プログラミング装置１０Ｂは、上述の（１−ａ）または（１−ｂ）の方法によってコピーしたグローバル変数群３６Ｘを用いて、以下の（２−ａ）または（２−ｂ）の方法でシーケンスプログラムを作成するとともに、グローバル変数宣言３６１を変更する。
【０１３５】
（２−ａ）
プログラミング装置１０Ｂは、プログラミング装置１０Ａによって作成されたシーケンスプログラム群３５Ｘの少なくとも一部を編集装置３０で更新することによってシーケンスプログラムを作成する。この場合、プログラミング装置１０Ａ，１０Ｂは、上述の（１−ａ）または（１−ｂ）と同様の方法によって、プログラミング装置１０Ａで作成されたシーケンスプログラム群３５Ｘを、プログラミング装置１０Ｂにコピーする。
【０１３６】
（２−ｂ）
プログラミング装置１０Ｂは、編集装置３０で新たにシーケンスプログラムを作成する。
【０１３７】
プログラミング装置１０Ｂの編集装置３０は、（２−ａ）または（２−ｂ）の方法によって作成したシーケンスプログラムに基づいて、グローバル変数宣言３６１を変更する。プログラミング装置１０Ｂの実行プログラム生成部１６は、（２−ａ）または（２−ｂ）の方法で作成したシーケンスプログラム、および変更したグローバル変数をコンパイルする。このとき、プログラミング装置１０Ｂの実行プログラム生成部１６は、既存のグローバル変数の割付先となっているメモリアドレスに変更があれば、実施の形態１または実施の形態２と同様の方法によってコンパイルを実行する。すなわち、プログラミング装置１０Ｂの実行プログラム生成部１６は、元々のメモリアドレスを保持しつつ、新規のメモリアドレスとの間でグローバル変数の値の同期を行う命令を挿入して、実行プログラムＥＰを生成する。このとき、プログラミング装置１０Ｂのメモリ割付部１４は、メモリ割付情報１５の更新を行っておく。
【０１３８】
プログラミングシステム１では、上述した処理が実行されることにより、プログラミング装置１０Ａに影響を与えることなく、プログラミング装置１０Ｂによる処理を実行することができる。具体的には、プログラミング装置１０Ｂは、プログラミング装置１０Ａに影響を与えることなく、シーケンスプログラムの変更または作成などの処理を実行することができる。これにより、プログラミング装置１０Ａにおいてコンパイルが不要となるので、プログラミングシステム１は、コンパイルの処理時間を抑制することができる。例えば、プログラミング装置１０Ａおよびプログラミング装置１０Ｂでコンパイルが実行される場合と比べて、プログラミング装置１０Ｂのみでコンパイルが実行される方が、コンパイルの合計時間が短くなる。
【０１３９】
プログラミングシステム１の動作例について説明する。図３に示したグローバル変数宣言３６１が、プログラミング装置１０Ａ，１０Ｂの両方にあり、図４に示したシーケンスプログラム１１１Ｐがプログラミング装置１０Ｂのみにあり、図４に示したシーケンスプログラム１１１Ｑがプログラミング装置１０Ａのみにある状態を想定する。この状態で、プログラミング装置１０Ｂのみが、グローバル変数宣言３６１を図７に示したグローバル変数宣言３６２に変更するとともにシーケンスプログラム１１１Ｐを図８に示したシーケンスプログラム１１２Ｐに変更する場合がある。この場合において、プログラミング装置１０ＢのみでコンパイルおよびＰＬＣ２０への書込みを実行し、プログラミング装置１０ＡではコンパイルおよびＰＬＣ２０への書込みを実行しないことで、ＰＬＣ２０内の状態が、図１１のようになる。
【０１４０】
このように、実施の形態３では、プログラミング装置１０Ｂは、プログラミング装置１０Ａに影響を与えることなく、シーケンスプログラムの変更または作成などの処理を実行するので、プログラミング装置１０Ａでのコンパイルが不要となる。この結果、プログラミングシステム１は、コンパイルの処理時間を抑制することができる。
【０１４１】
ここで、プログラミング装置１０Ｘ，１０Ｙのハードウェア構成について説明する。なお、プログラミング装置１０Ｘ，１０Ｙは同様のハードウェア構成を有しているので、ここではプログラミング装置１０Ｘのハードウェア構成について説明する。
【０１４２】
図１７は、実施の形態１から３にかかるプログラミング装置のハードウェア構成例を示す図である。プログラミング装置１０Ｘは、図１７に示した制御回路３００、すなわちプロセッサ３０１、メモリ３０２、通信装置３０４および入力装置３０３により実現することができる。
【０１４３】
プロセッサ３０１の例は、ＣＰＵ（Central  Processing  Unit、中央処理装置、処理装置、演算装置、マイクロプロセッサ、マイクロコンピュータ、プロセッサ、ＤＳＰともいう）またはシステムＬＳＩ（Large  Scale  Integration）である。メモリ３０２の例は、ＲＡＭ（Random  Access  Memory）、またはＲＯＭ（Read  Only  Memory）である。入力装置３０３の例は、キーボード、マウス、またはタッチパネルである。通信装置３０４は、通信部３２の機能を実現する。
【０１４４】
プログラミング装置１０Ｘは、プロセッサ３０１が、メモリ３０２から、コンパイラ１１Ｘと、編集装置３０の動作を実行するための編集プログラムを読み出して実行することにより実現される。コンパイルプログラムであるコンパイラ１１Ｘは、参照関係管理部１２、メモリ割付部１４、プログラム選択部１７、および実行プログラム生成部１６の手順または方法をコンピュータに実行させるものであるともいえる。また、編集プログラムは、編集装置３０の手順または方法をコンピュータに実行させるものであるともいえる。メモリ３０２は、プロセッサ３０１が各種処理を実行する際の一時メモリにも使用される。
【０１４５】
プロセッサ３０１が実行するコンパイラ１１Ｘは、コンパイラ１１Ｘが格納された記録媒体であるコンピュータプログラムプロダクトで実現されてもよい。この場合の記録媒体の例は、コンパイラ１１Ｘが格納された非一時的な（non-transitory）コンピュータ可読媒体である。また、プロセッサ３０１が実行する編集プログラムは、編集プログラムが格納された記録媒体であるコンピュータプログラムプロダクトで実現されてもよい。この場合の記録媒体の例は、編集プログラムが格納された非一時的なコンピュータ可読媒体である。
【０１４６】
なお、プログラミング装置１０Ｘの機能について、一部を専用のハードウェアで実現し、一部をソフトウェアまたはファームウェアで実現するようにしてもよい。
【０１４７】
以上の実施の形態に示した構成は、本発明の内容の一例を示すものであり、別の公知の技術と組み合わせることも可能であるし、本発明の要旨を逸脱しない範囲で、構成の一部を省略、変更することも可能である。
【符号の説明】
【０１４８】
１  プログラミングシステム、１０Ａ，１０Ｂ，１０Ｘ，１０Ｙ  プログラミング装置、１１Ｘ，１１Ｙ  コンパイラ、１２  参照関係管理部、１３  参照関係情報、１４  メモリ割付部、１５  メモリ割付情報、１６  実行プログラム生成部、１７  プログラム選択部、１８  コンパイルオプション判定部、２０  ＰＬＣ、２１  プログラムメモリ、２２  通信部、２３  プログラム実行部、２４  データメモリ、２５  不揮発性データメモリ、３０  編集装置、３１  実行プログラム、３２  通信部、３５Ｘ  シーケンスプログラム群、３６Ｘ  グローバル変数群、４１  コンパイルオプション、１１１Ｐ，１１１Ｑ，１１２Ｐ，Ｐ，Ｑ  シーケンスプログラム、１５１，１５２  メモリ割付情報、３１０  プログラム格納部、３６１〜３６３  グローバル変数宣言、Ａａ，Ａｂ，Ａｃ，Ａｄ，Ａｅ  メモリアドレス、ＥＰ５１〜ＥＰ５３，ＥＱ５１  実行プログラム。
【図１】
2019215919.tif 000003
【図２】
2019215919.tif 000004
【図３】
2019215919.tif 000005
【図４】
2019215919.tif 000006
【図５】
2019215919.tif 000007
【図６】
2019215919.tif 000008
【図７】
2019215919.tif 000009
【図８】
2019215919.tif 000010
【図９】
2019215919.tif 000011
【図１０】
2019215919.tif 000012
【図１１】
2019215919.tif 000013
【図１２】
2019215919.tif 000014
【図１３】
2019215919.tif 000015
【図１４】
2019215919.tif 000016
【図１５】
2019215919.tif 000017
【図１６】
2019215919.tif 000018
【図１７】
2019215919.tif 000019
【国際調査報告】
2019215919.tif 000020
2019215919.tif 000021
2019215919.tif 000022
2019215919.tif 000023