TIA Variabler Datentyp

EliteGurke

Level-2
Beiträge
84
Reaktionspunkte
8
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe SPS-Gemeinde,

ich bin gerade bei nem schönen Bierchen am Bausteine schreiben und dachte mir
"Mensch, der neue ADD-Baustein im TIA Portal hat so ne super tolle 'Variabler Datentyp'-Funktion, das programmier ich mir jetzt auch rein..."

Leider hab ich keinen Schimmer wie... Ist es uns Usern überhaupt schon gestattet, dieses Feature zu nutzen?
Und wenn ja, wo finde ich dazu Informationen?

Wer nicht genau was ich meine, siehe Anhang.

mfg EliteGurke
 

Anhänge

  • VarDatentyp.jpg
    VarDatentyp.jpg
    51,2 KB · Aufrufe: 70
Hallo Gurke,

afaik ist dieses Feature nicht in eigenen Bausteinen realisierbar.

Was dem am nächsten kommt, ist die Verwendung des Variant-"Pointers" in der Bausteinschnittstelle.

Schau dir einfach mal die Onlinehilfe->Index->Variant (SCL) an.


Gruß Semo
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Variant hat leider den Nachteil, dass man weder Ausgänge noch Statische Variablen damit anlegen kann.
Dann bleib ich halt fürs Erste bei UDT und MOVE_BLK_VARIANT. Nicht ganz so schön und mehr Arbeit für die CPU, aber es wird schon gehen.
 
Variant hat leider den Nachteil, dass man weder Ausgänge noch Statische Variablen damit anlegen kann.

Wer sagt denn sowas?
Kleines Beispiel

Code:
FUNCTION "SKAL" : Void
TITLE = 'scaling Peripherical Input words'
{ S7_Optimized_Access := 'TRUE' }
AUTHOR : VoR
FAMILY : Peripher
NAME : W_skal_R
VERSION : 1.6
// Input will be converted directly from PEW to AUSG_REAL and AUSG_INT
// the Linearity is calculatet from UGR_IN to UGR_Out and OGR_IN to OGR_OUT
   VAR_INPUT 
      EING : Variant;   // Input. IF Word then PEW scal unipolar
      OGR_IN : Real;   // Upper limit input in format REAL
      UGR_IN : Real;   // Lower limit input in format REAL
      UGR_OUT : Real;   // Lower Output = Lower Input
      OGR_OUT : Real;   // Upper Output = Upper Input
      INT_FACTOR : Real;   // Faktor for the Integer Input (Normaly 10.0) means 13.7 REAL out is 137 for INT
      OBJ_AH : Bool;   // Manualoverride aktiv inaktiv
   END_VAR


   VAR_OUTPUT 
      FE : Bool;   // Fehler bei PEW Wandlung
   END_VAR


   VAR_IN_OUT 
      AUSG : Variant;   // Output scaled (Format REAL)
   END_VAR


   VAR_TEMP 
      OGR_IN_MAX : Bool;   // Input >= Upper limit input
      UGR_IN_MAX : Bool;   // Input <= Upper limit input
      EING_REAL : Real;   // Input im format REAL
      EING_WORD : Word;
      EING_INT : Int;
      LIMIT_R : Real;   // limited input (for calculation)
      LIM_X_UG : Real;   // temporary VAR for limiter
      LIM_X_OG : Real;   // Dito
      Status : Word;
      Ausg_REAL : Real;
      EING_REAL_PEW : Real;
   END_VAR




BEGIN
	CASE TypeOf(#EING) OF
	    Word: // Wenn Wort, dann behandeln wie einen Analogeingang
	        VariantGet(SRC := #EING,
	                   DST => #EING_WORD);
	        #Status := SCALE(IN := WORD_TO_INT(#EING_WORD), HI_LIM := #OGR_OUT, LO_LIM := #UGR_OUT, BIPOLAR := 0, OUT => #EING_REAL_PEW);
	        #FE := #Status <> 0;
	    Int: // Wenn Int dann in REAL wandeln
	        VariantGet(SRC := #EING,
	                   DST => #EING_INT);
	        #EING_REAL := INT_TO_REAL(#EING_INT);
	        #FE := 0;
	    Real: // Wenn Real dann So übernehmen
	        VariantGet(SRC := #EING,
	                   DST => #EING_REAL);
	        #FE := 0;
	    ELSE
	        #FE := 1;
	        #Status := 12; // Nicht unterstütztes Format
	END_CASE;
	
	(*sorting limits for calculation*) 
	IF #UGR_IN < #OGR_IN THEN
	    #LIM_X_UG := #UGR_IN;
	    #LIM_X_OG := #OGR_IN;
	    
	ELSIF #OGR_IN <= #UGR_IN THEN
	    #LIM_X_UG := #OGR_IN;
	    #LIM_X_OG := #UGR_IN;
	END_IF;
	
	(*input should be limited*)
	#LIMIT_R := LIMIT(MN := #LIM_X_UG, IN := #EING_REAL, MX := #LIM_X_OG);
	
	(*calculating limited data*)
	IF NOT #OBJ_AH THEN
	    IF NOT (TypeOf(#EING) = Word) THEN
	        #Ausg_REAL := ((#OGR_OUT - #UGR_OUT) / (#OGR_IN - #UGR_IN)
	        * #LIMIT_R
	        + (#OGR_OUT - (#OGR_OUT - #UGR_OUT)
	        / (#OGR_IN - #UGR_IN) * #OGR_IN));
	    ELSE
	        #Ausg_REAL := #EING_REAL_PEW;
	    END_IF;
	    
	    CASE TypeOf(#AUSG) OF
	        Real:
	            VariantPut(SRC := #Ausg_REAL,
	                       DST := #AUSG);
	        Int:
	            VariantPut(SRC := REAL_TO_INT(#INT_FACTOR * #Ausg_REAL),
	                       DST := #AUSG);
	    END_CASE;
	END_IF;
	
	
END_FUNCTION

mfG René
 
Zuletzt bearbeitet:
Okay, ich probiere das morgen nochmal.

Mir hat er bei meiner Output- sowie meiner Static-Variablen, welche mit Variant definiert sind, das Datentypfeld rot hinterlegt...

Programmiere aktuell mit TIA V13 SP1 UPD5.

Dein Code sieht aber Step 7 5.5 SCL aus...
Wurde der Baustein eventuell migriert?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also es ist tatsächlich so.
TIA SCL mag kein Variant als Out, Stat oder Const, wobei ich Const noch verstehen kann.

VarDeklTIASCL.jpg

Edith meint:
Bei FBs ist es definitiv so. Bei FCs ist es möglich Output als Variant zu deklarieren. Allerdings brauche in meinem konkreten Fall den IDB. Verhext!
 
Zuletzt bearbeitet:
Das Out und Stat nicht funktionieren ist ja irgendwie auch klar. Woher soll er denn denn den Typ im Stat kriegen, das ist ja eigentlich ein Pointer (ein Verweis), kein wirklicher Inhalt im Instanzdb.
Out ist eher speziell denn die Typerkennung geht ja von Aussen nach innen, wohingegen der Inhalt der Variable dann wieder von Innen nach Aussen geht.
 
Zurück
Oben