(57)【要約】【課題】本発明は、少ないメモリ量で、短い時間内に、また実行チャネルが異なるハードウエアやソフトウエアで構成されていても、プログラム実行の途中経過の検証が可能なプログラマブルコントローラ、プログラム実行監視方法及びプログラムを提供することを課題とする。【解決手段】ラダー図２４から、検証コード生成ルーチンを呼び出す命令を含む実行プログラム２６−１、２６−２を生成する。実行チャネルで実行プログラム２６−１、２６−２が実行されると検証コードが生成されて検証コード格納領域２２に格納される。これを照合することにより実行プログラム２６−１、２６−２が正常に実行されたかが検証できる。【選択図】図１
2010244213.tif 000002
【特許請求の範囲】
【請求項１】
実行プログラムを並列に実行する複数の実行チャネルを備えるプログラマブルコントローラにおいて、
前記複数の実行チャネルは、当該実行チャネルにおいて前記実行プログラムが正常に実行されたかを検証するための検証コードを格納する検証コード格納部と、
前記実行プログラムの実行が完了すると、前記複数の実行チャネルの前記検証コード格納領域内の検証コードを照合する照合部と、
を備え、
前記実行チャネルから呼び出され、前記検証コードを生成する検証コード生成ルーチンを格納する検証コード生成ルーチン格納領域と、
を備えることを特徴とするプログラマブルコントローラ。
【請求項２】
前記照合部による照合の結果、前記複数の実行チャネルの前記検証コード格納領域内の検証コードが全て一致したとき、前記実行プログラムは正常に実行されたと判定することを特徴とする請求項１に記載のプログラマブルコントローラ。
【請求項３】
前記照合部は、前記複数の実行チャネルの前記検証コード格納領域内の検証コードが一致しないものがあるとき、エラー処理を行うことを特徴とする請求項２に記載のプログラマブルコントローラ。
【請求項４】
前記実行プログラムは、前記検証コード生成ルーチンを呼び出す際、当該実行プログラム内において一意な値を取る第１のパラメータを当該検証コード生成ルーチンに引き渡すことを特徴とする請求項１乃至３の何れか１つに記載のプログラマブルコントローラ。
【請求項５】
前記実行プログラムは、前記検証コード生成ルーチンを呼び出す際、当該実行プログラムによる実行結果である第２のパラメータをも当該検証コード生成ルーチンに引き渡すことを特徴とする請求項４に記載のプログラマブルコントローラ。
【請求項６】
前記検証コード生成ルーチンは、前記パラメータを用いて前記検証コードを生成することを特徴とする請求項４に記載のプログラマブルコントローラ。
【請求項７】
前記検証コード生成ルーチンは、前記１つ以上のパラメータ値を用いて、チェックサムのアルゴリズム、ＣＲＣコードのアルゴリズム、またはハッシュコードのアルゴリズムの何れかを用いて前記検証コードを生成することを特徴とする請求項６に記載のプログラマブルコントローラ。
【請求項８】
ユーザが前記プログラマブルコントローラ用の言語で作成したプログラムから、複数の前記検証コード生成ルーチンを呼び出すコードを含む前記実行プログラムを生成するプログラム生成部を更に備えることを特徴とする請求項１乃至７の何れか１つに記載のプログラマブルコントローラ。
【請求項９】
実行プログラムを並列に実行する複数の実行チャネルを備えるプログラマブルコントローラにおけるプログラム実行監視方法において、
前記並列に実行される複数の前記実行プログラムから、当該実行プログラムが正常に実行されたかを検証するための検証コードを生成する検証コード生成ルーチンを呼び出し、当該検証コードを前記実行チャネル毎に備える検証コード格納領域に格納し、
前記複数の実行チャネルそれぞれの前記検証コード格納領域内の検証コードを照合することによって前記実行プログラムが正常に実行されたかを検証する
ことを特徴とするプログラム実行監視方法。
【請求項１０】
実行プログラムを並列に実行する複数の実行チャネルを備えるプログラマブルコントローラにおいて実行されるプログラムであって、
前記実行プログラムから呼び出され、当該実行プログラムから引き渡されたパラメータ値及び当該検証コードを前記実行チャネル毎に設けられた検証コード格納領域内の値を用いて当該実行プログラムが正常に実行されたかを検証するための検証コードを生成し、
当該検証コードを前記検証コード格納領域に格納する
ことを前記プログラマブルコントローラに実行させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラマブルコントローラに関し、更に詳しくはプログラマブルコントローラのプログラム実行を監視する技術に関する。
【背景技術】
【０００２】
プログラマブルコントローラにおいては、プログラムが想定どおりの順序で実行されたか、そして正しく演算結果を算出したかを調べ、正常にプログラムが実行されているかを診断することが行われている。
【０００３】
特にＣＰＵの多重化等の冗長化構成を持つプログラマブルコントローラにおいては、想定どおりの順序で実行されたか、そして演算結果が正しいかを診断をする技術が必要となる。
【０００４】
プログラム実行の診断としては、最も単純な技術としては、ウォッチドッグタイマーによって実行時間を監視する方法が一般に知られている。例えば、特許文献１には、ウォッチドッグタイマーによりＣＰＵに割り込みをかけることによって、暴走を監視するプログラマブルコントローラが開示されている。
【０００５】
また特許文献２には、ウォッチドックタイマーを用いない監視を行うものとして、状態遷移時間を基準となる時間と比較することによって監視を行うプログラマブルコントローラが開示されている。
【０００６】
また特許文献３には、ウォッチドックタイマーを用いない監視方法として、プログラムにチェックプログラムを記載し、このチェックプログラムによってＲＡＭ内の値をインクリメントして書き込んでゆき、またＲＡＭに書き込まれた数値が正常であるかをチェックすることによって暴走を検出する方法が開示されている。
【０００７】
またその他の診断技術としては、プログラム内の実行通過ポイントをトレースメモリに記憶してゆき、このトレースメモリの内容を照合することによって診断を行う方法が知られている。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開平６−２５０８６４号公報
【特許文献２】特開平５−３１３７１１号公報
【特許文献３】特開平６−３２４９１４号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
しかしながら上記した各監視方法には、以下の問題点がある。
特許文献１等のウォッチドッグタイマーによるプログラム実行監視方法では、プログラムスタートを示す命令の実行からプログラムエンドを示す命令の実行までが、規定の時間内に終了できたかを確認できる。しかし、プログラマブルコントローラが多重化構成を有していた場合、途中経過を調べて複数の実行チャネルにおいて等しく同じプログラム実行をできたかを検証することはできない。
【００１０】
また特許文献２の方法では、あらかじめ基準となる実行時間等の設定を行う必要があり、また状態遷移時間や基準時間を記憶するために用いるメモリ資源を必要とする。
更に特許文献３の方法では、実行プログラムがシーケンシャルなものである場合はチェックが可能である。しかし実行プログラムが単純なシーケンスプログラムである場合の適用に制限され、実行プログラムが分岐やループを含みダイナミックに実行先が変化する場合には向かない。
【００１１】
そしてこれら特許文献１乃至３の方法はすべて単一の実行チャネルを備える構成の場合の監視、診断を行う技術である。
また実行プログラムの実行通過ポイントをトレースメモリに蓄積し、そのデータを照合することによって実行監視を行う方法は、途中経過の照合が可能となるが、トレースメモリの全内容を他の実行チャネルに転送してから各実行チャネル内で比較照合されるため、処理時間がかかる。また、実行プログラムのサイズが大きくなるほど、その分トレースメモリの容量や、処理時間もそれだけ長くかかる。例えば、１ポイントあたり２バイトであるとき、１０００ポイント格納可能なトレースメモリは約２キロバイトの容量を必要とする。
【００１２】
また冗長化を持たせたプログラマブルコントローラの複数の実行チャネルを全く同じハードウエア、同じ動作クロック、同じソフトウエアで構成し、実行チャネル間を完全に同期して動作させて、各実行チャネルからのハードウエア信号をモニタして相違発生時を以って異常とする方法もある。しかし機能安全に関する国際標準規格であるＩＥＣ６１５０８に規定されている機能安全向け電子機器においては、同一のハードウエアによる系統的障害の影響を極力避けるための方策として、構成要素にハードウエア的あるいはソフトウエア処理方式的に違いを持たせる多様性（ダイバシティ）を持たせることが推奨されている。そのため、この構成を同じにして同期を取る方法では当規格を満たすことができない。
【００１３】
上記を鑑み本発明では、少ないメモリ量で、短い時間内に、また実行チャネルが異なるハードウエアやソフトウエアで構成されていても、プログラム実行の途中経過の検証が可能なプログラマブルコントローラを提供することを課題とする。
【課題を解決するための手段】
【００１４】
本発明のプログラマブルコントローラは、実行プログラムを並列に実行する複数の実行チャネルを備えるプログラマブルコントローラにおいて、前記複数の実行チャネルは、当該実行チャネルにおいて前記実行プログラムが正常に実行されたかを検証するための検証コードを格納する検証コード格納部を備え、前記実行チャネルから呼び出され、前記検証コードを生成する検証コード生成ルーチンを格納する検証コード生成ルーチン格納領域と、を備えることを特徴とする。
【００１５】
本発明のプログラム実行監視方法は、実行プログラムを並列に実行する複数の実行チャネルを備えるプログラマブルコントローラにおけるプログラム実行監視方法において、前記並列に実行される複数の前記実行プログラムから、当該実行プログラムが正常に実行されたかを検証するための検証コードを生成する検証コード生成ルーチンを呼び出し、当該検証コードを前記実行チャネル毎に備える検証コード格納領域に格納し、前記複数の実行チャネルそれぞれの前記検証コード格納領域内の検証コードを照合することによって前記実行プログラムが正常に実行されたかを検証する、ことを特徴とする。
【００１６】
本発明によるプログラムは、実行プログラムを並列に実行する複数の実行チャネルを備えるプログラマブルコントローラにおいて実行されるプログラムであって、前記実行プログラムから呼び出され、当該実行プログラムから引き渡されたパラメータ値及び当該検証コードを前記実行チャネル毎に設けられた検証コード格納領域内の値を用いて当該実行プログラムが正常に実行されたかを検証するための検証コードを生成し、当該検証コードを前記検証コード格納領域に格納する、ことを前記プログラマブルコントローラに実行させることを特徴とする。
【発明の効果】
【００１７】
本発明によれば、実行プログラムの実行に伴って検証コードを算出していくため、実行プログラムポイント、実行順序が実行チャネル間で、もし異なっていた場合には、異なる検証コードとなり照合によって異常の検出を行うことが出来る。
【００１８】
また検証コード生成ルーチンへのパラメータに、実行プログラムの演算結果を用いていた場合には実行順序のほかに演算結果の同一性もチェックすることが出来る。
さらに検証コードはサブルーチン内で算出されるので、実行チャネルのハードウエア、ソフトウエア処理方式には依存性がない。
また、検証コードに必要なメモリサイズも小さく、照合に要する時間も短い。
【図面の簡単な説明】
【００１９】
【図１】本実施形態におけるプログラマブルコントローラシステムの全体構成を示す図である。
【図２】ラダー図の例を示す図である。
【図３】従来のプログラマブルコントローラで実行される実行プログラムの例を示す図である。
【図４】本実施形態の実行プログラム生成部によって生成される実行プログラムの第１の例を示す図である。
【図５】本実施形態の実行プログラム生成部によって生成される実行プログラムの第２の例を示す図である。
【図６】本実施形態の実行制御部が実行プログラムを実行した際の動作処理を示すフローチャートである。
【図７】検証コード生成ルーチンの第１の動作例を示す図である。
【図８】検証コード生成ルーチンの第２の動作例を示す図である。
【発明を実施するための形態】
【００２０】
本実施形態のプログラマブルコントローラでは、プログラム生成装置においてユーザがプログラマブルコントローラ用の言語で作成したプログラム（例えば、ラダー図）をコントローラが実行する実行プログラムに変換する際に、各実行チャネルで正常に実行プログラムを実行したかを検証するのに用いる検証コードを生成するルーチンをコールするコードを挿入する。
【００２１】
そしてこの実行プログラムを実行するコントローラの各実行チャネルでは、それぞれに対応したプログラムを実行すると自己のメモリに検証コードが記録される。そして各実行チャネルは、実行プログラムによる動作を完了すると記録された検証コードを互いに比較し、両者が一致したときのみ処理を継続し、両者が一致しないときは機能安全エラー処理を行う。
【００２２】
これにより、プログラマブルコントローラの機能安全のエラーチェックを検証コードの比較を行うという簡単な処理で実現でき、また必要とするメモリも検証コードの格納用に数ｂｙｔｅだけである。
【００２３】
次に本実施形態のプログラマブルコントローラシステムの詳細について説明する。
図１は本実施形態におけるプログラマブルコントローラシステムの全体構成を示す図である。
【００２４】
図１のプログラマブルコントローラシステム１は、コントローラ１０に転送ケーブル３０を介してプログラム生成装置２０が接続された構成となっている。
コントローラ１０は、実行プログラムを実行する２つの実行チャネル１６−１、１６−２を備えた演算部１１、各実行チャネル１６−１、１６−２の起動／停止を操作者が指示するための起動／停止スイッチ１２、プログラマブルコントローラシステム１に接続されている外部機器からの外部入力を受け付ける入力部１３、プログラム生成装置２０から起動／停止コマンドを受信し、受信コマンドに基づいて実行チャネル１６−１及び１６−２に対して起動／停止を通知する起動／停止コマンド受信部１４、及び実行プログラムの実行結果等を外部に出力する出力部１５を有している。
【００２５】
このうち各実行チャネル１６−１、１６−２は、ハードウエア的に独立したものであり、マイコン、メモリ、ロジックＩＣなどのハードウエアおよびファームウエアによって実現される。
【００２６】
各実行チャネル１６−１、１６−２は、実行プログラムを実行する実行制御部１７−１、１７−２及び実行プログラムを記憶するメモリ１８−１、１８−２を備えている。また各メモリ１８（１８−１、１８−２）には、実行プログラムを格納する実行プログラム格納領域１９（１９−１、１９−２）、後述する検証コード生成ルーチンや照合をソフトウエア的に実現するためのファームウエアを格納する検証コード生成ルーチン格納領域２１（２１−１、２１−２）、及び検証コードを格納する検証コード格納領域２２（２２−１、２２−２）を有している。また検証コード生成ルーチン格納領域２１内のファームウエアを実行制御部１７が実行することにより各実行チャネル１６−１、１６−２によって生成された２つの検証コードを比較する照合部２３（２３−１、２３−２）が実現される。
【００２７】
またプログラム生成装置２０は、ユーザがプログラム入力を行うためのものであり、例えば図２に示すラダー図２４を使ってプログラム入力が可能である。以降、ラダー図２４を使った例で説明するが、ユーザがプログラム入力を行う言語を限定するものではなく、電気標準国際会議（ＩＥＣ）のＩＥＣ６１１３１−３で規格が示されている他の言語（ＳＦＣ、ＦＢＤ、ＳＴ、ＩＬ）を用いても構わない。
【００２８】
プログラム生成装置２０は、入力されたユーザプログラムからコントローラ１０が解釈実行できる実行プログラム２６をコントローラ１０側が備える実行チャネル１６の数（図１の場合は２つ）だけ生成する。即ち、図１の場合、実行プログラム２６−１、２６−２が生成される。
【００２９】
なお図１では各実行チャネル１６−１、１６−２がそれぞれ検証コード生成ルーチン格納領域２１−１、２１−２を備える構成となっているが、各実行チャネル１６−１、１６−２が１つの検証コード生成ルーチン格納領域２１を共用する構成としても良い。
【００３０】
プログラム生成装置２０は、転送ケーブル３０によってコントローラ１０と接続され、転送ケーブル３０を経由して、実行プログラム２６はコントローラ１０内の各実行チャネル１６のメモリ１８へ転送される。
【００３１】
プログラム生成装置２０は、ユーザが作成したラダー図２４からコントローラ１０の各実行チャネル１６−１、１６−２が実行する実行プログラム２６−１、２６−２を生成する実行プログラム生成部２５、及びコントローラ１０の各実行チャネル１６−１、１６−２に対して起動／停止を指示する起動／停止コマンド生成部２７を有している。
【００３２】
実行プログラム生成部２５−１は、ラダー図２４から各実行チャネル１６−１、１６−２に対応した実行プログラム２６−１及び２６−２を生成する。この実行プログラム２６−１及び２６−２は、多様性（ダイバシティ）を持たせるため機能的には同じものであるが異なったコードのプログラムとなっている。また実行プログラム生成部２５がラダー図２４から実行プログラム２６−１及び２６−２を生成する際には、実行プログラム２６−１、２６−２に検証コードを生成する検証コード生成ルーチンを呼び出す命令を挿入する。この検証コード生成ルーチンを呼び出す命令は、どちらの実行チャネル１６−１、１６−２でも実行される位置に挿入されるが、その挿入方法としては様々な方法が考えられ、例えばラダー図２４内のリレー等の機能毎に挿入する。
【００３３】
図２にラダー図２４の例を示す。
実行プログラム生成部２５は、図２のようなラダー図２４を実行プログラム２６−１、２６−２に変換する際には、接点・コイル等の要素に対応するポイント３１−１〜３１−６毎に検証コード生成ルーチンを呼び出す命令を挿入する。なお、ポイント３１−１〜３１−６は全てに検証コード生成ルーチンを呼び出す命令を挿入する必要は無く、プログラムの全体量やステップ数を鑑み、一定間隔ごとに挿入しても構わない。またポイント３１の挿入は、予め定義したルールに従って機械的に行っても良いし、経験則や実行プログラムの処理時間に基いてユーザが挿入しても構わない。
【００３４】
図３は、図２のラダー図２４から生成された従来のプログラマブルコントローラで実行される実行プログラムの例を示す図、図４は図２のラダー図２４から本実施形態の実行プログラム生成部２５によって生成される実行プログラム２６の例を示す図である。
【００３５】
図３と図４を比較すると、図４の実行プログラムでは、３カ所に検証コード生成ルーチンを呼び出す（コールする）命令４１−１〜４１−３が挿入されている。
図４の検証コード生成ルーチンを呼び出す命令４１中の“ＣＲＣＧＥＮ”は、呼び出しを行う検証コード生成ルーチンの名前を示し、続く“Ｘ’００００”〜“Ｘ’０００２”は、検証コード生成ルーチンを呼び出した実行プログラム内での一意な値で、“Ｘ’”は、例えば、１６進数であることを示す。ここで値を４桁とすると、００００〜ＦＦＦＦの範囲となる。
【００３６】
この図４の例では、検証コード生成ルーチンにパラメータとして、実行プログラム内において唯一の値をそれぞれ与えることにより、検証コード生成ルーチンでこの一意な値を用いて検証コードを生成する。これにより照合部２３−１、２３−２が実行チャネル１６−１、１６−２それぞれの検証コードを照合することによって実行プログラムの実行順序が検証可能となる。
【００３７】
また図４の実行プログラム２６では、検証コードの生成ルーチンは含んでおらず、コントローラ１０内の検証コード生成ルーチン格納領域２１内の検証コード生成ルーチンを呼び出す構成なので、検証コードの生成のためには、実行プログラム２６は数バイト〜数十バイト要するだけで実現できる。よって実行プログラム２６の要所要所に検証コード生成ルーチンを呼び出す命令４１を入れることが出来るので、実行プログラム中に複雑な分岐や条件式があっても、実行プログラム２６の実行順序を検証することが出来る。又そのために必要な検証コードの格納領域２２も２バイト程度のメモリ資源しか占有しない。
【００３８】
さらには検証コードはコントローラ１０内に格納されている検証コード生成ルーチンによって生成されるので、実行チャネル１６のハードウエアや、ソフトウエア処理方式には依存性がない。
【００３９】
図５は、本実施形態の実行プログラム生成部２５によって生成される実行プログラムの第２の例を示す図である。
図５の実行プログラムでは、検証コード生成ルーチンを呼び出す命令４２において、呼び出しを行う検証コード生成ルーチンの名前“ＣＲＣＧＥＮ２”に続いて、位置を示す引数“Ｘ’００００”〜“Ｘ’０００２”に続いて、検証コードの生成に用いる値の引数“Ｘ’００００”、“Ｙ００”、“Ｙ０１”が与えられている。この第２パラメータである検証コードの生成に用いる値は、実行プログラムの実行によって得られる演算結果である。なお、“Ｙ００”、“Ｙ０１”は実行プログラム内の任意の変数の値を指す。
【００４０】
この図５の第２の例では、パラメータとして、実行プログラムでの位置を示す情報に加えて、演算結果をも検証コード生成ルーチンに送る。そしてこれらを元に検証コード生成ルーチンで生成される検証コードを検証することにより、実行プログラム２６の実行順序だけでなく演算結果の一致性も診断できる。
【００４１】
この図４若しくは図５に示した実行プログラム２６が実行チャネル１６で実行されると、検証コード生成ルーチンが呼び出されて検証コードが生成され、これがメモリ１８の検証コード格納領域２２に格納される。そして実行プログラム２６の実行が完了すると、各実行チャネル１６−１、１６−２の照合部２３−１、２３−２は自己の実行チャネル１６のメモリ１８内の検証コード格納領域２２の値と、もう一方の実行チャネル１６のメモリ１８内の検証コード格納領域２２の値を照合する。そしてコントローラ１０は、この照合の結果、両者が一致したときのみ処理を続行し、両者が一致しないときは機能安全エラー処理を行う。
【００４２】
なお検証コード生成ルーチンでは、パラメータ値を用いて検証コードを生成するが、その検証コードの生成アルゴリズムは、チェックサム（単純和）、ＣＲＣ（Ｃｙｃｌｉｃ  ｒｅｄｕｎｄａｎｃｙ  ｃｈｅｃｋｓｕｍ）、ハッシュ値（Ｈａｓｈ  ｖａｌｕｅ）などが考えられるが特に限定されるものではなく、プログラマブルコントローラが必要とされる診断精度に応じて適宜なアルゴリズムを選択して用いればよい。
【００４３】
上述した、図４、図５では、実行プログラム２６−１、２６−２は各実行チャネル１６−１、１６−２の実行制御部１７−１、１７−２によって実行される。このとき、２つの実行チャンネル１６−１、１６−２は同期して動作し、入力部１３から外部入力を取り込む「入力」、実行プログラム２６を実行する「演算」、２つの実行チャネル１６−１及び１６−２間での検証コード格納領域２２−１、２２−２内の値が一致することを確認する「照合」、「演算」や「照合」の結果を出力部１５から外部へ出力する「出力」の各フェーズを経て１つのスキャンのサイクルとし、処理を行う。そして「照合」において２つの検証コードが一致している間は、スキャンを繰り返す。
【００４４】
実行プログラム２６が実行されると、検証コード生成ルーチンをコールする度に検証コードが生成され、メモリ１８内の検証コード格納領域２２の値は更新される。そして実行プログラム２６の実行が完了すると、各実行チャネル１６−１、１６−２では、照合部２３−１、２３−２が２つの検証コード格納領域２２−１、２２−２内の値を照合し、両者が一致するのを確認する。この照合の結果、２つの検証コードが一致すればコントローラ１０は、演算結果を出力し、不一致の場合にはエラーを示す出力を行って、演算結果は出力しない。
【００４５】
なお、照合部２３−１及び照合部２３−２の各々で照合を行うのは、照合処理自体も二重化することにより機能安全を満たす側面がある。これは、実行チャネル１６−１と実行チャネル１６−２とを、異なったハードウエア構成（ダイバシティの確保）とすることにより、実行チャネル１６−１と実行チャネル１６−２とがハードウエア的な問題により“同時に誤照合する可能性”を回避する点にある。
【００４６】
一方で、このような制約を設けない場合は、例えば、照合部２３を一つで構成したり、実行チャネル１６の外部に設けるように構成しても構わない。
また、照合部２３は、検証コード格納領域２２−１、２２−２内の値の取得・照合及びその照合結果の出力制御機能を有しておればよく、ハードウエア的な構造であってもソフトウエア的に実現するためのファームウエア（プログラム）であっても構わない。例えば、照合部２３は実行制御部１７からアクセス可能な照合ルーチンとしてメモリ１８内に格納されていても構わない。
【００４７】
次に各実行チャネル１６−１、１６−２の実行制御部１７−１、１７−２の処理フローについて説明する。
図６は、実行制御部１７が実行プログラム２６を実行した際の動作処理を示すフローチャートである。なお図６の例では検証コード生成ルーチンとして、後述する図７のＣＲＣＧＥＮのルーチンを用いた場合を例として示している。
【００４８】
なお図６の処理は、２つの実行チャネル１６−１及び１６−２において同期して処理される。また本実施形態のプログラマブルコントローラシステム１では、起動、停止、故障など様々な事象により対応する挙動があるが、図６の処理フローは本実施形態の検証コードに関連する部分のみを記載し、他の部分は省略化している。
【００４９】
図６のフローにおいて、まずステップＳ１として実行チャネル１６の初期化を行う。
この初期化処理では、コントローラ１０は実行プログラム２６の実行環境を整え、初期化処理が終了するとスキャンサイクルに入る。
【００５０】
スキャンサイクルでは、実行制御部１７はまずステップＳ２として外部入力取り込みを行う。この外部入力取り込みでは入力部１３から外部入力データを実行制御部１７に取り込む。
【００５１】
次に、ステップＳ３として実行制御部１７は、検証コードが格納される検証コード格納領域２２内の値の初期化を行う。
初期化が終了すると、実行制御部１７は、ステップＳ４として、実行プログラム格納領域１９から実行プログラム２６を読み込む。そしてステップＳ５としてステップＳ４で読み込んだ実行プログラム２６の実行処理を行う。この実行プログラム２６の実行処理は、実行制御部１７が実行プログラム２６のプログラムコードに従い、命令実行を進める。
【００５２】
このステップＳ５の実行プログラム２６の実行処理中、ＣＡＬ  ＣＲＣＧＥＮ，Ｘ’ｘｘｘｘ命令等の検証コード生成ルーチンを呼び出す命令を実行すると、処理を検証コード生成ルーチン格納領域２１内の検証コード生成ルーチンに処理を移す。
【００５３】
検証コード生成ルーチンでは、ステップＳ６として、パラメータ値Ｘ’ｘｘｘｘ等を用いて検証コードを生成し、これを検証コード格納領域２２に格納後、処理をステップＳ５に戻す。
【００５４】
この検証コード生成ルーチンは、検証コード生成ルーチンを呼び出す命令が実行される度に呼び出され、検証コード格納領域２２内の検証コードを更新する。
なおこの検証コード生成ルーチンの詳細については後述する。
【００５５】
ステップＳ５の実行プログラム２６の実行が完了すると、実行制御部１７は、ステップＳ７として検証コード格納領域２２内の検証コードをもう一つの実行チャネル１６に通知する。本例の場合には、実行チャネル１６−１は実行チャネル１６−２に、実行チャネル１６−２は実行チャネル１６−１に、自己の検証コードを通知する。
【００５６】
他の実行チャネル１６からの検証コードを受け取ったら（ステップＳ８）、実行制御部１７は、ステップＳ９として照合部２３によって自チャネルの検証コードと比較照合を行う。
【００５７】
そしてステップＳ９の検証コードの照合の結果、両者が不一致の場合（ステップＳ１０、ＮＯ）、プログラム実行順序が実行チャネル１６−１と実行チャネル１６−２で異なっていたことを示すので、ステップＳ１２として異常通知等の異常処理を行って処理を終了する。コントローラ１０は以降プログラム実行をしない。また実行プログラム２６の実行結果は出力しない。
【００５８】
一方、ステップＳ８の検証コードの照合の結果、両者が一致する場合は（ステップＳ１０、ＹＥＳ）、２つのチャネル１６でプログラム実行順序が同じであったことを示し、正常であるので、ステップＳ１１として演算結果を出力する。この出力データは、出力部１５を経由して、外部へ出力される。
【００５９】
演算結果を出力後、実行制御部１７は、ステップＳ１３として実行プログラム２６の実行継続かどうかの判断を行う。
プログラムコントローラ１は、プログラム生成装置２０をユーザが操作することによって、起動／停止コマンド生成部２７が起動／停止コマンドをコントローラ１０に対して発行し、実行チャネル１６による実行プログラム２６の実行／停止を行うことが出来る。
【００６０】
ステップＳ１３において、停止コマンドがプログラム生成装置２０から入力されていない場合、及び起動／停止スイッチ１２によって停止が指示されていない場合には、実行制御部１７は、実行プログラム２６の実行を継続し（ステップＳ１３、ＹＥＳ）、処理をステップＳ２に移してスキャンループの先頭に戻り、再び入力、演算、照合、出力の動作を繰り返す。
【００６１】
以降、検証コード不一致が検出されるか、ユーザから停止を指示されるまで、スキャンループを繰り返す。そしてユーザから停止指示を受けると（ステップＳ１３、ＮＯ）、実行プログラムの実行を終了する。
【００６２】
このようにして本実施形態のプログラマブルコントローラシステム１では、実行プログラムを実行し、また検証コードを用いて機能安全エラーを検出する。
なお上記例では、検証コード生成ルーチンとして図７のＣＲＣＧＥＮのルーチンを用いているが、後述する図８のＣＲＣＧＥＮ２のルーチンを用いても良い。このＣＲＣＧＥＮ２のルーチンを用いた場合、パラメータ値として実行プログラム２６での位置を示す値と実行プログラムによる演算結果も与えるので、実行プログラム２６の実行順序だけでなく演算結果の一致性も診断できる。
【００６３】
また上記例のコントローラは、２つの実行チャネル１６を備える構成を前提としているが本実施形態のプログラマブルコントローラシステム１は、３つ以上の実行チャネル１６を備える場合も想定している。実行チャネル１６を３つ以上備える場合には、機能安全の検証としては、全ての実行チャネル１６で生成された検証コードが全て一致したときのみ正常と判断し、１つでも値が異なる場合にはエラー処理を行う。
【００６４】
次に検証コード算出ルーチンの詳細について説明する。
図７は、図４の実行プログラム２６で呼び出されるＣＲＣＧＥＮの検証コード生成ルーチンの動作例を示す図である。同図のルーチンは、例えば、２バイト長の１つのパラメータを与えられて呼び出される。また検証コードの生成アルゴリズムとしては、デジタルデータ通信での使用実績が多いＣＲＣ１６を使用した場合を例として示している。
【００６５】
本実施形態においては、検証コードの生成アルゴリズムは特に限定しないが、単純和をとるチェックサムよりも、巡回冗長符号と呼ばれるＣＲＣの方が、データ誤り検出の確実性があると一般に知られており、本例ではこのＣＲＣ１６を用いて検証コードを生成している。
【００６６】
図７のＣＲＣＧＥＮのルーチンが呼び出されると、まずステップＳ２１として実行プログラム２６からルーチン呼び出し命令で与えられる入力パラメータ値をＣＲＣ計算アルゴリズムの入力パラメータ１にセットする。
【００６７】
次にステップＳ２２として検証コード格納領域２２から現在の検証コードを読み出し、この値をＣＲＣ計算アルゴリズムの入力パラメータ２にセットする。
そしてステップＳ２３として、ＣＲＣ１６計算アルゴリズムによって更新された検証コードを生成する。このＣＲＣ１６計算アルゴリズムでは、入力パラメータ２に入力パラメータ１の２バイト分の値を下位バイト、上位バイトの順に反映させて新しいＣＲＣコードを生成する。
【００６８】
そして最後に、ステップＳ２４としてステップＳ２３で生成したＣＲＣコードを更新した検証コードとして検証コード格納領域２２に格納後、処理を実行プログラム２６に戻す。
【００６９】
２つの実行チャネル１６−１、１６−２が、常に実行プログラム２６−１、２６−２のプログラムコードに忠実に処理を進めていった場合には、常に同じ値の入力パラメータ値を伴って図７のルーチンが呼ばれるため、２つの実行チャネル１６−１、１６−２の検証コードの値は一致する。しかし、例えば、分岐命令での誤った分岐実行や、ジャンプ先ミス、コード生成不良等のなんらかの異常より実行プログラムの実行順序に差が生じた場合は、異なった検証コードが算出され、照合部２３による実行プログラム２６終了後の検証コードの照合で不一致を検出する。
【００７０】
したがって検証コードを照合することによって、実行プログラム２６の実行順序を検証することが出来る。
図８は、図５の実行プログラム２６で呼び出されるＣＲＣＧＥＮ２の検証コード生成ルーチンの動作例を示す図である。同図のルーチンは、２バイト長の入力パラメータを２つ与えられて呼び出される。
【００７１】
図８のルーチンが呼び出されると、まずステップＳ３１として実行プログラム２６からルーチン呼び出し命令で与えられる第１のパラメータ値をＣＲＣ計算アルゴリズムの入力パラメータ１にセットする。
【００７２】
次にステップＳ３２として検証コード格納領域２２から現在の検証コードを読み出し、これをＣＲＣ計算アルゴリズムの入力パラメータ２にセットする。
そしてステップＳ３３として、ＣＲＣ１６計算アルゴリズムによって更新された検証コードを生成する。このＣＲＣ１６計算アルゴリズムでは、入力パラメータ２に入力パラメータ１の２バイト分の値を下位バイト、上位バイトの順に反映させて新しいＣＲＣコードを生成する。
【００７３】
次にステップＳ３４として実行プログラム２６からルーチン呼び出し命令で与えられる第２のパラメータ値をＣＲＣ計算アルゴリズムの入力パラメータ１にセットする。
そして次にステップＳ３５としてステップＳ３３で求めたＣＲＣコードをＣＲＣ計算アルゴリズムの入力パラメータ２にセットする。
【００７４】
そしてこの入力パラメータ１及び入力パラメータ２を用いて、ステップＳ３６として、ステップＳ３３と同様なＣＲＣ１６計算アルゴリズムによってＣＲＣコードを求める。
そして最後にステップＳ３７としてステップＳ３６で生成したＣＲＣコードを検証コードとして検証コード格納領域２２に格納後処理を実行プログラム２６に戻す。
【００７５】
このように図８の検証コード生成ルーチンでは、実行プログラム２６内の一意な値を示すパラメータと実行プログラムによる演算結果のパラメータを用いて検証コードを生成している。そのためこの図８の検証コード生成ルーチンを用いることにより、プログラム実行順序の差異検出のみならず、演算結果の差異検出も行うことが出来る。
【００７６】
なお図７、図８の検証コード生成ルーチンではＣＲＣコードを検証コードとしていたが、本実施形態はこのようなものに限定されるものではなく、上記したチェックサムの他にも、例えば、ＣＲＣコードに比較してサイズが大きくなるが、ＭＤやＳＨＡ等デジタルデータ通信でのメッセージ認証コード（ＭＡＣ）で採用実績が多いハッシュアルゴリズムを用いることも出来る。このハッシュコードの場合、ＣＲＣコードよりもさらに誤り検出の確実性があると一般に知られており、プログラム実行監視をより厳密にしたい場合は、ハッシュアルゴリズムを採用すればよい。
【００７７】
なお上記例では検証コード生成ルーチンには、１乃至２のパラメータ値を引き渡していたが、検証コード生成ルーチンに３つ以上のパラメータ値を引き渡して、検証コード生成ルーチンがこれらを用いて検証コードを生成するようにしても良い。
【００７８】
このように、必要な厳密性に基づいて検証コードの生成アルゴリズムを選択し、コントローラの検証コード算出ルーチンを実装することで所望のプログラム実行監視精度を備えたプログラマブルコントローラを実現することができる。
【００７９】
また異なるハードウエアおよびソフトウエアで構成される実行チャネルであっても、プログラム実行の途中経過の検証が、少ないメモリ量で、短い時間内に行うことが出来る。
更には実行プログラムの複雑度には影響されずに適用が可能で、冗長化された実行チャネルでのプログラム実行順序、結果の同一性の検査を行うことが出来る。
【符号の説明】
【００８０】
１      プログラマブルコントローラシステム
１０      （プログラマブル）コントローラ
１１      演算部
１２      起動停止スイッチ
１３      入力部
１４      起動コマンド受信部
１５      出力部
１６      実行チャネル
１７      実行制御部
１８      メモリ
１９      実行プログラム格納領域
２０      プログラム生成装置
２１      検証コード生成ルーチン格納領域
２２      検証コード格納領域
２３      照合部
２４      ラダー図
２５      実行プログラム生成部
２６      実行プログラム
２７      起動／停止コマンド生成部
３０      転送ケーブル
【図１】
2010244213.tif 000003
【図２】
2010244213.tif 000004
【図３】
2010244213.tif 000005
【図４】
2010244213.tif 000006
【図５】
2010244213.tif 000007
【図６】
2010244213.tif 000008
【図７】
2010244213.tif 000009
【図８】
2010244213.tif 000010