Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 2 von 2

Thema: Datentyp "ANY" in SCL zerlegen

  1. #1
    Registriert seit
    17.09.2003
    Ort
    Zell bei Dietfurt a.d. Altmühl
    Beiträge
    358
    Danke
    8
    Erhielt 27 Danke für 25 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo SPS Freunde.

    Habe mal eine Frage. Wie kann ich einen Datentyp "ANY" der als IN in einem FB hereinkommt in SCL so zerlegen, damit ich herausbekomme welche "DB" übergeben wurde ab welchem BYTE die Daten übergeben werden und wieviele BYTE übergeben werden. Habe bis jetzt nur in der Hilfe von SCL etwas gefunden, wie man einen Datentyp "ANY" aus einem "STRUCT" erzeugt. Mit Hilfe des "AT" Befehls (Sichten)". In AWL weiss ich wie es geht über das Adressregister. Kann mir einer von euch helfen wie ich das auch in SCL hinbekomme. Bin für jede Hilfe dankbar.
    MfG

    Hubert

    \"Never change a running system. \"
    Zitieren Zitieren Datentyp "ANY" in SCL zerlegen  

  2. #2
    Registriert seit
    27.05.2004
    Ort
    Thüringen/Berlin
    Beiträge
    12.263
    Danke
    537
    Erhielt 2.708 Danke für 1.957 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich weiß nicht, ob das hier das gleiche Beispiel ist, aber damit müßtest du doch eigentlich an die DB-Nummer kommen oder?

    Code:
     
    FUNCTION FC201 : VOID 
    TITLE = 'numeric display SIEBERT S102 with 4 digits' 
    // 
    //Comment: 
    // 
    VERSION : '1.0' 
    AUTHOR  : HL 
    NAME    : S1024 
    FAMILY  : YYY 
    //Data representation of S102 in SI16 mode 
    //  Byte 0   Byte 1   Byte 2   Byte 3 
    //+--------+--------+--------+--------+ 
    //|76543210|76543210|76543210|76543210| 
    //+--------+--------+--------+--------+ 
    // |||||||| RESERVED   MSB      LSB 
    // |||||||+---------------------------- DP0 (DP 2..0 see table 1) 
    // ||||||+----------------------------- DP1 
    // |||||+------------------------------ DP2 
    // ||||+------------------------------- RESERVED always set to 0 
    // |||+-------------------------------- RESERVED always set to 0 
    // ||+--------------------------------- FL (1 Flashing, 0 normal) 
    // |+---------------------------------- BL (1 Blanking, 0 normal) 
    // +----------------------------------- ST (1 Segment test, 0 normal) 
    // 
    // 
    //Table 1: Decimal dot 
    //---------------------- 
    //  DP2  DP1  DP0  Meaning 
    //+----+----+----+--------  
    //|  0 |  0 |  0 | No dp 
    //|  0 |  0 |  1 | dp at 2. digit 
    //|  0 |  1 |  0 | dp at 3. digit 
    //|  0 |  1 |  1 | dp at 4. digit 
    // Typical-Attribute 
    { 
      S7_m_c:='false'; 
      S7_blockview:='big' 
    } 
    VAR_INPUT 
        ADR     : ANY; 
        PV_R    : REAL := 0; 
        DPoint  : INT  := 0; 
        SegTest : BOOL := false; 
    END_VAR 
    VAR_OUTPUT 
        Error   : BOOL; 
        Ernum   : INT; 
    END_VAR 
    VAR_TEMP 
        ADP     : ANY; 
        ADX AT ADP : STRUCT 
           ID    : BYTE; 
           TYP   : BYTE; 
           CNT   : INT; 
           DBN   : INT; 
           PTR   : DWORD; 
       END_STRUCT; 
        by_0    : BYTE; 
        by_1    : BYTE; 
        val     : INT; 
        padr    : INT; 
    END_VAR 
    BEGIN 
      ADP   := ADR; 
      IF (ADX.TYP <> B#16#04) THEN                                 // error if not from type of word 
        Error := true; 
        Ernum := -7; 
        RETURN; 
      END_IF; 
      IF ((ADX.PTR AND DW#16#FF00_0000) <> DW#16#8000_0000) THEN   // error if not adressing the periphery 
        Error := true; 
        Ernum := -6; 
        RETURN; 
      END_IF; 
      padr := DWORD_TO_INT(SHR (IN := ADX.PTR, N := 3));           // start adress 
      Ernum := 0; 
      by_0  := 0; 
      by_1  := 0; 
      IF SegTest THEN 
        by_0 := B#16#80; 
        val  := 0; 
      END_IF; 
      IF (PV_R < -32768) THEN 
        Ernum := -5; 
        val   := -32768; 
      ELSIF (PV_R > 32767) THEN 
        Ernum := -4; 
        val   := -32768; 
      ELSIF (PV_R < -999) THEN 
        Ernum := -3; 
      ELSIF (PV_R > 9999) THEN 
        Ernum := -2; 
      ELSE 
        CASE DPoint OF 
          0..3: by_0 := by_0 OR INT_TO_BYTE(DPoint); 
        ELSE 
          Ernum := -1; 
        END_CASE; 
      END_IF; 
      IF (Ernum >= -3) THEN 
        val := REAL_TO_INT (PV_R); 
      END_IF; 
     
      Error := Ernum < 0; 
      PQB[padr    ] := by_0; 
      PQB[padr + 1] := by_1; 
      PQW[padr + 2] := INT_TO_WORD(val); 
    END_FUNCTION
    Zum Vergleich Any in AWL:

    Code:
     
          L     B#(16, 2)                   //Syntax-ID und Typ: Byte laden
          T     LW [AR1,P#0.0]
          L     #AnzahlDBB                  //Transferlaenge
          T     LW [AR1,P#2.0]
          L     #QuellDB                    //Quelle-DB 
          T     LW [AR1,P#4.0]
          L     P#DBX 0.0                   //Anfangs-DW im Quell-DB
          L     #QuellDW
          ITD   
          SLD   3
          +D    
          T     LD [AR1,P#6.0]
    ADX.CNT, ADX.DBN und ADX.PTR müßte das Gesuchte dann enthalten.
    Geändert von Ralle (28.02.2006 um 09:45 Uhr)
    Gruß
    Ralle

    ... there\'re 10 kinds of people ... those who understand binaries and those who don\'t …
    and the third kinds of people … those who love TIA-Portal

Ähnliche Themen

  1. "Index Pulse", "Home Switch" und "Position Limit Switch"
    Von senmeis im Forum Antriebstechnik
    Antworten: 3
    Letzter Beitrag: 07.03.2011, 11:21
  2. ANY Pointer. Wenn ist DatenTyp NICHT "Byte" ?
    Von JesperMP im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 05.03.2009, 23:11
  3. Probleme mit dem Datentyp "Real"
    Von Johannes F im Forum Simatic
    Antworten: 16
    Letzter Beitrag: 15.01.2008, 22:34
  4. Antworten: 2
    Letzter Beitrag: 14.12.2007, 15:09
  5. SCL-DB-Zugriff "Ungültiger Datentyp"
    Von kiestumpe im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 25.05.2007, 17:57

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •