(57)【特許請求の範囲】
【請求項１】
シーケンスプログラム内にある配列または構造体の少なくとも一方の定義情報及び宣言情報をマシンコード形式に変換する変換部と、
プログラマブルコントローラからシーケンスプログラムを読み出す際に前記マシンコード形式の配列または構造体の少なくとも一方の定義情報及び宣言情報を逆変換してユーザによる作成・変更時に用いられる形式にする逆変換部、を有し、
前記変換部は、シーケンスプログラム中で使用された配列または構造体のオペランドを配列または構造体のオペランドであることを示す、デバイスアドレスの項目にメモリ種別以外の値（ＩＤ）を付加したマシンコード形式に変換してプログラマブルコントローラに格納し、
前記逆変換部は、プログラマブルコントローラからシーケンスプログラムを読み出してきた際に、マシンコード形式に変換した配列または構造体のオペランドであることを示す、マシンコードに付加した前記メモリ種別以外の値（ＩＤ）を基に、配列または構造体の定義・宣言情報を参照し、逆変換して表示することを特徴とするプログラマブルコントローラのプログラミング装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、シーケンスプログラムをマシンコード形式に変換するとともに、作成したマシンコードを、シーケンスプログラムに逆変換する技術に関する。
【背景技術】
【０００２】
プログラマブルコントローラは、例えば、シーケンシャルに動作する機械システムに対し、その手順を指示するコントローラである。指示内容は、プログラマブルコントローラにマシンコード形式で格納されるシーケンスプログラムに記述されている。
【０００３】
従来、プログラマブルコントローラに書き込むシーケンスプログラムを作成する場合に、そのシーケンスプログラム中の配列および構造体のオペランドを実アドレスで表現していたため、配列および構造体の定義・宣言情報は、プログラマブルコントローラには格納していなかった。
【０００４】
このような場合に、バージョンアップ等で、そのシーケンスプログラムに修正を加えるために、そのシーケンスプログラムをマシンコード形式からユーザによる作成・変更時に用いられる形式に（逆）変換した場合、その配列および構造体の定義・宣言情報が失われてしまっていた。すなわち、（逆）変換が不十分にしかできなかった。
【０００５】
その結果、プログラマブルコントローラに格納されているシーケンスプログラムに対応する、ユーザによる作成・変更時に用いられる形式のコードを捜してきて、そのコードに変更を加えた方が、一層、容易に修正が行える場合が一般的であった。
【０００６】
しかし、対応するユーザによる作成・変更時に用いられる形式のコードが常に見つかるとも限らず、プログラマブルコントローラからマシンコード形式のシーケンスプログラムを読み込み、それを直に修正してメンテナンスを行いたいというニーズも多い。
【０００７】
なお、プログラマブルコントローラに対するプログラミング技術としては、この他に特許文献１に示される技術がある。
この特許文献１では、将来の拡張を考えてあるパラメータを予約の形で宣言しても、シーケンスプログラム上で、そのパラメータが参照されていないことから、シーケンスプログラムを表示形式に変換した画面上では、そのパラメータの宣言情報がなくなり、思考作業の結果の一部が失われ、作業効率が低下する場合が考慮されている。そのような事態を回避するために、特許文献１では、シーケンスプログラムの作成時に定義・宣言した全パラメータを、そのシーケンスプログラムでの使用の有無に関係なく、そのシーケンスプログラムをマシン語形式から表示形式に変換するときに復元している。
【特許文献１】特開２００４−３４１８２４号公報  「プログラマブルコントローラのプログラミング装置」
【発明の開示】
【発明が解決しようとする課題】
【０００８】
本発明の課題は、シーケンスプログラムに配列または構造体の定義・宣言情報が含まれているシーケンスプログラムをマシンコード形式からユーザによる作成・変更時に用いられる形式に変換する場合に、その配列または構造体の定義・宣言情報を復元することを可能としたプログラマブルコントローラのプログラミング装置、および、プログラマブルコントローラを提供することである。
【課題を解決するための手段】
【０００９】
本発明のプログラマブルコントローラのプログラミング装置は、シーケンスプログラム内にある配列または構造体の少なくとも一方の定義情報及び宣言情報をマシンコード形式に変換する変換部と、プログラマブルコントローラからシーケンスプログラムを読み出す際に前記マシンコード形式の配列または構造体の少なくとも一方の定義情報及び宣言情報を逆変換してユーザによる作成・変更時に用いられる形式にする逆変換部、を有し、前記変換部は、シーケンスプログラム中で使用された配列または構造体のオペランドを配列または構造体のオペランドであることを示す、デバイスアドレスの項目にメモリ種別以外の値（ＩＤ）を付加したマシンコード形式に変換してプログラマブルコントローラに格納し、前記逆変換部は、プログラマブルコントローラからシーケンスプログラムを読み出してきた際に、マシンコード形式に変換した配列または構造体のオペランドであることを示す、マシンコードに付加した前記メモリ種別以外の値（ＩＤ）を基に、配列または構造体の定義・宣言情報を参照し、逆変換して表示することを特徴とするプログラマブルコントローラのプログラミング装置である。
【発明の効果】
【００１２】
本発明によれば、シーケンスプログラムに配列または構造体の定義・宣言情報が含まれているシーケンスプログラムをマシンコード形式からユーザによる作成・変更時に用いられる形式に変換する場合に、その配列または構造体の定義・宣言情報を復元することができるので、シーケンスプログラムの修正の作業効率を向上させることができる。
【図面の簡単な説明】
【００１３】
【図１】本発明の一実施形態のプログラミング装置の概要構成を示す図である。
【図２】図１のシーケンスプログラム作成装置の構成を示すブロック図である。
【図３】図１のシーケンスプログラム参照・変更装置の構成を示すブロック図である。
【図４Ａ】図１のシーケンスプログラム作成装置を介してユーザが定義した配列の定義情報の一例を示す図である。
【図４Ｂ】図１のシーケンスプログラム作成装置を介してユーザが定義した構造体の定義情報の一例を示す図である。
【図４Ｃ】図１のシーケンスプログラム作成装置を介してユーザが宣言した、図４Ａおよび図４Ｂの配列・構造体に対応する配列・構造体の宣言情報を示す図である。
【図５】プログラミング装置の内部メモリにマシンコード形式で格納される配列および構造体の定義情報、宣言情報の一例を示す図である。
【図６Ａ】図５等のマシンコード形式の配列の定義情報から表示形式に復元された配列の定義情報のデータ構造を示す図である。
【図６Ｂ】図５等のマシンコード形式の構造体の定義情報から表示形式に復元された構造体の定義情報のデータ構造を示す図である。
【図６Ｃ】図５等のマシンコード形式の配列または構造体の宣言情報から表示形式に復元された配列または構造体の宣言情報のデータ構造を示す図である。
【図７】表示形式のシーケンスプログラム（ラダー図）の一例を示す図である。
【図８Ａ】ラダー図上の配列オペランドの一例を示す図である。
【図８Ｂ】ラダー図上の構造体オペランドの一例を示す図である。
【図９】配列または構造体の要素であるオペランドに対応する１行以上のマシンコードの開始行の１つ前の行と終了行の１つ後の行に、その配列または構造体のオペランドの開始または終了を示す擬似命令が挿入された状態を示す図である。
【図１０】ＭＯＶ命令に配列または構造体のオペランドが使用された場合に、そのＭＯＶ命令に対応する１行以上のマシンコードを示す図である。
【図１１】本実施形態において、図２のシーケンスプログラム記憶部上で、表示形式で作成されたシーケンスプログラムのデータ構造を示す図である。
【図１２】デバイスアドレスの項目に追加された値（ＩＤ）を示す図である。
【図１３】配列または構造体の要素であるオペランドに対応するオペランド情報のデータ構造を示す図である。
【図１４】表示形式のシーケンスプログラムの作成、および、その表示形式のシーケンスプログラムをマシンコード形式に変換して、プログラマブルコントローラに出力する処理のフローチャートである。
【図１５】図１４のステップＳ１０５の処理をより詳細に示したフローチャートである。
【図１６】プログラマブルコントローラから読み出されたマシンコード形式のシーケンスプログラムを、表示形式のシーケンスプログラムに逆変換して、表示部上に出力する処理のフローチャートである。
【図１７】図１６のステップＳ３０３の処理をより詳細に示したフローチャートである。
【図１８】本実施形態のハードウェア環境を示す図である。
【発明を実施するための最良の形態】
【００１４】
以下、本発明の実施の形態を、図面を参照しながら詳細に説明する。
図１は、本発明の一実施形態のプログラミング装置の概要構成を示す図である。
図１のプログラミング装置１０は、プログラマブルコントローラに格納するシーケンスプログラムを作成することができるユーザインターフェイスとしてのシーケンスプログラム作成装置１１、プログラマブルコントローラに格納されているシーケンスプログラムを参照・変更することができるユーザインターフェイスとしてのシーケンスプログラム参照・変更装置１２、を備える。
【００１５】
シーケンスプログラム作成装置１１は、シーケンスプログラムをユーザによる作成・変更時に使用される表示形式（例えば、ラダー図）から、プログラマブルコントローラへの格納時に使用されるマシンコード形式に変換する機能を備える。シーケンスプログラム参照・変更装置１２は、シーケンスプログラムをマシンコード形式から表示形式に逆変換する機能を備える。
【００１６】
なお、より正確には、表示形式のシーケンスプログラムは、まず、アセンブラコード形式に変換されて、そのアセンブラコード形式からマシンコード形式に変換されるというべきだが、本実施形態では、アセンブラコード形式とマシンコード形式を区別せず、単に、マシンコード形式と呼んでいる。
【００１７】
また、本実施形態では、表示形式のシーケンスプログラムにおいて、配列や構造体が命令のオペランドとして使用される場合を想定している。
例えば、複数台のベルトコンベアを持つ装置をプログラマブルコントローラがシーケンシャルに動作させる場合の、それぞれのベルトコンベアのカウンタ値のようなデータ長が同一である複数のデータは、配列に格納される。
【００１８】
また、例えば、１台のベルトコンベアの属性は、運転状態フラグ（データ形＝ビット）、カウンタ値（データ形＝ダブルワード（Ｄ））、異常フラグ（データ形＝ビット）、・・・等のように表すことができるが、このようなデータ構造は、構造体に対応付けることができる。
【００１９】
オペランドに配列や構造体の要素を用いるようにすることで、コードの記述が簡略化し、メンテナンス（バージョンアップ時の行う作業等）が容易に行えるという利点がある。
図２は、図１のシーケンスプログラム作成装置の構成を示すブロック図である。
【００２０】
図２に示すように、シーケンスプログラム作成装置１１は、シーケンスプログラム記憶部２１、配列・構造体記憶部２２、定義・宣言情報変換部２４、配列・構造体オペランド命令変換部２６、他命令変換部２７、出力部２８を備える。
【００２１】
配列・構造体記憶部２２は、ユーザがシーケンスプログラム作成装置１１を介して入力した表示形式における配列または構造体の定義情報および宣言情報を記憶する。
シーケンスプログラム記憶部２１は、ユーザがシーケンスプログラム作成装置１１を介して入力した表示形式におけるシーケンスプログラムのコードを記憶する。
【００２２】
定義・宣言情報変換部２４は、ユーザに使用されるシーケンスプログラムの配列・構造体の定義・宣言情報を、プログラマブルコントローラへの格納時に使用されるマシンコード形式における、擬似命令（実行に影響しないマシンコード）に変換するとともに、その開始位置および終了位置にその開始・終了を示す擬似命令を挿入する。なお、擬似命令とは、実行に影響しないマシンコードのことであり、例えば、図面中では、「PSEUDO」から始まる行がその擬似命令に相当する。
【００２３】
配列・構造体オペランド命令変換部２６は、表示形式で記述されたシーケンスプログラム中の配列または構造体の要素をオペランドとして使用する命令を１行以上のマシンコードに変換するとともに、その配列または構造体の要素であるオペランドに対して、マシンコード形式の対応する１行以上のマシンコードの開始位置および終了位置にその開始・終了を示す擬似命令を挿入する。
【００２４】
他命令変換部２７は、表示形式で記述されたシーケンスプログラム中の配列または構造体の要素をオペランドとして使用しない命令を１行以上のマシンコードに変換する。
出力部２８は、マシンコード形式に変換されたシーケンスプログラムをプログラマブルコントローラに出力する（例えば、プログラマブルコントローラのメモリに書き込む）。
【００２５】
図３は、図１のシーケンスプログラム参照・変更装置の構成を示すブロック図である。
図３に示すように、シーケンスプログラム参照・変更装置１２は、シーケンスプログラム取得部３１、シーケンスプログラム記憶部３２、定義・宣言情報開始終了位置検出部３３、定義・宣言情報復元部３４、配列・構造体オペランド開始終了位置検出部３５、配列・構造体オペランド復元部３６、変換部３７、出力部３８を備える。
【００２６】
シーケンスプログラム取得部３１は、マシンコード形式で記述されたシーケンスプログラムをプログラマブルコントローラから取得して、シーケンスプログラム記憶部３２に書き込む。
【００２７】
定義・宣言情報開始終了位置検出部３３は、シーケンスプログラム記憶部３２に格納されるシーケンスプログラムの配列・構造体の定義・宣言情報に対して、その開始位置及び終了位置を検出する。
【００２８】
定義・宣言情報復元部３４は、検出された開始位置とその開始位置に対応する終了位置の間の定義・宣言情報を表示形式に復元する。
配列・構造体オペランド開始終了位置検出部３５は、シーケンスプログラム記憶部３２に格納されるシーケンスプログラムの配列または構造体の要素であるオペランドに対して、対応する１行以上のコードの開始位置及び終了位置を検出する。
【００２９】
配列・構造体オペランド復元部３６は、その開始位置と終了位置の間の配列または構造体のオペランドに対応する１行以上のコードを基に、そのオペランドの配列・構造体を復元する。
【００３０】
変換部３７は、シーケンスプログラム記憶部３２にマシンコード形式で格納されるソースを変換して（表示形式の）シーケンスプログラムにする。
出力部３８は、表示形式に変換されたシーケンスプログラムを表示装置（図３では不図示）上に出力する。
【００３１】
図４Ａは、図１のシーケンスプログラム作成装置を介してユーザが定義した配列の定義情報の一例、図４Ｂは、図１のシーケンスプログラム作成装置を介してユーザが定義した構造体の定義情報の一例、図４Ｃは、図１のシーケンスプログラム作成装置を介してユーザが宣言した、図４Ａおよび図４Ｂの配列・構造体の各定義情報に対応する配列・構造体の宣言情報を示す図である。
【００３２】
図４Ａの例では、ＡＲＹ＿０という名前の配列がビット形式のデータを１６個持ち、ＡＲＹ＿１という名前の配列がワード形式のデータを５個持つことが定義されている。
図４Ｂの例では、ＳＴＲ＿０という名前の構造体がビット形式のメンバ１個と、ワード形式のメンバ１個を持ち、ＳＴＲ＿１という名前の構造体がビット形式のメンバ２個と、ワード形式のメンバ２個を持つことが定義されている。
【００３３】
図４Ｃでは、図４Ａの配列ＡＲＹ＿０、配列ＡＲＹ＿１の先頭アドレスがそれぞれ「Ｍ００１００」、「ＷＭ００２００」であること、図４Ｂの構造体ＳＴＲ＿０の先頭アドレスが「ＷＭ００３００」であることが示されている。
【００３４】
メモリには、電源が落ちた場合でも内容が保持される不揮発性メモリ（種別「Ｍ」で表記）と、電源が落ちた場合には内容が保持されない揮発性メモリ（種別「Ｌ」で表記）と、システムプログラムが保持されるメモリであることを示す種別「ＳＭ」、等の種別がある。
【００３５】
例えば、図４Ｃにおいて、「ＷＭ００２００」は、データ長が（１６ビットの）ワード（「Ｗ」）であり、電源が落ちても内容が保持される種別「Ｍ」のメモリの２００番目を示している。なお、「Ｍ００１００」のようにデータ長に対する指定がない場合、データ長は１ビットであると解釈される。
【００３６】
図５は、プログラミング装置の内部メモリにマシンコード形式で格納される配列および構造体の定義情報、宣言情報の一例を示す図である。
図５のマシンコードの各行は、すべて、擬似命令であることを示す文字列「PSEUDO」で始まっている。そして、配列および構造体の定義情報、宣言情報に対応する部分については、「LAB」＋「定義情報」または「LAB」＋「宣言情報」の形式を有している。
【００３７】
図５に示すように、表示形式からマシンコードの擬似命令に配列の定義情報を変換すると、上記「定義情報」部分には、配列名（ARY_）以降に示される番号である配列番号、その配列の要素数、要素のデータタイプを示す要素情報が変換結果として出力される。変換結果の先頭行の１つ前の行には、「FC」＋「配列の定義情報の開始を識別する値（図では「9」）」の形式を有する擬似命令が挿入され、変換結果の末尾の行の１つ後の行には、「FC」＋「配列の定義情報の終了を識別する値（図では「32777」）」の形式を有する擬似命令が挿入される。
【００３８】
また、表示形式からマシンコードの擬似命令に構造体の定義情報を変換すると、上記「定義情報」部分には、構造体名（STR_）以降に示される番号である構造体番号、その構造体が含むメンバの数だけの、それぞれのメンバのデータタイプ（要素情報）が変換結果として出力される。変換結果の先頭行の１つ前の行には、「FC」＋「構造体の定義情報の開始を識別する値（図では「10」）」の形式を有する擬似命令が挿入され、変換結果の末尾の行の１つ後の行には、「FC」＋「構造体の定義情報の終了を識別する値（図では「32778」）」の形式を有する擬似命令が挿入される。
【００３９】
また、表示形式からマシンコードの擬似命令に配列および構造体の宣言情報を変換すると、その「宣言情報」部分には、デバイスアドレス情報を識別するアドレスタイプ、ＣＰＵ番号、アドレス（上位側）、アドレス（下位側）の各項目、および、配列または構造体の番号が変換結果として出力される。変換結果の先頭行の１つ前の行には、「FC」＋「配列または構造体の宣言情報の開始を識別する値（図では「11」）」の形式を有する擬似命令が挿入され、変換結果の末尾の行の１つ後の行には、「FC」＋「配列または構造体の宣言情報の終了を識別する値（図では「32779」）」の形式を有する擬似命令が挿入される。
【００４０】
図６Ａは、図５等のマシンコード形式の配列の定義情報から表示形式に復元された配列の定義情報のデータ構造を示す図であり、図６Ｂは、図５等のマシンコード形式の構造体の定義情報から表示形式に復元された構造体の定義情報のデータ構造を示す図であり、図６Ｃは、図５等のマシンコード形式の配列または構造体の宣言情報から表示形式に復元された配列または構造体の宣言情報のデータ構造を示す図である。図６Ｃにおいて、番号が配列番号であるか構造体番号であるかは、上位側ビットの値により判断する。
【００４１】
図７は、表示形式のシーケンスプログラム（ラダー図）の一例を示す図である。
図７では、回路１は、接点Ｍ０、Ｍ１、Ｍ２、コイルＭ３が母線間に接続されて構成される。この場合、接点Ｍ０、接点Ｍ１、接点Ｍ２、コイルＭ３がそれぞれ１命令に相当する。また、回路２は、ＭＯＶ命令と、そのＭＯＶ命令に先行する接点Ｍ４が母線間に接続されて構成される。この場合、接点Ｍ４、ＭＯＶ命令がそれぞれ１命令に相当する。
【００４２】
図８Ａは、ラダー図上の配列オペランドの一例を示す図である。
図８Ａでは、接点や、ＭＯＶ命令のオペランドに、配列の要素が使用されている。
配列オペランドは、“デバイスアドレス情報［要素番号］”で表記される。例えば、Ｍ００１００［５］は、メモリ種別Ｍのメモリの１００番目のアドレスに先頭が格納される、それぞれのデータ長が１ビットの配列の５番目の要素を示している。また、ＷＭ００２００［３］は、メモリ種別Ｍのメモリの２００番目のアドレスに先頭が格納される、それぞれのデータ長が１６ビット＝１ワードの配列の３番目の要素を示している。
【００４３】
図８Ｂは、ラダー図上の構造体オペランドの一例を示す図である。
図８Ｂでは、接点や、ＭＯＶ命令のオペランドに、構造体の要素が使用されている。
構造体オペランドは、例えば、“デバイスアドレス情報．データ長Ｒインデックス”で表記される。例えば、ＷＭ００３００．Ｒ１は、メモリ種別Ｍのメモリの３００番目に先頭が格納される構造体でＲインデックスの１番目に定義された、データ長が（１６ビットの）ワードのデータメンバを示している。
【００４４】
図９は、配列または構造体の要素であるオペランドに対応する１行以上のマシンコードの開始行の１つ前の行と終了行の１つ後の行に、その配列または構造体のオペランドの開始または終了を示す擬似命令（「FC」＋「配列または構造体のオペランドの開始または終了を識別する情報」の形式を有する）が挿入された状態を示す図である。
【００４５】
図１０は、ＭＯＶ命令に配列または構造体のオペランドが使用された場合に、そのＭＯＶ命令に対応する１行以上のマシンコードを示す図である。
図１０において、例えば、「WM0000  :=  WM0100[1]」は、「MOV  WM0000 WM0100[1]」に対応する。
【００４６】
図１０の１段目および２段目は、１次元配列の要素がＭＯＶ命令の第２オペランドに使用されている場合のＭＯＶ命令、および、対応するマシンコード（アセンブラコード）を示している。
【００４７】
また、３段目および４段目は、構造体のデータメンバがＭＯＶ命令の第２オペランドに使用されている場合のＭＯＶ命令、および、対応するマシンコード（アセンブラコード）を示している。
【００４８】
また、５段目および６段目は、構造体のメンバである１次元配列の要素がＭＯＶ命令の第２オペランドに使用されている場合のＭＯＶ命令、および、対応するマシンコード（アセンブラコード）を示している。
【００４９】
図１０のアセンブラコードにおいて、それぞれの命令にオペランドとして表れる「#」は定数、「M」は保持メモリ、「AX」はAXレジスタ、「WI」は符号付き１６ビット整数（１ワード＝１６ビット）、「DU」は符号なし３２ビット整数（ダブルワード＝３２ビット）、「XB」は１ビット、を意味する。
【００５０】
なお、図１０のＭＯＶ命令にオペランドとして使用されている配列および構造体の定義・宣言情報を以下に示す。
（定義情報）
TYPE
ARY_01:  ARRAY[1..50]  OF  INT
STR_01:  STRUCT
E1:  BOOL
E2:  BOOL
E3:  INT;
E4:  ARY_01
END_STRUCT
END_TYPE
（宣言情報）
WM0100  ARY_01
WM0300  STR_01
続いて、図１０の各アセンブラコードについて説明する。
【００５１】
まず、図１０の１段目のアセンブラコードでは、PLD命令において、ACC（アキュミュレータ）の内容をデータスタックにプッシュした後、オペランドが指定するアドレスからデータを読み出しACCに格納している。また、SUB命令において、オペランドが指定するアドレスからデータを読み出し、ACCから読み出したデータを減算しその結果をACCに格納している。また、LEAAX命令において、オペランドが指定するアドレスのメモリ位置アドレスをAXレジスタに格納している。また、AXADDP命令において、AXレジスタの内容と、ACCの内容を加算してその結果をAXレジスタに格納し、データスタックをポップしている。また、LD命令において、AXレジスタの内容に“０”を加えたメモリ位置アドレスからデータを読み出し、ACCに格納している。また、ST命令において、ACCにあるデータをオペランドが指定するアドレスに格納している。
【００５２】
ここで、PLD命令、SUB命令、LEAAX命令、AXADDP命令、LD命令が配列オペランド“WM0100[1]”に対応するアセンブラコードであるので、それらの命令のうちの先頭の命令（PLD命令）の１つ前の行に、配列オペランド開始擬似命令が挿入されるとともに、それらの命令のうちの末尾の命令（LD命令）の１つ後の行に、配列オペランド終了擬似命令が挿入される。
【００５３】
なお、配列オペランド開始擬似命令は、例えば、“「FC」＋「この行がオペランドに使用される配列要素に関する情報の開始位置であることを示す情報」＋「配列要素の復元時に使用されるパターンを識別する情報」”のような形式を有し、配列オペランド終了擬似命令は、例えば、“「FC」＋「この行がオペランドに使用される配列要素に関する情報の終了位置であることを示す情報」”のような形式を有する。
【００５４】
例えば、この１段目のアセンブラコードでは、PLD命令の各オペランド“#”、“WI”、“001”から配列の要素番号“[1]”を取得し、LEAAX命令の各オペランド“M”、“DU”、“100”から配列の先頭アドレス“WM0100”を取得するのが、配列要素の復元時に使用されるパターンである。
【００５５】
図１０の２段目のアセンブラコードは、１段目と同様であるので説明を省略する。
この２段目のアセンブラコードでは、PLD命令、SUB命令、LEAAX命令、AXADDP命令、LD命令が配列オペランド“WM0100[WM0001]”に対応するアセンブラコードであるので、それらの命令のうちの先頭の命令（PLD命令）の１つ前の行に、配列オペランド開始擬似命令が挿入されるとともに、それらの命令のうちの末尾の命令（LD命令）の１つ後の行に、配列オペランド終了擬似命令が挿入される。
【００５６】
例えば、この２段目のアセンブラコードでは、PLD命令の各オペランド“M”、“WI”、“001”から配列の要素番号“[WM0001]”を取得し、LEAAX命令の各オペランド“M”、“DU”、“100”から配列の先頭アドレス“WM0100”を取得するのが、配列要素の復元時に使用されるパターンである。
【００５７】
図１０の３段目のアセンブラコードでは、LEAAX命令において、オペランドが指定するアドレスのメモリ位置アドレスをAXレジスタに格納している。また、LD命令において、AXレジスタの内容に当該命令の第３オペランド“51.0”で示される相対アドレスを加えたメモリ位置アドレスからデータを読み出し、ACCに格納している。また、ST命令において、ACCにあるデータをオペランドが指定するアドレスに格納している。
【００５８】
ここで、LEAAX命令、LD命令が構造体オペランド“WM0300.R1”に対応するアセンブラコードであるので、それらの命令のうちの先頭の命令（LEAAX命令）の１つ前の行に、構造体オペランド開始擬似命令が挿入されるとともに、それらの命令のうちの末尾の命令（LD命令）の１つ後の行に、構造体オペランド終了擬似命令が挿入される。
【００５９】
例えば、この３段目のアセンブラコードでは、LEAAX命令の各オペランド“M”、“XB”、“300”から構造体の先頭アドレス“WM0300”を取得し、その先頭アドレスで図６Ｃの構造体の宣言情報を参照し、構造体番号を取得する。また、LD命令の第３オペランド“51.0”からその構造体内でのメンバの相対アドレスを取得し、その相対アドレスおよび取得済みの構造体番号で図６Ｂの構造体の定義情報を参照し、相対アドレスに合ったメンバを特定するのが、構造体のメンバの復元時に使用されるパターンである。
【００６０】
図１０の４段目のアセンブラコードは３段目と同様であるので説明を省略する。
図１０の５段目のアセンブラコードでは、PLD命令において、ACC（アキュミュレータ）の内容をデータスタックにプッシュした後、オペランドが指定するアドレスからデータを読み出しACCに格納している。また、SUB命令において、オペランドが指定するアドレスからデータを読み出し、ACCから読み出したデータを減算しその結果をACCに格納している。また、LEAAX命令において、オペランドが指定するアドレスのメモリ位置アドレスをAXレジスタに格納している。また、AXADDP命令において、AXレジスタの内容と、ACCの内容を加算してその結果をAXレジスタに格納し、データスタックをポップしている。また、LD命令において、AXレジスタの内容に当該命令の第３オペランド“１”で示される相対アドレスを加えたメモリ位置アドレスからデータを読み出し、ACCに格納している。また、ST命令において、ACCにあるデータをオペランドが指定するアドレスに格納している。
【００６１】
ここで、PLD命令、SUB命令、LEAAX命令、AXADDP命令、LD命令が構造体オペランド“WM0300.WR4[1]”に対応するアセンブラコードであるので、それらの命令のうちの先頭の命令（PLD命令）の１つ前の行に、構造体オペランド開始擬似命令が挿入されるとともに、それらの命令のうちの末尾の命令（LD命令）の１つ後の行に、構造体オペランド終了擬似命令が挿入される。
【００６２】
例えば、この５段目のアセンブラコードでは、PLD命令の各オペランド“#”、“WI”、“001”から構造体のメンバである１次元配列の要素番号“[1]”を取得し、LEAAX命令の各オペランド“M”、“DU”、“300”から配列の先頭アドレス“WM0300”を取得し、その先頭アドレスで図６Ｃの構造体の宣言情報を参照し、構造体番号を取得する。また、LD命令の第３オペランド“1”からその構造体内でのメンバの相対アドレスを取得し、その相対アドレスおよび取得済みの構造体番号で図６Ｂの構造体の定義情報を参照し、相対アドレスに合ったメンバを特定するのが、構造体のメンバの復元時に使用されるパターンである。
【００６３】
図１０の６段目のアセンブラコードは５段目と同様であるので説明を省略する。
図１１は、本実施形態において、図２のシーケンスプログラム記憶部上で、表示形式で作成されたシーケンスプログラムのデータ構造を示す図である。
【００６４】
図１１において、回路１、回路２、・・・、回路ｎや、それぞれの回路内の命令１、命令２、・・・、命令ｎは、例えば、図７に示すラダー図上のものに対応している。
ニーモニック情報は、命令コードと、その命令が持つオペランド数と、そのオペランド数に続く、そのオペランド数だけのオペランド情報から構成される。
【００６５】
それぞれのオペランド情報は、メモリ種別を示すデバイスタイプ、ＣＰＵ番号／局番、データ形（ビット、１ワード（１６ビット）、ダブルワード（３２ビット））、予備、および、そのデータの格納先のアドレス、から構成される。
【００６６】
従来は、図１１に示すようなデータ構造で、表示形式で作成されたシーケンスプログラムを管理していたため、配列・構造体と単なる変数とを区別することができず、配列や構造体をオペランドに使用した場合、その配列や構造体のオペランドのアドレスは実アドレスに変換されて保持されていた。
【００６７】
一方、配列や構造体であることを示すフラグ情報の項目を追加して、配列・構造体と、通常の変数とを区別することは可能であるが、図１１のデータ構造の変更になり、データの互換性が損なわれる。
【００６８】
そこで、本実施形態では、デバイスアドレス(= デバイスタイプ)の項目に、デバイスアドレス（メモリ種別）として意味がある値以外の値を設けることで、従来のシステムとの互換性を保ちつつ、配列・構造体と、通常の変数とを区別することを可能としている。
【００６９】
図１２は、デバイスアドレスの項目に追加された値（ＩＤ）を示す図である。
図１２において、デバイスアドレスのＩＤ＝“xatArray”は、そのオペランドが配列の要素であることを示すＩＤである。また、デバイスアドレスのＩＤ＝“xatStruct”は、そのオペランドが構造体の要素であることを示すＩＤである。
【００７０】
図１３は、配列または構造体の要素であるオペランドに対応するオペランド情報のデータ構造を示す図である。
図１３において、上述したように、デバイスタイプの項目には、配列または構造体を示す値（“xatArray”または“xatStruct”）が指定される。そして、デバイスアドレスの値がメモリ種別を示していたときのアドレスの項目には、その配列の各要素についての情報またはその構造体の各要素（データメンバ、配列メンバ、・・・等）についての情報の先頭位置を示すポインタ情報が格納される。
【００７１】
このポインタ情報から、配列の各要素についての情報または構造体の各要素についての情報を取得することができ、配列または構造体の要素であるオペランドを表現することが可能となる。
【００７２】
図１４は、表示形式のシーケンスプログラムの作成、および、その表示形式のシーケンスプログラムをマシンコード形式に変換して、プログラマブルコントローラに出力する処理のフローチャートである。このフローチャートは、図２のシーケンスプログラム作成装置によって実行される。
【００７３】
まず、ステップＳ１０１において、ユーザによって、表示形式のシーケンスプログラム上でその要素がオペランドとなりうる配列または構造体の定義情報・宣言情報が入力される。
【００７４】
そして、続く、ステップＳ１０２において、ユーザによって、表示形式のシーケンスプログラムのコードが入力される。
ステップＳ１０３では、表示形式のシーケンスプログラムの作成が完了したかどうかが判定される。
【００７５】
ステップＳ１０３で、表示形式のシーケンスプログラムの作成が完了していないと判定された場合は、ステップＳ１０２に戻る。
一方、ステップＳ１０３で、表示形式のシーケンスプログラムの作成が完了したと判定された場合、ステップＳ１０４で、図２の定義・宣言情報変換部２４によって、配列または構造体の定義・宣言情報がマシンコードの擬似命令（この命令は、「LAB」＋「定義情報」または「LAB」＋「宣言情報」の形式を有する）に変換されるとともに、その擬似命令の開始行の１つ前の行および終了行の１つ後の行にその開始・終了を示すマシンコードの擬似命令（この命令は、「FC」で始まる）が挿入される。なお、図５に変換結果の一例が示されている。
【００７６】
そして、ステップＳ１０５で、図２の配列・構造体オペランド命令変換部２６および他命令変換部２７によって、表示形式のシーケンスプログラムがマシンコード形式に変換される。
【００７７】
ステップＳ１０６では、マシンコード形式に変換されたシーケンスプログラムが図２の出力部２８によって、プログラマブルコントローラ内のＲＯＭに格納される。
図１５は、図１４のステップＳ１０５の処理をより詳細に示したフローチャートである。
【００７８】
なお、図１５のフローチャートは、ラダー図を構成する１つの回路について行われる処理を示している。実際には、ラダー図のすべての回路について図１５の処理が実行される。
【００７９】
図１５において、まず、ステップＳ２０１で、現在の回路の中の先頭の命令（ニーモニック情報）が取得される。このニーモニック情報は、図１１に示すように、命令コードと、その命令が持つオペランド数と、そのオペランド数に続く、そのオペランド数だけのオペランド情報から構成されている。
【００８０】
続く、ステップＳ２０２では、そのニーモニック情報がオペランド情報を持つかどうか、すなわち、オペランド数の項目に１以上の値が設定されているかどうかが判定される。
ステップＳ２０２でニーモニック情報がオペランド情報を持たないと判定された場合、ステップＳ２０７において、図２の他命令変換部２７によって、その命令コード等がマシンコード形式に変換される。
【００８１】
そして、ステップＳ２０６において、プログラムが終了したかどうか、すなわち、現在の回路において、後続の命令があるかどうかが判定される。
ステップＳ２０６において、後続の命令がないと判定された場合、一連の処理、この場合、１回路分の処理が終了する。一方、ステップＳ２０６において、後続の命令があると判定された場合、ステップＳ２０１に戻り、後続の命令を取得して、その後続の命令について同様の処理を繰り返す。
【００８２】
一方、ステップＳ２０２でニーモニック情報がオペランド情報を持つと判定された場合、ステップＳ２０３において、そのニーモニック情報が有する各オペランド情報のデバイスタイプの項目の値（ＩＤ）が検索され、そのニーモニック情報がオペランドに配列または構造体の要素を持つかどうかが判定される。デバイスタイプの項目の値＝“xatArray”または“xatStruct”であるオペランド情報が検出された場合は、配列または構造体の要素をオペランドに持つ命令であると判定される。
【００８３】
ステップＳ２０３において配列または構造体の要素をオペランドに持つ命令であると判定された場合、ステップＳ２０４において、図２の配列・構造体オペランド命令変換部２６によって、その命令が表示形式からマシンコード形式へ変換されて、取得した命令に対応する１行以上のマシンコードが得られるとともに、その取得した命令に対応する１行以上のマシンコード中の、配列または構造体の要素であるオペランドに対応する１行以上のマシンコードの開始行の１つ前の行および終了行の１つ後の行にその開始・終了を示すマシンコードの擬似命令（この命令は、「FC」で始まる）が挿入される。そして、制御がステップＳ２０６に移る。
【００８４】
より具体的には、表示形式の各命令に対して、対応する１行以上のマシンコードのテンプレート（雛形）が２つ存在している。１つは、その命令が配列または構造体の要素をオペランドに含まない場合のものであり、もう１つは、その命令が配列または構造体の要素をオペランドに含む場合のものである。配列または構造体の要素をオペランドに含まない各命令に対して、その命令に対応するマシンコード（テンプレート）の何行目から何行目の間がその命令のオペランドに対応するかは既知である。配列または構造体の要素をオペランドに含む命令に対するテンプレートは、配列または構造体の要素をオペランドに含まない命令に対するテンプレートのオペランド対応部分の開始行の１つ前の行および終了行の１つ後の行にその開始・終了を示すマシンコードの擬似命令を挿入することで得られる。
【００８５】
なお、図１０にステップＳ２０４の処理結果が数例示されている。
一方、ステップＳ２０３において配列または構造体の要素をオペランドに持つ命令でないと判定された場合、ステップＳ２０５において、図２の他命令変換部２７によって、（配列または構造体の要素をオペランドに持たない）命令がマシンコード形式に変換される。そして、制御がステップＳ２０６に移る。
【００８６】
図１６は、プログラマブルコントローラから読み出されたマシンコード形式のシーケンスプログラムを、表示形式のシーケンスプログラムに逆変換して、表示部上に出力する処理のフローチャートである。このフローチャートは、図３のシーケンスプログラム参照・変更装置によって実行される。
【００８７】
まず、ステップＳ３０１において、図３のシーケンスプログラム取得部３１によって、マシンコード形式で記述されたシーケンスプログラムがプログラマブルコントローラから取得され、シーケンスプログラム記憶部３２に書き込まれる。
【００８８】
そして、続く、ステップＳ３０２において、定義・宣言情報開始終了位置検出部３３によって、シーケンスプログラム記憶部３２に格納されたマシンコード形式のシーケンスプログラムが検索される。そして、このマシンコード形式のシーケンスプログラム中から、「PSEUDO  FC」で始まるマシンコードの擬似命令が検出されるとともに、定義・宣言情報復元部３４によって、その開始位置とその開始位置に対応する終了位置の間にある配列または構造体の定義・宣言情報（この情報は、「PSEUDO  LAB」で始まる）が表示形式に復元される。
【００８９】
ステップＳ３０３では、配列・構造体オペランド開始終了位置検出部３５、配列・構造体オペランド復元部３６、および、変換部３７によって、マシンコード形式のシーケンスプログラムが表示形式に変換される。
【００９０】
ステップＳ３０４では、出力部３８によって、表示形式に変換されたシーケンスプログラムと、その配列・構造体の定義・宣言情報が表示装置上に出力され表示される。
図１７は、図１６のステップＳ３０３の処理をより詳細に示したフローチャートである。
【００９１】
図１７において、まず、ステップＳ４０１で、図３のシーケンスプログラム記憶部３２に格納されるシーケンスプログラムの各行が取得される。
続く、ステップＳ４０２では、配列・構造体オペランド開始終了位置検出部３５によって、その取得した行が、マシンコードの擬似命令であって、「FC」＋「配列または構造体の要素であるオペランドに関する情報の開始を識別する値」を含むかどうかが判定される。
【００９２】
ステップＳ４０２において取得した行が「FC」＋「配列または構造体の要素であるオペランドに関する情報の開始を示す情報」を含まないと判定された場合、ステップＳ４０７において、変換部３７によって、そのマシンコード形式のシーケンスプログラムの命令等が表示形式に変換される。そして、制御がステップＳ４０６に移る。
【００９３】
一方、ステップＳ４０２において取得した行が「FC」＋「配列または構造体の要素であるオペランドに関する情報の開始を示す情報」を含むと判定された場合、ステップＳ４０３において、配列・構造体オペランド復元部３６によって、シーケンスプログラム記憶部３２に格納されるシーケンスプログラムの後続の各行が、「FC」＋「配列または構造体の要素であるオペランドに関する情報の終了を示す情報」を含む行が検出されるまで取得される。
【００９４】
そして、ステップＳ４０３において、配列・構造体オペランド復元部３６によって、「FC」＋「配列または構造体の要素であるオペランドに関する情報の開始を示す情報」の行にさらに含まれる復元時に使用されるパターンを識別する情報を用いて、その開始と終了の擬似命令で挟まれたマシンコード（アセンブラコード）部分から配列の要素または構造体のメンバを復元するのに必要な情報が取得される。ステップＳ４０３で取得される情報は、図１０で述べたように、配列の要素を復元する場合、その配列の先頭アドレス、その配列の要素番号（インデックス）またはそのインデックスの値が格納されるアドレスである。また、構造体のメンバを復元する場合、例えば、その構造体の先頭アドレス、その構造体のメンバの相対アドレスである。
【００９５】
構造体のメンバを復元する場合には、ステップＳ４０４の処理がさらに実行される。このステップＳ４０４では、例えば、配列・構造体オペランド復元部３６によって、ステップＳ４０３で取得された構造体の先頭アドレスを用いて、図６Ｃの構造体の宣言情報が参照されて構造体番号が取得される。また、その構造体番号およびステップＳ４０３で取得された構造体のメンバの相対アドレスを用いて、図６Ｂの構造体の定義情報が参照されてその相対アドレスに合ったメンバが特定される。
【００９６】
ステップＳ４０５では、ステップＳ４０３およびステップＳ４０４の結果を踏まえて、配列・構造体オペランド復元部３６によって、オペランドとして使用される配列の要素または構造体のメンバが表示形式に復元される。そして、制御がステップＳ４０６に移る。
【００９７】
図１８は、本実施形態のハードウェア環境を示す図である。
図１８において、プログラミング装置５０は、そのプログラミング装置５０を介して作成されるシーケンスプログラムの格納先のプログラマブルコントローラ６５に接続されている。
【００９８】
図１８において、プログラミング装置は、中央演算処理装置（ＣＰＵ）５１、ＲＯＭ５２、ＲＡＭ（一次記憶）５３、記憶装置５５、入力装置５８、表示装置６１、入出力インターフェイス（Ｉ／Ｏ）６２を備え、それらがバス６３を介して接続されている。
【００９９】
図１８において、ＣＰＵ５１は、コンピュータ全体を制御する。シーケンスプログラムを作成したり、参照・変更したりする処理を行うプログラムは、例えば、ＲＯＭ５２からＲＡＭ５３に読み出されて、そのＲＡＭ５３上で実行される。
【０１００】
入力装置５８を介して、ユーザは、配列または構造体の定義情報や宣言情報を入力したり、表示形式のシーケンスプログラムのコードを入力したりする。
この表示形式のシーケンスプログラムは、作成時や参照・変更時に、表示装置６１上に表示される。
【０１０１】
記憶装置５５は、例えば、作成された配列の定義情報、構造体の定義情報、配列および構造体の宣言情報を記憶する内部メモリ５６と、表示形式またはマシンコード形式のシーケンスプログラムを記憶するユーザプログラムメモリ５７を備える。
【０１０２】
作成された表示形式のシーケンスプログラムは、マシンコードに変換されてマシンコード形式のシーケンスプログラムとなり、Ｉ／Ｏ６２を介して、例えば、プログラマブルコントローラ６５内のＲＯＭに書き込まれる。また、プログラマブルコントローラ６５内のＲＯＭから読み出されたマシンコード形式のシーケンスプログラムは、表示形式のシーケンスプログラムに変換されて、例えば、表示装置６１上に表示される。
【符号の説明】
【０１０３】
１０      プログラマブルコントローラのプログラミング装置
１１      シーケンスプログラム作成装置
１２      シーケンスプログラム参照・変更装置
２１、３２      シーケンスプログラム記憶部
２２      配列・構造体記憶部
２４      定義・宣言情報変換部
２６      配列・構造体オペランド変換部
２７      他命令変換部
２８、３８      出力部
３１      シーケンスプログラム取得部
３３      定義・宣言情報開始終了位置検出部
３４      定義・宣言情報復元部
３５      配列・構造体オペランド開始終了位置検出部
３６      配列・構造体オペランド復元部
３７      変換部
【図３】
0005387705.tif 000002
【図１３】
0005387705.tif 000003
【図１６】
0005387705.tif 000004
【図１】
0005387705.tif 000005
【図２】
0005387705.tif 000006
【図４Ａ】
0005387705.tif 000007
【図４Ｂ】
0005387705.tif 000008
【図４Ｃ】
0005387705.tif 000009
【図５】
0005387705.tif 000010
【図６Ａ】
0005387705.tif 000011
【図６Ｂ】
0005387705.tif 000012
【図６Ｃ】
0005387705.tif 000013
【図７】
0005387705.tif 000014
【図８Ａ】
0005387705.tif 000015
【図８Ｂ】
0005387705.tif 000016
【図９】
0005387705.tif 000017
【図１０】
0005387705.tif 000018
【図１１】
0005387705.tif 000019
【図１２】
0005387705.tif 000020
【図１４】
0005387705.tif 000021
【図１５】
0005387705.tif 000022
【図１７】
0005387705.tif 000023
【図１８】
0005387705.tif 000024