(57)【要約】【課題】効率的な逆コンパイルを行うことを課題とする。【解決手段】入出力解析部１２１が入力命令を解析し、入力命令に関する情報を命令情報テーブル３５に格納し、入力命令の解析終了後、演算命令解析部１２２が、演算命令に関する情報を命令情報テーブル３５に格納する演算命令解析を行い、演算命令解析終了後、入出力解析部１２１が出力命令に関する情報を命令情報テーブル３５に格納する出力命令解析を行い、出力命令解析終了後、変換部１２３が命令情報テーブル３５を基に、ラダー図におけるデバイス素子を生成することを特徴とする。【選択図】図１
2014203343.tif 000002
【特許請求の範囲】
【請求項１】
ラダー言語に基づくデバイス素子を連結したラダー図をコンパイルした結果であり、入力命令語、演算命令語及び出力命令語を含む命令語の集合体である中間語を処理対象として前記入力命令語を検出し、前記入力命令語に関する情報を前記入力命令語から抽出して、当該抽出した入力命令語に関する情報を命令情報テーブルに格納する入力命令解析部と、
前記入力命令語解析部における処理の終了後、前記中間語において、前記入力命令語に続く前記命令語が前記演算命令語であるとみなし、前記演算命令語に関する情報を前記命令情報テーブルに格納する演算命令解析部と、
前記演算解析部における処理の終了後、前記中間語において、前記演算命令語に続く前記命令語が前記出力命令語であるとみなし、前記出力命令語に関する情報を前記出力命令語から抽出して、前記命令情報テーブルに格納する出力命令解析部と、
前記出力命令語解析部における処理の終了後、前記命令情報テーブルを基に、前記デバイス素子を生成する変換部と、
を有することを特徴とするプログラム解析装置。
【請求項２】
前記演算命令語の形式に関する情報と、前記形式に関する形式識別情報とが対応付けられるテンプレートテーブルが格納される記憶部を、さらに有し、
前記演算命令解析部は、
前記テンプレートテーブルを参照して、処理対象となっている前記演算命令語の形式を判定し、当該形式に該当する形式識別情報を、前記演算命令語に関する情報として前記命令情報テーブルに格納する
ことを特徴とする請求項１に記載のプログラム解析装置。
【請求項３】
前記入力命令語に関する情報及び前記出力命令語に関する情報は、当該命令語において使用されているパラメータに関する情報である
ことを特徴とする請求項１に記載のプログラム解析装置。
【請求項４】
前記パラメータに関する情報は、前記パラメータの読込方式又は書込方式を含み、さらに前記パラメータが格納されるアドレス値、及び前記パラメータのサイズに関する情報が前記パラメータに関する情報に含まれる
ことを特徴とする請求項３に記載のプログラム解析装置。
【請求項５】
入力命令語及び出力命令語の形式に関する情報であるパラメータテンプレートテーブルが格納されるとともに、前記演算命令語の形式に関する情報と、前記形式に関する形式識別情報とが対応付けられるテンプレートテーブルが格納される記憶部と、
ラダー言語におけるシンボルに付随する文字列を、所定の書式に従って分解する文字列分解部と、
前記文字列分解部によって分解された文字列を基に、前記文字列に関する情報を前記命令情報テーブルに格納する情報格納部と、
前記命令情報テーブルと、前記パラメータテンプレートテーブルと、前記テンプレートテーブルと、を基に、前記入力命令語と、前記演算命令語と、前記出力命令語による中間語を出力する中間語生成部と
をさらに有することを特徴とする請求項１に記載のプログラム解析装置。
【請求項６】
前記命令情報テーブルには、条件付実行命令語に関する情報が格納され、
前記中間語生成部は、前記命令情報テーブルに前記条件付実行命令語に関する情報が格納される場合、当該条件付実行命令語に対応する命令語を前記中間語に付加する
ことを特徴とする請求項５に記載のプログラム解析装置。
【請求項７】
ラダー言語に基づくデバイス素子を連結したラダー図をコンパイルした結果であり、入力命令語、演算命令語及び出力命令語を含む命令語の集合体である中間語を処理対象として逆コンパイルを行うプログラム解析装置が、
前記中間語から前記入力命令語を検出し、前記入力命令語に関する情報を前記入力命令語から抽出し、
当該抽出した入力命令語に関する情報を命令情報テーブルに格納し、
すべての前記入力命令語に関する情報を命令情報テーブルに格納した後、前記中間語において、前記入力命令語に続く前記命令語が前記演算命令語であるとみなし、前記演算命令語に関する情報を前記命令情報テーブルに格納し、
すべての前記演算命令語に関する情報を前記命令情報テーブルに格納した後、前記中間語において、前記演算命令語に続く前記命令語が前記出力命令語であるとみなし、前記出力命令語に関する情報を前記出力命令語から抽出し、
当該抽出した出力命令語に関する情報を前記命令情報テーブルに格納し、
すべての前記出力命令語に関する情報を命令情報テーブルに格納した後、前記命令情報テーブルを基に、前記デバイス素子を生成する
ことを特徴とするプログラム解析方法。
【請求項８】
前記プログラム解析装置は、
前記演算命令語の形式に関する情報と、前記形式に関する形式識別情報とが対応付けられるテンプレートテーブルが格納される記憶部を有し、
前記プログラム解析装置が、
前記テンプレートテーブルを参照して、処理対象となっている前記演算命令語の形式を判定し、当該形式に該当する形式識別情報を、前記演算命令語に関する情報として前記命令情報テーブルに格納する
ことを特徴とする請求項７に記載のプログラム解析方法。
【請求項９】
前記入力命令語に関する情報及び前記出力命令語に関する情報は、当該命令語において使用されているパラメータに関する情報である
ことを特徴とする請求項７に記載のプログラム解析方法。
【請求項１０】
前記パラメータに関する情報は、前記パラメータの読込方式又は書込方式を含み、さらに前記パラメータが格納されるアドレス値、及び前記パラメータのサイズに関する情報が前記パラメータに関する情報に含まれる
ことを特徴とする請求項９に記載のプログラム解析方法。
【請求項１１】
前記プログラム解析装置は、
入力命令語及び出力命令語の形式に関する情報であるパラメータテンプレートテーブルが格納されるとともに、前記演算命令語の形式に関する情報と、前記形式に関する形式識別情報とが対応付けられるテンプレートテーブルが格納される記憶部を有し、
前記プログラム解析装置が、
ラダー言語におけるシンボルに付随する文字列を、所定の書式に従って分解し、
前記分解された文字列を基に、前記文字列に関する情報を前記命令情報テーブルに格納し、
前記命令情報テーブルと、前記パラメータテンプレートテーブルと、前記テンプレートテーブルと、を基に、前記入力命令語と、前記演算命令語と、出力命令語による中間語を出力することによる前記ラダー図のコンパイルを行う
ことを特徴とする請求項７に記載のプログラム解析方法。
【請求項１２】
前記命令情報テーブルには、条件付実行命令語に関する情報が格納され、
前記命令情報テーブルに前記条件付実行命令語に関する情報が格納される場合、前記プログラム解析装置が、当該条件付実行命令語に対応する命令語を前記中間語に付加する
ことを特徴とする請求項１１に記載のプログラム解析方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ラダー言語のコンパイル及び逆コンパイルを行うプログラム解析装置及びプログラム解析方法に関する。
【背景技術】
【０００２】
ラダー言語は工業分野における制御用の言語として、最も普及しているものの１つである。その理由として、ラダー言語は、回路的な表現による記述が、回路設計をバックグラウンドにもつ技術者に受け入れられやすいことがあげられる。しかし、ラダー言語で記述されたプログラムは電子回路とは異なり、計算機で演算を行うことによって実現されるものである。そのため、ラダー言語で記述された回路を計算機で実行できる形に変換する、コンパイルが必要不可欠となる。
【０００３】
ラダー言語を実行する計算機として、制御用のコントローラであるＰＬＣ（Programmable Logic Controller）がある。ＰＬＣは制御システムにおいて周期的な制御シーケンスを実行することに特化した計算機である。そして、ＰＬＣで動作するプログラムとして、ラダー言語が使用されることがある。その際、ラダー言語によるプログラムの作成は一般的なＰＣ（Personal Computer）で行われ、そのプログラムをＰＣでコンパイルして、通信回線等を介してＰＬＣに送信する。そして、ＰＬＣは、コンパイルされたプログラムを実行する。このとき、ラダー言語で作成され、コンパイルされたプログラムはＰＬＣに搭載されたフラッシュＲＯＭ（Read Only Memory）等の記憶媒体に書き込まれる。そして、ＰＬＣに搭載されたプロセッサが、フラッシュＲＯＭからコンパイルされたプログラムをメモリ上にロードすることにより、該プログラムが実行可能となる。
【０００４】
このように、ＰＬＣに搭載された記憶媒体には、ラダー言語で記述されたプログラムが格納されているが、このプログラムを再びＰＣにアップロードし、編集する場合もある。その際、ＰＣの記憶媒体上にラダー言語の回路情報がすべて入っているならば問題ないが、容量の制約により、コンパイル済みのプログラムのみが格納されている場合がある。その場合は、ＰＣにコンパイルされたプログラムをアップロードし、そのプログラムをラダー言語の表現形式に変換する逆コンパイルが必要となる。
【０００５】
このように、ラダー言語を使用するにあたって、ラダー言語からＰＬＣのプロセッサが実行できる形式に変換するコンパイル、及びその逆コンパイルのセットが必要となる。
【０００６】
このような課題に対し、特許文献１に記載の技術が開示されている。特許文献１に記載の技術は、演算命令と機械語を対応させるテーブルを使用して、そのテーブルからシーケンスプログラムを変換する。同時に、特許文献１に記載の技術は、ＰＬＣの記憶媒体の別の領域に復元情報を埋め込んでおき、逆変換（逆コンパイル）時にその情報を手がかりにラダー言語への復元を行う。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開平５−２７４０１１号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
ラダー言語で記述されたプログラムは、回路の処理を行うシーケンス命令（接点命令、コイル命令、分岐命令、結合命令等）の他に、演算処理を実行する演算命令を組み込むことが一般的である。演算命令の例として、例えば四則演算、比較演算、論理演算等が組み込まれ、その演算処理の結果が回路の動作を決定するようにプログラムが組まれる。そのため、コンパイル及び逆コンパイルでは回路の変換だけでなく、演算命令のコンパイル及び逆コンパイル処理も必要となる。一般的に、演算命令はシーケンス命令よりも複雑であるため、コンパイル処理及び逆コンパイル処理が複雑になる傾向がある。また、プログラムを作成するユーザが、要求に応じて後から演算命令をプログラムに追加したいと要望する場合もあるため、拡張性が求められるところでもある。
【０００９】
なお、特許文献１に記載の技術では、演算命令だけでなく、演算命令を逆コンパイルするための付加情報をＰＬＣにダウンロードしておく必要がある。
【００１０】
このような背景に鑑みて本発明がなされたのであり、本発明は、効率的な逆コンパイルを行うことを課題とする。
【課題を解決するための手段】
【００１１】
前記した課題を解決するため、本発明は、入力命令語を解析し、入力命令語に関する情報を命令情報テーブルに格納する入力命令解析部と、入力命令解析部による処理の終了後、演算命令語に関する情報を命令情報テーブルに格納する演算命令解析部と、演算命令解析部による処理の終了後、出力命令語に関する情報を命令情報テーブルに格納する出力命令解析部と、出力命令解析部による処理の終了後、命令情報テーブルを基に、ラダー図におけるデバイス素子を生成する変換部とを有することを特徴とする。
【発明の効果】
【００１２】
本発明によれば、効率的な逆コンパイルを行うことができる。
【図面の簡単な説明】
【００１３】
【図１】本実施形態に係るプログラム解析装置の構成例を示す図である。
【図２】ラダー図と、そのラダー図に対応する中間語の例である。
【図３】各命令の展開例を示す図である。
【図４】本実施形態に係るデバイス−アドレス対応テーブル及び演算命令管理テーブルの例を示す図である。
【図５】本実施形態に係るテンプレートテーブルの例を示す図である。
【図６】本実施形態に係るパラメータテンプレートテーブルの例を示す図である。
【図７】本実施形態に係るコンパイル処理についての状態遷移図である。
【図８】本実子形態に係る解析フェーズ処理の概要を示す図である。
【図９】本実施形態に係る解析フェーズ処理の詳細な手順を示すフローチャートである（その１）。
【図１０】本実施形態に係る解析フェーズ処理の詳細な手順を示すフローチャートである（その２）。
【図１１】本実施形態に係る命令情報テーブルの例を示す図である。
【図１２】本実施形態に係る中間語生成フェーズ処理の詳細な手順を示すフローチャートである。
【図１３】本実施形態に係るコンパイルによって生成される中間語の例を示す図である。
【図１４】本実施形態に係る逆コンパイルの処理についての状態遷移図である。
【図１５】本実施形態に係る逆コンパイルの対象となる中間語の例を示す図である。
【図１６】本実施形態に係る入出力解析フェーズ処理の詳細な処理手順を示すフローチャートである（その１）。
【図１７】本実施形態に係る入出力解析フェーズ処理の詳細な処理手順を示すフローチャートである（その２）。
【図１８】本実施形態に係る演算命令解析フェーズ処理の詳細な処理手順を示すフローチャートである。
【図１９】本実施形態に係る変換フェーズ処理の詳細な処理手順を示すフローチャートである（その１）。
【図２０】本実施形態に係る変換フェーズ処理の詳細な処理手順を示すフローチャートである（その２）。
【図２１】本実施形態に係る変換フェーズ処理の概要を示す図である。
【図２２】本実施形態において、条件付ジャンプの命令語に対する処理を説明するための図である。
【発明を実施するための形態】
【００１４】
次に、本発明を実施するための形態（「実施形態」という）について、適宜図面を参照しながら詳細に説明する。
ここで、本実施形態における用語の定義を行う。
本実施形態において、「命令語」とは、ラダー図をコンパイルした結果生成される中間語を構成するものであり、中間語における一つ一つの命令に関するものである。命令語には、入力命令に関する入力命令語や、演算に関する演算命令語や、出力に関する出力命令語等がある。
デバイス素子は、ラダー図を構成する部品であり、接点命令や、コイル命令や、演算命令や、分岐命令等がある。
また、本実施形態は、ラダー図から各命令語を生成・出力することで中間語を生成・出力するコンパイルと、中間語における命令語からデバイス素子を生成することで、ラダー図を復元する逆コンパイルとについて説明するものである。
【００１５】
［装置構成］
図１は、本実施形態に係るプログラム解析装置の構成例を示す図である。
プログラム解析装置１は、ＰＣ等であり、メモリ１０、ＣＰＵ（Central Processing Unit）２０、ＨＤ（Hard Disk）等の記憶装置（記憶部）３０、キーボードや、マウス等の入力装置４０、ディスプレイ等の出力装置５０を有する。
記憶装置３０に格納されているプログラムがメモリに展開され、展開されたプログラムがＣＰＵ２０によって実行されることで、処理部１００、コンパイル部１１０、解析部１１１、中間語生成部１１２、逆コンパイル部１２０、入出力解析部１２１、演算命令解析部１２２、変換部１２３が具現化している。
なお、処理部１００は、コンパイル部１１０及び逆コンパイル部１２０を有している。
【００１６】
コンパイル部１１０はラダー図をアセンブラ等の中間語へ変換するものであり、解析部（文字列分解部、情報格納部）１１１、中間語生成部１１２を有している。
解析部１１１はラダー図のＰＩ／Ｏ（Process Input/Output）文字列（後記）を分解し、命令情報テーブル３５を生成する。
中間語生成部１１２は、解析部１１１が生成した命令情報テーブル３５を基に、テンプレートテーブル３１、パラメータテンプレートテーブル３２等を参照して、中間語（後記）を生成する。
【００１７】
逆コンパイル部１２０は、中間語からラダー図を復元するものであり、入出力解析部（入力命令解析部、出力命令解析部）１２１、演算命令解析部１２２、変換部１２３を有する。
入出力解析部１２１は、中間語中の「ＭＯＶ」命令から入出力パラメータの情報を抽出し、命令情報テーブル３５に格納する。
演算命令解析部１２２は、中間語中の演算命令からテンプレートテーブル３１におけるテンプレート番号（後記）を特定し、命令情報テーブル３５に格納する。
変換部１２３は、入出力解析部１２１、演算命令解析部１２２によって生成された命令情報テーブル３５を基にデバイス素子を生成することにより、ラダー図を復元する。
【００１８】
また、記憶装置３０にはテンプレートテーブル３１、パラメータテンプレートテーブル３２、デバイス−アドレス対応テーブル３３、演算命令管理テーブル３４、命令情報テーブル３５を格納している。
テンプレートテーブル３１は、中間語における命令語列のパターンを格納しているものである。
パラメータテンプレートテーブル３２は、入出力に関する命令語におけるパラメータの配置情報を格納しているものである。
デバイス−アドレス対応テーブル３３は、ラダー図で用いられるデバイスと、アドレスの範囲とが対応付けられて格納されているものである。
演算命令管理テーブル３４は、演算命令と、演算命令を識別する命令番号とが対応付けられて格納されているものである。
命令情報テーブル３５は、ラダー図から中間語を生成するための情報、もしくは、中間語からラダー図を復元するための情報を格納しているものである。
なお、各テーブル３１〜３５は後記して詳細に説明する。
【００１９】
[コンパイル概要]
以下、図２及び図３を参照して、ラダー図のコンパイル処理の概要について説明する。
図２は、ラダー図と、そのラダー図に対応する中間語の例である。
図２（ａ）がラダー図２０１を示し、図２（ｂ）が図２（ａ）を基に生成されるアセンブラ等の中間語２０２を示す。
図２（ａ）に示すように、ラダー図２０１の主要な構成部品としては接点命令２１１，２１２や、コイル命令２１３，２１４や、演算命令２１５，分岐命令２１６，２１７等がある。前記したように、接点命令２１１，２１２や、コイル命令２１３，２１４や、演算命令２１５，分岐命令２１６，２１７等の総称を（つまり、一つ一つを）「デバイス素子」と称する。また、ラダー言語では、符号２１１，２１６，２１５，２１７，２１３のような、１つの列回路単位で処理が行われる。このような列回路を「ラング」と称する。
【００２０】
接点命令２１１，２１２はＩ／Ｏ（Input/Output）の入力情報で、ｄｉｇｉｔ値をとる。すなわち、接点命令２１１，２１２は、Ｉ／Ｏの状態が「ＯＮ」か「ＯＦＦ」という２値を取りうる。接点命令２１１，２１２の代わりに、演算命令２１５が使用されることもある。この場合、使用される演算命令２１５は結果が２値となるものに限定される。例えば、大小比較の演算命令や、論理演算命令等である。
【００２１】
コイル命令２１３，２１４は、１つのラングの入力側１つだけに存在し、同じラングの出力側の状態が「真」であればそのコイル命令に関連付けされたＩ／Ｏの出力を許可する。出力側の状態が「偽」であれば、コイル命令は出力を許可しない。「真」か「偽」の設定は、例えば接点命令２１１，２１２が「ＯＮ」であるか、「ＯＦＦ」であるか等である。また、前記したように、コイル命令２１３，２１４の代わりに演算命令が使用されることもある。この場合、演算命令は、その左側の真偽の結果によって実行の可否が決定される。なお、コイル命令の代わりに演算命令が使用されるとき、演算命令の種類は限定されない。
【００２２】
ラダー言語において、命令の実行順序には一定のルールがあり、そのルールに従ってデバイス素子が実行されていく。図２の例では、まず、接点命令２１１が最初に実行される。実際には、接点命令２１１は例えば図２（ｂ）における「ＬＤ」等といった中間語（アセンブラ）の命令語２２１に変換される。そして、制御装置（不図示）はこの命令語を実行することで制御対象（不図示）の制御を行う。
【００２３】
接点命令２１１の次に、分岐命令２１６、演算命令２１５、分岐命令２１７、コイル命令２１３が順に実行される。これらは、それぞれ図２（ｂ）の命令語２２２〜２２５に変換されて実行される。
コイル命令２１３が実行されたところで１つのラング２３１が終了し、制御装置は、その次のラング２３２に移って接点命令２１２から新たに命令が実行され、接点命令２１２、コイル命令２１４の順に命令が実行される。実際には、これらの命令は図２（ｂ）の命令語２２６，２２７に変換され、実行される。
【００２４】
このようにして、コンパイル部１１０はラダー言語で記述されたラダー図２０１を決められたルールに従い、ラダー図２０１上の各デバイス素子をプロセッサが解釈可能な命令語に変換するコンパイルを行う。この場合に適用されるルールとしては、例えば以下のようなルールである。
（１）ラングの最初は必ず接点命令である。そのため、コンパイル部１１０は、接点命令２１１，２１２がラングの最初に挿入されなければシンタックスエラーとする。
（２）分岐命令が挿入された場合には、分岐命令の直前の接点命令のＯＮ／ＯＦＦ情報をスタックにコピーする。そのため、図２（ａ）の例で、コンパイル部１１０は分岐命令２１６，２１７の実行後、直前にある接点命令２１１，２１２のＯＮ／ＯＦＦの情報をスタックにコピーする。
【００２５】
（３）分岐命令が実行された後、ＯＮ／ＯＦＦ情報がスタックから取り出され、その情報で以降の命令が実行される。そのため、図２（ａ）の例で演算命令２１５が実行される際、コンパイル部１１０は、その直前の分岐命令２１６でスタックにコピーされていたＯＮ／ＯＦＦ情報、すなわち接点命令２１１のＯＮ／ＯＦＦ情報を取得する。また、コンパイル部１１０は、取得したＯＮ／ＯＦＦ情報でコイル命令２１３の実行可否を判断する。
【００２６】
図２（ａ）に示すようなラダー言語で記述されたラダー図２０１に関連付けされたＩ／Ｏ（以下、ＰＩ／Ｏと称する）は、図２（ａ）において「Ｘ０００」や、「Ｙ０００」等と記述されている。以下、これらの文字列をＰＩ／Ｏ文字列と称することとする。また、符号２５１のように、デバイス素子の種類を示す図形をシンボルと称することとする。すなわち、デバイス素子２１１は、ＰＩ／Ｏ文字列と、シンボル２５１とからなる。
【００２７】
ＰＩ／Ｏ文字列における名称の先頭のＸ，Ｙ等の文字は、Ｉ／Ｏデバイス（データの入出力先でありデバイス素子とは別）のアドレスあるいは内蔵メモリを指定するものである。これらをデバイス指定文字と称することとする。また、それらの文字に続く数字は、先頭の文字が示すデバイスの入出力接点命令の指定や、メモリ上のアドレスを指定している。これらをアドレス指定数字と称することとする。例えばＰＩ／Ｏ文字列として「Ｘ０００」と記述されている場合、「Ｘ」が入力デバイス（データの格納先となるメモリ等）を意味し、その入力デバイスの０番目の接点命令を指定することが示されている。
【００２８】
ＰＩ／Ｏの指定方法として、様々な方法が考えられる。例えば、接点命令２１１において、アドレス指定文字「Ｘ」が指定するデバイスの先頭「Ｘ０００」のアドレスに対して、「Ｄ０２０」に格納されている値だけオフセット（加算）した先にあるデバイスを指定したい場合等がある。この場合、たとえばＰＩ／Ｏ文字列では「Ｘ０００（Ｄ０２０）」等と記載する。前記した「Ｘ０００」等の指定方法を「直接アドレス方式」と称し、オフセットを考慮した「Ｘ０００（Ｄ０２０）」の指定方法を「間接アドレス方式」と称する。また、「１２３４」等の定数値を直接入出力したい場合や、ロングワードサイズや、浮動小数の指定等、ＰＩ／Ｏのサイズを指定したい場合等もある。さらに、定数値の指定については、１０進数、１６進数、２進数、浮動小数点や時刻の指定等、様々な指定方法が考えられる。
【００２９】
また、「間接アドレス方式」において、前記した「Ｘ０００」のようにオフセットの対象となるアドレスを「オフセット付アドレス」と称し、「Ｄ０２０」のようにオフセットの値を「オフセットアドレス」と称することがある。
【００３０】
このようなＰＩ／Ｏのアドレス値や、定数値や、サイズ値等（以下、これらを総称してパラメータと称する）の指定は他にも考えられる。ここで重要なことは、パラメータの指定の方法は無数に考えられ、また後からパラメータの指定方法を追加することもあり得るということである。これらのパラメータの指定方法に応じ、適切なコンパイルを行い、適切な命令語のオブジェクトに置き換えることが必要である。また、命令語に置き換えられたオブジェクトから、ラダー図に戻す逆コンパイルも適切に行わえるようにしなければならない。
【００３１】
次に、ラダー図における接点命令やコイル命令、演算命令を実行する方法について考える。ハードウェアが、Ｉ／Ｏデバイスやメモリにアドレスを割り付けることを考えれば、接点命令やコイル命令は、ＰＩ／Ｏ文字列で指定されたアドレスに対して読み取りや書き込みを行うこととほぼ等価である。これらの命令はメモリ上あるいはＩ／Ｏデバイスに関連付けられたアドレスから値を読み取る、あるいは書き込むという処理と、読み取った値に対して演算命令を行う処理がある。
【００３２】
図３は、各命令の展開例を示す図である。
図３（ａ）は演算命令３０１のデバイス素子を示す図である。演算命令３０１のＰＩ／Ｏ文字列に示されているように、このデバイス素子は「ＡＤＤ」による加算を行う命令である。演算命令３０１をアセンブラにすると、図３（ｂ）に示すようなものとなる。このアセンブラによる処理を逐次的に記述すると以下のようになる。
（Ａ１）プロセッサが、アドレス「Ｄ０００」のＰＩ／Ｏの値を読み出し、汎用レジスタ「ＡＸ」に格納する（ＭＯＶ．Ｌ  ＡＸ［Ｄ０００］：符号３０２）。なお、「Ｌ」は、扱われている値がロングワードサイズであることを示している。以下、符号３０２のようにアセンブラ記述の１行を命令語と称する。
（Ａ２）プロセッサが、定数値「Ｈ００００１２３４」を読み出し、汎用レジスタ「ＢＸ」に格納する（ＭＯＶ  ＢＸ  ＃Ｈ００００１２３４：符号３０３）。
（Ａ３）プロセッサが、「ＡＸ」に格納されている値と、「ＢＸ」に格納されている値を加算して、ＡＸに格納する（ＡＤＤ．Ｌ  ＡＸ  ＢＸ：符号３０４）。
（Ａ４）プロセッサが、「ＡＸ」に格納されている値を、アドレス「Ｄ０００」のＰＩ／Ｏに書き出す（ＭＯＶ．Ｌ  [Ｄ０００］  ＡＸ：符号３０５）。
【００３３】
図３（ｃ）は、接点命令３１１のデバイス素子を示す図である。
この接点命令３１１をアセンブラにすると、図３（ｄ）に示すようなものとなる。このアセンブラによる処理を逐次的に記述すると以下のようになる。
（Ｂ１）プロセッサがアドレス「Ｘ０００」のＰＩ／Ｏの値を読み出し、汎用レジスタ「ＡＸ」に格納する（ＭＯＶ  ＡＸ  ［Ｘ０００］：符号３１２）。
（Ｂ２）プロセッサが「ＡＸ」に格納されている値をスタックに追加する（ＰＵＳＨ  ＡＸ：符号３１３）。
【００３４】
図３（ｅ）は、コイル命令３２１のデバイス素子を示す図である。
コイル命令３２１をアセンブラにすると、図３（ｆ）に示すようなものとなる。このアセンブラによる処理を逐次的に記述すると以下のようになる。
（Ｃ１）プロセッサがスタックから値を汎用レジスタ「ＡＸ」に取り出す（ＰＯＰ  ＡＸ：符号３２２）。
（Ｃ２）「ＡＸ」に格納されている値をアドレス「Ｚ０００」のＰＩ／Ｏに書き出す（ＭＯＶ  ［Ｚ０００］  ＡＸ：符号３２３）。
【００３５】
以下の処理は図３（ｂ）で説明した処理を同じ処理である。
図３（ｇ）に示すように、プロセッサがアドレス「Ｄ０００」から値を取り出し、それを汎用レジスタ「ＡＸ」に格納する（Ｓ１１）。
次に、プロセッサが、定数値「Ｈ００００１２３４」を汎用レジスタ「ＢＸ」に格納する（Ｓ１２）。
そして、プロセッサが、汎用レジスタ「ＡＸ」に格納されている値と、汎用レジスタ「ＢＸ」に格納されている値を加算し（Ｓ１３）、加算した結果を汎用レジスタ「ＡＸ」に格納する（Ｓ１４）。
そして、プロセッサがアドレス「Ｄ０００」に汎用レジスタ「ＡＸ」に格納されている値を書き込む（Ｓ１５）。
【００３６】
なお、本実施形態では、中間語であるアセンブラで記述しているが、ラダー図を直接機械語に変換することも可能である。
【００３７】
これらの命令のアセンブラ記述で共通していることは、どのような命令の展開であっても、大きく以下のような３つの順序で行われていることである
（Ｄ１）ＰＩ／Ｏや定数値の汎用レジスタ（「ＡＸ」や「ＢＸ」等）への取り込み（入力）。
（Ｄ２）汎用レジスタに取り込まれた数値の演算命令実行。
（Ｄ３）演算命令結果のＰＩ／Ｏへの書き込み（出力）。
【００３８】
図３（ａ）における「ＡＤＤ」を例にとると、図３（ｂ）における符号３０２のステップと符号３０３のステップは、前記した（Ｄ１）のＰＩ／Ｏや定数値等のパラメータを汎用レジスタに取り込む入力に分類される。
同様に、符号３０４のステップは、前記した（Ｄ２）の汎用レジスタの値に対して演算命令を行う演算命令実行に分類される。
そして、符号３０５のステップは、前記した（Ｄ３）の演算命令結果をＰＩ／Ｏに書き出す出力に分類される。
図３（ｃ）の接点命令３１１でも同様に、図３（ｄ）における符号３１３の「ＰＵＳＨ」は演算命令と出力とを兼ねている（Ｄ２とＤ３を兼ねている）とみなすことができる。また、、図３（ｅ）のコイル命令３２１でも同様に、図３（ｆ）における符号３２３の「ＰＯＰ」は入力と演算命令とを兼ねている（Ｄ１とＤ２を兼ねている）とみなすこともできる。
【００３９】
演算命令は、加算や減算等の単純な演算命令に限らず、複雑な処理であることがある。
図３（ａ）に示す例では「ＡＤＤ」という演算命令１ステップで演算命令を終了していたが、実際にはその限りではない。複雑な処理になった場合でも、演算命令をコンパイルして適切なオブジェクトに変換し、またそのオブジェクトを逆コンパイルして元の演算命令に戻すことができるようにする必要がある。
【００４０】
以上のように、ラダー図に演算命令を配置したときに、その入出力のＰＩ／Ｏの指定方法が多岐にわたるだけでなく、演算命令処理自体も複雑化することが考えられる。さらに、このような複雑な演算命令をコンパイル・逆コンパイルで効率的にもとの演算命令に復元できるようにすることも同時に求められる。
【００４１】
そこで、本実施形態において、コンパイル部１１０は、コンパイル時に、演算命令やコイル命令等の、ラダー図の各デバイス素子に対してシンボルやＰＩ／Ｏ文字列を解析する。そして、コンパイル部１１０は、解析した結果から入出力のパラメータを実アドレスに変換し、また予め設定してあるテンプレート（テンプレートテーブル３１）を使ってアセンブラあるいは機械語レベルの命令語列に変換する（本実施形態では、アセンブラに変換する）。
【００４２】
また、逆コンパイル部１２０は、逆コンパイル時に、コンパイル時に使用したテンプレート（テンプレートテーブル３１）を使用し、このテンプレートと、中間語の命令語との比較によってラダー図におけるデバイス素子を復元する。このとき、前記したように、中間語の構造が「入力」、「演算命令実行」、「出力」の順になることに着目し、それぞれのフェーズ処理で参照対象とするテンプレートを限定することで、テンプレート参照の回数を減らすようにする。
【００４３】
以下、図４〜図１８を参照して本実施形態の詳細な説明を行う。
【００４４】
［各種テーブル］
ここで、図４〜図６を参照して、本実施形態で使用する各種テーブルを説明する。
（デバイス−アドレス対応テーブル）
図４（ａ）は、本実施形態に係るデバイス−アドレス対応テーブルの例を示す図である。
デバイス−アドレス対応テーブル３３では、ＰＩ／Ｏに使用されるデバイス指定文字と、そのデバイス指定文字に割り当てられているアドレスの範囲が対応付けられている。なお、デバイス−アドレス対応テーブル３３は設定者によって予め設定されているテーブルである。
【００４５】
（演算命令管理テーブル）
図４（ｂ）は、本実施形態に係る演算命令管理テーブルの例を示す図である。
演算命令管理テーブル３４では、演算命令名称と、その命令番号とが対応付けられている。ここで、図４（ｂ）に示す「ＦＵＮＣ１」、「ＦＵＮＣ２」とは、前記した「ＡＤＤ」等を代表するものである。また、命令番号とは、設定者によって各演算命令に対して一意に割り振られる番号である。
【００４６】
（テンプレートテーブル）
図５は、本実施形態に係るテンプレートテーブルの例を示す図である。
図５（ａ）は、テンプレートテーブル３１の構成例を示す図であり、図５（ｂ）は図５（ａ）に示すテンプレートテーブル３１をアセンブラによる記述（中間語）に変換した例である。
テンプレートテーブル３１は、設定者によって予め作成されているテーブルであり、図５（ａ）に示すように複数のテーブル（以降、個々のテーブルをテンプレートと称する）を有している。各テンプレートには、テンプレート番号、ステップ総数、第１ステップ〜第ｎステップ（図５の例では第３ステップまで）の情報が格納されている。そして、テンプレートテーブル３１は、中間語を作成するための雛形となるテーブルである。
【００４７】
テンプレート番号は、各テンプレートを特定するための番号であり、設定者によって設定される番号である。
ステップとは、図５（ｂ）に示されるように、中間語としてアセンブラを使用した場合における各命令語のことである。
従って、ステップ総数は、命令語の総数である。
【００４８】
そして、各ステップ毎に、「生成条件」、「分類」、「オプション設定」、「オペコード」、「サイズ」、「汎用レジスタ」の各情報を格納している。本実施形態では、汎用レジスタを「ＥＡＸ」としているが、汎用レジスタを自由に設定できるようにしてもよい。
「生成条件」は、該当するステップが生成される条件である。例えば、第１ステップのように「常に」が記載されている場合は、該当する命令語は常に生成される。また、第２ステップのように「パラメータ１がロングワード」が生成条件となっている場合、第１ステップで使用されている「パラメータ１」の「サイズ」がロングワードである場合に該当する命令語が生成される。
【００４９】
「分類」は該当する命令語が属する分類である。この分類は、前記した（Ｄ１）入力、（Ｄ２）演算命令実行、（Ｄ３）出力に相当する。
「オプション設定」は、後記するようにジャンプ命令等の特殊な命令の情報を格納する。
「オペコード」は「オペレーションコード」の略であり、ここではアセンブラにおける命令の種類である。
「サイズ」は、使用されるパラメータのサイズ（ロングワードサイズ）等である。
「汎用レジスタ」は、使用される汎用レジスタのＰＩ／Ｏデバイスを示す。
【００５０】
以下、各設定事項の具体的な説明を行う。
例えば、第１ステップは、「オペコード」は「ＭＯＶ」命令を使用し、「サイズ」は「パラメータ１」のサイズが設定されている。第１ステップの例では「サイズ」で「パラメータ１のサイズ」が設定されている。従って、「パラメータ１」のサイズに「Ｌ（ロングワードサイズ）」が設定されている場合、コンパイル部１１０は命令語の生成時に「ＭＯＶ．Ｌ」の命令、すなわち「ロングワードサイズ」の「ＭＯＶ」命令を生成する。
【００５１】
「生成条件」は、前記したように、この第１ステップの命令が生成される条件を表している。ここでは「常に」であるので、第１ステップに該当する命令は必ず生成される。
「分類」は、本命令の分類がパラメータ１をリードする分類（前記した（Ｄ１）の「入力」）であることを示している。例えば、「パラメータ１」をリードするように設定すると、「パラメータ１」のアドレスに対して命令を実行することが設定される。オプションの設定は「なし」であるので、オプションの設定は特に行わない。また、汎用レジスタは「ＥＡＸ」を使用するように設定されている。
【００５２】
このような第１ステップの設定内容をアセンブラで記述すると、図５（ｂ）に示される第１ステップ「ＭＯＶ．Ｓ１  ＥＡＸ  ［パラメータ１］」（Ｓ１はパラメータ１のサイズ）となる。
【００５３】
同様にして、図５（ａ）における第２ステップは、「オペコード」が「ＦＵＮＣ」であり、「サイズ」は「ロングワード（サイズ）」である。
また、「生成条件」として、「パラメータ１」が「ロングワード（サイズ）」となっている。これは、「パラメータ１」がロングワードサイズではない場合、コンパイル部１１０は、第２ステップの命令を生成しないことを意味している。
「分類」は、本命令の分類が演算命令を実行する分類（（Ｄ２）演算命令実行）であることを示している。「オプション設定」には、「飽和あり」が設定されている。「飽和あり」とは以下のような意味である。いくつかの命令では、演算命令を実行した結果、オーバーフローが発生する場合があるが、そのオーバーフローが発生したときに数値をどのように扱うかを設定できる命令語も存在する。「飽和あり」は、オーバーフローしたときに、最大値に飽和をするように命令を生成することを意味している。
また、汎用レジスタは「ＥＡＸ」を使用するように設定されている。
このような第２ステップの設定内容をアセンブラで記述すると、図５（ｂ）に示される第２ステップ「ＦＵＮＣ．ＯＬ  ＥＡＸ」となる。
【００５４】
図５（ａ）における第３ステップでは、「オペコード」が「ＭＯＶ」であり、「サイズ」は「パラメータ２のサイズ」である。
「生成条件」として第１ステップと同様に「常に」が設定されており、「オプション設定」も「なし」が設定されている。ただし、「分類」は「パラメータ２ライト」であり、パラメータ２で設定されたアドレスに対してライト（（Ｄ３）出力）が行われることを意味している。
また、汎用レジスタは「ＥＡＸ」を使用するように設定されている。
このような第３ステップの設定内容をアセンブラで記述すると、図５（ｂ）に示される第３ステップ「ＭＯＶ．Ｓ２  ［パラメータ２］  ＥＡＸ」（Ｓ２はパラメータ２のサイズ）となる。
【００５５】
なお、テンプレートテーブル３１としてオフセットアドレスに関する「オフセットサイズ」、「オフセット汎用レジスタ」欄等が設けれてもよい。
【００５６】
（パラメータテンプレートテーブル）
図６は、本実施形態に係るパラメータテンプレートテーブルの例を示す図である。
本実施形態では、中間語における各ステップの詳細な記述を行うテンプレートテーブル３１とは別に、引数の設定方式を具体的に設定するパラメータテンプレートテーブル３２を定義する。なお、引数とは、命令語における各値を示す。
パラメータテンプレートテーブル３２は、「Ｎｏ．」と、「設定方式」と、「命令ステップ」とが対応付けられている。
【００５７】
「設定方式」は、「直接アドレスリード」や、「間接アドレスリード」等、主に入出力形式を設定している。この「設定方式」は、図１１で後記する命令情報テーブル３５における「方式」に対応する情報である。
そして、「命令ステップ」において、各「設定方式」における詳細なパラメータの形式が設定されている。
【００５８】
なお、「命令ステップ」において、「“  ”」で囲っているパラメータには、後記する命令情報テーブル３５や、図５（ａ）のテンプレートテーブル３１から取得された情報が格納される。どのパラメータテンプレートテーブル３２における各引数が、どのテーブルから取得されるかは、例えば引数にタグのような情報を持つビット列を埋め込むこと等で対照してもよい。あるいは、引数の参照方式として、引数参照の方法を示すフラグや異なるオペコードの採用等により区別される方法でもよい。
【００５９】
例えば、「設定方式」で「直接アドレスリード」が設定された場合、中間語の命令語として「ＭＯＶ」命令が使用される。また、「“サイズ”」は、前記したように図１１で後記する命令情報テーブル３５における「サイズ」に対応する情報である。また、「“汎用レジスタ”」は図５（ａ）のテンプレートテーブル３１における「汎用レジスタ」に対応する情報である。そして、「“アドレス・定数”」は図１１で後記する命令情報テーブル３５の「アドレス・定数」に対応する情報である。
なお、なお、「“アドレス・定数”」において「［  ］」がついているものはアドレス参照を示し、「［  ］」がないものは定数値を参照している。
なお、パラメータテンプレートテーブル３２における行を「命令テンプレート」と称することとする。
【００６０】
［コンパイル］
まず、図７〜図１３を参照して、本実施形態に係るコンパイル処理について説明する。
（状態遷移図）
図７は、本実施形態に係るコンパイル処理についての状態遷移図である。
コンパイル部１１０が処理を開始すると、コンパイル部１１０の解析部１１１がラダー図における最初のラングを読み込み、最初のデバイス素子について、解析フェーズ処理に遷移する（Ｓ２１）。解析フェーズ処理では、ＰＩ／Ｏ文字列の分解・解析が行われ、図１１で後記する命令情報テーブル３５が生成される。解析フェーズ処理の詳細については、図９〜図１１を参照して後記する。
処理対象となっているデバイス素子について解析フェーズ処理が終了すると、コンパイル部１１０の中間語生成部１１２が中間語生成フェーズ処理に遷移する（Ｓ２２）。中間語生成フェーズ処理では、解析フェーズ処理で生成された命令情報テーブル３５と、テンプレートテーブル３１、パラメータテンプレートテーブル３２を基に、中間語が生成される。中間語生成フェーズ処理の詳細は、図１２〜図１３を参照して後記する。
【００６１】
そして、コンパイル部１１０は次に実行されるデバイス素子が存在するか否かを判定し、次に実行されるデバイス素子がある場合（Ｓ２３）、解析部１１１が次に実行されるデバイス素子について解析フェーズ処理を行う。
次に実行されるデバイス素子がない場合（Ｓ２４）、コンパイル部１１０はコンパイル処理を終了する。
【００６２】
ここで、図８を参照して、解析フェーズ処理の概要を示す。
図８におけるデバイス１０６１は「ＦＵＮＣ１」という演算命令を表している。そして、ＰＩ／Ｏ文字列１０６２は「ＦＵＮＣ１」の式を表す文字列である。
ＰＩ／Ｏ文字列１０６２において、「ＦＵＮＣ１」のあとに続く文字列は入出力のＰＩ／Ｏを示し、「ＦＵＮＣ１」命令は１つめのパラメータに入力、２つめのパラメータに出力を要求するものとする。ここで、入力パラメータ「Ｘ０００Ｌ」は、直接アドレスリードにより、デバイス「Ｘ」の「０００番目」のアドレスの値をロングワードサイズ（「Ｌ」）で取得することを示している。
【００６３】
その次の「Ｙ００１（Ｄ０１０Ｗ）Ｌ」という文字列は、間接アドレスライトにより、デバイス「Ｙ」の「００１番目」のアドレスに対し、「Ｄ０１０」のワードサイズ値を加算した（オフセットした）アドレスに対し書き込みすることを示している。
各パラメータが入力なのか出力なのかについては演算命令に依存する。上記のような設定が、ユーザによってアプリケーション画面から入力され、コンパイルが実行すると演算命令の文字列解析が行われる。その結果、スペースで区切っているテンプレートから、ＰＩ／Ｏ文字列１０６２は、「ＦＵＮＣ１」の演算命令（符号１００１）、第１パラメータ「Ｘ０００Ｌ」（符号１００２）、第２パラメータ「Ｙ００１（Ｄ０１０Ｗ）Ｌ」（符号１００３）とに分けることができる。「（  ）」で区切っているものは、間接アドレス方式であるので、第２パラメータは、「Ｙ００１Ｌ」（第１分解文字列１０５１）と「（Ｄ０１０Ｗ）」（第２分解文字列１０５２）とに分けることが可能である。「第１分解文字列」、「第２分解文字列」については後記して説明する。
【００６４】
さらに、第１パラメータ１００２や、第２パラメータの第１分解文字列１０５１や、第２分解文字列１０５２は、「Ｘ」や「Ｙ」等のデバイスの識別文字と、「０００」等のデバイスのアドレス値、「Ｌ（ロングワード）」や「Ｗ（ワード）」等のサイズ値に分けることができる（符号１０１１〜１０１２，１０２１〜１０２３，１０３１〜１０３３）。
【００６５】
このようにして分割した文字や数字を元に、解析部１１１は、図４（ａ）のデバイス−アドレス対応テーブル３３を用いてデバイスのアドレスを割り出す。図４（ａ）の例では、「Ｘ」のデバイスは「Ｃ１００００００ｈ」のアドレスから「Ｃ１ＦＦＦＦＦＦｈ」のアドレスまでが使用されている。また、「Ｙ」のデバイスは「Ｃ２００００００ｈ」のアドレスから「Ｃ２ＦＦＦＦＦＦｈ」のアドレスまでが使用されている。そして、「Ｄ」のデバイスは「４１００００００ｈ」のアドレスから「４１ＦＦＦＦＦＦｈ」までのアドレスが使用されている。このような、デバイス−アドレス対応テーブル３３を用いることで、Ｉ／Ｏのデバイス指定文字をアドレスに変換することができる。
また、演算命令の名称から、図４（ｂ）における演算命令管理テーブル３４を用いて演算命令「ＦＵＮＣ１」の命令番号「０００１ｈ」を取得することができる。
そして、解析部１１１は、デバイスのアドレス値といった入出力演算のパラメータに関する情報や、命令番号といった演算命令に関する情報を図１１に示す命令情報テーブル３４に格納する。
以下、このことを詳細に説明する。
【００６６】
（解析フェーズ処理）
図９及び図１０は、本実施形態に係る解析フェーズ処理の詳細な手順を示すフローチャートである。適宜、図１、図４、図８、図１１を参照する。
まず解析部１１１は、ラダー図に記載されているＰＩ／Ｏ文字列を分解する。
まず、解析部１１１はｉを「２」として初期化する（ｉ＝２；Ｓ１０１）。
次に、解析部１１１はＰＩ／Ｏ文字列をスペースの部分で分解する文字列分解を行う（Ｓ１０２）。ここで、分解された結果、生じるそれぞれの文字列群を分解文字列と称することとする。この段階で、図８の符号１００１，１００２，１００３のような分解文字列が生成される。
次に、解析部１１１は、最初の分解文字列（図８の例では分解文字列１００１）をキーとして、図４（ｂ）に示す演算命令管理テーブル３４を検索し、命令番号を取得する。そして、解析部１１１は、取得した命令番号を命令情報テーブル３５（図１１）の「命令番号」欄に格納する（Ｓ１０３）。
【００６７】
そして、解析部１１１は、ｉ番目の分解文字列が存在するか否かを判定する（Ｓ１０４）。
ステップＳ１０４の結果、ｉ番目の分解文字列が存在しない場合（Ｓ１０４→Ｎｏ）、解析部１１１は、「ｉ−１」の数をパラメータ数として命令情報テーブル３５の「パラメータ数」欄に格納した（Ｓ１６１）後、コンパイル部１１０は中間語生成フェーズ処理へ処理を進める。
【００６８】
ステップＳ１０４の結果、ｉ番目の分解文字列が存在する場合（Ｓ１０４→Ｙｅｓ）、解析部１１１はｉ番目の分解文字列を取得する（Ｓ１０５）。
そして、解析部１１１は、ステップＳ１０５で取得した分解文字列中に括弧があるか否かを判定する（Ｓ１０６）。
ステップ１０５の結果、図８の分解文字列１００２のように分解文字列郡中に括弧でくくられた部分がない場合（Ｓ１０６→Ｎｏ）、解析部１１１は、処理対象となっている分解文字列の最初が文字であるか数字であるかを判定する（最初が文字ｏｒ数字？；Ｓ１０７）。
ステップＳ１０８の結果、文字である場合（Ｓ１０７→文字）、解析部１１１は、方式情報として「直接アドレス方式」を命令情報テーブル３５の「方式」欄に格納する（Ｓ１０８）。ここで、解析部１１１は、ｉ＝２のとき、「直接アドレスリード」を格納し、ｉ＝３のとき、「直接アドレスライト」を書き込む。なお、本実施形態では、パラメータテンプレートテーブル３２の形式に従って、ｉ＝２のとき、「直接アドレスリード」を格納し、ｉ＝３のとき、「直接アドレスライト」としたが、パラメータテンプレートテーブル３２で格納されている形式が異なれば、当然「直接アドレスリード」、「直接アドレスライト」の判別も変わってくる。
【００６９】
そして、解析部１１１は図８の符号１０１１に示すような処理対象となっている分解文字列の最初の文字を取得する（Ｓ１０９）。
続いて、解析部１１１は、図８の符号１０１２のような分解文字列における最後の文字を取得し（Ｓ１１０）、そして、図８の符号１０１３のような残りの文字列（数字列）を取得する（Ｓ１１１）。
解析部１１１は、ステップＳ１１１で取得した最初の文字をキーとして、デバイス−アドレス対応テーブル３３（図４（ａ））を参照し、該文字に対応するアドレス値を取得する（Ｓ１１２）。このとき、取得するアドレス値は、デバイス−アドレス対応テーブル３３における先頭のアドレスである。例えば、ステップＳ１０９で取得した文字が「Ｘ」であれば、「Ｃ１００００００ｈ」が取得される。
【００７０】
続いて、解析部１１１は、ステップＳ１１２で取得したアドレス値に、ステップＳ１１１で取得した数字列を加算する（Ｓ１１３）。図８の符号１０１１，１０１３の例では、ステップＳ１１１で取得された数字列は「０００」（＝「００００００００ｈ」）なので、数字列を加算した結果は「Ｃ１００００００ｈ」＋「０００」＝「Ｃ１００００００ｈ」となる。
【００７１】
次に、解析部１１１はステップＳ１１３で算出した結果であるアドレス値を、命令情報テーブル３５の「パラメータｉ」における「アドレス・定数」欄に格納する（Ｓ１１４）。
さらに、解析部１１１はステップＳ１１０で取得した文字をサイズ値として、命令情報テーブル３５の「パラメータｉ」における「サイズ」欄に格納する（Ｓ１１５）。
そして、本パラメータは、直接アドレス方式（「直接アドレスリード」又は「直接アドレスライト」）であるので、解析部１１１は、「オフセットアドレス」欄には「０」を、「オフセットサイズ」欄には「−」を格納する。
続いて、解析部１１１は、ｉに「１」を加算し（ｉ＝ｉ＋１；Ｓ１１６）、ステップＳ１０４へ処理を戻す。
【００７２】
一方、ステップＳ１０８の結果、数字である場合（Ｓ１０８→数字）、解析部１１１は、、解析部１１１は、方式情報として「定数代入」を命令情報テーブル３５の「パラメータｉ」のける「方式」欄に格納する（Ｓ１２１）。
そして、解析部１１１は最後の文字を取得し（Ｓ１２２）、そして、残った文字列（数字列）を取得する（Ｓ１２３）。
続いて、解析部１１１は、ステップＳ１２３で取得した数字列を定数値として、命令情報テーブル３５の「パラメータｉ」における「アドレス・定数」欄に格納する（Ｓ１２４）。
次に、解析部１１１は、ステップＳ１２２で取得した文字をサイズ値として、命令情報テーブル３５の「パラメータｉ」における「サイズ」欄に格納する（Ｓ１２５）。
【００７３】
そして、本パラメータは、定数代入方式であるので、解析部１１１は、「オフセットアドレス」欄には「０」を、「オフセットサイズ」欄には「−」を格納する（Ｓ１２６）。
続いて、解析部１１１は、ｉに「１」を加算し（ｉ＝ｉ＋１；Ｓ１２７）、ステップＳ１０４へ処理を戻す。
【００７４】
また、ステップＳ１０６の結果、分解文字列郡中に括弧でくくられた部分がある場合（Ｓ１０６→Ｙｅｓ）、解析部１１１は、命令情報テーブル３５のパラメータｉにおける「方式」欄に「間接アドレスリード」又は「間接アドレスライト」を格納する（Ｓ１３１）。例えば、解析部１１１は、ｉ＝２のとき、「間接アドレスリード」を格納し、ｉ＝３のとき、間接アドレスライト」を格納する。
【００７５】
続いて、解析部１１１は「（」の前で分解文字列（文字列）をさらに分解する（Ｓ１３２）。この処理の結果、図８の分解文字列１０５１，１０５２が生成される。括弧の外にあった分解文字列（すなわち、図８の分解文字列１０５１）を第１分解文字列と称する。同様に、括弧内にあった分解文字列（すなわち、図８の分解文字列１０５２）を第２分解文字列と称することとする。
【００７６】
解析部１１１は、図８の符号１０２１のような第１分解文字列の最初の文字を取得する（Ｓ１３３）。
続いて、解析部１１１は、図８の符号１０２２のような第２分解文字列の最後の文字を取得し（Ｓ１３４）、そして、図８の符号１０２３のような残りの文字列（数字列）を取得する（Ｓ１３５）。
解析部１１１は、ステップＳ１１１で取得した最初の文字をキーとして、デバイス−アドレス対応テーブル３３（図４（ａ））を参照し、該文字に対応するアドレス値を取得する（Ｓ１３６）。このとき、取得するアドレス値は、デバイス−アドレス対応テーブル３３における先頭のアドレスである。例えば、ステップＳ１３３で取得した文字が図８の符号１０２１のように「Ｙ」であれば、「Ｃ２００００００ｈ」が取得される。
【００７７】
続いて、解析部１１１は、ステップＳ１３６で取得したアドレス値に、ステップＳ１３５で取得した数字列を加算する（Ｓ１３７）。図８の符号１０２１，１０２３の例では、ステップＳ１３６で取得された数字列は「００１」（＝「０００００００１ｈ」）なので、数字列を加算した結果は「Ｃ２００００００ｈ」＋「００１」＝「Ｃ２０００００１ｈ」となる。
次に、解析部１１１はステップＳ１３７で算出した結果であるアドレス値を、命令情報テーブル３５の「パラメータｉ」における「アドレス・定数」欄に格納する（Ｓ１３８）。
さらに、解析部１１１はステップＳ１３４で取得した文字をサイズ値として、命令情報テーブル３５の「パラメータｉ」における「サイズ」欄に格納する（Ｓ１３９）。
【００７８】
続いて、解析部１１１は、図８の符号１０３１のような第２分解文字列１０５２の最初の文字を取得する（Ｓ１５１）。
続いて、解析部１１１は、図８の符号１０３２のような第２分解文字列の最後の文字を取得し（Ｓ１５２）、そして、図８の符号１０３３のような残りの文字列（数字列）を取得する（Ｓ１５３）。
【００７９】
解析部１１１は、ステップＳ１１１で取得した最初の文字をキーとして、デバイス−アドレス対応テーブル３３（図４（ａ））を参照し、該文字に対応するアドレス値を取得する（Ｓ１５４）。このとき、取得するアドレス値は、デバイス−アドレス対応テーブル３３における先頭のアドレスである。例えば、ステップＳ１５１で取得した文字が図８の符号１０３１のように「Ｄ」であれば、「４１００００００ｈ」が取得される。
【００８０】
続いて、解析部１１１は、ステップＳ１５４で取得したアドレス値に、ステップＳ１５３で取得した数字列を加算する（Ｓ１５５）。図８の符号１０３１，１０３３の例では、ステップＳ１５３で取得された数字列は「０１０」（「００００００１０ｈ」）なので、数字列を加算した結果は、「４１００００００ｈ」＋「０１０」＝「４１００００１０ｈ」となる。
【００８１】
次に、解析部１１１はステップＳ１５５で算出した結果であるアドレス値をオフセットアドレス値として、命令情報テーブル３５の「パラメータｉ」における「オフセットアドレス」欄に格納する（Ｓ１５６）。
さらに、解析部１１１はステップＳ１５２で取得した文字をオフセットサイズ値として、命令情報テーブル３５の「パラメータｉ」における「オフセットサイズ」欄に格納する（Ｓ１５７）。
続いて、解析部１１１は、ｉに「１」を加算し（ｉ＝ｉ＋１；Ｓ１５８）、ステップＳ１０４へ処理を戻す。
このような解析フェーズ処理が行われることによって、図１１に示すような命令情報テーブル３５が生成される。
【００８２】
（命令情報テーブル）
図１１は、本実施形態に係る命令情報テーブルの例を示す図である。
命令情報テーブル３５は、「命令番号」、「パラメータ数」、「パラメータ１」、「パラメータ２」・・・の欄を有する。
「命令番号」欄には、図１０のステップＳ１０３で取得・格納された命令番号が格納されている。
「パラメータ数」欄には、該命令情報テーブル３５に格納されているパラメータの数が格納されている。「パラメータ数」欄に格納されている値は、図１０のステップＳ１６１で格納された値である。
【００８３】
そして、各「パラメータ」欄は、「方式」、「アドレス・定数」、「サイズ」、「オフセットアドレス」、「オフセットサイズ」の各欄を有している。
「方式」欄には、図１１に示すように「直接アドレスリード」や、「間接アドレスライト」等、対象となっている演算命令の方式に関する情報が格納されている。
【００８４】
「アドレス・定数」欄には、対象となっているパラメータのデバイスにおけるアドレス値や、パラメータとして設定された定数値が格納されている。
「サイズ」欄には、対象となっているパラメータのサイズが格納されている。
「オフセットアドレス」欄には、対象となっているパラメータがオフセットを使用している場合、オフセットアドレス値が格納されている。
「オフセットサイズ」欄には、対象となっているパラメータがオフセットを用いている場合、そのオフセットアドレス値のサイズが格納されている。
【００８５】
なお、図１１の例において「パラメータ１」欄に格納されている各値は、図１０、図１０におけるステップＳ１０８〜Ｓ１１５の処理で格納されたものである。
同様に、図１１の例において「パラメータ２」の「方式」、「アドレス・定数」、「サイズ」の各欄に格納されている値は、図１０、図１０におけるステップＳ１３１〜Ｓ１３９の処理で格納されたものである。
そして、図１１の例において「パラメータ２」の「オフセットアドレス」、「オフセットサイズ」の各欄に格納されている値は、図１０、図１０におけるステップＳ１５１〜Ｓ１５７の処理で格納されたものである。
【００８６】
（中間語生成フェーズ処理）
図６のパラメータテンプレートテーブル３２の各引数に図１１の命令情報テーブル３５の各情報を当てはめることで入出力命令に関する命令語（入力命令語、出力命令語）が生成される。また、命令情報テーブル３５の「分類」欄が「演算命令実行」となっているステップの情報を参照して、演算命令に関する命令語（つまり、演算命令語）が生成される。
以下、このことを詳細に説明する。
【００８７】
図１２を参照して、命令語からなる中間語を生成する中間語生成フェーズ処理を説明する。適宜、図１、図４、図５、図６、図１１を参照する。
図１２は、本実施形態に係る中間語生成フェーズ処理の詳細な手順を示すフローチャートである。
まず、中間語生成部１１２は、命令情報テーブル３５における命令番号を基に、テンプレートテーブル３１（図５（ａ））におけるテンプレートを特定する（Ｓ２０１）。
次に、中間語生成部１１２は、ｋ＝１とし（Ｓ２０２）、さらに、特定されたテンプレートにおいて、ｋ番目のステップがあるか否かを判定する（Ｓ２０３）。
ステップＳ２０３の結果、命令語が存在しない場合（Ｓ２０３→Ｎｏ）、中間語生成部１１２は中間語生成フェーズ処理を終了し、次のフェーズ処理へ遷移する。
【００８８】
ステップＳ２０３の結果、命令語が存在する場合（Ｓ２０３→Ｙｅｓ）、中間語生成部１１２は、ステップＳ２０１で特定されたテンプレートから第ｋステップを取得する（Ｓ２０４）。
そして、中間語生成部１１２は、テンプレートテーブル３１の第ｋステップにおける「分類」欄を参照して、命令種別を判別する（Ｓ２０５）。図５（ａ）に示すように、命令種別には「パラメータ１リード」、「演算命令実行」、「パラメータ２ライト」等がある。
中間語生成部１１２は、第ｋステップの命令種別が「演算命令実行」であるか否かを判定する（Ｓ２０６）。
【００８９】
ステップＳ２０６の結果、「演算命令実行」でない場合（Ｓ２０６→Ｎｏ）、つまり、命令種別が「パラメータ１リード」、「パラメータ２ライト」等であった場合、中間語生成部１１２は、命令情報テーブル３５の該当するパラメータにおける「方式」欄を参照する（Ｓ２０７）。例えば、命令種別が「パラメータ１リード」であれば、中間語生成部１１２は、命令情報テーブル３５の「パラメータ１」における「方式」欄を参照する。同様に、命令種別が「パラメータ２ライト」であれば、中間語生成部１１２は、命令情報テーブル３５の「パラメータ２」における「方式」欄を参照する。
【００９０】
次に、中間語生成部１１２は、ステップＳ２０７で参照した「方式」を基に、パラメータテンプレートテーブル３２（図６）を参照し、命令テンプレートを取得する（Ｓ２０８）。ここで、命令テンプレートとは、前記したようにパラメータテンプレートテーブル３２の行に相当するものである。
例えば、ステップＳ２０５で判別された命令種別が「パラメータ１リード」である場合、前記したように、中間語生成部１１２は、ステップＳ２０７で参照した、命令情報テーブル３５における「パラメータ１」欄を参照する。そして、命令情報テーブル３５における「パラメータ１」の「方式」欄に記述されている「直接アドレスリード」を取得する。そして、中間語生成部１１２は、パラメータテンプレートテーブル３２の「直接アドレスリード」を参照し、その命令テンプレート（行）を取得する。
【００９１】
また、ステップＳ２０５で判別された命令種別が「パラメータ２ライト」である場合、中間語生成部１１２は、命令情報テーブル３５における「パラメータ２」欄を参照する。そして、命令情報テーブル３５における「パラメータ２」の「方式」欄に記述されている「間接アドレスライト」を取得する。そして、中間語生成部１１２は、パラメータテンプレートテーブル３２の「間接アドレスライト」を参照し、その命令テンプレート（行）を取得する。
【００９２】
ステップＳ２０８の後、中間語生成部１１２は、ステップＳ２０８で取得した命令テンプレートにおける各引数を、命令情報テーブル３５や、テンプレートテーブル３１から取得する（Ｓ２０９）。
例えば、ステップＳ２０５で判別された命令種別が「パラメータ１リード」である場合、前記したように、ステップＳ２０８の段階で、パラメータテンプレートテーブル３２の「直接アドレスリード」の命令テンプレートが取得されている。図６に示す「直接アドレスリード」において、各引数は、「サイズ」、「汎用レジスタ」、「アドレス・定数」である。そこで、中間語生成部１１２は、命令情報テーブル３５の「パラメータ１」におけるサイズ「Ｌ」を取得する。また、中間語生成部１１２は、テンプレートテーブル３１の第１ステップ（現在処理対象となっているステップ）の「汎用レジスタ」欄から汎用レジスタ「ＥＡＸ」を取得する。そして、中間語生成部１１２は、命令情報テーブル３５の「パラメータ１」における「アドレス・定数」欄から「Ｃ１００００００ｈ」を取得する。
【００９３】
また、ステップＳ２０５で判別された命令種別が「パラメータ２ライト」である場合、前記したように、ステップＳ２０８の段階で、パラメータテンプレートテーブル３２の「間接アドレスライト」の命令テンプレートが取得されている。図６に示す「間接アドレスライト」の命令語は２列からなっている。まず、第１列目の各引数は「オフセットサイズ」、「汎用レジスタ１」、「オフセットアドレス」である。そして、第２列目の各引数は「サイズ」、「アドレス・定数＋汎用レジスタ１」、「汎用レジスタ２」である。
【００９４】
まず、第１列目について、中間語生成部１１２は、命令情報テーブル３５の「パラメータ１」における[オフセットサイズ」欄からオフセットサイズ「Ｗ」を取得する。また、中間語生成部１１２は、オフセットに用いられる汎用レジスタとして「ＥＢＸ」を設定する。本実施形態では、オフセットに用いられる汎用レジスタを「ＥＢＸ」に固定しているが、テンプレートテーブル３１にオフセットの汎用レジスタを格納する欄を設けるようにしてもよい。そして、中間語生成部１１２は、命令情報テーブル３５の「パラメータ１」における「オフセットアドレス」欄から「４１００００１０ｈ」を取得する。
【００９５】
続いて、第２列目について、中間語生成部１１２は、命令情報テーブル３５の「パラメータ２」におけるサイズ「Ｌ」を取得する。また、中間語生成部１１２は、テンプレートテーブル３１の第３ステップ（現在処理対象となっているステップ）の「アドレス・定数」の欄から「Ｃ２０００００１ｈ」を取得する。加えて、中間語生成部１１２は、オフセットに用いられる汎用レジスタとして「ＥＢＸ」を設定する。さらに、中間語生成部１１２は、テンプレートテーブル３１の「汎用レジスタ」欄から汎用レジスタ「ＥＡＸ」を取得する。
【００９６】
そして、中間語生成部１１２はステップＳ２０９で取得した各パラメータを、命令テンプレートの順に並べ、中間語に追加し（Ｓ２１０）、ｋに「１」を加算し（Ｓ２１１）、ステップＳ２０３に処理を戻す。
【００９７】
一方、ステップＳ２０６の結果、「演算命令実行」である場合（Ｓ２０６→Ｙｅｓ）、中間語生成部１１２は、テンプレートテーブル３１の第ｋステップにおける「生成条件」欄を参照し、その生成条件を満たしているか否かを判定する（Ｓ２２１）。
例えば、図５（ａ）における第２ステップの例の場合、生成条件は「パラメータ１がロングワード」である。そこで、中間語生成部１１２は、命令情報テーブル３５における「パラメータ１」の「サイズ」を参照する。すると、その「サイズ」は「Ｌ」、つまりロングワードであるので、前記した生成条件は満たされていることになる。
【００９８】
ステップＳ２２１の結果、生成条件を満たしていない場合（Ｓ２２１→Ｎｏ）、中間語生成部１１２はステップＳ２２４へ処理を進める。
ステップＳ２２１の結果、生成条件を満たしている場合（Ｓ２２１→Ｙｅｓ）、中間語生成部１１２はテンプレートテーブル３１の第ｋステップにおける情報を基に、演算命令語を生成する（Ｓ２２２）。
そして、その演算命令語を中間語に追加し（Ｓ２２３）、ｋに「１」を加算して（ｋ＝ｋ＋１；Ｓ２２４）、ステップＳ２０３へ処理を戻す。
【００９９】
ステップＳ２２２において、図５（ａ）の第２ステップを例にすると、「ＦＵＮＣ．ＯＬ  ＥＡＸ」という演算命令語が生成される。
【０１００】
図１２における中間語生成フェーズ処理によって生成された中間語の例を図１３に示す。
図１３において、符号１３０１の命令語は、図６の「直接アドレスリード」の命令テンプレートを基に図１２のステップＳ２０７〜Ｓ２１０の処理で生成された命令語である。
また、符号１３０２の命令語は、図５（ａ）の第２ステップを基に、図１２のステップＳ２２２、Ｓ２２３の処理で生成された命令語である。
そして、符号１３０３，１３０４の命令語は、図６の「間接アドレスライト」の命令テンプレートを基に図１２のステップＳ２０７〜Ｓ２１０の処理で生成された命令語である。
【０１０１】
なお、このようにして生成された中間語における各命令語間の整合性が問題にならないように、テンプレートの設計に注意が払わなければならない。具体的には、パラメータを読み取った結果を格納する汎用レジスタ、演算命令を実行した結果を格納する汎用レジスタ、そしてその結果をＰＩ／Ｏに出力するときに一時的にバッファとする汎用レジスタは、すべてのテンプレートであらかじめ固定しておくとよい。たとえば、２つのパラメータにおける汎用レジスタとして「ＥＡＸ」、「ＥＢＸ」を使用していた場合、次の演算命令実行のときに汎用レジスタを「ＥＣＸ」と「ＥＤＸ」を使用すると、演算命令が正しく実行されない。つまり、パラメータを取り込んだ汎用レジスタと、演算命令実行を行うときの入力となる汎用レジスタは同じになるようにしなければならない。従って、前記したように汎用レジスタはすべてのテンプレートで同じになるようにすることが望ましい。
【０１０２】
［逆コンパイル］
次に、図１４〜図２１を参照して、生成された命令語を逆に変換していき、ラダー図に戻す逆コンパイルについて説明する。逆コンパイルでは、中間語から命令語が１つずつ取り出され、その命令語から命令情報テーブル３５が生成される。そして、生成された命令情報テーブル３５を基に、ラダー図が復元される。
本実施形態では、中間語の構成が前記した（Ｄ１）入力、（Ｄ２）演算命令、（Ｄ３）出力の各部から構成されることに注目し、入力解析、演算解析、出力解析の順で逆コンパイルを進めていく。
つまり、ラダー言語の演算命令やコイル命令命令では、パラメータのリード（入力）は命令語列の前半に集中する。また、演算命令等の実行部分の命令は命令語列の中盤に集中する。さらに、パラメータのライト（出力）は命令語列の後半に集中する傾向がある。これらの性質を利用して、解析を入力解析、演算解析、出力解析といったフェーズ処理毎に行う。このようにすることで、効率的な逆コンパイルが可能となる。
【０１０３】
（状態遷移図）
図１４は、本実施形態に係る逆コンパイルの処理についての状態遷移図である。
まず、逆コンパイル部１２０が逆コンパイルを開始すると、逆コンパイル部１２０が、入力解析フェーズ処理へ遷移する（Ｓ３１）。
入力解析フェーズ処理では、入出力解析部１２１が取得された命令語において、入力パラメータ（「ＭＯＶ」命令）が存在するかをチェックする。存在する場合、入出力解析部１２１が、その入力パラメータに関する情報を命令情報テーブル３５に格納する。入出力解析部１２１は、「ＭＯＶ」命令が検出される検出される限り（「ＭＯＶ」あり：Ｓ３２）、入力解析フェーズ処理における処理を行い続ける。
なお、入力解析フェーズ処理の詳細な処理は後記して説明する。
【０１０４】
「ＭＯＶ」が検出されなくなると（「ＭＯＶ」なし：Ｓ３３）、逆コンパイル部１２０は演算命令解析フェーズ処理へ遷移する（Ｓ３４）。
【０１０５】
演算命令解析フェーズ処理は、その前の入力解析フェーズ処理とは独立して行われる処理である。なお、図５（ａ）に示すテンプレートテーブル３１の「分類」は、「パラメータ１リード」や、「演算命令実行」等を有しているが、ここで比較対象となるのは、「演算命令実行」である。「演算命令実行」以外の命令語は、パラメータテンプレートテーブル３２を使用して、他のフェーズ処理（入力解析フェーズ処理、出力解析フェーズ処理）において解析されるので、演算命令解析フェーズ処理では解析の対象ではない。テンプレートテーブル３１中のあるテンプレートにおいて、比較対照となるテンプレートがある場合（テンプレートあり：Ｓ３５）、演算命令解析部１２２は、そのテンプレートテーブル３１におけるテンプレートと、中間語における次の命令語とを比較し続ける。演算命令解析部１２２は、中間語における演算命令の生起パターンと、テンプレートにおける「演算命令実行」の生起パターンとが一致するまで、あるいはすべてのテンプレートが比較されるまで演算命令解析フェーズ処理を行い続ける。
【０１０６】
テンプレートにおいて「演算命令実行」とあるステップと、命令語との生起パターンが完全に一致した場合、もしくは、「演算命令実行」とあるステップと、命令語とで型が一致するテンプレートがみつからない場合（一致又はテンプレートなし：Ｓ３６）、演算命令解析部１２２は、命令情報テーブル３５に該テンプレートの命令番号を格納して、次の出力解析フェーズ処理（Ｓ３７）へ遷移する。
なお、演算命令解析フェーズ処理の詳細な処理は後記して説明する。
【０１０７】
出力解析フェーズ処理では、入出力解析部１２１が出力パラメータ（「ＭＯＶ」命令）が存在するかをチェックし、存在する場合は、その出力パラメータに関する情報を命令情報テーブル３５に格納する。入出力解析部１２１は、「ＭＯＶ」命令が検出される検出される限り（「ＭＯＶ」あり：Ｓ３８）、出力解析フェーズ処理における処理を行い続ける。
なお、出力解析フェーズ処理の詳細な処理は後記して説明する。
入力解析フェーズ処理、演算命令解析フェーズ処理、出力解析フェーズ処理で、命令情報テーブル３５が生成される。
【０１０８】
「ＭＯＶ」が検出されなくなると（「ＭＯＶ」なし：Ｓ３９）、逆コンパイル部１２０は変換フェーズ処理へ遷移する（Ｓ４０）。
【０１０９】
変換フェーズ処理では、変換部１２３が、入力解析フェーズ処理、演算命令解析フェーズ処理、出力解析フェーズ処理で生成された命令情報テーブル３５を基に、ラダー言語におけるデバイス素子を生成する。なお、変換フェーズ処理の詳細な処理は後記して説明する。
【０１１０】
次に、逆コンパイル部１２０は、未処理の命令語において、次の命令語が終了コードであるか否かを判定し、終了コードである場合（Ｓ４２）、逆コンパイルを終了する。
終了コードでない場合（終了コードなし：Ｓ４１）、逆コンパイル部１２０は入力解析フェーズ処理へ遷移する（Ｓ３１）。
【０１１１】
ここで、逆コンパイルの概要を説明する。
図１５のような中間語が逆コンパイルの対象となっているものとする。この中間語は、命令語１８０１〜１８０４の４ステップからなるものとする。
まず、入出力解析部１２１が、入力命令の解析を行い、入力命令に関する情報を図１１の命令情報テーブル３５に格納する。
命令語１８０１は「ＭＯＶ．Ｌ  ＥＡＸ  ［Ｃ１００００００ｈ］」という記述になっている。入出力解析部１２１は、「ＭＯＶ」が存在しているため、入力命令か、出力命令のどちらかであると判別する。そして、命令語１８０１が、中間語の最初に位置していることから、入出力解析部１２１は、当該命令語１８０１が入力命令であると判定する。
入出力解析部１２１は、入力解析フェーズ処理Ｓ３１において、各引数を抽出する。そして、入力解析部１２１は、抽出した引数を入力命令情報３５に格納していく。
【０１１２】
次の、命令語１８０２は、「ＭＯＶ」命令が存在しないため、演算命令解析フェーズ処理Ｓ３４に処理が移る。ここでは、演算命令解析部１２２が、テンプレートテーブル３１における各テンプレートと、中間語における演算命令の生起パターンとを比較する。一致するテンプレートがあった場合、演算命令解析部１２２は、そのテンプレートに付されている命令番号を命令情報テーブル３５に格納する。
【０１１３】
演算命令解析フェーズ処理Ｓ３４において、中間語における演算命令と一致する生起パターンを有するテンプレートがみつかるか、テンプレートテーブル３１中には一致するテンプレートがない場合、出力解析フェーズ処理Ｓ３７に処理が移る。
【０１１４】
出力解析フェーズ処理Ｓ３７では、入力解析フェーズ処理Ｓ３１と同様の処理が行われることで、命令語１８０３，１８０４の情報が命令情報テーブル３５に格納される。なお、命令語１８０４の形式等から、入出力解析部１２１は、命令語１８０３，１８０４では、オフセットが用いられていると判定する。オフセットの判定方法は後記する。
【０１１５】
その後、「ＭＯＶ」命令が検出されなくなると、変換フェーズ処理Ｓ４０に処理が移る。
変換フェーズ処理では、入力解析フェーズ処理Ｓ３１、演算命令解析フェーズ処理Ｓ３４、出力解析フェーズ処理Ｓ３７で生成された命令情報テーブル３５を基に、デバイス素子が復元される。
以下、このことを詳細に説明する。
【０１１６】
（入出力解析フェーズ処理）
図１６及び図１７は、本実施形態に係る入出力解析フェーズ処理の詳細な処理手順を示すフローチャートである。ここで、入出力解析フェーズ処理とは、図１４の入力解析フェーズ処理及び出力解析フェーズ処理のことである。
まず、入出力解析部１２１はｉ＝０とする（Ｓ３０１）。ここで「ｉ」はパラメータ番号のための変数である。
続いて、入出力解析部１２１は、中間語におけるｈ番目の命令語列のオペコードに「ＭＯＶ」命令が含まれているか否かを判定する（ＭＯＶ？；ステップＳ３０２）。ここで、ｈは中間語における命令語の列番号であ。一番最初の入力解析フェーズ処理において、命令語列が読み込まれたときにｈに「１」が設定され、以降、入力解析フェーズ、演算命令解析フェーズ処理、出力解析フェーズで命令語が読み込まれる毎にｈに「１」が加算されていく。
【０１１７】
ステップＳ３０２の結果、「ＭＯＶ」命令を含んでいる場合（Ｓ３０２→Ｙｅｓ）、入出力解析部１２１は、処理対象となっている命令語から「Ｌ」や、「Ｗ」等の「サイズ」を取得する（Ｓ３０３）。このとき、入出力解析部１２１は「ＭＯＶ」の次の文字が「サイズ」であるとして、該当する「サイズ」を取得する。
続いて、入出力解析部１２１は、処理対象となっている命令語から「アドレス・定数」部分を取得する（Ｓ３０４）。入出力解析部１２１は、命令語における各パラメータの書式を基に、アドレスもしくは定数を取得する。
【０１１８】
次に、入出力解析部１２１は、取得した「アドレス・定数」のタイプを判別する（Ｓ３０５）。ここでタイプとは、命令語のなかに埋め込まれている「定数」、「アドレス」又は「オフセット付アドレス」である。
【０１１９】
例えば、命令語が「ＭＯＶ．Ｌ  ＥＡＸ  ［Ｃ１００００００ｈ］」のように「［  ］」がある場合、入出力解析部１２１は、「アドレス・定数」のタイプを「アドレス」と判別する。
また、命令語が「ＭＯＶ．Ｌ  ＥＡＸ  Ｃ１００００００ｈ」のように［  ］なしの場合、入出力解析部１２１は、「アドレス・定数」のタイプを「定数」と判別する。
そして、命令語が「ＭＯＶ．Ｌ  ＥＡＸ  ［Ｃ１００００００ｈ  ＋  ＥＢＸ］」のように「［  ］」があり、かつ、「［  ］」の中に「＋」がある場合、入出力解析部１２１は、「アドレス・定数」のタイプを「オフセット付アドレス」と判別する。
【０１２０】
ステップＳ３０５の結果、「アドレス・定数」のタイプが「定数」である場合（Ｓ３０５→定数）、入出力解析部１２１は、バッファにバッファ情報が格納されているか否かを判定する（バッファ情報あり？；Ｓ３０６）。このとき、バッファに格納されている情報は、前の処理ループにおけるステップＳ３２５で取得したアドレス値、サイズ値である。
【０１２１】
ステップＳ３０６の結果、バッファ情報が格納されていない場合（Ｓ３０６→Ｎｏ）、入出力解析部１２１はステップＳ３０９へ処理を進める。
【０１２２】
ステップＳ３０６の結果、バッファ情報が格納されている場合（Ｓ３０６→Ｙｅｓ）、入出力解析部１２１はバッファ情報（アドレス値、サイズ値）を命令情報テーブル３５（図１１）の「パラメータｉ」の該当する欄に格納する（Ｓ３０７）。つまり、１つ前の処理ループで取得したアドレス値、サイズ値を命令情報テーブル３５の「パラメータｉ」における「アドレス・定数」欄及び「サイズ」欄に格納する。このように、バッファ情報にアドレス値、サイズ値を格納しておき、現在の処理ループの１つ前の処理ループにおけるアドレス値、サイズ値を格納するのは、オフセットが用いられる場合のように２行にわたって命令語が記述される場合を考慮しているためである。つまり、あるアドレスが命令語中に存在した場合、そのアドレスが、オフセット付アドレスであるのか否かがわからないためである。
【０１２３】
次に、入出力解析部１２１は命令情報テーブル３５におけるパラメータｉの「方式」欄に「直接アドレスリード」もしくは「直接アドレスライト」といった方式情報を格納する（Ｓ３０８）。例えば、現在のフェーズ処理が入力解析フェーズ処理であれば、入出力解析部１２１は「直接アドレスリード」を格納する。また、現在のフェーズ処理が出力解析フェーズ処理であれば、入出力解析部１２１は「直接アドレスライト」を格納する。
【０１２４】
続いて、入出力解析部１２１は、ｉに「１」を加算する（ｉ＝ｉ＋１；Ｓ３０９）。
そして、入出力解析部１２１は、ステップＳ３０３、Ｓ３０４で取得した定数値、サイズ値を命令情報テーブル３５におけるパラメータｉの「アドレス・定数」欄及び「サイズ」欄に格納する（Ｓ３１０）。
【０１２５】
そして、入出力解析部１２１は、パラメータｉの方式情報（ここでは、「定数代入」）を、命令情報テーブル３５のパラメータｉにおける「方式」欄に格納し（Ｓ３１１）、ステップＳ３０２へ処理を戻す。
次に、入出力解析部１２１はｈに「１」を加算し（ｈ＝ｈ＋１；Ｓ３１２）、バッファ情報を消去して、ステップＳ３０２へ処理を戻す。
【０１２６】
ステップＳ３０５の結果、「アドレス・定数」のタイプが「アドレス」である場合（Ｓ３０５→アドレス）、入出力解析部１２１は、バッファにバッファ情報が格納されているか否かを判定する（バッファ情報あり？；Ｓ３２１）。このとき、バッファに格納されている情報は、前の処理ループのステップＳ３２５で格納されたアドレス値、サイズ値である。
【０１２７】
ステップＳ３２１の結果、バッファ情報が格納されていない場合（Ｓ３２１→Ｎｏ）、入出力解析部１２１はステップＳ３２４へ処理を進める。
【０１２８】
ステップＳ３２１の結果、バッファ情報が格納されている場合（Ｓ３２１→Ｙｅｓ）、入出力解析部１２１はバッファ情報（アドレス値、サイズ値）を命令情報テーブル３５のパラメータｉにおける「アドレス・定数」欄及び「サイズ」欄に格納する（Ｓ３２２）。
続いて、入出力解析部１２１は命令情報テーブル３５におけるパラメータｉの「方式」欄に「直接アドレスリード」もしくは「直接アドレスライト」といった方式情報を格納する（Ｓ３２３）。例えば、現在のフェーズ処理が入力解析フェーズ処理であれば、入出力解析部１２１は「直接アドレスリード」を格納する。また、現在のフェーズ処理が出力解析フェーズ処理であれば、入出力解析部１２１は「直接アドレスライト」を格納する。
【０１２９】
続いて、入出力解析部１２１は、ｉに「１」を加算する（ｉ＝ｉ＋１；Ｓ３２４）。
そして、入出力解析部１２１は、ステップＳ３０３、Ｓ３０４で取得したアドレス値、サイズ値をバッファ情報としてバッファに格納する（Ｓ３２５）。
【０１３０】
さらに、入出力解析部１２１は、ｈに「１」を加算し（ｈ＝ｈ＋１；Ｓ３２６）、ステップＳ３０２へ処理を戻す。
【０１３１】
ステップＳ３０５の結果、「アドレス・定数」のタイプが「オフセット付アドレス」である場合（Ｓ３０５→オフセット付アドレス）、入出力解析部１２１は、バッファ情報（アドレス値、サイズ値）を、命令情報テーブル３５のパラメータｉにおける「アドレス・定数」欄及び「サイズ」欄に格納する（Ｓ３３１）。
次に、入出力解析部１２１は、ステップＳ３０３，Ｓ３０４で取得したアドレス値、サイズ値を、それぞれオフセットアドレス値、オフセットサイズ値として命令情報テーブル３５の「オフセットアドレス」欄、「オフセットサイズ」欄に格納する（Ｓ３３２）。
【０１３２】
そして、入出力解析部１２１は命令情報テーブル３５におけるパラメータｉの「方式」欄に「間接アドレスリード」もしくは「間接アドレスライト」といった方式情報を格納する（Ｓ３３３）。このとき、現在のフェーズ処理が入力解析フェーズ処理であれば、入出力解析部１２１は「間接アドレスリード」を格納する。また、現在のフェーズ処理が出力解析フェーズ処理であれば、入出力解析部１２１は「間接アドレスライト」を格納する。
続いて、入出力解析部１２１は、ｈに「１」を加算し（ｈ＝ｈ＋１；Ｓ３３４）、ステップＳ３０２へ処理を戻す。
【０１３３】
（演算命令解析フェーズ処理）
図１８は、本実施形態に係る演算命令解析フェーズ処理の詳細な処理手順を示すフローチャートである。適宜、図１、図５、図１１を参照する。
まず、演算命令解析部１２２は、テンプレートテーブル３１のテンプレート番号ｉを「０」に初期化し（ｉ＝０；Ｓ４０１）、ｋを「ｎ」に初期化する（ｋ＝ｎ；Ｓ４０２）。ここで、ｎは、中間語における命令語列において、「ＭＯＶ」以外のオペコードが初めてでてくるステップ番号である（図１５の例では「２」）。
次に、演算命令解析部１２２が、テンプレートテーブル３１におけるｉ番目のテンプレートを検索し、ｉ番目のテンプレートが存在するか否かを判定する（Ｓ４０３）。
ステップＳ４０３の結果、ｉ番目のテンプレートが存在しない場合（Ｓ４０３→Ｎｏ）、逆コンパイル部１２０は出力解析フェーズ処理へ処理を進める。なお、このとき、該当する演算命令に対してエラーフラグを付してもよい。例えば、命令情報テーブル３５に「エラー」欄を設け、ステップＳ４０３で「Ｎｏ」が判定されると、演算命令解析部１２２「エラー」欄にフラグをたててもよい。
【０１３４】
ステップＳ４０３の結果、ｉ番目のテンプレートが存在する場合（Ｓ４０３→Ｙｅｓ）、演算命令解析部１２２は、ｊを「ｍ」に初期化する（ｊ＝ｍ；Ｓ４０４）。ここで、ｍは、図５（ａ）のテンプレートテーブル３１において、「ＭＯＶ」以外のオペコードが初めてでてくるステップ番号である（図３の例では「２」）。
続いて、演算命令解析部１２２は、ｉ番目のテンプレートにおけるｊ番目のステップを取得する（Ｓ４０５）。
そして、演算命令解析部１２２は、テンプレートテーブル３１（図５（ａ）を参照して、ステップＳ４０５で取得したｊ番目のステップの分類が「演算命令実行」であるか否かを判定する（Ｓ４０６）。
【０１３５】
ステップＳ４０６の結果、ｊ番目のステップの分類が「演算命令実行」である場合（Ｓ４０６→Ｙｅｓ）、中間語における命令語列におけるｋ番目のステップと、ｉ番目のテンプレートにおけるｊ番目のステップにおいて、同じオペコードが使用されているか否かを比較する（Ｓ４０７）。ここで、テンプレートのｊ番目のステップにおけるオペコードは、図５（ａ）のテンプレートテーブル３１における「オペコード」欄に記述されているオペコードである。なお、この段階において、図１６、図１７で使用されている現在処理されている命令語の列番号ｈに「１」が加算される。
そして、演算命令解析部１２２は、ステップＳ４０７における比較結果を判定する（Ｓ４０８）。ここでの比較結果は、「一致」、「スキップ」、「不一致」の３つがある。
【０１３６】
ステップＳ４０８の結果、「一致」である場合（Ｓ４０８→一致）、演算命令解析部１２２はｋに「１」を加え（ｋ＝ｋ＋１；Ｓ４０９）、ｊに「１」を加え（ｊ＝ｊ＋１；Ｓ４１０）、ステップＳ４０５へ処理を戻す。つまり、演算命令解析部１２２は、中間語における次の命令語と、テンプレートテーブル３１における次のステップについて処理を行う。
【０１３７】
ステップＳ４０８の結果、「スキップ」である場合（Ｓ４０８→スキップ）、演算命令解析部１２２はｊに「１」を加え（ｊ＝ｊ＋１；Ｓ４１２）、ステップＳ４０５へ処理を戻す。つまり、演算命令解析部１２２は、同じテンプレートにおける次のステップについて処理を行うようにする。
【０１３８】
ここで、ステップＳ４０８において、「スキップ」が判定される場合について説明する。ここで、「スキップ」と判定されるのは、テンプレートテーブル３１において、処理対象となっているステップの生成条件が「常に」ではない場合である。
例えば、図５（ａ）にしめされるテンプレートの第２ステップの生成条件は「パラメータ１がロングワード」となっている。これは、「パラメータ１」がロングワード（「Ｌ」）でない場合（ワードや、バイトサイズである場合等）では、該当する演算命令を命令語として生成しないことを意味する。つまり、生成条件が満たされていない場合は、該当する演算命令は実行されないこととなり、かつ、この演算命令に該当する命令語が存在しない（スキップされている）ことはエラーではないことを意味する。
なお、生成条件が「常に」である場合、該当する演算命令は、コンパイル時において常に命令語として生成されることになる。
このように、ステップＳ４０８で「スキップ」と判定することは、該当する命令語がスキップされていることでエラーと認識されることを回避するための処理である。
【０１３９】
ステップＳ４０８の結果、「不一致」である場合（Ｓ４０８→不一致）、ｉに「１」を加算し（ｉ＝ｉ＋１；Ｓ４１３）、ステップＳ４０２へ処理を戻す。つまり、演算命令解析部１２２は、次のテンプレートについて最初から解析を行う。このとき、図１６、図１７で使用されている現在処理されている命令語の列番号ｈは、入力解析フェーズ処理が終了した時点での値に戻される。
【０１４０】
ステップＳ４０６の結果、ｊ番目のステップの分類が「演算命令実行」でない場合（Ｓ４０６→Ｎｏ）、演算命令解析部１２２は、ｋ番目の命令語が演算命令であるか否かを判定する（Ｓ４２１）。
ステップＳ４２１の結果、ｋ番目の命令語が演算命令である場合（Ｓ４２１→Ｙｅｓ）、テンプレートでは演算命令ではないのに、命令語では演算命令となっていることから、演算命令解析部１２２は、処理対象のテンプレートは処理対象となっている中間語に一致しないものと判定する。なお、演算命令であるか否かは、例えば、命令が「ＭＯＶ」以外であるか否か等によって判定される。
従って、演算命令解析部１２２はｉに「１」を加算し（ｉ＝ｉ＋１；Ｓ４２２）、ステップＳ４０２へ処理を戻す。つまり、ステップＳ４０８で「不一致」と判定された場合と同じ処理を行う。このとき、図１６、図１７で使用されている現在処理されている命令語の列番号ｈは、入力解析フェーズ処理が終了した時点での値に戻される。
【０１４１】
ステップＳ４２１の結果、ｋ番目の命令語が演算命令（「ＦＵＮＣ」）でない場合（Ｓ４２１→Ｎｏ）、これまでテンプレートのステップと、命令語が演算命令で一致してきており、ここで、テンプレートで演算命令ではなく、命令語も演算命令でなくなったことを意味する。このため、演算命令解析部１２２は、処理対象のテンプレートは処理対象となっている中間語に該当しないものと判定する。
そして、演算命令解析部１２２は、処理対象となっているテンプレートの命令番号を命令情報テーブル３５に格納し（Ｓ４２３）、演算命令解析部１２２は演算命令解析フェーズ処理を終了する。そして、逆コンパイル部１２０は出力解析フェーズ処理へ処理を進める。このとき、図１６、図１７で使用されている現在処理されている命令語の列番号ｈに「１」が加算される。
【０１４２】
図１６〜図１８の処理によって、図１５に示すような中間語から、図１１に示すような命令情報テーブル３５が生成される。
【０１４３】
（変換フェーズ処理）
図１９及び図２０は、本実施形態に係る変換フェーズ処理の詳細な処理手順を示すフローチャートである。図１９では、図１６〜図１８の処理で生成された図１１のような命令情報テーブル３５を基に、ラダー図におけるＰＩ／Ｏ文字列や、シンボルを生成する。以下、図、図４、図１１、図２１を適宜参照する。
まず、変換部１２３は、ｉ＝１とする（Ｓ５０１）。
続いて、変換部１２３は、命令情報テーブル３５（図１１）を参照し、命令番号を取得する（図１９のＳ５０２）。ここでは、「０００１ｈ」が取得される。
続いて、変換部１２３は、演算命令管理テーブル３４（図４（ｂ））を参照し、取得した命令番号に対応する命令語の文字列を取得する（Ｓ５０３）。ここでは「ＦＵＮＣ１」が取得される。
そして、変換部１２３は取得した文字列を文字列バッファの文字列に追加する（Ｓ５０４）。ここでは、文字列バッファとは、逆コンパイルで復元されるＰＩ／Ｏ文字列のための領域である。ステップＳ５０４の処理によって、図２１の符号２１０１の文字列が文字列バッファに追加される。
【０１４４】
次に、変換部１２３は、文字列バッファにスペースを挿入する（Ｓ５０５）。このスペースは、ＰＩ／Ｏ文字列における各パラメータを分けるためのスペースである（図２１の符号２１０２，２１０５）。
そして、変換部１２３は、処理対象となっている命令情報テーブル３５（図１１）におけるすべてのパラメータを文字列化済みであるか否かを判定する（Ｓ５０６）。
【０１４５】
ステップＳ５０６の結果、すべてのパラメータが文字列化済みでない場合（Ｓ５０６→Ｙｅｓ）、変換部１２３は、命令情報テーブル３５の「パラメータｉ」における「方式」欄を参照し、「定数代入」か「アドレス方式」であるかを判定する（Ｓ５０７）。ここで、アドレス方式とは、「直接アドレスリード方式」、「間接アドレスリード方式」、「直接アドレスライト方式」、「間接アドレスライト方式」のいずれかである。
ステップＳ５０７の結果、方式が「定数代入」である場合（Ｓ５０７→定数代入方式）、変換部１２３は、命令情報テーブル３５において、処理対象となっているパラメータの「アドレス・定数」欄に格納されている定数値を取得する（Ｓ５０８）。
【０１４６】
そして、変換部１２３は取得した定数値の数字列を文字列バッファに追加する（Ｓ５０９）。つまり、命令情報テーブル３５の「アドレス・定数」欄に入っている数字列が、そのままパラメータ値になるので、変換部１２３は数字列をそのまま文字列に変換する。取得した数字列は通常１６進法で表されているので、これを変換部１２３が１０進法に変換してもよい。例えば、１２４Ａ（１６進）であれば、「４６８２」（１０進）に変換部１２３が変換してもよい。定数の場合には定数値を表示するだけでよいので、変換部１２３は、この定数を文字列化したものを文字列バッファに追加する。
ステップＳ５０９の後、変換部１２３はｉに「１」を加算し（ｉ＝ｉ＋１；Ｓ５５１）、ステップＳ５０５へ処理を戻す。
【０１４７】
一方、ステップＳ５０７の結果、方式がアドレス方式である場合（Ｓ５０７→アドレス方式）、変換部１２３は命令情報テーブル３５の「パラメータｉ」における「アドレス・定数」欄に格納されているアドレス値を取得する（Ｓ５２１）。
そして、変換部１２３は、デバイス−アドレス対応テーブル３３（図４（ａ））を参照して、ステップＳ５２１で取得したアドレス値に該当するデバイス指定文字を取得する（Ｓ５２２）。
【０１４８】
例えば、図１１における「パラメータ１」が処理対象である場合、「アドレス・定数」欄に「Ｃ１００００００ｈ」が格納されているので、変換部１２３は、デバイス−アドレス対応テーブル３３（図４（ａ））における範囲に該当するデバイス指定文字「Ｘ」を取得する。また、「パラメータ２」が処理対象である場合、「アドレス・定数」欄に「Ｃ２０００００１ｈ」が格納されているので、変換部１２３は、デバイス−アドレス対応テーブル３３の範囲における該当するデバイス指定文字「Ｙ」を取得する。
【０１４９】
次に、変換部１２３は、ステップＳ５２２で取得したデバイスの先頭アドレス値を取得する（Ｓ５２３）。デバイスの先頭アドレスは、デバイス−アドレス対応テーブル３３において、該当するデバイスが割り当てられている範囲の先頭である。図４（ａ）の例におけるデバイス「Ｘ」の先頭アドレスは「Ｃ１００００００ｈ」であり、デバイス「Ｙ」の先頭アドレスを「Ｃ２００００００ｈ」である。。
そして、変換部１２３は、ステップＳ５２１で取得したアドレス値から、ステップＳ５２３で取得したデバイスの先頭アドレスを減算して、アドレス指定数字を生成する（Ｓ５２４）。
そして、変換部１２３は、ステップＳ５２２で取得したデバイス指定文字と、ステップＳ５２４で算出したアドレス指定数字を連結したアドレス文字列を文字列バッファに追加する（Ｓ５２５）。
【０１５０】
ここで、処理対象が「パラメータ１」である場合、ステップＳ５２１で取得したアドレス値が「Ｃ１００００００ｈ」であり、ステップＳ５２３で取得したデバイスの先頭アドレスが「Ｃ１００００００ｈ」である。従って、「Ｃ１００００００ｈ」−「Ｃ１００００００ｈ」＝「００００００００ｈ」＝「０００」がステップＳ５２４で算出されるデバイス指定文字となる。従って、ステップＳ５２６で文字列バッファに追加される文字列は「Ｘ０００」となる（図２１の符号２１０３）。
【０１５１】
また、処理対象が「パラメータ２」である場合、ステップＳ５２１で取得したアドレス値が「Ｃ２０００００１ｈ」であり、ステップＳ５２３で取得したデバイスの先頭アドレスが「Ｃ２００００００ｈ」である。従って、「Ｃ２０００００１ｈ」−「Ｃ２００００００ｈ」＝「０００００００１ｈ」＝「００１」がステップＳ５２４で算出されるデバイス指定文字となる。従って、ステップＳ５２６で文字列バッファに追加される文字列は「Ｙ００１」となる（図２１の符号２１０６）。
【０１５２】
次に、変換部１２３は、命令情報テーブル３５において、処理対象となっているパラメータの「サイズ」欄からサイズ文字列を取得し、文字列バッファに取得したサイズ文字列を追加する（Ｓ５２６）。ここでは、ロングワードサイズを示す「Ｌ」が追加される（図２１の符号２１０４，２１０７）。
【０１５３】
続いて、変換部１２３は、命令情報テーブル３５の「パラメータｉ」における「方式」欄を参照し、「直接アドレス方式」か「間接アドレス方式」かを判定する（直接ｏｒ間接？：図２０のＳ５２７）。ここで、前記したように、「直接アドレス方式」とは「直接アドレスリード」及び「直接アドレスライト」のいずれかであり、「間接アドレス方式」とは「間接アドレスリード」及び「間接アドレスライト」のいずれかである。
ステップＳ５２７の結果、「直接アドレス方式」であった場合（Ｓ５２７→直接）、変換部１２３はステップＳ５５１へ処理を進める。
【０１５４】
ステップＳ５２７の結果、「間接アドレス方式」であった場合（Ｓ５２７→間接）、変換部１２３は、文字列「（」を文字列バッファに追加する（Ｓ５３１：図２１の符号２１０８）。これは、本実施形態において、「間接アドレスリード」もしくは「間接アドレスライト」において、図８の分解文字列１００３（「Ｙ００１Ｌ（Ｄ０１０Ｗ）」）のようにオフセット部分が括弧でくくられるためである。
【０１５５】
続いて、変換部１２３は、命令情報テーブル３５における「オフセットアドレス」欄からオフセットアドレス値を取得する（Ｓ５３２）。図１１における「パラメータ２」の例では「４１００００１０ｈ」がステップＳ５３２で取得されるオフセットアドレス値である。
次に、変換部１２３は、デバイス−アドレス対応テーブル３３（図４（ａ））を参照して、ステップＳ５３２で取得したオフセットアドレス値に該当するデバイス指定文字を取得する（Ｓ５３３）。
【０１５６】
例えば、図１１における「パラメータ２」が処理対象である場合、変換部１２３は、図４（ａ）のデバイス−アドレス対応テーブル３３を参照し、取得したオフセットアドレス値「４１００００１０ｈ」に該当する範囲のデバイス指定文字「Ｄ」を取得する。
次に、変換部１２３は、ステップＳ５３３で取得したデバイスの先頭アドレス値を取得する（Ｓ５３４）。デバイスの先頭アドレス値は、デバイス−アドレス対応テーブル３３において、該当するデバイスが割り当てられている範囲の先頭である（図４（ａ）の例におけるデバイス「Ｄ」の先頭アドレスは「４１００００００ｈ」）。
そして、変換部１２３は、ステップＳ５３２で取得したオフセットアドレス値から、ステップＳ５３４で取得したデバイスの先頭アドレス値を減算して、アドレス指定数字を生成する（Ｓ５３５）。
そして、変換部１２３は、ステップＳ５３３で取得したデバイス指定文字と、ステップＳ５３５で算出したアドレス指定数字を連結したオフセットアドレス文字列を文字列バッファに追加する（Ｓ５３６）。
【０１５７】
ここでは、ステップＳ５３２で取得したオフセットアドレス値が「４１００００１０ｈ」であり、ステップＳ５３４で取得したデバイスの先頭アドレスが「４１００００００ｈ」であるので、「４１００００１０ｈ」−「４１００００００ｈ」＝「００００００１０ｈ」＝「０１０」がステップＳ５３５で算出されるアドレス指定数字となる。従って、ステップＳ５３６で文字列バッファに追加されるオフセットアドレス文字列は「Ｄ０１０」となる（図２１の符号２１０９）。
【０１５８】
次に、変換部１２３は、命令情報テーブル３５において、処理対象となっているパラメータの「オフセットサイズ」欄からオフセットサイズ文字列を取得し、文字列バッファに取得したオフセットサイズ文字列を追加する（Ｓ５３７）。ここでは、ワードサイズを示す「Ｗ」が追加される（図２１の符号２１１０）。
続いて、変換部１２３は、文字列バッファに「）」を追加し（Ｓ５３８：図２１の符号２１１１）、ステップＳ５５１へ処理を進める。
【０１５９】
一方、ステップＳ５０５の結果、すべてのパラメータが文字列化済みである場合（Ｓ５０６→Ｙｅｓ）、変換部１２３は、演算命令を示すシンボル（図２１の符号２１１１）を文字列バッファに追加し（Ｓ５４１）、逆コンパイル部１２０は終了コードの有無を判定する（図１４のステップＳ４１、Ｓ４２）次のフェーズ処理（出力部解析フェーズ処理も）へ遷移する。
【０１６０】
以降、変換部１２３が復元したデバイス素子を復元順に連結することで、ラダー図が復元される。
【０１６１】
なお、「間接アドレス方式」であるか、「直接アドレス方式」であるかで、解析時に混同されることが考えられる。その場合には、オフセットのアドレスを格納する汎用レジスタを予約したレジスタ（たとえばＥＤＸでのみオフセットを使用する、等）に固定し、その予約したレジスタが出現したら間接アドレス方式である、等のように区別する方法が考えられる。また、中間語において、現在処理中の命令語に加えて、次の命令語も同時に取得し、次の命令語が、オフセットを使用する命令語になっていれば、変換部１２３が「間接アドレス方式」であると判定するようにしてもよい。
【０１６２】
以上が大まかな流れになるが、これらの命令語列の解析の最中に、オプション設定のために挿入された特殊な命令が出現することがある。このような場合、解析部１１１は、それらを随時解析し、その解析の結果をデバイス素子復元のために使用するものとする。
【０１６３】
たとえば、前記したようにラダー図に記述されたコイル命令や演算命令等は、接点命令等の演算命令の結果が「真」となるときのみ実行されることを期待される。そのため、コンパイル部１１０は、コイル命令や演算命令の前に、条件付ジャンプ命令を挿入し、それまでの演算命令の結果が「偽」であるならばジャンプを実行してコイル命令や演算命令の次から実行されるように命令語を並べなくてはならない。しかし、それまでの演算命令結果によらずコイル命令や演算命令を必ず実行したい場合は、前記したようなジャンプ命令は不要となる。また、ラダー図の終了を表すために、終了コードを挿入することもある。このように、命令語を構成するテンプレートとして、このような特別な命令コードの設定も考えなくてはならない。
【０１６４】
次に、このようなオプションが設定される命令についての処理例を示す。オプションの設定の種類は様々であるが、ここでは条件成立時実行を実現する条件付ジャンプのオプションについて示す。
条件付ジャンプを挿入した命令語に対する処理の例を図２２に示す。デバイス素子２２０１は、条件成立時のみ実行する演算命令である。ここでは一例として、無条件で実行する演算命令とは異なるデバイス素子（シンボルの中心に横線がある）を使用して区別することにする。このようなデバイス素子が設定された場合、コンパイル部１１０の解析部１１１は、例えば、命令情報テーブル３５に示すように「オプション設定」欄を設けて、ここに「条件成立時実行」を設定する。なお、命令情報テーブル３５は、一部のみが示されている。このような欄を設けることで、条件付実行命令のような特殊な命令語に対するコンパイルが可能となる。
【０１６５】
符号２２２１は、命令情報テーブル３５を基に、中間語生成部１１２が生成した中間語の例である。
符号２２１１に示す「ＪＺ」命令はその前に実行した命令が「０（偽）」ならば符号２２１２のステップへジャンプするが、「１（真）」であればジャンプしないという命令語である。つまり、条件が成立して「真」であるときのみ「ＪＺ」命令２２１１の後の演算命令が実行され、「偽」であれば演算命令は実行されないことになる。このように命令語２２１１，２２２１を挿入することによって条件成立時実行が実現可能である。
逆コンパイル時には、入出力解析部１２１が、演算命令の先頭で「ＪＺ命令」を検出した場合、条件成立時実行の命令であることがわかるので、命令情報テーブル３５の「オプション設定」欄に「条件成立時実行」を格納する。このようにすることで、符号２２０１のようなラダー図を復元することが可能となる。
【０１６６】
本実施形態では、オフセットを用いる場合、オフセット値にアドレスを用いる場合のみを示しているが、これに限らず、オフセット値に定数を用いてもよい。
【０１６７】
本実施形態によれば、中間語の構成を「入力」、「演算」、「出力」の各段階に分かれており、この順に実行されるとみなすことで、効率的な逆コンパイルを行うことが可能である。
また、演算命令の形式情報を格納しているテンプレートテーブル３１を有し、中間語におけるこのテンプレートテーブル３１と一致するテンプレートの情報を命令情報テーブル３５に格納することで、さらに効率的な逆コンパイルを行うことが可能である。
さらに、入力命令、出力命令に用いられているパラメータに関する情報を命令情報テーブル３５に格納しておくことで、パラメータ管理を容易にすることができる。
そして、入力命令、出力命令の形式に関する情報をパラメータテンプレートテーブル３２に格納しておき、このパラメータテンプレートテーブル３２を用いたコンパイルを行うことで、多様な形式の命令語に対応したコンパイルを行うことができる。
【０１６８】
なお、本発明は前記した実施形態に限定されるものではなく、様々な変形例が含まれる。例えば、前記した実施形態は本発明を分かりやすく説明するために詳細に説明したものであり、必ずしも説明したすべての構成を有するものに限定されるものではない。
【０１６９】
また、前記した各構成、機能、各部１００，１１０〜１１２，１２０〜１２３、記憶装置３０等は、それらの一部又はすべてを、例えば集積回路で設計すること等によりハードウェアで実現してもよい。また、図１で示すように、前記した各構成、機能等は、ＣＰＵ２０等のプロセッサがそれぞれの機能を実現するプログラムを解釈し、実行することによりソフトウェアで実現してもよい。各機能を実現するプログラム、テーブル、ファイル等の情報は、ＨＤに格納すること以外に、メモリや、ＳＳＤ（Solid State Drive）等の記録装置、又は、ＩＣ（Integrated Circuit）カードや、ＳＤ（Secure Digital）カード、ＤＶＤ（Digital Versatile Disc）等の記録媒体に格納することができる。
また、各実施形態において、制御線や情報線は説明上必要と考えられるものを示しており、製品上必ずしもすべての制御線や情報線を示しているとは限らない。実際には、ほとんどすべての構成が相互に接続されていると考えてよい。
【符号の説明】
【０１７０】
１      プログラム解析装置
１０    メモリ
２０    ＣＰＵ
３０    記憶装置（記憶部）
３１    テンプレートテーブル
３２    パラメータテンプレートテーブル
３３    デバイス−アドレス対応テーブル
３４    演算命令管理テーブル
３５    命令情報テーブル
４０    入力装置
５０    出力装置
１００  処理部
１１０  コンパイル部
１１１  解析部（文字列分解部、情報格納部）
１１２  中間語生成部
１２０  逆コンパイル部
１２１  入出力解析部（入力命令解析部、出力命令解析部）
１２２  演算命令解析部
１２３  変換部
【図１】
2014203343.tif 000003
【図２】
2014203343.tif 000004
【図４】
2014203343.tif 000005
【図５】
2014203343.tif 000006
【図６】
2014203343.tif 000007
【図７】
2014203343.tif 000008
【図８】
2014203343.tif 000009
【図９】
2014203343.tif 000010
【図１０】
2014203343.tif 000011
【図１１】
2014203343.tif 000012
【図１２】
2014203343.tif 000013
【図１３】
2014203343.tif 000014
【図１４】
2014203343.tif 000015
【図１５】
2014203343.tif 000016
【図１６】
2014203343.tif 000017
【図１７】
2014203343.tif 000018
【図１８】
2014203343.tif 000019
【図１９】
2014203343.tif 000020
【図２０】
2014203343.tif 000021
【図２１】
2014203343.tif 000022
【図２２】
2014203343.tif 000023
【図３】
2014203343.tif 000024