西门子300遍历DB的方法

各位大侠,求助啊。我现在有个需求不会实现。
具体是这样的,一个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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2018年12月2日 上午12:31
下一篇 2018年12月2日 上午12:32

相关推荐