前言:
软件:TIA V19
CPU:1500
HMI:TP900 Basic
背景:
缓存400条数据到DB(Datalogs)块内,HMI上有一个界面可以查看这些数据。方便操作,写了相关功能。
(相关数据和程序简化后再仿真还原,只讨论核心问题)
数据查看界面如下:
(一个页面显示10条记录,总共缓存400条记录)
StartIndex:输入/输出IO控件,用来指定索引起始位置
PreRecord/NextRecord:上下翻单条记录
PrePage/NextPage:上下翻页
实现原理:
按钮都使用DecreaseTag或者IncreaseTag函数来操作StartIndex变量的值,以实现单条记录或整页的切换。
PLC程序代码如下:

(
本人菜鸟一个,大佬们先不用关心这段SCL程序,性能拉胯还需要大大的优化)
在StartIndex的Region中,已对StartIndex的值进行限制,防止索引值超过数据数量范围
故障表现:

数据区地址访问无效导致CPU临时停机
原理分析:
在DataDisplay的Region中,我需要在指定的Startindex索引起始处,连续取10条数据出来,进行简单的处理后显示到HMI上。当StartIndex值+10后,如果结果小于0或者大于400,就会发生数组越界导致访问的数据地址不存在。
故障原因排查分析
1,在StartIndex的Region中,已对StartIndex值进行范围限值,在范围内,索引值+10(需要10条数据),其范围依然会在0-400内,这个索引范围依然在的数据记录数组的范围内,为什么数组还是会越界?
原因:
因为Decrease或Increase函数会让StartIndex的值超过我设定的范围(0-390),比如-2或者395。但这个过程不是永久的,因为更新周期(1S)的存在,这个异常值(-2或395)会被更新,然后限定在0-390之间。然后尴尬的来了,这个更新周期的时间,对于CPU来说,太长了,这个异常值依然会被记录和处理,于是故障发生了。
2,我已经设置StartIndex变量的限值范围如下图,它为什么没有限值住StartIndex变量的取值范围?

这个有点不太明白,目前查看帮助是说限制输入的范围,那我用Decrease或者Increase函数来操作这个变量,不算输入嘛?
我的操作方式可能不太对,恳请大佬讲解,感谢~
3,意识到更新周期的问题后,我把StartIndex的变量更新周期改到100ms内,依然会发生数组越界问题。
尝试之后知道,这个问题不是数据更新的问题了,难过~~
问题解决办法:
由于我无法直接解决这个问题,所以我采取了另外的办法来避免(只是避免未解决)这个问题,我引入了StartIndex变量的ValueChange事件,当这个事件被触发后,我来更新整个查询的操作。
发这个帖子的目的:
1,上面提到的Decrease或者Increase函数问题,如果我继续坚持使用的话,我应该以何种正确的姿势来使用这个函数呢?
2,这个异常的现象,到底是如何引发的呢,根本的原因是啥?
3,变量的范围参数这个,是不是还有我未涉及的知识盲区?
4,希望这个帖子对项目中也使用这个用法的同学有点参考意义。
恳请大佬普及一下,感谢!
先磕一个,以示尊敬~~~