SCL, Any und Sichten

Ralle

Super-Moderator , User des Jahres 2006-2007
Teammitglied
Beiträge
15.414
Reaktionspunkte
4.043
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich hab ja gerade für jemanden ein Stück AWL in SCL umgesetzt. Dabei tat sich eine Frag auf:

Zuerst mal den SCL-Code:

Code:
FUNCTION FC100 : INT

VAR_INPUT
  Data_DB: Block_DB;       
  Adresse_Drive: WORD;   //Adresse des Antriebes (Z.Bsp. W#16#12C für 300)
//  Record: ANY;
END_VAR    

VAR_TEMP
    Quelle: ANY;
    QuellPointer AT Quelle : STRUCT
                                bySyntaxID : BYTE;
                                byDatentyp : BYTE;
                                iLaenge : INT;
                                idb_Nummer : INT;
                                dwPointer : DWORD;
                            END_STRUCT;
    PPO_TYP: INT; 
    Laenge: INT;
    ErrorNr: INT;
    RET_VAL_SFC_14: INT;
    DBNr: INT;
END_VAR

    // Anweisungsteil
//    Quelle := Record;
    DBNr := WORD_TO_INT(BLOCK_DB_TO_WORD(Data_DB));
    PPO_Typ := WORD_TO_INT(Data_DB.DW60);
//oder so:  PPO_Typ := WORD_TO_INT(WORD_TO_BLOCK_DB(BLOCK_DB_TO_WORD(Data_DB)).DW60);    
    ErrorNr := 0;
    
    CASE PPO_Typ OF
        2 : Laenge := 12;  // Laenge (Wiederholfaktor) 20 Bytes
        4 : Laenge := 12;  // Laenge (Wiederholfaktor) 12 Bytes
        5 : Laenge := 20;  // Laenge (Wiederholfaktor) 28 Bytes
    ELSE:
        ErrorNr := 1;
        Laenge := 0;
    END_CASE;

     QuellPointer.bySyntaxID    := b#16#10; 
     QuellPointer.byDatentyp    := b#16#4;
     QuellPointer.iLaenge       := Laenge;
     QuellPointer.idb_Nummer    := DBNr;
     QuellPointer.dwPointer     := SHL (IN := INT_TO_DWORD(38), N := 3); 
     
     
    IF ErrorNr = 0 THEN
       RET_VAL_SFC_14 := DPRD_DAT(LADDR :=  Adresse_Drive, // IN: WORD
                                   [COLOR=Red]RECORD := Quelle[/COLOR] // OUT: 
                                   ); // INT
       ErrorNr := RET_VAL_SFC_14; 
    END_IF;
       
    FC100 := ErrorNr;
END_FUNCTION
Das rote Stück Code habe ich mal durch #Quellpointer ersetzt. Dabei veränderte sich der AWL-Code so, daß er nicht mehr das gewünschte Ergebnis lieferte. Ich meinte immer, die Sicht kann man genauso verwenden, wie die Ursprungsdaten. Das scheint zumindest bei Any-Pointern nicht so zu sein.

Hier mal die übersetzten AWL-Bausteine als Gegenüberstellung:

Code:
Variante mit #Quelle als Any  Variante mit #Quellpointer
Diese ist ok                  Diese ist nicht ok

      SET                           SET   
      SAVE                          SAVE  
      =     L     20.1              =     L     20.1
      L     P##Data_DB              L     P##Data_DB
     PO_TYP                         T     #DBNr
      L     0                       AUF   #Data_DB
      T     #ErrorNr                L     DBW   60
      L     #PPO_ T     #DBNr       T     #PPO_TYP
      AUF   #Data_DB                L     0
      L     DBW   60                T     #ErrorNr
      T     #PTYP                   L     #PPO_TYP
      L     2                       L     2
      TAK                           TAK   
      ==I                           ==I   
      T     LW    22                T     LW    22
      SPB   A7d1                    SPB   A7d1
      SPA   A7d2                    SPA   A7d2
A7d1: L     12                A7d1: L     12
      T     #Laenge                 T     #Laenge
      SPA   A7d0                    SPA   A7d0
A7d2: L     4                 A7d2: L     4
      L     LW    22                L     LW    22
      ==I                           ==I   
      SPB   A7d3                    SPB   A7d3
      SPA   A7d4                    SPA   A7d4
A7d3: L     12                A7d3: L     12
      T     #Laenge                 T     #Laenge
      SPA   A7d0                    SPA   A7d0
A7d4: L     5                 A7d4: L     5
      L     LW    22                L     LW    22
      ==I                           ==I   
      SPB   A7d5                    SPB   A7d5
      SPA   A7d6                    SPA   A7d6
A7d5: L     20                A7d5: L     20
      T     #Laenge                 T     #Laenge
      SPA   A7d0                    SPA   A7d0
A7d6: L     1                 A7d6: L     1
      T     #ErrorNr                T     #ErrorNr
      L     0                       L     0
      T     #Laenge                 T     #Laenge
A7d0: L     B#16#10           A7d0: L     B#16#10
      T     LB     0                T     LB     0
      L     B#16#4                  L     B#16#4
      T     LB     1                T     LB     1
      L     #Laenge                 L     #Laenge
      T     LW     2                T     LW     2
      L     #DBNr                   L     #DBNr
      T     LW     4                T     LW     4
      L     DW#16#130               L     DW#16#130
      T     LD     6                T     LD     6
      L     #ErrorNr                L     #ErrorNr
      L     0                       L     0
      ==I                           ==I   
      SPBN  A7d7                    SPBN  A7d7
      L     #Adresse_Drive          L     #Adresse_Drive
      T     LW    22                T     LW    22
      [COLOR=Red]L     LD     0                L     DW#16#1002000A[/COLOR]
      T     LD    24                T     LD    24
      [COLOR=Red]L     LD     4                L     W#16#0[/COLOR]
      T     LD    28                T     LW    28
      [COLOR=Red]L     LW     8                L     DW#16#87000000[/COLOR]
      T     LW    32                T     LD    30
      UC    "DPRD_DAT"              UC    "DPRD_DAT"
            P#L 22.0                      P#L 22.0
            P#L 16.0                      P#L 16.0
            P#L 24.0                      P#L 24.0
      L     #RET_VAL_SFC_14         L     #RET_VAL_SFC_14
      L     #RET_VAL_SFC_14         L     #RET_VAL_SFC_14
      T     #ErrorNr                T     #ErrorNr
A7d7: L     #ErrorNr          A7d7: L     #ErrorNr
      T     #RET_VAL                T     #RET_VAL
      CLR                           CLR   
      U     L     20.1              U     L     20.1
      SAVE                          SAVE  
      BE                            BE
Erklärungsversuche würden mich mal interessieren :rolleyes:.
 
Hi Ralle,
auch nach x-maligem Durchlesen und Vergleichen ist mir für deinen Fall kein plausibler Grund eingefallen. Ob AT-Sicht oder VAR, es sollten ja auf jeden Fall Lokal-W's eingetragen werden und nicht irgendwelche Konstanten (unerklärten Ursprungs).

Ich hatte letztens aber auch einen interessanten Fall :
Einer meiner Auswertungs-FB's lies sich nicht mehr übersetzen. Da ich mir darauf keinen Reim machen konnte (ich hatte nichts geändert) habe ich das Ganze Herrn S. übergeben. Die Herrschaften dort haben mir daraufhin einen Link für ein SP4 für SCL zugemailt. Dann klappte es wieder. Vielleicht ist das bei dir ja auch so etwas ...

Gruß
LL
 
Zurück
Oben