首页 理论教育 等于指令EQU和不等于指令NEQ示例

等于指令EQU和不等于指令NEQ示例

时间:2026-01-26 理论教育 东北妞 版权反馈
【摘要】:在这种情况下,建议采用指针的方法来解决执行的顺序和确保执行动作的惟一性,作为识别判定的条件,更为直观和简洁,这时等于指令EQU的运用就必不可少了。每当梯级被扫描时,不等于比较指令NEQ将判断运行测试标签Run_Test和它的缓冲标签Run_Test_Buffer,当它们不相等,梯级条件成立,MOV指令则将本次的数据传送到缓冲标签,准备下一次的比较,此时表示对方主控制器正处在运行的状态,它的数据正在变化。

前面章节我们曾经讨论过,在实际运用中,常常会有指令执行动作的互锁,固然指令动作的互锁是常用的方法,当多条指令执行需要互锁时,指令的使能位互锁便显得比较繁琐。在这种情况下,建议采用指针的方法来解决执行的顺序和确保执行动作的惟一性,作为识别判定的条件,更为直观和简洁,这时等于指令EQU的运用就必不可少了。

例如,一个数据长度有限的对外通信数据缓冲区,假定一次只能传送100个双整字,现在有500个双整字需要传送,只能分为5次轮流传送,这些传送的执行动作必须互锁,既要有一定的传送顺序,又要确保任何时候只有一段数据正在传送,可以安排长度为5的指针来协调工作,编写梯级逻辑如图7-1所示。

定义对外的通信缓冲区为数组标签Array_Carry,这个标签的数据是动态的,按顺序地从传输对象数组标签Array_Transmission中截取一段数据块装入这个缓冲区,数据传送装载工作交给COP指令完成,完成的动作顺序由指针来安排,等于指令EQU区别不同的梯级条件,选择不同的数据段,COP传送到作为数据缓冲区的数组标签Array_Carry中。

图示

图7-1 指针控制传输顺序的梯形逻辑

自复位计时器Timer_Compare提供计数脉冲,作为指针的计数器按照它的时间间隔计数。每当计数器计数到5时,完成位置位,用来复位计数器Counter_Carry,从而一个数据传送的周期完成,即500个双整字全部传送一次。根据需求,数据传送的频率可以通过改变计时器的预置值来设定,此例中是0.5s传送一个数据块,所有数据全部传送一遍需要2.5s的时间。

请注意,采用计数器完成位执行的计数器复位动作,宜放在所有COP指令完成之后的梯级进行,也即跟计数器累加值有关的执行动作全部执行完毕,再复位计数器。

试想一下,如果将计数器复位的梯级紧接着放在计数器指令计数的梯级之后会怎么样呢?我有时读到的梯形图程序,EQU指令判定对象的指针是0、1、2、3、4,没有选择直接了当的1~5的表达,这个编程者一定经历了一个这样的过程,始终得不到等于5的判断条件,于是退而求其次,选择了0~4的判断,这也何尝不可,照样按5个步骤执行。得不到等于5的判断条件的原因是计数器复位的动作提早了,没有在所有的动作执行完毕再复位,所以,请不要抱怨计数器指令不好使,可能是你对指令使用的细节研究不够。有一次,我读到一段例程的结尾,如图7-2所示,他应该是把这个例程中所有的复位动作统统放在例程的最后扫描来处理,绝无疏漏且一目了然。还是那句话,良好的编程习惯可以帮助你避开陷阱。(https://www.xing528.com)

图示

图7-2 一段例程的结尾

在计数器的章节里,我们曾用一个计数器产生的不断变化的数据来作为一个主控制器发出的脉搏信息,表示主控制器处在运行状态,那么在每个从控制器中,应该对这个收到的来自主控制器的脉搏信息进行判断,让我们编写梯级逻辑来实现,如图7-3所示。

每当梯级被扫描时,不等于比较指令NEQ将判断运行测试标签Run_Test和它的缓冲标签Run_Test_Buffer,当它们不相等,梯级条件成立,MOV指令则将本次的数据传送到缓冲标签,准备下一次的比较,此时表示对方主控制器正处在运行的状态,它的数据正在变化。断延时计时器Timer_Run_Test在数据未刷新期间连续计时,数据刷新后则复位计时器,只要未达到预置值,它的DN位状态始终为1,维持着表示运行状态正常的输出标签Master_Run_OK。一旦比较结果相等的时间超过预期的值,说明数据一直没有更新,此时梯级条件不成立,MOV不再传送数据,当断延时计时器的累积时间达到了预期值,这个预置值为5s的计时器,在延时5s后,DN位复零,表示运行状态正常的位Master_Run_OK被关闭。你应该还没有忘记吧,当断延时计时器的累加值ACC达到预置值PRE的时候,它的DN是复零的状态。

图示

图7-3 运行判定梯级逻辑

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈