Gilt das auch für alle anderen Variablen?
FlankenErkennungen nicht bedingt aufzurufen, sondern zyklisch, gilt eigentlich immer, so wie es weiter oben schon für den Aufruf von Timern erklärt worden war.
"Eigentlich" soll dabei bedeuten: Man ist damit auf der sicheren Seite, um auch kurze Impulse bzw. kurze ImpulsPausen nicht zu übersehen.
Ausnahmen von dieser Regel mögen zwar hin und wieder zweckmässig sein, müssen aber gründlich überlegt werden.
Das stroboskopartige Kopieren der Eingänge in ihr ProzessAbbild und das Kopieren des AusgangsProzessAbbildes auf die Ausgänge "zwischen" zwei Zyklen (also nach dem Durchlaufen eines Zyklus und vor dem nächsten ZyklusDurchlauf) bewirkt eine MomentAufnahme der Zustände in einem bestimmten ZeitRaster und sorgt für "klare Verhältnisse" und ein wenig Entprellung, aber auch dafür, dass Änderungen erst einige MilliSekunden später erkannt werden können, als es auf anderem Wege möglich wäre.
Das dürfte in den meisten Fällen genau das sein, was man haben will. Wenig Aufwand, weil das BetriebsSystem sich um die ProzessAbbilder kümmert und eine ausreichende Entprellung ausser in extrem hartnäckigen Fällen.
Ob dies, was hier speziell für die Eingänge gesagt wurde, auch für alle anderen ("die ganz normalen") Variablen gilt?
So richtig bedenkenlos vergleichbar sind die Variablen ja nicht mit Eingängen, die die Zustände von prellenden Relais-, Taster oder Schalter-Kontakten entsprechen.
Aber, wenn die Variablen ebenfalls nur in einem ZeitRaster ihren Zustand ändern können, sind gewisse Ähnlichkeiten auch nicht von der Hand zu weisen.
Aber ist das überhaupt relevant? Wofür?
Zyklus 2:
High-Signal an Variable 1 durch externen Tastendruck oder internes ändern des Bool Werts
Aufruf der Funktion R_TRIG
Vergleich mit aktuellen Variablen mit Abbild aus vor Zustand --> Flankenerkennung: TRUE
Wäre das so in etwa der Prozess?
Dann verstehe ich, dass wenn die Zeit zwischen zwei Tasks so groß ist, dass in dieser Zeit eine Variable den Zustand von LOW auf HIGH und wieder LOW wechselt, die SPS das überhaupt nicht merkt.
Ist das soweit korrekt?
Der umgekehrte Fall, dass ein Signal von Hi auf Lo wechselt und nach sehr kurzer Zeit wieder nach Hi zurück, ist genauso relevant.
Denn eine positivie Flanke kann nur erkannt werden, wenn zuvor der Lo-Zustand des Signals zuverlässig erkannt wurde und eine negative Flanke nur, wenn zuvor der Hi-Zustand des Signals zuverlässig zur Kenntnis genommen wurde.
Wenn ein (zu) kurzer Implus oder eine (zu) kurze ImpulsPause vom Programm nicht erkannt werden kann, gerät die FlankenErkennung "aus dem Trott".
Für die Funktion von Timern ist die Erkennung der Flanken von IN ganz entscheidend:
- die EinschaltVerzögerung (TON) startet die ZeitMessung mit der positiven Flanke und
- die AusschaltVerzögerung (TOF) startet die ZeitMessung mit der negativen Flanke von IN.
Übrigens:
Von der FlankenErkennung erwartet man, dass das Ergebnis genau 1 Zyklus lang auf TRUE geht. D.h. aber auch, dass die nächste Flanke frühestens im übernächsten Zyklus erkannt/gemeldet werden kann. Das bedeutet aber auch, dass eine Flanke, die in einer Task erkannt wird, nicht sinnvoll in einer anderen Task (z.B. mit kürzerer oder längerer ZyklusZeit) ausgewertet werden kann.
Nein, es ist kein Allheilmittel, die zu bearbeitenden Aufgaben auf möglichst viele, von einander (scheinbar) unabhängige Task zu verteilen, denn die einzelnen Zweige müssen i.A. wieder "mühsam" zusammengeführt werden.
Die seit zig Jahren gängige Praxis, möglichst viele oder besser alle Aufgaben in einem einzigen TaktZyklus (oft "OB1-Zyklus" genannt) abzuhandeln, ist lange nicht so kontraproduktiv und auch nicht so unübersichtlich, wie ihr oft nachgesagt wird.
FlankenErkennungen werden oft benutzt, um Impulse eines EingangsSignals zu zählen. Das bisher Gesagte gilt für Zähler selbstverständlich auch.
Manchmal genügt es aber nicht, nur in jedem zweiten Zyklus weiterzählen zu können. Manchmal hat man Fälle, in denen in jedem Zyklus weitergezählt werden muss oder sogar mehrfach pro Zyklus.
Das geht auch, indem man das IN-Signal manipuliert. Jedesmal, wenn gezählt werden soll, den Zähler zweimal aufrufen: einmal mit IN := FALSE und einmal mit IN := TRUE.
Wenn es sehr genau sein muss, funktioniert das mit den Timern nicht.
Stimmt. Aber was heisst "sehr genau"? Wo soll sich die sehr genaue Zeit auswirken?
An einem Ausgang der SPS?
Im Programm in einer bestimmten (anderen?) Task?
Wir haben es hier mit der digitalen Verarbeitung von irgendwas zu tun.
Digital ist aber nicht automatisch genauer als analog.
Zählen gelingt mit FestPunktZahlen sehr genau.
Das Digitalisieren von analogen Grössen verschlechtert aber die Genauigkeit, insofern Stufen in das Signal eingebaut werden, die im analogen Original nicht vorhanden sind.