TIA Gesammten Datenbausstein auswerten

Da könnte man dann für die Anzahl der Fehlermeldungen eine globale CONST Variable nehmen, und diese Arrays FOR 1 TO MeineConstVariable
anlegen sowie die FOR Schleifen auch 1 TO MeineConstVariable.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Oder du machst dir einen kleinen FC der nur das Sammelbit erzeugt.
Diesem kannst du das Array als "ARRAY[*] OF BOOL" übergeben und im Baustein mit LOWER_BOUND und UPPER_BOUND die Grenzen auslesen
 
Ich kenne das Programm jetzt nicht, darum werfe ich das einfach mal so rein:
Ich würde lieber ein Zentrales "Störung_vorhanden"-Bit setzen, an der Stele wo du alle Störungen generierst, als das ich alle möglichen Bits durchgehe und dann auch auf Erweiterungen achten muss.
 
// 1000 Fehlermeldungen auswerten ( min eine steht an )
fehlerStehtAn := FALSE;
FOR i := 1 TO 1000 DO
IF Fehlermeldung THEN
fehlerStehtAn := TRUE;
EXIT;
END_IF;
END_FOR;


Gibt es da nichts besseres um ein Array of Bool auszuwerten? Bei meiner 1500er ET200SP CPU verlängert dies die Zykluszeit deutlich.
Mit AT-Überlagerung oder mit GATHER oder irgendwas um dann gleich ganze Wörter abfragen zu können vielleicht?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wäre mal interessant zu wissen ob diese Anweisungen schneller sind (AT meiner Meinung nach am ehesten). Serialize würde es auch noch geben.

Noch eine Idee dazu: Du könntest, wenn du wirklich so viele Daten hast, die Bearbeitung auf mehrere Zyklen aufsplitten. Dann wäre die Auswirkung auf deinen Zyklus nicht so hoch - natürlich aber auch nicht in jedem Zyklus die Daten aktuell.
 
Noch eine Idee dazu: Du könntest, wenn du wirklich so viele Daten hast, die Bearbeitung auf mehrere Zyklen aufsplitten. Dann wäre die Auswirkung auf deinen Zyklus nicht so hoch - natürlich aber auch nicht in jedem Zyklus die Daten aktuell.
Ich neige auch dazu, die Aktion auf mehrere Zyklen zu verteilen. Allerdings weiss man dann in keinem einzigen Zyklus mehr, ob das Ergebnis noch bzw. schon aktuell ist - leider. Aber vielleicht muss man das auch gar nicht wirklich wissen. Ob eine SammelMeldung für den Bediener am Panel evtl. sagen wir mal 4 oder 8 Zyklen "zu spät" angezeigt wird ... wen interessiert's?
Kommt drauf an, was die SammelMeldung für Auswirkungen haben soll.

Eine "DoppelDeklaration" eines SpeicherBereichs per AT sollte für mein Verständnis keinerlei zusätzliche RechenZeit zur Laufzeit bewirken.
Um bitweise auf Daten zuzugreifen, tun sich die CPUs von Hause aus schwer (grösseren Bereich lesen, maskieren und/oder schieben ...) - aber wer braucht schon so etwas, mal abgesehen von diesen lästigen PLC-Programmierern mit ihren exotischen Anforderungen. ;)
Sollten die BOOLs so im Speicher verstreut liegen, dass sie ohnehin mühsam in eine HilfsVariable geschaufelt werden müssen, wo dann erst per AT die ZusammenFassung in grössere Einheiten (Byte, Word, DWord) geschehen kann, dann lassen sich zusätzliche RechenZeiten wohl kaum umgehen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also wenn du wirklich nur die Störmeldeleucht ansteuern willst sobald eines oder mehrere deiner Störmeldebits 1 sind, dann würde ich da auch einfach auf >0 vergleichen.

mit DINT erschlägst du da 32 Bit auf einmal, wenn du mehr wie 32 Bitmeldungen hast dann halt das noch mal für die nächsten 32 Bit.

Das ist die einfachste und schnellste Methode.
 
Du kannst auch einfach deinen Array ein zweites mal anlegen (auch im Temp möglich) und dann vergleichen. Habe es grade mit array[0..5000] of bit probiert und die Zykluszeit ist in der Simulation ~0.04ms hoch gegangen. Scheint mir die schnellste und einfachste Variante zu sein.

Edit: Es sind einfach nur Bools und kein Array of Bool, habe gepennt <.<
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
// 1000 Fehlermeldungen auswerten ( min eine steht an )
fehlerStehtAn := FALSE;
FOR i := 1 TO 1000 DO
    IF Fehlermeldung[I] THEN
        fehlerStehtAn := TRUE;
        EXIT;
    END_IF;
END_FOR;
Gibt es da nichts besseres um ein Array of Bool auszuwerten? Bei meiner 1500er ET200SP CPU verlängert dies die Zykluszeit deutlich.

Wieviel ist eine "deutliche" Zykluszeitverlängerung? 1000 Bits in einer Schleife abfragen sollte einer 1500 CPU nicht wirklich was ausmachen.

Harald
 
... dann würde ich da auch einfach auf >0 vergleichen.

mit DINT erschlägst du da 32 Bit auf einmal, wenn du mehr wie 32 Bitmeldungen hast dann halt das noch mal für die nächsten 32 Bit.
Das verstehe ich mal wieder nicht: mit DINT und Vergleichen auf >0 erschlägt man nur die 31 Bits 0..30, aber auch nur, solange das Bit 31 brav auf 0 bleibt. Warum nicht einfach auf <>0 vergleichen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wäre mal interessant zu wissen ob diese Anweisungen schneller sind (AT meiner Meinung nach am ehesten). Serialize würde es auch noch geben.
AT oder Serialize kann man nehmen, wenn man die langsamste Variante wählen will. ;)
AT kann man bekanntlich nicht direkt auf einen beliebigen DB sondern nur auf lokale FB/FC/OB-Variablen und -Übergabeparameter anwenden, und dazu müsste man die ganzen Bools zunächst kopieren. Und Serialize kopiert auch alle Bools, nur noch vieeel umständlicher und zykluszeitfressend...

Harald
 
Hallo Beisammen,

evtl scho mal geschrieben habe ich aber gerade nicht gefunde. Evtl den Störmeldebereich nochmal im Temp Deklarieren und dann einfach auf Ungleich Vergleichen.
Tia Schaft es ja jetzt in Optimierten Fc Fb den Temp mit null zu initiallisieren.


Gruß tia
 
vtl scho mal geschrieben habe ich aber gerade nicht gefunde. Evtl den Störmeldebereich nochmal im Temp Deklarieren und dann einfach auf Ungleich Vergleichen.
Tia Schaft es ja jetzt in Optimierten Fc Fb den Temp mit null zu initiallisieren.
Ja, das Thema hatte wir kürzlich (aber wo? ach ja, das war doch auch schon dieser Thread! :sick: ).
Dabei ging es aber darum, ein Array bzw. ein Struct mit einem gelöschten "EbenBild" des Arrays bzw. des Structs zu vergleichen.
 
Zuletzt bearbeitet:
Zurück
Oben