Skip to main content

POU: CheckBounds

此监视功能的任务是适当地处理边界违规。对违规的反应示例包括设置错误标志和更改数组索引的值。仅对一个变量数组索引执行检查。不正确的常量数组索引会导致编译器错误。 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
*)

当。。。的时候 检查边界 函数被调用,它接收以下输入参数:

  • 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总是最新版本

添加一个 检查边界 应用程序下方的对象并修改指定的代码,如下所示。

声明部分

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;

当您加载并启动此应用程序时,如果违反数组边界,将引发“异常”。处理停止于 检查边界 以便可以检测到错误的类型。