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

Ergebnis 1 bis 6 von 6

Thema: DB nach Werten durchsuchen und die Anzahl des zu suchenden Wertes ausgeben

  1. #1
    Registriert seit
    12.10.2006
    Beiträge
    66
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo, ich möchte gerne ein DB170 (Array [1..100] Int) durchsuchen der 100 Integer enthält. Es sollen alle Int die den Wert 0 haben gezählt werden und in DB171.DBW2 angezeigt werden. Leider zählt mein Programm wie eine unendliche Schleife und hält nicht nach 100 Werten an. Ich hab schon hier im Forum einige Zeit verbracht und mir diese Struktur zusammengestellt, aber irgendwo ein Denkfehler. Ich hoffe es kann mir jemand weiterhelfen

    Code:
          AUF   DB   170                    //zu durchsuchender DB
          LAR1  P#4.0                       //Pointer auf Start im DB, hier DBB4
          L     100                         //Anzahl der Int, die durchsucht werden
    next: T     #zaehler                    //Momentaner Wert Schleifendurchgänge
          L     DBW [AR1,P#0.0]             // Lade Datenbyte
          L     0                           // Lade 0
          ==I                               // Vergleiche Wer mit 0
          SPBN  m1                          // Wenn Wert ungleich 0 dann springe zu m1
          L     DB171.DBW2              //Anzahl der Werte die Null enthalten
          L     1                           // Lade 1
          +I                                //Rechne Anzahl der Werte die Null enthalten Plus 1
          T     DB171.DBW2              //Transferiere neuen Wert in Anzahl der Werte die Null enthalten
     
    m1:   +AR1  P#2.0                       //Erhöhe das Adressregister 1 um 2Byte (für Wort)
          L     #zaehler
          LOOP  next                        // Schleife solange, bis #zaehler auf 0
    Gruß
    Zitieren Zitieren DB nach Werten durchsuchen und die Anzahl des zu suchenden Wertes ausgeben  

  2. #2
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.618
    Danke
    776
    Erhielt 646 Danke für 492 Beiträge

    Standard

    Ich habs jetzt nicht ausprobiert. Aber was mir auffällt ist:
    Der DB171.DBW2 muss vor allem Anderen erstmal wieder auf 0 gesetzt werden. Machst du das?
    Ansonsten sieht es so aus als würde er nicht nur bis 100 zählen. Das tut er vermutlich aber natürlich jeden Zyklus. Und jedesmal addiert er alle wiedergefundenen 0en dazu.

    mfG René

  3. Folgender Benutzer sagt Danke zu vollmi für den nützlichen Beitrag:

    tigger (31.03.2015)

  4. #3
    Registriert seit
    29.03.2004
    Beiträge
    5.735
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Ich glaube an einen anderen Fehler.
    Nach dem vollqualifizierten Zugriff mit DB171.DBW2 wird nach dem ersten Durchlauf mit "L DBW [AR1,P#0.0]" ebenfalls auf DB171 zugegriffen, und nicht mehr auf den eigentlich geplanten DB170.

  5. Folgender Benutzer sagt Danke zu Thomas_v2.1 für den nützlichen Beitrag:

    tigger (31.03.2015)

  6. #4
    Registriert seit
    22.11.2006
    Ort
    CH
    Beiträge
    3.618
    Danke
    776
    Erhielt 646 Danke für 492 Beiträge

    Standard

    Nach der Loop sprungmarke könnte er den DB170 ja wieder öffnen. Dann passts doch wieder oder?

    mfG René (Der da auch wieder SCL etwas übersichtlicher findet)

  7. #5
    Registriert seit
    29.03.2004
    Beiträge
    5.735
    Danke
    143
    Erhielt 1.685 Danke für 1.225 Beiträge

    Standard

    Zum Beispiel. Oder man verwendet das DI Register und greift dann mit DIW auf den anderen Datenbaustein zu.

  8. #6
    tigger ist offline Benutzer
    Themenstarter
    Registriert seit
    12.10.2006
    Beiträge
    66
    Danke
    8
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Danke euch Beiden

    Ich habe es jetzt so gelöst:

    Code:
    NW1:
     L     0
          T     #nio_zaehler
          AUF   DB   170                    //zu durchsuchender DB
          LAR1  P#4.0                       //Pointer auf Start im DB, hier DBB4
          L     100                         //Anzahl der Int, die durchsucht werden
    next: T     #zaehler                    //Momentaner Wert Schleifendurchgänge
          L     DBW [AR1,P#0.0]             // Lade Datenbyte
          L     0                           // Lade 0
          ==I                               // Vergleiche Wer mit 0
          SPBN  m1                          // Wenn Wert ungleich 0 dann springe zu m1
          L     #nio_zaehler                //Anzahl der Werte die Null enthalten
          L     1                           // Lade 1
          +I                                //Rechne Anzahl der Werte die Null enthalten Plus 1
          T     #nio_zaehler                //Transferiere neuen Wert in Anzahl der Werte die Null enthalten
    m1:   +AR1  P#2.0                       //Erhöhe das Adressregister 1 um 2Byte (für Wort)
          L     #zaehler
          LOOP  next                        // Schleife solange, bis #zaehler auf 0
    Code:
     NW2:
          L     #nio_zaehler
          T     DB171.DBW    2
    Und so funktioniert es gut.

Ähnliche Themen

  1. ARRAY nach aktuellem Datum durchsuchen und löschen
    Von Ossi64 im Forum CODESYS und IEC61131
    Antworten: 11
    Letzter Beitrag: 30.12.2014, 20:18
  2. Antworten: 27
    Letzter Beitrag: 21.06.2012, 15:12
  3. Anzahl der wahren Eingänge als ganze Zahl ausgeben
    Von Eisbaer_vw im Forum Programmierstrategien
    Antworten: 1
    Letzter Beitrag: 20.10.2011, 15:26
  4. DB nach Werten durchsuchen - SCL ?
    Von karsten.schmidt im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 26.03.2011, 13:15
  5. DINT nach INT bei positiven und ganzzahligen Werten (Frequenzmessung)
    Von poppycock im Forum Programmierstrategien
    Antworten: 9
    Letzter Beitrag: 23.07.2009, 21:28

Lesezeichen

Berechtigungen

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