Step 7 Verständnisfrage zu TEMP-Variablen

spirit

Level-1
Beiträge
961
Reaktionspunkte
23
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebes Forum,

ich übe grad a bisserl mit TEMP-Variablen und wollte folgendes einfache Beispiel aus dem Link Flankenauswertung in Step 7 (von Harald) ausprobieren...

Wenn ich schreibe

Code:
      L     MW   202
      INVI  
      L     MW   200
      T     MW   202
      UW    
      U     <>0
      S     M     14.7

funktioniert soweit alles wie gewollt; d.h. der Merker lässt sich rücksetzen, nachdem er gesetzt wurde.

Wenn ich nun schreibe

Code:
      L     #speicher
      INVI  
      L     MW   200
      T     #speicher
      UW    
      U     <>0
      S     M     14.7

und #speicher als TEMP im FC deklariert wurde, so lässt sich der Merker nur dann rücksetzen, wenn der Vergleich tatsächlich Null ist.

Woran liegt das; warum funktioniert hier die Sache mit einer Temp-Variablen nicht? :confused:

Es muss doch Nichts über den Zyklus hinaus gespeichert werden...
 
Und wie ist #speicher initialisiert? Dieser Wert liegt auf dem Stack und hat einen zufälligen Inhalt. Und somit macht die L-Operation keinen Sinn. Und die T-Opoeration auch nicht, da das Ergebnis nach dem FC-Aufruf im elektronischen Orbit landet.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke Rainer,

aber das verstehe ich irgendwie nicht! Ich rufe doch die FC auf und Lade die Temp-Variable und beschreibe diese im gleichen Zyklus auch wieder. Nach dem FC-Aufruf ist doch schon längst alles vorüber...

Habe dazu auch ein Zitat von Larry gefunden:

Eine Temp-Variable ist sinnvoll dann eingesetzt, wenn man sie z.B. zur Bildung eines Zwischen-Ergebnisses (ob nun Binär oder Dezimal ist unerheblich) verwendet, das man dann in der weiteren Folge des Bausteins (also nach der Wert-Zuweisung) weiter verwenden möchte.

Genau das passiert doch hier, oder?
 
Du verwendenst den Inhalt einer Temp-Variablen (L #speicher) ohne dass diese initialisiert wird. Was erwartest Du, dass hier passieren soll?
 
Eine Temp-Variable ist nur in dem Baustein gültig, in dem sie deklariert wurde.
Bevor du sie im Baustein verwendest, mußt du sie initialisieren, denn es steht sonst ein zufälliger Wert darin.

Das bedeutet, wenn der Baustein aufgerufen wird, wird für die Temp-Var ein Bereich auf dem lokalen Stack belegt. Dort kann vorher ein anderer Baustein Werte zwischengelagert haben, also nehmen die Temp-Var des aktuellen Bausteins, diese "zufälligen" Werte an. Wenn du dann die Temp-Var als Wwischenspeicher im Baustein nutzt, mußt du also zuerst einmal etwas darauf schreiben. Ist der Baustein bearbeitet, wird der lokale Stack wieder freigegeben, der nächste Baustein kann ihn nutzen.

Achtung, wenn kein anderer Baustein auf den lokalen Stack schreibt (z.Bsp. nur ein Baustein im Test-Programm) kann es sogar funktionieren, weil der Wert im Stack von keinem anderen Baustein überschrieben wird. Das ändert sich dann aber garantiert in einem komplexeren Programm.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Eine Temp-Variable ist nur in dem Baustein gültig, in dem sie deklariert wurde.
Bevor du sie im Baustein verwendest, mußt du sie initialisieren, denn es steht sonst ein zufälliger Wert darin.

Das bedeutet, wenn der Baustein aufgerufen wird, wird für die Temp-Var ein Bereich auf dem lokalen Stack belegt. Dort kann vorher ein anderer Baustein Werte zwischengelagert haben, also nehmen die Temp-Var des aktuellen Bausteins, diese "zufälligen" Werte an. Wenn du dann die Temp-Var als Zwischenspeicher im Baustein nutzt, mußt du also zuerst einmal etwas darauf schreiben.

Ok, das verstehe ich!

Wenn ich das jetzt so mache, dann steht in der Temp-Variable ja kein zufälliger Wert mehr drin:

Code:
      L     0
      T     #speicher          

      L     #speicher
      INVI  
      L     MW   200
      T     #speicher
      UW    
      U     <>0
      S     M     14.7


Geht aber trotzdem nicht.

Frage: Wie müsste ich das dann umschreiben, dass ich #speicher als TEMP so an dieser Stelle einsetzen kann? :confused:
 
Warum willst du absolut das #Speicher ein TEMP ist ??
Ein TEMP ist per Definition kein "Speicher" wie Ralle es ausführlich erklärt hat.

Lösung 1: #speicher als IN_OUT deklarieren, anstatt TEMP. Dann muss der aufrufende Baustein den #speicher Pin ein Variabel zuweisen (und kein TEMP !).

Lösung 2: Anstatt FC, ein FB programmieren, und #speicher als STAT deklarieren.
 
... Mal abgesehen davon ob temp. Variable oder nicht aber so hat das Harald sicher nicht aufgeschrieben! Du schreibst immer den Inhalt von deinem MW 200 in deinen Speicher und das vor der Wortverknüpfung! Der Sinn dahinter ist ja dass du im Speicher dann deine geflankten Bits stehen hast ;).
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Warum willst du absolut das #Speicher ein TEMP ist ??

Das ist nur eine Übung! Ich wollte das mit den TEMP-Var einfach nur mal verstehen...

Mir ist es klar, dass es auch über IN_OUT geht. Hätte es halt gerne über Temp versucht. Insofern muss es doch auch irgendwie über Temp machbar sein, oder nicht?
 
... Mal abgesehen davon ob temp. Variable oder nicht aber so hat das Harald sicher nicht aufgeschrieben! Du schreibst immer den Inhalt von deinem MW 200 in deinen Speicher und das vor der Wortverknüpfung! Der Sinn dahinter ist ja dass du im Speicher dann deine geflankten Bits stehen hast ;).

Nun, der Code funzt eigentlich schon; d.h. immer wenn ein neues Bit hinzukommt kann gemeldet werden.

Es geht halt nur nicht, wenn das mit dem #speicher über Temp gemacht wird...
 
Frage: Wie müsste ich das dann umschreiben, dass ich #speicher als TEMP so an dieser Stelle einsetzen kann? :confused:
Garnicht. Es geht nicht mit TEMP.
Der Sinn des Codes ist es, einen Zustand der jetzt vorliegt mit einem Zustand der vorher vorlag zu vergleichen. Um zu wissen, welcher Zustand vorher vorlag ist es unumgänglich, den Zustand vorher zu speichern, damit man ihn später (also jetzt) auswerten kann. TEMP kann aber nicht zuverlässig speichern.


Wenn ich das jetzt so mache, dann steht in der Temp-Variable ja kein zufälliger Wert mehr drin:

Code:
      L     0
      T     #speicher          

      L     #speicher
      INVI  
      L     MW   200
      T     #speicher
      UW    
      U     <>0
      S     M     14.7


Geht aber trotzdem nicht.
Du kannst das Programm kürzen wie ein optimierender Compiler.
Da du einen konstanten Wert 0 in #speicher schreibst, kannst Du ebensogut die Konstante 0 direkt nutzen, da wo Du #speicher danach benutzt:
Code:
      L     0
//      T     #speicher          
//      L     #speicher
      INVI  
      L     MW   200
      T     #speicher
      UW    
      U     <>0
      S     M     14.7
Jetzt steht da nur noch ein einsames unnützes Schreiben auf #speicher.
- "L 0" + INVI ergibt immer 16#FFFF
- MW200 UW 16#FFFF ergibt immer MW200 --> es wird immer nur MW200 mit sich selber verglichen - wie soll da eine Veränderung festgestellt werden können?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... Mal abgesehen davon ob temp. Variable oder nicht aber so hat das Harald sicher nicht aufgeschrieben! Du schreibst immer den Inhalt von deinem MW 200 in deinen Speicher und das vor der Wortverknüpfung! Der Sinn dahinter ist ja dass du im Speicher dann deine geflankten Bits stehen hast ;).
Doch, das hat Harald genauso aufgeschrieben. ;)
Der Sinn ist tatsächlich, den Inhalt des MW200 in den Speicher zu schreiben und sich zu merken, nicht die geflankten Bits.

Harald
 
Garnicht. Es geht nicht mit TEMP.
Der Sinn des Codes ist es, einen Zustand der jetzt vorliegt mit einem Zustand der vorher vorlag zu vergleichen. Um zu wissen, welcher Zustand vorher vorlag ist es unumgänglich, den Zustand vorher zu speichern, damit man ihn später (also jetzt) auswerten kann. TEMP kann aber nicht zuverlässig speichern.

Harald

Ok, wenn es garnicht geht, dann gebe ich mich eben geschlagen! ;)

Ist ja echt eine verflixte Sache mit diesen blöden TEMP-Variablen...

Was wäre denn dann für die Aussage von Larry

"Eine Temp-Variable ist sinnvoll dann eingesetzt, wenn man sie z.B. zur Bildung eines Zwischen-Ergebnisses (ob nun Binär oder Dezimal ist unerheblich) verwendet, das man dann in der weiteren Folge des Bausteins (also nach der Wert-Zuweisung) weiter verwenden möchte."

ein sinnvolles Beispiel mit Temp-Variablen aus der Praxis?

Lieben Dank!
 
Ok, das verstehe ich!

Wenn ich das jetzt so mache, dann steht in der Temp-Variable ja kein zufälliger Wert mehr drin:

Code:
      [COLOR=#ff0000]L     0
      T     #speicher   [/COLOR]       

      L     #speicher
      INVI  
      L     MW   200
      T     #speicher
      UW    
      U     <>0
      S     M     14.7


Geht aber trotzdem nicht.

Frage: Wie müsste ich das dann umschreiben, dass ich #speicher als TEMP so an dieser Stelle einsetzen kann? :confused:

Klar geht das nicht, du hast wirklich keinen zufälligen Wert drin, aber immer eine 0, denn die schreibst du ja vorher rein.
Temp kann man nicht verwenden, um sich Werte von einem Bausteinaufruf zum nächsten zu merken!
Dazu muß man INOUT oder globale Variablen (globale Variablen sind eher schlechter Stil) nutzen oder man nimmt einen FB und nutzt darin die Statischen Variablen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist nur eine Übung! Ich wollte das mit den TEMP-Var einfach nur mal verstehen...
Mir ist es klar, dass es auch über IN_OUT geht. Hätte es halt gerne über Temp versucht. Insofern muss es doch auch irgendwie über Temp machbar sein, oder nicht?
Grundsätzlich, mit in TEMP kann man nicht abspeichern zwischen Program-scans.
Ein TEMP dient als Zwischenablage innerhalb von ein Baustein, und innerhalb von denselbe Program-scan.
Ein TEMP muss immer mit code initialisiert werden bevor man es lesend verwendet.

Vielleicht ist es besser zu erklären für was man ein TEMP verwenden kann, anstatt wozu man es nicht verwenden kann.
Besipiele:
1. Wenn man zig Anzahl BOOL Variabeln die alle TRUE sein muss um mehrere andere Programteile freigeben, dann kann man diese in ein TEMP BOOL sammeln, so das man nicht immer alle die Variabeln eintippen muss, sondern nur den TEMP Variabel.
2. Wenn man Berechnungen mit Klammern macht, dann kann man mit TEMPs das Inhalt von ein Formel in kleinere Teilen zerlegen.
 
Doch, das hat Harald genauso aufgeschrieben. ;)
Der Sinn ist tatsächlich, den Inhalt des MW200 in den Speicher zu schreiben und sich zu merken, nicht die geflankten Bits.

Harald

Ok dann wird wohl der Befehl "U <> 0" dafür verantwortlich sein das hier eine Flankenerkennung bemerkt wird. In deiner FAQ steht der Code in AWL anders geschrieben und den dortigen Code find ich auf Anhieb ersichtlich! Sorry meinerseits spirit!
 
Ok dann wird wohl der Befehl "U <> 0" dafür verantwortlich sein das hier eine Flankenerkennung bemerkt wird
korrekt :)
"UW" und danach "U <> 0"

Jo, die FAQ sollte verständlich sein und den Vergleich zu FP/FN bieten.
Die Programmsequenz für spirit habe ich optimiert (zwar etwas kürzer, aber eben nicht mehr ganz so verständlich), weil spirit die einzelnen Flankenbits nicht braucht sondern nur ein "Oder über alle Bits".

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke Harald!

Kannst du mir bitte noch eine Frage beantworten?

Ich habe kürzlich ein Thread zum Thema Statuswort aufgemacht.

Code:
U <>0


Dieser Befehl setzt ja die Erstabfrage nicht zurück (eg. logisch), d.h. wenn vor der Abfrage des Statuswortes das VKE nicht begrenzt wurde (z.B. durch Unachtsamkeit) kann es u.U. sein dass dann der Setzbefehl nicht funktioniert? Als Beispiel:

Code:
U "VKE 0"
L     #speicher
INVI  
L     MW   200
T     #speicher
UW    
U     <>0
S     M     14.7

Nach dem Setzbefehl erfolgt dann wieder eine Erstabfrage.

mfg
 
Ein Sinnvoller Einsatz von TEMP Variablen, welchen Larry bestimmt gemeint hat.
Code:
L ACTUAL_WERT
L PROZENT
+I
T TEMP_WERT

L ACTUAL_WERT
L PROZENT_2
+I
T TEMP_WERT_2

L TEMP_WERT
L TEMP_WERT_2
T OUT

Dafür sind die Temp Variablen gedacht um in ein und demselben Baustein einen Zwischenspeicher zu generieren.
 
Ja, das ist genauso wie bei den "normalen" U-Befehlen. Wenn vorher keine VKE-Begrenzung war dann wird das vorher anstehende VKE mitverknüpft.

Harald
 
Zurück
Oben