找答案的高端用户(找答案钻石及双钻级别的用户)将尽可能从此问题下的所有回
答中,为您推荐最佳答案。届时您可以根据推荐数采纳答案。
如果自提问时间起7天内您仍无法选出最佳答案,您可以选择“无满意答案”关闭此问题。
{{itemCategory}}
但是有一个问题,我现在不光想知道所有重量排序,最终要的是我要知道排序后这些重量分别对应的是哪个仓!
手机扫码追踪该问题,
觉得实用,立即去分享!
点击复制链接
下面程序是我在TIA博途上用SCL完成的,已经测试了。SIMATIC 上的SCL应该一样的。
主要算法是先寻找一个最大值提取到头部,接下来再寻找剩下的数据中的最大值放到第二个位置,以此类推,直到全部排序完成。这也就是所谓的选择排序。比较次数为n(n+1)/2。
//利用选择排序,直接对重量值编号进行排序
#t_Value := #in; //获取输入数据
//初始化序号队列
FOR #i := 1 TO 10 DO
#Num[#i] := #i;
END_FOR;
FOR #n := 1 TO 9 DO
#max := #Num[#n];//初始化最大值编号
#j := #n; //初始化最大值编号对应下标
FOR #i := #n TO 9 DO
//比较查找最大值
IF #t_Value[#Num[#i + 1]] > #t_Value[#max] THEN
#max := #Num[#i + 1];//记忆最大值编号
#j := #i + 1;//记忆最大值编号对应下标
END_IF;
END_FOR;
//交换最大值编号
#Num[#j] := #Num[#n];
#Num[#n] := #max;
END_FOR;//至此已经完成了编号排序;
//输出排序后对应重量值
FOR #i := 1 TO 10 DO
#AfterValue[#i] := #t_Value[#Num[#i]];
END_FOR;
后记:期间博途崩溃1次,前后花费1小时10分钟。
OPN DB 1
L 10
m01: T Mw 100
L P#0.0
LAR1
L 9
m02: T Mw 102
L DBd [AR2,P#2.0]
L DBW [AR2,P#8.0]
>r
JC m03
L DBw [AR1,P#0.0]
T MW 10
l dbd[ar1,p#2.0]
t md12
L DBW [AR1,P#6.0]
T DBW [AR1,P#0.0]
L DBD[AR1,P#8.0]
T DBD[AR1,P#0.0]
L MW 10
T DBW [AR1,P#6.0]
L MD12
T DBD[AR1,P#8.0]
M03: +AR1 P#6.0
L MW 102
LOOP M02
L MW 100
LOOP M01
这样就包含有编号在内了。
在DB10里定义若干个INT数据类型DBW0到DBW8为源数据,DBW10到DBW18为数据排序的位置,DBW20到DBW28为序号。
CALL "BLKMOV"
SRCBLK :=P#DB10.DBX 0.0 INT 5
RET_VAL:=#TEMP1
DSTBLK :=P#DB10.DBX 10.0 INT 5 //先做一个数据的拷贝
OPN DB 10
LAR1 P#20.0
L 1
T #TEMP3
L 5
C001: T #LOOP3
L #TEMP3
T DBW [AR1,P#0.0]
L #TEMP3
+ 1
T #TEMP3
+AR1 P#2.0
L #LOOP3
LOOP C001 //循环写入1到5的序号
L 4
A003: T #LOOP1
LAR1 P#10.0
L 4
A002: T #LOOP2
L DBW [AR1,P#0.0]
L DBW [AR1,P#2.0]
>I
JCN A001
L DBW [AR1,P#0.0]
T #TEMP2
L DBW [AR1,P#2.0]
T DBW [AR1,P#0.0]
L #TEMP2
T DBW [AR1,P#2.0] //数据大小的排列
L DBW [AR1,P#10.0]
T #TEMP4
L DBW [AR1,P#12.0]
T DBW [AR1,P#10.0]
L #TEMP4
T DBW [AR1,P#12.0] //序号也要跟着走
A001: +AR1 P#2.0
L #LOOP2
LOOP A002
L #LOOP1
LOOP A003
首次回答问题,获得
双倍西币积分!
立即成为技术知识分享的一员!
找答案微信小程序
提问
搜索
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!