.
“CheckBounds”POU
.
.
用于绑定检查的函数:CheckBounds

此监视功能的任务是适当处理绑定冲突。违反行为的示例包括设置错误标志和更改数组索引的值。仅对一个变量数组索引执行检查。错误的常量数组索引会导致编译器错误。CODESYS将值分配给ARRAY变量时隐式调用该函数。

插入函数后,您会在声明和实现部分中收到自动生成的代码。见下文。

小心!

要获得监视功能的功能,请勿编辑声明部分。但是,您可以添加局部变量。

.声明部分

// Automatically generated code: DO NOT EDIT
FUNCTION CheckBounds : DINT
VAR_INPUT
      index, lower, upper: DINT;
END_VAR
 

.实现

// This automatically generated code is a suggested implementation.
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.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
 

.实现部分

// This automatically generated code is a suggested 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
 

使用下面显示的内容在应用程序下面编写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;
 

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