JP6243619B2 - プログラム解析装置及びプログラム解析方法 - Google Patents

プログラム解析装置及びプログラム解析方法 Download PDF

Info

Publication number
JP6243619B2
JP6243619B2 JP2013080472A JP2013080472A JP6243619B2 JP 6243619 B2 JP6243619 B2 JP 6243619B2 JP 2013080472 A JP2013080472 A JP 2013080472A JP 2013080472 A JP2013080472 A JP 2013080472A JP 6243619 B2 JP6243619 B2 JP 6243619B2
Authority
JP
Japan
Prior art keywords
instruction
information
word
command
input
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
JP2013080472A
Other languages
English (en)
Other versions
JP2014203343A5 (ja
JP2014203343A (ja
Inventor
尚 寺江
尚 寺江
直也 益子
直也 益子
昌弘 弓達
昌弘 弓達
清水 勝人
勝人 清水
中三川 哲明
哲明 中三川
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Hitachi Ltd
Original Assignee
Hitachi Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Hitachi Ltd filed Critical Hitachi Ltd
Priority to JP2013080472A priority Critical patent/JP6243619B2/ja
Publication of JP2014203343A publication Critical patent/JP2014203343A/ja
Publication of JP2014203343A5 publication Critical patent/JP2014203343A5/ja
Application granted granted Critical
Publication of JP6243619B2 publication Critical patent/JP6243619B2/ja
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Landscapes

  • Programmable Controllers (AREA)

Description

本発明は、ラダー言語のコンパイル及び逆コンパイルを行うプログラム解析装置及びプログラム解析方法に関する。
ラダー言語は工業分野における制御用の言語として、最も普及しているものの1つである。その理由として、ラダー言語は、回路的な表現による記述が、回路設計をバックグラウンドにもつ技術者に受け入れられやすいことがあげられる。しかし、ラダー言語で記述されたプログラムは電子回路とは異なり、計算機で演算を行うことによって実現されるものである。そのため、ラダー言語で記述された回路を計算機で実行できる形に変換する、コンパイルが必要不可欠となる。
ラダー言語を実行する計算機として、制御用のコントローラであるPLC(Programmable Logic Controller)がある。PLCは制御システムにおいて周期的な制御シーケンスを実行することに特化した計算機である。そして、PLCで動作するプログラムとして、ラダー言語が使用されることがある。その際、ラダー言語によるプログラムの作成は一般的なPC(Personal Computer)で行われ、そのプログラムをPCでコンパイルして、通信回線等を介してPLCに送信する。そして、PLCは、コンパイルされたプログラムを実行する。このとき、ラダー言語で作成され、コンパイルされたプログラムはPLCに搭載されたフラッシュROM(Read Only Memory)等の記憶媒体に書き込まれる。そして、PLCに搭載されたプロセッサが、フラッシュROMからコンパイルされたプログラムをメモリ上にロードすることにより、該プログラムが実行可能となる。
このように、PLCに搭載された記憶媒体には、ラダー言語で記述されたプログラムが格納されているが、このプログラムを再びPCにアップロードし、編集する場合もある。その際、PCの記憶媒体上にラダー言語の回路情報がすべて入っているならば問題ないが、容量の制約により、コンパイル済みのプログラムのみが格納されている場合がある。その場合は、PCにコンパイルされたプログラムをアップロードし、そのプログラムをラダー言語の表現形式に変換する逆コンパイルが必要となる。
このように、ラダー言語を使用するにあたって、ラダー言語からPLCのプロセッサが実行できる形式に変換するコンパイル、及びその逆コンパイルのセットが必要となる。
このような課題に対し、特許文献1に記載の技術が開示されている。特許文献1に記載の技術は、演算命令と機械語を対応させるテーブルを使用して、そのテーブルからシーケンスプログラムを変換する。同時に、特許文献1に記載の技術は、PLCの記憶媒体の別の領域に復元情報を埋め込んでおき、逆変換(逆コンパイル)時にその情報を手がかりにラダー言語への復元を行う。
特開平5−274011号公報
ラダー言語で記述されたプログラムは、回路の処理を行うシーケンス命令(接点命令、コイル命令、分岐命令、結合命令等)の他に、演算処理を実行する演算命令を組み込むことが一般的である。演算命令の例として、例えば四則演算、比較演算、論理演算等が組み込まれ、その演算処理の結果が回路の動作を決定するようにプログラムが組まれる。そのため、コンパイル及び逆コンパイルでは回路の変換だけでなく、演算命令のコンパイル及び逆コンパイル処理も必要となる。一般的に、演算命令はシーケンス命令よりも複雑であるため、コンパイル処理及び逆コンパイル処理が複雑になる傾向がある。また、プログラムを作成するユーザが、要求に応じて後から演算命令をプログラムに追加したいと要望する場合もあるため、拡張性が求められるところでもある。
なお、特許文献1に記載の技術では、演算命令だけでなく、演算命令を逆コンパイルするための付加情報をPLCにダウンロードしておく必要がある。
このような背景に鑑みて本発明がなされたのであり、本発明は、効率的な逆コンパイルを行うことを課題とする。
前記した課題を解決するため、本発明は、入力命令語を解析し、入力命令語に関する情報を命令情報テーブルに格納する入力命令解析部と、入力命令解析部による処理の終了後、演算命令語に関する情報を命令情報テーブルに格納する演算命令解析部と、演算命令解析部による処理の終了後、出力命令語に関する情報を命令情報テーブルに格納する出力命令解析部と、出力命令解析部による処理の終了後、命令情報テーブルを基に、ラダー図におけるデバイス素子を生成する変換部とを有することを特徴とする。
本発明によれば、効率的な逆コンパイルを行うことができる。
本実施形態に係るプログラム解析装置の構成例を示す図である。 ラダー図と、そのラダー図に対応する中間語の例である。 各命令の展開例を示す図である。 本実施形態に係るデバイス−アドレス対応テーブル及び演算命令管理テーブルの例を示す図である。 本実施形態に係るテンプレートテーブルの例を示す図である。 本実施形態に係るパラメータテンプレートテーブルの例を示す図である。 本実施形態に係るコンパイル処理についての状態遷移図である。 本実子形態に係る解析フェーズ処理の概要を示す図である。 本実施形態に係る解析フェーズ処理の詳細な手順を示すフローチャートである(その1)。 本実施形態に係る解析フェーズ処理の詳細な手順を示すフローチャートである(その2)。 本実施形態に係る命令情報テーブルの例を示す図である。 本実施形態に係る中間語生成フェーズ処理の詳細な手順を示すフローチャートである。 本実施形態に係るコンパイルによって生成される中間語の例を示す図である。 本実施形態に係る逆コンパイルの処理についての状態遷移図である。 本実施形態に係る逆コンパイルの対象となる中間語の例を示す図である。 本実施形態に係る入出力解析フェーズ処理の詳細な処理手順を示すフローチャートである(その1)。 本実施形態に係る入出力解析フェーズ処理の詳細な処理手順を示すフローチャートである(その2)。 本実施形態に係る演算命令解析フェーズ処理の詳細な処理手順を示すフローチャートである。 本実施形態に係る変換フェーズ処理の詳細な処理手順を示すフローチャートである(その1)。 本実施形態に係る変換フェーズ処理の詳細な処理手順を示すフローチャートである(その2)。 本実施形態に係る変換フェーズ処理の概要を示す図である。 本実施形態において、条件付ジャンプの命令語に対する処理を説明するための図である。
次に、本発明を実施するための形態(「実施形態」という)について、適宜図面を参照しながら詳細に説明する。
ここで、本実施形態における用語の定義を行う。
本実施形態において、「命令語」とは、ラダー図をコンパイルした結果生成される中間語を構成するものであり、中間語における一つ一つの命令に関するものである。命令語には、入力命令に関する入力命令語や、演算に関する演算命令語や、出力に関する出力命令語等がある。
デバイス素子は、ラダー図を構成する部品であり、接点命令や、コイル命令や、演算命令や、分岐命令等がある。
また、本実施形態は、ラダー図から各命令語を生成・出力することで中間語を生成・出力するコンパイルと、中間語における命令語からデバイス素子を生成することで、ラダー図を復元する逆コンパイルとについて説明するものである。
[装置構成]
図1は、本実施形態に係るプログラム解析装置の構成例を示す図である。
プログラム解析装置1は、PC等であり、メモリ10、CPU(Central Processing Unit)20、HD(Hard Disk)等の記憶装置(記憶部)30、キーボードや、マウス等の入力装置40、ディスプレイ等の出力装置50を有する。
記憶装置30に格納されているプログラムがメモリに展開され、展開されたプログラムがCPU20によって実行されることで、処理部100、コンパイル部110、解析部111、中間語生成部112、逆コンパイル部120、入出力解析部121、演算命令解析部122、変換部123が具現化している。
なお、処理部100は、コンパイル部110及び逆コンパイル部120を有している。
コンパイル部110はラダー図をアセンブラ等の中間語へ変換するものであり、解析部(文字列分解部、情報格納部)111、中間語生成部112を有している。
解析部111はラダー図のPI/O(Process Input/Output)文字列(後記)を分解し、命令情報テーブル35を生成する。
中間語生成部112は、解析部111が生成した命令情報テーブル35を基に、テンプレートテーブル31、パラメータテンプレートテーブル32等を参照して、中間語(後記)を生成する。
逆コンパイル部120は、中間語からラダー図を復元するものであり、入出力解析部(入力命令解析部、出力命令解析部)121、演算命令解析部122、変換部123を有する。
入出力解析部121は、中間語中の「MOV」命令から入出力パラメータの情報を抽出し、命令情報テーブル35に格納する。
演算命令解析部122は、中間語中の演算命令からテンプレートテーブル31におけるテンプレート番号(後記)を特定し、命令情報テーブル35に格納する。
変換部123は、入出力解析部121、演算命令解析部122によって生成された命令情報テーブル35を基にデバイス素子を生成することにより、ラダー図を復元する。
また、記憶装置30にはテンプレートテーブル31、パラメータテンプレートテーブル32、デバイス−アドレス対応テーブル33、演算命令管理テーブル34、命令情報テーブル35を格納している。
テンプレートテーブル31は、中間語における命令語列のパターンを格納しているものである。
パラメータテンプレートテーブル32は、入出力に関する命令語におけるパラメータの配置情報を格納しているものである。
デバイス−アドレス対応テーブル33は、ラダー図で用いられるデバイスと、アドレスの範囲とが対応付けられて格納されているものである。
演算命令管理テーブル34は、演算命令と、演算命令を識別する命令番号とが対応付けられて格納されているものである。
命令情報テーブル35は、ラダー図から中間語を生成するための情報、もしくは、中間語からラダー図を復元するための情報を格納しているものである。
なお、各テーブル31〜35は後記して詳細に説明する。
[コンパイル概要]
以下、図2及び図3を参照して、ラダー図のコンパイル処理の概要について説明する。
図2は、ラダー図と、そのラダー図に対応する中間語の例である。
図2(a)がラダー図201を示し、図2(b)が図2(a)を基に生成されるアセンブラ等の中間語202を示す。
図2(a)に示すように、ラダー図201の主要な構成部品としては接点命令211,212や、コイル命令213,214や、演算命令215,分岐命令216,217等がある。前記したように、接点命令211,212や、コイル命令213,214や、演算命令215,分岐命令216,217等の総称を(つまり、一つ一つを)「デバイス素子」と称する。また、ラダー言語では、符号211,216,215,217,213のような、1つの列回路単位で処理が行われる。このような列回路を「ラング」と称する。
接点命令211,212はI/O(Input/Output)の入力情報で、digit値をとる。すなわち、接点命令211,212は、I/Oの状態が「ON」か「OFF」という2値を取りうる。接点命令211,212の代わりに、演算命令215が使用されることもある。この場合、使用される演算命令215は結果が2値となるものに限定される。例えば、大小比較の演算命令や、論理演算命令等である。
コイル命令213,214は、1つのラングの入力側1つだけに存在し、同じラングの出力側の状態が「真」であればそのコイル命令に関連付けされたI/Oの出力を許可する。出力側の状態が「偽」であれば、コイル命令は出力を許可しない。「真」か「偽」の設定は、例えば接点命令211,212が「ON」であるか、「OFF」であるか等である。また、前記したように、コイル命令213,214の代わりに演算命令が使用されることもある。この場合、演算命令は、その左側の真偽の結果によって実行の可否が決定される。なお、コイル命令の代わりに演算命令が使用されるとき、演算命令の種類は限定されない。
ラダー言語において、命令の実行順序には一定のルールがあり、そのルールに従ってデバイス素子が実行されていく。図2の例では、まず、接点命令211が最初に実行される。実際には、接点命令211は例えば図2(b)における「LD」等といった中間語(アセンブラ)の命令語221に変換される。そして、制御装置(不図示)はこの命令語を実行することで制御対象(不図示)の制御を行う。
接点命令211の次に、分岐命令216、演算命令215、分岐命令217、コイル命令213が順に実行される。これらは、それぞれ図2(b)の命令語222〜225に変換されて実行される。
コイル命令213が実行されたところで1つのラング231が終了し、制御装置は、その次のラング232に移って接点命令212から新たに命令が実行され、接点命令212、コイル命令214の順に命令が実行される。実際には、これらの命令は図2(b)の命令語226,227に変換され、実行される。
このようにして、コンパイル部110はラダー言語で記述されたラダー図201を決められたルールに従い、ラダー図201上の各デバイス素子をプロセッサが解釈可能な命令語に変換するコンパイルを行う。この場合に適用されるルールとしては、例えば以下のようなルールである。
(1)ラングの最初は必ず接点命令である。そのため、コンパイル部110は、接点命令211,212がラングの最初に挿入されなければシンタックスエラーとする。
(2)分岐命令が挿入された場合には、分岐命令の直前の接点命令のON/OFF情報をスタックにコピーする。そのため、図2(a)の例で、コンパイル部110は分岐命令216,217の実行後、直前にある接点命令211,212のON/OFFの情報をスタックにコピーする。
(3)分岐命令が実行された後、ON/OFF情報がスタックから取り出され、その情報で以降の命令が実行される。そのため、図2(a)の例で演算命令215が実行される際、コンパイル部110は、その直前の分岐命令216でスタックにコピーされていたON/OFF情報、すなわち接点命令211のON/OFF情報を取得する。また、コンパイル部110は、取得したON/OFF情報でコイル命令213の実行可否を判断する。
図2(a)に示すようなラダー言語で記述されたラダー図201に関連付けされたI/O(以下、PI/Oと称する)は、図2(a)において「X000」や、「Y000」等と記述されている。以下、これらの文字列をPI/O文字列と称することとする。また、符号251のように、デバイス素子の種類を示す図形をシンボルと称することとする。すなわち、デバイス素子211は、PI/O文字列と、シンボル251とからなる。
PI/O文字列における名称の先頭のX,Y等の文字は、I/Oデバイス(データの入出力先でありデバイス素子とは別)のアドレスあるいは内蔵メモリを指定するものである。これらをデバイス指定文字と称することとする。また、それらの文字に続く数字は、先頭の文字が示すデバイスの入出力接点命令の指定や、メモリ上のアドレスを指定している。これらをアドレス指定数字と称することとする。例えばPI/O文字列として「X000」と記述されている場合、「X」が入力デバイス(データの格納先となるメモリ等)を意味し、その入力デバイスの0番目の接点命令を指定することが示されている。
PI/Oの指定方法として、様々な方法が考えられる。例えば、接点命令211において、アドレス指定文字「X」が指定するデバイスの先頭「X000」のアドレスに対して、「D020」に格納されている値だけオフセット(加算)した先にあるデバイスを指定したい場合等がある。この場合、たとえばPI/O文字列では「X000(D020)」等と記載する。前記した「X000」等の指定方法を「直接アドレス方式」と称し、オフセットを考慮した「X000(D020)」の指定方法を「間接アドレス方式」と称する。また、「1234」等の定数値を直接入出力したい場合や、ロングワードサイズや、浮動小数の指定等、PI/Oのサイズを指定したい場合等もある。さらに、定数値の指定については、10進数、16進数、2進数、浮動小数点や時刻の指定等、様々な指定方法が考えられる。
また、「間接アドレス方式」において、前記した「X000」のようにオフセットの対象となるアドレスを「オフセット付アドレス」と称し、「D020」のようにオフセットの値を「オフセットアドレス」と称することがある。
このようなPI/Oのアドレス値や、定数値や、サイズ値等(以下、これらを総称してパラメータと称する)の指定は他にも考えられる。ここで重要なことは、パラメータの指定の方法は無数に考えられ、また後からパラメータの指定方法を追加することもあり得るということである。これらのパラメータの指定方法に応じ、適切なコンパイルを行い、適切な命令語のオブジェクトに置き換えることが必要である。また、命令語に置き換えられたオブジェクトから、ラダー図に戻す逆コンパイルも適切に行わえるようにしなければならない。
次に、ラダー図における接点命令やコイル命令、演算命令を実行する方法について考える。ハードウェアが、I/Oデバイスやメモリにアドレスを割り付けることを考えれば、接点命令やコイル命令は、PI/O文字列で指定されたアドレスに対して読み取りや書き込みを行うこととほぼ等価である。これらの命令はメモリ上あるいはI/Oデバイスに関連付けられたアドレスから値を読み取る、あるいは書き込むという処理と、読み取った値に対して演算命令を行う処理がある。
図3は、各命令の展開例を示す図である。
図3(a)は演算命令301のデバイス素子を示す図である。演算命令301のPI/O文字列に示されているように、このデバイス素子は「ADD」による加算を行う命令である。演算命令301をアセンブラにすると、図3(b)に示すようなものとなる。このアセンブラによる処理を逐次的に記述すると以下のようになる。
(A1)プロセッサが、アドレス「D000」のPI/Oの値を読み出し、汎用レジスタ「AX」に格納する(MOV.L AX[D000]:符号302)。なお、「L」は、扱われている値がロングワードサイズであることを示している。以下、符号302のようにアセンブラ記述の1行を命令語と称する。
(A2)プロセッサが、定数値「H00001234」を読み出し、汎用レジスタ「BX」に格納する(MOV BX #H00001234:符号303)。
(A3)プロセッサが、「AX」に格納されている値と、「BX」に格納されている値を加算して、AXに格納する(ADD.L AX BX:符号304)。
(A4)プロセッサが、「AX」に格納されている値を、アドレス「D000」のPI/Oに書き出す(MOV.L [D000] AX:符号305)。
図3(c)は、接点命令311のデバイス素子を示す図である。
この接点命令311をアセンブラにすると、図3(d)に示すようなものとなる。このアセンブラによる処理を逐次的に記述すると以下のようになる。
(B1)プロセッサがアドレス「X000」のPI/Oの値を読み出し、汎用レジスタ「AX」に格納する(MOV AX [X000]:符号312)。
(B2)プロセッサが「AX」に格納されている値をスタックに追加する(PUSH AX:符号313)。
図3(e)は、コイル命令321のデバイス素子を示す図である。
コイル命令321をアセンブラにすると、図3(f)に示すようなものとなる。このアセンブラによる処理を逐次的に記述すると以下のようになる。
(C1)プロセッサがスタックから値を汎用レジスタ「AX」に取り出す(POP AX:符号322)。
(C2)「AX」に格納されている値をアドレス「Z000」のPI/Oに書き出す(MOV [Z000] AX:符号323)。
以下の処理は図3(b)で説明した処理を同じ処理である。
図3(g)に示すように、プロセッサがアドレス「D000」から値を取り出し、それを汎用レジスタ「AX」に格納する(S11)。
次に、プロセッサが、定数値「H00001234」を汎用レジスタ「BX」に格納する(S12)。
そして、プロセッサが、汎用レジスタ「AX」に格納されている値と、汎用レジスタ「BX」に格納されている値を加算し(S13)、加算した結果を汎用レジスタ「AX」に格納する(S14)。
そして、プロセッサがアドレス「D000」に汎用レジスタ「AX」に格納されている値を書き込む(S15)。
なお、本実施形態では、中間語であるアセンブラで記述しているが、ラダー図を直接機械語に変換することも可能である。
これらの命令のアセンブラ記述で共通していることは、どのような命令の展開であっても、大きく以下のような3つの順序で行われていることである
(D1)PI/Oや定数値の汎用レジスタ(「AX」や「BX」等)への取り込み(入力)。
(D2)汎用レジスタに取り込まれた数値の演算命令実行。
(D3)演算命令結果のPI/Oへの書き込み(出力)。
図3(a)における「ADD」を例にとると、図3(b)における符号302のステップと符号303のステップは、前記した(D1)のPI/Oや定数値等のパラメータを汎用レジスタに取り込む入力に分類される。
同様に、符号304のステップは、前記した(D2)の汎用レジスタの値に対して演算命令を行う演算命令実行に分類される。
そして、符号305のステップは、前記した(D3)の演算命令結果をPI/Oに書き出す出力に分類される。
図3(c)の接点命令311でも同様に、図3(d)における符号313の「PUSH」は演算命令と出力とを兼ねている(D2とD3を兼ねている)とみなすことができる。また、、図3(e)のコイル命令321でも同様に、図3(f)における符号323の「POP」は入力と演算命令とを兼ねている(D1とD2を兼ねている)とみなすこともできる。
演算命令は、加算や減算等の単純な演算命令に限らず、複雑な処理であることがある。
図3(a)に示す例では「ADD」という演算命令1ステップで演算命令を終了していたが、実際にはその限りではない。複雑な処理になった場合でも、演算命令をコンパイルして適切なオブジェクトに変換し、またそのオブジェクトを逆コンパイルして元の演算命令に戻すことができるようにする必要がある。
以上のように、ラダー図に演算命令を配置したときに、その入出力のPI/Oの指定方法が多岐にわたるだけでなく、演算命令処理自体も複雑化することが考えられる。さらに、このような複雑な演算命令をコンパイル・逆コンパイルで効率的にもとの演算命令に復元できるようにすることも同時に求められる。
そこで、本実施形態において、コンパイル部110は、コンパイル時に、演算命令やコイル命令等の、ラダー図の各デバイス素子に対してシンボルやPI/O文字列を解析する。そして、コンパイル部110は、解析した結果から入出力のパラメータを実アドレスに変換し、また予め設定してあるテンプレート(テンプレートテーブル31)を使ってアセンブラあるいは機械語レベルの命令語列に変換する(本実施形態では、アセンブラに変換する)。
また、逆コンパイル部120は、逆コンパイル時に、コンパイル時に使用したテンプレート(テンプレートテーブル31)を使用し、このテンプレートと、中間語の命令語との比較によってラダー図におけるデバイス素子を復元する。このとき、前記したように、中間語の構造が「入力」、「演算命令実行」、「出力」の順になることに着目し、それぞれのフェーズ処理で参照対象とするテンプレートを限定することで、テンプレート参照の回数を減らすようにする。
以下、図4〜図18を参照して本実施形態の詳細な説明を行う。
[各種テーブル]
ここで、図4〜図6を参照して、本実施形態で使用する各種テーブルを説明する。
(デバイス−アドレス対応テーブル)
図4(a)は、本実施形態に係るデバイス−アドレス対応テーブルの例を示す図である。
デバイス−アドレス対応テーブル33では、PI/Oに使用されるデバイス指定文字と、そのデバイス指定文字に割り当てられているアドレスの範囲が対応付けられている。なお、デバイス−アドレス対応テーブル33は設定者によって予め設定されているテーブルである。
(演算命令管理テーブル)
図4(b)は、本実施形態に係る演算命令管理テーブルの例を示す図である。
演算命令管理テーブル34では、演算命令名称と、その命令番号とが対応付けられている。ここで、図4(b)に示す「FUNC1」、「FUNC2」とは、前記した「ADD」等を代表するものである。また、命令番号とは、設定者によって各演算命令に対して一意に割り振られる番号である。
(テンプレートテーブル)
図5は、本実施形態に係るテンプレートテーブルの例を示す図である。
図5(a)は、テンプレートテーブル31の構成例を示す図であり、図5(b)は図5(a)に示すテンプレートテーブル31をアセンブラによる記述(中間語)に変換した例である。
テンプレートテーブル31は、設定者によって予め作成されているテーブルであり、図5(a)に示すように複数のテーブル(以降、個々のテーブルをテンプレートと称する)を有している。各テンプレートには、テンプレート番号、ステップ総数、第1ステップ〜第nステップ(図5の例では第3ステップまで)の情報が格納されている。そして、テンプレートテーブル31は、中間語を作成するための雛形となるテーブルである。
テンプレート番号は、各テンプレートを特定するための番号であり、設定者によって設定される番号である。
ステップとは、図5(b)に示されるように、中間語としてアセンブラを使用した場合における各命令語のことである。
従って、ステップ総数は、命令語の総数である。
そして、各ステップ毎に、「生成条件」、「分類」、「オプション設定」、「オペコード」、「サイズ」、「汎用レジスタ」の各情報を格納している。本実施形態では、汎用レジスタを「EAX」としているが、汎用レジスタを自由に設定できるようにしてもよい。
「生成条件」は、該当するステップが生成される条件である。例えば、第1ステップのように「常に」が記載されている場合は、該当する命令語は常に生成される。また、第2ステップのように「パラメータ1がロングワード」が生成条件となっている場合、第1ステップで使用されている「パラメータ1」の「サイズ」がロングワードである場合に該当する命令語が生成される。
「分類」は該当する命令語が属する分類である。この分類は、前記した(D1)入力、(D2)演算命令実行、(D3)出力に相当する。
「オプション設定」は、後記するようにジャンプ命令等の特殊な命令の情報を格納する。
「オペコード」は「オペレーションコード」の略であり、ここではアセンブラにおける命令の種類である。
「サイズ」は、使用されるパラメータのサイズ(ロングワードサイズ)等である。
「汎用レジスタ」は、使用される汎用レジスタのPI/Oデバイスを示す。
以下、各設定事項の具体的な説明を行う。
例えば、第1ステップは、「オペコード」は「MOV」命令を使用し、「サイズ」は「パラメータ1」のサイズが設定されている。第1ステップの例では「サイズ」で「パラメータ1のサイズ」が設定されている。従って、「パラメータ1」のサイズに「L(ロングワードサイズ)」が設定されている場合、コンパイル部110は命令語の生成時に「MOV.L」の命令、すなわち「ロングワードサイズ」の「MOV」命令を生成する。
「生成条件」は、前記したように、この第1ステップの命令が生成される条件を表している。ここでは「常に」であるので、第1ステップに該当する命令は必ず生成される。
「分類」は、本命令の分類がパラメータ1をリードする分類(前記した(D1)の「入力」)であることを示している。例えば、「パラメータ1」をリードするように設定すると、「パラメータ1」のアドレスに対して命令を実行することが設定される。オプションの設定は「なし」であるので、オプションの設定は特に行わない。また、汎用レジスタは「EAX」を使用するように設定されている。
このような第1ステップの設定内容をアセンブラで記述すると、図5(b)に示される第1ステップ「MOV.S1 EAX [パラメータ1]」(S1はパラメータ1のサイズ)となる。
同様にして、図5(a)における第2ステップは、「オペコード」が「FUNC」であり、「サイズ」は「ロングワード(サイズ)」である。
また、「生成条件」として、「パラメータ1」が「ロングワード(サイズ)」となっている。これは、「パラメータ1」がロングワードサイズではない場合、コンパイル部110は、第2ステップの命令を生成しないことを意味している。
「分類」は、本命令の分類が演算命令を実行する分類((D2)演算命令実行)であることを示している。「オプション設定」には、「飽和あり」が設定されている。「飽和あり」とは以下のような意味である。いくつかの命令では、演算命令を実行した結果、オーバーフローが発生する場合があるが、そのオーバーフローが発生したときに数値をどのように扱うかを設定できる命令語も存在する。「飽和あり」は、オーバーフローしたときに、最大値に飽和をするように命令を生成することを意味している。
また、汎用レジスタは「EAX」を使用するように設定されている。
このような第2ステップの設定内容をアセンブラで記述すると、図5(b)に示される第2ステップ「FUNC.OL EAX」となる。
図5(a)における第3ステップでは、「オペコード」が「MOV」であり、「サイズ」は「パラメータ2のサイズ」である。
「生成条件」として第1ステップと同様に「常に」が設定されており、「オプション設定」も「なし」が設定されている。ただし、「分類」は「パラメータ2ライト」であり、パラメータ2で設定されたアドレスに対してライト((D3)出力)が行われることを意味している。
また、汎用レジスタは「EAX」を使用するように設定されている。
このような第3ステップの設定内容をアセンブラで記述すると、図5(b)に示される第3ステップ「MOV.S2 [パラメータ2] EAX」(S2はパラメータ2のサイズ)となる。
なお、テンプレートテーブル31としてオフセットアドレスに関する「オフセットサイズ」、「オフセット汎用レジスタ」欄等が設けれてもよい。
(パラメータテンプレートテーブル)
図6は、本実施形態に係るパラメータテンプレートテーブルの例を示す図である。
本実施形態では、中間語における各ステップの詳細な記述を行うテンプレートテーブル31とは別に、引数の設定方式を具体的に設定するパラメータテンプレートテーブル32を定義する。なお、引数とは、命令語における各値を示す。
パラメータテンプレートテーブル32は、「No.」と、「設定方式」と、「命令ステップ」とが対応付けられている。
「設定方式」は、「直接アドレスリード」や、「間接アドレスリード」等、主に入出力形式を設定している。この「設定方式」は、図11で後記する命令情報テーブル35における「方式」に対応する情報である。
そして、「命令ステップ」において、各「設定方式」における詳細なパラメータの形式が設定されている。
なお、「命令ステップ」において、「“ ”」で囲っているパラメータには、後記する命令情報テーブル35や、図5(a)のテンプレートテーブル31から取得された情報が格納される。どのパラメータテンプレートテーブル32における各引数が、どのテーブルから取得されるかは、例えば引数にタグのような情報を持つビット列を埋め込むこと等で対照してもよい。あるいは、引数の参照方式として、引数参照の方法を示すフラグや異なるオペコードの採用等により区別される方法でもよい。
例えば、「設定方式」で「直接アドレスリード」が設定された場合、中間語の命令語として「MOV」命令が使用される。また、「“サイズ”」は、前記したように図11で後記する命令情報テーブル35における「サイズ」に対応する情報である。また、「“汎用レジスタ”」は図5(a)のテンプレートテーブル31における「汎用レジスタ」に対応する情報である。そして、「“アドレス・定数”」は図11で後記する命令情報テーブル35の「アドレス・定数」に対応する情報である。
なお、なお、「“アドレス・定数”」において「[ ]」がついているものはアドレス参照を示し、「[ ]」がないものは定数値を参照している。
なお、パラメータテンプレートテーブル32における行を「命令テンプレート」と称することとする。
[コンパイル]
まず、図7〜図13を参照して、本実施形態に係るコンパイル処理について説明する。
(状態遷移図)
図7は、本実施形態に係るコンパイル処理についての状態遷移図である。
コンパイル部110が処理を開始すると、コンパイル部110の解析部111がラダー図における最初のラングを読み込み、最初のデバイス素子について、解析フェーズ処理に遷移する(S21)。解析フェーズ処理では、PI/O文字列の分解・解析が行われ、図11で後記する命令情報テーブル35が生成される。解析フェーズ処理の詳細については、図9〜図11を参照して後記する。
処理対象となっているデバイス素子について解析フェーズ処理が終了すると、コンパイル部110の中間語生成部112が中間語生成フェーズ処理に遷移する(S22)。中間語生成フェーズ処理では、解析フェーズ処理で生成された命令情報テーブル35と、テンプレートテーブル31、パラメータテンプレートテーブル32を基に、中間語が生成される。中間語生成フェーズ処理の詳細は、図12〜図13を参照して後記する。
そして、コンパイル部110は次に実行されるデバイス素子が存在するか否かを判定し、次に実行されるデバイス素子がある場合(S23)、解析部111が次に実行されるデバイス素子について解析フェーズ処理を行う。
次に実行されるデバイス素子がない場合(S24)、コンパイル部110はコンパイル処理を終了する。
ここで、図8を参照して、解析フェーズ処理の概要を示す。
図8におけるデバイス1061は「FUNC1」という演算命令を表している。そして、PI/O文字列1062は「FUNC1」の式を表す文字列である。
PI/O文字列1062において、「FUNC1」のあとに続く文字列は入出力のPI/Oを示し、「FUNC1」命令は1つめのパラメータに入力、2つめのパラメータに出力を要求するものとする。ここで、入力パラメータ「X000L」は、直接アドレスリードにより、デバイス「X」の「000番目」のアドレスの値をロングワードサイズ(「L」)で取得することを示している。
その次の「Y001(D010W)L」という文字列は、間接アドレスライトにより、デバイス「Y」の「001番目」のアドレスに対し、「D010」のワードサイズ値を加算した(オフセットした)アドレスに対し書き込みすることを示している。
各パラメータが入力なのか出力なのかについては演算命令に依存する。上記のような設定が、ユーザによってアプリケーション画面から入力され、コンパイルが実行すると演算命令の文字列解析が行われる。その結果、スペースで区切っているテンプレートから、PI/O文字列1062は、「FUNC1」の演算命令(符号1001)、第1パラメータ「X000L」(符号1002)、第2パラメータ「Y001(D010W)L」(符号1003)とに分けることができる。「( )」で区切っているものは、間接アドレス方式であるので、第2パラメータは、「Y001L」(第1分解文字列1051)と「(D010W)」(第2分解文字列1052)とに分けることが可能である。「第1分解文字列」、「第2分解文字列」については後記して説明する。
さらに、第1パラメータ1002や、第2パラメータの第1分解文字列1051や、第2分解文字列1052は、「X」や「Y」等のデバイスの識別文字と、「000」等のデバイスのアドレス値、「L(ロングワード)」や「W(ワード)」等のサイズ値に分けることができる(符号1011〜1012,1021〜1023,1031〜1033)。
このようにして分割した文字や数字を元に、解析部111は、図4(a)のデバイス−アドレス対応テーブル33を用いてデバイスのアドレスを割り出す。図4(a)の例では、「X」のデバイスは「C1000000h」のアドレスから「C1FFFFFFh」のアドレスまでが使用されている。また、「Y」のデバイスは「C2000000h」のアドレスから「C2FFFFFFh」のアドレスまでが使用されている。そして、「D」のデバイスは「41000000h」のアドレスから「41FFFFFFh」までのアドレスが使用されている。このような、デバイス−アドレス対応テーブル33を用いることで、I/Oのデバイス指定文字をアドレスに変換することができる。
また、演算命令の名称から、図4(b)における演算命令管理テーブル34を用いて演算命令「FUNC1」の命令番号「0001h」を取得することができる。
そして、解析部111は、デバイスのアドレス値といった入出力演算のパラメータに関する情報や、命令番号といった演算命令に関する情報を図11に示す命令情報テーブル34に格納する。
以下、このことを詳細に説明する。
(解析フェーズ処理)
図9及び図10は、本実施形態に係る解析フェーズ処理の詳細な手順を示すフローチャートである。適宜、図1、図4、図8、図11を参照する。
まず解析部111は、ラダー図に記載されているPI/O文字列を分解する。
まず、解析部111はiを「2」として初期化する(i=2;S101)。
次に、解析部111はPI/O文字列をスペースの部分で分解する文字列分解を行う(S102)。ここで、分解された結果、生じるそれぞれの文字列群を分解文字列と称することとする。この段階で、図8の符号1001,1002,1003のような分解文字列が生成される。
次に、解析部111は、最初の分解文字列(図8の例では分解文字列1001)をキーとして、図4(b)に示す演算命令管理テーブル34を検索し、命令番号を取得する。そして、解析部111は、取得した命令番号を命令情報テーブル35(図11)の「命令番号」欄に格納する(S103)。
そして、解析部111は、i番目の分解文字列が存在するか否かを判定する(S104)。
ステップS104の結果、i番目の分解文字列が存在しない場合(S104→No)、解析部111は、「i−1」の数をパラメータ数として命令情報テーブル35の「パラメータ数」欄に格納した(S161)後、コンパイル部110は中間語生成フェーズ処理へ処理を進める。
ステップS104の結果、i番目の分解文字列が存在する場合(S104→Yes)、解析部111はi番目の分解文字列を取得する(S105)。
そして、解析部111は、ステップS105で取得した分解文字列中に括弧があるか否かを判定する(S106)。
ステップ105の結果、図8の分解文字列1002のように分解文字列郡中に括弧でくくられた部分がない場合(S106→No)、解析部111は、処理対象となっている分解文字列の最初が文字であるか数字であるかを判定する(最初が文字or数字?;S107)。
ステップS108の結果、文字である場合(S107→文字)、解析部111は、方式情報として「直接アドレス方式」を命令情報テーブル35の「方式」欄に格納する(S108)。ここで、解析部111は、i=2のとき、「直接アドレスリード」を格納し、i=3のとき、「直接アドレスライト」を書き込む。なお、本実施形態では、パラメータテンプレートテーブル32の形式に従って、i=2のとき、「直接アドレスリード」を格納し、i=3のとき、「直接アドレスライト」としたが、パラメータテンプレートテーブル32で格納されている形式が異なれば、当然「直接アドレスリード」、「直接アドレスライト」の判別も変わってくる。
そして、解析部111は図8の符号1011に示すような処理対象となっている分解文字列の最初の文字を取得する(S109)。
続いて、解析部111は、図8の符号1012のような分解文字列における最後の文字を取得し(S110)、そして、図8の符号1013のような残りの文字列(数字列)を取得する(S111)。
解析部111は、ステップS111で取得した最初の文字をキーとして、デバイス−アドレス対応テーブル33(図4(a))を参照し、該文字に対応するアドレス値を取得する(S112)。このとき、取得するアドレス値は、デバイス−アドレス対応テーブル33における先頭のアドレスである。例えば、ステップS109で取得した文字が「X」であれば、「C1000000h」が取得される。
続いて、解析部111は、ステップS112で取得したアドレス値に、ステップS111で取得した数字列を加算する(S113)。図8の符号1011,1013の例では、ステップS111で取得された数字列は「000」(=「00000000h」)なので、数字列を加算した結果は「C1000000h」+「000」=「C1000000h」となる。
次に、解析部111はステップS113で算出した結果であるアドレス値を、命令情報テーブル35の「パラメータi」における「アドレス・定数」欄に格納する(S114)。
さらに、解析部111はステップS110で取得した文字をサイズ値として、命令情報テーブル35の「パラメータi」における「サイズ」欄に格納する(S115)。
そして、本パラメータは、直接アドレス方式(「直接アドレスリード」又は「直接アドレスライト」)であるので、解析部111は、「オフセットアドレス」欄には「0」を、「オフセットサイズ」欄には「−」を格納する。
続いて、解析部111は、iに「1」を加算し(i=i+1;S116)、ステップS104へ処理を戻す。
一方、ステップS108の結果、数字である場合(S108→数字)、解析部111は、、解析部111は、方式情報として「定数代入」を命令情報テーブル35の「パラメータi」のける「方式」欄に格納する(S121)。
そして、解析部111は最後の文字を取得し(S122)、そして、残った文字列(数字列)を取得する(S123)。
続いて、解析部111は、ステップS123で取得した数字列を定数値として、命令情報テーブル35の「パラメータi」における「アドレス・定数」欄に格納する(S124)。
次に、解析部111は、ステップS122で取得した文字をサイズ値として、命令情報テーブル35の「パラメータi」における「サイズ」欄に格納する(S125)。
そして、本パラメータは、定数代入方式であるので、解析部111は、「オフセットアドレス」欄には「0」を、「オフセットサイズ」欄には「−」を格納する(S126)。
続いて、解析部111は、iに「1」を加算し(i=i+1;S127)、ステップS104へ処理を戻す。
また、ステップS106の結果、分解文字列郡中に括弧でくくられた部分がある場合(S106→Yes)、解析部111は、命令情報テーブル35のパラメータiにおける「方式」欄に「間接アドレスリード」又は「間接アドレスライト」を格納する(S131)。例えば、解析部111は、i=2のとき、「間接アドレスリード」を格納し、i=3のとき、間接アドレスライト」を格納する。
続いて、解析部111は「(」の前で分解文字列(文字列)をさらに分解する(S132)。この処理の結果、図8の分解文字列1051,1052が生成される。括弧の外にあった分解文字列(すなわち、図8の分解文字列1051)を第1分解文字列と称する。同様に、括弧内にあった分解文字列(すなわち、図8の分解文字列1052)を第2分解文字列と称することとする。
解析部111は、図8の符号1021のような第1分解文字列の最初の文字を取得する(S133)。
続いて、解析部111は、図8の符号1022のような第2分解文字列の最後の文字を取得し(S134)、そして、図8の符号1023のような残りの文字列(数字列)を取得する(S135)。
解析部111は、ステップS111で取得した最初の文字をキーとして、デバイス−アドレス対応テーブル33(図4(a))を参照し、該文字に対応するアドレス値を取得する(S136)。このとき、取得するアドレス値は、デバイス−アドレス対応テーブル33における先頭のアドレスである。例えば、ステップS133で取得した文字が図8の符号1021のように「Y」であれば、「C2000000h」が取得される。
続いて、解析部111は、ステップS136で取得したアドレス値に、ステップS135で取得した数字列を加算する(S137)。図8の符号1021,1023の例では、ステップS136で取得された数字列は「001」(=「00000001h」)なので、数字列を加算した結果は「C2000000h」+「001」=「C2000001h」となる。
次に、解析部111はステップS137で算出した結果であるアドレス値を、命令情報テーブル35の「パラメータi」における「アドレス・定数」欄に格納する(S138)。
さらに、解析部111はステップS134で取得した文字をサイズ値として、命令情報テーブル35の「パラメータi」における「サイズ」欄に格納する(S139)。
続いて、解析部111は、図8の符号1031のような第2分解文字列1052の最初の文字を取得する(S151)。
続いて、解析部111は、図8の符号1032のような第2分解文字列の最後の文字を取得し(S152)、そして、図8の符号1033のような残りの文字列(数字列)を取得する(S153)。
解析部111は、ステップS111で取得した最初の文字をキーとして、デバイス−アドレス対応テーブル33(図4(a))を参照し、該文字に対応するアドレス値を取得する(S154)。このとき、取得するアドレス値は、デバイス−アドレス対応テーブル33における先頭のアドレスである。例えば、ステップS151で取得した文字が図8の符号1031のように「D」であれば、「41000000h」が取得される。
続いて、解析部111は、ステップS154で取得したアドレス値に、ステップS153で取得した数字列を加算する(S155)。図8の符号1031,1033の例では、ステップS153で取得された数字列は「010」(「00000010h」)なので、数字列を加算した結果は、「41000000h」+「010」=「41000010h」となる。
次に、解析部111はステップS155で算出した結果であるアドレス値をオフセットアドレス値として、命令情報テーブル35の「パラメータi」における「オフセットアドレス」欄に格納する(S156)。
さらに、解析部111はステップS152で取得した文字をオフセットサイズ値として、命令情報テーブル35の「パラメータi」における「オフセットサイズ」欄に格納する(S157)。
続いて、解析部111は、iに「1」を加算し(i=i+1;S158)、ステップS104へ処理を戻す。
このような解析フェーズ処理が行われることによって、図11に示すような命令情報テーブル35が生成される。
(命令情報テーブル)
図11は、本実施形態に係る命令情報テーブルの例を示す図である。
命令情報テーブル35は、「命令番号」、「パラメータ数」、「パラメータ1」、「パラメータ2」・・・の欄を有する。
「命令番号」欄には、図10のステップS103で取得・格納された命令番号が格納されている。
「パラメータ数」欄には、該命令情報テーブル35に格納されているパラメータの数が格納されている。「パラメータ数」欄に格納されている値は、図10のステップS161で格納された値である。
そして、各「パラメータ」欄は、「方式」、「アドレス・定数」、「サイズ」、「オフセットアドレス」、「オフセットサイズ」の各欄を有している。
「方式」欄には、図11に示すように「直接アドレスリード」や、「間接アドレスライト」等、対象となっている演算命令の方式に関する情報が格納されている。
「アドレス・定数」欄には、対象となっているパラメータのデバイスにおけるアドレス値や、パラメータとして設定された定数値が格納されている。
「サイズ」欄には、対象となっているパラメータのサイズが格納されている。
「オフセットアドレス」欄には、対象となっているパラメータがオフセットを使用している場合、オフセットアドレス値が格納されている。
「オフセットサイズ」欄には、対象となっているパラメータがオフセットを用いている場合、そのオフセットアドレス値のサイズが格納されている。
なお、図11の例において「パラメータ1」欄に格納されている各値は、図10、図10におけるステップS108〜S115の処理で格納されたものである。
同様に、図11の例において「パラメータ2」の「方式」、「アドレス・定数」、「サイズ」の各欄に格納されている値は、図10、図10におけるステップS131〜S139の処理で格納されたものである。
そして、図11の例において「パラメータ2」の「オフセットアドレス」、「オフセットサイズ」の各欄に格納されている値は、図10、図10におけるステップS151〜S157の処理で格納されたものである。
(中間語生成フェーズ処理)
図6のパラメータテンプレートテーブル32の各引数に図11の命令情報テーブル35の各情報を当てはめることで入出力命令に関する命令語(入力命令語、出力命令語)が生成される。また、命令情報テーブル35の「分類」欄が「演算命令実行」となっているステップの情報を参照して、演算命令に関する命令語(つまり、演算命令語)が生成される。
以下、このことを詳細に説明する。
図12を参照して、命令語からなる中間語を生成する中間語生成フェーズ処理を説明する。適宜、図1、図4、図5、図6、図11を参照する。
図12は、本実施形態に係る中間語生成フェーズ処理の詳細な手順を示すフローチャートである。
まず、中間語生成部112は、命令情報テーブル35における命令番号を基に、テンプレートテーブル31(図5(a))におけるテンプレートを特定する(S201)。
次に、中間語生成部112は、k=1とし(S202)、さらに、特定されたテンプレートにおいて、k番目のステップがあるか否かを判定する(S203)。
ステップS203の結果、命令語が存在しない場合(S203→No)、中間語生成部112は中間語生成フェーズ処理を終了し、次のフェーズ処理へ遷移する。
ステップS203の結果、命令語が存在する場合(S203→Yes)、中間語生成部112は、ステップS201で特定されたテンプレートから第kステップを取得する(S204)。
そして、中間語生成部112は、テンプレートテーブル31の第kステップにおける「分類」欄を参照して、命令種別を判別する(S205)。図5(a)に示すように、命令種別には「パラメータ1リード」、「演算命令実行」、「パラメータ2ライト」等がある。
中間語生成部112は、第kステップの命令種別が「演算命令実行」であるか否かを判定する(S206)。
ステップS206の結果、「演算命令実行」でない場合(S206→No)、つまり、命令種別が「パラメータ1リード」、「パラメータ2ライト」等であった場合、中間語生成部112は、命令情報テーブル35の該当するパラメータにおける「方式」欄を参照する(S207)。例えば、命令種別が「パラメータ1リード」であれば、中間語生成部112は、命令情報テーブル35の「パラメータ1」における「方式」欄を参照する。同様に、命令種別が「パラメータ2ライト」であれば、中間語生成部112は、命令情報テーブル35の「パラメータ2」における「方式」欄を参照する。
次に、中間語生成部112は、ステップS207で参照した「方式」を基に、パラメータテンプレートテーブル32(図6)を参照し、命令テンプレートを取得する(S208)。ここで、命令テンプレートとは、前記したようにパラメータテンプレートテーブル32の行に相当するものである。
例えば、ステップS205で判別された命令種別が「パラメータ1リード」である場合、前記したように、中間語生成部112は、ステップS207で参照した、命令情報テーブル35における「パラメータ1」欄を参照する。そして、命令情報テーブル35における「パラメータ1」の「方式」欄に記述されている「直接アドレスリード」を取得する。そして、中間語生成部112は、パラメータテンプレートテーブル32の「直接アドレスリード」を参照し、その命令テンプレート(行)を取得する。
また、ステップS205で判別された命令種別が「パラメータ2ライト」である場合、中間語生成部112は、命令情報テーブル35における「パラメータ2」欄を参照する。そして、命令情報テーブル35における「パラメータ2」の「方式」欄に記述されている「間接アドレスライト」を取得する。そして、中間語生成部112は、パラメータテンプレートテーブル32の「間接アドレスライト」を参照し、その命令テンプレート(行)を取得する。
ステップS208の後、中間語生成部112は、ステップS208で取得した命令テンプレートにおける各引数を、命令情報テーブル35や、テンプレートテーブル31から取得する(S209)。
例えば、ステップS205で判別された命令種別が「パラメータ1リード」である場合、前記したように、ステップS208の段階で、パラメータテンプレートテーブル32の「直接アドレスリード」の命令テンプレートが取得されている。図6に示す「直接アドレスリード」において、各引数は、「サイズ」、「汎用レジスタ」、「アドレス・定数」である。そこで、中間語生成部112は、命令情報テーブル35の「パラメータ1」におけるサイズ「L」を取得する。また、中間語生成部112は、テンプレートテーブル31の第1ステップ(現在処理対象となっているステップ)の「汎用レジスタ」欄から汎用レジスタ「EAX」を取得する。そして、中間語生成部112は、命令情報テーブル35の「パラメータ1」における「アドレス・定数」欄から「C1000000h」を取得する。
また、ステップS205で判別された命令種別が「パラメータ2ライト」である場合、前記したように、ステップS208の段階で、パラメータテンプレートテーブル32の「間接アドレスライト」の命令テンプレートが取得されている。図6に示す「間接アドレスライト」の命令語は2列からなっている。まず、第1列目の各引数は「オフセットサイズ」、「汎用レジスタ1」、「オフセットアドレス」である。そして、第2列目の各引数は「サイズ」、「アドレス・定数+汎用レジスタ1」、「汎用レジスタ2」である。
まず、第1列目について、中間語生成部112は、命令情報テーブル35の「パラメータ1」における[オフセットサイズ」欄からオフセットサイズ「W」を取得する。また、中間語生成部112は、オフセットに用いられる汎用レジスタとして「EBX」を設定する。本実施形態では、オフセットに用いられる汎用レジスタを「EBX」に固定しているが、テンプレートテーブル31にオフセットの汎用レジスタを格納する欄を設けるようにしてもよい。そして、中間語生成部112は、命令情報テーブル35の「パラメータ1」における「オフセットアドレス」欄から「41000010h」を取得する。
続いて、第2列目について、中間語生成部112は、命令情報テーブル35の「パラメータ2」におけるサイズ「L」を取得する。また、中間語生成部112は、テンプレートテーブル31の第3ステップ(現在処理対象となっているステップ)の「アドレス・定数」の欄から「C2000001h」を取得する。加えて、中間語生成部112は、オフセットに用いられる汎用レジスタとして「EBX」を設定する。さらに、中間語生成部112は、テンプレートテーブル31の「汎用レジスタ」欄から汎用レジスタ「EAX」を取得する。
そして、中間語生成部112はステップS209で取得した各パラメータを、命令テンプレートの順に並べ、中間語に追加し(S210)、kに「1」を加算し(S211)、ステップS203に処理を戻す。
一方、ステップS206の結果、「演算命令実行」である場合(S206→Yes)、中間語生成部112は、テンプレートテーブル31の第kステップにおける「生成条件」欄を参照し、その生成条件を満たしているか否かを判定する(S221)。
例えば、図5(a)における第2ステップの例の場合、生成条件は「パラメータ1がロングワード」である。そこで、中間語生成部112は、命令情報テーブル35における「パラメータ1」の「サイズ」を参照する。すると、その「サイズ」は「L」、つまりロングワードであるので、前記した生成条件は満たされていることになる。
ステップS221の結果、生成条件を満たしていない場合(S221→No)、中間語生成部112はステップS224へ処理を進める。
ステップS221の結果、生成条件を満たしている場合(S221→Yes)、中間語生成部112はテンプレートテーブル31の第kステップにおける情報を基に、演算命令語を生成する(S222)。
そして、その演算命令語を中間語に追加し(S223)、kに「1」を加算して(k=k+1;S224)、ステップS203へ処理を戻す。
ステップS222において、図5(a)の第2ステップを例にすると、「FUNC.OL EAX」という演算命令語が生成される。
図12における中間語生成フェーズ処理によって生成された中間語の例を図13に示す。
図13において、符号1301の命令語は、図6の「直接アドレスリード」の命令テンプレートを基に図12のステップS207〜S210の処理で生成された命令語である。
また、符号1302の命令語は、図5(a)の第2ステップを基に、図12のステップS222、S223の処理で生成された命令語である。
そして、符号1303,1304の命令語は、図6の「間接アドレスライト」の命令テンプレートを基に図12のステップS207〜S210の処理で生成された命令語である。
なお、このようにして生成された中間語における各命令語間の整合性が問題にならないように、テンプレートの設計に注意が払わなければならない。具体的には、パラメータを読み取った結果を格納する汎用レジスタ、演算命令を実行した結果を格納する汎用レジスタ、そしてその結果をPI/Oに出力するときに一時的にバッファとする汎用レジスタは、すべてのテンプレートであらかじめ固定しておくとよい。たとえば、2つのパラメータにおける汎用レジスタとして「EAX」、「EBX」を使用していた場合、次の演算命令実行のときに汎用レジスタを「ECX」と「EDX」を使用すると、演算命令が正しく実行されない。つまり、パラメータを取り込んだ汎用レジスタと、演算命令実行を行うときの入力となる汎用レジスタは同じになるようにしなければならない。従って、前記したように汎用レジスタはすべてのテンプレートで同じになるようにすることが望ましい。
[逆コンパイル]
次に、図14〜図21を参照して、生成された命令語を逆に変換していき、ラダー図に戻す逆コンパイルについて説明する。逆コンパイルでは、中間語から命令語が1つずつ取り出され、その命令語から命令情報テーブル35が生成される。そして、生成された命令情報テーブル35を基に、ラダー図が復元される。
本実施形態では、中間語の構成が前記した(D1)入力、(D2)演算命令、(D3)出力の各部から構成されることに注目し、入力解析、演算解析、出力解析の順で逆コンパイルを進めていく。
つまり、ラダー言語の演算命令やコイル命令命令では、パラメータのリード(入力)は命令語列の前半に集中する。また、演算命令等の実行部分の命令は命令語列の中盤に集中する。さらに、パラメータのライト(出力)は命令語列の後半に集中する傾向がある。これらの性質を利用して、解析を入力解析、演算解析、出力解析といったフェーズ処理毎に行う。このようにすることで、効率的な逆コンパイルが可能となる。
(状態遷移図)
図14は、本実施形態に係る逆コンパイルの処理についての状態遷移図である。
まず、逆コンパイル部120が逆コンパイルを開始すると、逆コンパイル部120が、入力解析フェーズ処理へ遷移する(S31)。
入力解析フェーズ処理では、入出力解析部121が取得された命令語において、入力パラメータ(「MOV」命令)が存在するかをチェックする。存在する場合、入出力解析部121が、その入力パラメータに関する情報を命令情報テーブル35に格納する。入出力解析部121は、「MOV」命令が検出される検出される限り(「MOV」あり:S32)、入力解析フェーズ処理における処理を行い続ける。
なお、入力解析フェーズ処理の詳細な処理は後記して説明する。
「MOV」が検出されなくなると(「MOV」なし:S33)、逆コンパイル部120は演算命令解析フェーズ処理へ遷移する(S34)。
演算命令解析フェーズ処理は、その前の入力解析フェーズ処理とは独立して行われる処理である。なお、図5(a)に示すテンプレートテーブル31の「分類」は、「パラメータ1リード」や、「演算命令実行」等を有しているが、ここで比較対象となるのは、「演算命令実行」である。「演算命令実行」以外の命令語は、パラメータテンプレートテーブル32を使用して、他のフェーズ処理(入力解析フェーズ処理、出力解析フェーズ処理)において解析されるので、演算命令解析フェーズ処理では解析の対象ではない。テンプレートテーブル31中のあるテンプレートにおいて、比較対照となるテンプレートがある場合(テンプレートあり:S35)、演算命令解析部122は、そのテンプレートテーブル31におけるテンプレートと、中間語における次の命令語とを比較し続ける。演算命令解析部122は、中間語における演算命令の生起パターンと、テンプレートにおける「演算命令実行」の生起パターンとが一致するまで、あるいはすべてのテンプレートが比較されるまで演算命令解析フェーズ処理を行い続ける。
テンプレートにおいて「演算命令実行」とあるステップと、命令語との生起パターンが完全に一致した場合、もしくは、「演算命令実行」とあるステップと、命令語とで型が一致するテンプレートがみつからない場合(一致又はテンプレートなし:S36)、演算命令解析部122は、命令情報テーブル35に該テンプレートの命令番号を格納して、次の出力解析フェーズ処理(S37)へ遷移する。
なお、演算命令解析フェーズ処理の詳細な処理は後記して説明する。
出力解析フェーズ処理では、入出力解析部121が出力パラメータ(「MOV」命令)が存在するかをチェックし、存在する場合は、その出力パラメータに関する情報を命令情報テーブル35に格納する。入出力解析部121は、「MOV」命令が検出される検出される限り(「MOV」あり:S38)、出力解析フェーズ処理における処理を行い続ける。
なお、出力解析フェーズ処理の詳細な処理は後記して説明する。
入力解析フェーズ処理、演算命令解析フェーズ処理、出力解析フェーズ処理で、命令情報テーブル35が生成される。
「MOV」が検出されなくなると(「MOV」なし:S39)、逆コンパイル部120は変換フェーズ処理へ遷移する(S40)。
変換フェーズ処理では、変換部123が、入力解析フェーズ処理、演算命令解析フェーズ処理、出力解析フェーズ処理で生成された命令情報テーブル35を基に、ラダー言語におけるデバイス素子を生成する。なお、変換フェーズ処理の詳細な処理は後記して説明する。
次に、逆コンパイル部120は、未処理の命令語において、次の命令語が終了コードであるか否かを判定し、終了コードである場合(S42)、逆コンパイルを終了する。
終了コードでない場合(終了コードなし:S41)、逆コンパイル部120は入力解析フェーズ処理へ遷移する(S31)。
ここで、逆コンパイルの概要を説明する。
図15のような中間語が逆コンパイルの対象となっているものとする。この中間語は、命令語1801〜1804の4ステップからなるものとする。
まず、入出力解析部121が、入力命令の解析を行い、入力命令に関する情報を図11の命令情報テーブル35に格納する。
命令語1801は「MOV.L EAX [C1000000h]」という記述になっている。入出力解析部121は、「MOV」が存在しているため、入力命令か、出力命令のどちらかであると判別する。そして、命令語1801が、中間語の最初に位置していることから、入出力解析部121は、当該命令語1801が入力命令であると判定する。
入出力解析部121は、入力解析フェーズ処理S31において、各引数を抽出する。そして、入力解析部121は、抽出した引数を入力命令情報35に格納していく。
次の、命令語1802は、「MOV」命令が存在しないため、演算命令解析フェーズ処理S34に処理が移る。ここでは、演算命令解析部122が、テンプレートテーブル31における各テンプレートと、中間語における演算命令の生起パターンとを比較する。一致するテンプレートがあった場合、演算命令解析部122は、そのテンプレートに付されている命令番号を命令情報テーブル35に格納する。
演算命令解析フェーズ処理S34において、中間語における演算命令と一致する生起パターンを有するテンプレートがみつかるか、テンプレートテーブル31中には一致するテンプレートがない場合、出力解析フェーズ処理S37に処理が移る。
出力解析フェーズ処理S37では、入力解析フェーズ処理S31と同様の処理が行われることで、命令語1803,1804の情報が命令情報テーブル35に格納される。なお、命令語1804の形式等から、入出力解析部121は、命令語1803,1804では、オフセットが用いられていると判定する。オフセットの判定方法は後記する。
その後、「MOV」命令が検出されなくなると、変換フェーズ処理S40に処理が移る。
変換フェーズ処理では、入力解析フェーズ処理S31、演算命令解析フェーズ処理S34、出力解析フェーズ処理S37で生成された命令情報テーブル35を基に、デバイス素子が復元される。
以下、このことを詳細に説明する。
(入出力解析フェーズ処理)
図16及び図17は、本実施形態に係る入出力解析フェーズ処理の詳細な処理手順を示すフローチャートである。ここで、入出力解析フェーズ処理とは、図14の入力解析フェーズ処理及び出力解析フェーズ処理のことである。
まず、入出力解析部121はi=0とする(S301)。ここで「i」はパラメータ番号のための変数である。
続いて、入出力解析部121は、中間語におけるh番目の命令語列のオペコードに「MOV」命令が含まれているか否かを判定する(MOV?;ステップS302)。ここで、hは中間語における命令語の列番号であ。一番最初の入力解析フェーズ処理において、命令語列が読み込まれたときにhに「1」が設定され、以降、入力解析フェーズ、演算命令解析フェーズ処理、出力解析フェーズで命令語が読み込まれる毎にhに「1」が加算されていく。
ステップS302の結果、「MOV」命令を含んでいる場合(S302→Yes)、入出力解析部121は、処理対象となっている命令語から「L」や、「W」等の「サイズ」を取得する(S303)。このとき、入出力解析部121は「MOV」の次の文字が「サイズ」であるとして、該当する「サイズ」を取得する。
続いて、入出力解析部121は、処理対象となっている命令語から「アドレス・定数」部分を取得する(S304)。入出力解析部121は、命令語における各パラメータの書式を基に、アドレスもしくは定数を取得する。
次に、入出力解析部121は、取得した「アドレス・定数」のタイプを判別する(S305)。ここでタイプとは、命令語のなかに埋め込まれている「定数」、「アドレス」又は「オフセット付アドレス」である。
例えば、命令語が「MOV.L EAX [C1000000h]」のように「[ ]」がある場合、入出力解析部121は、「アドレス・定数」のタイプを「アドレス」と判別する。
また、命令語が「MOV.L EAX C1000000h」のように[ ]なしの場合、入出力解析部121は、「アドレス・定数」のタイプを「定数」と判別する。
そして、命令語が「MOV.L EAX [C1000000h + EBX]」のように「[ ]」があり、かつ、「[ ]」の中に「+」がある場合、入出力解析部121は、「アドレス・定数」のタイプを「オフセット付アドレス」と判別する。
ステップS305の結果、「アドレス・定数」のタイプが「定数」である場合(S305→定数)、入出力解析部121は、バッファにバッファ情報が格納されているか否かを判定する(バッファ情報あり?;S306)。このとき、バッファに格納されている情報は、前の処理ループにおけるステップS325で取得したアドレス値、サイズ値である。
ステップS306の結果、バッファ情報が格納されていない場合(S306→No)、入出力解析部121はステップS309へ処理を進める。
ステップS306の結果、バッファ情報が格納されている場合(S306→Yes)、入出力解析部121はバッファ情報(アドレス値、サイズ値)を命令情報テーブル35(図11)の「パラメータi」の該当する欄に格納する(S307)。つまり、1つ前の処理ループで取得したアドレス値、サイズ値を命令情報テーブル35の「パラメータi」における「アドレス・定数」欄及び「サイズ」欄に格納する。このように、バッファ情報にアドレス値、サイズ値を格納しておき、現在の処理ループの1つ前の処理ループにおけるアドレス値、サイズ値を格納するのは、オフセットが用いられる場合のように2行にわたって命令語が記述される場合を考慮しているためである。つまり、あるアドレスが命令語中に存在した場合、そのアドレスが、オフセット付アドレスであるのか否かがわからないためである。
次に、入出力解析部121は命令情報テーブル35におけるパラメータiの「方式」欄に「直接アドレスリード」もしくは「直接アドレスライト」といった方式情報を格納する(S308)。例えば、現在のフェーズ処理が入力解析フェーズ処理であれば、入出力解析部121は「直接アドレスリード」を格納する。また、現在のフェーズ処理が出力解析フェーズ処理であれば、入出力解析部121は「直接アドレスライト」を格納する。
続いて、入出力解析部121は、iに「1」を加算する(i=i+1;S309)。
そして、入出力解析部121は、ステップS303、S304で取得した定数値、サイズ値を命令情報テーブル35におけるパラメータiの「アドレス・定数」欄及び「サイズ」欄に格納する(S310)。
そして、入出力解析部121は、パラメータiの方式情報(ここでは、「定数代入」)を、命令情報テーブル35のパラメータiにおける「方式」欄に格納し(S311)、ステップS302へ処理を戻す。
次に、入出力解析部121はhに「1」を加算し(h=h+1;S312)、バッファ情報を消去して、ステップS302へ処理を戻す。
ステップS305の結果、「アドレス・定数」のタイプが「アドレス」である場合(S305→アドレス)、入出力解析部121は、バッファにバッファ情報が格納されているか否かを判定する(バッファ情報あり?;S321)。このとき、バッファに格納されている情報は、前の処理ループのステップS325で格納されたアドレス値、サイズ値である。
ステップS321の結果、バッファ情報が格納されていない場合(S321→No)、入出力解析部121はステップS324へ処理を進める。
ステップS321の結果、バッファ情報が格納されている場合(S321→Yes)、入出力解析部121はバッファ情報(アドレス値、サイズ値)を命令情報テーブル35のパラメータiにおける「アドレス・定数」欄及び「サイズ」欄に格納する(S322)。
続いて、入出力解析部121は命令情報テーブル35におけるパラメータiの「方式」欄に「直接アドレスリード」もしくは「直接アドレスライト」といった方式情報を格納する(S323)。例えば、現在のフェーズ処理が入力解析フェーズ処理であれば、入出力解析部121は「直接アドレスリード」を格納する。また、現在のフェーズ処理が出力解析フェーズ処理であれば、入出力解析部121は「直接アドレスライト」を格納する。
続いて、入出力解析部121は、iに「1」を加算する(i=i+1;S324)。
そして、入出力解析部121は、ステップS303、S304で取得したアドレス値、サイズ値をバッファ情報としてバッファに格納する(S325)。
さらに、入出力解析部121は、hに「1」を加算し(h=h+1;S326)、ステップS302へ処理を戻す。
ステップS305の結果、「アドレス・定数」のタイプが「オフセット付アドレス」である場合(S305→オフセット付アドレス)、入出力解析部121は、バッファ情報(アドレス値、サイズ値)を、命令情報テーブル35のパラメータiにおける「アドレス・定数」欄及び「サイズ」欄に格納する(S331)。
次に、入出力解析部121は、ステップS303,S304で取得したアドレス値、サイズ値を、それぞれオフセットアドレス値、オフセットサイズ値として命令情報テーブル35の「オフセットアドレス」欄、「オフセットサイズ」欄に格納する(S332)。
そして、入出力解析部121は命令情報テーブル35におけるパラメータiの「方式」欄に「間接アドレスリード」もしくは「間接アドレスライト」といった方式情報を格納する(S333)。このとき、現在のフェーズ処理が入力解析フェーズ処理であれば、入出力解析部121は「間接アドレスリード」を格納する。また、現在のフェーズ処理が出力解析フェーズ処理であれば、入出力解析部121は「間接アドレスライト」を格納する。
続いて、入出力解析部121は、hに「1」を加算し(h=h+1;S334)、ステップS302へ処理を戻す。
(演算命令解析フェーズ処理)
図18は、本実施形態に係る演算命令解析フェーズ処理の詳細な処理手順を示すフローチャートである。適宜、図1、図5、図11を参照する。
まず、演算命令解析部122は、テンプレートテーブル31のテンプレート番号iを「0」に初期化し(i=0;S401)、kを「n」に初期化する(k=n;S402)。ここで、nは、中間語における命令語列において、「MOV」以外のオペコードが初めてでてくるステップ番号である(図15の例では「2」)。
次に、演算命令解析部122が、テンプレートテーブル31におけるi番目のテンプレートを検索し、i番目のテンプレートが存在するか否かを判定する(S403)。
ステップS403の結果、i番目のテンプレートが存在しない場合(S403→No)、逆コンパイル部120は出力解析フェーズ処理へ処理を進める。なお、このとき、該当する演算命令に対してエラーフラグを付してもよい。例えば、命令情報テーブル35に「エラー」欄を設け、ステップS403で「No」が判定されると、演算命令解析部122「エラー」欄にフラグをたててもよい。
ステップS403の結果、i番目のテンプレートが存在する場合(S403→Yes)、演算命令解析部122は、jを「m」に初期化する(j=m;S404)。ここで、mは、図5(a)のテンプレートテーブル31において、「MOV」以外のオペコードが初めてでてくるステップ番号である(図3の例では「2」)。
続いて、演算命令解析部122は、i番目のテンプレートにおけるj番目のステップを取得する(S405)。
そして、演算命令解析部122は、テンプレートテーブル31(図5(a)を参照して、ステップS405で取得したj番目のステップの分類が「演算命令実行」であるか否かを判定する(S406)。
ステップS406の結果、j番目のステップの分類が「演算命令実行」である場合(S406→Yes)、中間語における命令語列におけるk番目のステップと、i番目のテンプレートにおけるj番目のステップにおいて、同じオペコードが使用されているか否かを比較する(S407)。ここで、テンプレートのj番目のステップにおけるオペコードは、図5(a)のテンプレートテーブル31における「オペコード」欄に記述されているオペコードである。なお、この段階において、図16、図17で使用されている現在処理されている命令語の列番号hに「1」が加算される。
そして、演算命令解析部122は、ステップS407における比較結果を判定する(S408)。ここでの比較結果は、「一致」、「スキップ」、「不一致」の3つがある。
ステップS408の結果、「一致」である場合(S408→一致)、演算命令解析部122はkに「1」を加え(k=k+1;S409)、jに「1」を加え(j=j+1;S410)、ステップS405へ処理を戻す。つまり、演算命令解析部122は、中間語における次の命令語と、テンプレートテーブル31における次のステップについて処理を行う。
ステップS408の結果、「スキップ」である場合(S408→スキップ)、演算命令解析部122はjに「1」を加え(j=j+1;S412)、ステップS405へ処理を戻す。つまり、演算命令解析部122は、同じテンプレートにおける次のステップについて処理を行うようにする。
ここで、ステップS408において、「スキップ」が判定される場合について説明する。ここで、「スキップ」と判定されるのは、テンプレートテーブル31において、処理対象となっているステップの生成条件が「常に」ではない場合である。
例えば、図5(a)にしめされるテンプレートの第2ステップの生成条件は「パラメータ1がロングワード」となっている。これは、「パラメータ1」がロングワード(「L」)でない場合(ワードや、バイトサイズである場合等)では、該当する演算命令を命令語として生成しないことを意味する。つまり、生成条件が満たされていない場合は、該当する演算命令は実行されないこととなり、かつ、この演算命令に該当する命令語が存在しない(スキップされている)ことはエラーではないことを意味する。
なお、生成条件が「常に」である場合、該当する演算命令は、コンパイル時において常に命令語として生成されることになる。
このように、ステップS408で「スキップ」と判定することは、該当する命令語がスキップされていることでエラーと認識されることを回避するための処理である。
ステップS408の結果、「不一致」である場合(S408→不一致)、iに「1」を加算し(i=i+1;S413)、ステップS402へ処理を戻す。つまり、演算命令解析部122は、次のテンプレートについて最初から解析を行う。このとき、図16、図17で使用されている現在処理されている命令語の列番号hは、入力解析フェーズ処理が終了した時点での値に戻される。
ステップS406の結果、j番目のステップの分類が「演算命令実行」でない場合(S406→No)、演算命令解析部122は、k番目の命令語が演算命令であるか否かを判定する(S421)。
ステップS421の結果、k番目の命令語が演算命令である場合(S421→Yes)、テンプレートでは演算命令ではないのに、命令語では演算命令となっていることから、演算命令解析部122は、処理対象のテンプレートは処理対象となっている中間語に一致しないものと判定する。なお、演算命令であるか否かは、例えば、命令が「MOV」以外であるか否か等によって判定される。
従って、演算命令解析部122はiに「1」を加算し(i=i+1;S422)、ステップS402へ処理を戻す。つまり、ステップS408で「不一致」と判定された場合と同じ処理を行う。このとき、図16、図17で使用されている現在処理されている命令語の列番号hは、入力解析フェーズ処理が終了した時点での値に戻される。
ステップS421の結果、k番目の命令語が演算命令(「FUNC」)でない場合(S421→No)、これまでテンプレートのステップと、命令語が演算命令で一致してきており、ここで、テンプレートで演算命令ではなく、命令語も演算命令でなくなったことを意味する。このため、演算命令解析部122は、処理対象のテンプレートは処理対象となっている中間語に該当しないものと判定する。
そして、演算命令解析部122は、処理対象となっているテンプレートの命令番号を命令情報テーブル35に格納し(S423)、演算命令解析部122は演算命令解析フェーズ処理を終了する。そして、逆コンパイル部120は出力解析フェーズ処理へ処理を進める。このとき、図16、図17で使用されている現在処理されている命令語の列番号hに「1」が加算される。
図16〜図18の処理によって、図15に示すような中間語から、図11に示すような命令情報テーブル35が生成される。
(変換フェーズ処理)
図19及び図20は、本実施形態に係る変換フェーズ処理の詳細な処理手順を示すフローチャートである。図19では、図16〜図18の処理で生成された図11のような命令情報テーブル35を基に、ラダー図におけるPI/O文字列や、シンボルを生成する。以下、図、図4、図11、図21を適宜参照する。
まず、変換部123は、i=1とする(S501)。
続いて、変換部123は、命令情報テーブル35(図11)を参照し、命令番号を取得する(図19のS502)。ここでは、「0001h」が取得される。
続いて、変換部123は、演算命令管理テーブル34(図4(b))を参照し、取得した命令番号に対応する命令語の文字列を取得する(S503)。ここでは「FUNC1」が取得される。
そして、変換部123は取得した文字列を文字列バッファの文字列に追加する(S504)。ここでは、文字列バッファとは、逆コンパイルで復元されるPI/O文字列のための領域である。ステップS504の処理によって、図21の符号2101の文字列が文字列バッファに追加される。
次に、変換部123は、文字列バッファにスペースを挿入する(S505)。このスペースは、PI/O文字列における各パラメータを分けるためのスペースである(図21の符号2102,2105)。
そして、変換部123は、処理対象となっている命令情報テーブル35(図11)におけるすべてのパラメータを文字列化済みであるか否かを判定する(S506)。
ステップS506の結果、すべてのパラメータが文字列化済みでない場合(S506→Yes)、変換部123は、命令情報テーブル35の「パラメータi」における「方式」欄を参照し、「定数代入」か「アドレス方式」であるかを判定する(S507)。ここで、アドレス方式とは、「直接アドレスリード方式」、「間接アドレスリード方式」、「直接アドレスライト方式」、「間接アドレスライト方式」のいずれかである。
ステップS507の結果、方式が「定数代入」である場合(S507→定数代入方式)、変換部123は、命令情報テーブル35において、処理対象となっているパラメータの「アドレス・定数」欄に格納されている定数値を取得する(S508)。
そして、変換部123は取得した定数値の数字列を文字列バッファに追加する(S509)。つまり、命令情報テーブル35の「アドレス・定数」欄に入っている数字列が、そのままパラメータ値になるので、変換部123は数字列をそのまま文字列に変換する。取得した数字列は通常16進法で表されているので、これを変換部123が10進法に変換してもよい。例えば、124A(16進)であれば、「4682」(10進)に変換部123が変換してもよい。定数の場合には定数値を表示するだけでよいので、変換部123は、この定数を文字列化したものを文字列バッファに追加する。
ステップS509の後、変換部123はiに「1」を加算し(i=i+1;S551)、ステップS505へ処理を戻す。
一方、ステップS507の結果、方式がアドレス方式である場合(S507→アドレス方式)、変換部123は命令情報テーブル35の「パラメータi」における「アドレス・定数」欄に格納されているアドレス値を取得する(S521)。
そして、変換部123は、デバイス−アドレス対応テーブル33(図4(a))を参照して、ステップS521で取得したアドレス値に該当するデバイス指定文字を取得する(S522)。
例えば、図11における「パラメータ1」が処理対象である場合、「アドレス・定数」欄に「C1000000h」が格納されているので、変換部123は、デバイス−アドレス対応テーブル33(図4(a))における範囲に該当するデバイス指定文字「X」を取得する。また、「パラメータ2」が処理対象である場合、「アドレス・定数」欄に「C2000001h」が格納されているので、変換部123は、デバイス−アドレス対応テーブル33の範囲における該当するデバイス指定文字「Y」を取得する。
次に、変換部123は、ステップS522で取得したデバイスの先頭アドレス値を取得する(S523)。デバイスの先頭アドレスは、デバイス−アドレス対応テーブル33において、該当するデバイスが割り当てられている範囲の先頭である。図4(a)の例におけるデバイス「X」の先頭アドレスは「C1000000h」であり、デバイス「Y」の先頭アドレスを「C2000000h」である。。
そして、変換部123は、ステップS521で取得したアドレス値から、ステップS523で取得したデバイスの先頭アドレスを減算して、アドレス指定数字を生成する(S524)。
そして、変換部123は、ステップS522で取得したデバイス指定文字と、ステップS524で算出したアドレス指定数字を連結したアドレス文字列を文字列バッファに追加する(S525)。
ここで、処理対象が「パラメータ1」である場合、ステップS521で取得したアドレス値が「C1000000h」であり、ステップS523で取得したデバイスの先頭アドレスが「C1000000h」である。従って、「C1000000h」−「C1000000h」=「00000000h」=「000」がステップS524で算出されるデバイス指定文字となる。従って、ステップS526で文字列バッファに追加される文字列は「X000」となる(図21の符号2103)。
また、処理対象が「パラメータ2」である場合、ステップS521で取得したアドレス値が「C2000001h」であり、ステップS523で取得したデバイスの先頭アドレスが「C2000000h」である。従って、「C2000001h」−「C2000000h」=「00000001h」=「001」がステップS524で算出されるデバイス指定文字となる。従って、ステップS526で文字列バッファに追加される文字列は「Y001」となる(図21の符号2106)。
次に、変換部123は、命令情報テーブル35において、処理対象となっているパラメータの「サイズ」欄からサイズ文字列を取得し、文字列バッファに取得したサイズ文字列を追加する(S526)。ここでは、ロングワードサイズを示す「L」が追加される(図21の符号2104,2107)。
続いて、変換部123は、命令情報テーブル35の「パラメータi」における「方式」欄を参照し、「直接アドレス方式」か「間接アドレス方式」かを判定する(直接or間接?:図20のS527)。ここで、前記したように、「直接アドレス方式」とは「直接アドレスリード」及び「直接アドレスライト」のいずれかであり、「間接アドレス方式」とは「間接アドレスリード」及び「間接アドレスライト」のいずれかである。
ステップS527の結果、「直接アドレス方式」であった場合(S527→直接)、変換部123はステップS551へ処理を進める。
ステップS527の結果、「間接アドレス方式」であった場合(S527→間接)、変換部123は、文字列「(」を文字列バッファに追加する(S531:図21の符号2108)。これは、本実施形態において、「間接アドレスリード」もしくは「間接アドレスライト」において、図8の分解文字列1003(「Y001L(D010W)」)のようにオフセット部分が括弧でくくられるためである。
続いて、変換部123は、命令情報テーブル35における「オフセットアドレス」欄からオフセットアドレス値を取得する(S532)。図11における「パラメータ2」の例では「41000010h」がステップS532で取得されるオフセットアドレス値である。
次に、変換部123は、デバイス−アドレス対応テーブル33(図4(a))を参照して、ステップS532で取得したオフセットアドレス値に該当するデバイス指定文字を取得する(S533)。
例えば、図11における「パラメータ2」が処理対象である場合、変換部123は、図4(a)のデバイス−アドレス対応テーブル33を参照し、取得したオフセットアドレス値「41000010h」に該当する範囲のデバイス指定文字「D」を取得する。
次に、変換部123は、ステップS533で取得したデバイスの先頭アドレス値を取得する(S534)。デバイスの先頭アドレス値は、デバイス−アドレス対応テーブル33において、該当するデバイスが割り当てられている範囲の先頭である(図4(a)の例におけるデバイス「D」の先頭アドレスは「41000000h」)。
そして、変換部123は、ステップS532で取得したオフセットアドレス値から、ステップS534で取得したデバイスの先頭アドレス値を減算して、アドレス指定数字を生成する(S535)。
そして、変換部123は、ステップS533で取得したデバイス指定文字と、ステップS535で算出したアドレス指定数字を連結したオフセットアドレス文字列を文字列バッファに追加する(S536)。
ここでは、ステップS532で取得したオフセットアドレス値が「41000010h」であり、ステップS534で取得したデバイスの先頭アドレスが「41000000h」であるので、「41000010h」−「41000000h」=「00000010h」=「010」がステップS535で算出されるアドレス指定数字となる。従って、ステップS536で文字列バッファに追加されるオフセットアドレス文字列は「D010」となる(図21の符号2109)。
次に、変換部123は、命令情報テーブル35において、処理対象となっているパラメータの「オフセットサイズ」欄からオフセットサイズ文字列を取得し、文字列バッファに取得したオフセットサイズ文字列を追加する(S537)。ここでは、ワードサイズを示す「W」が追加される(図21の符号2110)。
続いて、変換部123は、文字列バッファに「)」を追加し(S538:図21の符号2111)、ステップS551へ処理を進める。
一方、ステップS505の結果、すべてのパラメータが文字列化済みである場合(S506→Yes)、変換部123は、演算命令を示すシンボル(図21の符号2111)を文字列バッファに追加し(S541)、逆コンパイル部120は終了コードの有無を判定する(図14のステップS41、S42)次のフェーズ処理(出力部解析フェーズ処理も)へ遷移する。
以降、変換部123が復元したデバイス素子を復元順に連結することで、ラダー図が復元される。
なお、「間接アドレス方式」であるか、「直接アドレス方式」であるかで、解析時に混同されることが考えられる。その場合には、オフセットのアドレスを格納する汎用レジスタを予約したレジスタ(たとえばEDXでのみオフセットを使用する、等)に固定し、その予約したレジスタが出現したら間接アドレス方式である、等のように区別する方法が考えられる。また、中間語において、現在処理中の命令語に加えて、次の命令語も同時に取得し、次の命令語が、オフセットを使用する命令語になっていれば、変換部123が「間接アドレス方式」であると判定するようにしてもよい。
以上が大まかな流れになるが、これらの命令語列の解析の最中に、オプション設定のために挿入された特殊な命令が出現することがある。このような場合、解析部111は、それらを随時解析し、その解析の結果をデバイス素子復元のために使用するものとする。
たとえば、前記したようにラダー図に記述されたコイル命令や演算命令等は、接点命令等の演算命令の結果が「真」となるときのみ実行されることを期待される。そのため、コンパイル部110は、コイル命令や演算命令の前に、条件付ジャンプ命令を挿入し、それまでの演算命令の結果が「偽」であるならばジャンプを実行してコイル命令や演算命令の次から実行されるように命令語を並べなくてはならない。しかし、それまでの演算命令結果によらずコイル命令や演算命令を必ず実行したい場合は、前記したようなジャンプ命令は不要となる。また、ラダー図の終了を表すために、終了コードを挿入することもある。このように、命令語を構成するテンプレートとして、このような特別な命令コードの設定も考えなくてはならない。
次に、このようなオプションが設定される命令についての処理例を示す。オプションの設定の種類は様々であるが、ここでは条件成立時実行を実現する条件付ジャンプのオプションについて示す。
条件付ジャンプを挿入した命令語に対する処理の例を図22に示す。デバイス素子2201は、条件成立時のみ実行する演算命令である。ここでは一例として、無条件で実行する演算命令とは異なるデバイス素子(シンボルの中心に横線がある)を使用して区別することにする。このようなデバイス素子が設定された場合、コンパイル部110の解析部111は、例えば、命令情報テーブル35に示すように「オプション設定」欄を設けて、ここに「条件成立時実行」を設定する。なお、命令情報テーブル35は、一部のみが示されている。このような欄を設けることで、条件付実行命令のような特殊な命令語に対するコンパイルが可能となる。
符号2221は、命令情報テーブル35を基に、中間語生成部112が生成した中間語の例である。
符号2211に示す「JZ」命令はその前に実行した命令が「0(偽)」ならば符号2212のステップへジャンプするが、「1(真)」であればジャンプしないという命令語である。つまり、条件が成立して「真」であるときのみ「JZ」命令2211の後の演算命令が実行され、「偽」であれば演算命令は実行されないことになる。このように命令語2211,2221を挿入することによって条件成立時実行が実現可能である。
逆コンパイル時には、入出力解析部121が、演算命令の先頭で「JZ命令」を検出した場合、条件成立時実行の命令であることがわかるので、命令情報テーブル35の「オプション設定」欄に「条件成立時実行」を格納する。このようにすることで、符号2201のようなラダー図を復元することが可能となる。
本実施形態では、オフセットを用いる場合、オフセット値にアドレスを用いる場合のみを示しているが、これに限らず、オフセット値に定数を用いてもよい。
本実施形態によれば、中間語の構成を「入力」、「演算」、「出力」の各段階に分かれており、この順に実行されるとみなすことで、効率的な逆コンパイルを行うことが可能である。
また、演算命令の形式情報を格納しているテンプレートテーブル31を有し、中間語におけるこのテンプレートテーブル31と一致するテンプレートの情報を命令情報テーブル35に格納することで、さらに効率的な逆コンパイルを行うことが可能である。
さらに、入力命令、出力命令に用いられているパラメータに関する情報を命令情報テーブル35に格納しておくことで、パラメータ管理を容易にすることができる。
そして、入力命令、出力命令の形式に関する情報をパラメータテンプレートテーブル32に格納しておき、このパラメータテンプレートテーブル32を用いたコンパイルを行うことで、多様な形式の命令語に対応したコンパイルを行うことができる。
なお、本発明は前記した実施形態に限定されるものではなく、様々な変形例が含まれる。例えば、前記した実施形態は本発明を分かりやすく説明するために詳細に説明したものであり、必ずしも説明したすべての構成を有するものに限定されるものではない。
また、前記した各構成、機能、各部100,110〜112,120〜123、記憶装置30等は、それらの一部又はすべてを、例えば集積回路で設計すること等によりハードウェアで実現してもよい。また、図1で示すように、前記した各構成、機能等は、CPU20等のプロセッサがそれぞれの機能を実現するプログラムを解釈し、実行することによりソフトウェアで実現してもよい。各機能を実現するプログラム、テーブル、ファイル等の情報は、HDに格納すること以外に、メモリや、SSD(Solid State Drive)等の記録装置、又は、IC(Integrated Circuit)カードや、SD(Secure Digital)カード、DVD(Digital Versatile Disc)等の記録媒体に格納することができる。
また、各実施形態において、制御線や情報線は説明上必要と考えられるものを示しており、製品上必ずしもすべての制御線や情報線を示しているとは限らない。実際には、ほとんどすべての構成が相互に接続されていると考えてよい。
1 プログラム解析装置
10 メモリ
20 CPU
30 記憶装置(記憶部)
31 テンプレートテーブル
32 パラメータテンプレートテーブル
33 デバイス−アドレス対応テーブル
34 演算命令管理テーブル
35 命令情報テーブル
40 入力装置
50 出力装置
100 処理部
110 コンパイル部
111 解析部(文字列分解部、情報格納部)
112 中間語生成部
120 逆コンパイル部
121 入出力解析部(入力命令解析部、出力命令解析部)
122 演算命令解析部
123 変換部

Claims (12)

  1. ラダー言語に基づくデバイス素子を連結したラダー図をコンパイルした結果であり、入力命令語、演算命令語及び出力命令語を含む命令語の集合体である中間語を処理対象として前記入力命令語を検出し、前記入力命令語に関する情報を前記入力命令語から抽出して、当該抽出した入力命令語に関する情報を命令情報テーブルに格納する入力命令解析部と、
    前記入力命令解析部における処理の終了後、前記中間語において、前記入力命令語に続く前記命令語が前記演算命令語であるとみなし、前記演算命令語に関する情報を前記命令情報テーブルに格納する演算命令解析部と、
    前記演算命令解析部における処理の終了後、前記中間語において、前記演算命令語に続く前記命令語が前記出力命令語であるとみなし、前記出力命令語に関する情報を前記出力命令語から抽出して、前記命令情報テーブルに格納する出力命令解析部と、
    前記出力命令解析部における処理の終了後、前記命令情報テーブルを基に、前記デバイス素子を生成する変換部と、
    を有することを特徴とするプログラム解析装置。
  2. 前記演算命令語の形式に関する情報と、前記演算命令語の形式に関する形式識別情報とが対応付けられるテンプレートテーブルが格納される記憶部を、さらに有し、
    前記演算命令解析部は、
    前記テンプレートテーブルを参照して、処理対象となっている前記演算命令語の形式を判定し、当該演算命令語の形式に該当する形式識別情報を、前記演算命令語に関する情報として前記命令情報テーブルに格納する
    ことを特徴とする請求項1に記載のプログラム解析装置。
  3. 前記入力命令語に関する情報及び前記出力命令語に関する情報は、当該入力命令語及び当該出力命令語において使用されているパラメータに関する情報である
    ことを特徴とする請求項1に記載のプログラム解析装置。
  4. 前記パラメータに関する情報は、前記パラメータの読込方式又は書込方式を含み、さらに前記パラメータが格納されるアドレス値、及び前記パラメータのサイズに関する情報が前記パラメータに関する情報に含まれる
    ことを特徴とする請求項3に記載のプログラム解析装置。
  5. 前記入力命令語及び前記出力命令語の形式に関する情報であるパラメータテンプレートテーブルが格納されるとともに、前記演算命令語の形式に関する情報と、前記演算命令語の形式に関する形式識別情報とが対応付けられるテンプレートテーブルが格納される記憶部と、
    ラダー言語におけるシンボルに付随する文字列を、所定の書式に従って分解する文字列分解部と、
    前記文字列分解部によって分解された文字列を基に、前記分解された文字列に関する情報を前記命令情報テーブルに格納する情報格納部と、
    前記命令情報テーブルと、前記パラメータテンプレートテーブルと、前記テンプレートテーブルと、を基に、前記入力命令語と、前記演算命令語と、前記出力命令語による前記中間語を出力する中間語生成部と
    をさらに有することを特徴とする請求項1に記載のプログラム解析装置。
  6. 前記命令情報テーブルには、条件付実行命令語に関する情報が格納され、
    前記中間語生成部は、前記命令情報テーブルに前記条件付実行命令語に関する情報が格納される場合、当該条件付実行命令語に対応する命令語を前記中間語に付加する
    ことを特徴とする請求項5に記載のプログラム解析装置。
  7. ラダー言語に基づくデバイス素子を連結したラダー図をコンパイルした結果であり、入力命令語、演算命令語及び出力命令語を含む命令語の集合体である中間語を処理対象として逆コンパイルを行うプログラム解析装置が、
    前記中間語から前記入力命令語を検出し、前記入力命令語に関する情報を前記入力命令語から抽出し、
    当該抽出した入力命令語に関する情報を命令情報テーブルに格納し、
    すべての前記入力命令語に関する情報を前記命令情報テーブルに格納した後、前記中間語において、前記入力命令語に続く前記命令語が前記演算命令語であるとみなし、前記演算命令語に関する情報を前記命令情報テーブルに格納し、
    すべての前記演算命令語に関する情報を前記命令情報テーブルに格納した後、前記中間語において、前記演算命令語に続く前記命令語が前記出力命令語であるとみなし、前記出力命令語に関する情報を前記出力命令語から抽出し、
    当該抽出した出力命令語に関する情報を前記命令情報テーブルに格納し、
    すべての前記力命令語に関する情報を前記命令情報テーブルに格納した後、前記命令情報テーブルを基に、前記デバイス素子を生成する
    ことを特徴とするプログラム解析方法。
  8. 前記プログラム解析装置は、
    前記演算命令語の形式に関する情報と、前記演算命令語の形式に関する形式識別情報とが対応付けられるテンプレートテーブルが格納される記憶部を有し、
    前記プログラム解析装置が、
    前記テンプレートテーブルを参照して、処理対象となっている前記演算命令語の形式を判定し、当該演算命令語の形式に該当する形式識別情報を、前記演算命令語に関する情報として前記命令情報テーブルに格納する
    ことを特徴とする請求項7に記載のプログラム解析方法。
  9. 前記入力命令語に関する情報及び前記出力命令語に関する情報は、当該入力命令語及び当該出力命令語において使用されているパラメータに関する情報である
    ことを特徴とする請求項7に記載のプログラム解析方法。
  10. 前記パラメータに関する情報は、前記パラメータの読込方式又は書込方式を含み、さらに前記パラメータが格納されるアドレス値、及び前記パラメータのサイズに関する情報が前記パラメータに関する情報に含まれる
    ことを特徴とする請求項9に記載のプログラム解析方法。
  11. 前記プログラム解析装置は、
    前記入力命令語及び前記出力命令語の形式に関する情報であるパラメータテンプレートテーブルが格納されるとともに、前記演算命令語の形式に関する情報と、前記演算命令語の形式に関する形式識別情報とが対応付けられるテンプレートテーブルが格納される記憶部を有し、
    前記プログラム解析装置が、
    ラダー言語におけるシンボルに付随する文字列を、所定の書式に従って分解し、
    前記分解された文字列を基に、前記分解された文字列に関する情報を前記命令情報テーブルに格納し、
    前記命令情報テーブルと、前記パラメータテンプレートテーブルと、前記テンプレートテーブルと、を基に、前記入力命令語と、前記演算命令語と、前記出力命令語による前記中間語を出力することによる前記ラダー図のコンパイルを行う
    ことを特徴とする請求項7に記載のプログラム解析方法。
  12. 前記命令情報テーブルには、条件付実行命令語に関する情報が格納され、
    前記命令情報テーブルに前記条件付実行命令語に関する情報が格納される場合、前記プログラム解析装置が、当該条件付実行命令語に対応する命令語を前記中間語に付加する
    ことを特徴とする請求項11に記載のプログラム解析方法。
JP2013080472A 2013-04-08 2013-04-08 プログラム解析装置及びプログラム解析方法 Active JP6243619B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2013080472A JP6243619B2 (ja) 2013-04-08 2013-04-08 プログラム解析装置及びプログラム解析方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2013080472A JP6243619B2 (ja) 2013-04-08 2013-04-08 プログラム解析装置及びプログラム解析方法

Publications (3)

Publication Number Publication Date
JP2014203343A JP2014203343A (ja) 2014-10-27
JP2014203343A5 JP2014203343A5 (ja) 2016-04-28
JP6243619B2 true JP6243619B2 (ja) 2017-12-06

Family

ID=52353711

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2013080472A Active JP6243619B2 (ja) 2013-04-08 2013-04-08 プログラム解析装置及びプログラム解析方法

Country Status (1)

Country Link
JP (1) JP6243619B2 (ja)

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2010204998A (ja) * 2009-03-04 2010-09-16 Koyo Electronics Ind Co Ltd 学習機能型プログラマブルコントローラ

Also Published As

Publication number Publication date
JP2014203343A (ja) 2014-10-27

Similar Documents

Publication Publication Date Title
JP6479184B2 (ja) コンピュータ実行可能なモデルリバースエンジニアリング方法及び装置
JP5218063B2 (ja) 命令オペコード生成システム
US9166573B2 (en) Semiconductor device and command control method for the same
JP2008276735A (ja) プログラムコード変換装置及びプログラムコード変換方法
JP2006301989A (ja) 計算機言語によるプログラムをブロック図から自動生成する方法と装置とプログラム
JP6243619B2 (ja) プログラム解析装置及びプログラム解析方法
WO2004036463A1 (ja) コンパイラ及び論理回路の設計方法
US20070169054A1 (en) Process of automatically translating a high level programming language into an extended activity diagram
JP6121126B2 (ja) 帳票出力装置、帳票出力方法、および、プログラム
US11635947B2 (en) Instruction translation support method and information processing apparatus
JP6175306B2 (ja) 制御プログラム分割装置、制御プログラム分割方法及びその記録媒体
WO2011024554A1 (ja) アセンブル装置、構文解析方法、及びアセンブラプログラム
JPH11353164A (ja) ソースプログラム生成システムおよびソースプログラム生成方法ならびにチャート生成システムおよびチャート生成方法
JP7000181B2 (ja) 言語処理方法及び言語処理システム
JP2009251666A (ja) 変更履歴作成装置、方法及びプログラム
JP2011204069A (ja) テスト方法およびテスト仕様書テストデータ自動生成装置
JP2010282248A (ja) プログラム言語解析実行プログラム
JP2015197821A (ja) アセンブリコード変換装置およびその変換方法
JP7083473B2 (ja) 入力支援装置
CN113609821B (zh) 一种正则表达式转换方法、装置、设备及存储介质
JP6062735B2 (ja) ソフトウェア開発支援装置、ソフトウェア開発支援方法、ソフトウェア開発支援プログラム
JP6091471B2 (ja) ソースコード解析装置、ソースコード解析方法およびソースコード解析プログラム
WO2022201506A1 (ja) プログラム作成支援システムおよびプログラム作成支援プログラム
JP6214455B2 (ja) 命令テーブル生成装置、命令デコードプログラム生成装置、命令テーブル生成方法、命令デコードプログラム生成方法、およびプログラム
JP6089497B2 (ja) データ作成装置およびデータ作成方法

Legal Events

Date Code Title Description
A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20160309

A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20160309

RD02 Notification of acceptance of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7422

Effective date: 20160715

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20170328

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20170512

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20171024

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20171110

R150 Certificate of patent or registration of utility model

Ref document number: 6243619

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150