# wofür sind SET und CLR bei S7 VKE-begrenzend?



## Perfektionist (1 Juli 2010)

für eine VKE-Begrenzung kann ich ja jederzeit schreiben:
	
	



```
= #temp_Dummy_bool
```
 
bei
	
	



```
SET
= "Ausgang"
```
ist die VKE-Begrenzung überflüssig.

bei
	
	



```
O "irgendwas"
CLR               // testhalber eingefügt
O "nochwas"
= "Ausgang"
```
bzw.
	
	



```
O "irgendwas"
[B]SET[/B]               // testhalber eingefügt
O "nochwas"
= "Ausgang"
```
habe ich durch die VKE-Begrenzung jeweils ein identisches Resultat. Ich hätte auch schreiben können:
	
	



```
O "irgendwas"
= #temp_Dummy_bool
O "nochwas"
= "Ausgang"
```
 
Im dem Beispiel hätte ich einen Nutzen davon, wenn SET und CLR nicht VKE-begrenzend wären. Daher frage ich mich gerade, wofür SET und CLR VKE-begrenzend designed wurden. Kennt jemand ein Beispiel, wo es nützlich ist, dass SET und CLR das VKE begrenzen?


----------



## Larry Laffer (1 Juli 2010)

Hallo Perfektionist,
ich kann dir da zwar kein Beispiel für die Sinnhaftigkeit liefern - ich bin aber auch noch nie auf die Idee gekommen das so verwenden zu wollen - dafür habe ich meine Merker "Null" bzw. "Eins" (oder "True" und "False" - je nach Geschmack).

Allerdings - wie würdest du sonst eine VKE-Begrenzung realisieren wollen ? Man könnte dann ja auch fragen, warum Zuweisungen das VKE begrenzen ...

Gruß
Larry


----------



## Perfektionist (1 Juli 2010)

Larry Laffer schrieb:


> ... dafür habe ich meine Merker "Null" bzw. "Eins" ...


zu S5-Zeiten, da schrieb ich auch
	
	



```
U "irgendwas"
O "Eins"   // zum Test
= "Ausgang"
```
bei S7 wurde daraus: 
	
	



```
U "irgendwas"
SET
= "Ausgang"
```
 
mir ist aber erst neulich aufgefallen, dass so ein "O Eins" universeller anwendbar ist, als der SET-Befehl.



Larry Laffer schrieb:


> ...
> Man könnte dann ja auch fragen, warum Zuweisungen das VKE begrenzen ...


in anderen SPS-Dialekten gibt es dieses /ER-Flag nicht. Da wird ein "frisches" VKE direkt mit dem LD-Befehl auf den VKE-Stack geladen. Da aber S5/7 in dieser Hinsicht anders strukturiert ist, behandelt Step eine "Verknüpfung" nach einer Zuweisung eben nicht als Verknüpfung, sondern in der Art eines Ladebefehls.


----------



## Rudi (1 Juli 2010)

Auf jeden Fall hast Du Deinen Namen anscheinend richtig gewählt.
Ich neige eher immer dazu gegebenes hinzunehmen ohne den Sinn ergründen zu wollen.


----------



## Perfektionist (1 Juli 2010)

Rudi schrieb:


> ...
> Ich neige eher immer dazu gegebenes hinzunehmen ohne den Sinn ergründen zu wollen.


jetzt muss ich aber aufmerksam auf meinen Schatten aufpassen und über diesen springen, um das nicht als allgemeine Handlungsempfehlung aufzufassen. Denn getreu meines Nick würde ich das nun tun ...


----------



## eYe (1 Juli 2010)

Perfektionist schrieb:


> bei S7 wurde daraus:
> 
> 
> 
> ...



Wozu genau dient das SET? Würde der "Ausgang" ohne SET nicht auch durch "irgendwas" angesteuert werden, oder spielt da eventuell noch das VKE aus dem vorherigen Netzwerk eine Rolle?
Wenn ja sollte ich dringend alle meine bisherigen Programme korrigieren! :shock:


----------



## IBFS (1 Juli 2010)

Bei uns heißt das SET auch gern 

Angst-SET

weil 



```
..
U E5.5
U E5.6
=  A5.0
 
 
 
SET
U E1.1
U E1.2
= A1.2
```
 
Das hier sieht ja noch sehr einfach aus aber wenn man im 
Stress während der IB ein paar Zeilen vom 
oberen Konstrukt auskommentiert - speziell das = A5.0 - dann
ist natürlich die Anfangs-VKE für die unteren zwei U Ex.x falsch
und der Ausgang bleibt aus.

Daher habe ich mal gelernt:


```
CLR
O M x.x
O M x.y
= M x.z
 
SET
U M x.x
U M x.y
= M x.z
```
 
Die Gurus hier können ja sagen ob das Käse ist.

Gruß

Frank




wenn man jetzt


----------



## Paule (1 Juli 2010)

IBFS schrieb:


> Daher habe ich mal gelernt:
> 
> 
> ```
> ...


Hallo Frank,
von wem hast Du denn das gelernt?
Du schreibst das vor jede Zuweisung?
Und was schreibst bei einem gemischten UND / ODER?

```
O M x.x
   O M x.y
   U M x.z
   = M a.a
```
Fakt ist doch, das nach jeder Zuweisung eine Erstabfrage erfolgt.
Und da brauche ich nicht vorher ein VKE beeinflussen.
Bei einem Sprung muss ich mich natürlich entscheiden ob ich je nach Sprungbefehl das VKE mitnehmen oder ignorieren will.
Und ich denke da werden auch die meisten Fehler passieren.
Das von Dir beschriebene Auskommentieren der Zuweisung ist natürlich ein grober Fehler.
Aber kannst Du jeden Programmierfehler durch das Programm abfangen?


----------



## MarkusP210 (2 Juli 2010)

```
CLR
O M x.x
O M x.y
= M x.z
 
SET
U M x.x
U M x.y
= M x.z
```
 
Tja, Jede Performance ist kleinzukriegen...mit genügend (unnötigen) Befehlen 

Aber trotzem immer wieder erstaunlich zu sehen, welche Märchen kursieren.

Markus


----------



## MSB (2 Juli 2010)

MarkusP210 schrieb:


> Tja, Jede Performance ist kleinzukriegen...mit genügend (unnötigen) Befehlen
> 
> Aber trotzem immer wieder erstaunlich zu sehen, welche Märchen kursieren.


Im Prinzip gebe ich euch ja recht im Sinne von normalerweise unnötig,
im Gesamtkontext der von IBFS beschrieben wird, im Einzelfall sicher nicht schlecht.

Hier die entscheidende Stelle:


			
				IBFS schrieb:
			
		

> Stress während der IB ein paar Zeilen vom
> oberen Konstrukt *auskommentiert - speziell das = A5.0* - dann
> ist natürlich die Anfangs-VKE für die unteren zwei U Ex.x falsch
> und der Ausgang bleibt aus.



Mfg
Manuel


----------



## Perfektionist (2 Juli 2010)

eYe schrieb:


> Wozu genau dient das SET?


in dem Fall zum unbedingten Setzen des Ausgangs, als Überbrückung des "irgendwas"


----------



## Perfektionist (2 Juli 2010)

Paule schrieb:


> ... je nach Sprungbefehl das VKE mitnehmen ...


Da möchte ich anmerken, dass es da zwischen den von den Anzeigebits abhängigen Sprüngen und den von VKE-abhängigen Sprüngen einen entscheidenden Unterschied gibt: erstere lassen das Statuswort unberührt, ein SPB setzt das VKE und wirkt VKE-begrenzend.


----------



## rostiger Nagel (2 Juli 2010)

ich habe mir noch nicht soviele gedanken über die Befehle "SET" bzw. "CLR"
gemacht ich nutze Sie nur einfach.
Jetzt hab ich noch mal mein "Berger" Buch vorgeholt und folgendes gelesen.



> *VKE setzen und rücksetzen*
> Mit SET setzen Sie das Verknüpfungsergebnis auf "1" und mit CLR auf "0".
> Parallel dazu wird das Statusbit STA ebenfalls auf "1" bzw. auf "0" gesetzt.
> Beide Anweisungen werden unabhängig von Bedingungen ausgeführt.
> ...


 
soweit das Lehrbuch....

Das blöde bei Step 7 ist das Sie kein Binären Ladebefehl für eine Eindeutige
Erstabfrage wie andere haben als Beispiel.


```
[COLOR=deepskyblue]LX[/COLOR] M x.x  
O M x.y
= M x.z
 
 
[COLOR=deepskyblue]LX[/COLOR] M x.x
U M x.y
= M x.z
```
 
Achtung die Anweisung "LX" gibt es nicht, aber könnte einiges Einfacher
machen. Na ja vlt. kommt das in STEP 9 :roll:


----------



## Thomas_v2.1 (2 Juli 2010)

Wenn man sich schon solche Gedanken macht, habe ich auch eine Frage:

Wo stört es denn dass SET und CLR VKE-begrenzend sind?


----------



## Perfektionist (2 Juli 2010)

Thomas_v2.1 schrieb:


> Wo stört es denn dass SET und CLR VKE-begrenzend sind?


ich frage nicht: "wo stört es?". ich frage: "wo nutzt es?". Es stört nicht - aber ich glaube, die zwei Befehle wären universeller anwendbar, wären sie nicht VKE-begrenzend. Und nun suche ich Gründe dafür, dass es doch nutzt, dass sie VKE-begrenzend sind. Weil ich die Dinge ungern einfach so hinnehme, wie sie sind, sondern den Dingen gerne auf den Grund gehe.

@Helmut: Diesen LX-Befehl, wie Du ihn nennst, den gibt es tatsächlich bei Siemens auch - in der 200er nämlich. Aber zugegeben: das ist auch keine echte Siemens-Steuerung. Tückisch für jemanden, der die automatische VKE-Begrenzung von Step her gewohnt ist. Viel zu oft beginne ich da aus Versehen eine Verknüpfung mit U statt mit LD.


----------



## Thomas_v2.1 (2 Juli 2010)

Perfektionist schrieb:


> ich frage nicht: "wo stört es?". ich frage: "wo nutzt es?". Es stört nicht - aber ich glaube, die zwei Befehle wären universeller anwendbar, wären sie nicht VKE-begrenzend. Und nun suche ich Gründe dafür, dass es doch nutzt, dass sie VKE-begrenzend sind. Weil ich die Dinge ungern einfach so hinnehme, wie sie sind, sondern den Dingen gerne auf den Grund gehe.



Vielleicht hatten die Siemens-Entwickler auch keinen Grund gesehen dass es stört, und die jetzige Funktionsweise war einfacher oder billiger in einen Chip zu gießen?


----------



## Blockmove (2 Juli 2010)

Perfektionist schrieb:


> ich frage nicht: "wo stört es?". ich frage: "wo nutzt es?". Es stört nicht - aber ich glaube, die zwei Befehle wären universeller anwendbar, wären sie nicht VKE-begrenzend. Und nun suche ich Gründe dafür, dass es doch nutzt, dass sie VKE-begrenzend sind.


 
Ich stimme dir vollkommen zu.
Fast jeder von uns definiert irgendwo feste 0- und 1-Merker und nutzt die Taktmerker. Aber halt leider jeder auf anderen Adressen. Insofern wäre ein festes "True" und "False" und feste Taktmerker sinnvoll und damit wäre auch das Verhalten von SET und CLR egal.

Gruß
Dieter


----------



## Perfektionist (2 Juli 2010)

Thomas_v2.1 schrieb:


> ... einfacher oder billiger ...


Bei S5 gab es die zwei Befehle noch nicht. Und man kann ohne sie leben. Das wäre einfach und billig gewesen.


----------



## rostiger Nagel (2 Juli 2010)

Perfektionist schrieb:


> Diesen LX-Befehl, wie Du ihn nennst, den gibt es tatsächlich bei Siemens auch - in der 200er nämlich. Aber zugegeben: das ist auch keine echte Siemens-Steuerung. Tückisch für jemanden, der die automatische VKE-Begrenzung von Step her gewohnt ist. Viel zu oft beginne ich da aus Versehen eine Verknüpfung mit U statt mit LD.


 
genau daher kenne ich das auch, warum kann Siemens nicht von Siemens
lernen. Warum haben die diese Befehle nicht drin, feste Taktmerker und
die Merker "1" und "0". Diese dürften nicht mal im Merkerbereich liegen 
sondern einen eigenen Speicherbereich bekommen meinetwegen System-
Merker "SM". Diese dürften dann nicht verändert werden, wozu auch und
sind dann auf jeder Steuerung mit Symbol an der selben stelle zu finden.

Mir passiert es fast in jeden neuen projekt das ich Symbolisch Taktmerker
aus einen anderen Projekt reinkopiere und vergesse diese in der Hardware
frei zu schalten.

So etwas in Preiswert in den Chip zu inpletieren kann eigentlich kein Problemm
sein oder warum ist die 1200er so preiswert.


----------



## PN/DP (2 Juli 2010)

*SET und CLR*

Ich möchte auch was zum Thema beitragen, doch leider hat mich die Telekom mit einem stundenlangen Totalausfall 
von Festnetz, Mobil und Internet gehindert, meinen Beitrag schon heute morgen zu präsentieren.
Nun, hier ist er:

Für mich ist es eigentlich ganz logisch, daß SET und CLR VKE-begrenzend wirken müssen.

SET heißt: 
Setze jetzt das VKE auf 1 - unabhängig davon, was eine eventuelle vorherige Verknüpfung bis dahin ergeben hat! 
Da dadurch vorherige Verknüpfungen hinfällig werden (so als wenn sie gar nicht stattgefunden hätten), ist die 
*nach* dem SET folgende Verknüpfungsoperation logischerweise *der Beginn einer neuen Verknüpfung*.
Weil nun eine neue Verknüpfung beginnt, muß das VKE hier begrenzt sein.
(Das gilt für CLR ganz genauso, nur wird dabei das VKE auf 0 gesetzt.)

Daß SET und CLR VKE-begrenzend sind, war für die S7-Sprachdesigner also keine Ermessensfrage.

Das einzig merkwürdige dabei ist, daß SET und CLR gar nicht selber in die nachfolgende Verknüpfung mit eingehen:

```
SET
U "nochwas"
= "Ausgang"
```
und

```
CLR
U "nochwas"
= "Ausgang"
```
haben das selbe Ergebnis: "Ausgang" bekommt den Zustand von "nochwas" zugewiesen.
Egal ob die Befehlsfolge mit SET oder CLR beginnt!

Das kommt daher, daß SET und CLR für die VKE-Begrenzung das Erstabfragebit /ER im Statuswort auf 0 schreiben 
und dadurch die nächste Bitverknüpfungs-Operation eine VKE-Lade-Operation wird und dabei das durch SET bzw. 
CLR verursachte VKE ohne Verknüpfung einfach überschrieben wird.


Der eigentliche Zweck von SET und CLR ist, das VKE einfach und *verknüpfungslos* auf einen definierten 
Zustand zu bringen, um es für nachfolgende Zuweisungen (z.B. für das BIE-Bit) direkt verwenden zu können, ohne 
wie in S5 extra 1- und 0-Merker benutzen zu müssen. Besonders in gekapselten Bausteinen und S7-"Makros" wäre es 
ohne SET und CLR umständlicher, das VKE auf einen definierten Zustand zu bringen, ohne Variablen zu verknüpfen 
und ohne die Akkus zu verändern.
Praktisch werden SET und CLR aber nur selten wirklich benötigt.

Nach meiner Erfahrung werden SET und CLR jedoch zu über 90% als Angst-SET benutzt, wie schon von IBFS erwähnt.
Besonders nach VKE-abhängigen bedingten Sprüngen (SPB/SPBN/SPBB/SPBNB) sehe ich oft:

```
U "Bedingung"
SPB M001
SET
S "Bedingung_nicht_erfüllt"
...
```
Das SET ist hier völlig überflüssig, weil SPBxx auf jeden Fall das VKE=1 (und /ER=0) schreiben.
Das SET hilft höchstens, die Verständlichkeit dieses Programmteils für Programmier-Anfänger zu erhöhen.

Weil SET und CLR vorherige Verknüpfungen komplett überflüssig machen und deshalb in Verknüpfungen sinnlos sind, 
gibt es diese Operationen nicht in FUP und KOP.

Gruß
Harald


----------



## PN/DP (2 Juli 2010)

Perfektionist schrieb:


> zu S5-Zeiten, da schrieb ich auch
> 
> 
> 
> ...


Das kann man heute in S7 noch genauso schreiben und tut es auch.



Perfektionist schrieb:


> bei S7 wurde daraus:
> 
> 
> 
> ...


Diese Variante würde ich eher als unüblich bezeichnen (für mich ist das auch nicht ganz das selbe).
Außerdem bewirkt die Verwendung von SET, daß das Netzwerk nicht mehr in FUP/KOP darstellbar ist.

Ich benutze für Testzwecke immer die erste Variante (Verknüpfung des "Eins"-Merkers), weil diese Variante 
in AWL, FUP und KOP gleichermaßen anwendbar ist.



IBFS schrieb:


> Daher habe ich mal gelernt:
> 
> 
> ```
> ...


Das sieht zwar besonders durchdacht aus, ist aber Käse, weil es völlig egal ist, ob die Befehlsfolge mit 
SET oder CLR beginnt. Leute, die sowas anderen beibringen, haben SET und CLR nicht richtig verstanden 
oder S7 mit einer anderen Programmiersprache verwechselt.

```
SET
O M x.x
O M x.y
= M x.z
 
CLR
U M x.x
U M x.y
= M x.z
```
bringen haargenau das gleiche Ergebnis. [EDIT] wie die zitierte IBFS-Variante.

Weil SET und CLR das Erstabfragebit /ER=0 schreiben, wird die nächste Verknüpfungsoperation eine 
VKE-Lade-Operation, die das hier durch SET bzw. CLR verursachte VKE ohne Berücksichtigung einfach 
überschreiben. Erst die zweite Verknüpfungsoperation verknüpft das VKE.

Gruß
Harald


----------



## Thomas_v2.1 (2 Juli 2010)

PN/DP schrieb:


> Für mich ist es eigentlich ganz logisch, daß SET und CLR VKE-begrenzend wirken müssen.
> 
> SET heißt:
> Setze jetzt das VKE auf 1 - unabhängig davon, was eine eventuelle vorherige Verknüpfung bis dahin ergeben hat!
> ...



Und aus welchem Grund wird dann das /ER Flag im Statuswort auf 0 gesetzt? Dir scheint es nur um das VKE zu gehen. Das hätte man auch auf 1 setzen können ohne das /ER abzufragen oder nach der Operation auf 0 zu setzen.


----------



## Perfektionist (3 Juli 2010)

PN/DP schrieb:


> ... war für die S7-Sprachdesigner also keine Ermessensfrage.
> ...


Ich habe nun lange hin und herüberlegt, ob, wann etc. diese VKE-Begrenzung in Zusammenhang mit Rückgabewerten von Bausteinen nützlich sein könnte. Entweder im BIE oder auch direkt im VKE. In dem Zusammenhang habe ich bemerkt, dass der SAVE-Befehl nicht das VKE begrenzt. Verwundert aber war ich darüber, dass ich fand, dass der BEA-Befehl das VKE begrenzt. Dieser Befehl (man korrigiere mich, wenn ich jetzt Unwahrheiten schreibe) wird grundsätzlich am Bausteinende ausgeführt. Ganz egal, ob er dasteht oder nicht. Gut: BEB und SPB wirken (m.E. zurecht) auch VKE-begrenzend, auch CALL und UC. Aber der Befehl SPA nicht.

Will sagen: ich finde das gar nicht so offensichtlich, dass SET und CLR VKE-begrenzend sein müssen.


----------



## The Blue (5 Juli 2010)

Also 1 und 0 Merker Benutze ich wenn nur temporär, da ich bei Bitverarbeitungen gerne FUP nutze.
Diese setze ich dann mit SET bzw CLR.

Das hat den Hintergrund,
das ich Bausteine aus einem Projekt ins andere kopieren kann,
ohne mir Gedanken zu machen, welche Merker jetzt welchen Zustand unbedingt haben müssen.


----------

