Richtig wäre:
IF #IM THEN
#FM := TRUE;
ELSEIF
NOT #IN THEN
#FM := FALSE;
END_IF
Ja, funktioniert so, aber unnötig umständlich ist es immer noch. Und es ist der SpezialFall nur für die Erkennung positiver Flanken.
#FM := #IN; anstelle der If-Else-Konstruktion reicht völlig aus und gilt gleichermassen, wenn man positive, negative oder alle Flanken erkennen möchte:
Code:
#ImpulsBeiPosFlanke := #IN AND NOT #FM; // diese Zeile kann entfallen, falls Impuls an positiver Flanke nicht benötigt
#ImpulsBeiNegFlanke := NOT #IN AND #FM; // diese Zeile kann entfallen, falls Impuls an negativer Flanke nicht benötigt
#ImpulsBeiJederFlanke := #IN XOR #FM; // diese Zeile kann entfallen, falls Impuls an jeder Flanke nicht benötigt
#FM := #IN;
Das Schema ist sooo einfach, dass sogar Siemens in Haralds Link aus #5 sagt:
"Im Gegensatz zu anderen Programmiersprachen existieren in SCL (Structured Control Language) keine speziell für die Flankenauswertung von Signalen verwendbaren Anweisungen.
Aus diesem Grund wird bei SCL mit einer Hilfsvariablen gearbeitet. Damit ist eine schnelle Bearbeitung der Befehle gegeben
und das Programm bleibt übersichtlich."
so dass ich immer Mühe habe, zu verstehen, warum man geglaubt hat, für andere Sprachen (KOP, FUP, AWL, …) spezielle, vorgefertigte Lösungen anbieten zu müssen.
Wie man u.a. hier im Forum immer wieder sieht, verführen diese speziellen Lösungen leider dazu, dass viele nicht wirklich verstehen, wie einfach das Prinzip ist und worauf es ankommt.
PS:
Mit der SiemensFormulierung "Aus diesem Grund wird bei SCL mit einer Hilfsvariablen gearbeitet." bin ich übrigens nicht einverstanden, weil sie suggeriert, dass die "speziellen Lösungen" die Hilfsvariable nicht benötigen. Dem ist nicht so. Alle FlankenErkennungen von Bits benötigen einen eigenen "FlankenMerker" (der nicht unbedingt ein Merker im Sinne von S5, S7, … sein muss), der nicht auch anderweitig benutzt werden darf und im folgenden Zyklus unverändert zur Verfügung stehen muss.