Array of BOOL mit UND auswerten

Faolan

Level-2
Beiträge
52
Reaktionspunkte
6
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe Gemeinde,

ich bitte Euch um eine Idee für folgende Aufgabe:
Ich habe 5 Präsenzmelder, welche mir einen Wert BOOL (TRUE/FALSE) liefern. Diese schreibe ich in ein Array:
aPrasenzFlurRechts : ARRAY[1..5] OF BOOL; // Array aus allen Präsenzmeldungen der Flurseite
Ich habe eine Variable Präsenz Gesamt für die Flurseite im GVL-Bereich:
xGesPrasenzFlurRechts : BOOL := FALSE; // Gesamtpräsenz aus allen Meldern zum Flurabschnitt

Aufgabe: Sobald nur ein Eintrag im Array aPrasenzFlurRechts = TRUE => xGesPrasenzFlurRechts = TRUE (Wenn alle Einträge TRUE, dann auch die Variable TRUE, der Vollständigkeit halber) Das bekomme ich mit folgendem Code erledigt:
// Flur Rechts
FOR iFlurOben := 1 TO 5 BY 1 DO
GVL.xGesPrasenzFlurRechts := GVL.xGesPrasenzFlurRechts OR aPrasenzFlurRechts[iFlurRechts];
END_FOR

Wofür ich noch keine Lösung gefunden habe:
Sobald ALLE Einträge des Arrays wieder FALSE sind, setze xGesPrasenzFlurRechts = False. Aber nur dann, wenn es kein TRUE mehr im Array gibt.

Hintergrund ist ein langer Flur mit mehreren Präsenzmeldern. Sobald einer von denen anspricht, soll der ganze Flur Licht haben. Erst wenn alle Präsenzmelder FALSE (Keine Präsenz) melden, darf das Licht wieder ausgehen. Ich würde das gerne in einem Array lösen, da die Anzahl variabel sein soll. Sicherlich könnte ich auch alles Zeile für Zeile ausprogrammieren.

Vielen Dank Euch
Grüße
Faolan
 
Arbeitest du die Schleife in jedem Zyklus der SPS ab?
Wenn ja dann einfach vor der Schleife

GVL.xGesPrasenzFlurRechts := False;

scheiben.

PS: Bist du sicher, dass der Inhalt deiner For-Schleife korrekt ist? Ich glaube nicht....
Was passiert, wenn z.B. der letzte Wert im Array False ist?
 
Na ja, denk doch einmal kurz nach, dann kommst Du sicher selber auf die Lösung.
Du führst die FOR-Schleife in jedem Zyklus aus und wertest wo anders das Ergebnis aus.
Was müsstest Du jetzt machen, damit die Variable GVL.xGesPrasenzFlurRechts FALSE wird und wenn ein Sensor TRUE ist wieder TRUE?
Übrigens nutze zum Einfügen von Code bitte die Code Tags.
 
Also ich würde es so machen.
Etwas anderes wäre es jetzt, wenn die Überprüfung nicht zyklisch abgearbeitet wird.
Das die Variable kurz FALSE und dann eventuell gleich wieder TRUE ist fällt ja nicht weiter auf, da ja keine parallelen Zugriffe auf diese erfolgen.
 
Ich würde das gerne in einem Array lösen, da die Anzahl variabel sein soll. Sicherlich könnte ich auch alles Zeile für Zeile ausprogrammieren.
Das wäre doch nur eine Zeile:
Code:
GVL.xGesPrasenzFlurRechts := xPraesenz_1 OR xPraesenz_2 OR xPraesenz_3 OR xPraesenz_4 OR xPraesenz_5;

Man kann es mit der Tippfaulheit auch übertreiben... wenn sich die Anzahl der Präsenzmelder ändert, muss man sowieso das Programm anpassen - nur bei der Array-Lösung vermutlich umständlicher als einfach eine/mehrere Variablen mehr bei der OR-Verknüpfung hinzuschreiben.

Aber wenn es denn unbedingt als Array sein soll:
Code:
xTemp := FALSE;

FOR iFlurRechts := 1 TO 5 DO
  IF aPrasenzFlurRechts[iFlurRechts] THEN
    xTemp := TRUE;
    EXIT;
  END_IF;
END_FOR

GVL.xGesPrasenzFlurRechts := xTemp;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich sende den Präsenzwert via BACnet ins Ethernet. Wenn der dann ständig flattert, habe ich Sturm auf dem Netzwerk. Daher vermeide ich solche Situationen.
Tut er ja nicht. Die Variable ist zwar tatsächlich kurz FALSE und dann wieder TRUE unter bestimmten Umständen, aber die Daten an das BACnet werden ja nicht während der Programmabarbeiutung gesendet, sondern außerhalb.
 
Na ja, denk doch einmal kurz nach, dann kommst Du sicher selber auf die Lösung.
Du führst die FOR-Schleife in jedem Zyklus aus und wertest wo anders das Ergebnis aus.
Was müsstest Du jetzt machen, damit die Variable GVL.xGesPrasenzFlurRechts FALSE wird und wenn ein Sensor TRUE ist wieder TRUE?
Übrigens nutze zum Einfügen von Code bitte die Code Tags.
Gute Idee...habe ich schon die ganze Zeit gemacht und bin zu keinem Ergebnis gekommen. Sonst würde ich hier nicht um Hilfe fragen
 
Man kann es mit der Tippfaulheit auch übertreiben... wenn sich die Anzahl der Präsenzmelder ändert, muss man sowieso das Programm anpassen - nur bei der Array-Lösung vermutlich umständlicher als einfach eine/mehrere Variablen mehr bei der OR-Verknüpfung hinzuschreiben.

Aber wenn es denn unbedingt als Array sein soll:
Code:
xTemp := FALSE;

FOR iFlurRechts := 1 TO 5 DO
  IF aPrasenzFlurRechts[iFlurRechts] THEN
    xTemp := TRUE;
    EXIT;
  END_IF;
END_FOR

GVL.xGesPrasenzFlurRechts := xTemp;
Oder so
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Interessieren dich denn die einzelnen wirklich oder gehts dir nur um die Summe?

Dann kannst du auch einfach eine Variable wegschreiben welche mit der Abfrage des Bytes auf gleich null bzw ungleich null abgefragt wird.
 
Dann kannst du auch einfach eine Variable wegschreiben welche mit der Abfrage des Bytes auf gleich null bzw ungleich null abgefragt wird.
Welches Byte?
1) die einzelnen Präsenzmelder müssten erst in die Bits eines Bytes eingetragen werden, da kann man die auch gleich OR-Verknüpfen.
2) Achtung: bei Codesys sind BOOL ganze Bytes
 
Das wäre doch nur eine Zeile:
Code:
GVL.xGesPrasenzFlurRechts := xPraesenz_1 OR xPraesenz_2 OR xPraesenz_3 OR xPraesenz_4 OR xPraesenz_5;

Man kann es mit der Tippfaulheit auch übertreiben... wenn sich die Anzahl der Präsenzmelder ändert, muss man sowieso das Programm anpassen - nur bei der Array-Lösung vermutlich umständlicher als einfach eine/mehrere Variablen mehr bei der OR-Verknüpfung hinzuschreiben.

Aber wenn es denn unbedingt als Array sein soll:
Code:
xTemp := FALSE;

FOR iFlurRechts := 1 TO 5 DO
  IF aPrasenzFlurRechts[iFlurRechts] THEN
    xTemp := TRUE;
    EXIT;
  END_IF;
END_FOR

GVL.xGesPrasenzFlurRechts := xTemp;
Super, vielen Dank. Das funktioniert. Tippfaulheit würde ich nicht sagen. Es gibt mehrere Flure, jeder kann bis zu 5 Sensoren haben. Hat der Flur nur 3, gibt es nur 2 tote Variablen im Array. Der Inbetriebnehmer muss so nur an das Array die passenden BACnet-Objekte der Multisensoren anhängen und alles paletti. Er soll im Code (Logik) selbst nichts mehr ändern.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Tut er ja nicht. Die Variable ist zwar tatsächlich kurz FALSE und dann wieder TRUE unter bestimmten Umständen, aber die Daten an das BACnet werden ja nicht während der Programmabarbeiutung gesendet, sondern außerhalb.
Du meinst, die Ausgänge werden erst am Ende des Programmzyklus ins BACnet geschrieben? Da ist was dran...bin nur gebranntes Kind...daher etwas übervorsichtig. Gute Idee!
 
Zurück
Oben