Struct: falscher Typ in Sicht und Variable

Kniffo

Level-1
Beiträge
119
Reaktionspunkte
10
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich möchte einige Eingänge abfragen und deren Bitwertigkeit dann in einem Statusbyte ausgeben.

Kann mir jemand sagen, was an folgendem Struct-Schnipsel falsch ist?
Der Compiler spuckt immer "Der Typ der Sicht ist nicht mit dem Typ der Variablen verträglich." aus.


Code:
VAR_INPUT
//input variables
  CBO                 : BOOL    := false;       //component binary output to plc
  Diagnosis           : BOOL    := false;       //activates diagnosis mode
  DiagValue           : BOOL    := false;       //value for diagnosis
  Negate              : BOOL    := false;       //negates the input
  Lock                : BOOL    := false;       //output is locked
  SafePosition        : BOOL    := false;       //safe position when locked
 END_VAR

VAR_OUTPUT
//output variables
  BO                  : BOOL    := false;
[B]  State               : BYTE    := 0;          //Status to Visu
    StateBits AT State  : STRUCT
        Diagnosis : BOOL;
        DiagValue : BOOL;
        Negate    : BOOL;
        res4      : BOOL;
        res5      : BOOL;
        res6      : BOOL;
        res7      : BOOL;
        res8      : BOOL; 
     END_STRUCT;  [/B]
  LockState           : BOOL    := false;       //lock active
END_VAR

Mein State ist ein Byte und mein Struct hat acht Bits. Leider bringt mich die Hilfe auch nicht weiter. Der Baustein ist ein FC.

Wo liegt mein (Denk-)Fehler?

Danke und Grüße
Kniffo
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In der Hilfe steht:
Falls Sie eine Struktur definieren, die nicht an einer WORD-Grenze endet, füllt S7-SCL automatisch die fehlenden Bytes auf und passt somit die Größe der Struktur an.

Somit müsst das Aufstocken eigentlich überflüssig sein. Auch das Aufstocken auf 16 Bits (oder Weglassen der res_x) bringt den gleich Fehler.
 
Logisch, da du ja an der anderen Stelle ein Byte (=8Bits) hast.
Also funktioniert das mit dem AT nur bei WORD's oder vielfachen Einheit.
Alles klar ?
 
Logisch, funktioniert aber mit
Code:
  State                 : [B]WORD[/B]    := 0;          //Status to Visu
    StateBits AT State  : STRUCT
        Diagnosis : BOOL;
        DiagValue : BOOL;
        Negate    : BOOL;
     END_STRUCT;
immernoch nicht. :confused:
 
Ja das würde schon gehen, aber wie kann ich jetzt den Ausgang lesen? Merker gehen da gar nicht oder?
 
Bringt das was(?):
Code:
FUNCTION FC77 : VOID
VAR_INPUT
//input variables
  CBO                 : BOOL    := false;       //component binary output to plc
  Diagnosis           : BOOL    := false;       //activates diagnosis mode
  DiagValue           : BOOL    := false;       //value for diagnosis
  Negate              : BOOL    := false;       //negates the input
  Lock                : BOOL    := false;       //output is locked
  SafePosition        : BOOL    := false;       //safe position when locked
 END_VAR

VAR_OUTPUT
//output variables
  BO                  : BOOL    := false;

  outState            : BYTE;  
  LockState           : BOOL    := false;       //lock active
END_VAR

VAR_TEMP
  // temporäre Variablen
  State           : WORD;          //Status to Visu
    StateBits AT State  : STRUCT
        Diagnosis : BOOL;
        DiagValue : BOOL;
        Negate    : BOOL;
        res4      : BOOL;
        res5      : BOOL;
        res6      : BOOL;
        res7      : BOOL;
        res8      : BOOL; 
     END_STRUCT;  

END_VAR

  // Anweisungsteil
  outState := WORD_TO_BYTE(State);
END_FUNCTION
Das AT WORD geht wohl nur im TEMP bereich.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok daran lags. Vielen Dank!

In der Hilfe zur Meldung 15:4481 steht zwar eine Tabelle, wann was genutzt werden darf, aber da ich dort herausgelesen habe dass Struct bei Out geht, hab ich die Anordnung wohl nicht verstanden.
 
Bringt das was(?):
Das AT WORD geht wohl nur im TEMP bereich.

Ja ist mir auch schon aufgefallen das es bei einem FC nur in dem Temp bereich geht.
Bei einem FB ist es egal da funktioniert es überall.
Ich glaube das kommt davon weil bei einen FB werden die Werte direkt an die INPUT/OUTPUT über den Instanzdatenbaustein übergeben und bei einem FC werden keine Werte sondern Adressen zu den jeweiligen speicherbereichen ausserhalb des FC übergeben.

godi
 
Ja ist mir auch schon aufgefallen das es bei einem FC nur in dem Temp bereich geht.
...

Wie auch schon der Kollege Kniffo erwähnt hat steht es ja in der Hilfe drin. Nur ist die Tabelle beim Flüchtigen darüberschauen schnell falsch interpretiert.

Da steht drin das man beim FC im VAR_IN, VAR_OUT, VAR_IN_OUT nur eine einer Datentyp Gruppe agieren kann. Also mit AT ein zusammengesetzter Datentyp mit einem anderern (gleich großen) zusammengesetzten Datentyp verbinden kann. z.B. STRUCT und ARRAY. Oder elementarer Datentyp mit elementarem Datentyp z.B. WORD mit INT.

Bei einem FC im VAR, VAR_TEMP Bereich kann man die Brücke schlagen zwischen einem zusammengesetzten Datentyp und einem elementaren Datentyp.

Also meine Aussage mit dem AT WORD bezog sich auf "STRUCT AT WORD" das war missverständlich formulier.
 
Zurück
Oben