(57)【特許請求の範囲】
【請求項１】
プログラムが格納されたユーザメモリと、
前記ユーザメモリにアクセスし、前記プログラムで規定される命令を読み出すとともに、命令を解読し、演算実行する演算制御部と、
その演算制御部に接続され、前記演算実行する際に使用されるデータメモリとを備えたコントローラであって、
前記データメモリには、構造化されたデータが格納されるとともに、そのデータメモリへのアクセスが、予め設定した基底アドレスからのオフセットにより実行可能とし、
前記演算制御部内に前記基底アドレスを格納した基底アドレスレジスタを設け、
前記命令を解読する際に前記基底アドレスレジスタにアクセスし、その命令に対応する前記基底アドレスを取得し、その取得した基底アドレスと解読した命令に基づいて前記演算実行をするようにし、
前記プログラムは、呼び出す関数の指定と、前記基底アドレスによって使用するデータ領域の指定と、を行う関数呼び出し処理と、その呼び出し処理の次の命令へ復帰する復帰処理を行う専用命令を備え、
前記関数呼び出し処理における関数並びにデータ領域の指定は、テーブル参照による間接指定とした
ことを特徴とするコントローラ。
【請求項２】
前記データメモリは、データ種別毎にメモリマップが構成され、
前記基底アドレスレジスタは、前記データ種別毎にそれぞれ設定されることを特徴とする請求項１に記載のコントローラ。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
この発明は、コントローラに関するものである。
【０００２】
【発明の背景】
ＰＬＣなどのコントローラの場合、ユーザプログラムは１つのプログラムの固まりとしてユーザメモリに格納されている。同様に、ユーザプログラムの演算実行中に参照するデータも、データメモリやレジスタに格納される。そして、ユーザプログラムが係るデータが格納されるデータ領域に対してアクセスする場合、プログラム中で固定アドレスを記述することにより、当該メモリ領域（データ領域）をアクセスし、データの読み書きをするようにしている。
【０００３】
そして、ユーザプログラムの構造化は、同一のデータ領域に対する同一処理の繰り返し，呼び出し／復帰処理の単位で行われている。従って、同一機能を実現するプログラムであっても、アクセス対象のデータ領域が異なる場合には、対象データ領域毎にプログラムを作成する必要がある。
【０００４】
一例を示すと、「ＡＤＤ  Ｘｃｈ，Ｙｃｈ，Ｚｃｈ」（ＸｃｈのデータにＹｃｈのデータを加算し、求めた結果をＺｃｈに格納する）というプログラムを実行する場合に、アクセス先のアドレス（Ｘ，Ｙ，Ｚ）が（１００，１０１，１０２）と（２００，２０１，２０２）とすると、図１（ａ），（ｂ）に示すように、参照先のアドレスを直接プログラムに記述した２つのプログラムを用意する必要がある。
【０００５】
従って、同じ処理内容を複数作成し、ユーザメモリに登録する必要があるので、演算対象の命令も増え、必要とするユーザメモリの容量が大きくなる。さらに、プログラムの機能を変更する場合には、対応する全てのプログラムを変更する必要がある。すなわち、例えば図１に示すプログラムにおける加算処理を乗算処理に変更する場合、プログラム１とプログラム２を、それぞれ変更する必要がある。従って、同一機能のプログラムの数が多くなるほど、修正するプログラム数が多くなり、その修正処理が煩雑となる。さらに、プログラムの一部を変更した場合でも、コンパイルや更新処理はプログラム単位で行われ、しかも、ＰＬＣなどの場合、起動中にプログラムの変更を行うことが多いため、複数プログラムに及ぶ変更は、更新データ量が多く、負荷が高くなるという問題を有する。
【０００６】
なお、図１に示したプログラムの場合、プログラム中に固定アドレスを記述した直接参照方式であるので、図２に示すように、各演算命令を実行する際に処理対象のアドレスを読み出す処理は不要となり、データ領域に対して読み出し或いは書き込みを行えば良いので、処理速度は速くなるという利点はある。
【０００７】
一方、アクセス対象のデータ領域が異なる場合であっても、データ参照を間接参照とすることにより、同一のプログラムで対応することができる（間接参照方式）。この間接参照方式を用いて、図１に示したプログラムを表記すると、図３に示すようになる。
【０００８】
ここで、図３（ｃ）に示すプログラムが、図１に示した「ＡＤＤ  Ｘｃｈ，Ｙｃｈ，Ｚｃｈ」（ＸｃｈのデータにＹｃｈのデータを加算し、求めた結果をＺｃｈに格納する）というプログラムに対応するものである。より具体的には、図３（ｃ）中の３ライン目までが、実際の演算処理に対応する。そして、この例では、「Ｆｕｎｃ＿ａｄｄ」という関数名で規定される。
【０００９】
この「Ｆｕｎｃ＿ａｄｄ」という関数は、データ領域指定ポインタ（ＰＴＲ，ＰＴＲ＋１）で指定される領域のデータを読み出し、読み出した２つのデータを加算し、その加算結果を（ＰＴＲ＋２）で指定される領域に格納する。そして、係る関数の演算処理を実行後、後述するように、呼び出し処理の次の命令へジャンプする。
【００１０】
ここで、「＠（ＰＴＲ）」は、「ＰＴＲに格納されているデータ」をアドレスとして真のデータを参照することを示す。このように、演算処理のプログラム中には、具体的な固定アドレスを記述しないことにより、例えば、この加算処理を乗算処理に変更する場合には、関数「Ｆｕｎｃ＿ａｄｄ」のプログラムを修正するだけで済むため、更新が容易に行える。つまり、プログラムを実行させながら修正するオンライン編集を高速に行うことができる。
【００１１】
但し、このようにプログラム中に固定アドレスが規定されていないため、実際にデータをアクセスするためには、ＰＴＲに代入する値（ポインタ）を指定する必要がある。それが図３（ａ），（ｂ）で示すＰｒｏｇｒａｍ１，２である。このプログラムの内容を図３（ａ）を用いて説明すると、まず、「ＭＯＶ  ＮＰＣ，＠ＳＴＫ」にて、戻り番地（ＮＰＣ：ネクストポインタカウンタ）をＳＴＫで指定された領域に退避する。次に、「ＭＯＶ  ＰＴＲ，＠（ＳＴＫ＋１）」にて、データ領域指定ポインタ（ＰＴＲ）を、（ＳＴＫ＋１）データで指定された領域に退避する。更に、「ＡＤＤ  ＳＴＫ，２，ＳＴＫ」にて、ＳＴＫに２を加算した値を新たなＳＴＫとする。つまり、戻り番地格納領域ＳＴＫを更新する。「ＭＯＶ  ０１００，ＰＴＲ」で、データ領域指定ポインタを設定する。つまり、固定アドレス「０１００」をデータ領域指定ポインタとする。そして、「ＪＭＰ
ｆｕｎｃ＿ａｄｄ」により、関数へジャンプする。
【００１２】
このＰｒｏｇｒａｍ１からのジャンプにより、図３（ｃ）に示す関数が読み出されると、ＰＴＲは０１００であるので、固定アドレス０１００，０１０１のデータを読み出し、０１０２に格納する処理を実行する。
【００１３】
次に、「ＳＵＢ  ＳＴＫ，２，ＳＴＫ」により、退避領域ポインタの更新を行う。つまり、現在のＳＴＫから２を引いた値を新たなＳＴＫとする。これにより、ＳＴＫの値は、Ｐｒｏｇｒａｍ１の１ライン目の実行時の値に戻る。そして、「ＭＯＶ  ＠（ＳＴＫ＋１），ＰＴＲ」を実行することにより、ポインタの復元をする。つまり、Ｐｒｏｇｒａｍ１の２ライン目の実行により退避したデータ領域指定ポインタＰＴＲに復元する。そして、「ＪＭＰ  ＠ＳＴＫ」により、呼び出し処理の次命令へジャンプする。つまり、Ｐｒｏｇｒａｍ１の１ライン目の実行によって退避した戻り番地ヘ飛ぶ。
【００１４】
これにより、ユーザプログラム中のＰｒｏｇｒａｍ１を実行し、関数を読み出して所定の加算処理（関数Ｆｕｎｃ＿ａｄｄ）を実行し、演算結果を格納した後、ユーザプログラムにおけるＰｒｏｇｒａｍ１の次のプロクラムの実行に移行する。Ｐｒｏｇｒａｍ２についても同様の動作が行われる。
【００１５】
このように、演算処理のプログラムを共通化したものの、具体的なデータメモリ中のアドレスを特定する（ポインタを用いて）ために、命令数が増大する。すなわち、図３に示した間接参照方式によるユーザプログラムの場合、図４に示すように、演算命令数も１８（演算対象の２に対して１６命令追加）となり、ユーザメモリ容量にも影響を与える（直接参照方式に比べると、メモリ容量は少なくて済む）。
【００１６】
また、間接参照を用いるため、図５に示すように、＠（ＰＴＲ），＠（ＰＴＲ＋１），＠（ＰＴＲ＋２）に付いてアドレス読み出しが必要となり、ポインタ操作などのオーバーヘッド処理が増加するとともにメモリ参照回数が増加するので実行速度が低下する。特に、演算処理の中で、外部メモリであるデータメモリの読み出しは、パイプライン処理の中でも時間がかかるもので、この時間をできるだけ短縮するのが、高速化のための重要な要素の１つである。
【００１７】
一方、図６に示すように、ＰＬＣなどで使用されるデータメモリに対するアクセス方法としては、１ビット単位でアクセスするものと、１チャネル（１ｃｈ：８ビット，１６ビットなど）単位でアクセスするものがある。さらに、書き込むデータとしても、キャッシュのように一時的に記憶するものもあれば、電断時にあっても保持する必要があるものがある。何れの場合も、データメモリ内のアドレスを指定することになるが、アドレス指定の容易性から、ビットアクセス領域，チャネルアクセス領域並びに電断時保持領域のように、メモリの特性／利用方法によって各領域ごとに区分けされてメモリマップが構成されている。
【００１８】
このとき、ある処理として、ビットアクセス領域は１ｃｈ（実際に必要なのは、１６ビット中のある１ビットであるか、アクセスは全体），チャネルアクセス領域は１ｃｈで、電断時保持領域は２ｃｈがそれぞれ割り当たられたものとする。すると、図６（ａ）中左側に示すように、Ｐｒｏｇｒａｍ１では、ビットアクセス領域に対しては、「ＰＴＲ」，チャネルアクセス領域に対しては「ＰＴＲ＋４」，並びに電断時保持領域に対しては「ＰＴＲ＋１０」とすることにより、データ領域にアクセスできる。
【００１９】
この場合に、各領域で隙間なく先頭からデータを格納したとすると、ＰＴＲがビットアクセス領域の２番目のチャネルのビットを指した場合、ＰＴＲ＋４より求められるチャネルアクセス領域のアクセス先も当該領域の２チャネル目となるので問題がないが、電断時保持領域に対しては、ＰＴＲ＋１０より求められるアクセス先は、当該領域の２チャネル目となり、正しいデータをアクセスできない。
【００２０】
そこで、図６（ｂ）に示すように、最大データ個数（図示の場合２）に併せて他の領域も格納するデータ領域を設定する必要がある。そのため、図示の如く空き領域を生じてしまう。従って、データメモリを効率良く使用することができないという問題を有する。
【００２１】
この発明は、ユーザメモリのメモリ容量を小さくしつつ演算処理の高速化を図ることができ、プログラムの編集も容易に行うことのできるコントローラを提供することを目的とする。
【００２２】
【課題を解決するための手段】
この発明によるコントローラは、プログラムが格納されたユーザメモリと、前記ユーザメモリにアクセスし、前記プログラムで規定される命令を読み出すとともに、命令を解読し、演算実行する演算制御部と、その演算制御部に接続され、前記演算実行する際に使用されるデータメモリとを備えたコントローラである。そして、前記データメモリには、構造化されたデータが格納されるとともに、そのデータメモリへのアクセスが、予め設定した基底アドレスからのオフセットにより実行可能にし、前記演算制御部内に前記基底アドレスを格納した基底アドレスレジスタを設けた。前記命令を解読する際に前記基底アドレスレジスタにアクセスし、その命令に対応する前記基底アドレスを取得し、その取得した基底アドレスと解読した命令に基づいて前記演算実行をするようにし、前記プログラムは、呼び出す関数の指定と、前記基底アドレスによって使用するデータ領域の指定と、を行う関数呼び出し処理と、その呼び出し処理の次の命令へ復帰する復帰処理を行う専用命令を備え、前記関数呼び出し処理における関数並びにデータ領域の指定は、テーブル参照による間接指定とした。
【００２３】
演算実行する際に参照するデータメモリのデータ領域は、基底アドレスからのオフセットにより規定され、その際にメモリアクセスが行われる。従来の間接参照方式の場合、データ領域にアクセスする前に、参照するデータ領域がどこかを特定するためにデータメモリ等に対してメモリアクセスを行うことを演算実行処理の中で行っていたが、本発明では、演算実行する前の命令の解読の際に、演算制御部内の基底アドレスレジスタを参照して基底アドレスを取得できるので、演算実行の際には既にデータ領域が認識されている。そして、基底アドレスの取得は、データメモリに対するメモリアクセスと違い、瞬時に行える。よって、演算実行の際のメモリアクセス回数が削減でき、高速演算処理が可能となる。
【００２４】
従って、間接参照方式のデメリットが解消されるので、ユーザメモリに格納するプログラムを間接参照方式で記述することにより、編集の容易性やユーザメモリのメモリ容量の縮小化などのメリットを受けつつ、演算処理の高速化が図れる。
【００２５】
関数呼び出し処理を行う専用命令は、実施の形態では「Ｆ＿ＣＡＬＬ命令」に対応し、復帰処理を行う専用命令は、実施の形態では「Ｆ＿ＲＥＴ命令」に対応する。
【００２６】
このように専用命令を設けることにより、プログラム中の命令数が削減され、ユーザメモリのメモリ容量のさらなる縮小化が図れる。
【００２７】
さらに、前記関数呼び出し処理における関数並びにデータ領域の指定は、テーブル参照による間接指定としたため、利用する関数やデータ領域を変更する場合でも、プログラム自体を修正することなく、間接指定するためのテーブルを修正するだけでよいので、変更する際の効率が更に増す。
【００２８】
更に、前記データメモリは、データ種別毎にメモリマップが構成され、前記基底アドレスレジスタは、前記データ種別毎にそれぞれ設定されるようにすることもできる。この発明は、第３の実施の形態で実現されている。このように、データ種別毎に基底アドレスを設定することにより、各データ種別のメモリ領域に対し、効率良くデータを格納することができる。
【００２９】
【発明の実施の形態】
図７は、本発明に係るコントローラであるＰＬＣの第１の実施の形態を示している。同図に示すように、ＡＳＩＣ１０の外部に、ユーザプログラムが格納されたユーザメモリ２０と、演算実行に使用するデータを格納する外部メモリとしてのデータメモリやレジスタ（以下、単に「データメモリ２１」と称する）が接続される。データメモリ２１は、必要に応じてバッテリーが接続されたものを用意し、ＰＬＣの主電源が切断されたとしても、そのバッテリーからの電力供給を受け、格納されたデータを保持する。
【００３０】
ＡＳＩＣ１０は、ユーザメモリコントローラ１１を介して、ユーザメモリ２０をアクセスし、そのユーザメモリ２０に格納されたユーザ作成のユーザプログラムを読み出し、命令読出部１２に与える。命令読出部１２は、ユーザプログラム中の命令コードの読み出しを制御し、読み出した命令コードを順次次段の命令解読部１３に与える。
【００３１】
命令解読部１３では、与えられた命令コードを解釈し、データメモリ２１（レジスタを含む）へアクセスが必要な場合には、データ読出部１７に処理を依頼し、係る依頼をした場合、データ読出部１７からのデータを取得後、必要なデータを揃えて演算部１４に渡す。もちろん、係るデータ取得が必要のない場合には、そのまま演算部１４に処理を依頼する。
【００３２】
データ読出部１７は、命令解読部１３からの依頼に基づき、データメモリコントローラ１６を介してデータメモリ２１にアクセスし、所望のデータ領域に格納されたデータを読み出し、命令解読部１３に渡す。
【００３３】
一方、演算部１４は、入力されたデータに対し、規定された演算処理を行い、内容状態の交信を行ったり、データ書込部１５へデータ出力を依頼する。このデータ出力の依頼を受けたデータ書込部１５は、データメモリコントローラ１６を介してデータメモリ２１の所望のデータ領域に対してデータを書き込む。なお、上記した構成は、パイプライン構造のＰＬＣと基本的に従来と同様であるので、その詳細な説明を省略する。
【００３４】
本実施の形態も、間接参照方式をとり、間接参照方式の利点であるオンライン編集速度の高速化を維持しつつ、実行速度の高速化並びにユーザメモリサイズの縮小化を図るようにしている。
【００３５】
まず、本形態では、基底アドレスレジスタ１８を設けている。この基底アドレスレジスタ１８は、間接参照で指定される基底アドレス（従来例で示したデータ領域指定ポインタに対応するもの：ＰＴＲ）を格納するレジスタであり、命令解読部１３は、基底アドレスレジスタ１８を参照することにより、アクセス先のデータメモリ２１中のアドレスを認識する。なお、従来の基底アドレスは、データメモリ２１に格納されており、データ読出部１７に取得依頼をし、外部メモリに対するアクセスを行い取得していたが、本形態では、内部処理により瞬時に取得できる。
【００３６】
さらに、本形態では、構造化命令として、プログラム実行中のポインタ操作と関数の呼び出し処理を行う専用命令（Ｆ＿ＣＡＬＬ命令）と、関数実行中のポインタの操作と復帰処理を行う専用命令（Ｆ＿ＲＥＴ命令）を追加し、基底アドレスレジスタの更新は、上記専用命令のみにしたため、ハザードが発生することが無くなる。これにともない、ハザード検知回路が不要となる。よって、構造簡易化する。
【００３７】
ここで、Ｆ＿ＣＡＬＬ命令は、「Ｆ＿ＣＡＬＬ  引数１，引数２」で記述される命令で、図８（ａ）に示すように「復帰処理に必要なデータの待避処理」，「演算準備処理」，「演算処理起動処理」を順次実行する。ここで、「ＮＰＣ」は、「ネクストポインタカウンタ」であり、この命令が実行された後に行う次の命令の格納先を示すポインタカウンタである。また、「ＣＰＣ」は、「カレントポインタカウンタ」であり、現在の命令のポインタカウンタである。
【００３８】
また、Ｆ＿ＲＥＴ命令は、「Ｆ＿ＲＥＴ  （引数無し）」で記述される命令で、具体的な処理は図８（ｂ）に示すように、待避データの復元処理を実行するものである。
【００３９】
これら２つの専用命令を用いて、従来の間接参照方式の具体例として図３に示したプログラム構造を記述すると、本形態では図９に示すようになる。つまり、各Ｐｒｏｇｒａｍ１，２では、Ｆ＿ＣＡＬＬ命令の引数１として呼び出す関数である「ｆｕｎｃ＿ａｄｄ」（ユーザメモリにおけるプロクラム格納領域のアドレス）を、引数２としてアクセスするデータ領域（ＰＴＲ）を記述する。
【００４０】
これにより、例えばＰｒｏｇｒａｍ１を実行すると、Ｆ＿ＣＡＬＬ命令により、図８（ａ）に示す処理を実行し、復帰処理に必要なデータを待避するとともに、演算準備，起動し、Ｆｕｎｃ＿ａｄｄを演算実行する。その後、Ｆ＿ＲＥＴ命令に従い、呼び出し処理の次命令（ＮＰＣで指定される命令）に復帰する。
【００４１】
読み出し並びに復帰のための専用命令を生成したため、実行性能は、図１０，図１１に示すように従来の間接参照方式に比べて向上する。すなわち、図１０に示すように、演算対象の２命令に加え、非演算対象であるＦ＿ＣＡＬＬとＦ＿ＲＥＴがそれぞれ追加され、合計４命令の追加となり、全体で６命令となる。これは、図４に示す従来例の１８命令に比べて命令数が削減でき、ユーザメモリ２０のメモリ容量も小さくて済む。
【００４２】
また、基底アドレスを追加したため、図１２に示すように命令解読処理の際にアドレスを読み込むので、演算命令（関数Ｆｕｎｃ＿ａｄｄ）を実行する際に間接参照のためのメモリ，レジスタを参照する必要が無くなる。つまり、図１１に示すように、＠（ＰＴＲ），＠（ＰＴＲ＋１），＠（ＰＴＲ＋２）のいずれの処理をする際にも、アドレス呼出処理は不要となり、メモリ参照回数は、２回のデータ読み出しと、演算結果を格納する１回のデータ書き込みの合計３回となる。つまり、直接参照方式と同様となり、高速化が図れる。
【００４３】
なお、従来の間接参照方式における手順と、本実施の形態の間接参照方式とを対比すると、図１２（ａ）に示すように、従来方式によれば、間接参照により特定されるべき実際のデータメモリ２１におけるデータ領域を知得するために、演算実行中にメモリ，レジスタを参照しアドレスを読み出す処理を実行したが、図１２（ｂ）に示すように、本実施の形態によれば、アドレス読み出しは、命令解読処理の際に基底アドレスレジスタ１８を参照して行うので、演算命令の実行の際は、上記アドレス読み出しにより取得したアドレスに基づき、データメモリ２１に対してアクセスしてデータを読み出すデータリード処理と、その読み出したデータに基づき演算を行う演算実行処理を適宜繰り返し行い、演算結果を所定のデータ領域に書き込むデータライト処理を行う。つまり、この演算命令の実行の際には、間接参照のためのメモリ，レジスタ参照は不要となる。
【００４４】
次に、本実施の形態におけるより具体的な演算実行例、つまり、演算命令を実際に行った場合のポインタその他の状態（値）の変位の一例として、ネストを持つプログラムを例に説明する。関数ＦｕｎｃＡｄｄ４ｔｏ１が図１３（ａ）のラダー図で示すプログラムのようになっており、係る関数を読み出して実行するプログラムの一例としては、図１３（ｂ）に示すように記述することができる。この場合において、各命令のポインタカウンタ（ＰＣ）は、左欄外に記載した値としている。
【００４５】
上記した図１３（ｂ）に示すプログラムを１ライン目から順番に実行すると、対象となるＣＰＣ，ＳＴＫ，ＮＰＣ，ＰＴＲの各値や、データメモリ２１のデータは、図１４，図１５に示すように変位する。なお、図において、Ｔ０は、ＰＣ＝１命令を実行する前の状態を示しており、ＰＣ＝１の命令を実行した結果のポインタなどの変化はＴ１に記述している。更に、図中の網掛け部分は、Ｆ＿ＣＡＬＬ命令によって退避され、また、Ｆ＿ＲＥＴ命令によって復元されデータを示している。更に、二重下線は、Ｆ＿ＣＡＬＬ命令によって引数から設定されるデータを示している。
【００４６】
まず１ライン目の「Ｆ＿ＣＡＬ  ＦｕｎｃＡｄｄ４ｔｏ１，＠ＯＰＲ」の第２引数ＯＰＲの引数として１００ｃｈのアドレスを指定して実行する場合、現命令のＰＣは１であり、命令文は１ラインであるので、次命令のＰＣは２となる。さらに、データ領域は１００ｃｈ（１００から１０３にはＡからＤが格納），退避・復元データ領域は１０００ｃｈからメモリ割付がされているとすると、このＦＣＡＬ（Ａ）の実行により、ＣＰＣ＝１，ＳＴＫ＝１０００，ＮＰＣ＝２，ＰＴＲ＝０となる。また、退避処理を実行し、戻り番地ＮＰＣとデータ領域指定ポインタＰＴＲの値を、それぞれ退避・復元データ領域であるＳＴＫ（＝１０００）とＳＴＫ＋１（＝１００１）に格納する。
【００４７】
そして、関数ＦｕｎｃＡｄｄ４ｔｏ１が呼び出され（起動され）、実行される。つまり、まず、ＰＣ＝１０のＦＣＡＬ（１）を実行する。ＦＣＡＬ（１）は、引数１＝関数ＦｕｎｃＡｄｄ２ｔｏ１，引数２＝＠（ＯＰＲ＋２）のＦ＿ＣＡＬＬ命令であるので、所定の退避処理を実行する。すなわち、格納領域ポインタを現在のＳＴＫ（＝１０００）に２を加えた値（１００２）を新たなＳＴＫとする。また、今回の演算処理（Ｔ１）は、ＣＰＣ＝１０であり、次命令のＰＣは１１であり、ＮＰＣ＝１１となり、ＰＴＲは１００となる。なお、ＰＴＲ＝１００は、基底アドレスレジスタ１８をアクセスし、基底アドレスが１００であることを予め取得している。そして、戻り番地ＮＰＣとデータ領域指定ポインタＰＴＲの値（１１，１００）を、それぞれ退避・復元データ領域であるＳＴＫ（＝１００２）とＳＴＫ＋１（＝１００３）に格納する。
【００４８】
そして、ＦｕｎｃＡｄｄ２ｔｏ１が起動され、ＰＣ＝５０を実行し、データ領域の＠ＯＰＲ（この場合１０２）と、＠（ＯＰＲ＋１）（この場合１０３）の値（Ｃ，Ｄ）を読み出し、それらを加算して得られた値Ｅ＝Ｃ＋Ｄを＠（ＯＰＲ＋２）（この場合１０４）に格納する。
【００４９】
次いで、Ｆ＿ＲＥＴ命令により、退避データの復元をする。つまり、Ｔ３に示すように、＠ＳＴＫ（この場合１００２ｃｈ）に格納されていたデータ（１１）が次のＣＰＣとなり、＠（ＳＴＫ＋１）（この場合１００３ｃｈ）に格納されていたデータ１００が、ＰＴＲにセットされる。また、ＳＴＫは１００２であり、ＮＰＣは１２となる。以下、順次退避処理と復元処理を適宜行いながら命令を実行し、ＰＣ＝１４のＦ＿ＲＥＴ命令により、最終的にＰＣ１の命令が完了し、ＰＣ＝２の処理に移行する。
【００５０】
上記したように、本実施の形態では、複数のプログラムが、同一の関数を呼び出して実行するようにしたため、関数の演算処理内容を変更する場合には、当該関数部分のみの変更で対応できる。そして、更新に必要なデータ量も、プログラム全体でなく、小さな関数単位で変更可能なため、負荷が小さくて済む。
【００５１】
さらに、Ｆ＿ＣＡＬＬ命令は、引数として関数部が格納されているユーザメモリのアドレスと、データメモリのアドレスを必要としている。そこで、係る関数やデータ領域を変更する場合の効率化を図るため、Ｆ＿ＣＡＬＬ命令にテーブル参照処理を追加すると良い。これが第２の実施の形態である。
【００５２】
すなわち、Ｆ＿ＣＡＬＬ命令の処理として、図１６に示すように、復帰処理に必要なデータの退避を行った後、演算準備処理の前にテーブル参照処理を行うようにする。このテーブル参照処理は、引数データからテーブル参照用アドレスを取得または作成し、関数格納領域のユーザメモリアドレスと、参照するデータ領域のデータメモリアドレスを取得する。これは、例えば、プログラム上では、テーブル参照アドレスの直接記述することにより対応できる。なお、その他の処理ステップは、図８（ａ）に示したものと同様である。
【００５３】
このように、テーブル参照方式にすると、プログラムの検索が不要となり、テーブル内のデータを編集するのみで対応できるので、短時間で編集処理が完了する。
【００５４】
以下、係る効果を具体例をもって説明する。まず、効果を検証するためのサンプルプログラムとして図１７に示すものを想定する。ここで、各ファンクションブロックの入出力に付記した３桁の数字が、使用するデータメモリのアドレスである。
【００５５】
そして、編集内容として、図１８に示すようにしたとする。つまり、編集内容１（Ｎｏ．１）のように、Ｆｕｎｃ＿Ａｄｄ▲１▼の利用データ領域「１００，１０１，１０２」を「４００，４０１，４０２」に変更する場合には、既存方式（テーブル参照をしない第１の実施の形態）の場合には、プログラムの編集をすることになるが、テーブル参照方式では、データテーブルの編集を行うだけで済む（具体例は後述する）。
【００５６】
同様に、編集内容２（Ｎｏ．２）のように、利用するファンクションブロックの内容（実際の関数の内容）を「ＯＵＴ＝ＩＮ１＋ＩＮ２」を「ＯＵＴ＝ＩＮ１−ＩＮ２」に変更する場合には、既存方式（テーブル参照をしない第１の実施の形態）の場合には、プログラムの編集をすることになるが、テーブル参照方式では、ファンクションテーブルの編集を行うだけで済む（具体例は後述する）。
【００５７】
すなわち、既存方式の場合の変更は、図１９に示すように、編集内容１については、プログラム中に記述された「１００」，「１０１」，「１０２」の各アドレス値を「４００」，「４０１」，「４０２」の各値に変更する処理を行う。また、編集内容２については、加算処理から減算処理になるので、プログラム中の「Ｆｕｎｃ＿Ａｄｄ」を「Ｆｕｎｃ＿Ｓｕｂ」に変更し、Ｆｕｎｃ＿Ａｄｄの実際の演算内容をＦｕｎｃ＿Ｓｕｂの内容に変更するか、新たに減算処理のＦｕｎｃ＿Ｓｕｂのプログラムを追加する必要がある。
【００５８】
これに対し、テーブル参照方式によれば、図２０に示すようにプログラム中には、元々具体的なアドレスが記述されておらず、Ｄａｔａ１，Ｄａｔａ２，ＦｕｎｃＡｄｄなどの論理名で記述されているので、編集内容１，２となってもプログラムに対する変更は不要となる。
【００５９】
そして、各論理名の参照用アドレスが、図２１に示すデータテーブル，ファンクションテーブルのように規定されているとすると、編集内容１へ対応するためには、例えばＤａｔａ１に関連付けられたデータ（データメモリのアドレス）を「１００」から「４００」に更新することにより実行できる。また、編集内容２への対応は、ＦｕｎｃＡｄｄに関連付けられたデータ（ユーザメモリの対応する関数プログラムが格納されたアドレス）を、現在の「１００」から減算処理のプログラムが格納されている「２００」に変更するだけで済む。なお、その他の構成並びに作用効果は、上記した第１の実施の形態と同様であるのでその詳細な説明を省略する。
【００６０】
上記した各実施の形態では、いずれも、基底アドレス（ＰＴＲ）が１つのものを前提としたが、本発明はこれに限ることはなく、基底アドレスを複数用いることができる。これが第３の実施の形態である。
【００６１】
すなわち、図２２に示すようにデータメモリ２１には、ビットアクセス領域，チャネルアクセス領域，バッテリーバックアップされる電断時保持領域がそれぞれ割り当てられる場合において、各データ種別に応じて基底アドレスレジスタ（ＰＴＲ＿１，ＰＴＲ＿２，ＰＴＲ＿３）を用意する。
【００６２】
すると、ある関数が利用するデータ領域が、ビットアクセス領域が１ｃｈ：１６ビット，チャネルアクセス領域が１ｃｈ，電断時保持領域が２ｃｈを割り当てた場合でも、個々のポインタへのオフセットを、＋０，＋０，＋０から＋１で指定可能となるので、各アクセス領域ごとにデータを詰めて格納することができ、空き領域を生じることなくメモリの使用効率を高めることができる。
【００６３】
なお、このように基底アドレスレジスタを複数設定する以外の構成並びに作用効果は、上記した各実施の形態と同様であるので、各部についての詳細な説明を省略する。
【００６４】
【発明の効果】
以上のように、この発明では、データメモリをアクセスする際の基準値ともなる基底アドレス（各データ領域は、この基底アドレスからのオフセットにより特定）を、演算制御部内に設けたため、内部参照で高速に取得できるようになる。よって、処理時間のかかるメモリアクセス回数が削減され、演算処理の高速化を図ることができる。もちろん、プログラムを間接参照方式で記述することにより、ユーザメモリのメモリ容量を小さくしつつ、プログラムの編集も容易に行うことができる。
【図面の簡単な説明】
【図１】従来の直接参照方式によるプログラムの一例を示す図である。
【図２】そのプログラムを実行した場合の演算命令のメモリ参照回数を示す図である。
【図３】従来の間接参照方式によるプログラムの一例を示す図である。
【図４】そのプログラムを実行した場合の演算命令数を示す図である。
【図５】そのプログラムを実行した場合の演算命令のメモリ参照回数を示す図である。
【図６】各データ領域のアクセス先を１つのデータ領域指定ポインタＰＴＲからのオフセットで指定する場合の問題点を説明する図である。
【図７】本発明の第１の実施の形態を示すブロック図である。
【図８】本発明で使用する専用命令の一例を示す図である。
【図９】上記専用命令を使用して記述したユーザプログラムの一例を示す図である。
【図１０】そのプログラムを実行した場合の演算命令数を示す図である。
【図１１】そのプログラムを実行した場合の演算命令のメモリ参照回数を示す図である。
【図１２】（ａ）は、従来の装置におけるパイプライン処理手順の一例を示す図である。（ｂ）は、本実施の形態の装置におけるパイプライン処理手順の一例を示す図である。
【図１３】動作状況の変化を説明するためのサンプルプログラムを示す図である。
【図１４】演算実行に伴う動作状況の変化を説明するための図（その１）である。
【図１５】演算実行に伴う動作状況の変化を説明するための図（その２）である。
【図１６】本発明の第２の実施の形態の要部を示す図である。
【図１７】効果を実証するためのサンプルプログラムを示す図である。
【図１８】編集内容を示す図である。
【図１９】既存方式（第１の実施の形態）における修正手順の一例を示す図である。
【図２０】第２の実施の形態における修正手順の一例を示す図である。
【図２１】第２の実施の形態における修正手順の一例を示す図である。
【図２２】本発明の第３の実施の形態の要部を示す図である。
【符号の説明】
１０  ＡＳＩＣ
１１  ユーザメモリコントローラ
１２  命令読出部
１３  命令解読部
１４  演算部
１５  データ書込部
１６  データメモリコントローラ
１７  データ読出部
１８  基底アドレスレジスタ
２０  ユーザメモリ
２１  データメモリ
【図１】
0003844051.tif 000002
【図２】
0003844051.tif 000003
【図３】
0003844051.tif 000004
【図４】
0003844051.tif 000005
【図５】
0003844051.tif 000006
【図６】
0003844051.tif 000007
【図７】
0003844051.tif 000008
【図８】
0003844051.tif 000009
【図９】
0003844051.tif 000010
【図１０】
0003844051.tif 000011
【図１１】
0003844051.tif 000012
【図１２】
0003844051.tif 000013
【図１３】
0003844051.tif 000014
【図１４】
0003844051.tif 000015
【図１５】
0003844051.tif 000016
【図１６】
0003844051.tif 000017
【図１７】
0003844051.tif 000018
【図１８】
0003844051.tif 000019
【図１９】
0003844051.tif 000020
【図２０】
0003844051.tif 000021
【図２１】
0003844051.tif 000022
【図２２】
0003844051.tif 000023