Nichts desto trotz hätte ich gerne gewusst, warum ich hier ein SET brauche.
StoppeMessung : SET //überflüssig
Wenn ich es nicht hinschreibe, kommt ein Übersetzungsfehler. Ich war nämlich auch der Meinung, dass es überflüssig ist.
Hinter einer Sprungmarke muß eine Anweisung stehen. Das kann das "CALL ..." sein oder ein "NOP 0" oder irgendwas - wenn mir nichts besseres einfällt dann nehme ich gerne SET oder CLR, weil das kürzer getippt ist als "NOP 0" und garantiert das VKE abgrenzt in Fällen wo gesprungen wird ohne das VKE zu beeinflussen (wie z.B. JU, JZ, JM, ...). Für das VKE ist das "SET" in Deinem Code aber nicht nötig.
Wieso bekomme ich hier mit JC einen Übersetzungsfehler?
Die Fehlermeldung sollte Dir doch auch zeigen, wo/in welcher Zeile der Fehler ist. Ich vermute, es ist jeweils die Zeile mit dem "JC ..." nach dem CALL, weil JC das VKE auswerten will, an der Stelle das VKE aber "unbestimmt" ist.
Code:
...
JC StarteMessung //beende Verknüpfung, wenn VKE = 1 dann springe zur Marke
A #Lichtschranke_2 //beginne eine neue Verknüpfung und lade den Wert von #Lichtschranke_2
// ins VKE. (Hier ist es egal ob die Anweisung A oder O oder X ist!)
JC StoppeMessung //beende Verknüpfung, wenn VKE = 1 dann springe zur Marke
//wenn VKE = 0, dann springe nicht [COLOR="#0000FF"]und setze VKE = 1![/COLOR]
[COLOR="#0000FF"]//ab hier ist VKE immer 1 ![/COLOR]
[COLOR="#FF0000"]JCN[/COLOR] VerlasseBaustein //wenn VKE = 0 dann springe zur Marke, in jedem Fall setze VKE = 1
[COLOR="#FF0000"]//JCN nach JC ist ein Fehler, weil hier VKE immer 1 ist! --> JU verwenden![/COLOR]
...
StoppeMessung : SET //mit oder ohne SET ist hier das VKE auf 1 gesetzt
CALL RUNTIME
//ab hier ist das VKE "unbestimmt" und darf nicht ausgewertet werden
CALL MOVE
//hier ist das VKE "unbestimmt" und darf nicht ausgewertet werden
[COLOR="#FF0000"]JC[/COLOR] VerlasseBaustein [COLOR="#FF0000"]//JC will das unbestimmte VKE auswerten! Fehler![/COLOR]
Zu dem JC + JCN: ich habe das jetzt nicht ausprobiert weil ich das nie so verkompliziert programmiere (ich nehme in so einem Fall immer als zweites ein JU), aber laut "Hilfe zu AWL" kann Deine Variante nicht funktionieren, weil JC bei VKE = 0 das VKE auf 1 setzt! Daher muß nach JC ein JU kommen (oder ein weiteres JC
). Da hast Du genau die eine Variante gewählt die nicht funktioniert.
Code:
A ...
JC StoppeMessung
[COLOR="#FF0000"]JCN[/COLOR] VerlasseBaustein [COLOR="#FF0000"]//so funktioniert es nicht![/COLOR]
A ...
JC StoppeMessung
[COLOR="#008000"]JU[/COLOR] VerlasseBaustein [COLOR="#008000"]//so funktioniert es :-)[/COLOR]
A ...
JCN VerlasseBaustein
[COLOR="#0000FF"]JC[/COLOR] StoppeMessung [COLOR="#0000FF"]//so funktioniert es auch![/COLOR]
A ...
[COLOR="#0000FF"]JC[/COLOR] StoppeMessung
[COLOR="#0000FF"]JC[/COLOR] VerlasseBaustein [COLOR="#0000FF"]//so funktioniert es auch!!! ;-)[/COLOR]
Übrigens: In einer Hochsprache (wie z.B. SCL) schreibt man "IF (NOT) .. THEN ..
ELSE" (das entspricht "A .. JC(N) ..
JU") und nicht "IF .. THEN .. IF NOT .."
Tipp 1: Probiere die Varianten aus und beobachte, wie sie funktionieren.
Tipp 2: Wenn Du in AWL nicht ganz sicher bist, dann programmiere in FUP oder KOP.
Harald