(57)【特許請求の範囲】
【請求項１】
シーケンス制御プログラムの各ステップのうち、高速処理を必要とするステップにマークを付加し、前記マークが付加された高速ステップと前記マークが付加されていない通常ステップを分離して高速及び通常中間コードを生成し、さらに前記各中間コードから高速実行プログラム及び通常実行プログラムを生成し、前記高速実行プログラムと通常実行プログラムとの間で実行中ステップの同期をとりながら前記高速実行プログラムを実行するようにしたことを特徴とする高速シーケンス制御方法。
【請求項２】
前記高速実行プログラムは、前記高速ステップのコマンド列を格納するためのコマンドリストと、現在のステップの終了条件、次に実行するステップの番号、及び前記コマンドリストの次に実行されるコマンド列のエントリアドレスを格納するための制御テーブルと、各ステップの前記制御テーブルのエントリアドレスを格納するためのエントリテーブルとから構成された高速シーケンス制御テーブルであることを特徴とする請求項１に記載の高速シーケンス制御方法。
【請求項３】
前記高速実行プログラムと通常実行プログラムを同一のプロセッサにより処理するとともに、前記高速実行プログラムは前記プロセッサへの割り込みにより実行されることを特徴とする請求項１に記載の高速シーケンス制御方法。
【請求項４】
各ステップのうち、高速処理を必要とするステップにマークを付したシーケンス制御プログラムを用いて高速シーケンス制御を行うための高速シーケンス制御装置であって、
前記マークが付加された高速ステップと前記マークが付加されていない通常ステップを分離して高速及び通常中間コードを生成するための中間コード生成手段と、
前記各中間コードから高速実行プログラム及び通常実行プログラムを生成するための実行プログラム生成手段と、
前記高速実行プログラムと通常実行プログラムとの間で実行中ステップの同期をとりながら前記高速実行プログラムを実行するためのプロセッサと、
を備えたことを特徴とする高速シーケンス制御装置。
【請求項５】
前記プロセッサは前記高速実行プログラムと合わせて前記通常実行部を実行するとともに、前記高速実行プログラムを前記プロセッサへの割り込みにより起動するための割り込み手段を備えたことを特徴とする請求項４に記載の高速シーケンス制御装置。
【請求項６】
前記高速実行プログラムと通常実行プログラムが実行中ステップの番号を共有するための記憶手段を設けたことを特徴とする請求項５に記載の高速シーケンス制御装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、高速シーケンス制御方法とその装置、及びプログラム作成方法に係わり、特に、一連のシーケンス中で高速な応答を要するステップをマークで指定するだけで、高速シーケンス制御テーブルを自動的に生成し、この制御テーブルを用いて高速シーケンス制御を行うようにした高速シーケンス制御方法とその装置、及びそのためのプログラム作成方法に関する。
【０００２】
【従来の技術】
従来のシーケンス制御方法に於て、多くの場合、プログラマブルコントローラと称される機器制御専用のコンピュータが用いられ、これに制御対象の動作仕様に応じた専用の制御プログラムを入力して、機器のシーケンス制御を行っていた。上記制御プログラムは、ラダー図やＳＦＣ（Ｓｅｑｅｎｔｉａｌ  Ｆｕｎｃｔｉｏｎ  Ｃｈａｒｔ）などによって記述されるが、特に高速応答を要する処理は、通常のプログラムとは別の割込みプログラムとして記述する必要があった。この割込みプログラムを用いたシーケンス制御方法に関する公知例としては、「日立プログラマブルコントローラ  ＨＩＤＩＣ  Ｈシリーズ  ＣＰＵモジュール取扱説明書（ソフトウェア編）ＮＢ３２３Ｃ」（日立製作所、１９９５年）のＰＰ．１５−３０に記載されているシーケンス制御方法が挙げられる。以下、この割り込みプログラムを用いたときの動作例を説明する。
【０００３】
図２は、プログラマブルコントローラにおけるスキャン処理のサイクルと入力信号の状態変化のサイクルの関係を示すタイミングチャートであり、入力信号の状態変化のサイクルが、スキャン処理の１サイクル、すなわちスキャンタイムに比べて長い場合を示す。ここで、スキャン処理２０２で処理されるプログラム中には、入力信号２０１がＯＦＦからＯＮになる事象、いわゆる立ち上がりを検出する処理が記述されており、１サイクルのスキャン処理中に、この処理が実行されるタイミング２０３を上向き矢印で示した。図２では、入力信号２０１の立ち上がりを完全に捕らえていることが分かる。
【０００４】
一方、図３は、入力信号の状態変化のサイクルがスキャンタイムに比べて短い場合を示している。スキャン処理されるプログラムは、図２と同じとする。図３では、入力信号３０１の変化が高速なために、スキャン処理３０２がこれに追従できず、入力信号３０１の立ち上がりの検出もれ３０４が発生している。
【０００５】
図４は、このようにスキャン処理では追従が困難となる高速な状態変化に対応するため、割込み処理を併用した場合を示す。割込み処理４０２は、一定周期で割込みを入れるタイマなどをきっかけに起動される処理であり、割込みの周期は入力信号４０１の変化に追従できるものとする。割込み処理４０２で処理されるプログラムの中には、入力信号４０１の立ち上がりを検出する処理が記述されており、この処理のタイミング４０３を上向き矢印で示した。図４では、入力信号４０１の立ち上がりをもれなく捕らえている。なお、割込み処理４０２の１サイクルは、割込み周期そのものよりも短いものとする。また、通常のスキャン処理４０４で処理されるプログラムには、割込み処理４０２で処理されるプログラムに記述される処理を除いた、その他の処理が記述される。ここで、スキャン処理４０４自体は、割込み処理４０２に割込まれるために、断続的となり、スキャンタイムは図２や図３のときよりも長くなるが、システムのトータル性能を考えると、入力信号４０１への応答性は向上する。
【０００６】
【発明が解決しようとする課題】
上記した従来技術では、高速応答を要する処理を、通常シーケンスとは別の割込みプログラムとして記述しているが、このような高速応答を要する処理でも、他の通常シーケンスの処理と頻繁に同期をとる必要があり、一連のシーケンスとして見ると、高速応答を要する処理は、実質的に通常シーケンスの中に混在していることが多い。このため、従来のように通常シーケンスと高速応答を要する処理とを初めから分離して記述する方法では、プログラムの記述自体が複雑になり、その結果として、一連のシーケンスとしての見易さが損なわれ、シーケンスの変更も困難になるという問題があった。
【０００７】
そこで、本発明では、一連のシーケンスを記述する際、特に高速応答を要するステップを高速処理を示すマークで指定しておき、通常シーケンスと高速シーケンスがステップのレベルで混在したシーケンス制御プログラムから、高速シーケンス制御テーブルを自動的に生成し、この高速シーケンス制御テーブルを用いて、高速シーケンスを制御するようにした高速シーケンス制御方法とその装置、及びそのためのプログラム作成方法を提供することを目的とする。
【０００８】
【課題を解決するための手段】
上記の目的を達成するために、本発明は、シーケンス制御プログラムの各ステップのうち、高速処理を必要とするステップにマークを付加し、前記マークが付加された高速ステップと前記マークが付加されていない通常ステップを分離して高速及び通常中間コードを生成し、さらに前記各中間コードから高速実行プログラム及び通常実行プログラムを生成し、前記高速実行プログラムと通常実行プログラムとの間で実行中ステップの同期をとりながら前記高速実行プログラムを実行するようにしたことを特徴とする高速シーケンス制御方法を開示する。
【０００９】
また、本発明は、前記高速実行プログラムが、前記高速ステップのコマンド列を格納するためのコマンドリストと、現在のステップの終了条件、次に実行するステップの番号、及び前記コマンドリストの次に実行されるコマンド列のエントリアドレスを格納するための制御テーブルと、各ステップの前記制御テーブルのエントリアドレスを格納するためのエントリテーブルとから構成された高速シーケンス制御テーブルであることを特徴とする高速シーケンス制御方法を開示する。
【００１１】
さらに、本発明は、上記のシーケンス制御プログラムの作成方法により作成されたシーケンス制御プログラムを用いて高速シーケンス制御を行うための高速シーケンス制御装置であって、
前記マークが付加された高速ステップと前記マークが付加されていない通常ステップを分離して高速及び通常中間コードを生成するための中間コード生成手段と、
前記各中間コードから高速実行プログラム及び通常実行プログラムを生成するための実行プログラム生成手段と、
前記高速実行プログラムと通常実行プログラムとの間で実行中ステップの同期をとりながら前記高速実行プログラムを実行するためのプロセッサと、
を備えたことを特徴とする高速シーケンス制御装置を開示する。
【００１２】
【発明の実施の形態】
以下、本発明の実施の形態を詳細に説明する。
図１は、本発明に係る、高速シーケンス制御方法に於ける処理の流れを模式的に示すブロック図である。まず、シーケンス制御プログラム編集手段１０１によって、一連のシーケンス制御プログラム１０２を作成するとともに、特に高速応答を要するステップには、高速処理を意味するマークをつけておく。こうして作成したシーケンス制御プログラム１０２は、シーケンス制御プログラム変換手段１０３によって、通常シーケンス制御内部コード１０４と、高速シーケンス制御テーブル１０５に分離、変換される。高速シーケンス制御テーブル１０５には、マークで指定した高速応答を要する処理、すなわち高速シーケンスを制御するためのデータが高速処理に適したテーブル形式で格納される。一方、通常シーケンス制御内部コード１０４には、高速シーケンス制御テーブル１０５に割り振られた高速シーケンス以外の処理、すなわち通常シーケンスの内部コード列（実行形式プログラム）が格納される。ここで、通常シーケンス制御内部コード実行手段１０６によって、通常シーケンス制御内部コード１０４は、解釈、実行される。さらに、これと並行して、高速シーケンス制御テーブル処理手段１０７によって、高速シーケンス制御テーブル１０５は処理される。このように、シーケンス制御プログラム１０２を作成する際、高速応答を要するステップをマークで指定しておくだけで、高速シーケンス制御テーブル１０５を自動的に生成することができるようにすることによって、高速応答を要する処理が混在したシーケンスを、一連のシーケンスとしての見易さを損なうことのない自然な形で、容易に記述できる。すなわち、従来よりもシーケンスの作成と変更が容易になるため、プログラムの開発効率と保守性が向上する。
【００１３】
図５は、図１のシーケンス制御プログラム編集手段１０１によって記述されるシーケンス制御プログラム１０２の一例を示す。図５では、一連のシーケンスをペトリネットの形式で表現する、グラフィック型のプログラミング言語を用いており、このような言語に関する公知例としては、特開平７−７２９２０号公報に記載されているセル制御言語が挙げられる。このセル制御言語では、ペトリネットのプレース（図中、○で表記する）を、ＦＡ（ファクトリー・オートメーション）システムのセルを構成する機器（以下、ユニットとする）の１ステップあたりの動作と定義して、各プレースをステップの整理番号であるステップＮＯ．（例えば、Ｓ１００）により区別する。また、トランジション（図中、  で表記する）を次ステップへの遷移条件と定義する。さらに、トークン（図中、表記せず）のあるプレースを実行中のステップとし、各プレースには高々一個のトークンしか入らない、いわゆるセーフペトリネットを考える。
【００１４】
図５のプレース５０１のステップＮＯ．はＳ１０２であり、そのステップでのユニットの動作は、図１のシーケンス制御プログラム編集手段１０１を用いて、コマンド列として記述される。また、プレース５０１の出力側のトランジション５０２、５０３、５０４は、それぞれステップＳ１０２の終了条件ＯＫ１、ＯＫ２、ＯＫ３を遷移条件とし、各終了条件ＯＫ１、ＯＫ２、ＯＫ３は、シーケンス制御プログラム編集手段１０１を用いて、入出力信号などに関する条件式として記述される。なお、図５は、シーケンス表記のみを示し、これらのコマンド列、条件式は表記されていない（コマンド列、条件式の例は後述する）。
【００１５】
本発明では、上記のようなセル制御言語の使用を少し拡張し、高速処理を要するプレースにマークを付ける。例えばプレース５０５は、プレース５０１のような通常のプレース記号（図中、○で表記する）の右上に角型のマークを付けたものであり、このプレースの入力側のトランジション（プレース５０５の場合、トランジション５０３）の状態遷移に対し、高速に応答する必要があることを意味する。このマークをプレースの高速オプションと呼ぶことにする。このように、一連のシーケンスのうち、部分的に高速な応答が必要なところがある場合、この高速オプションをプレースに付けるだけで、そのステップは高速シーケンスとして処理されることになる。例えば上記プレース５０５では、その入力側トランジション５０３の遷移条件、すなわちステップＳ１０２の終了条件ＯＫ２が成立するかどうかの監視を、図４の割込み処理４０２の中で行い、もし終了条件ＯＫ２が成立していれば、ステップＳ１０５の動作を定義するコマンド列を実行するようになっており、状態変化に対する高速応答が可能となる。また、高速オプションの付かない通常のプレースのステップは、通常のスキャン処理の中で実行されることになる。
【００１６】
このように一連のシーケンス中で、特に高速応答を要するステップにマークを付加して区別する表記方法は、ＳＦＣのような従来技術にも用意されていない。そこで、ＳＦＣ表記に同様の拡張を行った例を図６に示す。図６では、ＳＦＣのステップ要素（図中、□で表記する）の右上の角を三角形状に塗りつぶすことにより、図５の高速オプションと同じ意味を持たせた。例えば、ステップ６０１（Ｓ１０５）は高速オプション付きであり、その入力側のトランジション（ｔ１０２２）で記述された条件の監視は割込み処理の中で行う。なお、ＳＦＣはペトリネットを起源とする表記であり、以下のペトリネットを例とした説明は、ＳＦＣを用いた場合にも同様に成り立つものである。
【００１７】
また、図５のようなペトリネットを記述する際、シーケンス制御プログラム編集手段１０１では、各ステップにおける動作をコマンド列で、各トランジションの遷移条件を条件式で記述することを前提としているが、仮にこれらを従来のラダー図、ファンクションブロックダイヤグラムなどで記述する場合でも、以下に述べる高速シーケンス制御方法は同様に実現可能である。
【００１８】
図７は、図５のシーケンス制御プログラム１０２をコード化したものを示し、図５のペトリネット表記と一対一に対応した構造を持つ。図１のシーケンス制御プログラム編集手段１０１では、シーケンス制御プログラム１０２を図５のペトリネット形式で編集し、最終的には図７のようにコード形式で保存するものとする。ここで、ペトリネット形式からコード形式への変換は、シーケンス制御プログラム編集手段１０１の処理で自動的に行われる。さらに、シーケンス制御プログラム変換手段１０３では、図７のようなコード形式のシーケンス制御プログラム１０２を入力として処理するものとする。
【００１９】
図７のシーケンス制御プログラムは、大きく分けると二つのブロックで構成される。一つは通常シーケンスブロック７０１で、もう一つは＃ＩＮＴＥＲＲＵＰＴ文７０３で始まる高速シーケンスブロック７０２である。高速シーケンスブロック７０２は、図５のペトリネットのプレースのうち、高速オプションの付いているプレースに関する記述を集めたものであり、通常シーケンスブロック７０１は、それ以外のプレースに関する記述を集めたものである。さらに、通常シーケンスブロック７０１と高速シーケンスブロック７０２は、それぞれ”ｃｅｌｌ”文７０６で始まるｃｅｌｌブロック７０４と、”ｄｅｆ”  文７０７で始まるｄｅｆブロック７０５で構成される。ｃｅｌｌブロック７０４には、プレースとトランジションの接続関係、すなわちペトリネットの構造と、各プレースでの処理が含まれている。ｃｅｌｌラベル７０８には、各プレースのステップＮＯ．（Ｓ１０１）と、そのステップの動作主体のユニットＮＯ．（ＵＮＩＴ１）が記述される。遷移条件式７０９には、そのプレースの入力側のトランジションに入力として接続されるプレースのステップＮＯ．（Ｓ１００）と終了条件名称（ＯＫ１）が記述される。なお、図５のＳ１０８のように、入力側のトランジションが複数ある場合、そのトランジションに入力として接続されるプレースのステップＮＯ．と終了条件名称が、ＯＲを意味する記号  ”｜”の後に記述される。コマンド列７１０には、１ステップあたりの処理を定義するコマンドが記述される。ｄｅｆブロック７０５には、各プレースのステップの終了条件を定義する条件式が含まれている。ｄｅｆラベル７１１には、各プレースのステップＮＯ．（Ｓ１０１）が記述される。終了条件式７１２には、各ステップの終了条件名称（ＯＫ１）と、それを定義する条件式が記述される。また、図５のＳ１０２のように、終了条件が何通りかあるステップの場合、複数の終了条件名称と条件式が記述されることになる。なお、高速シーケンスブロック７０２の記述も、以上に述べた通常シーケンスブロック７０１と同様である。
【００２０】
また、図７（すなわち図５）のシーケンス制御プログラムは、そのシーケンスの動作主体であるユニット毎にモジュール化されている。例えば、図７はＵＮＩＴ１のモジュールを示す。このようにシーケンス制御プログラム１０２の各モジュールは、ユニットＮＯ．により区別される。
【００２１】
図８は、図１のシーケンス制御プログラム変換手段１０３の処理を示すフローチャートである。シーケンス制御プログラム変換手段１０３では、まず、入力されたシーケンス制御プログラム１０２を解析し（処理８０１）、この解析で得られた情報に基づいて、シーケンス制御中間コードを生成する（処理８０２）。次に、このシーケンス制御中間コードから、通常シーケンス制御内部コード１０４と、高速シーケンス制御テーブル１０５を生成する（処理８０３、８０４）。
【００２２】
図９は、シーケンス制御プログラム解析の処理８０１の詳細なフローチャートである。今、図７のシーケンス制御プログラムが入力されたとすると、まず、通常シーケンスブロック７０１のペトリネット構造、コマンド列、終了条件を格納するデータ領域を確保する（処理９０１）。次に、通常シーケンスブロック７０１のｃｅｌｌブロック７０４、ｄｅｆブロック７０５を順に解析する。ｃｅｌｌブロック７０４の解析では、未処理のプレースを１つ取り出し（処理９０９）、そのプレースのペトリネット構造を解析し（処理９０２）、さらにコマンド列７１０等を解析する（処理９０３）。このような解析を次のプレースの記述がなくなるまで繰り返す（処理９０４）。次のｄｅｆブロック７０５の解析では、未処理のプレースを１つ取り出し（処理９１０）、そのプレースの終了条件式７１２等を解析し（処理９０５）、これを次のプレースの記述がなくなるまで繰り返す（処理９０６）。以上の処理で、通常シーケンスブロック７０１の解析は終了するが、続いて＃ＩＮＴＥＲＲＵＰＴ文７０３が記述されていれば（処理９０７）、高速シーケンスブロック７０２があることが分かるので、その解析のためのデータ領域を確保し（処理９０８）、以下、通常シーケンスブロック７０１と同様の処理を行う。
【００２３】
図１０は、図９に於ける１プレース毎のネット構造解析の処理９０２の詳細なフローチャートである。このネット構造解析は、ｃｅｌｌラベル７０８等と遷移条件式７０９等の解析を行う。ｃｅｌｌラベル７０８等の解析では、現在処理中のプレース（以下、現プレース）のステップＮＯ．を抽出し（処理１００１）、さらに現プレースのユニットＮＯ．を抽出する（処理１００２）。遷移条件式７０９の解析では、未処理の遷移条件式を１つ取り出し（処理１００６）、現プレースの入力側のトランジションに、入力として接続されるプレース、すなわち一つ前のプレース（以下、前プレース）のステップＮＯ．を抽出し（処理１００３）、さらに前プレースの終了条件名称を抽出する（処理１００４）。さらに現プレースに他の遷移条件式７０９があれば、処理１００３、１００４を繰り返す（処理１００５）。なお、現プレースに遷移条件式７０９が複数あるということは、現プレースの入力側のトランジションが複数あるということに相当する。
【００２４】
図１１は、図９に於ける１プレース毎のコマンド列解析の処理９０３の詳細なフローチャートである。このコマンド列解析では、現プレースのコマンド列７１０等から、コマンドを一つずつ抽出し（処理１１０１）、これを次のコマンドがなくなるまで繰り返す（処理１１０２）。
【００２５】
図１２は、図９に於ける１プレース毎の終了条件解析の処理９０５の詳細なフローチャートである。この終了条件解析では、ｄｅｆラベル７１１等から現プレースのステップＮＯ．を抽出し（処理１２０１）、未処理のＯＫ条件を１つ取り出し（処理１２０６）、さらに終了条件式７１２等の抽出を行う（処理１２０２）。この処理を当該プレースのＯＫ条件がなくなるまで繰り返す（処理１２０３）。なお、終了条件式７１２等は、正常終了を示すＯＫｎの終了条件を定義する条件式（以下、ＯＫ条件式）だけでなく、異常終了を示すＮＧｎの終了条件を定義する条件式（以下、ＮＧ条件式）の場合もあり、この場合が処理１２０７、１２０４、１２０５で同様に解析される。
なお、以上のシーケンス制御プログラム解析処理８０１で抽出された各データは、ステップＮＯ．及び終了条件名称で検索できる構造化されたデータとして記憶されるものとする。
【００２６】
図１３は、図８のシーケンス制御中間コード生成処理８０２の詳細を示すフローチャートである。シーケンス制御中間コード生成では、まず未処理のユニットを１つ取り出し（処理１３１１）、通常シーケンスと高速シーケンスのネット構造、コマンド列、終了条件のデータをロードする（処理１３０１、１３０２）。次に当該ユニットの中のステップＮＯ．の小さいプレースのデータを１つ取り出し（処理１３１２）、これが高速オプション付きのプレースであれば（処理１３０３）、高速シーケンス中間コードバッファを選択し（処理１３０５）、高速オプションなしであれば（処理１３０３）、通常シーケンス中間コードバッファを選択する（処理１３０４）。ここで、中間コードバッファは、ユニット毎に通常シーケンスと高速シーケンスの二つ分用意されるものとする。次に、１プレース毎の中間コードを生成し、これをバッファに出力する（処理１３０６）。さらに、現プレースよりもステップＮＯ．の大きいプレースがあれば、処理１３１２に戻り、同様の処理を繰り返す（処理１３０７）。次のプレースがないとき、現ユニットよりもユニットＮＯ．の大きいユニットのモジュールがあれば、処理１３１１に戻り、同様の処理を繰り返す（処理１３０８）。以上のように、すべてのユニットのモジュールについて中間コードを生成した後、まず、通常シーケンスの中間コードバッファを結合し、保存する（処理１３０９）。さらに、高速シーケンスの中間コードバッファを結合し、保存する（処理１３１０）。
【００２７】
図１４は、図１３に於ける１プレース毎の中間コードの生成処理１３０６の詳細を示すフローチャートである。この処理では、まず１つの前プレースを取り出し（処理１４０６）、ネット構造データから現プレースのステップＮＯ．（＝ｉ）を獲得する（処理１４０１）。次に、ネット構造データから前プレースのステップＮＯ．と終了条件を獲得し、さらに、終了条件データから前プレースの終了条件の条件式を獲得する（処理１４０２）。つづいてこれらのデータから、まず、中間コードの基本形であるＩＦ文の前半部を生成し、バッファに出力する（処理１４０３）。ここで、”ＩＦ  Ｓｊ  ＝＝  Ｅｘｅｃｕｔｉｎｇ  ＆  条件式  −＞”は、「ステップｊを実行後、その終了条件の条件式が成立すれば」を意味する。また、コマンド”ＴＥＲＭ  Ｓｊ”  は「ステップＳｊを終了する」、”ＥＸＥＣ  Ｓｉ”  は「ステップＳｉを実行する」を意味する。次に、現プレースＳｉのコマンド列を、バッファに続けて出力する（処理１４０４）。これで前プレース１つについての処理を終わり、他にも前プレースがあれば、すなわち、ステップＳｉの入力側のトランジションが他にもあれば、処理１４０６に戻り、同様の処理を繰り返す（処理１４０５）。
【００２８】
図１５は、図７のシーケンス制御プログラム１０２を中間コード化したものを示す。図７と同様に、中間コードも通常シーケンスブロック１５０１と高速シーケンスブロック１５０２の二つのブロックで構成される。ここで、中間コードはＩＦ文１５０３に示したようなＩＦ文を基本形とし、これを集めたものがブロックとなる。
【００２９】
図１６は、通常シーケンス中間コードのＩＦ文から、通常シーケンス制御内部コード１０４を生成した例を示す。内部コードは実際はバイナリ形式であるが、図１６ではニーモニック形式で表記した。ＩＦ文１６０１の条件部１６０２から内部コード１６０６が、コマンド列１６０３から内部コード１６０７が生成される。このようにＩＦ文１６０１の内部コードは  ”ＳＴＴ  ｉ”内部コード１６０５から始まるブロック１６０４となる。なお、この  ”ＳＴＴ  ｉ”内部コード１６０５は、内部コードを実行する際に利用される。
【００３０】
図１７は、図１６に示したような通常シーケンス制御内部コード１０４を生成するための、図８の処理８０３の詳細を示すフローチャートである。まず、通常シーケンスの中間コードをロードし（処理１７０１）、次に、中間コードの未処理のＩＦ文を一つずつ取り出して（処理１７０９）、条件部”ＩＦ  Ｓｉ  ＝＝  ．．．”からステップＮＯ．（＝ｉ）を抽出する（処理１７０２）。このステップＮＯ．ｉが前のＩＦ文の条件部と同じでなければ（処理１７０３）、”ＳＴＴ  ｉ”  内部コードを生成する（処理１７０４）。次に、条件式から内部コードを生成し（処理１７０５）、さらにコマンド列から内部コードを生成する（処理１７０６）。その後、次のＩＦ文があれば、処理１７０９に戻り、同様の処理を繰り返す（処理１７０７）。全てのＩＦ文を処理した後、それぞれの”ＳＴＴ”  内部コードが通常シーケンス制御内部コード１０４の中のどこにあるかを示すアドレステーブルを生成する（処理１７０８）。
図１８は、図１５の通常シーケンスブロック１５０１を内部コード化したものを示す。ＩＦ文１５０３を内部コード化したものがブロック１８０１である。
【００３１】
図１９は、高速シーケンス中間コードのＩＦ文から、高速シーケンス制御テーブル１０５を生成した例を示す。図１９のように、高速シーケンス制御テーブル１０５は、エントリテーブル１９０６、制御テーブル１９０７、コマンドリスト１９０８の三つのデータで構成されている。エントリテーブル１９０６は、ＩＦ文の内容を制御テーブル１９０７に登録する際、制御テーブル１９０７におけるエントリアドレスを記憶するためのテーブルである。エントリテーブル１９０６は、ステップＮＯ．を添字とする１次元配列であり、現在のステップＮＯ．から一意に制御テーブル１９０７のエントリアドレスを特定できる。高速シーケンス中間コードに関係のないステップＮＯ．の場合、エントリテーブル１９０６には未登録を意味する値（１６進表記でＦＦＦＦ）が格納されている。制御テーブル１９０７には、ＩＦ文の条件部とステップＮＯ．更新に関する処理が格納されており、出力側のトランジション数（以下、分岐数）を格納するフィールド、条件式を格納するフィールド、次ステップＮＯ．を格納するフィールド、コマンドリスト１９０８へのエントリアドレスを格納するフィールドで構成される。コマンドリスト１９０８は、ＩＦ文のコマンド列を内部コード化して格納するエリアである。各コマンド列の終わりが分かるように、終了コード（ＣｍｄＬｉｓｔＥｎｄＣｏｄｅ）を付加する。以上のような構成の高速シーケンス制御テーブル１０５を用いることで、現在のステップＮＯ．に応じた処理を効率良く呼び分けることができ、処理時間を短縮することができる。前に述べたように、高速シーケンス制御テーブル１０５は、割込み処理によって実行されるが、この割込み処理に要する時間、すなわち割込み処理時間は、高速シーケンス制御テーブル１０５を処理する時間によって決定する。システムの応答性を良くするためには、割込み処理時間を短くし、さらに割込み周期を短くする必要がある。このため、本実施例では、以上に述べたような高速シーケンス制御テーブル１０５を用いた。
【００３２】
図２０は、図１９に示したような高速シーケンス制御テーブル１０５を生成するための、図８の処理８０４の詳細を示すフローチャートである。以下、図１９を参照しながら、フローチャートの説明を行う。まず、高速シーケンス中間コードをロードし（処理２００１）、未処理のＩＦ文を１つ取り出す（処理２０１１）。次に、ＩＦ文の条件部の”ＩＦ  Ｓｊ  ＝＝  ．．．”１９０２等（図１９）から前プレースのステップＮＯ．（＝ｊ）を抽出し（処理２００２）、そのステップＮＯ．ｊが前に処理したＩＦ文と同じ値でなければ（処理２００３）、エントリテーブル１９０６のｊ番目に、新しくデータを登録する制御テーブル１９０７のエントリアドレスを格納する（処理２００４）。ここで、プレース１個あたりに割り当てられる制御テーブル１９０７のフィールドの大きさは固定されており、既に登録されているプレースの数からエントリアドレスを一意に算出することができるものとする。次に、制御テーブル１９０７の分岐数をカウントアップする（処理２００５）。分岐数は新規登録時には０となっており、ある有限個数まで登録可能なものとする。前述のように、分岐数とは、前プレースの出力側のトランジションのうちで、高速オプション付きのプレースに入力として接続されるものの個数である。次に、ＩＦ文のその他の条件式１９０３から制御テーブル１９０７の条件部を生成する（処理２００６）。制御テーブル１９０７の条件部は、単純なマッチング処理を用いて高速処理できるように、簡略化したデータ形式（以下、略式コード）にする。このような略式コード化を可能とするため、ＩＦ文の条件式にある程度の記述上の制約を設けることもある。例えば、条件式の各辺を単項式に限るなどの制約が考えられる。次に、ＩＦ文のコマンド”ＥＸＥＣ  Ｓｉ”  １９０４等のステップＮＯ．ｉを抽出して、次ステップＮＯ．のフィールドに格納する（処理２００７）。さらに、残りのコマンド列１９０５を格納するためのコマンドリスト１９０８のエントリアドレスを算出し、これを制御テーブル１９０７のコマンドエントリのフィールドに格納する（処理２００８）。次に、このコマンド列を内部コード化し、コマンドリスト１９０８に格納する（処理２００９）。なお、各コマンド列の内部コードは固定長ではないため、コマンド列の終わりが分かるように、ＣｍｄＬｉｓｔＥｎｄＣｏｄｅを付加する。さらに、次のＩＦ文があれば、処理２０１１に戻り、同様の処理を繰り返す（処理２０１０）。
【００３３】
図２１は、図１５の高速シーケンスブロック１５０２から生成したテーブルを示す。ここで、エントリテーブル２１０１に示す通り、制御テーブル２１０２に登録されるプレースは３個であり、その中のプレースＳ１０２の分岐数は２個となる。これは、図５のＳ１０２の３個の出力トランジションのうち、２個が高速オプション付きのプレースに入力として接続されていることに相当する。
【００３４】
図２２は、図１の通常シーケンス制御内部コード実行手段１０６の処理を示すフローチャートである。この通常シーケンス制御内部コード実行手段１０６は、コントローラのファームウェアとして提供されるタスクの一つであり、コントローラ内にダウンロードされる通常シーケンス内部コード１０４を解釈、実行することによって、コントローラに接続される機器を制御する。
【００３５】
図２２に於いてまず、通常シーケンス制御内部コード実行手段１０６では、ユニット毎に内部コードのスキャンを行うために、現在のユニットＮＯ．（＝ｎ）を初期化（ｎ＝０）する（処理２２０１）。次に、ｎの値を１増加し、次のユニットＮＯ．とする（処理２２０２）。なお、ユニット毎に実行中のプレースを示す現ステップＮＯ．が管理されており、この情報を通常シーケンス制御内部コード実行手段１０６から参照できる。そこで、ＵＮＩＴｎの現ステップＮＯ．（＝ｉ）を取得し（処理２２０３）、”ＳＴＴ  ｉ”  内部コードにジャンプする（処理２２０４）。このとき、通常シーケンス制御内部コード１０４に付随する”ＳＴＴ  ｉ”  内部コードのアドレステーブルによりジャンプ先のアドレスを求める。ジャンプ後は次の”ＳＴＴ”  内部コードが現れるまで、内部コードを順次フェッチし、実行する（処理２２０５）。さらに、ｎが所定の最大値でなく、次のユニットがあれば、処理２２０２に戻り、同様の処理を繰り返す（処理２２０６）。ｎが最大値、すなわち登録ユニット数に到達し、次のユニットがなければ、処理２２０１に戻る（処理２２０６）。以上のように、通常シーケンス制御内部コード１０４の、ユニット毎の実行中ステップのブロックのみを選択的にスキャンすることにより、スキャンタイムを短縮することができる。
【００３６】
図２３、２４は、図１の高速シーケンス制御テーブル処理手段１０７の処理を示すフローチャートである。この２つの図は１つのフローチャートを構成し、図中▲１▼▲２▼▲３▼が２つの図の接続関係を示している。高速シーケンス制御テーブル処理手段１０７は、コントローラのファームウェアとして提供される割込みタスクであり、コントローラ内にダウンロードされる高速シーケンス制御テーブル１０５を処理することで、コントローラに接続される機器を制御する。なお、割込みタスクとは、一定周期で割込みを入れるタイマや外部入力信号をきっかけとして起動されるタスクであり、通常シーケンス制御内部コード実行手段１０６のタスクが実行中に優先的に割込んで実行される。図２３、２４に於いて、高速シーケンス制御テーブル処理手段１０７でも、ユニット毎にテーブルの処理を行うため、まず、現在のユニットＮＯ．（＝ｎ）を初期化する（処理２３０１）。次に、ｎの値を１増加し（処理２３０２）、ＵＮＩＴｎの現ステップＮＯ．（＝ｉ）を取得する（処理２３０３）。さらに、エントリテーブル２１０１のｉ番目のデータから制御テーブル２１０２のエントリアドレスを取得する（処理２３０４）。次に、制御テーブル２１０２の該当アドレスのフィールドから分岐数を取得する（処理２３０５）。各分岐毎にテーブルを処理するために、現在の分岐ＮＯ．（＝ｍ）を初期化（ｍ＝０）する（処理２３０６）。ｍの値を１増加し、次の分岐ＮＯ．とする（処理２３０７）。制御テーブル２１０２の該当フィールドにあるｍ番目の分岐の条件部の略式コードを評価し（処理２３０８）、条件成立ならば（処理２３０９）、制御テーブル２１０２からコマンドリスト２１０３のエントリアドレスを取得する（処理２４０１）。さらに、コマンドリスト２１０３の該当アドレスの内部コードを、ＣｍｄＬｉｓｔＥｎｄＣｏｄｅが現れるまで順次フェッチし、実行する（処理２４０２）。次に、制御テーブル２１０２から次ステップＮＯ．を取得し（処理２４０３）、ＵＮＩＴｎのステップＮＯ．を次ステップＮＯ．に更新する（処理２４０４）。なお、各ユニットの現在のステップＮＯ．は、通常シーケンス制御内部コード実行手段１０６と、高速シーケンス制御テーブル処理手段１０７の両方で、参照、書き換えができる共有データとする。このように、通常シーケンス制御内部コード実行手段１０６と、高速シーケンス制御テーブル処理手段１０７が、現在実行中のステップＮＯ．を共有することによって、両者の間で互いにステップのレベルで同期をとることが可能となる。また、条件不成立ならば（処理２３０９）、分岐ＮＯ．が分岐数に達しているかどうか、すなわち次の分岐があるかどうかをチェックし、次の分岐があれば、処理２３０７に戻って同様の処理を繰り返し、次の分岐がなければ、次のユニットの処理に移る（処理２３１０）。最後に、ｎが最大値でなく、次のユニットがあれば、処理２３０２に戻って同様の処理を繰り返し、次のユニットがなければ、ここで割込み処理の１サイクルを完了する（処理２４０５）。
【００３７】
なお、以上の実施の形態では、本実施例では、高速シーケンス制御テーブル処理手段１０７を割込みで実行される処理として説明したが、高速シーケンス制御用の別のコントローラに設けて、割込み以外の方法で処理する場合でも、本発明のシーケンス制御方法が同様な効果を有することは明らかである。また、高速シーケンス制御テーブルに代わって、通常シーケンス制御内部コード１０４と同じ形式の高速シーケンス制御内部コードを生成し、これを十分な処理速度を持ったコントローラで処理するという方法でも、本発明の方法を実現できる。
【００３８】
【発明の効果】
本発明によれば、一連のシーケンスを記述する際、高速応答を要するステップをマークで指定するだけで、高速シーケンス制御テーブルを自動的に生成できるので、高速応答を要する処理が混在したシーケンスを、一連のシーケンスとしての見易さを損なうことなく、容易に記述することができ、その結果、プログラム開発効率と保守性を向上することができる効果がある。
【図面の簡単な説明】
【図１】本発明になる高速シーケンス制御方法の処理の流れを模式的に示すブロック図である。
【図２】プログラマブルコントローラにおけるスキャン処理のサイクルと、入力信号の状態変化のサイクルの関係を示すタイミングチャートである。
【図３】図２の入力信号の状態変化のサイクルがスキャンタイムに比べて短い場合を示すタイミングチャートである。
【図４】図３の入力信号の状態変化を捕らえるために割込み処理を併用した場合を示すタイミングチャートである。
【図５】ペトリネット表記によるシーケンス制御プログラムの一例を示す図である。
【図６】ＳＦＣ表記によるシーケンス制御プログラムの一例を示す図である
【図７】図５のシーケンス制御プログラムをコード化したものを示す図である。
【図８】シーケンス制御プログラム変換手段の処理を示すフローチャートである。
【図９】図８のシーケンス制御プログラム解析の処理を示すフローチャートである。
【図１０】図９の１プレース毎のネット構造解析の処理を示すフローチャートである。
【図１１】図９の１プレース毎のコマンド列解析の処理を示すフローチャートである。
【図１２】図９の１プレース毎の終了条件解析の処理を示すフローチャートである。
【図１３】図８のシーケンス制御中間コード生成の処理を示すフローチャートである。
【図１４】図１３の１プレース毎の中間コード生成の処理を示すフローチャートである。
【図１５】図７のシーケンス制御プログラムから生成した中間コードを示す図である。
【図１６】通常シーケンス中間コードから通常シーケンス制御内部コードを生成した例を示す図である。
【図１７】図８の通常シーケンス制御内部コード生成の処理を示すフローチャートである。
【図１８】図１５の通常シーケンスブロックから生成した内部コードを示す図である。
【図１９】高速シーケンス中間コードから高速シーケンス制御テーブルを生成した例を示す図である。
【図２０】図８の高速シーケンス制御テーブル生成の処理を示すフローチャートである。
【図２１】図１５の高速シーケンスブロックから生成したテーブルを示す図である。
【図２２】通常シーケンス制御内部コード実行手段の処理を示すフローチャートである。
【図２３】高速シーケンス制御テーブル処理手段の処理を示すフローチャートである。
【図２４】図２３のフローチャートの続きである。
【符号の説明】
１０１  シーケンス制御プログラム編集手段
１０２  シーケンス制御プログラム
１０３  シーケンス制御プログラム変換手段
１０４  通常シーケンス制御内部コード
１０５  高速シーケンス制御テーブル
１０６  通常シーケンス制御内部コード実行手段
１０７  高速シーケンス制御テーブル処理手段
５０１  プレース
５０２、５０３、５０４  トランジション
５０５  高速オプション付きのプレース
６０１  ＳＦＣにおける高速オプション付きのステップ要素
７０１  通常シーケンスブロック
７０２  高速シーケンスブロック
７０３  ＃ＩＮＴＥＲＲＵＰＴ文
７０４  ｃｅｌｌブロック
７０５  ｄｅｆブロック
７０６  ”ｃｅｌｌ”文
７０７  ”ｄｅｆ”文
７０８  ｃｅｌｌラベル
７０９  遷移条件式
７１０  コマンド列
７１１  ｄｅｆラベル
７１２  終了条件式
１５０１  通常シーケンスブロック
１５０２  高速シーケンスブロック
１５０３  中間コードのＩＦ文
１６０１  中間コードのＩＦ文
１６０２  条件部
１６０３  コマンド列
１６０４  内部コードのブロック
１６０５、１６０６、１６０７  内部コード
１８０１  内部コードのブロック
１９０１  中間コードのＩＦ文
１９０２、１９０３  条件部
１９０４、１９０５  コマンド列
１９０６  エントリテーブル
１９０７  制御テーブル
１９０８  コマンドリスト
２１０１  エントリテーブル
２１０２  制御テーブル
２１０３  コマンドリスト
【図１】
0003554651.tif 000002
【図２】
0003554651.tif 000003
【図３】
0003554651.tif 000004
【図４】
0003554651.tif 000005
【図５】
0003554651.tif 000006
【図６】
0003554651.tif 000007
【図７】
0003554651.tif 000008
【図８】
0003554651.tif 000009
【図９】
0003554651.tif 000010
【図１０】
0003554651.tif 000011
【図１１】
0003554651.tif 000012
【図１２】
0003554651.tif 000013
【図１３】
0003554651.tif 000014
【図１４】
0003554651.tif 000015
【図１５】
0003554651.tif 000016
【図１６】
0003554651.tif 000017
【図１７】
0003554651.tif 000018
【図１８】
0003554651.tif 000019
【図１９】
0003554651.tif 000020
【図２０】
0003554651.tif 000021
【図２１】
0003554651.tif 000022
【図２２】
0003554651.tif 000023
【図２３】
0003554651.tif 000024
【図２４】
0003554651.tif 000025