TIA Wie Array in SCL abfragen?

spirit

Level-1
Beiträge
961
Reaktionspunkte
23
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Jungs,

sitze mal wieder in der Klemme... :wink:

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...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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 != 0 THEN
Setze Fehlerbit...
 
Ach menno, warum nur immer so kompliziert? :rolleyes:

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?
 
Zuletzt bearbeitet:
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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;
 
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?
 
Zuletzt bearbeitet:
@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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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....
 
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?
 
Dann geh mal im Kopf oder mit Stift und Papier die Schleife durch, die Larry gepostet hat.

Alternativ geht es wieder mit einem vorzeitigen Abbruch.

Code:
M30.0 := true;
FOR i := 1 to 20 DO
  if Melde_DB.Meldungen[i] <> 0 then
    M30.0 := false;
    EXIT;
  end_if;
end_for;
Die Schleife läuft solange bis ein Element nicht 0 ist, setzt den Merker dann auf false und unterbricht die Schleife.
Sind alle Elemente 0 läuft die Schleife bis zum Ende durch und der Merker bleibt true.....
 
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?

@Spirit:
Ich gehe mal davon aus, dass der Code funktioniert - getestet hatbe ich ihn jedoch nicht.
Erstmal vorweg - es gibt hier natürlich viele Wege, es zu lösen. Der Vorschlag von MasterOhh ist um nichts schlechter.
Ich bleibe hier aber (nur des Erklärens wegen) mal bei meinem Code :
- Richtig, der M30.0 wird erstmal True. In der Schleife wird er dann mit sich selbst und der Abfrage auf 0 des Array-Elementes verundert und wieder in sich zugewiesen. Ist das Array-Element = 0 dann ist das Ergebnis des Vergleichs in der Klammer ein True. Ist der Merker vorher schon True dann wird seine neue Zuweisung True AND True - also wieder TRUE. Ist der Vergleich in der Klammer <> 0 dann ist das Ergebnis der Klammer ein False. De neue Zuweisung des Merkers wäre also dann True AND False - ergibt FALSE. Und so bleibt es dann auch in der Folge.

Wie schon geschrieben kann man die Shcleife auch vorzeitig abbrechen (bei erster falscher Übereinstimmung) - so ist es mir aber halt nicht eingefallen ...

Gruß
Larry
 
Lieben Dank an Euch!

Glaube, das habe ich dann soweit verstanden (oh Wunder!)... :p


Ach (doch) noch eine Frage:


Angenommen ich würde neben


"Melde_DB".Meldungen = 0

auch noch

"Alarm_DB".Alarme[?] = 0

abfragen wollen, darf dann für das Fragezeichen ebenfalls das gleiche i herangezogen werden - oder kommt sich das dann mit obiger Abfrage in die Quere?
 
Du kannst das gleiche i verwenden, musst allerdings eine neue hierfür FOR-Schleife anlegen, da die bestehende Schleife ja mit EXIT vorzeitig verlassen werden kann.
 
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?

Ja, der erste Code würde funktionieren, weil die FOR Schleife beim ersten 0er beendet wird. Man kann danach über i noch abfragen, welcher es war.

Zum zweiten Code. Richtig M30.0 wird schon auf TRUE gesetzt und soll auch TRUE _bleiben!_
M30.0 nimmt immer den Zustand vom letzten M30.0 & Melde_DB.Meldung an. Das heißt, sobald M30.0 einmal den Zustand 0 hat, bleibt er auch auf 0.

Deshalb ist der Unterschied wie von Larry beschrieben, ob ALLE Werte 0 sein müssen oder nur eines.
 
Zurück
Oben