前言:为啥我们要花那么多精力去研究定时器和计数器呢?因为每当调用定时器和计数器指令时,都会生成一个它的背景数据块。如果一个项目中有N个定时器或者计数器要用到,那么在程序块里面,就会生成N个定时器/计数器的背景数据块,这样就会使得整个程序容量被大幅占用,白白浪费空间。而且整个程序看起来就非常臃肿不美观。
所以,我们使用以下三种方法来整齐划一地规划出一块区域专门给定时器和计数器来存放背景数据块。
方法1:在外面新建一个全局DB数据块,然后在里面分别创建以IEC_TIMER和IEC_COUNTER为数据类型的两个变量,如图所示:
方法2:在PLC数据类型中新建一个用户自定义数据类型,然后在外部重新创建一个全局数据块,然后新建变量“定时器和计数器生成器”,然后关键的一步就是为变量选择数据类型,此时我们要选择之前自己创建的PLC数据类型"定时器和计数器生成器UDT",然后就又生成了相应数量的定时器和计数器背景数据块。
以上两种方法都是只能在Main主程序里面使用,不能在FB块里面使用。
方法3:在FB块的Static静态变量区进行创建。如下图所示
最后,附赠一个用SCL编写的闪烁程序:当按下启动时,输出开始按照定时时间来进行闪烁,当按下停止时,停止输出。程序如下:
为什么时间的数据类型不一样也可以被定时器使用,而不会报错呢?
原因就是time数据的长度是32位的,而DINT也是32位的,并且博途中存在隐式转换的关系,它会自动将DINT数据类型转换成time数据类型。因此这么设置也是没问题的。