Skip to main content

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 違反したしきい値に応じて、上限または下限のいずれかを返します。

527. 例:定義された配列境界外の配列へのアクセスの修正

以下のサンプルプログラムでは、インデックスが定義された下限を下回っています。 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]。このようにして、関数は有効な配列範囲外の配列アクセスを修正します。



528. 例:配列の制限に違反した場合の例外の出力。

アプリケーションのライブラリマネージャーに次のライブラリを追加します。

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