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

Ergebnis 1 bis 9 von 9

Thema: Kein 'VAL_STRG' in TIA v12 ?

  1. #1
    Registriert seit
    21.06.2010
    Beiträge
    29
    Danke
    4
    Erhielt 4 Danke für 2 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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 ?

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

    Vielen Dank für Eure Hilfe!

    LG
    Sigi
    Geändert von DerSigi (02.05.2014 um 09:15 Uhr)
    Zitieren Zitieren [Gelöst] Kein 'VAL_STRG' in TIA v12 ?  

  2. #2
    DerSigi ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    21.06.2010
    Beiträge
    29
    Danke
    4
    Erhielt 4 Danke für 2 Beiträge

    Standard

    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

  3. #3
    Registriert seit
    29.03.2004
    Beiträge
    5.792
    Danke
    144
    Erhielt 1.706 Danke für 1.238 Beiträge

    Standard

    REAL_TO_STRING wäre die Funktion der Wahl gewesen.
    Code:
    #stringVar := REAL_TO_STRING(#realVar);
    Der Wert wird aber glaube ich anders formatiert als es deine Funktion jetzt macht.

  4. #4
    DerSigi ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    21.06.2010
    Beiträge
    29
    Danke
    4
    Erhielt 4 Danke für 2 Beiträge

    Standard

    Zitat Zitat von Thomas_v2.1 Beitrag anzeigen
    Der Wert wird aber glaube ich anders formatiert als es deine Funktion jetzt macht.
    Genau! Weshalb ich ja ursprünglich 'VAL_STRG' verwenden wollte.

    Ich brauche den Wert mit einer definierten Zahl von Vor- und Nachkommastellen um das Ergbnis dann in eine (RS485-)Telegramm zu kopieren.

    LG
    Sigi

  5. #5
    Registriert seit
    24.04.2013
    Beiträge
    309
    Danke
    23
    Erhielt 160 Danke für 88 Beiträge

    Standard

    Hi

    VAL_STRG gibt es sehr wohl. Hier ne nette Seite im Berger Buch.

    http://books.google.de/books?id=cFBq...l_strg&f=false

    Mittels der Parameter Size und Prec kommst du genau dahin wo du hin willst.

    'n schön' Tach auch.
    HB

  6. #6
    DerSigi ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    21.06.2010
    Beiträge
    29
    Danke
    4
    Erhielt 4 Danke für 2 Beiträge

    Standard

    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 .

    LG
    Sigi

  7. #7
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.288
    Danke
    932
    Erhielt 3.320 Danke für 2.682 Beiträge

    Standard

    VAL_STRG gibt es nur in FUP und KOP, in SCL muß man wohl ..._TO_STRG verwenden.
    TIA Anweisungen Vergleichsliste für S7-300, S7-400, S7-1200, S7-1500

    Harald
    Es ist immer wieder überraschend, wie etwas plötzlich funktioniert, sobald man alles richtig macht.

    FAQ: Linkliste SIMATIC-Kommunikation über Ethernet

  8. Folgender Benutzer sagt Danke zu PN/DP für den nützlichen Beitrag:

    DerSigi (05.05.2014)

  9. #8
    DerSigi ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    21.06.2010
    Beiträge
    29
    Danke
    4
    Erhielt 4 Danke für 2 Beiträge

    Standard

    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

  10. #9
    Registriert seit
    29.07.2005
    Beiträge
    82
    Danke
    3
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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.

Ähnliche Themen

  1. TIA Tia v12 / v13
    Von rise66 im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 04.04.2014, 16:23
  2. TIA Analogverarbeitung in TIA V12
    Von Bastjon im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 02.04.2014, 15:01
  3. TIA TIA V12 Stack
    Von Markus im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 31.03.2014, 20:29
  4. Antworten: 19
    Letzter Beitrag: 10.08.2013, 17:02
  5. TIA V12 Update1
    Von erzteufele im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 21.03.2013, 10:50

Lesezeichen

Berechtigungen

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