BOOL AT MXx.x : Variable mit Schreibzugriff als Eingabe

CuBe
2006-04-11
2007-11-07
  • CuBe - 2006-04-11

    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.

     
  • 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

     
  • J Schohaus - 2006-04-20

    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.

     
  • reiner - 2007-11-07

    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....

     
  • Matt81 - 2007-11-07

    Hallo

    Kannst du mal das Programm oder ein screenshot davon hier einfügen.

     
  • reiner - 2007-11-07

    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:

    VAR_GLOBAL
       S_1_1_1 AT %IX8.3:BOOL;
       L_1_1_1 AT %QX10.13:BOOL;
       AJ_1_1_1 AT %QX10.3:BOOL;
       S_1_2_1 AT %IX8.1:BOOL;
       L_1_2_1 AT %QX10.12:BOOL;
       AJ_1_2_1 AT %QX10.1:BOOL;
    END_VAR
    

    Dann habe ich einen Funktionsblock angelegt:

    FUNCTION_BLOCK LICHT_BUERO
    VAR_INPUT
       TASTER : BOOL;
    END_VAR
    VAR_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:

    PROGRAM PLC_PRG
    VAR
       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:

    LD S_1_1_1
    ST S_1_1_1v
    ...
    

    Dann klappt es! Aber das kann ja nicht so gewollt sein. Habe ich einen Gedankenfehler oder ist das so?

     

Log in to post a comment.