(57)【要約】【課題】製造コストの削減や小型軽量化を図ると共に、スループットの低下を回避しつつ、オブジェクトプログラムを実行するタイミングでの誤り検出が可能となる。【解決手段】プログラム実行装置１２０は、オブジェクトプログラムを実行する命令実行部２２０と、オブジェクトプログラムを一時的に保持するキャッシュメモリ２２２と、命令実行部によるオブジェクトプログラムのフェッチ要求を契機に、オブジェクトプログラムを読み込み、キャッシュメモリに保持させるプログラム読込部２２４と、読み込まれたオブジェクトプログラムに対し、順次、チェックコード導出式を計算し、ブロック単位でチェックコードを生成し、オブジェクトプログラムに予め挿入されているチェックコードと比較してオブジェクトプログラムの正否をブロック単位で判定するチェックコード判定部２２６とを備える。【選択図】図５
2012048445.tif 000002
【特許請求の範囲】
【請求項１】
所定のブロック単位で生成されたチェックコードが予め挿入されているオブジェクトプログラムを実行する命令実行部と、
前記命令実行部が前記オブジェクトプログラムを実行する際に該オブジェクトプログラムを一時的に保持するキャッシュメモリと、
前記命令実行部による前記オブジェクトプログラムのフェッチ要求を契機に、該オブジェクトプログラムを読み込み、前記キャッシュメモリに保持させるプログラム読込部と、
読み込まれた前記オブジェクトプログラムに対し、順次、チェックコード導出式を計算し、前記ブロック単位でチェックコードを生成し、前記オブジェクトプログラムに予め挿入されているチェックコードと比較してオブジェクトプログラムの正否を前記ブロック単位で判定するチェックコード判定部と、
を備えることを特徴とするプログラム実行装置。
【請求項２】
所定のブロック単位で生成されたチェックコードが予め挿入されているオブジェクトプログラムを実行する命令実行部と、
前記命令実行部が前記オブジェクトプログラムを実行する際に該オブジェクトプログラムを一時的に保持するキャッシュメモリと、
前記命令実行部による前記オブジェクトプログラムのフェッチ要求を契機に、該オブジェクトプログラムを読み込み、前記キャッシュメモリに保持させるプログラム読込部と、
読み込まれた前記オブジェクトプログラムに対し、順次、チェックコード導出式を計算し、前記オブジェクトプログラムに予め挿入されているチェックコードを含むオブジェクトプログラムの正否を前記ブロック単位で判定するチェックコード判定部と、
を備えることを特徴とするプログラム実行装置。
【請求項３】
前記チェックコード判定部が前記オブジェクトプログラムを前記ブロック単位で正しいと判定すると、前記命令実行部によるオブジェクトプログラムの実行を該ブロック単位で許可し、正しくないと判定すると、エラー処理を実行する判定結果処理部をさらに備えることを特徴とする請求項１または２に記載のプログラム実行装置。
【請求項４】
オブジェクトプログラムに対しチェックコード導出式を計算し、所定のブロック単位でチェックコードを生成するチェックコード生成部と、
生成された前記チェックコードを前記オブジェクトプログラムに挿入するチェックコード挿入部と、
を備えることを特徴とするプログラム生成装置。
【請求項５】
ソースプログラムをコンパイルして前記オブジェクトプログラムを生成するオブジェクトプログラム生成部をさらに備え、
前記チェックコード生成部は、生成された前記オブジェクトプログラムに対し、順次、チェックコード導出式を計算することを特徴とする請求項４に記載のプログラム生成装置。
【請求項６】
前記ブロックのサイズは、前記オブジェクトプログラムを実行する複数のプログラム実行装置における、キャッシュメモリへの読み込みサイズの最大公約数であることを特徴とする請求項４または５に記載のプログラム生成装置。
【請求項７】
前記チェックコード挿入部は、前記オブジェクトプログラムにおける前記チェックコードを挿入する位置の前段に、前記オブジェクトプログラムを実行する際に該チェックコードを実行させないジャンプ命令を挿入することを特徴とする請求項４から６のいずれか１項に記載のプログラム生成装置。
【請求項８】
前記チェックコード挿入部は、前記オブジェクトプログラムに挿入する前記チェックコードのオペコード部をＮＯＰとすることを特徴とする請求項４から６のいずれか１項に記載のプログラム生成装置。
【請求項９】
オブジェクトプログラムを実行する命令実行部と、該命令実行部が該オブジェクトプログラムを実行する際に該オブジェクトプログラムを一時的に保持するキャッシュメモリとを有するプログラム実行装置を用いたプログラム正否判定方法であって、
前記オブジェクトプログラムには所定のブロック単位で生成されたチェックコードが予め挿入されており、
前記命令実行部による前記オブジェクトプログラムのフェッチ要求を契機に、該オブジェクトプログラムを読み込み、前記キャッシュメモリに保持させ、
読み込んだ前記オブジェクトプログラムに対し、順次、チェックコード導出式を計算し、前記ブロック単位でチェックコードを生成し、前記オブジェクトプログラムに予め挿入されているチェックコードと比較してオブジェクトプログラムの正否を前記ブロック単位で判定することを特徴とするプログラム正否判定方法。
【請求項１０】
オブジェクトプログラムを実行する命令実行部と、該命令実行部が該オブジェクトプログラムを実行する際に該オブジェクトプログラムを一時的に保持するキャッシュメモリとを有するプログラム実行装置を用いたプログラム正否判定方法であって、
前記オブジェクトプログラムには所定のブロック単位で生成されたチェックコードが予め挿入されており、
前記命令実行部による前記オブジェクトプログラムのフェッチ要求を契機に、該オブジェクトプログラムを読み込み、前記キャッシュメモリに保持させ、
読み込んだ前記オブジェクトプログラムに対し、順次、チェックコード導出式を計算し、前記オブジェクトプログラムに予め挿入されているチェックコードを含むオブジェクトプログラムの正否を前記ブロック単位で判定することを特徴とするプログラム正否判定方法。
【請求項１１】
オブジェクトプログラムに対しチェックコード導出式を計算し、所定のブロック単位でチェックコードを生成し、
生成した前記チェックコードを前記オブジェクトプログラムに挿入することを特徴とするプログラム加工方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、オブジェクトプログラムの誤りを検出するためのプログラム実行装置、プログラム生成装置、プログラム正否判定方法、および、プログラム加工方法に関する。
【背景技術】
【０００２】
オブジェクトプログラムは、生成されてから実行されるまでに、オブジェクトプログラムを生成したプログラム生成装置において、または、そのオブジェクトプログラムを実行するプログラム実行装置において、誤ったデータに変わってしまうおそれがある。このようなデータの変化は、例えば、ソフトウェアのエラーや偶発的なハードウェア故障、ソフトウェアの暴走による意図しない書き換え等を要因として生じ得る。そこで、プログラム実行装置では、オブジェクトプログラムが生成時と異なっていないかどうかを、様々な誤り検出方法を用いて検出し、誤ったオブジェクトプログラムにより不本意な実行結果を招いてしまう事態を回避している。
【０００３】
このようなオブジェクトプログラムの誤り検出方法としては、例えばパリティチェックやＣＲＣ（Cyclic Redundancy Check）がある。かかる誤り検出方法では、オブジェクトプログラムに基づいてパリティビットやＣＲＣチェックコードといったチェックコードを予め生成しておき、オブジェクトプログラムを格納するプログラムメモリとは別体のメモリにそのチェックコードを個別に格納し、オブジェクトプログラムの利用時に改めてチェックコードを生成すると共に、予め生成されているチェックコードと比較することでオブジェクトプログラムの誤りを検出する（例えば、特許文献１、２）。
【０００４】
また、他の誤り検出方法として、数キロバイト単位でオブジェクトプログラムのサム値（チェックコード）を生成しておき、オブジェクトプログラムのダウンロード時に改めてサム値を生成すると共に、予め生成されているサム値と比較するチェックサムも知られている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平６−２４２９７７号公報
【特許文献２】特開平３−１８６９３７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
上述したパリティチェックやＣＲＣといった誤り検出方法では、プログラムメモリの他に、パリティビットやＣＲＣチェックコードといったチェックコードを格納するためのメモリを準備しなくてはならない。例えば、３２ビットのマシンコード幅をもつ中央制御部（プロセッサ）が、８ビット単位で１ビットのパリティビット（偶数パリティまたは奇数パリティ）を付加する場合、３２ビットのデータに対して４ビットのパリティビットを要すこととなり、そのパリティビットを格納するため、１ビットのメモリを４つまたは８ビットのメモリを準備しなければならなくなる。
【０００７】
上述した１ビットのメモリは、入手が困難であり、８ビットのメモリと比べメモリ単価が高いといった問題を有し、８ビットのメモリでは、４ビット利用した残りの４ビットが無駄になるといった問題がある。また、いずれの場合も、メモリを追加したことによる製造コストの増大のみならず、そのメモリをプリント基板に実装するための占有面積を確保しなければならず、小型軽量化の弊害となっていた。
【０００８】
また、チェックサムによる誤り検出方法では、メモリを別途準備することなく誤りを検出することも可能ではあるが、数キロバイト単位といった比較的サイズの大きい領域を対象としており、チェックサムによってサム値が計算されている間は他の処理を実行できなかった。仮に、オブジェクトプログラムを実行する際にチェックサムを実行したとすると、チェックサムの度にオブジェクトプログラムが中断され、スループット（実効処理能力）の低下を招いてしまう。したがって、チェックサムによる誤り検出方法は、オブジェクトプログラムを外部からプログラムメモリに取り込んだ直後等、比較的時間に余裕があるタイミングにしか利用できなかった。また、チェックサムによる誤り検出方法では、オブジェクトプログラムをプログラムメモリに取り込んだときに誤りが無いことを確認したとしても、その後、プログラムメモリにおいてデータが変化したり、キャッシュメモリへの読み込み時にデータが変化してしまうと、オブジェクトプログラムの誤りが検出されないまま、実行されてしまうおそれがあった。
【０００９】
そこで、本発明は、このような課題に鑑み、製造コストの削減や小型軽量化を図ると共に、スループットの低下を回避しつつ、オブジェクトプログラムを実行するタイミングでの誤り検出が可能な、プログラム実行装置、プログラム生成装置、プログラム正否判定方法、および、プログラム加工方法を提供することを目的としている。
【課題を解決するための手段】
【００１０】
上記課題を解決するために、本発明のプログラム実行装置は、所定のブロック単位で生成されたチェックコードが予め挿入されているオブジェクトプログラムを実行する命令実行部と、命令実行部がオブジェクトプログラムを実行する際にオブジェクトプログラムを一時的に保持するキャッシュメモリと、命令実行部によるオブジェクトプログラムのフェッチ要求を契機に、オブジェクトプログラムを読み込み、キャッシュメモリに保持させるプログラム読込部と、読み込まれたオブジェクトプログラムに対し、順次、チェックコード導出式を計算し、ブロック単位でチェックコードを生成し、オブジェクトプログラムに予め挿入されているチェックコードと比較してオブジェクトプログラムの正否をブロック単位で判定するチェックコード判定部とを備えることを特徴とする。
【００１１】
上記課題を解決するために、本発明の他のプログラム実行装置は、所定のブロック単位で生成されたチェックコードが予め挿入されているオブジェクトプログラムを実行する命令実行部と、命令実行部がオブジェクトプログラムを実行する際にオブジェクトプログラムを一時的に保持するキャッシュメモリと、命令実行部によるオブジェクトプログラムのフェッチ要求を契機に、オブジェクトプログラムを読み込み、キャッシュメモリに保持させるプログラム読込部と、読み込まれたオブジェクトプログラムに対し、順次、チェックコード導出式を計算し、オブジェクトプログラムに予め挿入されているチェックコードを含むオブジェクトプログラムの正否をブロック単位で判定するチェックコード判定部とを備えることを特徴とする。
【００１２】
プログラム実行装置は、チェックコード判定部がオブジェクトプログラムをブロック単位で正しいと判定すると、命令実行部によるオブジェクトプログラムの実行をブロック単位で許可し、正しくないと判定すると、エラー処理を実行する判定結果処理部をさらに備えてもよい。
【００１３】
上記課題を解決するために、本発明のプログラム生成装置は、オブジェクトプログラムに対しチェックコード導出式を計算し、所定のブロック単位でチェックコードを生成するチェックコード生成部と、生成されたチェックコードをオブジェクトプログラムに挿入するチェックコード挿入部とを備えることを特徴とする。
【００１４】
プログラム生成装置は、ソースプログラムをコンパイルしてオブジェクトプログラムを生成するオブジェクトプログラム生成部をさらに備え、チェックコード生成部は、生成されたオブジェクトプログラムに対し、順次、チェックコード導出式を計算してもよい。
【００１５】
ブロックのサイズは、オブジェクトプログラムを実行する複数のプログラム実行装置における、キャッシュメモリへの読み込みサイズの最大公約数であってもよい。
チェックコード挿入部は、オブジェクトプログラムにおけるチェックコードを挿入する位置の前段に、オブジェクトプログラムを実行する際にチェックコードを実行させないジャンプ命令を挿入してもよい。
【００１６】
チェックコード挿入部は、オブジェクトプログラムに挿入するチェックコードのオペコード部をＮＯＰとしてもよい。
上記課題を解決するために、オブジェクトプログラムを実行する命令実行部と、命令実行部がオブジェクトプログラムを実行する際にオブジェクトプログラムを一時的に保持するキャッシュメモリとを有するプログラム実行装置を用いた、本発明のプログラム正否判定方法は、オブジェクトプログラムには所定のブロック単位で生成されたチェックコードが予め挿入されており、命令実行部によるオブジェクトプログラムのフェッチ要求を契機に、オブジェクトプログラムを読み込み、キャッシュメモリに保持させ、読み込んだオブジェクトプログラムに対し、順次、チェックコード導出式を計算し、ブロック単位でチェックコードを生成し、オブジェクトプログラムに予め挿入されているチェックコードと比較してオブジェクトプログラムの正否をブロック単位で判定することを特徴とする。
【００１７】
上記課題を解決するために、オブジェクトプログラムを実行する命令実行部と、命令実行部がオブジェクトプログラムを実行する際にオブジェクトプログラムを一時的に保持するキャッシュメモリとを有するプログラム実行装置を用いた、本発明の他のプログラム正否判定方法は、オブジェクトプログラムには所定のブロック単位で生成されたチェックコードが予め挿入されており、命令実行部によるオブジェクトプログラムのフェッチ要求を契機に、オブジェクトプログラムを読み込み、キャッシュメモリに保持させ、読み込んだオブジェクトプログラムに対し、順次、チェックコード導出式を計算し、オブジェクトプログラムに予め挿入されているチェックコードを含むオブジェクトプログラムの正否をブロック単位で判定することを特徴とする。
【００１８】
上記課題を解決するために、本発明のプログラム加工方法は、オブジェクトプログラムに対しチェックコード導出式を計算し、所定のブロック単位でチェックコードを生成し、生成したチェックコードをオブジェクトプログラムに挿入することを特徴とする。
【発明の効果】
【００１９】
以上のように本発明では、別途のメモリが不要となるので製造コストの削減や小型軽量化を図ることができ、チェックコード導出式の計算対象サイズと計算タイミングを工夫することで、スループットの低下を回避しつつ、オブジェクトプログラムを実行するタイミングでの誤り検出が可能となる。
【図面の簡単な説明】
【００２０】
【図１】プログラム実行システムを構成する各装置の概略的な関係を示した説明図である。
【図２】プログラム生成装置の概略的な機能を示した機能ブロック図である。
【図３】チェックコード生成部の処理を説明するための説明図である。
【図４】チェックコード挿入部の処理を説明するための説明図である。
【図５】プログラム実行装置の概略的な機能を示した機能ブロック図である。
【図６】チェックコード判定部の処理を説明するための説明図である。
【図７】プログラム加工方法の全体的な流れを示したフローチャートである。
【図８】プログラム正否判定方法の全体的な流れを示したフローチャートである。
【発明を実施するための形態】
【００２１】
以下に添付図面を参照しながら、本発明の好適な実施形態について詳細に説明する。かかる実施形態に示す寸法、材料、その他具体的な数値などは、発明の理解を容易とするための例示にすぎず、特に断る場合を除き、本発明を限定するものではない。なお、本明細書及び図面において、実質的に同一の機能、構成を有する要素については、同一の符号を付することにより重複説明を省略し、また本発明に直接関係のない要素は図示を省略する。
（プログラム実行システム１００）
図１は、プログラム実行システム１００を構成する各装置の概略的な関係を示した説明図である。プログラム実行システム１００は、プログラム生成装置１１０と、プログラム実行装置１２０と、制御機器１３０とを含んで構成され、プログラム生成装置１１０とプログラム実行装置１２０とが、また、プログラム実行装置１２０と制御機器１３０とがそれぞれ信号線１４０を通じて接続されている。
【００２２】
プログラム生成装置１１０は、プログラム実行装置１２０において実行されるオブジェクトプログラムを生成する。プログラム実行装置１２０は、プログラム生成装置１１０で生成されたオブジェクトプログラムを取り込み、そのオブジェクトプログラムを実行することで制御機器１３０を制御する。プログラム生成装置１１０やプログラム実行装置１２０としては、パーソナルコンピュータ、ＰＤＡ（Personal Digital Assistant）、携帯電話、専用機器等、中央制御部（ＣＰＵ）を有する様々な電子機器を適用できる。本実施形態では、プログラム生成装置１１０の一例としてパーソナルコンピュータを、プログラム実行装置１２０の一例としてＰＬＣ（Programmable Logic Controller）を、制御機器１３０の一例としてＦＡ（Factory Automation）における様々な状態を検知するセンサ、そのセンサの検知結果に応じて動作する電動機や表示器を挙げて説明する。
【００２３】
ここで、ＰＬＣは、センサ等の入力に応じて電動機等へ制御指令を行うＦＡ用の制御装置である。パーソナルコンピュータでは、ラダー図等を通じ、このようなＰＬＣで実現可能な、オブジェクトプログラムとしてのシーケンス制御プログラムを生成する。以下、プログラム生成装置１１０およびプログラム実行装置１２０の各機能部について説明し、その後、当該プログラム生成装置１１０およびプログラム実行装置１２０を用いた、プログラム正否判定方法およびプログラム加工方法を詳述する。
（プログラム生成装置１１０）
図２は、プログラム生成装置１１０の概略的な機能を示した機能ブロック図である。図２に示すように、プログラム生成装置１１０は、操作部１５０と、表示部１５２と、通信部１５４と、データメモリ１５６と、中央制御部１５８とを含んで構成され、各機能部が共通バス１６０によって接続されている。
【００２４】
操作部１５０は、キーボード、ポインティングデバイス、十字キー、ジョイスティック、ジョグダイヤル、タッチパネル等のスイッチから構成され、ユーザの操作入力を受け付けて、その操作内容を中央制御部１５８に伝達する。表示部１５２は、液晶ディスプレイ、有機ＥＬ(Electro Luminescence)ディスプレイ等で構成され、中央制御部１５８の制御指令に応じてシーケンス制御プログラムを生成するための様々な画像を表示する。
【００２５】
通信部１５４は、信号線１４０を介してプログラム実行装置１２０に接続されており、予め定められた通信プロトコルに基づきプログラム実行装置１２０との間でデータを授受する役目を担う。データメモリ１５６は、ＲＡＭ（Random Access Memory）、フラッシュメモリ、ＨＤＤ（Hard Disk Drive）等で構成され、中央制御部１５８の各機能部の処理に必要な情報を保持する。
【００２６】
中央制御部１５８は、ＣＰＵを含む半導体集積回路で構成され、ＲＯＭから自体を動作させるためのプログラムやパラメータ等を読み出し、ワークエリアとしてのデータメモリ１５６や他の電子回路と協働してプログラム生成装置１１０全体を管理および制御する。また、中央制御部１５８は、ソースプログラム生成部１７０、オブジェクトプログラム生成部１７２、チェックコード生成部１７４、チェックコード挿入部１７６、プログラム書込部１７８としても機能する。
【００２７】
ソースプログラム生成部１７０は、例えば、リレーによる論理回路を表すラダー図（ラダーロジック）や他のプログラミング言語を通じてシーケンス制御プログラム（オブジェクトプログラム）の元となるソースプログラムを生成する。ここで、ソースプログラムは、任意の言語や記述方法にて記述されたデータ処理手段をいう。
【００２８】
オブジェクトプログラム生成部１７２は、ソースプログラム生成部１７０が生成したソースプログラムをコンパイルしてシーケンス制御プログラムを生成する。シーケンス制御プログラムは、プログラム実行装置１２０の中央制御部が直接実行可能な実行コード（マシン語）で構成される。
【００２９】
チェックコード生成部１７４は、オブジェクトプログラム生成部１７２が生成したシーケンス制御プログラムに対し、順次、チェックコード導出式を計算し、所定の（予め定められた）ブロック単位でチェックコード（プログラム実行装置１２０で生成されるチェックコードと区別するため、以下、既設チェックコードと言う。）を生成する。チェックコード導出式（チェックアルゴリズム）は、例えば、ＣＲＣチェックコード、水平または垂直パリティビット、サム値、ハッシュ値等の既設チェックコードを導出するための論理式である。チェックコード導出式としてどのようなアルゴリズムを採用するかは、誤り検出の必要精度や誤り訂正の有無によって決定することができる。また、ブロックは、任意に設定可能な、１のチェックコードに対応付けられるデータの範囲を言うが、そのサイズをマシンコード幅（例えば４バイト）の整数倍（例えば、１２８バイト）とするのが望ましい。
【００３０】
本実施形態では、チェックコードとしてＣＲＣチェックコードを挙げている。ＣＲＣは、誤りの検出精度が高いのみならず、誤り箇所が連続するバースト誤りも検出できる点で非常に優れている。したがって、チェックコード導出式は、オブジェクトプログラム生成部１７２が生成したシーケンス制御プログラムを順次ＣＲＣの生成多項式で除算することとなる。このようにシーケンス制御プログラムの生成と並行してチェックコード導出式を順次計算する構成により、オブジェクトプログラム生成部１７２がブロック分（正確にはブロックからＣＲＣチェックコードを除いた部分）のシーケンス制御プログラムの生成を終えると、チェックコード生成部１７４もチェックコード導出式の計算を完了することができ、コンパイル時間の長時間化を招くことなく、本実施形態の目的を達成することが可能となる。このときの計算結果である、生成多項式で除算した余りがＣＲＣチェックコード（既設チェックコード）となる。
【００３１】
ところで、プログラム生成装置１１０は、自体で生成したシーケンス制御プログラムを実行するプログラム実行装置１２０を特定できる場合、そのプログラム実行装置１２０におけるキャッシュメモリへの読み込みサイズ（例えば、１２８バイト）をプログラム実行装置１２０のプロパティ等を通じて把握することができる。したがって、既設チェックコードの対象となるブロックのサイズを、プログラム実行装置１２０におけるキャッシュメモリへの読み込みサイズ（１２８バイト）とすることで、後述するプログラム実行装置１２０のチェックコード判定部においても、チェックコード生成部１７４同様、誤り検出の効率化および処理時間の短縮化を図ることができる。ただし、ブロックには計算対象のプログラムコードのみならず既設チェックコードも含まれる。
【００３２】
また、接続するプログラム実行装置１２０が複数種類想定される場合、既設チェックコードを計算するブロックのサイズを、複数種類のプログラム実行装置１２０における、キャッシュメモリへの読み込みサイズの最大公約数としてもよい。
【００３３】
図３は、チェックコード生成部１７４の処理を説明するための説明図である。例えば、３つのプログラム実行装置１２０ａ、１２０ｂ、１２０ｃのキャッシュメモリへの読み込みサイズがそれぞれ１２８バイト、１９２バイト、２５６バイトであった場合、チェックコード生成部１７４は、各プログラム実行装置１２０ａ、１２０ｂ、１２０ｃにおける、オブジェクトプログラムのキャッシュメモリへの読み込みサイズの最大公約数である６４バイト毎に、例えば、２バイト（ＣＲＣ−１６）の既設チェックコードを生成する（図３中、細分化された領域は、既設チェックコードの生成対象となるブロックを示し、その中央に付された「６４」は容量（バイト）を示す。）。
【００３４】
プログラム実行装置１２０は、それぞれで規定されている読み込みサイズでシーケンス制御プログラムを読み込み、最大公約数単位で既設チェックコードを判定する。例えば、プログラム実行装置１２０ｂは、キャッシュメモリに１９２バイトのシーケンス制御プログラムを読み込むが、６４バイト毎に順次チェックコードを判定し、３回（１９２／６４）の判定を経てキャッシュメモリに読み込んだ１９２バイト分のシーケンス制御プログラム全てが正しいことを把握する。
【００３５】
こうすることで、キャッシュメモリへの読み込みサイズが異なる複数種類のプログラム実行装置１２０ａ、１２０ｂ、１２０ｃに対しても、キャッシュメモリへの読み込みと並行してチェックコード導出式を計算させることが可能となり、プログラム実行装置１２０における既設チェックコードの判定頻度を最小限に抑えつつ、誤り検出に費やす時間の短縮化を図ることができる。
【００３６】
また、逆に考えると、既存のプログラム生成装置１１０を流用する等の事情から、チェックコード生成部１７４において、既設チェックコードの生成単位であるブロックサイズが予め決まっている場合、プログラム実行装置１２０におけるキャッシュメモリの読み込みサイズを、予め決まっているブロックサイズを整数倍した値に設定することもできる。
【００３７】
チェックコード挿入部１７６は、チェックコード生成部１７４が生成した既設チェックコードを、オブジェクトプログラム生成部１７２が生成したシーケンス制御プログラムに順次挿入する。このとき、チェックコード挿入部１７６は、プログラム実行装置１２０がシーケンス制御プログラムを読み込んだとき、ブロック単位で効率よく誤り検出を行わせるために、既設チェックコードを、既設チェックコードを生成する元となったシーケンス制御プログラムの中または近くに挿入する。
【００３８】
このように、既設チェックコードをシーケンス制御プログラム本体にデータの一部として挿入することで、誤り検出に関し、別途のメモリが不要となり、製造コストの削減や小型軽量化を図ることができる。このとき、既設チェックコードを別途のメモリに保持することなくシーケンス制御プログラムに新たな領域を設けて挿入しているので、シーケンス制御プログラム自体の容量は増加することとなるが、容量が大きくなる分については、技術の進歩に伴うメモリ容量の増大化やシステムクロックの高速化で吸収できるので問題にはならない。
【００３９】
また、チェックコード挿入部１７６は、プログラム実行装置１２０が既設チェックコードとシーケンス制御プログラム本体とを区別し、シーケンス制御プログラムのみを実行できるよう、様々な挿入態様をとることができる。
【００４０】
図４は、チェックコード挿入部１７６の処理を説明するための説明図である。例えば、図４（ａ）に示すように、ソースプログラム生成部１７０が生成したソースプログラム１８０をオブジェクトプログラム生成部１７２がコンパイルして、シーケンス制御プログラム１８２が生成されたとする。チェックコード挿入部１７６は、図４（ｂ）の如く、チェックコード生成部１７４が生成した既設チェックコードを挿入する。ここでは、既設チェックコードを挿入する位置の前段に、シーケンス制御プログラムを実行する際に既設チェックコードを実行させないジャンプ命令が予め挿入されている。
【００４１】
具体的に、チェックコード生成部１７４は、図４（ｂ）のプログラムコード１〜３０（例えば、アドレスxxx000h〜xxx077h）とその直後に配されたジャンプ命令（例えば、アドレスxxx078h〜xxx07Bh）に関してチェックコード導出式を計算し、既設チェックコードを生成すると、ジャンプ命令の後段（例えば、アドレスxxx07Ch〜xxx07Fh）に、その生成された既設チェックコードを挿入する。こうして、プログラムコード１〜３０と既設チェックコードとがグループ化されてブロックが形成される。かかるブロックでは、シーケンス制御プログラムの実行時に、実行アドレスがxx078hのジャンプ命令に至ると、アドレスを４番地（４バイト）先に飛ばしてしまうため、既設チェックコードがプログラムコードとして実行されずに済むこととなる。
【００４２】
ここで、既設チェックコードの対象がプログラムコード１〜３０（１２０バイト）となるのは、ブロックサイズを１２８バイトとしたとき、ジャンプ命令と既設チェックコードとが８バイト占有してしまうためである。
【００４３】
このようなジャンプ命令を挿入する場合、マシンコード幅（例えば４バイト）すべての領域を、既設チェックコードを格納する領域として利用することができる、即ち、既設チェックコードを４バイトまで延長することができる。その反面、ジャンプ命令を挿入する領域をブロック毎に設けなくてはならないので、チェックコード挿入後のシーケンス制御プログラムの容量が比較的大きくなってしまう。
【００４４】
また、チェックコード挿入部１７６は、図４（ｃ）の如く、シーケンス制御プログラムに挿入する既設チェックコードのオペコード部をＮＯＰ（No OPeration）とすることもできる。
【００４５】
具体的に、チェックコード生成部１７４は、図４（ｃ）のプログラムコード１〜３１（例えば、アドレスxxx000h〜xxx07Bh）に関してチェックコード導出式を計算し、既設チェックコードを生成すると、その直後（例えば、アドレスxxx07Ch〜xxx07Fh）に、オペコード部をＮＯＰとし、オペランド部を生成された既設チェックコードとするプログラムコードを挿入する。こうしてプログラムコード１〜３１とＮＯＰを伴った既設チェックコードとがグループ化され、ブロックが形成される。かかるブロックでは、シーケンス制御プログラムの実行時に、実行アドレスがxxx07ChのＮＯＰに至ると、そのプログラムコードを無視するため、既設チェックコードがプログラムコードとして実行されずに済むこととなる。
【００４６】
ここでは、ジャンプ命令を挿入する場合と異なり、既設チェックコードの対象がプログラムコード１〜３１（１２４バイト）となる。これは、ブロックサイズを１２８バイトとしたとき、ＮＯＰのプログラムコードが４バイトしか占有しないためである。
【００４７】
ＮＯＰによるプログラムコードを利用する場合、既設チェックコードとして利用できる領域がオペランド部に制限される（データ幅３２ビットのうち例えばオペコード部が６ビットを占有している場合、残りの２６ビットしか利用できない。）が、上述したジャンプ命令を挿入する必要がなくなるので、シーケンス制御プログラムの容量の増大を抑制することができる。
【００４８】
プログラム書込部１７８は、このようにして生成されたシーケンス制御プログラムを、通信部１５４を通じてプログラム実行装置１２０にダウンロードしたり、プログラム実行装置１２０のパラメータ等を設定して動作指示を行ったりする。
（プログラム実行装置１２０）
図５は、プログラム実行装置１２０の概略的な機能を示した機能ブロック図である。図５に示すように、プログラム実行装置１２０は、通信部２００ａ、２００ｂと、プログラムメモリ２０２と、データメモリ２０４と、中央制御部２０６とを含んで構成され、中央制御部２０６と通信部２００ａとプログラムメモリ２０２とは共通バス２０８ａによって、中央制御部２０６と通信部２００ｂとデータメモリ２０４とは共通バス２０８ｂによって接続されている。
【００４９】
通信部２００ａは、信号線１４０を介してプログラム生成装置１１０に接続され、通信部２００ｂは、信号線１４０を介して制御機器１３０に接続されており、予め定められた通信プロトコルに基づきプログラム生成装置１１０や制御機器１３０との間でデータを授受する役目を担う。
【００５０】
プログラムメモリ２０２は、ＲＡＭ、不揮発性ＲＡＭ、ＥＥＰＲＯＭ（Electrically Erasable Programmable ROM）、フラッシュメモリ、ＨＤＤ等で構成され、プログラム生成装置１１０で生成されたシーケンス制御プログラムを保持する。また、保持されるシーケンス制御プログラムは、上述したように所定のブロック単位で生成された既設チェックコードが予め挿入されている。
【００５１】
データメモリ２０４は、ＲＡＭ、フラッシュメモリ、ＨＤＤ等で構成され、中央制御部２０６の各機能部の処理に必要な情報を保持する。本実施形態では、図５に示すように、中央制御部２０６がプログラムメモリ２０２にアクセスするための共通バス２０８ａと、データメモリ２０４にアクセスするための共通バス２０８ｂとを独立して形成するハーバードアーキテクチャを採用しているが、共通バスを両者で共用する非ハーバードアーキテクチャを採用することもできる。
【００５２】
中央制御部２０６は、ＣＰＵを含む半導体集積回路で構成され、ＲＯＭから自体を動作させるためのプログラムやパラメータ等を読み出し、ワークエリアとしてのデータメモリ２０４や他の電子回路と協働してプログラム実行装置１２０全体を管理および制御する。また、中央制御部２０６は、命令実行部２２０、キャッシュメモリ２２２、プログラム読込部（キャッシュコントローラ）２２４、チェックコード判定部２２６、判定結果処理部２２８としても機能する。
【００５３】
命令実行部２２０は、パワーオンまたはリセットスタート後、プログラム読込部２２４にフェッチ要求を発し、後述する判定結果処理部２２８の実行許可信号に応じて、所定の制御周期間隔でサイクリックにシーケンス制御プログラムのプログラムコード（インストラクション）を解読し、解読したプログラムコードに基づいて制御機器１３０に各制御指令を行う。ここで、フェッチは、命令実行部２２０がシーケンス制御プログラムを実行する際、後述するプログラム読込部２２４を通じて、その最初の段階でキャッシュメモリ２２２からプログラムコードを読み出す処理を含む。
【００５４】
キャッシュメモリ２２２は、ＳＤＲＡＭ（Synchronous Dynamic RAM）等のＲＡＭで構成され、シーケンス制御プログラムを高速に実行するため、命令実行部２２０がシーケンス制御プログラムを実行する際にシーケンス制御プログラムを一時的に保持する。ここで、キャッシュメモリ２２２への読み込みサイズはプログラム実行装置１２０毎に予め定められている。
【００５５】
プログラム読込部２２４は、命令実行部２２０によって所定の制御周期間隔で発せられるシーケンス制御プログラムのフェッチ要求を契機に、キャッシュメモリ２２２内に目的とするシーケンス制御プログラムが有るか否か確認し、無ければ、シーケンス制御プログラムをプログラムメモリ２０２から読み込み、キャッシュメモリ２２２に保持させる。命令実行部２２０は、このようにして読み込まれたシーケンス制御プログラムのプログラムコードを解読する。
【００５６】
チェックコード判定部２２６は、プログラム読込部２２４によってキャッシュメモリ２２２に読み込まれたシーケンス制御プログラムに対し、順次、チェックコード導出式を計算し、ブロック単位でチェックコード（上述した既設チェックコードと区別するため、以下、新設チェックコードと言う。）を生成する。そして、チェックコード判定部２２６は、シーケンス制御プログラムに予め挿入されている既設チェックコードと、新設チェックコードとを比較してシーケンス制御プログラムの正否をブロック単位で判定する。このようなシーケンス制御プログラムの誤りは、ソフトウェアのエラーや偶発的なハードウェア故障、ソフトウェアの暴走による意図しない書換え、中央制御部２０６とプログラムメモリ２０２とを結ぶ共通バス２０８ａにノイズが印加された場合等を要因として生じ得る。
【００５７】
図６は、チェックコード判定部２２６の処理を説明するための説明図である。例えば、プログラム生成装置１１０から受信したシーケンス制御プログラムの各ブロックが、図６（ａ）のようにプログラムコードとジャンプ命令と既設チェックコードとで構成されているとする。プログラム読込部２２４がキャッシュメモリ２２２にシーケンス制御プログラムを読み込み、キャッシュメモリ２２２に保持させる間に、チェックコード判定部２２６は、読み込まれたシーケンス制御プログラムに対し順次チェックコード導出式を計算し、既設チェックコードを除くプログラムコード１〜３０およびジャンプ命令（例えば、アドレスxxx000h〜xxx07Bh）までを計算し終えると、その時点の計算結果を新設チェックコードとして保持する。
【００５８】
チェックコード判定部２２６は、さらに、シーケンス制御プログラムとして読み込まれた既設チェックコード（例えば、アドレスxxx07Ch〜xxx07Fh）を抽出し、新設チェックコードと比較して一致しているか否か判定する。かかる判定結果は、後述する判定結果処理部２２８で利用される。
（他の誤り検出）
上述した例では、チェックコード導出式によって計算された、生成時刻の異なる２つのチェックコードを比較することで、その異なる時間の間にシーケンス制御プログラムのデータが変化したか否かを判定している。しかし、ＣＲＣやパリティチェック、チェックサムといった誤り検出方法では、それぞれ、新たにチェックコードを導出することなく、チェックコード導出式を用いて誤り検出を自己完結的に実行することができる。
【００５９】
例えば、ＣＲＣの場合、計算対象となるプログラムコードおよびジャンプ命令をビットシフトし既設チェックコードを追加した上でチェックコード導出式の計算（生成多項式で除算）を実行すると、シーケンス制御プログラムに誤りがない場合には除算した余りが０になるといった特徴を有する。したがって、生成多項式で除算した余りの有無によってシーケンス制御プログラムの誤りを検出することが可能なことが理解できる。
【００６０】
そこで、チェックコード判定部２２６は、読み込まれたシーケンス制御プログラムに対し、順次、チェックコード導出式を計算し、シーケンス制御プログラムに予め挿入されているチェックコードを含むシーケンス制御プログラムの正否を、例えば、生成多項式で除算した余りの有無によって判定する。
【００６１】
例えば、プログラム生成装置１１０から受信したシーケンス制御プログラムの各ブロックが、図６（ｂ）のようにプログラムコードとジャンプ命令と既設チェックコードとで構成されているとする。プログラム読込部２２４がキャッシュメモリ２２２にシーケンス制御プログラムを読み込み、キャッシュメモリ２２２に保持させる間に、チェックコード判定部２２６は、読み込まれたシーケンス制御プログラムに対し順次チェックコード導出式を計算し、ブロック全体に渡って、即ち、プログラムコード１〜３０、ジャンプ命令および既設チェックコード（例えば、アドレスxxx000h〜xxx07Fh）を計算し、その計算結果が０かまたは有意な値を示すか判定する。
【００６２】
このように自己完結的にシーケンス制御プログラムの正否を判定することで、チェックコード同士を比較する場合と比べ、比較処理の分だけ処理負荷を軽減でき、信頼性の向上を図ることができる。
【００６３】
判定結果処理部２２８は、チェックコード判定部２２６がシーケンス制御プログラムをブロック単位で正しいと判定すると、即ち、プログラム生成装置１１０で生成されてから命令実行部２２０がフェッチ要求を発するまでシーケンス制御プログラムのデータに変化がなく、安全に利用することができると判定すると、命令実行部２２０によるシーケンス制御プログラムの実行を許可するため実行許可信号をブロック単位で命令実行部２２０に出力し、正しくないと判定すると、エラー処理を実行する。上述したように、命令実行部２２０は、かかる実行許可信号を受けて、制御機器１３０に各制御指令を出力する。
【００６４】
ここで、エラー処理は、エラーが生じているビットを特定できる場合におけるエラー訂正処理であったり、命令実行部２２０にエラー信号を出力して、命令実行部２２０の制御動作を停止させる処理である。制御動作の停止は、命令実行部２２０からの制御指令の停止に従ったものでもよいし、各制御機器１３０の動作を停止させる処理であってもよい。
【００６５】
また、当該実行許可信号を、安全状態を示す信号として用い、実行許可信号を定期的に確認できている間のみ命令実行部２２０や各制御機器１３０を有効に動作させる安全コントローラとして利用してもよい。さらに、他のプログラム実行装置１２０の中央制御部２０６におけるエラー診断材料として当該実行許可信号を利用し、相互の安全性を高めることもできる。また、エラー信号が出力されると、任意に設けられた報知部が外部にエラーが生じたことを報知するとしてもよい。
【００６６】
以上、説明したプログラム生成装置１１０およびプログラム実行装置１２０によって、（１）製造コストの削減や小型軽量化を図ることができ、（２）スループットの低下を回避しつつ、（３）シーケンス制御プログラムを実行するタイミングでの誤り検出が可能となる。以下、（１）、（２）、（３）について具体的に説明する。
【００６７】
（１）プログラム生成装置１１０において、シーケンス制御プログラム自体に既設チェックコードが埋め込まれ、また、プログラム実行装置１２０において、その埋め込まれた既設チェックコードがシーケンス制御プログラムの正否判定に用いられるので、チェックコードを保持するための高コスト化かつ占有面積増大を招く別途のメモリ（通常のメモリのみならず、データ幅が８ビットの整数倍になっていない、例えば１ビットや９ビットといった特殊かつ高価なメモリ等）が不要となり、製造コストの削減や小型軽量化を図ることができる。
【００６８】
（２）また、チェックコード導出式の計算対象であるブロックサイズをプログラム実行装置１２０のそれぞれのキャッシュメモリ２２２への読み込みサイズの最大公約数とし、計算タイミングを、プログラム読込部２２４によるキャッシュメモリ２２２へのシーケンス制御プログラムの読み込み時とすることで、適切なサイズで効率よくシーケンス制御プログラムの誤りを検出することができ、スループットの低下を回避することが可能となる。
【００６９】
（３）さらに、プログラムを実行する直前のタイミングにおいて、命令実行部２２０のフェッチ先であるキャッシュメモリ２２２に保持されたシーケンス制御プログラムの誤り検出が可能となるので、プログラムメモリ２０２やキャッシュメモリ２２２でのデータ化けや、中央制御部２０６とプログラムメモリ２０２との共通バス２０８ａを経由したことによるデータの変化までも検出することができ、信頼性や安定性の向上を図ることが可能となる。
【００７０】
また、コンピュータを、プログラム生成装置１１０やプログラム実行装置１２０として機能させるプログラムを記録した、コンピュータで読み取り可能なフレキシブルディスク、光磁気ディスク、ＲＯＭ、ＥＰＲＯＭ、ＥＥＰＲＯＭ、ＣＤ（Compact Disc）、ＤＶＤ（Digital Versatile Disc）、ＢＤ（Blu-ray Disc）等の記憶媒体も提供される。
（プログラム加工方法、プログラム正否判定方法）
次に、シーケンス制御プログラムを加工するプログラム加工方法、および、シーケンス制御プログラムの正否を判定するプログラム正否判定方法を説明する。図７は、プログラム加工方法の全体的な流れを示したフローチャートであり、図８は、プログラム正否判定方法の全体的な流れを示したフローチャートである。
【００７１】
図７を参照すると、まず、プログラム生成装置１１０のソースプログラム生成部１７０は、操作部１５０を通じたユーザの操作入力に応じて、ラダー図等のソースプログラムを生成する（Ｓ３００）。オブジェクトプログラム生成部１７２は、操作部１５０を通じたユーザのコンパイル指令に応じ、ソースプログラム生成部１７０が生成したソースプログラムをコンパイルしてシーケンス制御プログラムを生成する（Ｓ３０２）。
【００７２】
続いて、チェックコード生成部１７４は、オブジェクトプログラム生成部１７２が生成したシーケンス制御プログラムに対し、順次、チェックコード導出式を計算し（Ｓ３０４）、予め定められたブロック単位で既設チェックコードが生成されると、チェックコード挿入部１７６は、生成された既設チェックコードをシーケンス制御プログラムに挿入する（Ｓ３０６）。ここで、ソースプログラム生成部１７０が生成したソースプログラムのコンパイルが完了したか否か判定され（Ｓ３０８）、コンパイルが完了していない間（Ｓ３０８におけるＮＯ）、コンパイルステップＳ３０２から既設チェックコード挿入ステップＳ３０６までの処理を繰り返す。コンパイルが完了すると（Ｓ３０８におけるＹＥＳ）、プログラム書込部１７８は、チェックコード挿入部１７６によって加工されたシーケンス制御プログラムを、通信部１５４を通じてプログラム実行装置１２０にダウンロードする（Ｓ３１０）。
【００７３】
図８を参照すると、パワーオンまたはリセットスタート後に、プログラム実行装置１２０の命令実行部２２０がプログラム読込部２２４にフェッチ要求を発すると（Ｓ３３０）、そのフェッチ要求を契機に、プログラム読込部２２４は、キャッシュメモリ２２２内に目的とするシーケンス制御プログラムが有るか否か、即ち、キャッシュメモリ２２２に既に読み込まれているか否か判定し（Ｓ３３２）、読み込まれていないと判定すると（Ｓ３３２におけるＮＯ）、シーケンス制御プログラムをプログラムメモリ２０２から読み込み（Ｓ３３４）、キャッシュメモリ２２２に保持させる（Ｓ３３６）。このとき、シーケンス制御プログラムには、図７を用いて説明したように、所定のブロック単位で生成された既設チェックコードが予め挿入されている。
【００７４】
続いて、チェックコード判定部２２６は、プログラム読込部２２４が読み込んだシーケンス制御プログラムに対し、順次、チェックコード導出式を計算し、ブロック単位でチェックコードを生成し（Ｓ３３８）、シーケンス制御プログラムに予め挿入されているチェックコードと比較してシーケンス制御プログラムの正否をブロック単位で判定する（Ｓ３４０）。このとき、チェックコード判定部２２６は、読み込まれたシーケンス制御プログラムに対し、順次、チェックコード導出式を計算し、シーケンス制御プログラムに予め挿入されているチェックコードを含むブロックサイズのシーケンス制御プログラムの正否を、チェックコード導出式の計算結果のみ（例えば、計算結果が０となると正しいと判定）によって判定してもよい。
【００７５】
次に、判定結果処理部２２８は、チェックコード判定部２２６がシーケンス制御プログラムをブロック単位で正しいと判定したか否か確認し（Ｓ３４２）、シーケンス制御プログラムが正しいと判定されていた場合（Ｓ３４２におけるＹＥＳ）、命令実行部２２０によるシーケンス制御プログラムの実行をブロック単位で許可するため実行許可信号を出力する（Ｓ３４４）。また、シーケンス制御プログラムが正しくないと判定されていた場合（Ｓ３４２におけるＮＯ）、判定結果処理部２２８は、エラー処理を実行する（Ｓ３４６）。ここで、エラー処理がエラー訂正処理である場合、エラービットを訂正した後、実行許可信号を出力する。エラー処理が制御機器１３０の動作停止を伴う場合、そのエラーの原因が把握されるまで、当該プログラム正否判定方法を停止してもよい。
【００７６】
続いて、命令実行部２２０は、判定結果処理部２２８から実行許可信号が出力されているか否か判定し（Ｓ３４８）、実行許可信号が出力されていれば（Ｓ３４８におけるＹＥＳ）、かかるシーケンス制御プログラムを解読し、制御機器１３０に各制御指令を行う（Ｓ３５０）。また、シーケンス制御プログラム有無判断ステップＳ３３２において、シーケンス制御プログラムが既に読み込まれていると判定された場合（Ｓ３３２におけるＹＥＳ）、命令実行部２２０は、その読み込まれているシーケンス制御プログラムを解読し、制御機器１３０に各制御指令を行う（Ｓ３５２）。ここでは、以上の処理が、所定の制御周期間隔でサイクリックに実行される。
【００７７】
かかるプログラム加工方法やプログラム正否判定方法によっても、別途のメモリが不要となるので製造コストの削減や小型軽量化を図ることができ、チェックコード導出式の計算対象サイズと計算タイミングを工夫することで、スループットの低下を回避しつつ、シーケンス制御プログラムを実行するタイミングでの誤り検出が可能となる。
【００７８】
以上、添付図面を参照しながら本発明の好適な実施形態について説明したが、本発明はかかる実施形態に限定されないことは言うまでもない。当業者であれば、特許請求の範囲に記載された範疇において、各種の変更例または修正例に想到し得ることは明らかであり、それらについても当然に本発明の技術的範囲に属するものと了解される。
【００７９】
なお、本明細書のプログラム加工方法やプログラム正否判定方法の各工程は、必ずしもフローチャートとして記載された順序に沿って時系列に処理する必要はなく、並列的あるいはサブルーチンによる処理を含んでもよい。
【産業上の利用可能性】
【００８０】
本発明は、オブジェクトプログラムの誤りを検出するためのプログラム実行装置、プログラム生成装置、プログラム正否判定方法、および、プログラム加工方法に利用することができる。
【符号の説明】
【００８１】
１１０  …プログラム生成装置
１２０  …プログラム実行装置
１３０  …制御機器
１７４  …チェックコード生成部
１７６  …チェックコード挿入部
２０２  …プログラムメモリ
２２０  …命令実行部
２２２  …キャッシュメモリ
２２４  …プログラム読込部
２２６  …チェックコード判定部
２２８  …判定結果処理部
【図１】
2012048445.tif 000003
【図２】
2012048445.tif 000004
【図３】
2012048445.tif 000005
【図４】
2012048445.tif 000006
【図５】
2012048445.tif 000007
【図６】
2012048445.tif 000008
【図７】
2012048445.tif 000009
【図８】
2012048445.tif 000010