# Struct: falscher Typ in Sicht und Variable



## Kniffo (31 August 2007)

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.



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


----------



## kiestumpe (31 August 2007)

M.W. haben Struct mindestens 16-Bits, oder?


----------



## Kniffo (31 August 2007)

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.


----------



## kiestumpe (31 August 2007)

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 ?


----------



## Kniffo (31 August 2007)

Logisch, funktioniert aber mit 

```
State                 : [B]WORD[/B]    := 0;          //Status to Visu
    StateBits AT State  : STRUCT
        Diagnosis : BOOL;
        DiagValue : BOOL;
        Negate    : BOOL;
     END_STRUCT;
```
immernoch nicht.


----------



## zotos (31 August 2007)

...mit 


```
State : ARRAY[0..15] OF BOOL := 0;          //Status to Visu
```


gehts ;o)

Aber brngt Dir wohl nicht ;o(


----------



## Kniffo (31 August 2007)

Ja das würde schon gehen, aber wie kann ich jetzt den Ausgang lesen? Merker gehen da gar nicht oder?


----------



## zotos (31 August 2007)

Bringt das was(?):

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


----------



## Kniffo (31 August 2007)

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.


----------



## godi (1 September 2007)

zotos schrieb:


> 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


----------



## zotos (1 September 2007)

godi schrieb:


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


----------

