排序可用的算法很多。计算机用的,PLC大也都可用。以下用依次比较这个最基本的方法进行排序。图5-62所示为这个程序。它用普通指令,可在指定的数据区内,实现按降幂排序。
图5-62 排序程序
图5-62a为欧姆龙PLC程序。该图用的是符号地址。从图知,当“启动”ON时,第1条执行的指令MOV,用“开始地址”赋值给“指针0”、“指针1”。注意,这两个指令都是微分执行的。再就是执行微分指令,使LB0.05 ON一个扫描周期。
LB0.05 ON,将使图中“排序开始”ON,并自保持。在“排序开始”ON期间,将调子程序1。每个扫描周期都将调一次。
图中从SBN指令开始到RET指令之间的程序,为子程序。每调一次,总是把“指针0”指向的数与“指针1”指向的数进行比较,如前者小,则把前后两者互换(用XCHG指令)。接着,修改“指针1”,并判断是否“指针1”已大于“结束地址”。
如“指针1”值大过“结束地址”,则修改“指针0”,则把“指针0”的现值赋值给“指针1”。并判断“指针0”是否已大于“结束地址”。如不大于,则重复上述循环。如大于,则“排序完成”ON,其常闭触点使“排序开始”OFF,说明排序完成。“排序开始”OFF又使“排序完成”复位,程序复原。
执行这个程序后,将使从开始地址到结束地址的DM区的数做降幂排序。如要做升幂排序,可把图中P_LT改为P_GT即可。
图5-62b为西门子PLC程序。该图用的也是符号地址。从图知,当“启动”ON时,第1条执行的指令MOV_DW,把VB0的绝对地址赋值给“指针0”,然后再把“指针0”与“开始地址”相加并赋值给“指针0”。接着,计算“结束地址”。之后,还产生M5.0输出。注意,以上指令都是在“P”指令后执行的,所以只在“启动”从OFF到ON一个扫描周期中执行。M5.0也仅ON一个扫描周期。
M5.0 ON,将使图中“排序开始”ON,并自保持。在“排序开始”ON期间,将调子程序0(SBR_0)。每个扫描周期都将调一次。
图中从SBR_0之后为子程序。每调一次,总是把“指针0”指向的数与AC2(也是指针)指向的数进行比较,如前者小,则用三个传送指令,把前后两者互换。接着,修改AC2,并判断AC2是否等于“结束地址”。
如AC2等于“结束地址”,则修改“指针0”,则把“指针0”的现值赋值给AC2。并判断“指针0”是否已等于“结束地址”。如不大等于,则重复上述循环。如等于,则“排序完成”ON,其常闭触点,使“排序开始”OFF,说明排序完成。“排序开始”OFF又使“排序完成”复位,程序复原。
执行这个程序后,将使从开始地址到结束地址的V区的数做降幂排序。如要做升幂排序,可把图中大小比较符号做适当修改即可。
图5-62c为三菱PLC程序。该图用的也是符号地址。从图知,当“启动”ON时,第1条执行的指令MOV,用“开始地址”赋值给变址器V0、V1。注意,这两个指令都是微分执行的。再就是执行微分指令,使M50 ON一个扫描周期。(www.daowen.com)
M50 ON,将使图中“排序开始”ON,并自保持。在“排序开始”ON期间,将调子程序P1。每个扫描周期都将调一次。
图中从P1开始到SRET指令之间的程序,为子程序1。每调一次,总是把D0V0地址的数与D0V1地址的数进行比较,如前者小,则把前后两者互换(用XCH指令)。接着,修改V1值,并判断“V1值是否已大于“结束地址”。
如V1值大过“结束地址”,则修改V0值,并把V0的现值赋值给V1。再判断V0值是否已大于“结束地址”。如不大于,则重复上述循环。如大于,则“排序完成”ON,其常闭触点使“排序开始”OFF,说明排序完成。“排序开始”OFF又使“排序完成”复位,程序复原。
执行这个程序后,将使从开始地址到结束地址的D区的数做降幂排序。如要做升幂排序,可把图中比较标志作些改动即可。
图5-62d所示为和利时LM机程序。其使用的变量声明如下:
图5-62d中节1、2为启动排序计算。节3为比较数组(所处理的对象)的两个下标变量。节4为节比较结果处理。如果两变量不等,将越过节5,否则执行节5指令。节5为修改下标变量1(indx1)、2(indx1)的值,并进行标变量1是否到了上限的比较。节6为不同下标的数组两个单元值的比较。节7为比较结果处理。以把大的数存于下标小的单元中。节8为修改标变量2的值,并进行是否达到数组上限的比较。节9,如节9的比较结果为真,则用下标变量1(indx1)的值赋值给下标变量2(indx1),为新的一轮比较做准备。节10,处理完成后,完成信号“jiSw”复位,并使下标变量“indx1”回原始值。
可知,进行了两个循环的比较及处理。数组中的所有单元的数据都一一作了比较。可使最大的排列在数组下标值最小的单元中。其余的也依次按降幂排列。程序是每隔一个扫描周期,执行一次。执行时,先修改数组下标值,再进行指定数组单元与预存的最大(小)数比较。接着根据比较结果,先修改下标变量1,然后一直修改下标变量2。直到下表变量2到了数组下标的上限,才修改下标变量1。这样,逐个找出它的相对大的值,并存储于下标相对小的单元中。这个过程一直持续到下标变量1达到数组下标的上限,即完成所有数的排序,“jiSw”ON。之后,停止计算,并在节7使“jiSw”与数组下标回原值。
执行本程序,将使数组中的数作降幂排序。如要作升幂排序,可把图中比较标志作些改动即可。
提示:图5-62a、b“结束地址”指向的数是在排序范围之内。故指针增加后,判断大于“结束地址”排序才完成。而图5-62b“结束地址”指向的数不在排序范围之内。故指针增加后,判断与“结束地址”相等排序即完成。
提示:这里排序用了两次循环,并须多个扫描周期才能完成。如果用循环指令也可以在一个扫描周期内完成。但是那样也不好,在排序这个周期,扫描时间可能太长。可能影响程序的实时性。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。