技术论坛

 变量监控引发的问题分析

返回主题列表
作者 主题
空果仁
官方工程师
西门子官方工程师西门子官方工程师

经验值:4926
发帖数:210
精华帖:47
楼主    2020-05-14 19:47:09
主题:变量监控引发的问题分析 精华帖 

 

     平时觉得简单,没有注意的问题,在极端的情况下就会显现出来。测试程序就像一个放大镜,可以有效地仿真极端情况,透过现象可以更好地了解或者猜测背后的本质。

     做一个小的测试程序,用于测试TRACE的触发问题,结果还没有测试又发现一个小问题,先看一下在OB1中编写的测试程序如图1所示。

 

                    

                                                                                    图 1

     程序比较简单,就是让变量 "数据块_1".A 自加1,每次相加后等待2ms,使用FOR循环20个周期,执行完成之后,程序再等待1s后执行完一个周期。然后在变量表中监视变量 "数据块_1".A,问题出来了,每一次值的变化都是40的倍数而不是期望的20的倍数,为了验证程序的正确性,使用trace进行跟踪,发现确实是到20的倍数后等待1s,说明程序没有问题。把第一个FOR循环程序放到周期设置为1s的OB30中,删除OB1的程序,然后在变量表中监视变量 "数据块_1".A,这次值的变化都是20的倍数了,真是搞不清,有时问题没有想通真的很烧脑。

     再次回退的OB1中执行程序,在线监控程序,发现变量值也是以20的倍数进行变化的,原因是在线值就是采集程序当前执行完后的结果,是不是变量表采样的时机有问题?带着这样的问题,修改一下采样的时机,如图2所示,例如选择“永久,扫描周期开始时”。

               

                                                                              图 2

     再次使用变量表监控变量,这次值的变化正常了。使用“永久,扫描周期结束时”触发监控,值的变化也正常。

     变量监控缺省的采样设置的是“永久”,我们可以查看一下在线帮助什么是“永久”?手册是这样描述的:

监视时:在周期结束时监视输入,而在周期开始时监视输出。

修改时: 在周期开始时修改输入,而在周期结束时修改输出。

帮助中只是涉及到了输入和输出,好像与中间的变量没有关系,通过上述的现象只能猜测或者推理了,就是变量的采样时随机的,如图3所示。

 

                              

                                                                                   图 3

     采集时可能不能中断FOR循环,只有在两个FOR循环中间或者扫描开始前、扫描结束后时刻采集才能得到期望的结果,其中的一次采样可能不能中断FOR循环而没有采集到。使用OB30调用是中断处理,程序执行大约40ms,空闲960ms,在空闲这段时间可以采集到值的变化。OB1中的等待是程序执行而不是空闲。上述是猜测的,可能会有疑问,例如怎么这么巧,都是2次循环采集一次值而不是3次或者4次?有别的看法可以在回帖中说明,大家受益!

   监视有触发时机,同样修改变量也有触发时机,那么触发时机对变量的修改有什么影响呢?看一个简单程序,编写一个FC块,参考图4。

                     

                                                                                          图 4

     在FC中声明一个INOUT参数,在程序的开始读出,然后延时1s,经过计算在程序的结尾再写回去。然后在OB1中调用该FC块,赋值一个变量给FC块的INOUT参数,在变量表中使用缺省的“立即一次修改所有选定值”按钮修改该变量的值,发现修改多次而不能修改,次数多了可能会修改成功,这是什么原因呢?参考图5。

 

                        

                                                                                           图  5

     变量的修改也是随机的,如果在运行FC程序时正好修改变量的值,修改后的值在FC执行完成后又被原值覆盖了,那么为什么还有写成功的时候?就是修改变量的时机正好在其他程序执行时,这样调用FC时才能将修改的值读出,经过延时再写回去,这样就修改成功了,改小FC中的延时时间就会增加写成功的概率。这里可以设置修改时机,一次修改成功,如图6所示,设置使用触发器进行修改为“仅一次,扫描周期开始时”或者“仅一次,扫描周期结束时”,然后使用“使用触发器修改”按钮触发修改变量,这样可以避开在执行FC调用时修改变量的值。

                  

                                                                                      图 6

注意:

以上CPU程序是使用PLC SIM ADV 2.0 版本测试的

问题思考?

如果是HMI触发的修改变量值,会不会也不容易修改成功? 有没有解决方案?

 

来自西门工业子技术支持 高级专家
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。