# CoDeSys Real in String wandeln



## guwen (7 April 2011)

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, '°)');


----------



## drfunfrock (7 April 2011)

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


----------



## ge_org (7 April 2011)

Wozu ist das i:=i+1;


----------



## Corosop15 (7 April 2011)

Neuer Zählerstand = Alter Zählerstand + 1


----------



## Ghosty (7 April 2011)

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


```
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ß


----------



## ge_org (7 April 2011)

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?


----------



## Cassandra (8 April 2011)

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...


----------



## guwen (8 April 2011)

ge_org schrieb:


> 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


----------

