绑定检查功能检查边界
该监控功能的任务是妥善处理违反约束的行为。对违规行为的反应包括设置错误标志和更改数组索引值。只对一个变量数组索引进行检查。不正确的常量数组索引会导致编译器错误。当值被分配到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” 中停止处理,以便检测错误类型。