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.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
实施部分
// 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;
当您加载并启动此应用程序时,如果违反数组边界,将引发“异常”。处理停止于 检查边界 以便可以检测到错误的类型。