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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: Wie Array in SCL abfragen?

  1. #1
    Registriert seit
    12.09.2012
    Beiträge
    961
    Danke
    183
    Erhielt 23 Danke für 22 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo Jungs,

    sitze mal wieder in der Klemme...

    Ich wollte ein Melde-Array (Array [0..20] of Word) gerne darauf abfragen, ob alle Elemente den Wert 0 haben:

    IF "Melde_DB".Meldung[0..20] = 0 THEN


    Allerdings klappt das nicht; es wird wie oben in rot dargestellt!

    Eine einzelne Meldung 0-20 kann auf diese Weise jedoch schon abgefragt werden.

    Wie muss ich das nun abfragen?

    Vielen Dank...
    LG
    spirit
    Zitieren Zitieren Wie Array in SCL abfragen?  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    Zitat Zitat von spirit Beitrag anzeigen
    IF "Melde_DB".Meldung[0..20] = 0 THEN ...
    Hallo,
    ob nun TIA oder nicht ... du kannst nicht einen Bereich auf einmal abfragen. Das geht nur in einer Schleife und dann Element für Element des Array .

    Gruß
    Larry

  3. #3
    Registriert seit
    14.06.2012
    Beiträge
    46
    Danke
    3
    Erhielt 8 Danke für 5 Beiträge

    Standard

    So wie Larry es schon gesagt hat gilt das allgemein für Hochsprchen.
    Deklariere dir eine Variable i vom Typ Integer die du in einer evtl. For-Schleife von 0 bis 20 hochzählst.
    IF "Melde_DB".Meldung[i] != 0 THEN
    Setze Fehlerbit...

  4. #4
    Avatar von spirit
    spirit ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    12.09.2012
    Beiträge
    961
    Danke
    183
    Erhielt 23 Danke für 22 Beiträge

    Standard

    Ach menno, warum nur immer so kompliziert?

    Könnte das so in etwa funktionieren:

    Code:
    FOR "i" := 0 TO 20 DO
       "M30.0" := 0; 
       IF "Melde_DB".Meldung["i"] = 1 THEN 
         "M30.0" := 1;
       ELSE
         "M30.0" := 0; 
         EXIT;
       END_IF;  
    END_FOR;

    Dann würde sozusagen die Schleife sofort verlassen werden, sobald ein Wert im Array FALSE ist - stimmt das so?
    Geändert von spirit (23.04.2013 um 13:22 Uhr)
    LG
    spirit

  5. #5
    Registriert seit
    12.07.2006
    Beiträge
    45
    Danke
    5
    Erhielt 2 Danke für 2 Beiträge

    Standard

    So wie du die Abfrage programmiert hast, fragt du eigentlich nur den Zustand von "Melde_DB".Meldung["20"] = 1, da du bei jedem Durchlauf der Schleife den M30.0 zurücksetzt.

    Gruß
    Koslovski.

  6. #6
    Registriert seit
    06.10.2009
    Ort
    NRW
    Beiträge
    1.572
    Danke
    63
    Erhielt 259 Danke für 219 Beiträge

    Standard

    Ich vermute mal, Du möchtest den M30.0 nehmen, um diesen als Störbit einzuschalten, wenn in dem Array irgendein Bit an ist.

    Dann evtl. so:

    Code:
    
    
    "M30.0" := 0; 
    
    FOR "i" := 0 TO 20 DO     
    IF "Melde_DB".Meldung["i"] = 1 THEN       
    "M30.0" := 1;   
    EXIT;
    END_IF;
    END_FOR;
    Meine Motivation läuft nackig mit einem Cocktail über eine Wiese.

  7. #7
    Avatar von spirit
    spirit ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    12.09.2012
    Beiträge
    961
    Danke
    183
    Erhielt 23 Danke für 22 Beiträge

    Standard

    Zitat Zitat von Koslovski Beitrag anzeigen
    So wie du die Abfrage programmiert hast, fragt du eigentlich nur den Zustand von "Melde_DB".Meldung["20"] = 1, da du bei jedem Durchlauf der Schleife den M30.0 zurücksetzt.

    Gruß
    Koslovski.
    Hm, danke - dann 2. Versuch!

    Code:
    "M30.0" := 0; 
    FOR "i" := 0 TO 20 DO
          IF "Melde_DB".Meldung["i"] = 1 THEN 
           "M30.0" := 1;    
          EXIT;    
         END_IF;   
    END_FOR;
    besser?

    Ah, war wohl zu langsam! Ja genau Tigerente, so wäre das gewünscht von mir...

    Eine Frage dazu:

    Das heißt also, dass die Schleife sofort verlassen wird, wenn ein Array-Wert TRUE ist, richtig?
    Geändert von spirit (23.04.2013 um 13:32 Uhr)
    LG
    spirit

  8. #8
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.726
    Danke
    398
    Erhielt 2.401 Danke für 2.001 Beiträge

    Standard

    @Spirit:
    Wenn du wissen willst, ob nur eins der Elemente = 0 ist, dann wäre dein Code so korrekt.
    Ich würde es dann aber ggf. so machen :
    Code:
    FOR "i" := 0 TO 20 DO
       "M30.0" := True ; 
       IF "Melde_DB".Meldung["i"] = 0 THEN 
         "M30.0" := False ;
         EXIT;
       END_IF;  
    END_FOR;
    wenn du aber wissen willst, ob ALLE Elemente = 0 sind, dann wäre der Code ungefähr so :
    Code:
    "M30.0" := True ; 
    FOR "i" := 0 TO 20 DO
       "M30.0" := "M30.0" AND ("Melde_DB".Meldung["i"] = 0 ) ;    
    END_FOR;
    Gruß
    Larry

  9. #9
    Registriert seit
    21.12.2006
    Ort
    Wiener Neustadt
    Beiträge
    931
    Danke
    154
    Erhielt 169 Danke für 127 Beiträge

    Standard

    Ich hab sowas mal gebastelt, einfach als SSM:

    Code:
    FOR i := Alarm_begin TO Alarm_end BY 1 DO 
        FOR j := 0 TO 15 BY 1 DO
            actual_bit := Message_DB.DX[i, j] ;
            IF actual_bit THEN 
                Common_Alarm := true ;
            END_IF ;
        END_FOR ;
    END_FOR ;
    von aussen kommt das 1. wort und das letzte Wort als int. der DB ist nur mit bitmeldungen vollgestopft.

    ist allerdings in v5.5, hab nicht gelesen, dass tia....
    Gruß
    M

    Handbook not read error...
    Klare Frage - klare Antwort

  10. #10
    Avatar von spirit
    spirit ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    12.09.2012
    Beiträge
    961
    Danke
    183
    Erhielt 23 Danke für 22 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Dank' euch für die Vorschläge!

    @Larry: Würde dein erster Code wirklich funktionieren? Koslovski hat ja angemerkt, dass so nur der letzte Array-Wert abgefragt wird und alle anderen nicht!

    Die Zeile

    Code:
           "M30.0" := "M30.0" AND ("Melde_DB".Meldung["i"] = 0 ) ;
    verstehe ich gar nicht. Was wird denn hier abgefragt; M30.0 wird doch oben schon auf 1 gesetzt?
    LG
    spirit

Ähnliche Themen

  1. Antworten: 18
    Letzter Beitrag: 21.12.2016, 17:03
  2. MW in SCL abfragen?
    Von spirit im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 21.03.2013, 14:15
  3. Merkerbyte abfragen in scl
    Von Werner1 im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 19.03.2012, 16:11
  4. Timer in SCL abfragen
    Von geduldiger im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 25.09.2007, 15:55
  5. Mit SCL Flanke 0->1 abfragen
    Von Anonymous im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 21.06.2005, 18:07

Lesezeichen

Berechtigungen

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