顺序器指令可以称得上是最早的数据块处理指令了,面对工艺过程控制的大量逻辑步进关系,当初内存又是如此的金贵,在不得不竭尽全力地节省内存的同时,还要兼顾大量的逻辑处理,顺序器指令这种来自于硬件的启发就这样产生了。自从有了PLC的那天就有了如此复杂的指令,但是它的确管用。
顺序器输出指令将按步骤输出的状态预先存放在被称为顺序器输出数组的数据块中,当步进进程变化,即指令的梯级条件跳变,顺序器输出指令执行,将指针指向的数据单元传送给输出目标操作数,这个目标操作数控制着外部设备,如此周而复始地重复。不难想象,如果这些逻辑输出分散地用梯级逻辑表现,不但消耗的内存会大量增加,并且不能集中看到设备的步进过程输出状态的关系,这些步进过程状态在生产工艺过程的列表中一目了然的形式在顺序器输出数据表中再次体现。
让我们来看一个这样的应用实例,有一个包装机,其包装过程可以分为7个生产步骤,这7个生产步骤都会对一个输出模块的输出点产生不同的输出状态去控制外部的设备运转状态,每前进一个步骤而产生的输出各点的状态,其过程没有规律性的变化。受限于编程实验设备的I/O点数,我们先假定这个离散量输出模块有4个输出点,这是我们要进行输出处理的对象。每个步骤的4位状态见表10-1。
表10-1 每个步骤的4位状态
创建一个顺序器输出数组标签,7个长度的双整字数组。我们把这个在控制过程中将出现的7个控制状态预存到顺序器输出数组中,如图10-16所示。
图10-16 顺序器输出数组的数据设置
下面编写一个顺序器输出指令的梯级,如图10-17所示。这个顺序器输出指令使用图10-16数据设定的输出数组Array_SQO,通过只让低4位传递的屏蔽字,在梯级条件的控制下逐步将4个位状态送到同一个输出模块,形成7个步骤的顺序控制。
给予这个梯级一个梯级条件,诸如这样的指令是需要梯级条件的跳变才能够执行的,每当生产过程前进一步,步进梯级条件就跳变一次,跳变触发令顺序器输出指令将指针POS加1,并将指针所指单元的双整字输出,传送到输出模块,给相应的输出点提供当前步的控制状态。
图10-17 顺序器输出指令的梯级
这里输出目标字在SQO指令中,要求双整字(查看在线帮助或指令集手册)。此例中,离散量输出模块的输出数据字是8位,只好建立一个缓冲字Buffer_SQO,然后通过传送指令传递数据。如果是32位的输出字的输出模块,指令输出目标字直接引用模块地址。
使用带屏蔽MVM指令传送到输出模块,而不是使用MOV指令,这样更为可靠,且不会影响到输出模块的其他位,尽管我们这里正好是4位输出,但要养成好的习惯,决不妨碍其他的位状态。
MVM指令可以单独编写一个梯级跟在后面,但这样每次扫描都要执行,如果并在SQO指令后面,则只需在梯级条件成立期间传送。如果梯级条件持久而不是突跳,希望减少执行,则可加上ONS指令限制,这又是一个可关注的细节。
改变梯级条件,观察顺序器输出SQO的执行过程,每当梯级条件从0跳到1,前沿触发令顺序器输出指令的指针加1,相应单元数据被送到目标字,当POS为7时,梯级跳变,指针回到1,重新开始新的一轮顺序输出。
那么,进入下一生产步骤的梯级条件是如何确定的呢?显然要根据现场的反馈,才能决定是否进入下一个步骤,这些现场的反馈来自于传感器输入信号,即输入模块的信息。最精彩的莫过于顺序器输出指令SQO与顺序器输入指令SQI的配合使用了。
SQI指令是少见的一条输入指令,位于梯级的左侧,每次扫描指令都被检测,决定梯级条件是否成立。所谓检测,是预先存放的参考数组按指定的顺序与检测对象进行比较,当比较结果相同,梯级条件成立;比较结果不同,梯级条件不成立。这个检测对象显而易见就是来自现场传感设备采集的输入模块状态。
继续前面包装机的实例,为其7个步骤进程的顺序输出,配合使用SQI指令来提供步骤进程的梯级条件。
首先,我们创建一个状态参考数组,受限于编程实验设备I/O点数,我们先假定采集步骤完成状态的离散量输入模块有6个输入点的状态是我们要进行比较的对象。每个步骤完成的6位输入状态见表10-2。
表10-2 每个步骤完成的6位输入状态
创建一个顺序器输入参考数组标签,7个长度的双整数组。我们把这个在控制过程中7个步骤完成所探测的输入状态预存到这个数组中,以供对比,如图10-18所示。
图10-18 顺序器输入参考数组的数据设置
顺序器输入指令SQI的工作是监视当前步状态的完成。每当梯级被扫描时,SQI指令中的输入参考数组Array_SQI与Buffer_SQI(来自离散量输入模块的对现场的状态检测)进行比较,这些被检测的状态位在不同的扫描周期陆续地达到了当前步的状态,总会有某次扫描周期,最后一个检测位也达到了应有的状态,比较的结果判定相等,梯级条件成立。获得梯级条件触发的顺序器输出指令,POS加1,送出下一步输出控制状态,生产过程进入下一步的执行。与此同时,顺序器输入指令开始监视下一步,并等待检测结果相等的时机出现。(www.xing528.com)
现在要解决的问题是,顺序器输入指令如何进入到下一步。我们已经知道,所有的数组指令的动作都是控制结构数据标签的指针来决定执行位置的,你可能已经注意到图10-19中的梯级逻辑编程了,这个SQI指令竟然跟SQO指令共享一个控制结构数据标签。这正是这两条指令配合使用的绝妙之处!SQI是一条输入指令,虽然每次梯级扫描都被检测,它永远也不可能获得一个触发去修改自己的指针POS。由于SQI是不能内部修改的,只能依靠外部修改,这自然需要额外编写梯级逻辑套用同步长的SQO指令的指针POS,真是得来全不费功夫。
同样的道理,顺序器输入指令也是只能使用32位的双整字,我们的离散量输入模块的输入数据字是8位的,只好建立一个缓冲字Buffer_SQI,然后通过带屏蔽的MVM指令传递。注意,这个传递必须放置在SQI指令所在梯级之前,并且每次扫描周期都要传送,以确保输入模块的信息及时映射到缓冲字Buffer_SQI。尽管SQI的屏蔽字作用确保了参与比较的输入字只会在低6位进行比较,还是使用了MVM指令防止干扰。
图10-19 顺序器输出与顺序器输入的配合运用
一对SQI和SQO指令只对一个输出模块的状态执行,对生产工艺过程的控制远远不止十几个点的顺序控制,这时你可以看到很多对SQI和SQO指令在同时控制着整个系统。
如果顺序器输出的数组是一个根据生产工艺变化的数据,而这个数据通常由操作员修改,这时顺序器装载指令SQL就派上了用场。操作员在人机界面上键入的数组参数为SQL的源,当界面Entry操作时,作为SQL的梯级条件令顺序器装载动作执行,从而逐个地修改了输出数组文件,如图10-20所示。顺序器装载指令SQL的工作与顺序器输出指令SQO很相似,每当梯级条件跳变,POS加1,源数据送往指针所指的数据单元。Buffer_SRL标签是人机界面上操作员键入数据所访问的标签,Entry则是确认数据键入的BOOL量所访问的标签。
如果顺序器输出的数组是固定不变的,意味着这些数据在编程的时候事先设定了,为了系统的可靠性,有经验的工程师往往会在初始化的例程里编写一段梯级逻辑,专门用来设置数据。这样,万一数据设置不小心被改动或错乱,只须重新启动运行就可以恢复正常的设置。
通常这种设定用MOV指令完成,把要设置的数作为立即数传送,请注意这些立即数都是十进制数。把刚才状态量的二进制所表示的数据形式转为十进制数的形式,如图10-21和图10-22所示。
图10-20 顺序器装载梯级逻辑
图10-21 顺序器输出状态量设置的十进制数
图10-22 顺序器输入状态量设置的十进制数
通过数据表的换算,现在应该知道MOV指令传送什么样的立即数据了,编写梯级逻辑如图10-23、图10-24所示。利用数据库中的数据来获得换算的关系,避免了人工计算可能出现的错误,因为这是控制器自己对数据的识别。
这是针对顺序器指令设置数据的一个例子,大凡遇到系统的数据预先设置,建议你不要直接在数据标签中设置数据,而是在初始化程序里执行MOV指令这样不但可靠,也能让读程序的人能够了解那些数据为什么预先设置,在梯级执行的注释中可加以说明,并能看到设置的数据值。有位资深项目工程师告诉我,他在项目中规定初始化程序的编写一律要求采用语句编程,因为只有语句编程才不会丢失注释信息,可见初始化信息的解释是多么重要。
图10-23 传送顺序器输出数组的设定值
关于顺序器输出指令SQO和顺序器装载指令SQL还有一个很麻烦的问题,就是0步的输出,所以指令在初次进入顺序循环时,要很谨慎地确定在0步还是在1步。通常我们在数组操作指令中Length项键入的数字都是指的数组长度,也即操作长度,惟独顺序器指令中,这里表示的是顺序器的步长,即它的操作长度。由于还有一个0步的存放单元,这个存放单元位于数组的首个数据,如果顺序器步长为N,实际创建的数组长度应该是N+1。
图10-24 传送顺序器输入数组的设定值
最后,要强调的一点是,不管是例程启动的初始化进入还是调用例程的中途进入,一定要注意将顺序器的POS清零,否则指针的残余状态可能带来步状态输出的混乱。如果数组的顺序处理没有0步的需求,我建议你采用FAL指令,这条指令的递增方式完全可以满足需求,最重要的是没有0步的困扰。
关于0步,这里稍作介绍。当数组操作的控制结构数据的指针为0,顺序器输出指令SQO和顺序器装载指令SQL的梯级条件如果成立,在例程首次扫描的时候,会执行0步的操作,即对数组的第一个元素操作,之后将根据梯级条件的跳变加1,执行后面的步,待一个循环做完,不再回到0步,而是从1步进入循环。顺序器的0步用来解决初始状态的设定问题,这个过程需要严密的配合关系,容易出错。
顺序器输入SQI指令的0步,在与顺序器输出SQO指令配合使用时,通常就是超始步的状态,只有在最初进入需要,本例中选择起始步和最后步使用相同状态。
顺序器的0步原是早期产品特用来解决控制步骤的初始状态的。不管怎么说,顺序器指令是最早的数据文件处理方式,后来的控制器数据处理能力越来越强,数组处理可用的方法越来越多,内存空间也变得非常充足,技巧性强且不容易明了的顺序器指令就用得越来越少了。我们仍然介绍了这组指令,并且分析了它的做法,并不是鼓励大家用这种方式,而是考虑到我们学习编程也是为了增强读程序的能力,有的控制器中的例程还保持了这样的梯级逻辑,也许是系统升级带过来的,确实不是很容易读懂。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。