(57)【特許請求の範囲】
【請求項１】
IEC 61131-3に準拠した命令語を用いるプログラムのオブジェクトファイルを取得し、機械語に基づいてステップ順にスタック操作を模擬するシミュレーションを行い、前記シミュレーションの過程で得られる変数、あるいは定数を用いて、プログラムの動作不備を引き起こす可能性のある箇所および要因を検出する検出部と、
前記検出部で検出された箇所および要因を表示する表示処理部と、を備え、
前記検出部は、前記シミュレーションの過程で得られる変数、あるいは、定数を用いて、変数の領域外アクセスの箇所を検出する第１機能部と、
シミュレーションの課程で得られる変数あるいは定数を用いて、無限ループの可能性がある箇所を検出する第２機能部と、
シミュレーションの課程で得られる変数あるいは定数を用いて、データの精度が欠落する可能性がある箇所を検出する第３機能部と、
シミュレーションの課程で得られる変数あるいは定数を用いて、条件が成立しない可能性のある箇所を検出する第４機能部と、
の少なくとも１つを含むことを特徴とするプログラム検査装置。
【請求項２】
前記表示処理部は、前記検出部で検出された箇所および要因の表示においてユーザが所定の前記箇所および要因を選択した場合に、前記箇所および要因に対応するプログラムソースの表示に切替えることを特徴とする請求項１記載のプログラム検査装置。
【請求項３】
前記第１機能部は、第１入力から第１出力へ、第２入力のサイズ分を移動させる移動命令を実行するファンクションブロックについて、前記シミュレーションにより前記第１出力で指定した変数のサイズと、前記第２入力のサイズとを取得し、前記第１出力で指定した変数のサイズと、前記第２入力のサイズとを比較して、前記第１入力および前記第１出力で指定した変数のサイズよりも、前記第２入力のサイズが大きい場合、本来の変数領域を超えて、他の変数の領域を書き換える箇所として検出することを特徴とする請求項１又は請求項２記載のプログラム検査装置。
【請求項４】
前記第１機能部は、第３入力で指定した値を第２出力の変数領域へ、第４入力のサイズ分書き換える初期化命令を実行するファンクションブロックについて、前記シミュレーションにより前記第４入力のサイズと前記第２出力で指定した変数のサイズとを取得し、前記第４入力のサイズと前記第２出力で指定した変数のサイズとを比較して、前記第２出力で指定した変数のサイズよりも前記第４入力のサイズが大きい場合、本来の変数領域を超えて他の変数の領域を書き換える可能性がある箇所として検出することを特徴とする請求項１乃至請求項３のいずれか１項記載のプログラム検査装置。
【請求項５】
前記第１機能部は、前記シミュレーションにより、インデックスのサイズと、インデックスの値が入力される変数のデータ型とを比較して、前記インデックスのサイズが前記変数のデータ型よりも大きい場合に、本来の変数領域を超えて他の変数の領域を書き換える可能性がある箇所として検出することを特徴とする請求項１乃至請求項４のいずれか１項記載のプログラム検査装置。
【請求項６】
前記プログラムは比較器のファンクションブロックを有するWhile文を含み、
前記第２機能部は、前記比較器のファンクションブロックに入力される変数のデータ型を取得して前記プログラムのループ処理における最大ループ数が分かるかどうか判断し、前記最大ループ数が分かる場合、シミュレーションを実行して前記ループ処理のループ数が前記最大ループ数を超えた場合に無限ループの可能性がある箇所として検出することを特徴とする請求項１乃至請求項５のいずれか１項記載のプログラム検査装置。
【請求項７】
前記プログラムは比較器のファンクションブロックを有するWhile文を含み、
前記第２機能部は、前記比較器のファンクションブロックに入力される変数のデータ型を取得して前記プログラムのループ処理における最大ループ数が分かるかどうか判断し、前記最大ループ数が分からない場合に、前記ループ処理に用いられるインデックスがあるかどうか判断し、前記インデックスがある場合には前記インデックスが所定回数以上同じ値であるときに無限ループの可能性がある箇所として検出することを特徴とする請求項１乃至請求項６のいずれか１項記載のプログラム検査装置。
【請求項８】
前記第３機能部は、前記プログラムにおいて、入力変数をデータ型の異なる出力変数へ変換する型変換命令を実行するファンクションブロックについて、前記シミュレーションにより前記入力変数が前記出力変数のデータ型の範囲内であるか否か判断し、前記入力変数の値が前記出力変数のデータ型の範囲であると確認できなかった場合、さらに、前記入力変数に前記出力変数のデータ型の範囲外の値があるか否か判断し、前記入力変数の値が、前記出力変数のデータ型の範囲外の値となることがあると確認できた場合、データの精度が欠落する可能性のある箇所として検出することを特徴とする請求項１乃至７のいずれか１項記載のプログラム検査装置。
【請求項９】
前記プログラムは、第１変数と第２変数あるいは定数とが入力される比較器のファンクションブロックを有するif文を含み、
第４機能部は、前記第１変数のデータ型を取得し、前記第１変数と比較される第２変数あるいは定数とを比較し、前記第２変数あるいは定数が前記第１変数のデータ型の範囲に含まれない場合、条件が成立し得ない可能性のある箇所として検出することを特徴とする請求項１乃至請求項８のいずれか１項記載のプログラム検査装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、プログラム検査装置に関する。
【背景技術】
【０００２】
一般に、鉄鋼、製紙プラントや自動車産業などの組立作業を含むＦＡ(Factory Automation)分野、化学プラントなどのＰＡ(Process Automation)分野、上下水道システム等の公共システムなど、産業用システムの監視、制御分野では、図式言語で記述された制御プログラムを使用するプログラマブルコントローラが広く用いられている。
【０００３】
例えば、プラント制御装置等の制御装置で動作するプログラムを作成するプログラム作成表示装置において、システムプログラマは、プラントを自動運転するためのプログラムを、プラント制御装置のアプリケーションプログラム（以降、「制御プログラム」と呼ぶ）として、作成、組合試験、現地調整を行い、プラント運転者へ提供する。
【０００４】
システムプログラマは、プラントを安全に制御するために、組合試験や現地調整時に、制御プログラムのデバッグを行う。制御プログラムは、例えば、国際電気標準会議による国際標準規格IEC 61131-3で規定されているグローバル言語、例えば、ＬＤ（Ladder Diagram），ＦＢＤ（Function Block Diagram），ＳＦＣ（Sequential Function Chart）のグラフィカル言語およびＩＬ（Instruction List），ＳＴ（Structured Text）といったテキスト言語を用いて記述される。
【０００５】
システムプログラマは、このような言語で記述された制御プログラムを、組合試験、現地調整時に、オンライン状態で、制御プログラムの動作確認を行うことが可能なプラント制御装置およびプログラム作成表示装置が提案されている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開平１１−８５４９０号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
制御プログラムの動作確認において、システムプログラマが意図しない箇所でプログラムが異常終了したり、想定しない挙動だったりしたとき、プログラムの問題箇所の発見に想像以上の時間を費やすことになるため、問題箇所を容易に発見できる妥当性検査を求められる。
【０００８】
上述したプラント制御装置およびプログラム作成表示装置において、システムプログラマが、意図しない箇所でのプログラム停止や想定外の挙動のときの要因として、  
・誤って変数領域の範囲を超えるような初期化を実施している。  
・無限ループに陥るようなプログラムを作っている。  
・データ型の間違いで、データの精度が欠落するようなプログラムを作っている。  
・成立することのない条件を定義している。  
等があった。
【０００９】
なお、コンパイラでは上記の課題に対して、コンパイルエラーを検出しないようにしている、あるいはエラー検出を実装しない場合がある。その理由は以下による。
【００１０】
変数領域の範囲を超えるような初期化を実施しているケースについては、実行速度を上げるため、意図的に、変数領域の範囲を超える初期化を実施することで、１回の命令語で初期化し、命令語のステップ数の削減を図っている場合がある。
【００１１】
また、制御系コンパイラに限らず、一般のコンパイラも含めて、コンパイラは基本的に文法チェックとバイナリ生成を目的としているため、変数など動的に変化する値に対してはエラー検出を実装しない場合がある。よって、このような場合には無限ループの検出はできない。
【００１２】
データの精度が欠落するようなプログラムを作っているケースについては、基本的にデータ型が異なる場合はコンパイラでエラーを検出するが、データ型変換命令を使ったときは、エラー検出を行わず、データ精度の欠落は、システムプログラマの責任の範囲としている。例えば、”DINT to INT”という型変換命令は、ＤＩＮＴ型のデータが、−３２７６８〜３２７６７の範囲を超える場合、正しくデータ変換できないが、他装置との入出力の仕様によっては、システムプログラマが意図して使うことがあるため、データ精度の欠落は承知の上である、という考えである。
【００１３】
また、制御系コンパイラに限らず、一般のコンパイラも含めて、コンパイラは基本的に文法チェックとバイナリ生成とを目的としているため、変数など動的に変化する値に対してはエラー検出を実装しない。よって、このような場合には、成立することのない条件を定義しているかどうか検出できない。
【００１４】
本発明は上記事情を鑑みて成されたものであって、プログラムの問題箇所を容易に発見できる妥当性検査を行うプログラム検査装置を提供することを目的とする。
【課題を解決するための手段】
【００１５】
実施形態によれば、IEC 61131-3に準拠した命令語を用いるプログラムのオブジェクトファイルを取得し、機械語に基づいてステップ順にスタック操作を模擬するシミュレーションを行い、前記シミュレーションの過程で得られる変数、あるいは定数を用いて、プログラムの動作不備を引き起こす可能性のある箇所および要因を検出する検出部と、前記検出部で検出された箇所および要因を表示する表示処理部と、を備え、前記検出部は、前記シミュレーションの過程で得られる変数、あるいは、定数を用いて、変数の領域外アクセスの箇所を検出する第１機能部と、前記検出部は、シミュレーションの課程で得られる変数あるいは定数を用いて、無限ループの可能性がある箇所を検出する第２機能部と、前記検出部は、シミュレーションの課程で得られる変数あるいは定数を用いて、データの精度が欠落する可能性がある箇所を検出する第３機能部と、前記検出部は、シミュレーションの課程で得られる変数あるいは定数を用いて、条件が成立しない可能性のある箇所を検出する第４機能部と、の少なくとも１つを含むことを特徴とするプログラム検査装置。
【図面の簡単な説明】
【００１６】
【図１】実施形態のプログラム検査装置を含むプラント制御システムの一構成例を概略的に示す図である。
【図２】IEC 61131-3(またはJIS B 3503)で規定されたLD/FBD言語を用いて作成した制御プログラムの事例を示す図である。
【図３】実施形態のプログラム検査装置の妥当性検査結果表示処理部により表示装置に表示された問題あると考えられる箇所と要因との一覧（エラーリスト）の一例を示す図である。
【図４】実施形態のプログラム検査装置の妥当性検査検出部における妥当性検査の検出のしくみの一例を示す図である。
【図５】シミュレーション時の妥当性検査検出部の動作一例を説明するためのプログラム構成図である。
【図６】シミュレーション時の妥当性検査検出部の動作の一例を説明するためのプログラム構成図である。
【図７】変数の領域外アクセスが発生する可能性がある箇所の一例を示す図である。
【図８Ａ】変数の領域外アクセスが発生する可能性がある箇所として、For文の一例を示す図である。
【図８Ｂ】変数の領域外アクセスが発生する可能性がある箇所として、While文の一例を示す図である。
【図９】変数のデータ型と、データ型に対応する当該変数のサイズとの一例を示す図である。
【図１０Ａ】無限ループの可能性があるWhile文を含む回路の一例を示す図である。
【図１０Ｂ】無限ループの可能性があるWhile文を含む回路の一例を示す図である。
【図１１】妥当性検査検出部の第２機能部が無限ループの可能性がある箇所を検出する動作の一例を示すフローチャートである。
【図１２】データの精度が欠落する可能性がある型変換命令を含む回路の一例を示す図である。
【図１３】妥当性検査検出部の第３機能部がデータの精度が欠落する可能性がある箇所を検出する動作の一例を示すフローチャートである。
【図１４】条件が成立しない可能性がある回路の一例を示す図である。
【発明を実施するための形態】
【００１７】
以下、実施形態のプログラム検査装置について、図面を参照して説明する。  
図１は、本実施形態のプログラム検査装置が搭載されたプラント制御システムの一構成例を概略的に示す図である。
【００１８】
プラント制御システムは、本実施形態のプログラム検査装置を含むプログラム作成表示装置１０と、作成されたプログラムを実行してプラント等を制御するコントローラ２０と、プログラム作成表示装置１０とコントローラ２０とを接続するネットワーク３０と、を備えている。
【００１９】
コントローラ２０は、オブジェクトメモリ２２と、標準処理部２４と、を備えている。オブジェクトメモリ２２は、制御プログラムのデータを格納するデータメモリ２２Ａと、コードを格納するコードメモリ２２Ｂと、を備えている。
【００２０】
標準処理部２４は、オブジェクトメモリ２２にデータを書き込むとともに、格納されたデータを読み出して実行する。標準処理部２４は、プログラムロードサーバ部２４Ａと、プログラム実行処理部２４Ｂと、プロセス入出力処理部２４Ｃと、を備えている。
【００２１】
プログラムロードサーバ部２４Ａは、ネットワーク３０を経由して送付された制御プログラムのオブジェクトプログラムを、データメモリ２２Ａおよびコードメモリ２２Ｂに配置する。
【００２２】
プログラム実行処理部２４Ｂは、データメモリ２２Ａおよびコードメモリ２２Ｂから制御プログラムを読み出し、制御プログラムを実行する。
【００２３】
プロセス入出力処理部２４Ｃは、図示しないネットワークを介して制御対象であるプラントからのプロセス信号を受信して制御プログラムに与えるとともに、制御プログラムの演算結果等をプラントへ出力する。
【００２４】
プログラム作成表示装置１０は、システムプログラマが制御プログラムを作成するためのプログラム編集部１２と、制御プログラムを格納するデータベース１４と、を備えている。
【００２５】
プログラム編集部１２は、内部処理として、制御プログラムのソースファイルをオブジェクトファイルに変換するためのプログラムコンパイラ１２Ａと、制御プログラムのオブジェクトファイルをコントローラ２０へ送付するためのプログラムロードクライアント部１２Ｂと、制御プログラムの妥当性を検査し、問題があると思われる箇所を検出する妥当性検査検出部１２Ｃおよび妥当性検査の検出結果を表示装置１８に表示する妥当性検査結果表示処理部１２Ｄを含むプログラム検査装置と、を備える。
【００２６】
妥当性検査検出部１２Ｃは、変数の領域外アクセスの箇所を検出する第１機能部１２Ｃ１と、無限ループの可能性がある箇所を検出する第２機能部１２Ｃ２と、データの精度が欠落する可能性がある箇所を検出する第３機能部１２Ｃ３と、条件が成立しない可能性のある箇所を検出する第４機能部１２Ｃ４とを備えている。
【００２７】
妥当性検査結果表示処理部１２Ｄは、妥当性検査を行った検出結果を表示装置１８へ出力し、検出部で検出された箇所および要因の表示において、ユーザが所定の箇所および要因を選択した場合に、プログラムソースの該当箇所へジャンプして表示装置１８に表示させる機能を備えている。
【００２８】
本実施形態のプログラム検査装置は、上記の妥当性検査検出部１２Ｃと妥当性検査結果表示処理部１２Ｄとを含む。
【００２９】
データベース１４は、制御プログラムのソースファイルを格納するためのソースファイル部１４Ａと、制御プログラムのオブジェクトファイルを格納するためのオブジェクトファイル部１４Ｂと、を備える。
【００３０】
プログラム作成表示装置１０には、表示装置１８と、キーボードやマウス等の入力部１６とが接続されている。システムプログラマは、表示装置１８に表示される制御プログラム編集画面をみながら、入力部１６を操作して、制御プログラムを作成する。
【００３１】
図２は、IEC 61131-3(またはJIS B 3503)で規定されたＬＤ／ＦＢＤ言語を用いて作成した制御プログラムの事例を示す。図２には、変数Ｃ１乃至変数Ｃ５からなる接点、変数Ｃ６及び変数Ｃ７からなるコイル、ファンクションブロック「ＡＮＤ（論理和）」、ファンクションブロック「＋（加算器）」、ファンクションブロック「−（減算器）」、及びファンクションブロック「＞（比較器）」から構成されるダイアグラムを示す。
【００３２】
システムプログラマが制御プログラムを保存した時、その制御プログラムは、データベース１４のソースファイル部１４Ａに格納され、かつ、ソースファイルをプログラムコンパイラで生成した結果をデータベース１４のオブジェクトファイル部１４Ｂに格納して保存される。そして、ソースファイルのコンパイル結果が正常であれば、コントローラ２０に対してオブジェクトファイルを書き込み、標準処理部２４が制御プログラムを実行する。
【００３３】
オブジェクトファイルをコントローラ２０に書き込むとき、プログラムロードクライアント部１２Ｂがデータベース１４のオブジェクトファイルを取り出して、ネットワーク３０を経由して、コントローラ２０のプログラムロードサーバ部２４Ａに委譲する。プログラムロードサーバ部２４Ａはオブジェクトファイルを受けて、オブジェクトメモリ２２のデータメモリ２２Ａおよびコードメモリ２２Ｂ上に配置し、さらにプログラム実行処理部２４Ｂがこれを実行して、制御プログラムが実行される。システムプログラマは、プログラム編集部１２を使用して、作成した制御プログラムをオンラインでデバッグすることができる。
【００３４】
このとき、プログラムがエラーダウンしたり、無限ループしたり、期待の回路が動作しないときに、妥当性検査検出部１２Ｃにてプログラムを検査することにより問題がある箇所を検出し、妥当性検査結果表示処理部１２Ｄが問題ありと考えられる箇所とその要因とを表示装置１８に表示する。
【００３５】
そして、妥当性検査結果表示処理部１２Ｄは、表示された問題箇所の中の所定の箇所をシステムプログラマがダブルクリックすると、制御プログラムの該当箇所へ表示がジャンプするように表示装置１８へ表示画面のデータを出力する。このことにより、システムプログラマは容易に問題のある箇所へ到達でき、要因を調査し、修正することが可能となる。
【００３６】
図３に、妥当性検査結果表示処理部１２Ｄにより表示装置１８に表示された問題があると考えられる箇所と要因との一覧（エラーリスト）の一例を示す。図３では、エラーの種類毎に付されたエラーＮｏ欄と、エラー内容を示すメッセージ欄と、要因となる変数名等を示す原因欄と、プログラムコード内のエラーの位置を示す行欄および列欄と、が表示されている。
【００３７】
図４は、妥当性検査検出部１２Ｃにおける妥当性検査の検出のしくみの一例について示す。妥当性検査の対象の中には、動的に変化する値を持つ変数も対象にする必要がある。よって、ソースファイルの検索だけでは、妥当性検査対象を全て検出できない。そのため、妥当性検査検出部１２Ｃは、オブジェクトファイル部１４Ｂに格納された機械語を使い、機械語の動作に必要なレジストリのスタック（Ｓｔａｃｋ）概念をソフト的に実現することで、内部でスタックのプッシュ（Ｐｕｓｈ）／ポップ（Ｐｏｐ）を含めた動作シミュレーションを行い、プログラムの動作を模擬し、プログラムソースの妥当性検査を行うことで、問題箇所の検出を行う。
【００３８】
妥当性検査検出部１２Ｃのシミュレーションでは、プログラムのステップ順に機械語のスタック操作をシミュレートするSimulateSteps処理を行う。
【００３９】
このSimulateSteps処理は、分岐処理でのデータ受け渡しをレフトスタック（Left Stack）順序で判定するSimulateBLStack判定処理と、命令語が受け取るデータについてスタック順序で判定するSimulateWStack判定処理と、合流処理でのデータの受け渡しをライトスタック（Right Stack）順序およびＢＲ（bit resister）値で判定するSimulateBRStack判定処理と、ファンクション（FUN）/ファンクションブロック（FBK）等のサブルーチン領域のシミュレート結果を判定するCheckFBDResult判定処理と、接点／コイル等のＢＲ値を使用するシンボルやＬＤ（Ladder Diagram）領域のシミュレーション結果を判定するCheckLDResult判定処理と、を含む。
【００４０】
妥当性検査検出部１２Ｃは、プログラムがステップ順にシミュレーションされた際に、レフトスタック、ライトスタック、および、命令語が受け取るデータのスタックにデータがプッシュされる順序を予め設定することが可能であり、システムプログラマが意図したようにプログラムのシミュレーションが終了した場合のスタック順序を予め設定することにより上記判定を可能としている。
【００４１】
図５及び図６に上記妥当性検査検出部１２Ｃのシミュレーション時の動作例を説明するためのプログラム構成を示す。なお、図５及び図６のプログラムの分岐点、合流点、およびファンクションブロックの近傍に付した数字はプログラムのステップ順を表している。
【００４２】
図５に示すプログラムは３つの分岐処理と３つの合流処理を含んでいる。図６に示すプログラムは２つのファンクションＦＵＮ１、ＦＵＮ２を含み、それぞれのファンクションブロックに入力１と入力２とが入力されている。ファンクションブロックＦＵＮ１は加算器であり、ファンクションブロックＦＵＮ２は乗算器である。
【００４３】
SimulateBLStack判定処理での動作を図５に示すプログラムを例に説明する。SimulateBLStack判定処理では、例えば図５に示すプログラムの３番目、４番目、および５番目のステップで実行される分岐部分でのデータ受け渡し処理（以下、分岐処理という）において、レフトスタックに所定のデータをプッシュし、シミュレーション終了後に分岐処理が正しく行われた否か判断する。なお、レフトスタックは、分岐処理で受け渡されるデータをプッシュする記憶領域を有するスタックであり、レフトスタックにはデータとともに、そのデータ型等が合わせて記録される。
【００４４】
SimulateWStack判定処理での動作を図６に示すプログラムを例に説明する。SimulateWStack判定処理では、例えば図６に示すファンクションブロックＦＮＵ１やファンクションブロックＦＵＭ２等の命令語がデータ受け取るタイミングで所定のデータをスタックにプッシュし、プッシュされたデータのデータ型やとり得る値を判定する。なお、ここで用いられるスタックは、レフトスタックや後述のライトスタックとは別に設けられる。スタックにプッシュされるデータは、プログラムのステップ順からどの命令語に入力されたものであるか判断することができる。
【００４５】
図６に示す場合では、ファンクションブロックＦＵＮ１に入力１が入力された後に入力２が入力され、ファンクションブロックＦＵＮ２には入力１よりも前に入力２が入力される。したがって、この場合には入力１、入力２、入力２、入力１の順序でデータがスタックにプッシュされる。このスタックにはデータとともに、そのデータ型等が合わせて記録される。
【００４６】
SimulateBRStack判定処理での動作を図５のプログラムを例に説明する。SimulateBRStack判定処理では、例えば図５に示す６番目、７番目、８番目のステップ等の合流部分でのデータの受け渡し処理において、ライトスタックに所定のデータをプッシュし、シミュレーション終了後に合流処理が正しく行われたか否か判断する。ここで、ライトスタックは、合流処理で受け渡されるデータをプッシュする記憶領域を有するスタックである。さらに、SimulateBRStack判定処理では、合流処理で受け渡されたデータのデータ型等を判定するとともに、合流処理後の出力（例えば点Ｐ３における出力）をビットレジスタに記録してデータの値やデータ型等を判定する。
【００４７】
CheckFBDResult判定処理では、例えば、図６に示すファンクションブロックＦＵＮ１やファンクションブロックＦＵＮ２等について、レジスタに記録されたシミュレーション結果（出力）を読み出し、シミュレーション中あるいはシミュレーション終了後に読み出したデータのデータ型やとり得る値、サイズを判定する。
【００４８】
CheckLDResult判定処理では、プログラムの接点やコイル等のシンボルやＬＤ領域のシミュレーション結果をレジスタに記録するとともに、シミュレーション中あるいはシミュレーション終了後にデータのデータ型やとり得る値を判定する。
【００４９】
上記SimulateSteps処理で判定された結果は、妥当性検査検出部１２Ｃの第１乃至第４機能部１２Ｃ１〜１２Ｃ４で用いられる。
【００５０】
妥当性検査検出部１２Ｃの第１機能部１２Ｃ１は、上記シミュレーションの途中で生じる値や、シミュレーションの判定結果を用いて、変数の領域外アクセスの箇所を検出する。
【００５１】
図７は、変数の領域外アクセスが発生する可能性がある箇所として、変数の移動命令、初期化命令の一例である。移動命令（TMOV命令）は、入力１（第１入力）から出力１（第１出力）へ、入力２（第２入力）のサイズ分を移動させる。ここで移動命令語が受け取るデータの変数およびデータ型等の判定は、上記SimulateSteps処理のSimulateWStack判定処理において、スタックの所定の領域にプッシュされたデータに基づいて行われる。移動命令語から出力されるデータのデータ型等の判定は、上記シミュレーションのCheckFBDResult判定処理で行われる。
【００５２】
第１機能部１２Ｃ１はSimulateWStack判定処理で判定された変数のデータ型から変数の領域外アクセスの箇所を検出する。図７に示す移動命令では、第１機能部１２Ｃ１は入力１、出力１で指定した変数のサイズと入力２のサイズとを比較して、入力１および出力１で指定した変数のサイズよりも、入力２のサイズが大きい場合、本来の変数領域を超えて、他の変数の領域を書き換える箇所として検出する。
【００５３】
また、初期化命令(例：TINZ_INT)は、入力１（第３入力）で指定した値を出力１（第２出力）の変数領域へ、入力２（第４入力）のサイズ分を書き換える。ここで初期化命令のファンクションブロックが受け取るデータの変数およびデータ型等の判定は、上記シミュレーションのSimulateWStack判定処理で行われる。初期化命令語から出力されるデータのデータ型等の判定は、上記シミュレーションのCheckFBDResult判定処理で行われる。第１機能部１２Ｃ１はSimulateWStack判定処理で判定された入力２の変数のデータ型と、CheckFBDResult判定処理で判定された出力１の変数のデータ型とから、変数の領域外アクセスの箇所を検出する。
【００５４】
図７に示す初期化命令では、第１機能部１２Ｃ１は入力２のサイズと出力１で指定した変数のサイズとを比較して、出力１で指定した変数のサイズよりも、入力２のサイズが大きい場合、本来の変数領域を超えて他の変数の領域を書き換える可能性がある箇所として検出する。
【００５５】
図８Ａおよび図８Ｂは、変数の領域外アクセスが発生する可能性がある箇所として、For文、While文などの例であり、変数のインデックスが変数領域を超えて、他の変数の領域を書き換えてしまう例である。
【００５６】
図８Ａに示すFor文では、１ずつ増加するインデックスＸＩの値が０から１０までの間、Ｖ１［ＸＩ］を０（ゼロ）とするものである。ここで、このFor文のシミュレーション結果、すなわち各ＬＤ領域の出力であるＶ１およびＸＩのデータ型等はCheckLDResult判定処理で判定される。第１機能部１２Ｃ１はプログラムで定義されたインデックスＸＩのサイズを取得し、変数Ｖ１のデータ型とFor文で用いられるインデックスＸＩのサイズとを比較する。
【００５７】
図８Ａに示すFor文の例では、インデックスＸＩのサイズのほうが変数Ｖ１のデータ型に対応するサイズよりも大きいため、第１機能部１２Ｃ１は、本来の変数領域を超えて他の変数の領域を書き換える箇所として検出する。
【００５８】
図８Ｂに示すWhile文の例では、ＸＩが１０よりも大きくなるまでの間、Ｖ１［ＸＩ］を０としてＸＩに１を加えるものである。このWhile文は、Ｖ１の値と１０とを比較する比較器のファンクションブロックと、ＸＩと１とを加算する加算器のファンクションブロックと、を含んでいる。
【００５９】
ここで、このWhile文の比較器のファンクションブロックの出力と加算器のファンクションブロックの出力とのデータ型等は、CheckFBDResult判定処理で判定される。比較器のファンクションブロックに入力されるＶ１のデータ型等、および、加算器のファンクションブロックに入力されるＸ１のデータ型等は、SimulateWStack判定処理で判定される。
【００６０】
第１機能部１２Ｃ１は変数Ｖ１のデータ型とWhile文で用いられるインデックスＸＩのサイズとを比較する。図８Ｂに示すWhile文の例では、インデックスＸＩのサイズのほうが変数Ｖ１のデータ型に対応するサイズよりも大きいため、第１機能部１２Ｃ１は、本来の変数領域を超えて他の変数の領域を書き換える箇所として検出する。
【００６１】
第１機能部１２Ｃ１は、変数領域を超えて他の変数の領域を書き換える可能性がある箇所を検出した場合、検出した箇所の位置（行および列）を妥当性検査結果表示処理部１２Ｄへ出力する。
【００６２】
図９に、変数のデータ型と、データ型に対応する当該変数のサイズとの一例を示す。第１機能部１２Ｃ１は、図９のように、シミュレーションにより変数の値とデータ型とを取得し当該変数のサイズを求めることができる。変数のサイズが、図９に示すような設定されたデータ型のサイズよりも大きい場合には、第１機能部１２Ｃ１は、変数領域を超えて他の変数の領域を書き換える可能性があると判断する。
【００６３】
なお、図７に示す例では、移動命令や初期化命令などで入力２を変数としているが、定数の場合は、事前にチェックできるため、シミュレーションを行わずに妥当性をチェックすることが可能である。しかし、図７のように、入力２が変数の場合、値は動的に変化するため、プログラムをシミュレーションし、CheckFBDResult判定処理で判定されたシミュレーション中の変数の値やサイズを取得することにより妥当性を検査することができる。
【００６４】
また、図８に示すFor文、While文などの場合も同様に、演算に用いられる変数やインデックスの値は動的に変化するため、シミュレーションをすることで、妥当性を検査できる。
【００６５】
次に、無限ループの可能性がある箇所を検出する第２機能部１２Ｃ２の動作の一例について説明する。
【００６６】
図１０Ａおよび図１０Ｂは、無限ループの可能性があるWhile文を含む回路の一例である。
【００６７】
図１０Ａに示す例は、変数Count(INT型)がINT型の正の正数の最大値（３２７６７）へ到達したときに、While文を抜け出す回路である。While文の中で、変数Countを２ずつインクリメントしているため、Countが0（ゼロ）から始まったとき、３２７６７の値になることはない。したがって、このWhile文から抜け出す条件は成立しなくなり、無限ループとなる。
【００６８】
このWhile文は、Countと３２７６７とが等しいかどうかを判断する比較器のファンクションブロックと、Countを２ずつインクリメントする加算器のファンクションブロックとを含んでいる。それぞれのファンクションブロックに入力されるデータのデータ型等は、SimulateWStack判定処理で判定され、ファンクションブロックから出力されたデータのデータ型等は、CheckFBDResult判定処理で判定される。
【００６９】
図１０Ｂに示す例は、While文から抜け出す条件として使っている変数Ｖ１(INT型)を、誤って、負の整数（−３２７６８〜−１）になったときに、0へ戻す処理が入っている。このケースは、While文から抜け出す条件が成立しない場合、すなわち、変数Ｖ１が負の整数にならないためにWhile文から抜け出さない場合の例である。
【００７０】
このWhile文は、Ｖ１と０とを比較してＶ１が０以上か否か判断する比較器のファンクションブロックと、Ｖ１と０とを比較してＶ１が０未満か否か判断する比較器のファンクションブロックとを含んでいる。それぞれのファンクションブロックに入力されるデータのデータ型等は、SimulateWStack判定処理で判定され、ファンクションブロックから出力されたデータのデータ型等は、CheckFBDResult判定処理で判定される。また、ＬＤ領域から出力されたデータのデータ型等はCheckLDResult判定処理で判定される。
【００７１】
図１１は、第２機能部１２Ｃ２が無限ループの可能性がある箇所を検出する動作の一例を示すフローチャートである。
【００７２】
無限ループはプログラムの記述の仕方によって、図１０Ａおよび図１０Ｂに示す回路に限らず様々なケースが考えられる。そのため、SimulateSteps処理にてシミュレーションを行い、不整合が生じたときに、問題ありとして検出する。
【００７３】
第２機能部１２Ｃ２は、シミュレーションで不整合が生じた場合に、For文やWhile文の回路の前後から最大ループ数の取得を試みて、最大ループ数が分かるかどうか判断する（ステップＳＴＡ１）。第２機能部１２Ｃ２は、例えば、For文やwhile文内で用いられる変数のデータ型が分かる場合には、その最大値を最大ループ数とする。なお、図１０Ａおよび図１０Ｂに示す場合では、変数Countおよび変数Ｖ１がともにint型であるため、int型の最大値をループ数に設定する。
【００７４】
最大ループ数が取得できた場合、第２機能部１２Ｃ２は取得した最大ループ数をセットして（ステップＳＴＡ２）、シミュレーションを行い（ステップＳＴＡ５）、ループ内の変数が最大ループ数を超えたか否か判断する（ステップＳＴＡ６）。最大ループ数を越えた場合には、第２機能部１２Ｃ２は無限ループが発生する箇所として検出する。
【００７５】
図１０Ａおよび図１０Ｂに示す場合では、シミュレーションを行うと、設定した最大ループ数を超えてもWhile文から抜け出さないため、第２機能部１２Ｃ２により無限ループが発生する箇所として検出することができる。
【００７６】
最大ループ数が取得できない場合、While文の中でインデックスを使っている箇所があるか否かを判断し（ステップＳＴＡ３）、ある場合にはシミュレーションを行う（ステップＳＴＡ６）。
【００７７】
第２機能部１２Ｃ２は、インデックスの値が負の整数になった場合や、インデックスの値がｎ回以上同じか否かなどを判断して（ステップＳＴＡ７）、インデックスの値が負の整数になった場合や、値がｎ回以上同じ場合には、第２機能部１２Ｃ２は無限ループが発生する箇所として検出する（ステップＳＴＡ８）。
【００７８】
さらには、ステップＳＴＡ７において前述の状態に該当しない場合であって、インデックスがある範囲の値を続けている場合も異常がある可能性が高いと見なせるので、第２機能部１２Ｃ２は無限ループが発生する箇所として検出してもよい。
【００７９】
次に、データの精度が欠落する可能性がある箇所を検出する第３機能部１２Ｃ３の動作の一例について説明する。
【００８０】
図１２に、データの精度が欠落する可能性がある型変換命令を含む回路の一例を示す。図１２に示す回路は、”DINT to INT”という型変換命令を行うファンクションブロックを備えている。この型変換命令を行うファンクションブロックでは、Dint型のデータをint型のデータに変換して出力する。このファンクションブロックに入力されるデータやそのデータ型等は、SimulateWStack判定処理において判定される。
【００８１】
この回路に入力されるDINT型のデータが、−３２７６８〜３２７６７の範囲を超える場合、正しくデータ変換できない。そのため、第３機能部１２Ｃ３では、シミュレーションにより得られるファンクションブロックへの入力データが−３２７６８〜３２７６７の範囲外のときに、問題ありと判断する。
【００８２】
なお、第３機能部１２Ｃ３は、例えばSimulateWStack判定処理の判定結果からファンクションブロックへの入力データとそのデータ型とを取得し、型変換命令のシミュレーション結果である型変換後のデータのデータ型等をCheckFBDResult判定処理の判定結果から取得する。
【００８３】
図１３に、データの精度が欠落する可能性がある箇所を検出する動作の一例を示すフローチャートを示す。例えば、図１２に示す型変換命令を含む回路についてデータの精度が欠落する可能性があるか判断する場合、まず、シミュレーションを行い（ステップＳＴＢ１）、第３機能部１２Ｃ３は、回路の前後から、型変換命令の入力変数Ｖ１の値が設定された変換後のデータ型の範囲（−３２７６８〜３２７６７）であることを確認する（ステップＳＴＢ２）。
【００８４】
第３機能部１２Ｃ３は、入力変数Ｖ１の値が設定された変換後のデータ型の範囲（−３２７６８〜３２７６７）である場合には、この回路にはデータの精度が欠落する可能性がない（問題なし）とする（ステップＳＴＢ３）。
【００８５】
第３機能部１２Ｃ３は、入力変数Ｖ１の値が設定された変換後のデータ型の範囲（−３２７６８〜３２７６７）であると確認できなかった場合、さらに、入力Ｖ１の範囲に設定された変換後のデータ型の範囲（−３２７６８〜３２７６７）外の値があるか否か判断する（ステップＳＴＢ４）。
【００８６】
第３機能部１２Ｃ３は、入力変数Ｖ１の値が、設定された変換後のデータ型の範囲（−３２７６８〜３２７６７）外の値となることがあると確認できた場合、この回路にはデータの精度が欠落する可能性がある（問題あり）とする（ステップＳＴＢ５）。
【００８７】
入力変数Ｖ１の値が、設定された変換後のデータ型の範囲（−３２７６８〜３２７６７）であると確認されず、かつ、設定された変換後のデータ型の範囲（−３２７６８〜３２７６７）外であると確認されない場合、第３機能部１２Ｃ３は、入力変数Ｖ１の値が認識できない場合が想定されるため、問題がある可能性ありとする（ステップＳＴＢ６）。
【００８８】
第３機能部１２Ｃ３は、問題ありとした場合、および問題がある可能性ありとした場合、エラーの内容とその回路に対応するプログラムの位置とを妥当性検査結果表示処理部１２Ｄへ出力する。また、第３機能部１２Ｃ３は、問題がある可能性ありとした場合、入力変数Ｖ１の値の確認を促すシステムプログラマへの警告を妥当性検査結果表示処理部１２Ｄへ出力する。
【００８９】
次に、条件が成立しない可能性がある箇所を検出する第４機能部１２Ｃ４の動作の一例について説明する。
【００９０】
図１４に、条件が成立しない可能性がある回路の一例を示す。  
図１４に示す回路は、入力変数Ｖ１と３２７６８とを比較し、変数Ｖ１が３２７６８以上か否か判断する比較器のファンクションブロックを含み、ファンクションブロックの出力が真である場合に変数Ｖ１をゼロとするプログラムである。図１４に示す回路では、例えば、INT型の入力変数Ｖ１に対して、３２７６８以上という絶対に成立しえない条件が設定されている。
【００９１】
このような回路について、条件が成立するか判断する場合、第４機能部１２Ｃ４は、例えばシミュレーションのSimulateWStack判定処理での判定結果からファンクションブロックに入力される入力変数Ｖ１のデータ型を取得する。図１４に示す回路の例では、第４機能部１２Ｃ４は、データ型を取得することにより入力変数Ｖ１の範囲が分かり、また、条件に定数（３２７６８）が用いられているため、入力変数Ｖ１の範囲と定数とを比較することにより、条件が成立し得るか否か判断することができる。
【００９２】
また、図１４に示す回路では、条件に定数を用いているが、入力変数を用いた条件を設定している場合には、入力変数のとり得る値を例えばシミュレーションのSimulateWStack判定処理での判定結果から取得し、入力変数の値が入力変数Ｖ１のデータ型の範囲外となることがあるか判断し、入力変数の取り得る値が入力変数Ｖ１のデータ型の範囲外となる場合には、条件が成立しない可能性があるとする。第４機能部１２Ｃ４は、条件が成立しない可能性があるとした場合、エラーの内容と、その回路に対応するプログラムの位置とを妥当性検査結果表示処理部１２Ｄへ出力する。
【００９３】
以上の結果から明らかなように、本実施形態のプログラム検査装置によれば、コンパイルが正常に完了したプログラムにおいて、システムプログラマが意図しない要因で、プログラムがエラーダウンしたり、無限ループしたり、期待通りの回路が動作しないなど、正常に動作しない場合、本来の制御するためのデバッグが滞ってしまうが、本実施形態のプログラム検査装置によれば、問題箇所を迅速に見つけることができるため、システムプログラマのデバッグ効率を向上することが可能となる。
【００９４】
すなわち、本実施形態のプログラム検査装置によれば、プログラムの問題箇所を容易に発見できる妥当性検査を行うことができる。
【００９５】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【００９６】
例えば、上記実施形態において妥当性検査検出部１２Ｃは第１乃至第４機能部１２Ｃ１〜１２Ｃ４を有していたが、妥当性検査検出部１２Ｃは第１乃至第４機能部１２Ｃ１〜１２Ｃ４の少なくとも１つを有していればよい。その場合であっても上述の実施形態と同様に、プログラムの問題箇所を容易に発見できる妥当性検査を行うことができ、システムプログラマのデバック効率を向上することが可能となる。
【符号の説明】
【００９７】
１０…プログラム作成表示装置、１２…プログラム編集部、１２Ａ…プログラムコンパイラ、１２Ｂ…プログラムロードクライアント部、１２Ｃ…妥当性検査検出部（検出部）、１２Ｃ１…第１機能部、１２Ｃ２…第２機能部、１２Ｃ３…第３機能部、１２Ｃ４…第４機能部、１２Ｄ…妥当性検査結果表示処理部（表示処理部）、１４…データベース、１４Ａ…ソースファイル部、１４Ｂ…オブジェクトファイル部、１６…入力部、１８…表示装置、２０…コントローラ、２２…オブジェクトメモリ、２２Ａ…データメモリ、２２Ｂ…コードメモリ、２２Ａ…データメモリ部、２４…標準処理部、２４Ａ…プログラムロードサーバ部、２４Ｂ…プログラム実行処理部、２４Ｃ…プロセス入出力処理部、３０…ネットワーク。
【図１】
0005667948.tif 000002
【図２】
0005667948.tif 000003
【図３】
0005667948.tif 000004
【図４】
0005667948.tif 000005
【図５】
0005667948.tif 000006
【図６】
0005667948.tif 000007
【図７】
0005667948.tif 000008
【図８Ａ】
0005667948.tif 000009
【図８Ｂ】
0005667948.tif 000010
【図９】
0005667948.tif 000011
【図１０Ａ】
0005667948.tif 000012
【図１０Ｂ】
0005667948.tif 000013
【図１１】
0005667948.tif 000014
【図１２】
0005667948.tif 000015
【図１３】
0005667948.tif 000016
【図１４】
0005667948.tif 000017