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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
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
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
Hi Uwe,
danke für deine Hilfe. Stimmt, macht Sinn.
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
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
Hi Uwe,
hab's grad hinbekommen. Danke dir!
Ich versuch's auch, die zu minimieren.
Du meinst, weil dann auch globale Variablen verändert werden können? Das kann doch auch sinnvoll sein.
d.h. bei gleichen Eingaben (in einer Funktion), die gleichen Ausgaben?
Verwenden kann ich Funktionen und FBs doch unbeschränkt.
Sara
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
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