Zuweisung in SCL?

petzi

Level-1
Beiträge
255
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

ich habe eine Frage zu SCL...

Es soll z.B. über einen Merker, der an anderer Stelle gesetzt wird, eine Lampe einschaltet werden. Über einen Taster (Öffner) soll die Lampe wieder ausgeschaltet werden können:

Code:
IF "Merker" THEN
  "Lampe" := 1;
ELSIF NOT "Taster" THEN
  "Lampe" := 0;
END_IF;

Nur klappt ja nun das Ausschalten nicht, weil der Merker noch immer den Status 1 hat und somit die Lampe sofort wieder eingeschaltet wird.

In FUP lässt sich so etwas ja über die Rücksetzdominanz eines SR-Gliedes bewerkstelligen.

In SCL könnte ich es evtl. über Flanken lösen - oder gibt es hier auch so etwas wie eine Rücksetzdominanz?


Vielen Dank!
 
Hallo Zusammen,

ich habe eine Frage zu SCL...

Es soll z.B. über einen Merker, der an anderer Stelle gesetzt wird, eine Lampe einschaltet werden. Über einen Taster (Öffner) soll die Lampe wieder ausgeschaltet werden können:

Code:
IF "Merker" THEN
  "Lampe" := 1;
ELSIF NOT "Taster" THEN
  "Lampe" := 0;
END_IF;

Nur klappt ja nun das Ausschalten nicht, weil der Merker noch immer den Status 1 hat und somit die Lampe sofort wieder eingeschaltet wird.

In FUP lässt sich so etwas ja über die Rücksetzdominanz eines SR-Gliedes bewerkstelligen.

In SCL könnte ich es evtl. über Flanken lösen - oder gibt es hier auch so etwas wie eine Rücksetzdominanz?


Vielen Dank!

Wenn du in FUP/KOP das mit einem SR glied machst und den "Taster" wieder los lässt und der "Merker" noch gesetzt ist wird auch die Lampe wieder eingeschaltet!In Prinzip ist das jetzt genau die Funktion die ein SR Glied macht!
Oder liege ich falsch?!
Mfg
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Oder liege ich falsch?!
Sehe ich auch so ...
SCL macht bei identischer Programmierung schlußendlich das Gleiche wie KOP,FUP,AWL - manchmal sogar besser ;)

@Petzi:
Wenn das bei dir nicht funktioniert dann liegt es an der Ausführung und nicht an SCL ...

Gruß
Larry
 
Dein Code macht genau das was du programmiert hast ;-)

Daher z.B. erst das

Code:
IF "Taster" THEN

  "Merker" := 0;
END_IF;

dann -von mir aus- das:
Code:
IF "Merker" THEN
  "Lampe" := 1;
ELSIF NOT "Taster" THEN
  "Lampe" := 0;
END_IF;

Frank
 
oder gibt es hier auch so etwas wie eine Rücksetzdominanz?

Die Rücksetzdominanz hängt ja nur mit der Aufrufreihenfolge zusammen. Das was den Merker als letztes beschreibt, ist dominant.

Bei Deinem Beispiel ändert sich die Dominanz auch, wenn Du aus dem ELSIF ein End IF und IF für die nächste Zeile machst...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn du in FUP/KOP das mit einem SR glied machst und den "Taster" wieder los lässt und der "Merker" noch gesetzt ist wird auch die Lampe wieder eingeschaltet!In Prinzip ist das jetzt genau die Funktion die ein SR Glied macht!
Oder liege ich falsch?!
Mfg

Nein, liegst natürlich nicht falsch - sorry, habe Mist geschrieben...


Die Rücksetzdominanz hängt ja nur mit der Aufrufreihenfolge zusammen. Das was den Merker als letztes beschreibt, ist dominant.

Bei Deinem Beispiel ändert sich die Dominanz auch, wenn Du aus dem ELSIF ein End IF und IF für die nächste Zeile machst...

Aber dennoch würde doch auch dann die Lampe sofort wieder eingeschaltet werden, da ja der Merker noch immer gesetzt ist, oder?

Dank' Euch!
 
Mit dem ELSIF erhält man keine Rücksetzdominanz.

Der "Denkfehler" liegt darin, dass der ELSIF-Zweig ausgeführt wird.

Es ist aber so, dass ELSIF nur dann ausgeführt wird, wenn die IF-Abfrage nicht wahr ist. Wenn die IF-Abfrage, also "Merker" = TRUE erfüllt ist, wird der ELSIF-Zweig eben nicht ausgeführt.

Vorschlag: 2x IF ... END_IF nehmen. Die 2. Bedingung hat dann Dominanz.
 
Ich denke mal, was der TE braucht ist eine positive Flanke vor dem S eines SR-Glieds. Sein Problem, wenn ich es richtig verstanden habe, ist, das die Lampe wieder angeht, sobald die Rücksetzbedingung nicht mehr da ist, aber die Setz-Bedingung noch ansteht. In FUP ist das einfacher als im SCL.

@petzi: In SCL musst Du den Zustand des Merkers zwischenspeichern um festzustellen, dass er sich geändert hat. Das sieht folgendermaßen aus:

Code:
IF bMerker AND NOT bMerkerGespeichert THEN   
  bLampe := TRUE;
END IF;
bMerkerGespeichert := Merker;
IF NOT bTaster THEN 
  bLampe := FALSE; 
END_IF;

Die erste Bedingung wird jetzt nur noch für einen SPS-Zyklus ausgeführt, wenn der Merker einen Flankenwechsel nach True durchführt.

Ich hoffe, dass es das ist, wonach Du gesucht hast.
 
@asci25: Das mit der Flanke wusste ich schon, deshalb hatte ich ja in meinem Eröffnungsthread geschrieben:

In SCL könnte ich es evtl. über Flanken lösen - oder gibt es hier auch so etwas wie eine Rücksetzdominanz?

@Tigerente1974: Ja, das ist es auf was ich hinauswollte, bzw. das war mein Fehler, dass ich nicht berücksichtigt hatte, dass ELSIF ja nicht immer ausgeführt wird...


Sorry, dass ich mich so undeutlich ausgedrückt hatte und vielen Dank für eure Hilfe!
 
Hallo Zusammen,

ich habe eine Frage zu SCL...

Es soll z.B. über einen Merker, der an anderer Stelle gesetzt wird, eine Lampe einschaltet werden. Über einen Taster (Öffner) soll die Lampe wieder ausgeschaltet werden können:


Wie wär es denn mit zwei unabhänigen IF-Abfragen? Du hast ja auch zwei Signlageber.

Code:
IF "Merker" THEN
  "Lampe" := TRUE;
END_IF;

IF NOT "Taster" THEN
   "Lampe" := FALSE;
END_IF;

Im FUP kann man ja auch einen "SETZ"- und einen "RÜCKSETZ"-Baustein nehmen!


Oder wenn Du nur auf den Tastmoment reagieren willst, dann natürlich mit Flankenerkennung:

Code:
IF "Merker" AND NOT "Signal_letzter_Zyklus" THEN
  "Lampe" := TRUE;
END_IF;

IF NOT "Taster"  AND NOT "Signal_letzter_Zyklus" THEN
   "Lampe" := FALSE;
END_IF;

IF "Merker" OR NOT "Taster" THEN
  "Signal_letzter_Zyklus" := TRUE;
ELSE
  "Signal_letzter_Zyklus" := FALSE;
END_IF;
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Oder wenn Du nur auf den Tastmoment reagieren willst, dann natürlich mit Flankenerkennung:

Code:
IF "Merker" AND NOT "Signal_letzter_Zyklus" THEN
  "Lampe" := TRUE;
END_IF;

IF NOT "Taster"  AND NOT "Signal_letzter_Zyklus" THEN
   "Lampe" := FALSE;
END_IF;

IF "Merker" OR NOT "Taster" THEN
  "Signal_letzter_Zyklus" := TRUE;
ELSE
  "Signal_letzter_Zyklus" := FALSE;
END_IF;

Was du da schreibst ist das das selbe was bereits gepostet wurde nur mit etwas mehr(komplizierterem) Code :)
siehe:
(die beste Lösung meiner Meinung nach)

Ich denke mal, was der TE braucht ist eine positive Flanke vor dem S eines SR-Glieds. Sein Problem, wenn ich es richtig verstanden habe, ist, das die Lampe wieder angeht, sobald die Rücksetzbedingung nicht mehr da ist, aber die Setz-Bedingung noch ansteht. In FUP ist das einfacher als im SCL.

@petzi: In SCL musst Du den Zustand des Merkers zwischenspeichern um festzustellen, dass er sich geändert hat. Das sieht folgendermaßen aus:

Code:
IF bMerker AND NOT bMerkerGespeichert THEN   
  bLampe := TRUE;
END IF;
bMerkerGespeichert := Merker;
IF NOT bTaster THEN 
  bLampe := FALSE; 
END_IF;

Die erste Bedingung wird jetzt nur noch für einen SPS-Zyklus ausgeführt, wenn der Merker einen Flankenwechsel nach True durchführt.

Ich hoffe, dass es das ist, wonach Du gesucht hast.
 
Ja Sorry ich998, hab ich ganz überlesen! Kein Grund zum aufregen, Du stehst ja mit Deiner Lösung vor meiner!

Übrigends, viele Wege führen nach Rom. Und nicht immer ist der Kürzeste der Beste, das ist jedoch Geschmackssache und kann jeder für sich entscheiden. Welcher Code kürzer und welcher vieleicht besser zu lesen ist! Ich machs so und Du wie Du magst ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi zusammen,

ich weiß nicht ob es hier passt, versuche es einfach mal.

Ich komme mir ein wenig doof vor, dass ich hierzu einfach nichts eindeutig gefunden habe...
Und zwar was für Möglichkeiten von Mehrfachzuweisungen gibt es in SCL?

1. Den selben Code zwei mal schreiben, nur einer anderen Variable zuweisen ist jetzt nicht wirklich schön.

2. Nach der Zuweisung der die Zeil StatVar1 := StatVar2; hinzufügen.
ist auch nicht wirklich schön.

3.? Würden diese Zeilen funktionieren?
StatVar1, StatVar2 := In1 AND In2;
oder
StatVar1 := StatVar2 := In1 & In2;

Ich habe leider gerade nicht die Möglichkeit das zu testen, sonst hättet ich das gemacht.

Vielen Lieben Dank im Voraus
yasvegu
 
Zurück
Oben