IEC定时器和计数器,对比S5定时器和计数器有一些优势:
--具有更大的计数、定时范围
--IEC定时器比S5定时器性能更佳,计时更准确。
--IEC定时器/计数器不占用CPU系统资源,只占用工作存储区,所以,只要你的存储够大,可以使用无数IEC定 时 器、计数器。
有这么多的优势那肯定是必须要用的,只是如何用好才是关键,毕竟实践才是检验好用的标准。
在实际使用中也是发现一些问题:
每次调用一次IEC定时器或计数器都会默认生产一个数据块,使用多了就会发现在系统块中会有一大堆的定时器或计数器的DB块
虽然这样也没啥,但是看着不舒服(有强迫症)。
这就要用到多重背景了,首先要了解什么是多重背景,*的定义:当函数块 (FB) 调用一个函数块时,无需为被调用的块创建单独的背景数据块。被调用的函数块也可将实例数据保存在调用函数块的背景数据块中。这种块调用又称之为多重实例。
使用多重实例具有以下优势:
适用于复杂块的*结构
背景数据块的数量较少
快速编程本地子程序
看到说明有木有豁然开朗,说做就做
直接建一个TimeDB块,然后把需要用的定时器都往这里放,同时命名好。这样是不是很方便快捷。
或者是这样:
直接建一个定时器的数组,需要多少个就设置多少个。这样就是有个问题:不能给每个定时器命名了。(速度超快,我都这么干,下面会讲到原因)
写完程序开始调试,小编发现这么修改定时器的时间之后定时器不运行了,或者还在继续运行之前设置的时间(1000ms写成1000s),这可不好玩。吓得小编赶紧把程序停止,重新下载在运行,随后赶紧查说明去。
对照一下*的例子:
看了半天也没发现什么,就是并没有给Q和ET赋值,难道是这原因?
果然,在吧Q给输出到一个变量后居然神奇的可以了,可以了,可以了,重要的事情说三遍。好吧果然是自己粗心大意了,在对照*的说明:
果然是*话,看不太懂。。。。。。。
果然还是TO YOUNG
写得很清楚,如果输出为互连,则不更改ET中 的当前值。。。
这个问题算是解决了。
以后写定时器记得给个输出,不要偷懒值给IN和PT
接着调试,问题右来了:图1
图2
各位发现问题了么有,从定时器使用处可以查到哪里使用了定时器.Q的使用点和自身所在的位置,但是,但是通过定时器.Q却不能反向找到在哪使用了定时器。
这就头大了,需要修改时找不到位置,只能通过DB块处找到定时器,在用交叉引用才能找到,这可麻烦了。
想了好几天都没想明白,突然想到之前的问题,定时器要带输出在更改定时器时间时才会更新,问题点会不会在这。
前面我提到过我喜欢直接把定时器定义在数据块的数组中,这是有原因的。在使用中既然不能反向查找到定时器的位置,还不如不给定时器命名(使用数组自带的名字),直接在Q输出的通过建立一个BOOL变量,命名这个变量就好,使用时也直接调用这个变量。
so,搞定问题,用得也很顺手。
拓展一下:
定时的数据格式是:IEC_TIMER 占用个16个字节
计数器的数据格式是:IEC_COUNTER 占用个6个字节
定时器的输入(PT)格式:Time、DWord、DInt(值都是以ms为单位的,使用触摸屏设置定时器值时就知道了)
写完也是一直冒冷汗,果然还是TO YOUNG ,好好学习,天天向上。
写在后,之前看到万泉河大神说过:好的程序的标准是:不使用M中间量,不使用Timer。
我个人觉得这是一个习惯问题(前提你得使用的是西门子的新plc)。小编自己早期使用三菱的,后面几乎都是S7-1200或者ET200SP,还真几乎不使用M,只要是麻烦。同时查找也麻烦,不知道在哪里使用了,或者说不知道在哪个程序中使用的。小编一般习惯在每个程序中去新建边,这样在那个程序写就使用哪个数据块,好管理。Timer也是如此,并不是说不要用定时器了,把定时器用多重背景数据块建在各自程序块中方便查找,集中管理。