技术论坛

 小BUG产生的原因_程序分析

返回主题列表
作者 主题
空果仁
侠圣

经验值: 4926
发帖数: 210
精华帖: 47
楼主    2020-04-30 15:25:49
主题:小BUG产生的原因_程序分析 精华帖 

 

     编程的时候除了注意指令的使用环境,还需要注意基本的运行规则,否则就会产生不必要的小BUG,这些小BUG看似简单,但是真正解决起来却不容易,因为这样的错误是根深蒂固地存在大脑的深处,看着错误可能就是觉得是正确的,这样就会怀疑其它的地方,造成方向性的错误,比如是不是CPU的操作系统有BUG,或者是指令系统有BUG,即使老司机也可能犯低级的错误。

     在编写《从S7-300_400到S7-1500看变址寻址的改变》系列时做了一个小的示例程序,结果总是有问题,分析也很烧脑。好了,先介绍一下程序的功能,这是一段表查询的小程序:

     例如创建一个数据块A,然后在里面再创建一个数组B,INDEX从0~100,单位是INT,这样一个表就创建完毕,然后使用一个已知的值与表中的值比较,如果查询到第一个相同的值就记录值的位置,就是数组中INDEX的值,然后清零INDEX的值并复位查询使能位,如果没有查询到,INDEX值加1,如果整个表中都没有相同的值,同样清零INDEX并复位查询使能位。程序参考图1。

 

                                                                                           图 1

     "Start_comp"作为查询使能位,如果 "Comp_Value"与表(数组) "A".B["Index"]的值相同,将"Index"的值存储到"Result"中,然后清零"Index"并复位查询使能位 "Start_comp";如果 "Comp_Value"与表(数组) "A".B["Index"]的不相同,将"Index"的值加1,如果查询到表的最后,还是没有相同的值,同样清零"Index"并复位查询使能位 "Start_comp"。一段小程序,非常简单,好了,再看一下程序监控吧,参考图2。


                                                                                         图 2

     查询的结果是正确的,但是"Index"的值定格为1而不是0。对于这样的结果,我首先想到的是时序的问题,是不是S7-1500编程功能扩展后程序有些变化?想起一个办法就是在S7-300中编写相同的程序,然后切换到STL,使用断点监控一下,后来还是放弃了,因为S7-300不支持数组INDEX    的方式,如果使用S7-1500做也比较麻烦。可以把程序放到循环中断中,放大扫描时间看一下结果,就是相当于慢放功能,监控程序,首先是值不相等条件满足,如图3所示。


                                                                                       图 3

      从图3中可以看到,值不相等,"Index"的值加1,然后与下一个值进行比较,直到与比较值相同,如图4所示。

 

                                                                             图 4

     从图4中可以看到,比较值等于与不等于同时满足,所以上面"Index"的值清零了,下面一行又加1了,所以"Index"的值最终定格在1上,只是什么逻辑!!! 搞不明白!!!

     经过一番折腾,发现问题了,比较值相等的"Index"是2,比较值不相等的"Index"是0,说明"Index"是清零了,所以会出现比较值等于与不等于同时满足的情况,就是因为比较的值不同了,所以犯了一个小错误,也是没有仔细查看,也是由于设定的扫描时间还是比较短,最后使用图片抓拍才发现。

     总结一下这里的问题,主要还是时序的问题,相同程序段线圈的复位结果作用在下一个扫描周期,而赋值结果是在指令完成之后。可以把上下两行程序互换一下位置就可以解决问题了,程序参考图5。


                                                                                        图 5

来自西门工业子技术支持 高级专家
周杰伦
至圣

经验值: 13745
发帖数: 2031
精华帖: 16
1楼    2020-04-30 15:56:43
主题:回复:小BUG产生的原因_程序分析

看到您的程序逻辑,我第一反应就是右键插入SCL语句,直觉告诉我不会出现您的问题,因为Else的内容直接跳过了,这个周期不扫描了。

工控毁我青春!
CoolCool的猪
至圣

经验值: 16713
发帖数: 1307
精华帖: 2
2楼    2020-04-30 16:07:42
主题:回复:小BUG产生的原因_程序分析

谢谢啊  
有些细节确实容易忽略

同一个问题ID下,已经先回答此问题的人,如再参考我答案而修改自己答案的,就是王八蛋!
'Razor
至圣

经验值: 20094
发帖数: 2767
精华帖: 23
3楼    2020-04-30 16:34:40
主题:回复:小BUG产生的原因_程序分析

时序是个坑

Less is more……
yangchunbaixue
侠圣

经验值: 3699
发帖数: 555
精华帖: 0
4楼    2020-04-30 17:45:43
主题:回复:小BUG产生的原因_程序分析

的确是很烧脑的程序,稍微没注意那么些小细节就会出现不一样的输出结果。

yming
至圣

经验值: 126848
发帖数: 21989
精华帖: 824
5楼    2020-04-30 21:16:08
主题:回复:小BUG产生的原因_程序分析

这不就是所谓“双线圈”么?


学而时习之,不亦说乎?温故而知新,不亦乐乎?
木头515
侠圣

经验值: 2157
发帖数: 254
精华帖: 0
7楼    2020-05-02 07:51:33
主题:回复:小BUG产生的原因_程序分析

确实需要注意细节问题,要不然很容易方向性错误。

低头做事,抬头做人!!
shine
至圣

经验值: 19950
发帖数: 8944
精华帖: 39
15楼    2020-05-06 22:12:38
主题:【故事】回复:小BUG产生的原因_程序分析
其实最后一段的说法还是有一点点问题的,线圈的复位也是即时的,如果之后还有读这个线圈的指令,读到的也是复位之后的值。比如你把第一个network分成两个,线圈指令在两个network中都使用。本例中,所说的下一个周期生效是因为那条指令已经被执行过了,结果已经放到了堆栈中,而第二行的根据index访问数组的指令还没有执行,等执行到的时候用的当然是最新的值
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。