各位大侠,求助啊。我现在有个需求不会实现。
具体是这样的,一个DB块,里面有36个Int型变量,每个变量都被打乱顺序的赋予1-36的数值,没有重复。我要做的是把DB中的每个变量取出来和1比较,如果相同,那么输出动作然后跳出循环,如果不同,则比较下一个变量是否值为1,以此类推,那么最多就需要比较36次。
第二遍则是把DB中的36个变量分别和数字2比较,如果等于2,则跳出循环,如果不是2,则比较第2个变量,以此类推。最多就需要比较36次。
最后一遍是找出DB中值为36的那个变量。
综上,比较的次数在36*36以内。麻烦各位给出算法,和变量类型,最好贴上代码(STL代码我是一点不会)万分感激
问题补充:
1.关于‘liujian1121’的回答,放到数组里没问题啊,但还是需要遍历的。
2.回答‘zhangli0’,关于我的需求的意义。简单介绍,我这里有36个阀门,可以通过HMI手动选择36个阀门的启动顺序,我首先根据用户的点击顺序把1-36的数值写入DB块中,然后我需要遍历该DB块,按数值大小1-36的顺序把DB中的变量排序。最终目的就是使实际阀门启动顺序和用户手动点击的顺序一致。
3.我按VB或C语言很容易就写出来了,而在step7中则困难重重,举步维艰啊!数组,元素,便利,数据传入传出则一概不通。下面我把我的程序写出来
4. For I=1 to 36;
For J=1 to 36
If a(J)=I,Then b(J)=True and break;
J=J+1;
Next
I=I+1;
Next
注:J是DB中的编号,I是需比较的数值,b(J)则是定位输出相应的阀门了。不知大家是否能理解?
最佳答案
你比较等于2~等于36的结果怎么做呢?也是输出一个动作?还是输出同一个动作?那么你这个程序的意义是什么呢?用指针加循环,一个扫描周期就解决了,那么你能看出来什么呢?把你的这个比较的意义说清楚再说怎么做程序吧!
TAR1 #temp_ar1
TAR2 #temp_ar2
L P##db_no
LAR1
L W [AR1,P#0.0]
T #DB_ID
OPN DB [#DB_ID]
////////////////////////////////
L 36
_0a1: T #jishu
LAR1 P#0.0
TAR1 #ar1data1
L 1
T #cycle_count
_0a2: L #jishu
L DBW [#ar1data1]
==I
JC end
LAR1 #ar1data1
+AR1 P#2.0
TAR1 #ar1data1
L 1
L #cycle_count
+I
T #cycle_count
L 36
>I
JC _0a3
LOOP _0a2
_0a3: L #jishu
LOOP _0a1
JU end1
///////////////////////////
end: S #out1
end1: NOP 0
//////////////////////////
SET
SAVE
BEU
我的这个是先比较等36然后比较等于35,然后比较等于34..........最后比较等于1,只要比较36*36次有相等的就输出一个bool量。不过你的输入输入方式肯定造成我的这个程序输出为1,不知道你要这样的程序干什么。
提问者对于答案的评价:
谢谢两位,在我另一个提问中找到了满意的思路--“求根据HMI选择顺序来输出的程序编写思路”
原创文章,作者:more0621,如若转载,请注明出处:https://www.zhaoplc.com/plc246176.html