(57)【要約】【課題】ＰＯＵを使用したアプリケーションプログラムの構築に、インスタンス管理を確実にする。【解決手段】ＰＯＵインスタンスの番号順にしたインスタンス管理データと、ＰＯＵの番号順にしたＰＯＵ管理テーブルを設け、データメモリにはインスタンス領域とスタック領域を設け、プログラム型ＰＯＵまたはファンクションブロック型ＰＯＵは、ＰＯＵインスタンス起動用ＣＡＬ命令をインスタンス管理テーブルに示されるＰＯＵ管理番号からＰＯＵ管理テーブルを参照し、目的のＰＯＵを起動することで、インスタンス領域をインスタンス管理テーブルを介して切替える。  スタックに一時変数を持つファンクション型ＰＯＵは、起動用ＣＡＬ命令ではインスタンス管理テーブルに示されるＰＯＵ管理番号からＰＯＵ管理テーブルを参照し、目的のＰＯＵを直接に起動する。【選択図】図１
2008040996.tif 000002
【特許請求の範囲】
【請求項１】
変数定義部と演算命令を記述するボディ部から構成されるＰＯＵ、およびＰＯＵインスタンスを使用してアプリケーションプログラムを構築したプログラマブルコントローラであって、
前記ＰＯＵインスタンスに付けた番号順にインスタンス管理データを並べたインスタンス管理テーブルと、前記ＰＯＵに番号に付けた番号順にＰＯＵ管理データを並べたＰＯＵ管理テーブルを設け、データメモリにはインスタンス領域とスタック領域を設け、
プログラム型ＰＯＵまたはファンクションブロック型ＰＯＵは、ＰＯＵインスタンス起動用ＣＡＬ命令を前記インスタンス管理テーブルの管理番号をオペランドとし、該インスタンス管理テーブルに示されるＰＯＵ管理番号から前記ＰＯＵ管理テーブルを参照し、目的のＰＯＵを起動することで、前記インスタンス領域を前記インスタンス管理テーブルを介して切替える手段を備えたことを特徴とするプログラマブルコントローラ。
【請求項２】
前記スタックに一時変数を持つファンクション型ＰＯＵは、起動用ＣＡＬ命令では前記ＰＯＵ管理テーブルの管理番号をオペランドとし、前記インスタンス管理テーブルに示されるＰＯＵ管理番号からＰＯＵ管理テーブルを参照し、目的のＰＯＵを直接に起動する手段を備えたことを特徴とする請求項１に記載のプログラマブルコントローラ。
【請求項３】
前記プログラム型ＰＯＵまたはファンクションブロック型ＰＯＵは、ＣＡＬ命令実行時に、演算チップの内部レジスタの内容をスタックにＰＵＳＨすることで、ＰＯＵインスタンス／ＰＯＵ単位に閉じたプログラムを構築することを特徴とする請求項１に記載のプログラマブルコントローラ。
【請求項４】
前記インスタンス管理テーブルは、前記インスタンス領域の先頭アドレスと最終アドレスを持つことで、ハードウェア的手段、またはソフトウェア的手段により、アクセスアドレスの範囲をチェックすることを特徴とする請求項１〜３のいずれか１項に記載のプログラマブルコントローラ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ＪＩＳＢ３５０３（ＩＥＣ６１１３１−３）に規定される言語により演算を実行するプログラマブルコントローラに関わり、特にアプリケーションプログラムをＰＯＵ（Ｐｒｏｇｒａｍ  Ｏｒｇａｎｉｚａｔｉｏｎ  Ｕｎｉｔ）として定義して、それにデータ領域を割り付けて、実行可能としたインスタンスの管理方式に関わるものである。
【背景技術】
【０００２】
ＪＩＳＢ３５０３にはテキスト言語であるＩＬ（Ｉｎｓｔｒｕｃｔｉｏｎ  Ｌｉｓｔ）言語、ＳＴ（Ｓｔｒｕｃｔｕｒｅｄ  Ｔｅｘｔ）言語、グラフィック言語であるＬＤ（Ｌａｄｄｅｒ  Ｄｉａｇｒａｍ）言語、ＦＢＤ（Ｆｕｎｃｔｉｏｎ  Ｂｌｏｃｋ  Ｄｉａｇｒａｍ）がある。また、ＳＦＣ（Ｓｅｑｕｅｎｃｉａｌ  Ｆｕｎｃｔｉｏｎ  Ｃｈａｒｔ）はステップとトランジションにより、工程歩進的なプログラミングを実現するようになっている。
【０００３】
ＪＩＳＢ３５０３の基本思想にＰＯＵがある。ＪＩＳＢ３５０３ではＰＯＵをプログラム構成単位と翻訳している。ＰＯＵは図８で示すように、変数定義部とアルゴリズムを記述するボディ部から構成される。ＰＯＵでの変数は仮引数である。また、ボディ部は仮引数を使ったアルゴリズムが示される。ボディ部のプログラミングには上記の各種言語が使用できる。
【０００４】
このように、ＰＯＵはオブジェクト指向プログラミングでの型（クラス）に相当する。仮引数は複数あっても良く、入力変数、出力変数、入出力変数、内部変数、一時変数などに分類される。変数のメモリヘの割り付け方法やプログラムの表示方式によって、ＰＯＵはプログラム型、ファンクション型、ファンクションブロック型に分類される。更に、ＳＦＣで使用するアクションとトランジションもＰＯＵの型の１つと考えられる。ＰＯＵの変数定義と同じ構造を持ったデータ領域を確保して、それに名前（インスタンス名）をつけることで、ＰＯＵはインスタンスとして、実際に動作可能になる。同一構造のデータ領域を複数用意して、別々のインスタンス名を付けることで、アルゴリズムが同じで、処理対象が異なる複数のインスタンスを作成することができる。図９はその概念を示している。
【０００５】
ファンクション型ＰＯＵでの変数には内部変数がなく、出力変数は１つのみである。そのため、入力変数を一時変数領域（スタック等）にセットしてからＰＯＵのアルゴリズム部を実行させ、演算結果をリザルトレジスタに残すことにより、ユーザはデータ領域にインスタンスを用意する必要がない。
【０００６】
プログラム型とファンクションブロック型はデータ領域にインスタンスを個別に用意する必要がある。また、プログラム型とファンクションブロック型はＰＯＵでありながら、直接実行可能なＰＯＵインスタンスという形態をとることができる。これは変数領域の定義が直接アドレスを示している場合などに相当する。通常、プログラム型はＰＯＵインスタンスとして使用することが多い。
【０００７】
現状のプログラマブルコントローラは、予めＰＯＵを定義して、ＰＯＵ群として登録できるようになっている。アプリケーションプログラムでそのＰＯＵを使用する時に、そのＰＯＵのデータ型を持つ個別インスタンス名を割り付けている。インスタンス領域はユーザが直接アドレスを指定して固定物理アドレスに割り付けることが可能であるが、通常は固定物理アドレスを指定しない。この場合には、プログラム作成ツールにあるコンパイラが任意アドレスにインスタンスを割り付ける。このインスタンス領域はユーザからは直接アクセスできないようにする必要がある。ＰＯＵインスタンスの場合には直接アドレス領域にインスタンスを割り付けることがある。
【０００８】
通常のプログラマブルコントローラのインストラクション（演算命令）はデータメモリの物理アドレスを直接アクセスするようになっている。中にはインデックスレジスタ方式や間接アドレス方式でポインタを介してのアドレッシングができるものがある。しかし、間接アドレス方式でアクセス可能なデータメモリは、ユーザが直接アクセスできるデータ領域内になる。
【０００９】
図１０は通常のプログラマブルコントローラのデータメモリの構成を示している。入力データ領域（Ｉ）、出力データ領域（Ｑ）およびメモリデータ領域（Ｍ）のすべての領域がインストラクションにより、直接アドレッシング及び間接アドレッシングでアクセス可能である。インスタンス領域を割り付ける場合、この中のいずれかに割り付けることになる。
【００１０】
以上のように、ＰＯＵを使用したプログラマブルコントローラは、異なるインスタンスを用意することで異なるアプリケーションプログラムを構築することができ、またインスタンスの管理を適切に行うことでプログラムの実行を継続しながらプログラムの変更が可能となる（例えば特許文献１、特許文献２、特許文献３参照）。
【特許文献１】特開２００５−３０１５２０号公報
【特許文献２】特開平６−２４２８１０号公報
【特許文献３】特開平５−１５０８１４号公報
【発明の開示】
【発明が解決しようとする課題】
【００１１】
ＰＯＵやインスタンス動作を実現するためには、ＰＯＵ毎に用意したインスタンス領域をユーザが意識できない領域に用意する必要がある。通常のプログラマブルコントローラのインストラクションでは、どの領域でもアクセス可能であるので、それが困難である。また、通常のプログラマブルコントローラのインストラクションでは、データメモリ内部のいずれの領域でもアクセス可能であるので、１つのインスタンス領域内部のデータが、他のＰＯＵアルゴリズムから変更されてしまう可能性がある。
【００１２】
例えば、図１１に示すように、通常のプログラマブルコントローラのインストラクションでは、アクセスできないデータ領域を別途用意して、それをインスタンス領域とすることが考えられる。このインスタンス領域はＰＯＵ内のボディ部にあるインストラクションからのみアクセス可能とすれば、通常のインストラクションからインスタンス領域がアクセスされない。インスタンス領域はインスタンス毎に使用する領域が決まっている。つまり、インスタンス＃１領域を使用するＰＯＵアルゴリズムは他のインスタンス領域をアクセスしてはいけない。しかし、他のインスタンス領域をアクセスしたかどうかを演算実行中にチェックすることは困難である。
【００１３】
また、ＰＯＵインスタンスと通常のインスタンスを組み合わせた、アプリケーションプログラムを実現することはかなり複雑になる。
【００１４】
本発明の目的は、ＰＯＵを使用したアプリケーションプログラムの構築に、インスタンス管理を確実にするプログラマブルコントローラを提供することにある。
【課題を解決するための手段】
【００１５】
前記の課題を解決する本発明は、以下の構成を特徴とする。
【００１６】
（１）変数定義部と演算命令を記述するボディ部から構成されるＰＯＵ、およびＰＯＵインスタンスを使用してアプリケーションプログラムを構築したプログラマブルコントローラであって、
前記ＰＯＵインスタンスに付けた番号順にインスタンス管理データを並べたインスタンス管理テーブルと、前記ＰＯＵに番号に付けた番号順にＰＯＵ管理データを並べたＰＯＵ管理テーブルを設け、データメモリにはインスタンス領域とスタック領域を設け、
プログラム型ＰＯＵまたはファンクションブロック型ＰＯＵは、ＰＯＵインスタンス起動用ＣＡＬ命令を前記インスタンス管理テーブルの管理番号をオペランドとし、該インスタンス管理テーブルに示されるＰＯＵ管理番号から前記ＰＯＵ管理テーブルを参照し、目的のＰＯＵを起動することで、前記インスタンス領域を前記インスタンス管理テーブルを介して切替える手段を備えたことを特徴とする。
【００１７】
（２）前記スタックに一時変数を持つファンクション型ＰＯＵは、起動用ＣＡＬ命令では前記ＰＯＵ管理テーブルの管理番号をオペランドとし、前記インスタンス管理テーブルに示されるＰＯＵ管理番号からＰＯＵ管理テーブルを参照し、目的のＰＯＵを直接に起動する手段を備えたことを特徴とする。
【００１８】
（３）前記プログラム型ＰＯＵまたはファンクションブロック型ＰＯＵは、ＣＡＬ命令実行時に、演算チップの内部レジスタの内容をスタックにＰＵＳＨすることで、ＰＯＵインスタンス／ＰＯＵ単位に閉じたプログラムを構築することを特徴とする。
【００１９】
（４）前記インスタンス管理テーブルは、前記インスタンス領域の先頭アドレスと最終アドレスを持つことで、ハードウェア的手段、またはソフトウェア的手段により、アクセスアドレスの範囲をチェックすることを特徴とする。
【発明の効果】
【００２０】
以上のとおり、本発明によれば、ＰＯＵを使用したアプリケーションプログラムの構築に、インスタンス管理を確実にする効果が得られる。具体的には、
（１）ＪＩＳＢ３５０３が規定するＰＯＵとインスタンスの概念に沿った演算方式が実現できる。
【００２１】
（２）インスタンス管理テーブルとＰＯＵ管理テーブルを使用することで、ＰＯＵインスタンスとＰＯＵの組み合わせプログラムが自由に構成できる。
【００２２】
（３）プログラム型ＰＯＵまたはファンクションブロックＰＯＵは、インスタンス管理テーブルを介してＣＡＬされ、さらにインスタンス管理テーブルに示されるＰＯＵ管理番号からＰＯＵ管理テーブルが参照され、目的のＰＯＵが起動する。このことから、データメモリにあるインスタンス領域をインスタンス管理テーブルを介して切替えることができ、同じＰＯＵを起動しても、相互にインスタンス領域を分けることが容易になる。
【００２３】
（４）ファンクション型ＰＯＵの場合はスタックに一時変数を持つので、データメモリ領域にインスタンス領域を割り付ける必要がない。そのため、ファンクション型ＰＯＵはインスタンス管理テーブルを介してＰＯＵを起動する必要がなく、ＰＯＵ管理テーブルを直接介して起動できる。このため、プログラム型ＰＯＵやファンクションブロックＰＯＵに比べて、起動処理が簡単になる。
【００２４】
（５）ＣＡＬ命令実行時に、演算チップ内部レジスタの内容をスタックにＰＵＳＨすることで、呼び出されたＰＯＵインスタンスやＰＯＵでレジスタが変更されても良いので、ＰＯＵインスタンス／ＰＯＵ単位に閉じたプログラムとすることができる。このことはオブジェクト指向プログラミングの意図に沿うものである。
【００２５】
（６）インスタンス管理テーブルにデータメモリのインスタンス領域の先頭アドレスと最終アドレスを持つことで、ハードウェア的手段または、ソフトウェア的手段により、アクセスアドレスの範囲チェックが可能になり、アプリケーションプログラムやコンパイラのデバッグに資することができる。
【発明を実施するための最良の形態】
【００２６】
図１は、本発明の実施形態を示すプログラマブルコントローラの要部構成図であり、データメモリのインスタンス領域のアクセスを、ＰＯＵインスタンス毎に管理でき、ファンクション型、プログラム型、ファンクションブロック型のいずれのＰＯＵにも対応可能とするもので、各部は以下の機能構成および領域をもつ。
【００２７】
演算チップ１０は、演算を行うＬＳＩであり、プログラムメモリ２０内に置かれたインストラクションを順番に読み込んで、インストラクションのオペランドで指定されたデータに対する演算を行う。演算対象データとしては、データメモリ３０内のデータや演算チップ内部レジスタがある。演算チップ１０内のレジスタ１１は、１ビット、８ビット、１６ビット、３２ビット、６４ビット単位にアクセスできる。また、このレジスタ１１の内容をデータメモリアドレスとしたポインタとして使用することができる。レジスタ１１の１つはリザルトレジスタとして、演算結果が保持される。
【００２８】
プログラムメモリ２０は、メインプログラム２１やＰＯＵ２２、ＰＯＵインスタンス２３が各領域に格納され、そのボディ部には演算命令（インストラクション）が置かれる。また、プログラムメモリ２０にはインスタンス管理テーブル２４とＰＯＵ管理テーブル２５が置かれる。インスタンス管理テーブル２４は、ＰＯＵインスタンス２３に番号を付けて、その番号順にインスタンス管理データを並べたテーブルである。ＰＯＵ管理テーブル２５は、ＰＯＵ２２に番号を付けて、その番号順にＰＯＵ管理データを並べたテーブルである。
【００２９】
データメモリ３０は、インストラクションの演算対象となる入力データ（Ｉ）３１、出力データ（Ｑ）３２およびメモリデータ（Ｍ）３３が各領域に格納される。また、データメモリ３０にはインスタンス（ＩＮＳ）３４とスタック３５がそれぞれの領域に置かれる。
【００３０】
以下に、インスタンス管理テーブル２４、ＰＯＵ管理テーブル２５、ＰＯＵインスタンス２３、ＰＯＵ２２、インスタンスデータなどを使った演算動作を具体的に説明する。なお、ＰＯＵインスタンス２３はメインプログラム２１からのＣＡＬ命令で呼び出されるものとする。
【００３１】
（１）ファンクション型ＰＯＵの実行
図２と図３によって、ファンクション型ＰＯＵの起動処理を説明する。図２において、メインプログラム２１でインスタンス＃１（ＩＮＳ＃１）がＣＡＬ命令で呼び出されると、インスタンス管理テーブル２４の＃１エントリが参照される。インスタンス＃１はプログラム型ＰＯＵインスタンスであり、この中にはデータメモリ３０のインスタンス３４領域に置かれるインスタンス＃１領域の先頭アドレスと、プログラムメモリ２０のＰＯＵインスタンス２３領域に置かれるインスタンス＃１の先頭アドレスが示される。
【００３２】
ＣＡＬ命令では、現状のスタックポインタ（ＳＰ：演算チップ１０内部レジスタの１つ）が示すスタック３５領域に戻り、アドレスをＰＵＳＨして、データメモリ３０のインスタンス３４領域の先頭アドレスを演算チップ１０内レジスタにセットする。そのレジスタをインスタンスポインタ（ＩＰ）とする。そして、ＰＯＵインスタンス＃１のボディ部の先頭アドレスにＪＭＰする。
【００３３】
この例の場合、インスタンス＃１のボディ部にはファンクション型ＰＯＵであるＦＮＣ＃１を呼び出すＣＡＬ命令がある。このＣＡＬ命令では、現状のスタックポインタ（ＳＰ）が示すスタック領域にＦＮＣ＃１の入力パラメータとインスタンス＃１への戻りアドレスをＰＵＳＨして、ＣＡＬ命令のオペランドが示すＰＯＵ管理テーブル２５のＰＯＵ＃１エントリを参照する。このテーブルにはＰＯＵ＃１がファンクション型であることを示すデータがあり、ＰＯＵ＃１のアドレスが示される。そのアドレスが示すＰＯＵ２２の＃１ボディ部の先頭アドレスにＪＭＰする。ＰＯＵ＃１はファンクション型ＰＯＵであり、現状のスタック領域を一時変数領域として演算を行い、演算結果を演算チップ１０内部のリザルトレジスタに残す。ＰＯＵ＃１ボディ部の最後にはＲＥＴ命令があり、スタック３５領域にセーブされていたインスタンス＃１のアドレスに戻ることができる。
【００３４】
図２において、インスタンス＃１には更に、ＣＡＬＦＮＣ＃２があり、上記と同様な処理でＦＮＣ２が起動される。インスタンス＃１があるボディ部の最後にはＲＥＴ命令があり、メインプログラム２１に戻る。
【００３５】
このように、プログラムメモリ２０のＰＯＵインスタンス２３の中からファンクション型インスタンスをＣＡＬする場合には、現状のスタックポインタ（ＳＰ）を使って、入力パラメータをスタック３５領域にＰＵＳＨしてから、ＰＯＵ管理テーブル２５に登録されたＰＯＵ管理番号をオペランドとするＣＡＬ命令を使う。ＰＯＵ管理テーブル２５にはそのアルゴリズムを実行するＰＯＵ番号が格納されている。即ち、ＰＯＵが起動される時には、図３のように、スタックには入力パラメータと戻りアドレスがＰＵＳＨされ、そのアドレスがスタックポインタ（ＳＰ）にセットされていることになる。
【００３６】
以上のように、ファンクション型ＰＯＵの場合はスタックに一時変数を持つので、データメモリ領域にインスタンス領域を割り付ける必要がない。そのため、ファンクション型ＰＯＵはインスタンス管理テーブルを介してＰＯＵを起動する必要がなく、ＰＯＵ管理テーブルを直接介して起動できる。このため、後述のプログラム型ＰＯＵやファンクションブロックＰＯＵに比べて、起動処理が簡単になる。
【００３７】
（２）プログラム型ＰＯＵ、ファンクションブロック型ＰＯＵの実行
図４の例に従って、プログラム型及びファンクションブロック型ＰＯＵの起動処理を説明する。メインプログラム２１でインスタンス＃１（ＩＮＳ＃１）がＣＡＬ命令で呼び出されると、インスタンス管理テーブル２４の＃１エントリが参照される。インスタンス＃１はプログラム型ＰＯＵインスタンスである。この中にはデータメモリ３０のインスタンス＃１領域先頭アドレスと、プログラムメモリのＰＯＵインスタンス＃１の先頭アドレスが示される。
【００３８】
ＣＡＬ命令では、現状のスタックポインタ（ＳＰ：演算チップ１０内部レジスタの１つ）が示すスタック３５領域に戻り、アドレスをＰＵＳＨして、データメモリ３０のインスタンス３４領域の先頭アドレスを演算チップ１０内レジスタ１１にセットする。そのレジスタ１１をインスタンスポインタ（ＩＰ）とする。そして、インスタンス＃１ボディ部の先頭アドレスにＪＭＰする。
【００３９】
この例の場合、インスタンス＃１のボディ部にはファンクションブロック型ＰＯＵであるＦＢ＃２を呼び出すＣＡＬ命令がある。ＦＢ＃２はＰＯＵインスタンスである。したがって、このＣＡＬ命令では、現状のスタックポインタ（ＳＰ）が示すスタック３５領域に戻り、アドレスをＰＵＳＨして、ＣＡＬ命令のオペランドが示すインスタンス管理テーブル２４のインスタンス＃２（ＦＢ）エントリを参照する。このインスタンス管理テーブル２４にはＰＯＵ＃２がファンクションブロック型であることを示すデータがあり、そのＰＯＵインスタンスの元となっているＰＯＵ＃２管理番号が示される。また、インスタンス＃２用データメモリインスタンス領域先頭アドレスが示されている。このアドレスは演算チップ内部のインスタンスレジスタ（ＩＰ）にセットされる。
【００４０】
ＦＢ＃２用ＣＡＬ命令でインスタンス管理テーブル２４に示されるＰＯＵ管理番号が示すＰＯＵ管理テーブル２５のエントリが参照される。この例の場合には、ＰＯＵ管理テーブルの２番目が参照され、そこに示されたＰＯＵ２２のＰＯＵ＃２のＦＢ２のボディ部の先頭アドレスにＪＭＰする。
【００４１】
ＰＯＵ＃２（ＦＢ）はファンクションブロック型ＰＯＵであり、インスタンス管理テーブル２４が示すインスタンス３４領域を使って演算を行い、演算結果をインスタンス３４領域の出力変数領域や内部変数領域に残す。ＰＯＵ２２のボディ部の最後にはＲＥＴ命令があり、スタック領域にセーブされていたＰＯＵインスタンス２３のインスタンス＃１アドレスに戻ることができる。更に、インスタンス＃１ボディ部の最後にはＲＥＴ命令があり、メインプログラム２１に戻る。
【００４２】
このように、プログラムインスタンスの中から別のプログラムインスタンスやファンクションブロックインスタンスをＣＡＬする場合には、インスタンス管理番号をオペランドとするＣＡＬ命令を使う。インスタンス管理テーブルにはそのＰＯＵインスタンスが使用するデータメモリのインスタンス領域先頭アドレスと、アルゴリズムを実行するＰＯＵ番号が格納されている。すなわち、図５のように、ＰＯＵが起動される時にはインスタンス領域３４の先頭アドレスがインスタンスポインタ（ＩＰ）にセットされていることになる。
【００４３】
以上のように、プログラム型ＰＯＵやファンクションブロックＰＯＵはインスタンス管理テーブルを介してＣＡＬされる。更に、インスタンス管理テーブルに示されるＰＯＵ管理番号からＰＯＵ管理テーブルが参照され、目的のＰＯＵが起動する。このことから、データメモリにあるインスタンス領域をインスタンス管理テーブルを介して切替えることができ、同じＰＯＵを起動しても、相互にインスタンス領域を分けることが容易になる。
【００４４】
（３）プログラム型やファンクションブロック型のＰＯＵインスタンスの起動
この場合には、インスタンス管理番号をオペランドとするＣＡＬ命令を使用する。この命令では指定されたインスタンス管理テーブル２４に示された、データメモリ３０のインスタンス３４領域の先頭アドレスをインスタンスポインタ（ＩＰ）にセットする。ＰＯＵインスタンス２３の中で別のＰＯＵインスタンスがＣＡＬされると、それまで使っていたＩＰが書き換わってしまう。そのため、図６のように、ＰＯＵインスタンスを起動するＣＡＬ命令の場合には戻りアドレスだけでなく、現状のＩＰもスタック３５にＰＵＳＨする必要がある。
【００４５】
同様に、新たに起動されたＰＯＵインスタンス２３では演算チップ１０内部にある各種レジスタの内容を変更する可能性がある。すると、呼び出し元のＰＯＵインスタンスに戻ってきた時に、レジスタの内容が変わってしまう。そのため、図７のように、ＰＯＵインスタンスを起動するＣＡＬ命令の場合には戻りアドレスだけでなく、現状の各種レジスタの全部をスタック３５にＰＵＳＨする必要がある。これはファンクション型ＰＯＵをＣＡＬする場合にも当てはまる。
【００４６】
以上のように、ＣＡＬ命令実行時に、演算チップの内部レジスタの内容をスタックにＰＵＳＨすることで、呼び出されたＰＯＵインスタンスやＰＯＵでレジスタが変更されても良いので、ＰＯＵインスタンス／ＰＯＵ単位に閉じたプログラムとすることができる。このことはオブジェクト指向プログラミングの意図に沿うものである。
【００４７】
（４）インスタンス領域のアクセス範囲チェック
通常は現在動作中のＰＯＵインスタンスやＰＯＵがアクセスするデータメモリ３０のインスタンス領域は範囲が決まっている。他のインスタンス領域をアクセスすると、他ＰＯＵインスタンスや他ＰＯＵの演算が正しく行われない。
【００４８】
そこで、インスタンス管理テーブル２４に、そのＰＯＵインスタンスが使用するインスタンス領域の先頭アドレスと最終アドレスをセットしておき、ＰＯＵの演算中にその範囲外をアクセスしたことを検出できるようにする。
【００４９】
検出方法としては、Ｈ／Ｗレジスタに先頭アドレスと最終アドレスをセットしておいて、Ｈ／Ｗのアドレス比較回路によって検出する方法がある。また、Ｈ／Ｗでなく、インストラクション実行中にアドレスチェックをインストラクション用マイクロプログラムやファームウェアで検出する方法がある。これらを実施することで、アプリケーションプログラムのデバッグやコンパイラのコンパイル間違いなどを即座に検出することができる。
【００５０】
以上のように、インスタンス管理テーブルにデータメモリのインスタンス領域の先頭アドレスと最終アドレスを持つことで、Ｈ／Ｗ的手段または、Ｓ／Ｗ的手段により、アクセスアドレスの範囲チェックが可能になり、アプリケーションプログラムやコンパイラのデバッグに資することができる。
【図面の簡単な説明】
【００５１】
【図１】本発明の実施形態を示すプログラマブルコントローラの要部構成図。
【図２】ファンクション型ＰＯＵの動作例。
【図３】ファンクション型ＰＯＵ起動時のスタック内容。
【図４】プログラム型、ファンクションブロック型ＰＯＵの動作例。
【図５】プログラム型、ファンクションブロック型ＰＯＵ起動時のスタックとインスタンス領域の内容。
【図６】プログラム型、ファンクションブロック型ＰＯＵ起動時のスタックとインスタンス領域の内容。
【図７】プログラム型、ファンクションブロック型ＰＯＵ起動時のスタックとインスタンス領域の内容。
【図８】ＰＯＵの構成例。
【図９】インスタンスの複製例。
【図１０】通常のデータメモリ構成。
【図１１】インスタンス領域を追加したデータメモリの構成。
【符号の説明】
【００５２】
１０  演算チップ
２０  プログラムメモリ
３０  データメモリ
１１  レジスタ
２１  メインプログラム
２２  ＰＯＵ
２３  ＰＯＵインスタンス
２４  インスタンス管理テーブル
２５  ＰＯＵ管理テーブル
３１  入力データ（Ｉ）
３２  出力データ（Ｑ）
３３  メモリデータ（Ｍ）
３４  インスタンス（ＩＮＳ）
３５  スタック
【図１】
2008040996.tif 000003
【図２】
2008040996.tif 000004
【図３】
2008040996.tif 000005
【図４】
2008040996.tif 000006
【図５】
2008040996.tif 000007
【図６】
2008040996.tif 000008
【図７】
2008040996.tif 000009
【図８】
2008040996.tif 000010
【図９】
2008040996.tif 000011
【図１０】
2008040996.tif 000012
【図１１】
2008040996.tif 000013