IEC611313に準拠した命令語を用いるプログラムのオブジェクトファイルを取得し、機械語に基づいてステップ順にスタック操作を模擬するシミュレーションを行い、前記シミュレーションの過程で得られる変数、あるいは定数を用いて、プログラムの動作不備を引き起こす可能性のある箇所および要因を検出する検出部と、前記検出部で検出された箇所および要因を表示する表示処理部と、を備え、前記検出部は、前記シミュレーションの過程で得られる変数、あるいは、定数を用いて、変数の領域外アクセスの箇所を検出する第1機能部と、シミュレーションの課程で得られる変数あるいは定数を用いて、無限ループの可能性がある箇所を検出する第2機能部と、シミュレーションの課程で得られる変数あるいは定数を用いて、データの精度が欠落する可能性がある箇所を検出する第3機能部と、シミュレーションの課程で得られる変数あるいは定数を用いて、条件が成立しない可能性のある箇所を検出する第4機能部と、の少なくとも1つを含むことを特徴とするプログラム検査装置。前記表示処理部は、前記検出部で検出された箇所および要因の表示においてユーザが所定の前記箇所および要因を選択した場合に、前記箇所および要因に対応するプログラムソースの表示に切替えることを特徴とする請求項1記載のプログラム検査装置。前記第1機能部は、第1入力から第1出力へ、第2入力のサイズ分を移動させる移動命令を実行するファンクションブロックについて、前記シミュレーションにより前記第1出力で指定した変数のサイズと、前記第2入力のサイズとを取得し、前記第1出力で指定した変数のサイズと、前記第2入力のサイズとを比較して、前記第1入力および前記第1出力で指定した変数のサイズよりも、前記第2入力のサイズが大きい場合、本来の変数領域を超えて、他の変数の領域を書き換える箇所として検出することを特徴とする請求項1又は請求項2記載のプログラム検査装置。前記第1機能部は、第3入力で指定した値を第2出力の変数領域へ、第4入力のサイズ分書き換える初期化命令を実行するファンクションブロックについて、前記シミュレーションにより前記第4入力のサイズと前記第2出力で指定した変数のサイズとを取得し、前記第4入力のサイズと前記第2出力で指定した変数のサイズとを比較して、前記第2出力で指定した変数のサイズよりも前記第4入力のサイズが大きい場合、本来の変数領域を超えて他の変数の領域を書き換える可能性がある箇所として検出することを特徴とする請求項1乃至請求項3のいずれか1項記載のプログラム検査装置。前記第1機能部は、前記シミュレーションにより、インデックスのサイズと、インデックスの値が入力される変数のデータ型とを比較して、前記インデックスのサイズが前記変数のデータ型よりも大きい場合に、本来の変数領域を超えて他の変数の領域を書き換える可能性がある箇所として検出することを特徴とする請求項1乃至請求項4のいずれか1項記載のプログラム検査装置。前記プログラムは比較器のファンクションブロックを有するWhile文を含み、前記第2機能部は、前記比較器のファンクションブロックに入力される変数のデータ型を取得して前記プログラムのループ処理における最大ループ数が分かるかどうか判断し、前記最大ループ数が分かる場合、シミュレーションを実行して前記ループ処理のループ数が前記最大ループ数を超えた場合に無限ループの可能性がある箇所として検出することを特徴とする請求項1乃至請求項5のいずれか1項記載のプログラム検査装置。前記プログラムは比較器のファンクションブロックを有するWhile文を含み、前記第2機能部は、前記比較器のファンクションブロックに入力される変数のデータ型を取得して前記プログラムのループ処理における最大ループ数が分かるかどうか判断し、前記最大ループ数が分からない場合に、前記ループ処理に用いられるインデックスがあるかどうか判断し、前記インデックスがある場合には前記インデックスが所定回数以上同じ値であるときに無限ループの可能性がある箇所として検出することを特徴とする請求項1乃至請求項6のいずれか1項記載のプログラム検査装置。前記第3機能部は、前記プログラムにおいて、入力変数をデータ型の異なる出力変数へ変換する型変換命令を実行するファンクションブロックについて、前記シミュレーションにより前記入力変数が前記出力変数のデータ型の範囲内であるか否か判断し、前記入力変数の値が前記出力変数のデータ型の範囲であると確認できなかった場合、さらに、前記入力変数に前記出力変数のデータ型の範囲外の値があるか否か判断し、前記入力変数の値が、前記出力変数のデータ型の範囲外の値となることがあると確認できた場合、データの精度が欠落する可能性のある箇所として検出することを特徴とする請求項1乃至7のいずれか1項記載のプログラム検査装置。前記プログラムは、第1変数と第2変数あるいは定数とが入力される比較器のファンクションブロックを有するif文を含み、第4機能部は、前記第1変数のデータ型を取得し、前記第1変数と比較される第2変数あるいは定数とを比較し、前記第2変数あるいは定数が前記第1変数のデータ型の範囲に含まれない場合、条件が成立し得ない可能性のある箇所として検出することを特徴とする請求項1乃至請求項8のいずれか1項記載のプログラム検査装置。制御プログラムの動作確認において、システムプログラマが意図しない箇所でプログラムが異常終了したり、想定しない挙動だったりしたとき、プログラムの問題箇所の発見に想像以上の時間を費やすことになるため、問題箇所を容易に発見できる妥当性検査を求められる。上述したプラント制御装置およびプログラム作成表示装置において、システムプログラマが、意図しない箇所でのプログラム停止や想定外の挙動のときの要因として、誤って変数領域の範囲を超えるような初期化を実施している。無限ループに陥るようなプログラムを作っている。データ型の間違いで、データの精度が欠落するようなプログラムを作っている。成立することのない条件を定義している。等があった。なお、コンパイラでは上記の課題に対して、コンパイルエラーを検出しないようにしている、あるいはエラー検出を実装しない場合がある。その理由は以下による。変数領域の範囲を超えるような初期化を実施しているケースについては、実行速度を上げるため、意図的に、変数領域の範囲を超える初期化を実施することで、1回の命令語で初期化し、命令語のステップ数の削減を図っている場合がある。また、制御系コンパイラに限らず、一般のコンパイラも含めて、コンパイラは基本的に文法チェックとバイナリ生成を目的としているため、変数など動的に変化する値に対してはエラー検出を実装しない場合がある。よって、このような場合には無限ループの検出はできない。データの精度が欠落するようなプログラムを作っているケースについては、基本的にデータ型が異なる場合はコンパイラでエラーを検出するが、データ型変換命令を使ったときは、エラー検出を行わず、データ精度の欠落は、システムプログラマの責任の範囲としている。例えば、DINTtoINTという型変換命令は、DINT型のデータが、-32768~32767の範囲を超える場合、正しくデータ変換できないが、他装置との入出力の仕様によっては、システムプログラマが意図して使うことがあるため、データ精度の欠落は承知の上である、という考えである。また、制御系コンパイラに限らず、一般のコンパイラも含めて、コンパイラは基本的に文法チェックとバイナリ生成とを目的としているため、変数など動的に変化する値に対してはエラー検出を実装しない。よって、このような場合には、成立することのない条件を定義しているかどうか検出できない。本発明は上記事情を鑑みて成されたものであって、プログラムの問題箇所を容易に発見できる妥当性検査を行うプログラム検査装置を提供することを目的とする。実施形態によれば、IEC611313に準拠した命令語を用いるプログラムのオブジェクトファイルを取得し、機械語に基づいてステップ順にスタック操作を模擬するシミュレーションを行い、前記シミュレーションの過程で得られる変数、あるいは定数を用いて、プログラムの動作不備を引き起こす可能性のある箇所および要因を検出する検出部と、前記検出部で検出された箇所および要因を表示する表示処理部と、を備え、前記検出部は、前記シミュレーションの過程で得られる変数、あるいは、定数を用いて、変数の領域外アクセスの箇所を検出する第1機能部と、前記検出部は、シミュレーションの課程で得られる変数あるいは定数を用いて、無限ループの可能性がある箇所を検出する第2機能部と、前記検出部は、シミュレーションの課程で得られる変数あるいは定数を用いて、データの精度が欠落する可能性がある箇所を検出する第3機能部と、前記検出部は、シミュレーションの課程で得られる変数あるいは定数を用いて、条件が成立しない可能性のある箇所を検出する第4機能部と、の少なくとも1つを含むことを特徴とするプログラム検査装置。以下、実施形態のプログラム検査装置について、図面を参照して説明する。図1は、本実施形態のプログラム検査装置が搭載されたプラント制御システムの一構成例を概略的に示す図である。プラント制御システムは、本実施形態のプログラム検査装置を含むプログラム作成表示装置10と、作成されたプログラムを実行してプラント等を制御するコントローラ20と、プログラム作成表示装置10とコントローラ20とを接続するネットワーク30と、を備えている。コントローラ20は、オブジェクトメモリ22と、標準処理部24と、を備えている。オブジェクトメモリ22は、制御プログラムのデータを格納するデータメモリ22Aと、コードを格納するコードメモリ22Bと、を備えている。標準処理部24は、オブジェクトメモリ22にデータを書き込むとともに、格納されたデータを読み出して実行する。標準処理部24は、プログラムロードサーバ部24Aと、プログラム実行処理部24Bと、プロセス入出力処理部24Cと、を備えている。プログラムロードサーバ部24Aは、ネットワーク30を経由して送付された制御プログラムのオブジェクトプログラムを、データメモリ22Aおよびコードメモリ22Bに配置する。プログラム実行処理部24Bは、データメモリ22Aおよびコードメモリ22Bから制御プログラムを読み出し、制御プログラムを実行する。プロセス入出力処理部24Cは、図示しないネットワークを介して制御対象であるプラントからのプロセス信号を受信して制御プログラムに与えるとともに、制御プログラムの演算結果等をプラントへ出力する。プログラム作成表示装置10は、システムプログラマが制御プログラムを作成するためのプログラム編集部12と、制御プログラムを格納するデータベース14と、を備えている。プログラム編集部12は、内部処理として、制御プログラムのソースファイルをオブジェクトファイルに変換するためのプログラムコンパイラ12Aと、制御プログラムのオブジェクトファイルをコントローラ20へ送付するためのプログラムロードクライアント部12Bと、制御プログラムの妥当性を検査し、問題があると思われる箇所を検出する妥当性検査検出部12Cおよび妥当性検査の検出結果を表示装置18に表示する妥当性検査結果表示処理部12Dを含むプログラム検査装置と、を備える。妥当性検査検出部12Cは、変数の領域外アクセスの箇所を検出する第1機能部12C1と、無限ループの可能性がある箇所を検出する第2機能部12C2と、データの精度が欠落する可能性がある箇所を検出する第3機能部12C3と、条件が成立しない可能性のある箇所を検出する第4機能部12C4とを備えている。妥当性検査結果表示処理部12Dは、妥当性検査を行った検出結果を表示装置18へ出力し、検出部で検出された箇所および要因の表示において、ユーザが所定の箇所および要因を選択した場合に、プログラムソースの該当箇所へジャンプして表示装置18に表示させる機能を備えている。本実施形態のプログラム検査装置は、上記の妥当性検査検出部12Cと妥当性検査結果表示処理部12Dとを含む。データベース14は、制御プログラムのソースファイルを格納するためのソースファイル部14Aと、制御プログラムのオブジェクトファイルを格納するためのオブジェクトファイル部14Bと、を備える。プログラム作成表示装置10には、表示装置18と、キーボードやマウス等の入力部16とが接続されている。システムプログラマは、表示装置18に表示される制御プログラム編集画面をみながら、入力部16を操作して、制御プログラムを作成する。図2は、IEC611313で規定されたLD/FBD言語を用いて作成した制御プログラムの事例を示す。図2には、変数C1乃至変数C5からなる接点、変数C6及び変数C7からなるコイル、ファンクションブロックAND論理和、ファンクションブロック加算器、ファンクションブロック-減算器、及びファンクションブロック>比較器から構成されるダイアグラムを示す。システムプログラマが制御プログラムを保存した時、その制御プログラムは、データベース14のソースファイル部14Aに格納され、かつ、ソースファイルをプログラムコンパイラで生成した結果をデータベース14のオブジェクトファイル部14Bに格納して保存される。そして、ソースファイルのコンパイル結果が正常であれば、コントローラ20に対してオブジェクトファイルを書き込み、標準処理部24が制御プログラムを実行する。オブジェクトファイルをコントローラ20に書き込むとき、プログラムロードクライアント部12Bがデータベース14のオブジェクトファイルを取り出して、ネットワーク30を経由して、コントローラ20のプログラムロードサーバ部24Aに委譲する。プログラムロードサーバ部24Aはオブジェクトファイルを受けて、オブジェクトメモリ22のデータメモリ22Aおよびコードメモリ22B上に配置し、さらにプログラム実行処理部24Bがこれを実行して、制御プログラムが実行される。システムプログラマは、プログラム編集部12を使用して、作成した制御プログラムをオンラインでデバッグすることができる。このとき、プログラムがエラーダウンしたり、無限ループしたり、期待の回路が動作しないときに、妥当性検査検出部12Cにてプログラムを検査することにより問題がある箇所を検出し、妥当性検査結果表示処理部12Dが問題ありと考えられる箇所とその要因とを表示装置18に表示する。そして、妥当性検査結果表示処理部12Dは、表示された問題箇所の中の所定の箇所をシステムプログラマがダブルクリックすると、制御プログラムの該当箇所へ表示がジャンプするように表示装置18へ表示画面のデータを出力する。このことにより、システムプログラマは容易に問題のある箇所へ到達でき、要因を調査し、修正することが可能となる。図3に、妥当性検査結果表示処理部12Dにより表示装置18に表示された問題があると考えられる箇所と要因との一覧エラーリストの一例を示す。図3では、エラーの種類毎に付されたエラーNo欄と、エラー内容を示すメッセージ欄と、要因となる変数名等を示す原因欄と、プログラムコード内のエラーの位置を示す行欄および列欄と、が表示されている。図4は、妥当性検査検出部12Cにおける妥当性検査の検出のしくみの一例について示す。妥当性検査の対象の中には、動的に変化する値を持つ変数も対象にする必要がある。よって、ソースファイルの検索だけでは、妥当性検査対象を全て検出できない。そのため、妥当性検査検出部12Cは、オブジェクトファイル部14Bに格納された機械語を使い、機械語の動作に必要なレジストリのスタックStack概念をソフト的に実現することで、内部でスタックのプッシュPush/ポップPopを含めた動作シミュレーションを行い、プログラムの動作を模擬し、プログラムソースの妥当性検査を行うことで、問題箇所の検出を行う。妥当性検査検出部12Cのシミュレーションでは、プログラムのステップ順に機械語のスタック操作をシミュレートするSimulateSteps処理を行う。このSimulateSteps処理は、分岐処理でのデータ受け渡しをレフトスタックLeftStack順序で判定するSimulateBLStack判定処理と、命令語が受け取るデータについてスタック順序で判定するSimulateWStack判定処理と、合流処理でのデータの受け渡しをライトスタックRightStack順序およびBRbitresister値で判定するSimulateBRStack判定処理と、ファンクションFUNファンクションブロックFBK等のサブルーチン領域のシミュレート結果を判定するCheckFBDResult判定処理と、接点/コイル等のBR値を使用するシンボルやLDLadderDiagram領域のシミュレーション結果を判定するCheckLDResult判定処理と、を含む。妥当性検査検出部12Cは、プログラムがステップ順にシミュレーションされた際に、レフトスタック、ライトスタック、および、命令語が受け取るデータのスタックにデータがプッシュされる順序を予め設定することが可能であり、システムプログラマが意図したようにプログラムのシミュレーションが終了した場合のスタック順序を予め設定することにより上記判定を可能としている。図5及び図6に上記妥当性検査検出部12Cのシミュレーション時の動作例を説明するためのプログラム構成を示す。なお、図5及び図6のプログラムの分岐点、合流点、およびファンクションブロックの近傍に付した数字はプログラムのステップ順を表している。図5に示すプログラムは3つの分岐処理と3つの合流処理を含んでいる。図6に示すプログラムは2つのファンクションFUN1、FUN2を含み、それぞれのファンクションブロックに入力1と入力2とが入力されている。ファンクションブロックFUN1は加算器であり、ファンクションブロックFUN2は乗算器である。SimulateBLStack判定処理での動作を図5に示すプログラムを例に説明する。SimulateBLStack判定処理では、例えば図5に示すプログラムの3番目、4番目、および5番目のステップで実行される分岐部分でのデータ受け渡し処理以下、分岐処理というにおいて、レフトスタックに所定のデータをプッシュし、シミュレーション終了後に分岐処理が正しく行われた否か判断する。なお、レフトスタックは、分岐処理で受け渡されるデータをプッシュする記憶領域を有するスタックであり、レフトスタックにはデータとともに、そのデータ型等が合わせて記録される。SimulateWStack判定処理での動作を図6に示すプログラムを例に説明する。SimulateWStack判定処理では、例えば図6に示すファンクションブロックFNU1やファンクションブロックFUM2等の命令語がデータ受け取るタイミングで所定のデータをスタックにプッシュし、プッシュされたデータのデータ型やとり得る値を判定する。なお、ここで用いられるスタックは、レフトスタックや後述のライトスタックとは別に設けられる。スタックにプッシュされるデータは、プログラムのステップ順からどの命令語に入力されたものであるか判断することができる。図6に示す場合では、ファンクションブロックFUN1に入力1が入力された後に入力2が入力され、ファンクションブロックFUN2には入力1よりも前に入力2が入力される。したがって、この場合には入力1、入力2、入力2、入力1の順序でデータがスタックにプッシュされる。このスタックにはデータとともに、そのデータ型等が合わせて記録される。SimulateBRStack判定処理での動作を図5のプログラムを例に説明する。SimulateBRStack判定処理では、例えば図5に示す6番目、7番目、8番目のステップ等の合流部分でのデータの受け渡し処理において、ライトスタックに所定のデータをプッシュし、シミュレーション終了後に合流処理が正しく行われたか否か判断する。ここで、ライトスタックは、合流処理で受け渡されるデータをプッシュする記憶領域を有するスタックである。さらに、SimulateBRStack判定処理では、合流処理で受け渡されたデータのデータ型等を判定するとともに、合流処理後の出力例えば点P3における出力をビットレジスタに記録してデータの値やデータ型等を判定する。CheckFBDResult判定処理では、例えば、図6に示すファンクションブロックFUN1やファンクションブロックFUN2等について、レジスタに記録されたシミュレーション結果出力を読み出し、シミュレーション中あるいはシミュレーション終了後に読み出したデータのデータ型やとり得る値、サイズを判定する。CheckLDResult判定処理では、プログラムの接点やコイル等のシンボルやLD領域のシミュレーション結果をレジスタに記録するとともに、シミュレーション中あるいはシミュレーション終了後にデータのデータ型やとり得る値を判定する。上記SimulateSteps処理で判定された結果は、妥当性検査検出部12Cの第1乃至第4機能部12C1~12C4で用いられる。妥当性検査検出部12Cの第1機能部12C1は、上記シミュレーションの途中で生じる値や、シミュレーションの判定結果を用いて、変数の領域外アクセスの箇所を検出する。図7は、変数の領域外アクセスが発生する可能性がある箇所として、変数の移動命令、初期化命令の一例である。移動命令TMOV命令は、入力1第1入力から出力1第1出力へ、入力2第2入力のサイズ分を移動させる。ここで移動命令語が受け取るデータの変数およびデータ型等の判定は、上記SimulateSteps処理のSimulateWStack判定処理において、スタックの所定の領域にプッシュされたデータに基づいて行われる。移動命令語から出力されるデータのデータ型等の判定は、上記シミュレーションのCheckFBDResult判定処理で行われる。第1機能部12C1はSimulateWStack判定処理で判定された変数のデータ型から変数の領域外アクセスの箇所を検出する。図7に示す移動命令では、第1機能部12C1は入力1、出力1で指定した変数のサイズと入力2のサイズとを比較して、入力1および出力1で指定した変数のサイズよりも、入力2のサイズが大きい場合、本来の変数領域を超えて、他の変数の領域を書き換える箇所として検出する。また、初期化命令は、入力1第3入力で指定した値を出力1第2出力の変数領域へ、入力2第4入力のサイズ分を書き換える。ここで初期化命令のファンクションブロックが受け取るデータの変数およびデータ型等の判定は、上記シミュレーションのSimulateWStack判定処理で行われる。初期化命令語から出力されるデータのデータ型等の判定は、上記シミュレーションのCheckFBDResult判定処理で行われる。第1機能部12C1はSimulateWStack判定処理で判定された入力2の変数のデータ型と、CheckFBDResult判定処理で判定された出力1の変数のデータ型とから、変数の領域外アクセスの箇所を検出する。図7に示す初期化命令では、第1機能部12C1は入力2のサイズと出力1で指定した変数のサイズとを比較して、出力1で指定した変数のサイズよりも、入力2のサイズが大きい場合、本来の変数領域を超えて他の変数の領域を書き換える可能性がある箇所として検出する。図8Aおよび図8Bは、変数の領域外アクセスが発生する可能性がある箇所として、For文、While文などの例であり、変数のインデックスが変数領域を超えて、他の変数の領域を書き換えてしまう例である。図8Aに示すFor文では、1ずつ増加するインデックスXIの値が0から10までの間、V1[XI]を0ゼロとするものである。ここで、このFor文のシミュレーション結果、すなわち各LD領域の出力であるV1およびXIのデータ型等はCheckLDResult判定処理で判定される。第1機能部12C1はプログラムで定義されたインデックスXIのサイズを取得し、変数V1のデータ型とFor文で用いられるインデックスXIのサイズとを比較する。図8Aに示すFor文の例では、インデックスXIのサイズのほうが変数V1のデータ型に対応するサイズよりも大きいため、第1機能部12C1は、本来の変数領域を超えて他の変数の領域を書き換える箇所として検出する。図8Bに示すWhile文の例では、XIが10よりも大きくなるまでの間、V1[XI]を0としてXIに1を加えるものである。このWhile文は、V1の値と10とを比較する比較器のファンクションブロックと、XIと1とを加算する加算器のファンクションブロックと、を含んでいる。ここで、このWhile文の比較器のファンクションブロックの出力と加算器のファンクションブロックの出力とのデータ型等は、CheckFBDResult判定処理で判定される。比較器のファンクションブロックに入力されるV1のデータ型等、および、加算器のファンクションブロックに入力されるX1のデータ型等は、SimulateWStack判定処理で判定される。第1機能部12C1は変数V1のデータ型とWhile文で用いられるインデックスXIのサイズとを比較する。図8Bに示すWhile文の例では、インデックスXIのサイズのほうが変数V1のデータ型に対応するサイズよりも大きいため、第1機能部12C1は、本来の変数領域を超えて他の変数の領域を書き換える箇所として検出する。第1機能部12C1は、変数領域を超えて他の変数の領域を書き換える可能性がある箇所を検出した場合、検出した箇所の位置行および列を妥当性検査結果表示処理部12Dへ出力する。図9に、変数のデータ型と、データ型に対応する当該変数のサイズとの一例を示す。第1機能部12C1は、図9のように、シミュレーションにより変数の値とデータ型とを取得し当該変数のサイズを求めることができる。変数のサイズが、図9に示すような設定されたデータ型のサイズよりも大きい場合には、第1機能部12C1は、変数領域を超えて他の変数の領域を書き換える可能性があると判断する。なお、図7に示す例では、移動命令や初期化命令などで入力2を変数としているが、定数の場合は、事前にチェックできるため、シミュレーションを行わずに妥当性をチェックすることが可能である。しかし、図7のように、入力2が変数の場合、値は動的に変化するため、プログラムをシミュレーションし、CheckFBDResult判定処理で判定されたシミュレーション中の変数の値やサイズを取得することにより妥当性を検査することができる。また、図8に示すFor文、While文などの場合も同様に、演算に用いられる変数やインデックスの値は動的に変化するため、シミュレーションをすることで、妥当性を検査できる。次に、無限ループの可能性がある箇所を検出する第2機能部12C2の動作の一例について説明する。図10Aおよび図10Bは、無限ループの可能性があるWhile文を含む回路の一例である。図10Aに示す例は、変数CountがINT型の正の正数の最大値32767へ到達したときに、While文を抜け出す回路である。While文の中で、変数Countを2ずつインクリメントしているため、Countが0ゼロから始まったとき、32767の値になることはない。したがって、このWhile文から抜け出す条件は成立しなくなり、無限ループとなる。このWhile文は、Countと32767とが等しいかどうかを判断する比較器のファンクションブロックと、Countを2ずつインクリメントする加算器のファンクションブロックとを含んでいる。それぞれのファンクションブロックに入力されるデータのデータ型等は、SimulateWStack判定処理で判定され、ファンクションブロックから出力されたデータのデータ型等は、CheckFBDResult判定処理で判定される。図10Bに示す例は、While文から抜け出す条件として使っている変数V1を、誤って、負の整数-32768~-1になったときに、0へ戻す処理が入っている。このケースは、While文から抜け出す条件が成立しない場合、すなわち、変数V1が負の整数にならないためにWhile文から抜け出さない場合の例である。このWhile文は、V1と0とを比較してV1が0以上か否か判断する比較器のファンクションブロックと、V1と0とを比較してV1が0未満か否か判断する比較器のファンクションブロックとを含んでいる。それぞれのファンクションブロックに入力されるデータのデータ型等は、SimulateWStack判定処理で判定され、ファンクションブロックから出力されたデータのデータ型等は、CheckFBDResult判定処理で判定される。また、LD領域から出力されたデータのデータ型等はCheckLDResult判定処理で判定される。図11は、第2機能部12C2が無限ループの可能性がある箇所を検出する動作の一例を示すフローチャートである。無限ループはプログラムの記述の仕方によって、図10Aおよび図10Bに示す回路に限らず様々なケースが考えられる。そのため、SimulateSteps処理にてシミュレーションを行い、不整合が生じたときに、問題ありとして検出する。第2機能部12C2は、シミュレーションで不整合が生じた場合に、For文やWhile文の回路の前後から最大ループ数の取得を試みて、最大ループ数が分かるかどうか判断するステップSTA1。第2機能部12C2は、例えば、For文やwhile文内で用いられる変数のデータ型が分かる場合には、その最大値を最大ループ数とする。なお、図10Aおよび図10Bに示す場合では、変数Countおよび変数V1がともにint型であるため、int型の最大値をループ数に設定する。最大ループ数が取得できた場合、第2機能部12C2は取得した最大ループ数をセットしてステップSTA2、シミュレーションを行いステップSTA5、ループ内の変数が最大ループ数を超えたか否か判断するステップSTA6。最大ループ数を越えた場合には、第2機能部12C2は無限ループが発生する箇所として検出する。図10Aおよび図10Bに示す場合では、シミュレーションを行うと、設定した最大ループ数を超えてもWhile文から抜け出さないため、第2機能部12C2により無限ループが発生する箇所として検出することができる。最大ループ数が取得できない場合、While文の中でインデックスを使っている箇所があるか否かを判断しステップSTA3、ある場合にはシミュレーションを行うステップSTA6。第2機能部12C2は、インデックスの値が負の整数になった場合や、インデックスの値がn回以上同じか否かなどを判断してステップSTA7、インデックスの値が負の整数になった場合や、値がn回以上同じ場合には、第2機能部12C2は無限ループが発生する箇所として検出するステップSTA8。さらには、ステップSTA7において前述の状態に該当しない場合であって、インデックスがある範囲の値を続けている場合も異常がある可能性が高いと見なせるので、第2機能部12C2は無限ループが発生する箇所として検出してもよい。次に、データの精度が欠落する可能性がある箇所を検出する第3機能部12C3の動作の一例について説明する。図12に、データの精度が欠落する可能性がある型変換命令を含む回路の一例を示す。図12に示す回路は、DINTtoINTという型変換命令を行うファンクションブロックを備えている。この型変換命令を行うファンクションブロックでは、Dint型のデータをint型のデータに変換して出力する。このファンクションブロックに入力されるデータやそのデータ型等は、SimulateWStack判定処理において判定される。この回路に入力されるDINT型のデータが、-32768~32767の範囲を超える場合、正しくデータ変換できない。そのため、第3機能部12C3では、シミュレーションにより得られるファンクションブロックへの入力データが-32768~32767の範囲外のときに、問題ありと判断する。なお、第3機能部12C3は、例えばSimulateWStack判定処理の判定結果からファンクションブロックへの入力データとそのデータ型とを取得し、型変換命令のシミュレーション結果である型変換後のデータのデータ型等をCheckFBDResult判定処理の判定結果から取得する。図13に、データの精度が欠落する可能性がある箇所を検出する動作の一例を示すフローチャートを示す。例えば、図12に示す型変換命令を含む回路についてデータの精度が欠落する可能性があるか判断する場合、まず、シミュレーションを行いステップSTB1、第3機能部12C3は、回路の前後から、型変換命令の入力変数V1の値が設定された変換後のデータ型の範囲-32768~32767であることを確認するステップSTB2。第3機能部12C3は、入力変数V1の値が設定された変換後のデータ型の範囲-32768~32767である場合には、この回路にはデータの精度が欠落する可能性がない問題なしとするステップSTB3。第3機能部12C3は、入力変数V1の値が設定された変換後のデータ型の範囲-32768~32767であると確認できなかった場合、さらに、入力V1の範囲に設定された変換後のデータ型の範囲-32768~32767外の値があるか否か判断するステップSTB4。第3機能部12C3は、入力変数V1の値が、設定された変換後のデータ型の範囲-32768~32767外の値となることがあると確認できた場合、この回路にはデータの精度が欠落する可能性がある問題ありとするステップSTB5。入力変数V1の値が、設定された変換後のデータ型の範囲-32768~32767であると確認されず、かつ、設定された変換後のデータ型の範囲-32768~32767外であると確認されない場合、第3機能部12C3は、入力変数V1の値が認識できない場合が想定されるため、問題がある可能性ありとするステップSTB6。第3機能部12C3は、問題ありとした場合、および問題がある可能性ありとした場合、エラーの内容とその回路に対応するプログラムの位置とを妥当性検査結果表示処理部12Dへ出力する。また、第3機能部12C3は、問題がある可能性ありとした場合、入力変数V1の値の確認を促すシステムプログラマへの警告を妥当性検査結果表示処理部12Dへ出力する。次に、条件が成立しない可能性がある箇所を検出する第4機能部12C4の動作の一例について説明する。図14に、条件が成立しない可能性がある回路の一例を示す。図14に示す回路は、入力変数V1と32768とを比較し、変数V1が32768以上か否か判断する比較器のファンクションブロックを含み、ファンクションブロックの出力が真である場合に変数V1をゼロとするプログラムである。図14に示す回路では、例えば、INT型の入力変数V1に対して、32768以上という絶対に成立しえない条件が設定されている。このような回路について、条件が成立するか判断する場合、第4機能部12C4は、例えばシミュレーションのSimulateWStack判定処理での判定結果からファンクションブロックに入力される入力変数V1のデータ型を取得する。図14に示す回路の例では、第4機能部12C4は、データ型を取得することにより入力変数V1の範囲が分かり、また、条件に定数32768が用いられているため、入力変数V1の範囲と定数とを比較することにより、条件が成立し得るか否か判断することができる。また、図14に示す回路では、条件に定数を用いているが、入力変数を用いた条件を設定している場合には、入力変数のとり得る値を例えばシミュレーションのSimulateWStack判定処理での判定結果から取得し、入力変数の値が入力変数V1のデータ型の範囲外となることがあるか判断し、入力変数の取り得る値が入力変数V1のデータ型の範囲外となる場合には、条件が成立しない可能性があるとする。第4機能部12C4は、条件が成立しない可能性があるとした場合、エラーの内容と、その回路に対応するプログラムの位置とを妥当性検査結果表示処理部12Dへ出力する。以上の結果から明らかなように、本実施形態のプログラム検査装置によれば、コンパイルが正常に完了したプログラムにおいて、システムプログラマが意図しない要因で、プログラムがエラーダウンしたり、無限ループしたり、期待通りの回路が動作しないなど、正常に動作しない場合、本来の制御するためのデバッグが滞ってしまうが、本実施形態のプログラム検査装置によれば、問題箇所を迅速に見つけることができるため、システムプログラマのデバッグ効率を向上することが可能となる。すなわち、本実施形態のプログラム検査装置によれば、プログラムの問題箇所を容易に発見できる妥当性検査を行うことができる。本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。例えば、上記実施形態において妥当性検査検出部12Cは第1乃至第4機能部12C1~12C4を有していたが、妥当性検査検出部12Cは第1乃至第4機能部12C1~12C4の少なくとも1つを有していればよい。その場合であっても上述の実施形態と同様に、プログラムの問題箇所を容易に発見できる妥当性検査を行うことができ、システムプログラマのデバック効率を向上することが可能となる。