无心飞扬 发表于 2024-11-5 21:09:28

CODESYS的隐含检测功能

在程序的编写过程中,可能会发生如下的几种情况:
 除法运算的被除数在某些情况下会为零;
 指针在赋值的过程中可能不小心指向空地址;
 调用数组时数组边界别溢出了;
针对上述情况,CoDeSys 有对应的解决方案,用户可以应用下添加隐式检查 POUs,隐式检查
POUs 能够检查函数的阵列和界限,以及除数为零和运行系统中的指针。
有以下这四种函数功能:
 CheckBounds; (检查数组边界函数)
 CheckDivInt /CheckDivLInt/CheckDivReal/CheckDivLreal; ( 检查除零函数 )
 CheckRange/CheckRangeUnsigned; ( 域边界的检查函数 )
 CheckPointer ( 指针检查函数 )
关于上面四种类型函数,CheckPointer ( 指针检查函数 )时需要用户自己编写的,其他的是不可编写的。

1.操作步骤:
在应用下鼠标右键选择“添加对象”,选择“用于隐含检查的 POU”,随后系统则
会弹出对话框,进行函数选择


2.函数分析:
(2-1)CheckDivInt/CheckDivLint/CheckDivReal/CheckDivLreal 检查除零函数为了检查除数的值,避免程序进行除零运算,CoDeSys 中可以使用检查函数 CheckDivInt/
CheckDivLint/ CheckDivReal/ CheckDivLreal。在将它们包含在应用中之后每个相关代码发生的除法
过程都将产生一个此函数调用的预处理。
当我们新建一个变量没有初始赋值,直接拉出来进行除法运算,这个时候系统会报错,因为没有初始赋值这个变量系统会默认为0

当使用了隐含检测除0时,系统会将为初始赋值的变量默认为1,避免产生程序错误



(2-2)CheckBounds 检查数组边界函数

此函数检查是否对数组的边界有超出。通常应用在可变的数组类型被分配应用中,使用该隐藏
函数可以用有效的保证函数边界不被超出。


如果没有采用,数组的最大值会从头开始算,如图中

采用了数组边界检测变量最大值会按照数组的最大边界来赋值,如图中



(2-3) CheckRange/CheckRangeUnsigned 域边界的检查函数为了在运行过程中检查域的限制,可以使用函数 CheckRangeSigned 或 CheckRangeUnsigned。
此检查功能的目的是恰当的子集违规处理(如设置一个检测到的错误旗帜或改变值)。当一个
变量的子集类型被确认后这个功能将被隐藏访问。当访问这个功能时得到以下输入参数:
 值:域类型被分配的值
 低:域的下限
 高:域的上限
如果被分配的值是在有效的域内,他将作为功能中的返回值被使用。否则,对应超过范围的数
值,要么上限或下边界的范围将被返回。
如图中演示的是上限值,当没有用边沿检测的时候最大值是大于边沿的。



使用了边沿检测就是按照编写的最大值,这个地方使用了要注意避免计算陷入死循环,因为他是不会超出最大值的。



(2-4) CheckPointer 指针检查函数 (需要用户自己编写,格式有很多种下面只是我个人编写检测数据类型不对的时候如何产生报警)函数 CheckPointer 检查地址的指针引用是否都在有效的内存范围内。在运行过程中,用户可以
在每个指针操作都可以使用 CheckPointer 来进行指针访问的检查。 它可以用来检查地址指针引用是
否均在有效的内存范围。此外,还可以用来检测对齐的内存区与引用的变量数据类型的指针指向。
如果两个条件都满足,CheckPointer 返回不变输入指针。
当调用函数获得以下输入参数时:
ptToTest: 指标的目标地址;
iSize:引用变量的型号;型号的数据类型必须是整数兼容的并且必须涵盖最大潜在储存在指标
地址中的数据型号;
iGran:访问的间隔,这是最大的无结构数据类型, iGran 的数据类型必须是整数兼容的;

bWrite:访问的类型(TRUE=写入访问,FALSE=读入访问);
(关于iSize和iGran这两个变量类型的意思是检测关于指针数据类型代表的字节是不是正确的,如INT是2,REAL是4)

如果没有开指针检测,数据类型传递是不正确的如图

正确的如图



如果采用了隐含指针检测会产生报警

页: [1]
查看完整版本: CODESYS的隐含检测功能