绑定检查功能检查边界
该监控功能的任务是妥善处理违反约束的行为。对违规行为的反应包括设置错误标志和更改数组索引值。只对一个变量数组索引进行检查。不正确的常量数组索引会导致编译器错误。当值被分配到ARRAY 变量时,CODESYS 会隐式调用该函数。
插入函数后,您将在声明和执行部分收到自动生成的代码。见下图。




小心

要获得监控功能,请勿编辑声明部分。不过,您可以添加本地变量。
声明部分
// 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.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
实施部分
// 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” 中停止处理,以便检测错误类型。