Step 7 AT-Sichten

siemek

Level-1
Beiträge
24
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe folgendes Problem.
Ich habe in SCL ein PEB Namens Statusbyte welches ich gerne zur Auswertung in einzelne Bits zerlegen möchte.
Ungefähr so:
Code:
FUNCTION_BLOCK FB852


VAR_INPUT
    Adresse:INT;
END_VAR
VAR
    StatusByte:BYTE;
    StatusBit AT StatusByte : STRUCT
                                TA:BOOL;
                                RR:BOOL;
                                IA:BOOL;
                                BUF_F:BOOL;
                                IL0:BOOL;
                                IL1:BOOL;
                                IL2:BOOL;
                                REG:BOOL;
                            END_STRUCT;






END_VAR


    // Anweisungsteil
    ;
END_FUNCTION_BLOCK
Kann es sein, dass das mit dem Byte gar nicht geht? Da der selbe Code auf WORD umgeschrieben
keinen Fehler wirft.
 
Der Speicher der von der AT-Sicht benötigt wird, muss kleiner oder gleich der überlagerten Variable sein.
Wenn du deine At-Sicht auf ein Word anstelle eines Bytes legst, kannst du nur nicht auf alle Bits zugreifen, es kann aber nichts schiefgehen.

Andersherum, also wenn man z.B. ein 16 Bit Struct (was zwei Bytes benötigt) auf ein Byte legt, könntest du auf ganz andere Variablen / Speicherbereiche als angegeben schreiben. Darum wird das mit einem Fehler abgewiesen.
 
Die AT-Sicht darf nie größer sein als das Quell-Objekt.
Du solltest dein Byte in einem Temp-Word abspeichern und auf dieses die AT-Sicht anwenden.

Gruß

Dotzi
 
Nein, eine Struct mit deinem Statusbyte und einem Dummybyte.


Gruß

Dieter

ja genau so meine ich das ^^ ja habe es jetzt ein wenig mehr verwirrend angelegt ^^
aber mit den richtigen Kommentaren sollte es eigentlich klappen ^^

Code:
    StatusByte:WORD;
    StatusBit AT StatusByte : STRUCT
                                TA:BOOL;
                                RR:BOOL;
                                IA:BOOL;
                                BUF_F:BOOL;
                                IL0:BOOL;
                                IL1:BOOL;
                                IL2:BOOL;
                                REG:BOOL;
                                Platzhalter10:BOOL;
                                Platzhalter11:BOOL;
                                Platzhalter12:BOOL;
                                Platzhalter13:BOOL;
                                Platzhalter14:BOOL;
                                Platzhalter15:BOOL;
                                Platzhalter16:BOOL;
                                Platzhalter17:BOOL;
                            END_STRUCT;
 
Ich bin ziemlich überzeugt das man die Bytes tauschen muss, wegen "Big Endian":


Code:
    StatusByte:WORD;
    StatusBit AT StatusByte : STRUCT
                                Platzhalter10:BOOL;
                                Platzhalter11:BOOL;
                                Platzhalter12:BOOL;
                                Platzhalter13:BOOL;
                                Platzhalter14:BOOL;
                                Platzhalter15:BOOL;
                                Platzhalter16:BOOL;
                                Platzhalter17:BOOL;
                                TA:BOOL;
                                RR:BOOL;
                                IA:BOOL;
                                BUF_F:BOOL;
                                IL0:BOOL;
                                IL1:BOOL;
                                IL2:BOOL;
                                REG:BOOL;
                            END_STRUCT;
 
Ja Top! es hat auf jeden Fall so funktioniert... für mich muss ich mir noch noch eine "einfache" Erklärung zurecht legen wie sich dieses ganze High und Llowbyte/Wort verschiebe Ding erklären lässt das ist manchmal echt nervig
 
Zurück
Oben