今回はImplicit checksのPOUsについて説明します。多分みなさんはこれなに?だと思うかもしれませんが、プログラム内で0を割ってしまったり、配列に存在しないIndexアクセスしたり、そのようなプログラムミスのせいでRuntimeがとまります。そのときImplicit checksのPOUsの出番です。それらの関数は自動的呼びされ、プログラムの中の基本的なミスを予防します。
Object POUs for implicit checks は以下のルールを守る必要があります。
- Implicit checksの関数の定義は変更禁止です。(Local 変数だけ大丈夫)
- Online Changeができません・Implicit 関数の削除・追加のあとはDownloadだけになります。
- Source LibraryではそのImplicit checksに通用しません。
- 一応Implicit checksが追加されたら、全てのPOUにも適用します。もし個別のPOUがCheckしないようにしたいなら、attribute ‘no_check‘を追加してください。(再度コンパイルが必要です)
POU for implicit checks追加
POUsで右クリック>Add>POU for implicit checks..をクリックします。
CheckするOptionsを設定できます。今回はすべて選びます。
Add >のあとにもうPOU for implicit checksの選択がなくなります。
以下の関数が追加されます。
CheckBounds
該当配列以外のIndexにアクセスしてるかどうかCheckします。
CheckDivDInt/CheckDivLint/CheckDivReal/CheckDivLReal
演算中に0を割ったかどうかをCheckします。
CheckRangeSigned/CheckRangeUnsigned/CheckLRangeSigned/CheckRangeUnsigned
配列のRangeをCheckします。
CheckPointer
注意するのはこの関数は自分で実装する必要があります。その関数目的はFunction、Function Blockに渡すPointerが正確かどうか。REFERENCE TOを使用したときもこの関数が使われます。
Example
今回は0を割ったときがどうなるかを見てみましょう。下図のようにException Popupが出てきて、Exception発生したコードが黄色に示されます。
下のRuntimeのIconも黄色になっています。そのときは再起動するしかないです。
次は、Implicit checksのPOUsを入れたら、0を割ってもRuntimeが止まりません。