TIA Kein 'VAL_STRG' in TIA v12 ?

DerSigi

Level-1
Beiträge
29
Reaktionspunkte
4
Zuviel Werbung?
-> Hier kostenlos registrieren
[Gelöst] Kein 'VAL_STRG' in TIA v12 ?

Hallo,

ich bin gerade dabei eine RS485-Kommunikation zu programmieren. In der Online-Hilfe bin ich da auf die Funktion 'VAL_STRG' gestolpert, die genau das macht was ich mir sonst alles 'zu Fuß' programmieren müsste.

Dummerweise scheint das TIA-Portal (V12 SP1) diese Funktion nicht zu kennen. Gibt es die tatsächlich nicht (obwohl in der Online-Hilfe erwähnt), oder ich ich nur zu blöd :confused:?

Zielsystem ist eine S7-1500. Ich programmiere in SCL.

Vielen Dank für Eure Hilfe!

LG
Sigi
 
Zuletzt bearbeitet:
Ich hab es nun 'zu Fuß' programmiert. Hier das Ergebnis:

Code:
FUNCTION "fc_Real2String" : Void
{ S7_Optimized_Access := 'FALSE' }
VERSION : 0.1
   VAR_INPUT 
      Value : Real;   // Input value
      Digits : Int;   // digits before the decimal point
      DecPlaces : Int;   // decimal places
   END_VAR

   VAR_OUTPUT 
      ValueString : String;   // value as string
   END_VAR

   VAR_TEMP 
      i : Int;   // loop variable
      j : Int;   // loop variable
      Temp_Real : Real;   // temporary Real-Value
      Temp_DInt : DInt;   // temporary DInt-Value
      Adicity : DInt;   // Adicity of the actual position
      DigitValue : Int;   // value of the actual digit
      StringOut : Array [0 .. 12] of Char;   // array for output string
      StringOut_String AT StringOut : String[10];
      StringPos : Int;   // actual position
      Test : Array [0 .. 12] of Char;
   END_VAR


BEGIN
    // =============================================================================
    //
    // convert REAL to STRING
    //
    // =============================================================================
    //
    // Input:   Value       - input value
    //          Digits      - digits defore the decimal point 
    //          DecPlaces   - digits after the decimal point
    //        
    // Output:  ValueString - Value as string
    // 
    // =============================================================================
    // Last change: 2014-04-30
    // =============================================================================
    //
    // 2014-04-30 First version.
    //
    // =============================================================================
    
    // ===== Limit Value ===========================================================
    // 
    #Temp_Real := #Value;
    IF (#Temp_Real >= (10 ** INT_TO_REAL(#Digits - #DecPlaces))) THEN
      #Temp_Real := (10 ** INT_TO_REAL(#Digits - #DecPlaces)) - 1.0;
    END_IF;
    
    // ===== preinitialize string for output =======================================
    // 
    FOR #i := 1 TO (#Digits + #DecPlaces) DO
      #StringOut_String := CONCAT(IN1:=#StringOut_String, IN2:='0');
    END_FOR;
    IF (#DecPlaces > 0) THEN
      #StringOut_String := CONCAT(IN1:=#StringOut_String, IN2:='0');
    END_IF;
    #j := LEN(IN := #StringOut_String);
    
    // ===== shift decimal point ===================================================
    // 
    FOR #j := 1 TO (#DecPlaces) DO #Temp_Real := #Temp_Real * 10; END_FOR;
    #Temp_DInt := ROUND(#Temp_Real);
    
    // ===== convert value =========================================================
    //
    #StringPos := 2;          // In the first two bytes is the length specification
    #i := (#Digits + #DecPlaces);
    WHILE (#i > 0) DO
      // ===== add decimal point ===================================================
      IF (#i = #DecPlaces) THEN
        #StringOut[#StringPos]  := '.';
        #StringPos := #StringPos + 1;
      END_IF;
      // ===== calculate adicity ===================================================
      // 
      #Adicity := 1;
      FOR #j := 1 TO (#i - 1) DO #Adicity := #Adicity * 10; END_FOR;
      // ===== convert digit =======================================================
      // 
      #DigitValue := DINT_TO_INT(#Temp_DInt / #Adicity);
      #StringOut[#StringPos]  := INT_TO_CHAR(48 + #DigitValue);
      #Temp_DInt := #Temp_DInt - (INT_TO_DINT(#DigitValue) * #Adicity);
      #StringPos := #StringPos + 1;
      #i := #i -1;
    END_WHILE;
    
    // ===== transfer output string ================================================
    // 
    #ValueString := #StringOut_String;
    
END_FUNCTION

Der Code hat zwar ein paar Einschränkungen (es gehen z.B. keine negativen Zahlen), für meine Zwecke reicht es aber.

LG
Sigi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

ja in der Online-Doku habe ich den Befehl ja auch gefunden, nur scheint ihn das TIA-Portal v12 nicht zu kennen. Schon irgendwie komisch :confused:.

LG
Sigi
 
Vielen Dank für den Link Harald!

Es war mir bislang nicht bekannt, das nicht alle Funktionen in allen drei Programmiersprachen zu Verfügung stehen.

LG
Sigi
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Einfacher als VAL_STRG nachzuimplementieren ist es natürlich einen VAL_STRG_WRAPPER zu erstellen, d.h. eine Funktion die VAL_STRG aus FUP oder KOP kapselt und lediglich die Ein- und Ausgabe durchleitet. Diesen VAL_STRG_WRAPPER kann man dann wie gewohnt mit SCL nutzen.
 
Zurück
Oben