POU:CheckBounds
この監視機能のタスクは、バインドされた違反を適切に処理することです。違反に対する反応の例には、エラーフラグの設定や配列インデックスの値の変更が含まれます。チェックは、1つの変数配列インデックスに対してのみ実行されます。定数配列インデックスが正しくないと、コンパイラエラーが発生します。 CODESYS 値がに割り当てられたときに暗黙的に関数を呼び出します 配列 変数。
詳細については、以下を参照してください。 暗黙のチェックにビルディングブロックを使用する、 暗黙のチェックにビルディングブロックを使用する
関数を挿入すると、宣言部分と実装部分で自動的に生成されたコードを受け取ります。下記参照。
注意
監視機能の機能を利用するには、宣言部分を編集しないでください。ただし、ローカル変数を追加することは許可されています。
宣言部分
// Automatisch erzeugter Code : NICHT EDITIEREN
FUNCTION CheckBounds : DINT
VAR_INPUT
index, lower, upper: DINT;
END_VAR実装
// Automatisch erzeugter Code: Es handelt sich hierbei um einen Implementierungsvorschlag.
IF index < lower THEN
CheckBounds := lower;
ELSIF index > upper THEN
CheckBounds := upper;
ELSE
CheckBounds := index;
END_IF
(* 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.
Declaration:
VAR
_pApp : POINTER TO CmpApp.APPLICATION;
_result : SysTypes.RTS_IEC_RESULT;
END_VAR
Implementation:
_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実装部分
// Automatisch erzeugter Code: Es handelt sich hierbei um einen Implementierungsvorschlag.
_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
// Erforderlich für CheckBounds
xInit := TRUE;
END_IF
// Setze i auf einen Wert > 7 oder < 0
// Generiert eine Exception in CheckBounds, Benutzerdefiniert
arData[i] := 11;このアプリケーションをロードして起動すると、配列の境界に違反すると「例外」がスローされます。で処理が停止します CheckBounds エラーの種類を検出できるようにします。