Ich versuche in Var_in_Out eines FBs einen BOOL zu laden, der in Var_Global mit "AT MXx.x" angegeben ist.
Dabei sagt mir CoDeSys, dass es keinen Schreibzugriff an der Stelle auf die Variable hat.
Mit Variablen vom Typ Byte, Word, Int etc. gibt es dabei keine Probleme.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Anonymous
-
2006-04-12
Originally created by: Bernhard Werner
Hallo CuBe,
mit VAR_IN_OUT wird eine Referenz auf einen Wert übergeben und nicht der Wert selbst. Wenn eine Variable auf einer Adresse MXx.y liegt, dann wird damit das Bit y im Byte x des Merkerbereichs beschrieben. Auf so ein Bit kann man aber keine Referenz verweisen lassen, das geht technisch nicht. Daher kann das nicht funktionieren. Die Fehlermeldung ist - zugegebenermassen - irreführend.
Bernhard Werner
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Stehe gerade vor dem gleichen Problem. Wie kann man den Fehler umgehen?
Diese Funktion benötigt man doch sehr häufig. Wenn man seine Programme modular aufbauen möchte, um sie mehrfach zu instanzieren ist es doch normal das man die Variablen als Parameter übergibt! Oder vertue ich mich da?!?
Habe es bislang nun so gelöst, das ich zu jeder Variablen, die auf eine Hardwareadresse zeigt, noch eine Variable erstellt habe und diese aufeinander verwiesen habe. Aber das kann ja nicht wirklich richtig sein....
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Ich gebe mal das Programm an, um das Problem zu beschreiben. Habe das Programm bis auf die Grundelemente gekürzt, damit es nicht zu unübersichtlich wird!
Also, erstmal habe ich im Blatt "Globale_Variablen" Beschriftungen für meine Hardware IO angelegt:
VAR_GLOBALÂ Â S_1_1_1AT%IX8.3:BOOL;Â Â L_1_1_1AT%QX10.13:BOOL;Â Â AJ_1_1_1AT%QX10.3:BOOL;Â Â S_1_2_1AT%IX8.1:BOOL;Â Â L_1_2_1AT%QX10.12:BOOL;Â Â AJ_1_2_1AT%QX10.1:BOOL;END_VAR
Dann habe ich einen Funktionsblock angelegt:
FUNCTION_BLOCKLICHT_BUEROVAR_INPUTÂ Â TASTER:BOOL;END_VARVAR_IN_OUTÂ Â LEUCHTE:BOOL;Â Â JALOUSIE:BOOL;END_VAR---------------------------------------------------Â Â LDÂ Â Â Â TASTERÂ Â STÂ Â Â Â LEUCHTEÂ Â Â Â LDÂ Â Â Â Â Â Â TASTERÂ Â Â Â STÂ Â Â Â Â Â JALOUSIE
Nun möchte ich diesen Funktionblock im PLC_PRG mehrfach instanzieren für verschiendene Räume:
PROGRAMPLC_PRGVARÂ Â RAUM_1:LICHT_BUERO;Â Â RAUM_2:LICHT_BUERO;END_VAR------------------------------------------Â Â CALÂ Â RAUM_1(TASTER:=S_1_1_1,LEUCHTE:=L_1_1_1,JALOUSIE:=AJ_1_1_1)Â Â CALÂ Â RAUM_2(TASTER:=S_1_2_1,LEUCHTE:=L_1_2_1,JALOUSIE:=AJ_1_2_1)
Wenn ich das Projekt nun Übersetzte, dann bekomme ich den Fehler "PLC_PRG(2):'VAR_IN_OUT' Parameter 'LEUCHTE' von 'LICHT_BUERO' benötigt Variable mit Schreibzugriff als Eingabe."
Was ja anscheinend, wie oben beschrieben, an unterschiedlichen Arten von BOOL liegt.
Nun habe ich es so gelöst, das ich für jede Variable noch eine "virtuelle" erstellt habe: (hier ein Auszug)
VAR_GLOBALÂ Â S_1_1_1v:BOOL;Â Â Â Â ...END_VAR
und jede einzelne Zugewiesen habe:
LDS_1_1_1STS_1_1_1v...
Dann klappt es! Aber das kann ja nicht so gewollt sein. Habe ich einen Gedankenfehler oder ist das so?
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Ich versuche in Var_in_Out eines FBs einen BOOL zu laden, der in Var_Global mit "AT MXx.x" angegeben ist.
Dabei sagt mir CoDeSys, dass es keinen Schreibzugriff an der Stelle auf die Variable hat.
Mit Variablen vom Typ Byte, Word, Int etc. gibt es dabei keine Probleme.
Originally created by: Bernhard Werner
Hallo CuBe,
mit VAR_IN_OUT wird eine Referenz auf einen Wert übergeben und nicht der Wert selbst. Wenn eine Variable auf einer Adresse MXx.y liegt, dann wird damit das Bit y im Byte x des Merkerbereichs beschrieben. Auf so ein Bit kann man aber keine Referenz verweisen lassen, das geht technisch nicht. Daher kann das nicht funktionieren. Die Fehlermeldung ist - zugegebenermassen - irreführend.
Bernhard Werner
Es gibt ein Unterschied zwischen ein BOOL mit AT zugewiesen und ein BOOL ohne AT Zuweisung.
Bei ein BOOL mit AT Zuweisung wird ein BIT aus ein Byte zugewiesen.
Bei ein BOOL ohne AT Zuweisung handelt es sich um ein BYTE der die Werte 0 oder 1 haben kann.
Ein IN_OUT_VAR kann nur auf Variablen größer gleich 1 Byte verwendet werden.
Stehe gerade vor dem gleichen Problem. Wie kann man den Fehler umgehen?
Diese Funktion benötigt man doch sehr häufig. Wenn man seine Programme modular aufbauen möchte, um sie mehrfach zu instanzieren ist es doch normal das man die Variablen als Parameter übergibt! Oder vertue ich mich da?!?
Habe es bislang nun so gelöst, das ich zu jeder Variablen, die auf eine Hardwareadresse zeigt, noch eine Variable erstellt habe und diese aufeinander verwiesen habe. Aber das kann ja nicht wirklich richtig sein....
Hallo
Kannst du mal das Programm oder ein screenshot davon hier einfügen.
Ich verwende CoDeSys 2.3.8.5
Ich gebe mal das Programm an, um das Problem zu beschreiben. Habe das Programm bis auf die Grundelemente gekürzt, damit es nicht zu unübersichtlich wird!
Also, erstmal habe ich im Blatt "Globale_Variablen" Beschriftungen für meine Hardware IO angelegt:
Dann habe ich einen Funktionsblock angelegt:
Nun möchte ich diesen Funktionblock im PLC_PRG mehrfach instanzieren für verschiendene Räume:
Wenn ich das Projekt nun Übersetzte, dann bekomme ich den Fehler "PLC_PRG(2):'VAR_IN_OUT' Parameter 'LEUCHTE' von 'LICHT_BUERO' benötigt Variable mit Schreibzugriff als Eingabe."
Was ja anscheinend, wie oben beschrieben, an unterschiedlichen Arten von BOOL liegt.
Nun habe ich es so gelöst, das ich für jede Variable noch eine "virtuelle" erstellt habe: (hier ein Auszug)
und jede einzelne Zugewiesen habe:
Dann klappt es! Aber das kann ja nicht so gewollt sein. Habe ich einen Gedankenfehler oder ist das so?