Skip to main content

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

例:配列範囲外での配列アクセス

541. 定義された配列範囲外の配列へのアクセスの修正

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



例:配列境界の違反

542. 配列の境界に違反した場合の例外の出力。

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

  • 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

実装部分:

// 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;

このアプリケーションをロードして起動すると、配列の境界に違反すると例外が発生します。処理はで停止します チェックバウンズ これにより、エラーの種類を検出できます。