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 エラーの種類を検出できるようにします。