JP5667948B2 - プログラム検査装置 - Google Patents

プログラム検査装置 Download PDF

Info

Publication number
JP5667948B2
JP5667948B2 JP2011193756A JP2011193756A JP5667948B2 JP 5667948 B2 JP5667948 B2 JP 5667948B2 JP 2011193756 A JP2011193756 A JP 2011193756A JP 2011193756 A JP2011193756 A JP 2011193756A JP 5667948 B2 JP5667948 B2 JP 5667948B2
Authority
JP
Japan
Prior art keywords
variable
program
input
size
output
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2011193756A
Other languages
English (en)
Other versions
JP2013054650A (ja
Inventor
淳一 川本
淳一 川本
榴 劉
榴 劉
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Toshiba Corp
Original Assignee
Toshiba Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Toshiba Corp filed Critical Toshiba Corp
Priority to JP2011193756A priority Critical patent/JP5667948B2/ja
Publication of JP2013054650A publication Critical patent/JP2013054650A/ja
Application granted granted Critical
Publication of JP5667948B2 publication Critical patent/JP5667948B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Stored Programmes (AREA)
  • Programmable Controllers (AREA)
  • Debugging And Monitoring (AREA)

Description

本発明の実施形態は、プログラム検査装置に関する。
一般に、鉄鋼、製紙プラントや自動車産業などの組立作業を含むFA(Factory Automation)分野、化学プラントなどのPA(Process Automation)分野、上下水道システム等の公共システムなど、産業用システムの監視、制御分野では、図式言語で記述された制御プログラムを使用するプログラマブルコントローラが広く用いられている。
例えば、プラント制御装置等の制御装置で動作するプログラムを作成するプログラム作成表示装置において、システムプログラマは、プラントを自動運転するためのプログラムを、プラント制御装置のアプリケーションプログラム(以降、「制御プログラム」と呼ぶ)として、作成、組合試験、現地調整を行い、プラント運転者へ提供する。
システムプログラマは、プラントを安全に制御するために、組合試験や現地調整時に、制御プログラムのデバッグを行う。制御プログラムは、例えば、国際電気標準会議による国際標準規格IEC 61131-3で規定されているグローバル言語、例えば、LD(Ladder Diagram),FBD(Function Block Diagram),SFC(Sequential Function Chart)のグラフィカル言語およびIL(Instruction List),ST(Structured Text)といったテキスト言語を用いて記述される。
システムプログラマは、このような言語で記述された制御プログラムを、組合試験、現地調整時に、オンライン状態で、制御プログラムの動作確認を行うことが可能なプラント制御装置およびプログラム作成表示装置が提案されている。
特開平11−85490号公報
制御プログラムの動作確認において、システムプログラマが意図しない箇所でプログラムが異常終了したり、想定しない挙動だったりしたとき、プログラムの問題箇所の発見に想像以上の時間を費やすことになるため、問題箇所を容易に発見できる妥当性検査を求められる。
上述したプラント制御装置およびプログラム作成表示装置において、システムプログラマが、意図しない箇所でのプログラム停止や想定外の挙動のときの要因として、
・誤って変数領域の範囲を超えるような初期化を実施している。
・無限ループに陥るようなプログラムを作っている。
・データ型の間違いで、データの精度が欠落するようなプログラムを作っている。
・成立することのない条件を定義している。
等があった。
なお、コンパイラでは上記の課題に対して、コンパイルエラーを検出しないようにしている、あるいはエラー検出を実装しない場合がある。その理由は以下による。
変数領域の範囲を超えるような初期化を実施しているケースについては、実行速度を上げるため、意図的に、変数領域の範囲を超える初期化を実施することで、1回の命令語で初期化し、命令語のステップ数の削減を図っている場合がある。
また、制御系コンパイラに限らず、一般のコンパイラも含めて、コンパイラは基本的に文法チェックとバイナリ生成を目的としているため、変数など動的に変化する値に対してはエラー検出を実装しない場合がある。よって、このような場合には無限ループの検出はできない。
データの精度が欠落するようなプログラムを作っているケースについては、基本的にデータ型が異なる場合はコンパイラでエラーを検出するが、データ型変換命令を使ったときは、エラー検出を行わず、データ精度の欠落は、システムプログラマの責任の範囲としている。例えば、”DINT to INT”という型変換命令は、DINT型のデータが、−32768〜32767の範囲を超える場合、正しくデータ変換できないが、他装置との入出力の仕様によっては、システムプログラマが意図して使うことがあるため、データ精度の欠落は承知の上である、という考えである。
また、制御系コンパイラに限らず、一般のコンパイラも含めて、コンパイラは基本的に文法チェックとバイナリ生成とを目的としているため、変数など動的に変化する値に対してはエラー検出を実装しない。よって、このような場合には、成立することのない条件を定義しているかどうか検出できない。
本発明は上記事情を鑑みて成されたものであって、プログラムの問題箇所を容易に発見できる妥当性検査を行うプログラム検査装置を提供することを目的とする。
実施形態によれば、IEC 61131-3に準拠した命令語を用いるプログラムのオブジェクトファイルを取得し、機械語に基づいてステップ順にスタック操作を模擬するシミュレーションを行い、前記シミュレーションの過程で得られる変数、あるいは定数を用いて、プログラムの動作不備を引き起こす可能性のある箇所および要因を検出する検出部と、前記検出部で検出された箇所および要因を表示する表示処理部と、を備え、前記検出部は、前記シミュレーションの過程で得られる変数、あるいは、定数を用いて、変数の領域外アクセスの箇所を検出する第1機能部と、前記検出部は、シミュレーションの課程で得られる変数あるいは定数を用いて、無限ループの可能性がある箇所を検出する第2機能部と、前記検出部は、シミュレーションの課程で得られる変数あるいは定数を用いて、データの精度が欠落する可能性がある箇所を検出する第3機能部と、前記検出部は、シミュレーションの課程で得られる変数あるいは定数を用いて、条件が成立しない可能性のある箇所を検出する第4機能部と、の少なくとも1つを含むことを特徴とするプログラム検査装置。
実施形態のプログラム検査装置を含むプラント制御システムの一構成例を概略的に示す図である。 IEC 61131-3(またはJIS B 3503)で規定されたLD/FBD言語を用いて作成した制御プログラムの事例を示す図である。 実施形態のプログラム検査装置の妥当性検査結果表示処理部により表示装置に表示された問題あると考えられる箇所と要因との一覧(エラーリスト)の一例を示す図である。 実施形態のプログラム検査装置の妥当性検査検出部における妥当性検査の検出のしくみの一例を示す図である。 シミュレーション時の妥当性検査検出部の動作一例を説明するためのプログラム構成図である。 シミュレーション時の妥当性検査検出部の動作の一例を説明するためのプログラム構成図である。 変数の領域外アクセスが発生する可能性がある箇所の一例を示す図である。 変数の領域外アクセスが発生する可能性がある箇所として、For文の一例を示す図である。 変数の領域外アクセスが発生する可能性がある箇所として、While文の一例を示す図である。 変数のデータ型と、データ型に対応する当該変数のサイズとの一例を示す図である。 無限ループの可能性があるWhile文を含む回路の一例を示す図である。 無限ループの可能性があるWhile文を含む回路の一例を示す図である。 妥当性検査検出部の第2機能部が無限ループの可能性がある箇所を検出する動作の一例を示すフローチャートである。 データの精度が欠落する可能性がある型変換命令を含む回路の一例を示す図である。 妥当性検査検出部の第3機能部がデータの精度が欠落する可能性がある箇所を検出する動作の一例を示すフローチャートである。 条件が成立しない可能性がある回路の一例を示す図である。
以下、実施形態のプログラム検査装置について、図面を参照して説明する。
図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は、IEC 61131-3(またはJIS B 3503)で規定された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処理は、分岐処理でのデータ受け渡しをレフトスタック(Left Stack)順序で判定するSimulateBLStack判定処理と、命令語が受け取るデータについてスタック順序で判定するSimulateWStack判定処理と、合流処理でのデータの受け渡しをライトスタック(Right Stack)順序およびBR(bit resister)値で判定するSimulateBRStack判定処理と、ファンクション(FUN)/ファンクションブロック(FBK)等のサブルーチン領域のシミュレート結果を判定するCheckFBDResult判定処理と、接点/コイル等のBR値を使用するシンボルやLD(Ladder Diagram)領域のシミュレーション結果を判定する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のサイズが大きい場合、本来の変数領域を超えて、他の変数の領域を書き換える箇所として検出する。
また、初期化命令(例:TINZ_INT)は、入力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型)がINT型の正の正数の最大値(32767)へ到達したときに、While文を抜け出す回路である。While文の中で、変数Countを2ずつインクリメントしているため、Countが0(ゼロ)から始まったとき、32767の値になることはない。したがって、このWhile文から抜け出す条件は成立しなくなり、無限ループとなる。
このWhile文は、Countと32767とが等しいかどうかを判断する比較器のファンクションブロックと、Countを2ずつインクリメントする加算器のファンクションブロックとを含んでいる。それぞれのファンクションブロックに入力されるデータのデータ型等は、SimulateWStack判定処理で判定され、ファンクションブロックから出力されたデータのデータ型等は、CheckFBDResult判定処理で判定される。
図10Bに示す例は、While文から抜け出す条件として使っている変数V1(INT型)を、誤って、負の整数(−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に示す回路は、”DINT to INT”という型変換命令を行うファンクションブロックを備えている。この型変換命令を行うファンクションブロックでは、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つを有していればよい。その場合であっても上述の実施形態と同様に、プログラムの問題箇所を容易に発見できる妥当性検査を行うことができ、システムプログラマのデバック効率を向上することが可能となる。
10…プログラム作成表示装置、12…プログラム編集部、12A…プログラムコンパイラ、12B…プログラムロードクライアント部、12C…妥当性検査検出部(検出部)、12C1…第1機能部、12C2…第2機能部、12C3…第3機能部、12C4…第4機能部、12D…妥当性検査結果表示処理部(表示処理部)、14…データベース、14A…ソースファイル部、14B…オブジェクトファイル部、16…入力部、18…表示装置、20…コントローラ、22…オブジェクトメモリ、22A…データメモリ、22B…コードメモリ、22A…データメモリ部、24…標準処理部、24A…プログラムロードサーバ部、24B…プログラム実行処理部、24C…プロセス入出力処理部、30…ネットワーク。

Claims (9)

  1. IEC 61131-3に準拠した命令語を用いるプログラムのオブジェクトファイルを取得し、機械語に基づいてステップ順にスタック操作を模擬するシミュレーションを行い、前記シミュレーションの過程で得られる変数、あるいは定数を用いて、プログラムの動作不備を引き起こす可能性のある箇所および要因を検出する検出部と、
    前記検出部で検出された箇所および要因を表示する表示処理部と、を備え、
    前記検出部は、前記シミュレーションの過程で得られる変数、あるいは、定数を用いて、変数の領域外アクセスの箇所を検出する第1機能部と、
    シミュレーションの課程で得られる変数あるいは定数を用いて、無限ループの可能性がある箇所を検出する第2機能部と、
    シミュレーションの課程で得られる変数あるいは定数を用いて、データの精度が欠落する可能性がある箇所を検出する第3機能部と、
    シミュレーションの課程で得られる変数あるいは定数を用いて、条件が成立しない可能性のある箇所を検出する第4機能部と、
    の少なくとも1つを含むことを特徴とするプログラム検査装置。
  2. 前記表示処理部は、前記検出部で検出された箇所および要因の表示においてユーザが所定の前記箇所および要因を選択した場合に、前記箇所および要因に対応するプログラムソースの表示に切替えることを特徴とする請求項1記載のプログラム検査装置。
  3. 前記第1機能部は、第1入力から第1出力へ、第2入力のサイズ分を移動させる移動命令を実行するファンクションブロックについて、前記シミュレーションにより前記第1出力で指定した変数のサイズと、前記第2入力のサイズとを取得し、前記第1出力で指定した変数のサイズと、前記第2入力のサイズとを比較して、前記第1入力および前記第1出力で指定した変数のサイズよりも、前記第2入力のサイズが大きい場合、本来の変数領域を超えて、他の変数の領域を書き換える箇所として検出することを特徴とする請求項1又は請求項2記載のプログラム検査装置。
  4. 前記第1機能部は、第3入力で指定した値を第2出力の変数領域へ、第4入力のサイズ分書き換える初期化命令を実行するファンクションブロックについて、前記シミュレーションにより前記第4入力のサイズと前記第2出力で指定した変数のサイズとを取得し、前記第4入力のサイズと前記第2出力で指定した変数のサイズとを比較して、前記第2出力で指定した変数のサイズよりも前記第4入力のサイズが大きい場合、本来の変数領域を超えて他の変数の領域を書き換える可能性がある箇所として検出することを特徴とする請求項1乃至請求項3のいずれか1項記載のプログラム検査装置。
  5. 前記第1機能部は、前記シミュレーションにより、インデックスのサイズと、インデックスの値が入力される変数のデータ型とを比較して、前記インデックスのサイズが前記変数のデータ型よりも大きい場合に、本来の変数領域を超えて他の変数の領域を書き換える可能性がある箇所として検出することを特徴とする請求項1乃至請求項4のいずれか1項記載のプログラム検査装置。
  6. 前記プログラムは比較器のファンクションブロックを有するWhile文を含み、
    前記第2機能部は、前記比較器のファンクションブロックに入力される変数のデータ型を取得して前記プログラムのループ処理における最大ループ数が分かるかどうか判断し、前記最大ループ数が分かる場合、シミュレーションを実行して前記ループ処理のループ数が前記最大ループ数を超えた場合に無限ループの可能性がある箇所として検出することを特徴とする請求項1乃至請求項5のいずれか1項記載のプログラム検査装置。
  7. 前記プログラムは比較器のファンクションブロックを有するWhile文を含み、
    前記第2機能部は、前記比較器のファンクションブロックに入力される変数のデータ型を取得して前記プログラムのループ処理における最大ループ数が分かるかどうか判断し、前記最大ループ数が分からない場合に、前記ループ処理に用いられるインデックスがあるかどうか判断し、前記インデックスがある場合には前記インデックスが所定回数以上同じ値であるときに無限ループの可能性がある箇所として検出することを特徴とする請求項1乃至請求項6のいずれか1項記載のプログラム検査装置。
  8. 前記第3機能部は、前記プログラムにおいて、入力変数をデータ型の異なる出力変数へ変換する型変換命令を実行するファンクションブロックについて、前記シミュレーションにより前記入力変数が前記出力変数のデータ型の範囲内であるか否か判断し、前記入力変数の値が前記出力変数のデータ型の範囲であると確認できなかった場合、さらに、前記入力変数に前記出力変数のデータ型の範囲外の値があるか否か判断し、前記入力変数の値が、前記出力変数のデータ型の範囲外の値となることがあると確認できた場合、データの精度が欠落する可能性のある箇所として検出することを特徴とする請求項1乃至7のいずれか1項記載のプログラム検査装置。
  9. 前記プログラムは、第1変数と第2変数あるいは定数とが入力される比較器のファンクションブロックを有するif文を含み、
    第4機能部は、前記第1変数のデータ型を取得し、前記第1変数と比較される第2変数あるいは定数とを比較し、前記第2変数あるいは定数が前記第1変数のデータ型の範囲に含まれない場合、条件が成立し得ない可能性のある箇所として検出することを特徴とする請求項1乃至請求項8のいずれか1項記載のプログラム検査装置。
JP2011193756A 2011-09-06 2011-09-06 プログラム検査装置 Expired - Fee Related JP5667948B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2011193756A JP5667948B2 (ja) 2011-09-06 2011-09-06 プログラム検査装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2011193756A JP5667948B2 (ja) 2011-09-06 2011-09-06 プログラム検査装置

Publications (2)

Publication Number Publication Date
JP2013054650A JP2013054650A (ja) 2013-03-21
JP5667948B2 true JP5667948B2 (ja) 2015-02-12

Family

ID=48131559

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2011193756A Expired - Fee Related JP5667948B2 (ja) 2011-09-06 2011-09-06 プログラム検査装置

Country Status (1)

Country Link
JP (1) JP5667948B2 (ja)

Families Citing this family (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2020065863A1 (ja) * 2018-09-27 2020-04-02 三菱電機株式会社 プログラマブルロジックコントローラ、方法、及びプログラム
JP7523116B2 (ja) 2020-07-30 2024-07-26 株式会社オプトン 制御プログラム生成装置
US10963228B1 (en) 2020-12-22 2021-03-30 Temper Systems, Inc. Preventing garbage object accumulation on minimal runtimes

Family Cites Families (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JPS61264436A (ja) * 1985-05-18 1986-11-22 Fujitsu Ltd デ−タ処理方式
JPS6415837A (en) * 1987-07-10 1989-01-19 Hitachi Ltd Fault detecting system
JPH06274567A (ja) * 1993-03-22 1994-09-30 Mitsubishi Electric Corp 論理シミュレーション装置
JPH08272623A (ja) * 1995-04-03 1996-10-18 Toshiba Corp プログラム解析装置及びプログラム解析方法
JPH11212606A (ja) * 1998-01-28 1999-08-06 Sharp Corp プログラム作成装置及びプログラムモニタ装置
US7036111B2 (en) * 2001-06-01 2006-04-25 Hewlett-Packard Development Company, L.P. Code verification system and method
JP4692452B2 (ja) * 2006-09-20 2011-06-01 株式会社明電舎 プログラマブルコントローラのプログラム作成方式

Also Published As

Publication number Publication date
JP2013054650A (ja) 2013-03-21

Similar Documents

Publication Publication Date Title
JP6096414B2 (ja) バッチ構成を試験するための方法、装置、およびプログラム
CN103279418B (zh) 一种组态控制信息的测试方法和装置
CN1328658C (zh) 用于安全控制的编译器的再验证方法
US20050223295A1 (en) Method for the creation of sequences for testing software
US12085911B2 (en) Method, computer program and apparatus for analysing a programmable logic controller program
KR20100084036A (ko) 소프트웨어의 에러 검출 장치 및 방법
Rösch et al. A light-weight fault injection approach to test automated production system PLC software in industrial practice
JP5667948B2 (ja) プログラム検査装置
Thomas et al. An integrated approach to requirements development and hazard analysis
CN103092747A (zh) 一种控制程序的验证和测试方法及系统
JP6139670B2 (ja) 制御システム検査装置
US20230030253A1 (en) Method for analyzing a programmable logic controller program
JP2002163020A (ja) プログラマブルコントローラにおける異常検出方法およびその装置
KR20190094779A (ko) Plc 명령어 컴파일러 테스트케이스 자동 생성 장치
JP2009086898A (ja) プログラム可能な論理制御装置用マシーンコード・プログラムのコンパイル法
US10417110B2 (en) Method for verifying traceability of first instructions in a procedural programming language generated from second instructions in a modelling language
JP2024501588A (ja) Plcプログラムの正しさをチェックするコンピュータ実施方法
US20170322781A1 (en) Integrated development environment for control language of legacy distributed control system
Burnard et al. Verifying and validating automatically generated code
Ha et al. Meta-validation of UML structural diagrams and behavioral diagrams with consistency rules
Yang et al. An effective model-based development process using simulink/stateflow for automotive body control electronics
Beckert et al. Formal verification of evolutionary changes
JP4692452B2 (ja) プログラマブルコントローラのプログラム作成方式
Wietecha et al. Control Software Development Methodology for Programmable Sawmill Appliances
Beine et al. A model-based reference workflow for the development of safety-related software

Legal Events

Date Code Title Description
RD04 Notification of resignation of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7424

Effective date: 20131205

RD04 Notification of resignation of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7424

Effective date: 20131212

RD04 Notification of resignation of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7424

Effective date: 20131219

RD04 Notification of resignation of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7424

Effective date: 20131226

RD04 Notification of resignation of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7424

Effective date: 20140109

A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20140225

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20141016

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20141118

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20141215

R151 Written notification of patent or utility model registration

Ref document number: 5667948

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R151

LAPS Cancellation because of no payment of annual fees