定时也是控制现场常见的需求,比如希望能够得到一个定时的动作脉冲去执行一个周期性的动作。
现在,我们来谈谈自复位计时器的定时作用,这是最常使用的方式,如果你看到一个梯级编成这个样子,如图5-8所示,你第一个反映就是,这将产生一个周期性动作,通常这个计时器的DN位在后面的一个梯级中就被当做动作执行的梯级条件了,它所控制的输出指令不失时机地产生了一个执行动作。再强调一下,这个DN位一定要出现在这个计时器后面的梯级,即使你在自己的测试中,DN位在前或在后似乎没有什么不妥,这样的执行顺序是一定不可以忽视的,同时也是一种良好的编程习惯,这可以帮助你避免某些陷阱。
图5-8 自复位计时
为了让大家更清楚定时动作的作用,我们不妨来分析一下这个自复位计时器的工作过程。自复位计时器永远都是用它自己的完成位常开作为它自己的梯级条件。我们知道,还没有开始工作的计时器,DN位现在是为0的,作为常开节点,在梯级第一次被扫描时,梯级条件当然是成立的,此时计时器指令被启动,待这个梯级第二次被扫描时,梯级条件依然成立,计时器依然被使能,计时器指令继续执行,将上次扫描到这次扫描的时间间隔累加到ACC中,然后将ACC与PRE进行比较,如果小于,则离开梯级,这次指令执行完毕。如此循环多次,终于ACC几乎接近PRE了,在最后一次扫描中累加后的判断,ACC大于等于PRE,此时DN位置位为1,指令执行完毕,离开梯级。等到这个梯级再次被扫描时,此时因为DN=1,毫无疑问,梯级条件不成立了,正如我们对TON这条指令执行的了解,当梯级条件不成立时,累加值复位,状态位复位。计时器指令用一个扫描周期的时间为自己复位,这就是自复位计时器。
这样,你当然明白为什么强调动作位一定要编辑在计时器指令的梯级之后了,如果你执意要编在不合适的位置,那你就把这个执行动作置于可能丢失的风险中了。
用两条计时器指令配合,产生两个时段的不同动作,且周而复始地进行,也是满足需求常见的编程方法之一。如图5-9所示的梯级逻辑编程,控制的结果将产生一个正负方向的方波信号,显然分别调节两个计时器的预置值,便可调节方波的频率和正负波占空比。传送指令MOV传送立即数至目标地址,将作为方波的幅值。
这也是自复位的计时方式,不过是两个计时器互为依存的复位,计时器Timer_Reverse的完成位的复位状态首先给Timer_Positive提供了梯级条件,当Timer_Positive计时完成,将为计时器Timer_Reverse提供梯级条件,直至Timer_Reverse计时完成,Timer_Reverse完成位置位复位了计时器Timer_Positive,复位后的Timer_Positive完成位立即复位了计时器Tim-er_Reverse,至此完成一个周期。Timer_Positive的完成位的不同状态则持续了两个时间段,用以完成正幅值和负幅值的传送。
再举一个耳熟能详的例子,交通红绿灯具有定时工作和互锁逻辑关系,比起工控系统中的多逻辑互锁,更为容易理解,我们就拿它来编程模拟工控系统中最常用的互锁逻辑动作。
假设东西方向绿灯和南北方向红灯亮6s;东西方向红灯和南北方向绿灯亮4s(为了观察方便,时间设得短一点),显然可以用两个自复位计时器来控制这两段时间,编辑如图5-10所示的程序。
图5-9 两个计时器互锁复位操作
两个计时器各自复位自己的时间,然后将两个计时器计时动作互锁,每个计时器指令的梯级条件都是对方计时器的使能常开位,这是很常见的指令执行互锁模式(关于多指令执行互锁的编程方法,我们在后面再讨论)。
如何使用计时器的工作位来控制输出,我们可以采用两种不同的编程方式,这是输入梯级条件与输出指令搭配使用的一个典型例子。
如图5-11所示的方式,控制工作位是计时器的计时位TT,即在计时器的整个计时时间段,TT保持在置位状态,提供梯级条件支持非保持型的输出指令OTE,点亮南北方向的绿灯和东西方向的红灯,或点亮东西方向的绿灯和南北方向的红灯,一旦梯级条件复位,相应的灯随之熄灭。
这是用持续的梯级条件来维持非保持性输出指令OTE的输出状态的一种编程实例。使用OTE指令时预扫描和后扫描的作用是要考虑的,显然在交通灯这样的例子中,影响是不太大的。
如图5-12所示的方式,控制工作位是计时器的完成位DN,作为自复位的计时器,一般情况下完成位DN只存在一个扫描周期(互锁的计时器则不同),与之匹配的输出指令应该是锁存输出指令OTL和解锁输出指令OTU,梯级编程为锁存南北方向的绿灯和东西方向的红灯,解锁东西方向的绿灯和南北方向的红灯;或锁存东西方向的绿灯和南北方向的红灯,解锁南北方向的绿灯和东西方向的红灯。
图5-11 交通灯互锁控制
上面的两种编程方式,我个人更倾向于互锁计时器DN位搭配锁存解锁输出指令的方式,这样似乎更为严密而不受干扰。(www.xing528.com)
让我们把这个程序下载到控制器中运行。任何自认为正确严密的程序,都要经过在线运行的测试,这就是现场调试。果然,问题暴露了,这个程序运行之后的前6s内没有任何灯被点亮。你几乎马上就想到了,这段时间没有任何一个计时器DN位置位,这些灯都是靠计时器的完成位DN位来动作的。应该一开始就让灯点亮,我们加上一个初始化的梯级,如图5-13所示。
原来,初始化也不一定是0,只要是初始条件所需要的就可以了,凡是初始化的梯级或例程,它的执行条件一定是只有初次扫描执行惟一的一次。S∶FS被称为首次扫描状态位,是系统中少量的无需建立标签便可直接使用的关键字之一,这是仅仅存在一个扫描周期的为1的状态位,为初始化执行动作提供一个可使用的内部状态位。
图5-13 初始化梯级
有的编程人员会把项目中所有的初始化的操作集中在一个初始化例程里面,初始化例程中有多个如图5-13所示的梯级,然后用S∶FS的梯级条件调用这个子例程。如图5-14所示,初始化例程Initialize只会在控制器运行之初执行一次。这是非常值得推荐的程序规划,尤其是我们谈到的标准化编程,就是希望把同类的处理集中于一处,这样便于查找,当我们猜测某个数据可能有初始化处理时,就会到初始化例程中去查找。
图5-14 调用初始化例程
如果你不愿意将这个初始动作放置在远离梯级控制逻辑的地方,按照如图5-15所示的梯级逻辑编程也是可取的,这样将初始逻辑处理和正常运行的逻辑处理并列一处,让人一目了然,更有利于解读程序,这也是早期有经验的工程师经常采取的方法。从这个实例看来,标准化的编程似乎在挑战这个典型的模式,事情往往这样,标准化的东西总有些繁杂,但有规矩可循,简洁的手段就不愿意墨守成规。如果是一个团队的工作,恐怕还是标准化更有意义,否则沟通所花费的时间将更多。
这个初始处理并列一个初始化条件,输出指令则利用了一个常规的完成操作,似乎比MOV一个值更为简洁,但不适合单独梯级处理。
图5-15 含初始化的梯级逻辑
现在,这个交通灯控制的梯形图的完整梯级逻辑如图5-16所示,请注意梯级安排的顺序。计时器在前面的梯级,它的完成位所执行的动作梯级在后面的梯级。控制南北方向和东西方向的两个互锁的计时器,按照梯级如此的排列,首先计时的是东西方向的计时器Tim-er_TrafficLight_EW,所以S∶FS锁定的是南北计时器的动作,令南北方向率先流通,一旦东西方向计时器完成,便进行交换,之后循环下去。
还有一点需要我们记住的就是,计时器的动作位只有DN位和TT位,这是指令计时开始之后具有的两种状态,只有它们跟计时过程有关。有人居然采用EN作后面梯级逻辑的动作位,那个程序运行起来看上去也还正常,要知道那恰恰是一对互锁的计时器,用于限制两条计时器指令的同时执行,这使他浑然不觉自己的错误。计时器的EN位永远跟梯级条件一致,要知道是梯级条件令计时器使能,如果你使用计时器的EN位,那你还不如直接用计时器的梯级条件,那还要计时器的介入何用呢。
不过,看上去不规范的运用,不是愚昧,就是智慧。我曾读过一段例程,看到EN突兀地出现在一个梯级,吃了一惊,细读之后,不禁哑然失笑。原来这个例程里有一个堪称主心骨的计时器,它的梯级条件十分复杂,并行了好多分支的位状态,一个屏幕都看不完。这个计时器之后一百多条梯级后,居然有个报警动作,也要使用这个跟计时器相同的梯级条件。我刚才还在说,不如直接用这个梯级条件,还真有这种做法,真是开眼界了。
话又说回来,如果出于愚昧,使用了EN位,那就不可原谅了。
有时候程序运行的陷阱是我们自己设置的,因为我们没有正确地使用指令,没有正确地使用指令的参数。
图5-16 交通灯控制的完整梯级逻辑
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。