Step 7 Statusabfrage von mehreren BOOL-Variablen eines DB mit Schleife / Loop

Chromzone

Level-2
Beiträge
15
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich habe in meinem DB5 genau 1600 Variablen vom Datentyp BOOL.
Diese möchte ich mit Hilfe einer Schleife im FC4 auf TRUE abfragen.
Die Häufigkeit der jeweiligen Variablen die TRUE sind sollen anschließend in dem DB6 pro Variable addiert werden.

Um den Hintergund zu erklären:
Es gibt 1600 Störmeldungen im DB5, die 1 oder 0 sein können. Deren Statuswechsel von 0 auf 1 soll abgefragt und für jede Störung einzeln gezählt werden.
D. h. am Ende soll im DB6 gespeichert werden, wie oft die jeweilige Störung aufgetreten ist.
Ich verwende eine S7-300 und programmiere in AWL.

Wie kann man das umsetzen?
Ich dachte daran einen Loop zu verwenden, der die einzelnen Variablen des DBs indirekt adressiert und die Adresse nach jedem Loop hochzählt. Das Ganze 1600 mal durchlaufen lassen.
Wenn die Variable von 0 auf 1 wechselt soll deren Zähler um 1 erhöht werden. Gibt es keinen positiven Flankenwechsel wird der Zählerteil übersprungen.

So ungefähr:

U FehlerNrX
FP FlankenmerkerX
SPBN _001
L FehlerZählerX
L 1
+I
T FehlerZählerX

_001: NOP 0

Die Frage ist, wie ich das mit der indirekten Adressierung hin bekomme, damit ich die Adresse hoch zählen kann?
Für Beispielprogramme und Erklärungen wär ich dankbar.

Grüße
Chrom
 
Gnädiger Herr.

ich hoffe, diese Programmierung findet nicht irgendwo in der realen Industrie statt. Ich würde dir ansonsten noch Steinäxte und Kupfersäfen als Programmier-Werkzeuge empfehlen. Die sind nämlich nur unwesentlich moderner wie deine Vorgehensweisen.
 
Für welche Firma arbeitest Du ?
Moderne Vorgehensweise ist nicht mal so eben beigebracht. Aber AWL, FCs und Global-DB mit 1600 boolschen Variablen wird es darin nicht geben.
 
Hallo Chromzone,

wenn Du das ganze flankengesteuert machen möchtest, brauchst du für jedes deiner 1600 Elemente Flankenmerker bzw. 1600 R-Trig-Instanzen.

Ich würde dir vorschlagen von einem FC zu einem FB zu wechseln und dir am Ende der Prüfung, den aktuellen Fehlerzustand im static Bereich wegzuschreiben.

Zum Hochzählen prüfst du also, ob der Fehler grade ansteht und ob der Fehler im letzten Zyklus auch schon anstand. Hochgezählt wird, wenn der Fehler ansteht und im letzten Zyklus noch nicht anstand.

Code:
DB5.Error entspricht einem Array[1...1600] of Bool
DB6.ErrorCnt entspricht einem Array[1...1600] of UINT

sError entspricht einem Array[1...1600] of Bool

FOR #index := 1 TO 1600 DO
    IF "DB5".Error[#index] AND "DB5".Error[#index] <> #sError[#index] THEN
        "DB6".ErrorCnt[#index] += 1;
    END_IF;
END_FOR;


#sError := "DB5".Error;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
...
    IF "DB5".Error[#index] AND "DB5".Error[#index] <> #sError[#index] THEN
...
Moin Harald!
Habe gegrübelt, warum Du die Abfrage so programmiert hast.
Ich weiss, alle Wege führen nach Rom. Aber ich weiss auch, dass Du immer die Macken von so vielen ProgrammierSprachen im Hinterkopf hast und wahrscheinlich mit Absicht so und nicht anders formuliert hast. Oder ist es Deine Vorliebe für XOR, die in "<>" durchschimmert? Oder ist es die Assoziation des Begriffs "Not-Operation" mit medizinischen Zusammenhängen?
"IF DB5".Error[#index] AND NOT #sError[#index] THEN" hätte es doch auch getan?

Gruss, Heinileini
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
wer ist denn Harald?:confused:
Verdammt, da habe ich mich aber total verguckt!!! Wer lesen kann, ist tatsächlich klar im Vorteil ;o)
Deinen BenutzerNamen kann man ja noch durch PN kürzen - wenigstens das hätte mir auffallen müssen.
Deine Hoffnung "damit es Jeder auf Anhieb versteht" solltest Du schnell aufgeben, damit's nicht allzu viele Enttäuschungen gibt.
 
Zurück
Oben