首页 理论教育 V区数值排序程序:降幂排序/升幂排序

V区数值排序程序:降幂排序/升幂排序

时间:2023-06-16 理论教育 版权反馈
【摘要】:LB0.05ON,将使图中“排序开始”ON,并自保持。在“排序开始”ON期间,将调子程序1。接着,修改“指针1”,并判断是否“指针1”已大于“结束地址”。“排序开始”OFF又使“排序完成”复位,程序复原。执行这个程序后,将使从开始地址到结束地址的V区的数作降幂排序。如要作升幂排序,可把图中大小比较符号作适当修改即可。图6-39c中,从P1开始到SRET指令之间的程序,为子程序1。

V区数值排序程序:降幂排序/升幂排序

978-7-111-56641-0-Chapter07-43.jpg

图6-39 排序程序

排序可用的算法很多。计算机用的,PLC大也都可用。以下用依次比较这个最基本的方法进行排序。图6-39所示为这个程序。它用普通指令,可在指定的数据区内,实现按降幂排序。

图6-39a为欧姆龙PLC程序。该图用的是符号地址。从图知,当“启动”ON时,第1条执行的指令MOV,用“开始地址”赋值给“指针0”“指针1”。注意,这两个指令都是微分执行的。再就是执行微分指令,使LB0.05ON一个扫描周期。

LB0.05ON,将使图中“排序开始”ON,并自保持。在“排序开始”ON期间,将调子程序1。每个扫描周期都将调1次。

图6-39a中,从SBN指令开始到RET指令之间的程序,为子程序。每调1次,总是把“指针0”指向的数与“指针1”指向的数进行比较,如前者小,则把前后两者互换(用XCHG指令)。接着,修改“指针1”,并判断是否“指针1”已大于“结束地址”。

如“指针1”值大过“结束地址”,则修改“指针0”,则把“指针0”的现值赋值给“指针1”。并判断“指针0”是否已大于“结束地址”。如不大于,则重复上述循环。如大于,则“排序完成”ON,其常闭触点,使“排序开始”OFF,说明排序完成。“排序开始”OFF又使“排序完成”复位,程序复原。

执行这个程序后,将使从开始地址到结束地址的DM区的数作降幂排序。如要作升幂排序,可把图中P_LT改为P_GT即可。

图6-39b为西门子PLC程序。该图用的也是符号地址。从图知,当“启动”ON时,第1条执行的指令MOV_DW,把VB0的绝对地址赋值给“指针0”,然后再把“指针0”与“开始地址”相加并赋值给“指针0”。接着,计算“结束地址”。之后,还产生M5.0输出。注意,以上指令都是在“P”指令后执行的,所以只在“启动”从OFF到ON一个扫描周期中执行。M5.0也仅ON一个扫描周期。

M5.0ON,将使图6-39b中“排序开始”ON,并自保持。在“排序开始”ON期间,将调子程序0(SBR_0)。每个扫描周期都将调1次。

图6-39b中从SBR_0之后为子程序。每调1次,总是把“指针0”指向的数与AC2(也是指针)指向的数进行比较,如前者小,则用3个传送指令,把前后两者互换。接着,修改AC2,并判断AC2是否等于“结束地址”。

如AC2等于“结束地址”,则修改“指针0”,则把“指针0”的现值赋值给AC2。并判断“指针0”是否已等于“结束地址”。如不大等于,则重复上述循环。如等于,则“排序完成”ON,其常闭触点,使“排序开始”OFF,说明排序完成。“排序开始”OFF又使“排序完成”复位,程序复原。

执行这个程序后,将使从开始地址到结束地址的V区的数作降幂排序。如要作升幂排序,可把图中大小比较符号作适当修改即可。(www.xing528.com)

图6-39c为三菱PLC程序。该图用的也是符号地址。从图知,当“启动”ON时,第1条执行的指令MOV,用“开始地址”赋值给变址器V0、V1。注意,这两个指令都是微分执行的。再就是执行微分指令,使M50ON一个扫描周期。

M50ON,将使图中“排序开始”ON,并自保持。在“排序开始”ON期间,将调子程序P1。每个扫描周期都将调1次。

图6-39c中,从P1开始到SRET指令之间的程序,为子程序1。每调1次,总是把D0V0地址的数与D0V1地址的数进行比较,如前者小,则把前后两者互换(用XCH指令)。接着,修改V1值,并判断“V1值是否已大于“结束地址”。

如V1值大过“结束地址”,则修改V0值,并把V0的现值赋值给V1。再判断V0值是否已大于“结束地址”。如不大于,则重复上述循环。如大于,则“排序完成”ON,其常闭触点,使“排序开始”OFF,说明排序完成。“排序开始”OFF又使“排序完成”复位,程序复原。

执行这个程序后,将使从开始地址到结束地址的D区的数作降幂排序。如要作升幂排序,可把图中比较标志作些改动即可。

图6-39d所示为和利时LM机程序。其使用的变量声明如下:

978-7-111-56641-0-Chapter07-44.jpg

图6-39d中:节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个扫描周期,执行1次。执行时,先修改数组下标值,再进行指定数组单元与预存的最大(小)数比较。接着根据比较结果,先修改下标变量1,然后一直修改下标变量2。直到下表变量2到了数组下标地上限,才修改下标变量1。这样,逐个找出它的相对大的值,并存储于下标相对小的单元中。这个过程一直持续到下标变量1达到数组下标的上限,即完成所有数的排序,“jiSw”ON。之后,停止计算,并在节7使“jiSw”与数组下标回原值。

执行本程序,将使数组中的数作降幂排序。如要作升幂排序,可把图中比较标志作些改动即可。

提示1:图6-39a、图6-39b“结束地址”指向的数是在排序范围之内。故指针增加后,判断大于“结束地址”排序才完成。而图6-39b“结束地址”指向的数不在排序范围之内。故指针增加后,判断与“结束地址”相等排序即完成。

提示2:这里排序用了两次循环,并需多个扫描周期才能完成。如果用循环指令也可以在一个扫描周期内完成。但是那样也不好,在排序这个周期,扫描时间可能太长。可能影响程序的实时性。

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

我要反馈