Farbwechsel mit Variablen aus Funktionen?!

Sara
2009-04-06
2009-04-07
  • Sara - 2009-04-06

    Hi ihr,

    ich möchte für ein Visu-Element einen Farbwechsel implementieren. Hab unter der Kategorie "Farben" und "Variablen -> Farbwechsel" alles eingestellt, jedoch kommt die Warnung 1800 (Ungültiger Watchausdruck) und es klappt nicht. Nehme ich globale Variablen oder aus dem PLC_PRG, dann läufts.

    Liegt es daran, dass das eine Variable einer Funktion ist? Dürfen dort keine Variablen von Funktionen verwendet werden? Welche Variablen dürfen denn nur verwendet werden?

    Danke für eure Hilfe.

    Sara

     
  • Uwe - 2009-04-06

    Hi du,

    ich denke der Grund ist das Funktionen sich per Definition nichts merken

    können und daher nur temporäre Variablen haben. Sie haben kein Gedächtnis.

    Diese Variablen leben nur solange die Funktion abgearbeitet wird.

    Leider lässt CoDeSys trotzdem die Instanzierung von Funktionsbausteinen

    in Funktionen zu obwohl dies eigentlich unter Berücksichtigung der Lebensdauer

    unsinnig ist.

    So können sich z.B. Zähler oder Flankenerkennung u.s.w. in Funktionen

    unerwartet verhalten.

    Deine Visu weiß also gar nicht ob es die Variable überhaupt gibt wenn sie

    gerade angezeigt werden soll und deine Variable kann auch bei jedem

    Aufruf an einer anderen Speicherstelle stehen.

    In der Visu kannst du nur Variablen gebrauchen die ständig

    (auch über einen Zyklus hinaus) existieren.

    Uwe

     
  • Sara - 2009-04-06

    Hi Uwe,

    danke für deine Hilfe. Stimmt, macht Sinn.

    Uwe hat geschrieben:
    In der Visu kannst du nur Variablen gebrauchen die ständig
    (auch über einen Zyklus hinaus) existieren.
    Uwe

    Und wenn ich Variablen gebrauchen möchte, die erst durch eine Funktion manipuliert werden, dann müssen sie vorher definiert sein und danach erhalten bleiben. Das geht mit globalen, auf die ich in der Funktion zugreife. Oder über den Rückgabewert der Funktion, der diese Variable verändert.

    Richtig? Geht das noch anders?

    Sara

     
  • Uwe - 2009-04-06

    Hallo Sara,

    im Prinzip hast du recht.

    Du must dein Ergebnis auf einer globalen Variablen oder einer lokalen

    Variablen eines PRG oder einer lokalen Variablen einer FB-Instanz

    ablegen.

    Ich bin aber ein wenig Extremist was globale Variablen angeht

    und empfehle globale Variable auf ein absolutes Minimum zu beschränken.

    Globale Variablen sind böse !

    Wenn du in einer Funktion oder in einem FB globale Variablen

    oder das Konstrukt AT% benutzt (was ja auf eine absolute Adresse geht)

    dann ist dieser Baustein oder die Funktion nicht mehr rückwirkungsfrei.

    Das widerspricht dem Prinzip der Kapselung und der Wiederverwendbarkeit

    von Bausteinen.

    Bausteine bekommen alle Informationen durch das Interface

    (VAR_INPUT / VAR_IN_OUT ) berechnen mit den

    Informationen irgendetwas und geben das Ergebnis durch das Interface

    (VAR_IN_OUT / VAR_OUTPUT) zurück ohne globale Variablen oder

    absolute Adressen zu benutzen.

    Dadurch werden Bausteine wiederverwendbar.

    Uwe

     
  • Sara - 2009-04-06

    Hi Uwe,

    hab's grad hinbekommen. Danke dir!

    Uwe hat geschrieben:
    Globale Variablen sind böse !

    Ich versuch's auch, die zu minimieren.

    Uwe hat geschrieben:
    Wenn du in einer Funktion oder in einem FB globale Variablen
    oder das Konstrukt AT% benutzt (was ja auf eine absolute Adresse geht)
    dann ist dieser Baustein oder die Funktion nicht mehr rückwirkungsfrei.

    Du meinst, weil dann auch globale Variablen verändert werden können? Das kann doch auch sinnvoll sein.

    Uwe hat geschrieben:
    Das widerspricht dem Prinzip der Kapselung und der Wiederverwendbarkeit
    von Bausteinen.

    d.h. bei gleichen Eingaben (in einer Funktion), die gleichen Ausgaben?

    Verwenden kann ich Funktionen und FBs doch unbeschränkt.

    Sara

     
  • Uwe - 2009-04-07

    Guten Morgen,

    tschuldigung das ich erst jetzt antworte aber gestern Nachmittag hat

    die Sonne bei uns so laut „BIERGARTEN“ geschrien und da ich heute den

    ganzen Tag Termine habe ...

    naja da habe ich gestern eben zeitig ...

    Aber zum Thema...

    Natürlich kann es im Einzelfall sinnvoll sein globale Variablen zu verändern oder abzufragen (z.B. Uhrzeit).

    Allerdings sollte man nach meiner Ansicht darauf achten das Bausteine rückwirkungsfrei sind

    sich also bei mehrfacher Verwendung nicht gegenseitig beeinflussen, auch nicht über globale Variablen.

    Also gekapselt oder eine Black Box in die vorne etwas hineingeht (über das Interface)

    die dann irgendwie etwas berechnet (in der Black Box)

    und dann das Ergebnis wieder raus gibt (über das Interface).

    Eine solche Box kann ich beliebig oft mit unterschiedlichen Parametern einsetzen

    ohne das zwei Boxen etwas voneinander wissen.

    Auf Funktionen sollte die Aussage -> „Gleicher Rückgabewert bei gleichen Eingangsparametern“ zutreffen

    da sich Funktionen ja nichts merken können.

    Eine typische Funktion ist z.B. SIN().

    Der Sinus von 90 Grad ist immer 1 und nicht mal 0.8 oder 0.3.

    Diese Regel wird natürlich häufig umgangen.

    Insbesondere bei Systemfunktionen wird diese Regel gerne ignoriert

    was allerdings nicht grundsätzlich schlecht ist.

    Uwe

     
  • Sara - 2009-04-07

    Moin Uwe,

    du bist aber früh wach!

    Vielen Dank für deine Hilfe!

    So ganz kann ich nicht auf die Verwendung (lesen und schreiben) von globalen Variablen in Funktionen verzichten. Aber, wenn es häufig so angewendet wird, hoff ich, klappt es auch problemlos bei mir.

    Muss noch mehr von der Maschine begreifen, dass ich so "denke" wie sie. Dann sollte man ja problematische Stellen erkennen und vermeiden können.

    Sara

     

Log in to post a comment.