TIA SCL Array Abfrage

Dom87

Level-2
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, ich habe ein kleines Problem und suche da noch nach einer passenden Lösung. Ich habe an einer Anlage mehrere Vorrichtungen die einzeln codiert sind. Jetzt hat jede Vorrichtung unterschiedlich viele Bauteilabfragen. z.b. Vorrichtung mit Codierung 5 hat 5 Abfragen und einen Vorrichtung mit Codierung 8 hat 8 Abfragen. Ich brauche jetzt für die weitere Verarbeitung im Programm einmal einen UND-Abfrage von den Bauteilabfragen (je nachdem wie die Codierung ist) und eine ODER-Abfrage der Bauteilabfragen. Das mit der Oder habe ich hin bekommen nur die und nicht. Je nachdem wie die Codierung ist schiebe ich mir die Eingänge in ein Array rein und jetzt möchte ich das Array im Ganzen bis zu der Grenze der Codierung abfragen ob alle Signale da sind. Sprich Codierung ist 4 also müssen im Array [ 1 bis 4] alle da sein erst dann soll ein Signal gesetzt werden.
 
C-ähnlich:
Alle_Abfragen_Aktiv := True;

FOR x:=1 TO Codierung DO
    IF NOT myArray[x] THEN
       Alle_Abfragen_Aktiv := False;
       EXIT;
    END_IF;
END_FOR;

meinst Du so etwas?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin Dom87,

wie sieht das Array aus?

Wenn n..m, mach doch einfach eine FOR-Schleife:

Code:
cntCodierung := 0;
FOR #i := n TO m DO
    IF
        myArray[#i] // Bool
    THEN
        cntCodierung += 1;
    END_IF;
END_FOR;

undAbfrage := cntCodierung = Codierung; // wobei "undAbfrage" ein Bool ist.

VG

MFreiberger
 
Hallo JSEngineering,

wenn ich das so mache wie du gesagt hast ist meine UND Abfrage ja schon ohne das irgendwas ist 1.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo JSEngineering,

wenn ich das so mache wie du gesagt hast ist meine UND Abfrage ja schon ohne das irgendwas ist 1.
jaaaa.... hast Du auch die FOR-Schleife darunter gesehen?
Die gehört dazu!

Du gehst durch das Array und sobald ein Element FALSE ist, wird das TRUE zurückgesetzt.

Hinter dem FOR hast Du dann das nutzbare Signal.
 
So funktioniert es jetzt

"Werte".Eingänge_Gesamt_RW1_und := TRUE;

FOR #Laufvariabel_2 := 1 TO "Werte".Codierung_RW1 BY 1 DO

IF NOT "Werte".Wertebereich_Eingänge_RW1[#Laufvariabel_2] THEN
"Werte".Eingänge_Gesamt_RW1_und := FALSE;
EXIT;
END_IF;
END_FOR;

IF "Werte".Codierung_RW1 = 0 THEN
"Werte".Eingänge_Gesamt_RW1_und := 0;
END_IF;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
So funktioniert es jetzt

"Werte".Eingänge_Gesamt_RW1_und := TRUE;

FOR #Laufvariabel_2 := 1 TO "Werte".Codierung_RW1 BY 1 DO

IF NOT "Werte".Wertebereich_Eingänge_RW1[#Laufvariabel_2] THEN
"Werte".Eingänge_Gesamt_RW1_und := FALSE;
EXIT;
END_IF;
END_FOR;

IF "Werte".Codierung_RW1 = 0 THEN
"Werte".Eingänge_Gesamt_RW1_und := 0;
END_IF;
Eine globale Variable mit einem Wert vorbelegen (initialisieren) und später (z.B. in einer Schleife) einen anderen Wert zuweisen, sollte man besser nicht machen (und sich gar nicht erst angewöhnen). Wenn überhaupt, dann sollte man sowas nur mit lokalen Variablen ohne Zugriff von außen (z.B. TEMP) machen. (generell sollte man mehrfache Zuweisungen an Variablen an verschiedenen Programmstellen möglichst vermeiden)
Warum? Wenn auf die globale Variable in einer anderen höher priorisierten Task zugegriffen wird (z.B. HMI-Kommunikation ! ), dann könnte die andere Task anstatt dem Endwert auch mal den provisorischen Initialwert (oder Zwischenwerte) lesen, was bei einer HMI z.B. zum unregelmässigen Flackern der Anzeige führt.

Weiters: Beim Umgang mit BOOL-Ausdrücken sollte man sich eine einheitliche Schreibweise angewöhnen, am besten nur TRUE und FALSE verwenden (falls überhaupt nötig), und nicht mischen mit 1 und 0

Harald
 
Code:
"Werte".Eingänge_Gesamt_RW1_und := "Werte".Codierung_RW1 > 0; // <===<<< geändert!
FOR #Laufvariabel_2 := 1 TO "Werte".Codierung_RW1 BY 1 DO
    IF NOT "Werte".Wertebereich_Eingänge_RW1[#Laufvariabel_2] THEN
        "Werte".Eingänge_Gesamt_RW1_und := FALSE;
        EXIT;
    END_IF;
END_FOR;
// folgende Zeilen ersatzlos gestrichen!
// IF "Werte".Codierung_RW1 = 0 THEN
//     "Werte".Eingänge_Gesamt_RW1_und := FALSE;
// END_IF;
Kleine Änderung in der ersten Zeile macht die letzten 3 Zeilen überflüssig!
Dadurch wird die Variable nur dann mit TRUE vorbesetzt, wenn die Anzahl > 0 ist.
Die Variable '"Werte".Eingänge_Gesamt_RW1_und' sollte - wie Harald bereits sagte - temporär sein.
 
Zurück
Oben