Step 7 Any- Pointer Bestandteile Auslesen

Zombie

Level-1
Beiträge
732
Reaktionspunkte
120
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi, ich habe ein Problem.

Ich würde gerne den Inhalt eines Any- Pointers auslesen. Dazu habe ich hier ein Beispielprogramm in SCL gefunden, welches ich ein wenig umgeschrieben habe.

Code:
FUNCTION FC3 : VOID
VAR_INPUT
    QANY :ANY;
END_VAR
VAR_OUTPUT
    ID :BYTE;
    Typ :BYTE;
    Laenge :WORD;
    DB_NUm :WORD;
    WHatever :DWORD;
END_VAR

VAR_TEMP
    Pointer_In : STRUCT
        Any_id: BYTE;
        Datatype :BYTE;
        Length :WORD;
        DB_Num :WORD;
        Byte_Pointer :DWORD;
    END_STRUCT;
    
    pAny AT Pointer_In: ANY;

END_VAR
BEGIN
pAny := QANY;
ID := Pointer_In.Any_id;
Typ := Pointer_In.Datatype;
Laenge := Pointer_In.Length;
DB_NUm := Pointer_In.DB_Num;
Whatever := Pointer_In.Byte_Pointer;

END_FUNCTION

Dieser Baustein gibt mir alle relavanten Werte aus.

Leider brauche ich denselben Baustein in AWL.
Gekommen bin ich bis dahin.
Code:
FUNCTION FC2 : VOID
TITLE =
VERSION : 0.0


VAR_INPUT
  QANY : ANY ;    
END_VAR
VAR_OUTPUT
  oID_1 : BYTE ;    
  oDatentyp_1 : BYTE ;    
  oBereichslaenge_1 : WORD ;    
  oDB_Nummer_1 : WORD ;    
  oWhatever_1 : DWORD ;    
END_VAR
VAR_TEMP
  ID : BYTE ;    
  Datentyp : BYTE ;    
  Bereichslaenge : WORD ;    
  DB_Nummer : WORD ;    
  Whatever : DWORD ;    
END_VAR
BEGIN
NETWORK
TITLE =

      L     P##QANY; 
      LAR1  ; 
      L     W [AR1,P#0.0]; 
      T     #ID; 
      T     #oID_1; 
      L     W [AR1,P#1.0]; 
      T     #Datentyp; 
      T     #oDatentyp_1; 
      L     W [AR1,P#2.0]; 
      T     #Bereichslaenge; 
      T     #oBereichslaenge_1; 
      L     W [AR1,P#4.0]; 
      T     #DB_Nummer; 
      T     #oDB_Nummer_1; 
      L     W [AR1,P#6.0]; 
      T     #Whatever; 
      T     #oWhatever_1; 

END_FUNCTION

Dazu hab ich mir dieses FAQ durchgelesen.
Mein Problem ist jetzt aber, dass der Baustein in AWL andere Werte ausgibt, wie der in SCL. Siehe dazu die angfügte Grafik. Oben in AWL, unten in SCL.
Codevergleich.JPG

Könnte es sein, dass ich in dem Stück Code das MSB und LSB vertauschen muss?
Code:
      L     W [AR1,P#[COLOR=#ff0000]1[/COLOR].0]; 
      T     #ID; 
      T     #oID_1; 
      L     W [AR1,P#[COLOR=#ff0000]0[/COLOR].0]; 
      T     #Datentyp; 
      T     #oDatentyp_1;
Die ID wäre dann aber auch 00 und nicht wie erwartet 10.
Weiterhin steht in Whatever der Hinweis auf den DB Zugriff nicht im erwarteten Format, was mach ich da verkehrt?

Vielen Dank
 
Code:
VAR_TEMP
    Pointer_In : STRUCT
        Any_id: [COLOR="#0000FF"]BYTE[/COLOR];
        Datatype :[COLOR="#0000FF"]BYTE[/COLOR];
        Length :WORD;
        DB_Num :WORD;
        Byte_Pointer :[COLOR="#0000FF"]DWORD[/COLOR];
    END_STRUCT;
    
    pAny AT Pointer_In: ANY;

END_VAR

Code:
      L     P##QANY; 
      LAR1  ; 
      L     [COLOR="#FF0000"]W[/COLOR] [AR1,P#0.0]; 
      T     #ID; 
      T     #oID_1; 
      L     [COLOR="#FF0000"]W[/COLOR] [AR1,P#1.0]; 
      T     #Datentyp; 
      T     #oDatentyp_1; 
      L     W [AR1,P#2.0]; 
      T     #Bereichslaenge; 
      T     #oBereichslaenge_1; 
      L     W [AR1,P#4.0]; 
      T     #DB_Nummer; 
      T     #oDB_Nummer_1; 
      L     [COLOR="#FF0000"]W[/COLOR] [AR1,P#6.0]; 
      T     #Whatever; 
      T     #oWhatever_1;
In der Step7-Hilfe zum Aufbau des Datentyp ANY und auch in Deiner SCL-Quelle kann man sehr schön die Struktur des ANY nachlesen - Du ignorierst das allerdings fast völlig und liest alle Einzelbestandteile als Word - deshalb stimmen Deine Ergebnisse nicht.

Ein Beispiel für eine korrekte Zerlegung des ANY in AWL:
Tipp: so zerlegst Du bei einer Function (FC) den Input-ANY:
Code:
      L     P##IN_Startadresse_Any      //Adresse des IN-Parameters im Aufrufer-L-Stack
      LAR1  

      L     B [AR1,P#0.0]               //Prüfen ANY:S7-ANY-Kennung muß 16#10 sein!
      L     B#16#10
      <>I   
      SPB   err                         //Fehler: Aktualoperand ist kein ANY!

      L     B [AR1,P#1.0]               //ANY:Datentyp, z.B. 16#05 für INT 
      T     #Typ                        // (TEMP, Int)
      L     W [AR1,P#2.0]               //ANY:Wiederholfaktor
      T     #Anzahl                     // (TEMP, Int)
      L     W [AR1,P#4.0]               //ANY:DB-Nummer
      T     #QuellDB                    // (TEMP, Word)
      L     D [AR1,P#6.0]               //ANY:Bereichsadresse mit Bereichskennung, muß auf .0 enden!
      T     #QuellAdr                   // (TEMP, DWord)

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
*Haare ausreiß*

Danke Harald, irgendwann investiere ich auch mal ein paar Stunden und lerne AWL richtig zu programmieren.
Vielleicht passieren mir dann nicht mehr solche Fehler.

Danke nochmal.
 
Zurück
Oben