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

Seite 5 von 8 ErsteErste ... 34567 ... LetzteLetzte
Ergebnis 41 bis 50 von 72

Thema: Sortierbasutein mit Any Pointer

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

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    der speicher is besipielsweise 10 byte groß und dieser speicher wird besipielsweise in 5 Blöcke a 2 byte eingeteilt der rest stimmt was du erzählt hast...


    das mitn zwischenspeichern ist ja in meinem programm schon realisiert nur bekomm ich dauern einen Bereichslängenfehler beim lesen beim 2 durchgang... erste tauschdurchgang klappt ja noch


    vl siehst du dir ja mal kurz meinen code an lg stefan

  2. #42
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.709
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    Ich habe mir den Code schon angesehen und bin da auf den ersten Blick nicht durchgestiegen. Liegt aber vielleicht auch daran, dass ich meinen Schädel in Augenblick auch mit eine Menge anderem Zeug voll habe ...

    Aber grundsätzlich (wie wir das weiter vorne schon behandelt haben) :
    Das Arbeiten mit ANY-Pointern und dem FC "Block-Move" macht nur dann Sinn, wenn es sich dabei um große Datenblöcke handelt. 2 bis 4 Byte sind in diesem Sinne kein großer Datenblock. Dein Programm benötigt hier mehr Zeit zum Erstellen und Zerlegen des ANY-Pointers als für den eigentlichen Lade-Transfer-Vorgang. Ich verstehe also nicht, warum du wieder dazu übergehst ...

    Weiterhin : Was ist der Inhalt von "#iBlockgroesse" ?

    Vielleicht solltest du dein diesbezügliches Konzept noch einmal überdenken ..

    Gruß
    LL

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

    Standard

    #iBlockgroesse = die Anzahl der Bytes pro Block

    im meinem Bsb ist die Blockgroesse 2 >>> sprich der Block besteht aus 2 Byte.
    Der Speicher welcher in meinem Beispiel 10 Byte groß ist wird also in 5 Blöcke a 2 Byte eingeteilt. Da mein Programm variabel gestaltet werden soll muss ich Blockmove verwenden da auch größere Blöcke verschoben werden sollen.
    Beim sortieren der Blöcke in meinem DB schau ich mir immer nur das erste Byte im Block an und tausche anhand der größe (Wert) die einzelnen Blocke miteinander bis sie der Größe nach sortiert sind. (Bubblesort)


    lg stefan

  4. #44
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.709
    Danke
    398
    Erhielt 2.397 Danke für 1.997 Beiträge

    Standard

    ... dann schreib doch noch mal, was du in "iStartAdresse" als Werte stehen hast ...
    Bitte bedenken, so, wie du ihn einsetzt, muss dort ein Pointerwert drin stehen ... Falls nicht, dann ist das der Fehler ...

    Gruß
    LL

  5. #45
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.849
    Danke
    78
    Erhielt 800 Danke für 543 Beiträge

    Standard

    irgendwie find ich den code total wirr. hab auch keine lust mir da jetzt lange gedanken drum zu machen. irgendwie fehlt mir da das bilden des zeigers innerhalb der schleife.

    mal in worten:

    vorbelegen:
    schleifenzähler = 1
    bilde zeiger_zwspeicher

    anfang:
    startadresse berechnen (abhängig vom schleifenzähler und blockgrösse)
    bilde zeiger_block1 (startadresse)
    bilde zeiger_block2 (startadresse + blockgrösse)
    byte der blöcke vergleichen.
    wenn byte_block1 > byte_block2 dann tauschen
    sonst weiter

    tauschen:
    block1 -> zwspeicher
    block2 -> block1
    zwspeicher -> block2
    schleifenzähler auf 1 setzen
    zum anfang springen

    weiter:
    schleifenzähler erhöhen
    prüfe schleifenzähler ob schon am ende.
    wenn nein springe zum anfang

    ende:

    das ist jetzt kein bubblesort. bubblesort funktioniert ein wenig anders.
    ist zwar schneller aber schwieriger zu programmieren.
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

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

    Standard

    Zitat Zitat von stevexxx Beitrag anzeigen
    Beim sortieren der Blöcke in meinem DB schau ich mir immer nur das erste Byte im Block an und tausche anhand der größe (Wert) die einzelnen Blocke miteinander bis sie der Größe nach sortiert sind. (Bubblesort)
    Hallo Stefan,

    hier ist ein Programmbeispiel für die Sortierung der Datenblöcke mit Bubblesort.

    Die Datenblöcke bestehen jeweils aus 4 Bytes und werden nach der Größe des ersten Byte im Datenblock sortiert.

    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 ; 
      BEREICHSZEIGER_1 : DWORD ; 
      BEREICHSZEIGER_2 : DWORD ; 
      OFFSET : DWORD ; 
      DB_NUMMER_TEMP : WORD ; 
      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 1
          ITD   ; 
          SLD   3; 
          T     D [AR1,P#6.0]; 
     
          L     B#16#84; // Operandenbereich
          T     B [AR1,P#6.0]; 
     
          L     D [AR1,P#6.0]; // Bereichszeiger 1
          T     #BEREICHSZEIGER_1; 
     
    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 2
          L     #BLOCKGROESSE; 
          +I    ; 
          ITD   ; 
          SLD   3; 
          T     D [AR1,P#6.0];
     
          L     B#16#84; // Operandenbereich
          T     B [AR1,P#6.0]; 
     
          L     D [AR1,P#6.0]; // Bereichszeiger 2   
          T     #BEREICHSZEIGER_2; 
     
    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 =Offset (Bereichszeiger)
     
          L     #BLOCKGROESSE; 
          ITD   ; 
          SLD   3; 
          T     #OFFSET; 
     
    NETWORK
    TITLE =Bubblesort 
     
          L     #DB_NUMMER; // DB-Nummer
          T     #DB_NUMMER_TEMP; 
     
          AUF   DB [#DB_NUMMER_TEMP]; 
     
     
          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

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

    epy (26.10.2009),Waelder (16.12.2008)

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

    Standard

    Und hier ist noch ein Bild aus der Simulation mit PLCSIM.

    Gruß Kai
    Angehängte Grafiken Angehängte Grafiken
    • Dateityp: jpg VAT.jpg (528,9 KB, 85x aufgerufen)

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

    stevexxx (16.04.2008)

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

    Standard

    das nenne ich Einsatz 10000X danke

  11. #49
    Registriert seit
    20.06.2003
    Ort
    Sauerland.NRW.Deutschland
    Beiträge
    4.849
    Danke
    78
    Erhielt 800 Danke für 543 Beiträge

    Standard

    ja so ist der kai nun mal.
    der prasentiert immer wieder gern fertige lösungen. (evtl ist er ja auch danke süchtig )

    die meisten die dir in dem thread geantwortet haben hätten dir den code liefern können.
    ob das aber der sinn der sache ist, lasse ich mal dahingestellt.
    du solltest verstehen was du da programmierst und nicht einfach irgendeinen code übernehmen.
    beim nächsten problem fängt das gleiche spiel hier wieder von vorne an.
    .
    mfg Volker .......... .. alles wird gut ..

    =>Meine Homepage .. direkt zum Download

    Meine Definition von TIA: Total Inakzeptable Applikation

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

    lorenz2512 (16.04.2008),vierlagig (16.04.2008)

  13. #50
    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 volker Beitrag anzeigen
    ob das aber der sinn der sache ist, lasse ich mal dahingestellt.
    du solltest verstehen was du da programmierst und nicht einfach irgendeinen code übernehmen.
    beim nächsten problem fängt das gleiche spiel hier wieder von vorne an.
    Meine Meinung zu dem Thema kannst Du hier nachlesen:

    http://www.sps-forum.de/showpost.php...3&postcount=14

    http://www.sps-forum.de/showpost.php...4&postcount=22

    Gruß Kai

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

    epy (26.10.2009)

Ä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
  •