# Zuweisung in SCL?



## petzi (11 April 2012)

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:


```
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!


----------



## SCM (11 April 2012)

petzi schrieb:


> Hallo Zusammen,
> 
> ich habe eine Frage zu SCL...
> 
> ...



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


----------



## Larry Laffer (11 April 2012)

SCM schrieb:


> 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


----------



## IBFS (11 April 2012)

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

Daher z.B. erst das


```
IF "Taster" THEN

  "Merker" := 0;
END_IF;
```

dann -von mir aus-  das:

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

Frank


----------



## asci25 (11 April 2012)

petzi schrieb:


> 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...


----------



## petzi (11 April 2012)

SCM schrieb:


> 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... 




asci25 schrieb:


> 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!


----------



## Tigerente1974 (11 April 2012)

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.


----------



## asci25 (11 April 2012)

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:


```
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.


----------



## Tigerente1974 (11 April 2012)

Da kann man jetzt nur spekulieren. Aufgrund der Frage nach der Rücksetzdominanz hatte ich das anders verstanden. Auf jeden Fall gibt es jetzt Ansätze in mehreren Richtungen...


----------



## petzi (12 April 2012)

@asci25: Das mit der Flanke wusste ich schon, deshalb hatte ich ja in meinem Eröffnungsthread geschrieben:



petzi schrieb:


> 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!


----------



## MCerv (12 April 2012)

petzi schrieb:


> 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.


```
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:


```
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;
```


----------



## ich988 (12 April 2012)

MCerv schrieb:


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



 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)



asci25 schrieb:


> 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:
> 
> ...


----------



## MCerv (12 April 2012)

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


----------



## ich988 (12 April 2012)

Also aufgeregt hat sich hier niemand


----------



## yasvegu (30 Oktober 2020)

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


----------



## PN/DP (30 Oktober 2020)

yasvegu schrieb:


> was für Möglichkeiten von Mehrfachzuweisungen gibt es in SCL?


Seit TIA V14 (2016) geht das so:

```
StatVar1 := StatVar2 := In1 & In2;
```

Harald


----------

