POU:CheckBounds
この監視機能の役割は、制限付き違反を適切に処理することです。違反に対する反応の例としては、エラーフラグの設定や配列インデックスの値の変更などがあります。このチェックは 1 つの変数配列インデックスに対してのみ実行されます。定数配列インデックスが正しくないと、コンパイラエラーが発生します。この関数は、に値が割り当てられるとすぐに暗黙的に呼び出されます ARRAY 変数。
詳細については、以下を参照してください。 暗黙のチェックにビルディングブロックを使用する と 暗黙のチェックにビルディングブロックを使用する
関数を挿入すると、宣言部分と実装部分で自動的に生成されたコードを受け取ります。下記参照。
注意
監視機能の機能を利用するには、宣言部分を編集しないでください。ただし、ローカル変数を追加することは許可されています。
宣言部分:
自動生成コード:編集しないでください!
FUNCTION CheckBounds : DINT
VAR_INPUT
index, lower, upper: DINT;
END_VAR実装:
自動生成コード:これは推奨実装です。
IF index < lower THEN
CheckBounds := lower;
ELSIF index > upper THEN
CheckBounds := upper;
ELSE
CheckBounds := index;
END_IFデクラレーション:
たとえば、ブレークポイントを設定したり、メッセージをログに記録したり、例外を停止したりすることもできます。追加 CmpApp.Library、 SysExcept.Library、および SysTypes2_Itf。
(* It is also possible to set a breakpoint, log messages or e.g. to halt on an exception:
Add CmpApp.library, SysExcept.library and SysTypes2_Itf as newest.*)
VAR
_pApp : POINTER TO CmpApp.APPLICATION;
_result : SysTypes.RTS_IEC_RESULT;
END_VAR実装:
_pApp := AppGetCurrent(pResult:=_result);
IF index < lower THEN
CheckBounds := lower;
IF _pApp <> 0 THEN
AppGenerateException(pApp:=_pApp, ulException:=RtsExceptions.RTSEXCPT_ARRAYBOUNDS);
END_IF
ELSIF index > upper THEN
CheckBounds := upper;
IF _pApp <> 0 THEN
AppGenerateException(pApp:=_pApp, ulException:=RtsExceptions.RTSEXCPT_ARRAYBOUNDS);
END_IF
ELSE
CheckBounds := index;
END_IF
いつ CheckBounds 関数が呼び出されると、次の入力パラメーターを受け取ります。
index:配列要素のインデックスlower:配列範囲の下限upper:配列範囲の上限
戻り値は、有効な範囲内にある限り、配列要素のインデックスです。そうでない場合は、 CODESYS 違反したしきい値に応じて、上限または下限のいずれかを返します。
例:配列範囲外での配列アクセス
以下のサンプルプログラムでは、インデックスが定義された下限を下回っています。 a 配列。
PROGRAM PLC_PRG
VAR
a: ARRAY[0..7] OF BOOL;
b : INT := 10;
END_VAR
実装
a[b]:=TRUE;
この例では、 CheckBounds 機能の原因 a 配列範囲インデックスの上限をに変更するには 10。値 TRUE 次に要素に割り当てられます a[7]。このようにして、関数は有効な配列範囲外の配列アクセスを修正します。
例:配列境界の違反
アプリケーションのライブラリマネージャーに次のライブラリを追加します。
CmpApp.libraryとSysExcept.libraryプレースホルダーライブラリとしてSysTypes2_Itfs.libraryと 常に最新バージョン
追加する CheckBounds アプリケーションの下のオブジェクトを作成し、以下に示すように指定されたコードを変更します。
宣言部分:
FUNCTION CheckBounds : DINT
VAR_INPUT
index, lower, upper: DINT;
END_VAR
VAR
_pApp : POINTER TO CmpApp.APPLICATION;
_Result : ISystypes2.RTS_IEC_RESULT;
END_VAR実装部分:
// Automatically generated code: This is an implementation suggestion.
_pApp := AppGetCurrent(pResult := _Result);
IF index < lower THEN
CheckBounds := lower;
IF _pApp <> 0 THEN
AppGenerateException(pApp := _pApp, ulException := RtsExceptions.RTSEXCPT_ARRAYBOUNDS);
END_IF
ELSIF index > upper THEN
CheckBounds := upper;
IF _pApp <> 0 THEN
AppGenerateException(pApp:=_pApp, ulException:=RtsExceptions.RTSEXCPT_ARRAYBOUNDS);
END_IF
ELSE
CheckBounds := index;
END_IFプログラム MAIN_PRG 以下に示す内容のアプリケーションの下にあるオブジェクト。
PROGRAM MAIN_PRG
VAR
xInit : BOOL;
arData : ARRAY[0..7] OF BYTE;
i : INT;
dwAdr : DWORD;
END_VAR
IF NOT xInit THEN
// Required for CheckBounds
xInit := TRUE;
END_IF
// Set i to a value > 7 or < 0
// Generates an exception in CheckBounds, user-defined
arData[i] := 11;このアプリケーションをロードして起動すると、配列の境界に違反すると例外が発生します。処理はで停止します チェックバウンズ これにより、エラーの種類を検出できます。