Datentyp "ANY" in SCL zerlegen

hubert

Level-2
Beiträge
405
Reaktionspunkte
26
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.
 
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; 
    [B]ADX AT ADP : STRUCT [/B]
[B]       ID    : BYTE; [/B]
[B]       TYP   : BYTE; [/B]
[B]       CNT   : INT; [/B]
[B]       DBN   : INT; [/B]
[B]       PTR   : DWORD; [/B]
[B]   END_STRUCT; [/B]
    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.
 
Zuletzt bearbeitet:
Zurück
Oben