DB Bubble Sort

TheBigMemph

Level-1
Beiträge
9
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Also, ich habe einen Datenbaustein in den ich Werte von 1 bis 3 speichere ...
Nun will ich diese abhängig von einem Eingang aufsteigend oder absteigend sortieren...

Code:
ORGANIZATION_BLOCK OB 1
TITLE = "Main Program Sweep (Cycle)"
VERSION : 0.1


VAR_TEMP
  OB1_EV_CLASS : BYTE ;    //Bits 0-3 = 1 (Coming event), Bits 4-7 = 1 (Event class 1)
  OB1_SCAN_1 : BYTE ;    //1 (Cold restart scan 1 of OB 1), 3 (Scan 2-n of OB 1)
  OB1_PRIORITY : BYTE ;    //Priority of OB Execution
  OB1_OB_NUMBR : BYTE ;    //1 (Organization block 1, OB1)
  OB1_RESERVED_1 : BYTE ;    //Reserved for system
  OB1_RESERVED_2 : BYTE ;    //Reserved for system
  OB1_PREV_CYCLE : INT ;    //Cycle time of previous OB1 scan (milliseconds)
  OB1_MIN_CYCLE : INT ;    //Minimum cycle time of OB1 (milliseconds)
  OB1_MAX_CYCLE : INT ;    //Maximum cycle time of OB1 (milliseconds)
  OB1_DATE_TIME : DATE_AND_TIME ;    //Date and time OB1 started
END_VAR
BEGIN
NETWORK
TITLE =


      CALL FC   1 (
           Data_DB          :=DB 1,
           DB_length        :=W#16#A) ;
           
NETWORK
TITLE =

      AUF   DB     1; 

NETWORK
TITLE =

      U(    ; 
      O     E      0.0; 
      O     E      0.1; 
      O     E      0.2; 
      )     ; 
      ZV    Z      0; 
      U(    ; 
      O     E      1.0; 
      O     E      1.1; 
      O     E      1.2; 
      )     ; 
      U     E      2.0; 
      ZR    Z      0; 
      NOP   0; 
      NOP   0; 
      U(    ; 
      L     DBW    0; 
      L     0; 
      ==I   ; 
      )     ; 




      R     Z      0; 
      NOP   0; 
      LC    Z      0; 
      T     MW    10; 
      NOP   0; 
NETWORK
TITLE =


      U     E      0.0; 
      SPBNB _001; 
      L     1; 
      T     MW    30; 
_001: NOP   0; 
NETWORK
TITLE =



      U     E      0.1; 
      SPBNB _002; 
      L     2; 
      T     MW    30; 
_002: NOP   0; 
NETWORK
TITLE =



      U     E      0.2; 
      SPBNB _003; 
      L     3; 
      T     MW    30; 
_003: NOP   0; 
NETWORK
TITLE =







      U(    ; 
      O     E      0.0; 
      O     E      0.1; 
      O     E      0.2; 
      )     ; 
      SPBNB _010; 
      CALL FC     2 ;
_010: NOP   0; 
NETWORK
TITLE =

      U(    ; 
      O     E      1.0; 
      O     E      1.1; 
      O     E      1.2; 
      )     ; 
      U     E      2.0; 
      FP    M    220.1; 
      SPBN  M001; 

      CALL "BLKMOV" (
           SRCBLK                   := P#DBX 2.0 BYTE 100,
           RET_VAL                  := MW   110,
           DSTBLK                   := P#DBX 0.0 BYTE 100);

M001: NOP   0; 
NETWORK
TITLE =



END_ORGANIZATION_BLOCK

Nun habe ich einen DB Bubble Sort Baustein der wie folgt aussieht :

Code:
FUNCTION FC 1 : VOID
TITLE =
VERSION : 0.1


VAR_INPUT
  Data_DB : BLOCK_DB ;  
  DB_length : WORD ;    
END_VAR
VAR_TEMP
  Sort_done : BOOL ;    
  Temp : WORD ; 
  Count : WORD ;    
END_VAR
BEGIN
NETWORK
TITLE =Sort a Data Block using the bubble sort method
//Data Block will be sorted in ascending order.
//
      AUF   #Data_DB; //Open Data Block
M002: LAR1  P#DBX 0.0; 
      SET   ; //LET #Sort_done = TRUE
      S     #Sort_done; 
      L     #DB_length; 
      L     1; 
      -I    ; 
Loop: T     #Count; //FOR INDEX = Count TO DB_length
      L     W [AR1,P#0.0]; //IF M(INDEX) > M(INDEX+1) THEN
      L     W [AR1,P#2.0]; 
      <=I   ; 
      SPB   M003; 
// change M(INDEX+1) for  M(INDEX)
      L     W [AR1,P#0.0]; //LET TEMP = M(INDEX)
      T     #Temp; 
      L     W [AR1,P#2.0]; //LET M(INDEX) = M(INDEX+1)
      T     W [AR1,P#0.0]; 
      L     #Temp; //LET M(INDEX+1) = TEMP
      T     W [AR1,P#2.0]; 
      SET   ; 
      R     #Sort_done; //LET #Sort_done = FALSE
M003: TAR1  ; 
      L     16; //NEXT INDEX
      +D    ; 
      LAR1  ; 
      L     #Count; 
      LOOP  Loop; //End of sorting pass
      UN    #Sort_done; //If sorting is not done
      SPB   M002; //Jump Conditionally to M002
      BE    ; 


END_FUNCTION

Jetzt habe ich das Problem, dass das zweite Wort im DB immer bestehen bleibt ... bekomm ich nicht mehr zu einer Null ...
Und beim speichern der ersten Zahl schreibt er sie mir direkt in Wort 1 und 2 ...
Ich bin verzweifelt .... :-(
 
Also, ich habe einen Datenbaustein in den ich Werte von 1 bis 3 speichere ...
Wenn es nur drei Werte sind, brauchst du keine Schleife und keine Pointer, das kannst du auch zu Fuß machen:
Code:
L DBW 1
L DBW 2
>I
SBP OK1 //nicht tauschen
T DBW1 
TAK 
T DBW2
OK1:NOP 0

L DBW 2
L DBW 3
>I
SBP OK2 //nicht tauschen
T DBW2 
TAK 
T DBW3
OK2:NOP 0

L DBW 1
L DBW 2
>I
SBP OK3 //nicht tauschen
T DBW1 
TAK 
T DBW2
OK3:NOP 0
Nun will ich diese abhängig von einem Eingang aufsteigend oder absteigend sortieren...
Das mit dem Eingang hatte ich überlesen. Einfach bei Bedarf den Vergleich invertieren:
Code:
L DBW 1
L DBW 2
>I
X E0.0
SBP OK1 //nicht tauschen
...

Ich bin verzweifelt .... :-(
Ansonsten benutzer mal die Suchfunktion. Irgendwann habe ich schon mal Code für Bublesort gepostet.
 
Zurück
Oben