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

Ergebnis 1 bis 8 von 8

Thema: CoDeSys Real in String wandeln

  1. #1
    Registriert seit
    03.02.2009
    Beiträge
    33
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,
    ich bin am verzweifeln.
    Im Einsatz habe ich den Wago 750-849 und die CoDeSys 2.3.9.26.
    Ich versuche die Windrichtung (0-360°) in einen String (Nord / Süd...) zu wandeln. Das funktioniert soweit mit meiner kleinen Funktion.
    Merkwürdig ist, dass die IF Anweisung nur dann ausgeführt wird, wenn entweder i eine gerade Zahl (2, 4, 6,...) ist, oder demzufolge die Summe der Variablen Hop*i ein ganzzahliges Ergebnis liefern. Andernfalls wird die gesamte IF Anweisung scheinbar ignoriert.
    Weiß jemand Rat?

    Gruß und Danke
    Guwen

    Hier der Quellcode:

    FUNCTION WindrichtungToString : STRING
    VAR_INPUT
    WindDirection: REAL; (* Windrichtung von 0 - 360° *)
    END_VAR
    VAR
    WindValue : STRING; (*Zeigt den Wert der Windrichtung als String*)
    i : INT; (* allg. Zähler *)
    END_VAR
    VAR CONSTANT
    Hop : REAL := 22.5; (* ein Sprung um 22,5° *)
    END_VAR



    WindValue := REAL_TO_STRING(Winddirection);
    FOR i := 0 TO 15 BY 1 DO
    IF WindDirection > (Hop * INT_TO_REAL(i)) AND WindDirection <= (Hop * INT_TO_REAL(i + 1)) THEN
    CASE i OF
    0,15 : WindrichtungToString :='Nord (';
    1,2 : WindrichtungToString := 'Nord-Ost (';
    3,4 : WindrichtungToString := 'Ost (';
    5,6 : WindrichtungToString := 'Süd-Ost (';
    7,8 : WindrichtungToString := 'Süd (';
    9,10 : WindrichtungToString := 'Süd-West (';
    11,12 : WindrichtungToString := 'West (';
    13,14 : WindrichtungToString := 'Nord-West (';
    END_CASE;
    END_IF;
    i := i +1;
    END_FOR;
    WindrichtungToString := CONCAT(WindrichtungToString, WindValue);
    WindrichtungToString := CONCAT(WindrichtungToString, '°)');
    Zitieren Zitieren CoDeSys Real in String wandeln  

  2. #2
    Registriert seit
    14.08.2004
    Beiträge
    824
    Danke
    45
    Erhielt 73 Danke für 66 Beiträge

    Standard

    Ich glaub, dein AND hat eine höhere Priorität, als der Vergleichsoperator. Setze Klammern.

  3. #3
    Registriert seit
    03.09.2006
    Beiträge
    129
    Danke
    9
    Erhielt 12 Danke für 8 Beiträge

    Standard

    Wozu ist das i:=i+1;

  4. #4
    Registriert seit
    02.10.2010
    Beiträge
    453
    Danke
    62
    Erhielt 87 Danke für 69 Beiträge

    Standard

    Neuer Zählerstand = Alter Zählerstand + 1

  5. #5
    Registriert seit
    24.10.2010
    Beiträge
    132
    Danke
    2
    Erhielt 22 Danke für 22 Beiträge

    Daumen hoch

    Hallo,
    wiso berechnest du i nicht in Abhängigkeit der aktuellen Windrichtung.
    Würd das vielleicht so irgendwie machen:

    Code:
    i := REAL_TO_INT(((WindDirection - (Hop/2.0))*16.0)/360.0);
    IF i <0 THEN
        i:=0;
    END_IF
     
    CASE i OF
        0,15 : WindrichtungToString :='Nord (';
        1,2 : WindrichtungToString := 'Nord-Ost (';
        3,4 : WindrichtungToString := 'Ost (';
        5,6 : WindrichtungToString := 'Süd-Ost (';
        7,8 : WindrichtungToString := 'Süd (';
        9,10 : WindrichtungToString := 'Süd-West (';
        11,12 : WindrichtungToString := 'West (';
        13,14 : WindrichtungToString := 'Nord-West (';
    END_CASE;
    WindrichtungToString := CONCAT(WindrichtungToString, WindValue);
    WindrichtungToString := CONCAT(WindrichtungToString, '°)');
    Kannst ja mal Probieren ob das so Funktioniert.

    Gruß

  6. #6
    Registriert seit
    03.09.2006
    Beiträge
    129
    Danke
    9
    Erhielt 12 Danke für 8 Beiträge

    Standard

    Ach ja, ist ja klar Zählerstand:=Zählerstand+1, aber was macht dann die For Next, nichts oder auch zählen, oder wie jetzt?

  7. #7
    Registriert seit
    12.08.2010
    Beiträge
    236
    Danke
    57
    Erhielt 118 Danke für 57 Beiträge

    Standard

    Nur so ne Idee:
    Zitat aus dem „Handbuch für SPS Programmierung mit CoDeSys 2.3“
    Der Selector der CASE-Anweisung muss vom Typ INT sein
    Vermutlich will der Selector dann auch Integer...

  8. #8
    guwen ist offline Benutzer
    Themenstarter
    Registriert seit
    03.02.2009
    Beiträge
    33
    Danke
    2
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Zitat Zitat von ge_org Beitrag anzeigen
    Ach ja, ist ja klar Zählerstand:=Zählerstand+1, aber was macht dann die For Next, nichts oder auch zählen, oder wie jetzt?
    Hallo und Danke für Eure Antworten.
    Manchmal ist man echt "Betriebsblind".
    Wenn ich i:=i+1; in einer For-Schleife hochzähle, dann wird eigentlich 2x gezählt. Einmal durch die For-Schleife und einmal durch i:=i+1, und somit werden nur gerade Zahlen beachtet.
    Habe i:=i+1; entfernt und alles funktioniert wunderbar.

    Vielen Dank nochmals an Euch für die schnelle Hilfe.

    Gruß
    Guwen

Ähnliche Themen

  1. REAL in TIME wandeln in SCL
    Von zloyduh im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 17.03.2011, 22:24
  2. Float in Real wandeln - SCL
    Von Gerri im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 23.07.2010, 15:29
  3. Real in INT wandeln? & Liste der SFC/SFB?
    Von HSThomas im Forum Simatic
    Antworten: 16
    Letzter Beitrag: 23.03.2010, 16:22
  4. real in ein word wandeln
    Von Dip im Forum Simatic
    Antworten: 8
    Letzter Beitrag: 07.08.2009, 11:35
  5. REAL auf INT wandeln
    Von neibeck im Forum Simatic
    Antworten: 18
    Letzter Beitrag: 14.07.2008, 18:01

Lesezeichen

Berechtigungen

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