回复:【分享】冒泡法排序(升、降序排列可选)DB块中数组内字节元素

'Razor

西门子1847工业学习平台

  • 帖子

    3561
  • 精华

    46
  • 被关注

    235

论坛等级:至圣

注册时间:2008-03-31

钻石 钻石 如何晋级?

发布于 2016-01-12 00:10:43

1楼

源文件如下:(更改基于“条目号865058 Sample program for sorting a data block”源文件 )

敬请斧正!


FUNCTION "BubbleSortArray'sBYTEs" : VOID

TITLE =BubbleSortArray'sBytesInDB

//冒泡排序法:升序或者降序排列数据块中数组包含的字节元素

VERSION : 0.1



VAR_INPUT

  Data_DB : BLOCK_DB ;

  begin_addr : INT ; //begin address of array in DB

  end_addr : INT ; //end address of array in DB

  Up_or_Down : BOOL ; //ascending order(0) / descending order(1)

END_VAR

VAR_OUTPUT

  err_word : WORD ;

  err : BOOL ;

END_VAR

VAR_TEMP

  Sort_done : BOOL ;

  Temp : BYTE ;

  Count : WORD ;

  offset : DWORD ;

  length : INT ;

END_VAR

BEGIN

NETWORK

TITLE =Sort a ARRAY in Data Block using the bubble sort method

//ARRAY in DB will be sorted in ascending order( Up_Down == FALSE ),

//ARRAY in DB will be sorted in descending order( Up_Down == TRUE ).

//

      OPN   #Data_DB; //Open Data Block

M001: L     P#DBX 0.0; //start address in DB

      LAR1  ; 


      SET   ; 

      L     #end_addr; //if (end_addr <= begin_addr)

      L     #begin_addr; 

      <=I   ; 

      JC    M004; //set faults outputs


      L     #end_addr; //calculate actual length of array

      L     #begin_addr; 

      -I    ; 

      T     #length; 

      L     #length; 

      L     W#16#1; 

      +I    ; 

      T     #length; 


      L     #begin_addr; 

      SLD   3; 

      T     #offset; 

      +AR1  ; //add offset to AR1


      SET   ; //LET #Sort_done = TRUE

      S     #Sort_done; 

      L     #length; 

      L     1; 

      -I    ; 

Loop: T     #Count; //FOR INDEX = Count TO length

      SET   ; 

      A     #Up_or_Down; //descending order

      JC    M002; 


      L     B [AR1,P#0.0]; //IF M(INDEX) > M(INDEX+1) THEN

      L     B [AR1,P#1.0]; 

      <=I   ; 

      JC    M003; 

// change M(INDEX+1) for  M(INDEX)

      L     B [AR1,P#0.0]; //LET TEMP = M(INDEX)

      T     #Temp; 

      L     B [AR1,P#1.0]; //LET M(INDEX) = M(INDEX+1)

      T     B [AR1,P#0.0]; 

      L     #Temp; //LET M(INDEX+1) = TEMP

      T     B [AR1,P#1.0]; 

      SET   ; 

      R     #Sort_done; //LET #Sort_done = FALSE

      JU    M003; 


M002: L     B [AR1,P#0.0]; //IF M(INDEX) < M(INDEX+1) THEN

      L     B [AR1,P#1.0]; 

      >=I   ; 

      JC    M003; 


// change M(INDEX+1) for  M(INDEX)

      L     B [AR1,P#0.0]; //LET TEMP = M(INDEX)

      T     #Temp; 

      L     B [AR1,P#1.0]; //LET M(INDEX) = M(INDEX+1)

      T     B [AR1,P#0.0]; 

      L     #Temp; //LET M(INDEX+1) = TEMP

      T     B [AR1,P#1.0]; 

      SET   ; 

      R     #Sort_done; //LET #Sort_done = FALSE

M003: TAR1  ; 

      L     8; //NEXT INDEX

      +D    ; 

      LAR1  ; 

      L     #Count; 

      LOOP  Loop; //End of sorting pass

      AN    #Sort_done; //If sorting is not done

      JC    M001; //Jump Conditionally to M002

      R     #err; 

      L     #err_word; 

      L     W#16#0; 

      AW    ; 

      T     #err_word; 

      SET   ; 

      SAVE  ; 

      BE    ; 

M004: SET   ; //out err

      =     #err; 

      L     W#16#1; 

      T     #err_word; 

      BE    ; 


END_FUNCTION




少即是多
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-300/400

共有54778条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
X 图片
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。