Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Seite 3 von 4 ErsteErste 1234 LetzteLetzte
Ergebnis 21 bis 30 von 33

Thema: Verständnisfrage zu TEMP-Variablen

  1. #21
    Registriert seit
    30.10.2009
    Ort
    10 km vom Herzen der Natur
    Beiträge
    1.628
    Danke
    120
    Erhielt 340 Danke für 255 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Lies doch mal hier:
    Temporäre Variable
    Gruß
    Michael

  2. #22
    Avatar von spirit
    spirit ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    12.09.2012
    Beiträge
    961
    Danke
    183
    Erhielt 23 Danke für 22 Beiträge

    Standard

    Ok, lieben Dank für eure geduldigen Erklärungen!

    Denke jetzt komme ich der Sache allmählich näher (ja stimmt, dauert mal wieder ganz schön!). Was ich bei meiner eingangs gestellten Frage nicht bedacht habe ist, dass der Zustand ja über einen Zyklus hinaus gespeichert werden muss. Weiß nicht ob man es so ausdrücken kann, aber es könnte ja sein, dass sich der Zustand dann ändert, wenn die FC mit ihrer Temp-Variablen gerade nicht aufgerufen ist und dann würde ihr diese Wertänderung wohl durch die Lappen gehen...

    @Michael:

    Danke für den Link; ist dort echt super erklärt. Verstehe nur das nicht ganz:

    "Aus den oben genannten Gründen lassen sich TEMP nicht sinnvoll an Stellen verwenden, an denen nicht in jedem Zyklus zugewiesen wird (z.B. SR-Glieder) oder an denen die Variable vor einer Zuweisung abgefragt wird."

    Die Ausführung von Setzen/Rücksetzen passiert doch immer sofort an der Stelle, an der ich es programmiert habe. Und wenn das in einer FC passiert, dann wäre das doch eigentlich kein Problem. Oder verstehe ich das jetzt falsch?
    Geändert von spirit (22.05.2014 um 20:33 Uhr)
    LG
    spirit

  3. #23
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.264
    Danke
    537
    Erhielt 2.708 Danke für 1.957 Beiträge

    Standard

    Das verstehst du eher falsch!

    U M0.0
    S #Temp_Var
    U M0.1
    R #Temp_Var

    Wenn weder M0.0 noch M0.1 True ist, ist #Temp_Var unbestimmt, denn die Variable wird ja weder gesetzt noch rückgesetzt.

    U M 0.0
    SPB M001

    U M 0.1
    = #Temp_Var

    M001: NOP 0

    Wenn M0.0 False ist. dann hat #Temp_Var einen definierten Wert, True bei M0.1 = True und False, bei M0.1 = False.
    Wenn aber M0.0 True ist, dann wird die Wertzuweisung an #Temp_Var umsprungen und die Variable hat einen Wert, der vollkommen zufällig True oder False ist!
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

  4. #24
    Avatar von spirit
    spirit ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    12.09.2012
    Beiträge
    961
    Danke
    183
    Erhielt 23 Danke für 22 Beiträge

    Standard

    Zitat Zitat von Ralle Beitrag anzeigen
    Das verstehst du eher falsch!
    Lieben Dank Ralle,

    naja - hätte mich ja auch gewundert, wenn's anders gewesen wäre...

    Aber jetzt ist das doch klar geworden! (Irgendwie brauche ich immer Beispiele, komisch...)


    UND: Meine "Erläuterung" für die Zustandsabfrage (mit TEMP) könnte man(n) so durchgehen lassen, oder?
    LG
    spirit

  5. #25
    Registriert seit
    30.10.2009
    Ort
    10 km vom Herzen der Natur
    Beiträge
    1.628
    Danke
    120
    Erhielt 340 Danke für 255 Beiträge

    Standard

    Zitat Zitat von spirit Beitrag anzeigen
    ... es könnte ja sein, dass sich der Zustand dann ändert, wenn die FC mit ihrer Temp-Variablen gerade nicht aufgerufen ist und dann würde ihr diese Wertänderung wohl durch die Lappen gehen...
    Nein. Es ist so, dass der Speicher für TEMP-Variablen nicht fest von einem Baustein reserviert werden, sondern nur während des Aufrufs. Davor und danach steht dieser Speicher wieder anderen Bausteinen zur Verfügung um ihre TEMP dort abzulegen, diese Bausteine ändern also die Werte im TEMP-Speicher. Wenn man also eine Variable abfragt, die man vorher nicht zugewiesen hat, steht dort zwangsläufig noch der Wert, den ein anderer Baustein dort abgelegt hat, also ein mehr oder minder zufälliger Wert.
    Gruß
    Michael

  6. #26
    Avatar von spirit
    spirit ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    12.09.2012
    Beiträge
    961
    Danke
    183
    Erhielt 23 Danke für 22 Beiträge

    Standard

    Zitat Zitat von M-Ott Beitrag anzeigen
    Nein. Es ist so, dass der Speicher für TEMP-Variablen nicht fest von einem Baustein reserviert werden, sondern nur während des Aufrufs. Davor und danach steht dieser Speicher wieder anderen Bausteinen zur Verfügung um ihre TEMP dort abzulegen, diese Bausteine ändern also die Werte im TEMP-Speicher. Wenn man also eine Variable abfragt, die man vorher nicht zugewiesen hat, steht dort zwangsläufig noch der Wert, den ein anderer Baustein dort abgelegt hat, also ein mehr oder minder zufälliger Wert.
    Ok Michael, also zweiter Versuch mit meinen Worten:

    In meinem Beispiel wird, während die FC aufgerufen wird, in die TEMP-Variable der aktuelle Zustand eingeschrieben. Nachdem die FC abgearbeitet wurde, wird dieser TEMP-Bereich wieder von einer anderen FC benutzt und überschrieben. Wird die ehemalige FC erneut aufgerufen, so steht in der TEMP-Var nicht mehr der ursprüngliche Zustand, sondern evtl. ein zufälliger Wert aus einem anderen FC-Aufruf. Besser?
    LG
    spirit

  7. #27
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.738
    Danke
    444
    Erhielt 924 Danke für 744 Beiträge

    Standard

    Richtig und damit besser.

    Außerdem ist es neben der zwischenzeitlichen Benutzung des Speicherplatzes durch andere Variablen auch möglich, das die Temp-Variable beim nächsten Aufruf an einem anderen Speicherort angelegt wird und deswegen der Inhalt vor dem ersten Schreiben wieder zufällig ist.

  8. #28
    Avatar von spirit
    spirit ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    12.09.2012
    Beiträge
    961
    Danke
    183
    Erhielt 23 Danke für 22 Beiträge

    Standard

    Zitat Zitat von hucki Beitrag anzeigen
    Richtig und damit besser.

    Außerdem ist es neben der zwischenzeitlichen Benutzung des Speicherplatzes durch andere Variablen auch möglich, das die Temp-Variable beim nächsten Aufruf an einem anderen Speicherort angelegt wird und deswegen der Inhalt vor dem ersten Schreiben wieder zufällig ist.
    Supi, ich danke Euch SEHR!

    Glaube, dann kann ich diese TEMP-Variablen nun doch als erledigt abhaken...
    LG
    spirit

  9. #29
    Registriert seit
    05.09.2011
    Beiträge
    176
    Danke
    43
    Erhielt 28 Danke für 20 Beiträge

    Standard

    Hallo spirit!

    Beispiele sind ja ansich was gutes, aber, sofern du die Möglichkeit hast, probier doch mal folgendes (jetzt bin ich nämlich selber neugierig geworden und ich habe leider keine Möglichkeit das zu Testen):

    Lege ein neues Projekt an mit OB1 und zwei FCs oder FBs oder gemischt.

    Im ersten Versuch rufst du im OB1 zuerst den ersten Baustein auf und danach den zweiten.
    In beiden Bausteinen deklarierst du jeweils im temp. Bereich eine Bool Variable.
    Im ersten Baustein setzt du die temp. Variable mit SET auf "1".
    Im zweiten Baustein fragst du die temp. Variable ab und weißt sie z.B. einen Ausgang zu (ist ja nur ein Test).

    Also:
    Code:
    OB1:
    Call FC1
    Call FC2
    
    Im FC1:
    Set
    = xTemp
    
    Im FC2:
    
    U xTemp
    = A0.0
    Meine Behauptung (und bis dato bisherige Auffassung): A0.0 wird "1"

    Versuch #2

    Selbes Szenario, selber Code nur: Jetzt rufst du FC2 in FC1 auf!

    Code:
    OB1:
    
    Call FC1
    
    Im FC1:
    
    Set
    =xTemp
    
    Call FC2
    
    Im FC2:
    
    U xTemp
    = A0.0
    Hier denke ich wird A0.0 "0" bleiben.

    Wie komme ich auf diese Behauptungen?

    Der Lokaldatenstack (L-Stack) wird ja von allen Bausteinen genutzt. OB1 legt hier seine 20 Bytes im L-Stack ab. Dadurch dass du im ersten Versuch in FC1 eine Bool Variable im temp. Bereich angelegt hast werden hier wohl 2 Byte reserviert werden. Sobald du im FC1 bist umfasst der Stack also 22 Bytes. Jetzt wird FC1 beendet und diese 2 Bytes werden wieder freigegeben. Jetzt wird FC2 aufgerufen und wiederum werden 2 Bytes reserviert. Der Stack umfasst aber weiterhin nur diese 22 Bytes.

    Im zweiten Versuch hast du im FC1 wieder diese 22 Bytes ... da aber diesmal FC2 in FC1 aufgerufen wird werden nun zusätzlich nochmal 2 Bytes "draufgelegt" also insgesamt 24 Bytes belegt!

    Die größe des Lokaldatenstacks kannst du übrigens in den Referenzdaten einsehen! Dieser ist standardmäßig auf 256 Bytes ausgelegt (kann aber bei einigen CPUs verändert werden). Es ist also trotzdem Vorsicht geboten das dieser Stack nicht überläuft (solange du nichts mit String Datentypen oder riesigen Arrays vom Typ UDT zu tun hast wird das aber auch nicht so schnell passieren)!


    Das kursiv geschriebene ist meine bisherige Auffassung zu diesem Thema und darf gerne von den Profis berichtigt werden

  10. #30
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.738
    Danke
    444
    Erhielt 924 Danke für 744 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von nutellahase Beitrag anzeigen
    Also:
    Code:
    OB1:
    Call FC1
    Call FC2
    
    Im FC1:
    Set
    = xTemp
    
    Im FC2:
    
    U xTemp
    = A0.0
    Meine Behauptung (und bis dato bisherige Auffassung): A0.0 wird "1"
    Wenn das so passiert, dann ist das trotzdem zufällig! Es würde auch so sein, wenn die Temp-Variablen in FC1 und FC2 unterschiedliche Bezeichnungen haben. Eben nicht, weil es die gleiche Variable ist, sondern nur, weil sie zufällig nacheinander den gleichen Speicherplatz im Stack belegen.
    Das passiert (vor allem bei kleineren Programmen) häufig auch mit der Temp-Variablen des FC's selbst - sie belegt zufällig wieder den gleichen Speicherplatz, wie beim vorigen Aufruf des FCs, und zufällig wurde der Speicherplatz zwischenzeitlich auch nicht anderweitig verwendet. Deshalb funktioniert dort das geplante Programm. Aber eben nur zufällig und nicht, wie es den Anschein macht, geplant.

  11. Folgender Benutzer sagt Danke zu hucki für den nützlichen Beitrag:

    nutellahase (24.05.2014)

Ähnliche Themen

  1. Antworten: 8
    Letzter Beitrag: 11.03.2014, 10:04
  2. Frage zu Temp-Variablen...
    Von spirit im Forum Simatic
    Antworten: 66
    Letzter Beitrag: 07.02.2013, 12:14
  3. [B&R AS] Verständnisfrage Variablen
    Von b0zzen im Forum Sonstige Steuerungen
    Antworten: 2
    Letzter Beitrag: 29.09.2010, 20:52
  4. Temp Variablen
    Von centrox im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 23.02.2009, 16:05
  5. IN Variablen nach TEMP
    Von neuer_user im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 06.10.2006, 16:26

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •