Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 6 von 8 ErsteErste ... 45678 LetzteLetzte
Ergebnis 51 bis 60 von 72

Thema: Sortierbasutein mit Any Pointer

  1. #51
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich habe mein Programmbeispiel für die Sortierung der Datenblöcke mit Bubblesort noch einmal etwas überarbeitet.

    Hier ist eine leicht verbesserte Programmversion.

    Code:
    FUNCTION FC 100 : VOID
    TITLE =Bubblesort
    //14
    AUTHOR : KAI
    FAMILY : SPSFORUM
    NAME : BUBBLE
    VERSION : 1.0
     
    VAR_INPUT
      DB_NUMMER : INT ; 
      STARTADRESSE : INT ; 
      BLOCKGROESSE : INT ; 
      BLOCKANZAHL : INT ; 
    END_VAR
    VAR_TEMP
      DB_REGISTER : WORD ; 
      AR1_REGISTER : DWORD ; 
      DATENBLOCK_1 : ANY ; 
      DATENBLOCK_2 : ANY ; 
      SPEICHERBLOCK : ANY ; 
      DB_NUMMER_TEMP : WORD ; 
      BEREICHSZEIGER_1 : DWORD ; 
      BEREICHSZEIGER_2 : DWORD ; 
      OFFSET : DWORD ; 
      SCHLEIFE_1 : INT ; 
      SCHLEIFE_2 : INT ; 
      WERT_1 : INT ; 
      WERT_2 : INT ; 
      RETVAL : INT ; 
    END_VAR
    BEGIN
    NETWORK
    TITLE =Register sichern
     
          L     DBNO; // DB-Register
          T     #DB_REGISTER; 
     
          TAR1  #AR1_REGISTER; // AR1-Register
     
    NETWORK
    TITLE =Datenblock 1 (ANY)
     
          L     P##DATENBLOCK_1; // Datenblock 1 (ANY)
          LAR1  ; 
     
          L     B#16#10; // Syntax-ID
          T     B [AR1,P#0.0]; 
     
          L     2; // Datentyp
          T     B [AR1,P#1.0]; 
     
          L     #BLOCKGROESSE; // Anzahl
          T     W [AR1,P#2.0]; 
     
          L     #DB_NUMMER; // DB-Nummer
          T     W [AR1,P#4.0]; 
     
          L     #STARTADRESSE; // Bereichszeiger
          ITD   ; 
          SLD   3; 
          T     D [AR1,P#6.0]; 
     
          L     B#16#84; // Operandenbereich
          T     B [AR1,P#6.0]; 
     
    NETWORK
    TITLE =Datenblock 2 (ANY)
     
          L     P##DATENBLOCK_2; // Datenblock 2 (ANY)
          LAR1  ; 
     
          L     B#16#10; // Syntax-ID
          T     B [AR1,P#0.0]; 
     
          L     2; // Datentyp
          T     B [AR1,P#1.0]; 
     
          L     #BLOCKGROESSE; // Anzahl
          T     W [AR1,P#2.0]; 
     
          L     #DB_NUMMER; // DB-Nummer
          T     W [AR1,P#4.0]; 
     
          L     #STARTADRESSE; // Bereichszeiger
          L     #BLOCKGROESSE; 
          +I    ; 
          ITD   ; 
          SLD   3; 
          T     D [AR1,P#6.0]; 
     
          L     B#16#84; // Operandenbereich
          T     B [AR1,P#6.0]; 
     
    NETWORK
    TITLE =Speicherblock (ANY)
     
          L     P##SPEICHERBLOCK; // Speicherblock (ANY) 
          LAR1  ; 
     
          L     B#16#10; // Syntax-ID
          T     B [AR1,P#0.0]; 
     
          L     2; // Datentyp
          T     B [AR1,P#1.0]; 
     
          L     #BLOCKGROESSE; // Anzahl
          T     W [AR1,P#2.0]; 
     
          L     #DB_NUMMER; // DB-Nummer
          T     W [AR1,P#4.0]; 
     
          L     #BLOCKGROESSE; // Bereichszeiger
          L     #BLOCKANZAHL; 
          *I    ; 
          L     #STARTADRESSE; 
          +I    ; 
          ITD   ; 
          SLD   3; 
          T     D [AR1,P#6.0]; 
     
          L     B#16#84; // Operandenbereich
          T     B [AR1,P#6.0]; 
     
    NETWORK
    TITLE =Bubblesort 
     
          L     #DB_NUMMER; 
          T     #DB_NUMMER_TEMP; 
     
          AUF   DB [#DB_NUMMER_TEMP]; 
     
     
          L     P##DATENBLOCK_1; // Datenblock 1 (ANY)
          LAR1  ; 
     
          L     D [AR1,P#6.0]; // Bereichszeiger 1
          T     #BEREICHSZEIGER_1; 
     
     
          L     P##DATENBLOCK_2; // Datenblock 2 (ANY)
          LAR1  ; 
     
          L     D [AR1,P#6.0]; // Bereichszeiger 2
          T     #BEREICHSZEIGER_2; 
     
     
          L     #BLOCKGROESSE; // Offset
          ITD   ; 
          SLD   3; 
          T     #OFFSET; 
     
     
          L     #BLOCKANZAHL; 
          L     1; 
          -I    ; 
    M01:  T     #SCHLEIFE_1; 
     
     
          L     P##DATENBLOCK_1; // Datenblock 1 (ANY)
          LAR1  ; 
     
          L     #BEREICHSZEIGER_1; // Bereichszeiger 1
          T     D [AR1,P#6.0]; 
     
     
          L     P##DATENBLOCK_2; // Datenblock 2 (ANY)
          LAR1  ; 
     
          L     #BEREICHSZEIGER_2; // Bereichszeiger 2
          T     D [AR1,P#6.0]; 
     
     
          L     #SCHLEIFE_1; 
    M02:  T     #SCHLEIFE_2; 
     
     
          L     P##DATENBLOCK_1; // Datenblock 1 (ANY)
          LAR1  ; 
     
          L     D [AR1,P#6.0]; // Bereichszeiger
          LAR1  ; 
     
          L     B [AR1,P#0.0]; // Wert 1
          T     #WERT_1; 
     
     
          L     P##DATENBLOCK_2; // Datenblock 2 (ANY)
          LAR1  ; 
     
          L     D [AR1,P#6.0]; // Bereichszeiger
          LAR1  ; 
     
          L     B [AR1,P#0.0]; // Wert 2
          T     #WERT_2; 
     
     
          L     #WERT_2; // Wert 2
          L     #WERT_1; // Wert 1    
          >I    ; 
          SPBN  M03; 
     
    NETWORK
    TITLE =Bubblesort
     
          CALL SFC   20 (
               SRCBLK                   := #DATENBLOCK_1,
               RET_VAL                  := #RETVAL,
               DSTBLK                   := #SPEICHERBLOCK);
          NOP   0; 
     
    NETWORK
    TITLE =Bubblesort
     
          CALL SFC   20 (
               SRCBLK                   := #DATENBLOCK_2,
               RET_VAL                  := #RETVAL,
               DSTBLK                   := #DATENBLOCK_1);
          NOP   0; 
     
    NETWORK
    TITLE =Bubblesort
     
          CALL SFC   20 (
               SRCBLK                   := #SPEICHERBLOCK,
               RET_VAL                  := #RETVAL,
               DSTBLK                   := #DATENBLOCK_2);
          NOP   0; 
     
    NETWORK
    TITLE =Bubblesort 
     
    M03:  L     P##DATENBLOCK_1; // Datenblock 1 (ANY)
          LAR1  ; 
     
          L     D [AR1,P#6.0]; // Bereichszeiger
          L     #OFFSET; // Offset
          +D    ; 
          T     D [AR1,P#6.0]; 
     
     
          L     P##DATENBLOCK_2; // Datenblock 2 (ANY)
          LAR1  ; 
     
          L     D [AR1,P#6.0]; // Bereichszeiger
          L     #OFFSET; // Offset
          +D    ; 
          T     D [AR1,P#6.0]; 
     
     
          L     #SCHLEIFE_2; 
          LOOP  M02; 
     
          L     #SCHLEIFE_1; 
          LOOP  M01; 
     
    NETWORK
    TITLE =Register wiederherstellen
     
          AUF   DB [#DB_REGISTER]; // DB-Register
     
          LAR1  #AR1_REGISTER; // AR1-Register
     
    END_FUNCTION
    Gruß Kai
    Angehängte Dateien Angehängte Dateien

  2. Folgende 2 Benutzer sagen Danke zu Kai für den nützlichen Beitrag:

    SIGGI (21.02.2009),stevexxx (17.04.2008)

  3. #52
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.850
    Danke
    78
    Erhielt 800 Danke für 543 Beiträge

    Standard

    Zitat Zitat von Kai Beitrag anzeigen
    Meine Meinung zu dem Thema kannst Du hier nachlesen:
    ich kenne deine meinung dazu

    nichts desto trotz finde ich die nicht gut.
    aber das ist ansichtssache.
    ist aber auch nicht thema dieses threads.
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

  4. #53
    Registriert seit
    03.03.2008
    Beiträge
    40
    Danke
    9
    Erhielt 0 Danke für 0 Beiträge

    Standard

    nochmal danke fürs tolle Programm !

  5. #54
    Registriert seit
    22.02.2008
    Ort
    Mosel/Schwarzwald
    Beiträge
    25
    Danke
    7
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Bin beim stöbern auf die Sortierfunktion gestossen und hab ein wenig damit herumgespielt. Ich würde gern ca 50 -100 Datenblöcke, bestehend aus je 2 Dint-Werten sortieren. Das ist mir jedoch nicht gelungen, an welchen Stellen müsste ich hier drehen?
    Ich habe die beiden DB-s angepasst und die Paramerierung des FC-100eingestellt auf Blockgrösse 2 und Blockanzahl 10 für den Anfang.
    Was fehlt da noch?
    Zitieren Zitieren Sortieren auch für DINT-Werte?  

  6. #55
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.715
    Danke
    398
    Erhielt 2.398 Danke für 1.998 Beiträge

    Standard

    Hallo Rainer,
    die Blockgröße im obigen Fall ist in Byte angegeben. 1 DINT hat eine Größe von 4 Byte (bzw. 2 DINT dann sogar 8 Byte). Hast du das berücksichtigt ?
    Darüber hinaus kannst du DINT-Werte allerdings auch direkt vergleichen und sortieren (ohne dabei den Block-Move zum Einsatz zu bringen). Das erspart dir den Einsatz und das Aufbauen eines ANY-Pointers ...

    Wenn du Hlfe zu einem von dir verfassten Baustein haben möchtest, dann kann es oft auch ganz praktisch sein, den Baustein hier einzustellen ...

    Gruß
    LL

  7. #56
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    Zitat Zitat von RainerP Beitrag anzeigen
    Bin beim stöbern auf die Sortierfunktion gestossen und hab ein wenig damit herumgespielt. Ich würde gern ca 50 -100 Datenblöcke, bestehend aus je 2 Dint-Werten sortieren.
    Hier ist noch einmal ein neues Programmbeispiel für die Sortierung von Datenblöcken mit Bubblesort.

    Die Datenblöcke bestehen aus zwei Werten im Datenformat DINT und werden nach der Größe des ersten Wertes im Datenblock sortiert.

    Der Datenbaustein, die Startadresse sowie die Anzahl der Datenblöcke ist variabel.

    Code:
    FUNCTION FC 100 : VOID
    TITLE =Bubblesort
    AUTHOR : KAI
    FAMILY : SPSFORUM
    NAME : BUBBLE
    VERSION : 1.0
     
    VAR_INPUT
      DATENBAUSTEIN : BLOCK_DB ; 
      STARTADRESSE : INT ; 
      BLOCKANZAHL : INT ; 
    END_VAR
    VAR_TEMP
      DB_REGISTER : WORD ; 
      AR1_REGISTER : DWORD ; 
      BEREICHSZEIGER : DWORD ; 
      SCHLEIFE_1 : INT ; 
      SCHLEIFE_2 : INT ; 
    END_VAR
    BEGIN
    NETWORK
    TITLE =Register sichern
     
          L     DBNO; // DB-Register
          T     #DB_REGISTER; 
     
          TAR1  #AR1_REGISTER; // AR1-Register
     
    NETWORK
    TITLE =Bubblesort
     
          AUF   #DATENBAUSTEIN; // Datenbaustein
     
          L     #STARTADRESSE; // Startadresse
          ITD   ; 
          SLD   3; 
          T     #BEREICHSZEIGER; // Bereichszeiger
     
          L     #BLOCKANZAHL; // Blockanzahl
          L     1; 
          -I    ; 
    M01:  T     #SCHLEIFE_1; 
     
          L     #BEREICHSZEIGER; // Bereichszeiger
          LAR1  ; 
     
          L     #SCHLEIFE_1; 
    M02:  T     #SCHLEIFE_2; 
     
          L     DBD [AR1,P#8.0]; // Wert 2-1
          L     DBD [AR1,P#0.0]; // Wert 1-1
          >D    ; 
          SPBN  M03; 
     
          L     DBD [AR1,P#0.0]; // Wert 1-1
          L     DBD [AR1,P#8.0]; // Wert 2-1
          T     DBD [AR1,P#0.0]; // Wert 2-1 => Wert 1-1
          TAK   ; 
          T     DBD [AR1,P#8.0]; // Wert 1-1 => Wert 2-1
     
          L     DBD [AR1,P#4.0]; // Wert 1-2
          L     DBD [AR1,P#12.0]; // Wert 2-2
          T     DBD [AR1,P#4.0]; // Wert 2-2 => Wert 1-2
          TAK   ; 
          T     DBD [AR1,P#12.0]; // Wert 1-2 => Wert 2-2
     
    M03:  L     P#8.0; 
          +AR1  ; 
     
          L     #SCHLEIFE_2; 
          LOOP  M02; 
     
          L     #SCHLEIFE_1; 
          LOOP  M01; 
     
    NETWORK
    TITLE =Register wiederherstellen
     
          AUF   DB [#DB_REGISTER]; 
     
          LAR1  #AR1_REGISTER; 
     
    END_FUNCTION
    Gruß Kai
    Angehängte Dateien Angehängte Dateien

  8. Folgender Benutzer sagt Danke zu Kai für den nützlichen Beitrag:

    epy (26.10.2009)

  9. #57
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    Und noch eine Bild aus der Simulation mit PLCSIM.

    Gruß Kai
    Angehängte Grafiken Angehängte Grafiken
    • Dateityp: jpg VAT.jpg (388,5 KB, 37x aufgerufen)

  10. #58
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard

    Bubblesort benötigt zum Sortieren einer Datenfolge der Länge n folgende Anzahl von Vergleichen:

    Code:
     
                                               n * (n - 1)
    Vergleiche = (n - 1) + (n - 2) + ... + 1 = -----------
                                                    2
    Bei einer Datenfolge von n = 100 Datenblöcken benötigt Bubblesort also die folgende Anzahl von Durchläufen und Vergleichen:

    Code:
     
    Durchläufe = (n - 1) = (100 - 1) = 99
    Code:
     
                 n * (n - 1)   100 * (100 - 1)
    Vergleiche = ----------- = --------------- = 4950
                      2               2
    Gruß Kai

  11. Folgender Benutzer sagt Danke zu Kai für den nützlichen Beitrag:

    RainerP (16.11.2008)

  12. #59
    Registriert seit
    22.02.2008
    Ort
    Mosel/Schwarzwald
    Beiträge
    25
    Danke
    7
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Danke, so funktioniert auch mein Beispiel. Bin zwar noch nicht wirklich dahintergestiegen warum... Wird aber noch.
    Allerdings hab ich die Funktion aus den PDFs entnommen, in der Zip-Datei ist ein anderer Baustein.
    Die Zeit ist hier nicht wirklich relevant, es wird durch das Sortieren wesentlich mehr Zeit eingespart als verbraucht.
    Zitieren Zitieren Danke, so gehts!  

  13. #60
    Registriert seit
    30.03.2005
    Beiträge
    2.096
    Danke
    0
    Erhielt 673 Danke für 541 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von RainerP Beitrag anzeigen
    Allerdings hab ich die Funktion aus den PDFs entnommen, in der Zip-Datei ist ein anderer Baustein.
    Das verstehe ich jetzt nicht.

    Ich habe gerade noch einmal die ZIP-Datei kontrolliert und die STEP 7 Bausteine stimmen mit den PDF-Files überein.

    http://www.sps-forum.de/showpost.php...5&postcount=56

    Gruß Kai

Ähnliche Themen

  1. Pointer
    Von OB1 im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 20.02.2009, 17:52
  2. Pointer, was ist das?
    Von mendelfranz im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 14.01.2009, 14:26
  3. DB und Pointer
    Von PhilippL im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 12.09.2007, 07:02
  4. Pointer in SCL
    Von broesel im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 16.05.2007, 11:32
  5. db und pointer
    Von fbeine im Forum Simatic
    Antworten: 26
    Letzter Beitrag: 13.03.2006, 10:02

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •