POU: CheckBounds
此监控功能的任务是适当处理边界违规行为。对违规行为的反应示例包括设置错误标志和更改数组索引的值。仅对一个变量数组索引执行检查。不正确的常量数组索引会导致编译器错误。一旦将值赋值给,就会隐式调用该函数 数组 变量。
有关更多信息,请参阅以下内容: 使用构建块进行隐式检查 和 使用构建块进行隐式检查
插入函数后,您会在声明和实现部分收到自动生成的代码。见下文。
小心
要获得监视功能的特性,请不要编辑声明部分。但是,您可以添加局部变量。
声明部分:
自动生成的代码:请勿编辑!
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.Library, SysExcept.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
当。。。的时候 检查边界 函数被调用,它接收以下输入参数:
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和 总是最新版本
添加一个 检查边界 应用程序下方的对象并修改指定的代码,如下所示。
声明部分:
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;当你加载并启动此应用程序时,当违反数组边界时将引发异常。处理停止 CheckBounds 这样就可以检测出错误的类型。