回复:应用讨论----按钮抖动处理问题

划痕

  • 帖子

    2009
  • 精华

    23
  • 被关注

    16

论坛等级:侠圣

注册时间:2009-08-14

普通 普通 如何晋级?

发布于 2012-06-01 15:11:16

26楼

设计防抖动程序时,可能我们会将注意力都集中到了以下这些地方:
1、用FC还是FB?
2、用系统定时器、计数器还是用IEC定时器计数器(SFB)?
3、单个处理还是集中处理?

经过一番深思熟虑,可能会得到以下答案:
1、FB相对FC有天然优势:①FB中可以避免使用“沿指令”,多一个静态bool量即可;(逻辑处理中很多时候都要用到沿指令)②支持多重背景,比如你真的想用或考虑到方便时不得不用IEC定时器时;③……等等,所以选择使用FB。
2、系统定时器Tn,计数器Cn占用系统资源,故选择后者IEC定时器计数器。但是,有时可以选择两者都不用。别忘了S7-300/400/1200提供给用户的中断OB,它给了我们另一个选择,那就是利用“累加”原理实现计时功能。比如OB35(中断周期100ms)中建立一个变量MB0,每次运行OB35则进行加1处理,当MB0为10的倍数时,置位M11.0;当MB10为20的倍数时,置位M11.1;当……;然后当MB10大于X时清零即可。这样可以设置很多的时间标志位,你知道的,这也是很有用的啦。
3、单个处理还是集中处理?应该视场合而定,所以建议做两个FB,一个用于单个数字量滤波,另一个用于批量数字量滤波。一般用于连锁信号的数字量输入建议进行滤波除抖,而单回路的反馈信号,即仅用于上位机显示的数字量输入信号,可不用进行滤波处理。

再经过一番努力,防抖动FB也做出来了,PLCSIM测试效果也挺好的。但是,又有问题了:但系统重启/断电重启后,常闭触点的处理似乎还没有考虑周全!因为系统重启后,就意味着映像区数据要更新,尤其是很多关键的连锁信号就可能误动作!怎么办?
如果考虑在每个功能块中都加入判断是否系统重启,然后做相应的处理,就陷入一个误区了。当然,程序可以这样做得很完美,但是也相应地降低了代码的效率。(这里的误区,仅仅个人看法)

说到这里,你已很难跳出功能块开发的“局”,总是跳不出来!因为你很难想到:这可能仅仅是程序结构/框架的问题

处理意见:
建立全局变量a,在OB100中赋初值a=10(或者其他大于0的整数即可),再修改OB1中程序组织结构:系统采样滤波处理——>对a进行减1处理,判断a是否为0,若a不为0则跳出OB1;若a为0则继续执行——>连锁、PID、电机、阀门等等子程序。
这样处理的原理:
在PLC系统重启的前10个扫描周期仅进行采样滤波处理,即将现场的“真实信号”采集并存放起来(可以形象地称这10个扫描周期为“系统准备阶段”),从第11个周期起执行系统所有的程序。当然,可以修改a的数值,保证系统的采集到的是真实信号,理论上a的值越大,信号失真的可能性越小。这样处理后,信号的防抖处理就没有常开常闭之分了。

总结:
程序中去抖动处理确实很有必要,但是我们在进行程序设计的时候想了很多,也做了很多,可能离成功就只差一步之遥了。此时应该记得这样一句话:当你越接近成功的时候,越需要你跳出来透过现象看本质。
No discussion, no outcome.
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54618条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。