• «
  • 1
  • 2
  • »
  • Pages: 1/2     Go
zlf60137
danpianji3501
级别: 略有小成
精华主题: 0
发帖数量: 103 个
工控威望: 234 点
下载积分: 1114 分
在线时间: 38(小时)
注册时间: 2016-09-22
最后登录: 2024-10-27
查看zlf60137的 主题 / 回贴
楼主  发表于: 2017-10-28 15:09
不知道你的排序是要求全部排出来还是仅仅要求出最大值或者最小值?因为现实中的应用大部分是要求出最大值或者最小值的。
  如果仅仅是求出最大值或者最小值请参考:
  1,要排序的数据为DB10的DBW0...DBW18(10个字)
  2,MD100为指针地址,MW104为最终结果,MW106为临时计数地址。
  3,求最小值时稍微改一下就可以了。
        OPN   DB    10
        L     L#16
        T     MD   100
        L     DBW    0
        T     MW   104                    //最大值将被存储在这个地址
        L     0
        T     MW   106                    //计数地址
  _00:  L     MW   104
        L     DBW [MD 100]
        >=I  
        JC    _01
        T     MW   104
  _01:  L     MD   100
        +     L#16
        T     MD   100
        L     MW   106
        +     1
        T     MW   106
        L     9
        <I    
        JC    _00

回答者:  金牌用户 冬日 - 毕业实践员  第4级  2009-05-12 09:32:00
收藏6      1 评论 精探推荐
提问者对于答案的评价:
感谢,不过这程序使我进一步的了解了LOOP的用法
同时感谢依然,SCL不想看了,STL都还不熟练,我再开个贴,麻烦你路过下,感谢80分
已有3人评论 展开
7yu: 解决了,再次感谢
zlf60137
danpianji3501
级别: 略有小成
精华主题: 0
发帖数量: 103 个
工控威望: 234 点
下载积分: 1114 分
在线时间: 38(小时)
注册时间: 2016-09-22
最后登录: 2024-10-27
查看zlf60137的 主题 / 回贴
1楼  发表于: 2017-10-28 15:11
关于排序的算法,你可以参考一下数据库的知识,里面有多种排序方法,不过像你所说就10个数据从小到大排序,就可以用较简单的一种“两两比较法”,如东方巨龙所言;
  关于“声明一个可以盛下10个数据的数组变量”:
  首先建立一个数据块,如DB1,在ADDRESS0.0 中定义NAME,比如TEST;在ADDRESS0.0 中定义TYPE,比如ARRAY[1..10];在INITIAL VALUE中输入初始值,或空白(缺省值);回车,在*2.0 TYPE中输入变量类型,比如INT,就完成了。此时你可以通过VIEW/DATA VIEW查看到这10个INT变量。
补充:也不是很难写,常用的如梯形图看起来很直观,适合编写数字量逻辑程序,语句表有点类似汇编,数据处理还可以,当然没有C语言高级,他也提供了一些其它的编程语言,比如GRAPH,适合顺控程序,比如机械手应用,还有SCL结构化编程语言,就是C语言的语法格式,但也不能将C语言直接导入。你可以使用一下,不过需要授权。
zlf60137
danpianji3501
级别: 略有小成
精华主题: 0
发帖数量: 103 个
工控威望: 234 点
下载积分: 1114 分
在线时间: 38(小时)
注册时间: 2016-09-22
最后登录: 2024-10-27
查看zlf60137的 主题 / 回贴
2楼  发表于: 2017-10-28 15:16
一个子程序,你看一下
LD0   表头地址
L4.0    排序模式:true=升序,false=降序
其它为TEMP 变量

Network 1
//  表为空或只有一个数据时不用排序
LD     SM0.0
+D     2, LD0
AW<=   *LD0, 1
CRET
Network 2
//  初始化循环次数、表头指针指向第一个元素
LD     SM0.0
MOVW   *LD0, LW7
MOVW   LW7, LW5
DECW   LW5

Network 3 //  外循环
LD     SM0.0
FOR    LW9, 1, LW5
MOVW   LW9, LW21
INCW   LW21
Network 4 //  内循环
LD     SM0.0
FOR    LW11, LW21, LW7
Network 5
//  指针指向待比较的两个数据项
LD     SM0.0
MOVW   LW9, LW21
SLW    LW21, 1
ITD    LW21, LD13
+D     LD0, LD13
MOVW   LW11, LW21
SLW    LW21, 1
ITD    LW21, LD17
+D     LD0, LD17
Network 6 //  比较
//  生成交换标志
LDW>   *LD13, *LD17
A      L4.0
LDW<   *LD13, *LD17
AN     L4.0
OLD
=      L23.0
Network 7 //  交换数据
LD     L23.0
MOVW   *LD13, LW21
MOVW   *LD17, *LD13
MOVW   LW21, *LD17
Network 8
NEXT
Network 9
NEXT
zlf60137
danpianji3501
级别: 略有小成
精华主题: 0
发帖数量: 103 个
工控威望: 234 点
下载积分: 1114 分
在线时间: 38(小时)
注册时间: 2016-09-22
最后登录: 2024-10-27
查看zlf60137的 主题 / 回贴
3楼  发表于: 2017-10-28 15:17
数据排序 - 已解决问题
我的数据存在VW4500开始的每隔一个位的存储器内,即VW4500,VW4502,VW4504,...VW4546,总共有24个,希望实现从小到大排序,即最大的数放在VW4546内。尝试用FOR循环来实现,望指点迷津
问题补充:
希望通过使用for循环来实现冒泡法了解指针的运用,如果有的话请给我发一份,如果没有的话给我一份关于指针的介绍,及注意事项,谢谢。我的邮箱jgsong21st@163.com
产品版区:SIMATIC S7-200 悬赏分:10 | 解决时间:2009-09-23 08:56:08 | 提问者: 花样少年 - 毕业实践员  第4级

问题ID:42036

最佳答案
去看下最简单的冒泡法,自己做才是真道理
  //Main主程序 对5个数进行排序从VW4500至Vw4508进行排序,任意多个数可以在SM0.1中初始化;
  Network1
  LD     SM0.1
  MOVW   1, VW2000
  MOVW   1, VW1000
  MOVD   &VB4498, VD3000
  MOVW   700, VW4500
  MOVW   210, VW4502
  MOVW   110, VW4504
  MOVW   510, VW4506
  MOVW   5110, VW4508
  MOVW   1, VW600
  Network2
  LD     M1.0
  CALL   S0:SBR0
  
  //SO:SBR0子程序,采用内外两个For循环及VD1118与VD1008双指针进行排序操作
  Network1
  LD     M1.0
  FOR    VW2000, VW600, 4
  Network2
  LD     M1.0
  FOR    VW1000, VW2000, 3
  Network3
  LD     M1.0
  LPS
  MOVW   VW1000, VW1002
  AENO
  *I     +2, VW1002
  AENO
  ITD    VW1002, VD1004
  LPP
  MOVD   VD1004, VD1114
  +D     +2, VD1114
  Network4
  LD     M1.0
  MOVD   VD3000, VD1008
  +D     VD1004, VD1008
  MOVD   VD3000, VD1118
  +D     VD1114, VD1118
  Network5
  LD     M1.0
  MOVW   *VD1008, VW3500
  MOVW   *VD1118, VW3502
  Network6
  LD     M1.0
  AW>    VW3500, VW3502
  MOVW   *VD1008, VW3004
  MOVW   *VD1118, *VD1008
  MOVW   VW3004, *VD1118
  Network7
  NEXT
  Network8
  NEXT
  【PLC:S7 200 226 调试通过可以直接测试】
回答者: S7-200 / Net - 高级技术员  第7级  2009-09-22 11:19:41
收藏7      4 评论 精探推荐
提问者对于答案的评价:
非常感谢,我已经调试通过了,同时对指针也有了了解,以后多多练习,不断提高自己
zlf60137
danpianji3501
级别: 略有小成
精华主题: 0
发帖数量: 103 个
工控威望: 234 点
下载积分: 1114 分
在线时间: 38(小时)
注册时间: 2016-09-22
最后登录: 2024-10-27
查看zlf60137的 主题 / 回贴
4楼  发表于: 2017-10-28 15:21
刚接触PLC不久,不知道怎么将4台电机的运行时间按照从小到大排序,求帮助!
zlf60137
danpianji3501
级别: 略有小成
精华主题: 0
发帖数量: 103 个
工控威望: 234 点
下载积分: 1114 分
在线时间: 38(小时)
注册时间: 2016-09-22
最后登录: 2024-10-27
查看zlf60137的 主题 / 回贴
5楼  发表于: 2017-10-28 15:25
1、冒泡程序一般起什么作用?
就是一个排序程序,从大到小排序。冒泡指将大数浮出来,即冒泡。
2、S7-200冒泡:
冒泡程序流程图及程序,连接:
http://wenku.baidu.com/link?url=2ajv0YMolpZb2IHPWuF4Mv-SN919ANJdp6BfyU8Due9dqeP1d8mxLIyouJWDGfkAJOXDvEyhsSQCVZ3w6T0dE21zWRsqNOqRGQuHhhBtjaK
3、S7-300冒泡:
转帖:
假定十个数据,放在DB1中,安放顺序如下:
DBD0
DBD4

DBD36
下面是西门子的程序
OPN   DB    1                 /////打开DB1这个数据块
      L     10  ////装载10到MB0中,因为有十个数据,要进行十次排序,9次也可以的
LL0:  T     MB    0
      L     P#0.0   ////装载地址指针,这是关键,不要搞错了
      LAR1  
      L     9
LL1:  T     MB    2   ////内部循环,进行9次,直到把最大值排到最后
      L     DBD [AR1,P#0.0]
      L     DBD [AR1,P#4.0]
      <R    
      JC    LL2          ////比较前后两个值,如果前面大于后面的,则前后数据交换
      L     DBD [AR1,P#0.0]
      T     #m_temp
      L     DBD [AR1,P#4.0]
      T     DBD [AR1,P#0.0]
      L     #m_temp
      T     DBD [AR1,P#4.0]
LL2:  +AR1  P#4.0     ////指针自动进行加4,因为是浮点数,所以要跳过4个字节
      L     MB    2
      LOOP  LL1       ///这个指令自动的将A寄存器里的值减1
      L     MB    0
LOOP  LL0
                                                                                                                
zlf60137
danpianji3501
级别: 略有小成
精华主题: 0
发帖数量: 103 个
工控威望: 234 点
下载积分: 1114 分
在线时间: 38(小时)
注册时间: 2016-09-22
最后登录: 2024-10-27
查看zlf60137的 主题 / 回贴
6楼  发表于: 2017-10-28 15:26
冒泡排序法实际就是升序法,小的在前面大的在后面。
参考:http://wenda.so.com/q/1367603117067162?src=170
编程就按照参考中思路两两比较遍历整个数据序列。
                                                                                                                                                                                                                                                                                                                                  
                                                                                                                                                                                                            转载:
300:
实现冒泡(数值大的在前)排序法:
假定十个数据,放在DB1中,安放顺序如下:
DBD0
DBD4

DBD36
下面是西门子的程序
OPN   DB    1                 /////打开DB1这个数据块
      L     10  ////装载10到MB0中,因为有十个数据,要进行十次排序,9次也可以的
LL0:    T     MB    0
           L     P#0.0   ////装载地址指针,这是关键,不要搞错了
      LAR1  
           L     9
LL1:   T     MB    2   ////内部循环,进行9次,直到把最大值排到最后
      L     DBD [AR1,P#0.0]
          L     DBD [AR1,P#4.0]
          <R    
          JC    LL2          ////比较前后两个值,如果前面大于后面的,则前后数据交换
      L     DBD [AR1,P#0.0]
           T     #m_temp
           L     DBD [AR1,P#4.0]
           T     DBD [AR1,P#0.0]
           L     #m_temp
           T     DBD [AR1,P#4.0]
LL2:  +AR1  P#4.0     ////指针自动进行加4,因为是浮点数,所以要跳过4个字节
      L     MB    2
           LOOP  LL1       ///这个指令自动的将A寄存器里的值减1
            L     MB    0
LOOP  LL0
200:下载链接:http://wenku.baidu.com/link?url=efyos3PLg3MgU51BofWBNDbBQCPAmrEjIs73ZhXWhEgPPxqBzONyODzbdMXNI0Z0Qge14QQ2sPfh_exEDj_1-NdkHmgkr2c8sqH9bpB9pVO
zlf60137
danpianji3501
级别: 略有小成
精华主题: 0
发帖数量: 103 个
工控威望: 234 点
下载积分: 1114 分
在线时间: 38(小时)
注册时间: 2016-09-22
最后登录: 2024-10-27
查看zlf60137的 主题 / 回贴
7楼  发表于: 2017-10-28 15:38
zlf60137
danpianji3501
级别: 略有小成
精华主题: 0
发帖数量: 103 个
工控威望: 234 点
下载积分: 1114 分
在线时间: 38(小时)
注册时间: 2016-09-22
最后登录: 2024-10-27
查看zlf60137的 主题 / 回贴
8楼  发表于: 2017-10-28 15:39
排序这个老大难问题,我懂了 ,你呢?
zlf60137
danpianji3501
级别: 略有小成
精华主题: 0
发帖数量: 103 个
工控威望: 234 点
下载积分: 1114 分
在线时间: 38(小时)
注册时间: 2016-09-22
最后登录: 2024-10-27
查看zlf60137的 主题 / 回贴
9楼  发表于: 2017-10-28 15:42
4台泵按运行时间从小到大,将对应寄存器号进行排序(不对运行时间排序)
http://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=980404&b_id=3&s_id=0&num=27#anch
zlf60137
danpianji3501
级别: 略有小成
精华主题: 0
发帖数量: 103 个
工控威望: 234 点
下载积分: 1114 分
在线时间: 38(小时)
注册时间: 2016-09-22
最后登录: 2024-10-27
查看zlf60137的 主题 / 回贴
11楼  发表于: 2017-10-28 15:51
  • «
  • 1
  • 2
  • »
  • Pages: 1/2     Go