# type umwandeln in CoDeSys St



## Frau (24 Juli 2011)

Bonsoir,

wie kann man ein string array in ein benutzerdefinierten type wandeln?
Meine ich in ein struct zu umwandeln


----------



## Thomas_v2.1 (24 Juli 2011)

Hm, erkläre nochmal genau was du wandeln willst:

1.) Quell-Datentyp und einen Beispielwert
2.) Ziel-Datentyp

Um einen String in einen anderen Wert zu konvertieren gibt es diverse Konvertierungsfunktionen. Z.B. um einen String in einen Integer zu wandeln gibt es STRING_TO_INT. Für andere Umwandlungen hat das STRING_TO... eine entsprechend andere Endung wie BOOL/REAL/TIME etc.


----------



## Frau (24 Juli 2011)

Danke erstmal,
ich habe festgestellt dass ich mein problem nicht richtig erklärt habe.
hier ist die genaue beschreibung :
ich habe ein csv datei die ich konvertiere in einer string-Array, anschließend musse ich der String-Array in ein andere selbst definerte type zu umwandeln.
Hat jemand da eine Idee wie ich das problem lösen könnte?

Et merci en avance


----------



## StructuredTrash (24 Juli 2011)

Das Problem ist immer noch nicht verständlich. Schreib doch mal ein Beispiel. Was steht in einem String Deines Arrays und wie soll das im dazugehörigen Struct aussehen?


----------



## Frau (24 Juli 2011)

Bonjour,

ich lese Daten von einen *.csv Datei und ich tue sie konvertieren dabei in ein Array von stringformat: der so deklariert: 
*data :* *Array[0..MAX_CSV_ROWS,0..MAX_CSV_COLUMNS] of String(MAX_CSV_FIELD_LENGTH);* (*Jetzt das ist mein quellArray die ich in ein andere Array konvertieren will; der neue Array brauche ich um weiter zu arbeiten und er ist so deklariert :*)
*temp: Array[0..MAX_CSV_ROWS,0..MAX_CSV_COLUMNS] of t_array;

*N.B:
t_array ist ein neue Datentype die ich erstellt habe nach mein Bedürfnisse, und die sieht so aus :
*TYPE t_array :
Struct
        Zo:uint;
        sTemp:Lreal;
        eTemp:Lreal;
        usFehler:Lreal;
        osFehler:Lreal;
END_STRUCT
END_TYPE*

und jetzt die Frage ob jemand einen Vorschlag hat wie das gehen soll?

falls immer noch nicht klar ist können sie ruhig weitere Faggen stellen


----------



## Thomas_v2.1 (24 Juli 2011)

Eigentlich müsste dein t_array genau so viele Felder haben wie Spalten in einer Zeile der CSV-Datei vorhanden sind.
Dann ist temp nur noch ein eindimensionales Array, weil die zweite Dimension quasi in den Elemtenten der Struktur steckt.
Sollte dann also eigentlich so lauten:

```
temp: ARRAY[0..MAX_CSV_ROWS] OF t_array;
```

Um festzulegen in welchen Spalten-Nummern die Einträge der Struktur stehen, könnte man über Konstanten gehen:

```
VAR CONSTANT
	col_Zo : INT := 0; 		(* Spalten-Nr. des Eintrags *)
	col_sTemp : INT := 1;		(* Spalten-Nr. des Eintrags *)
	col_eTemp : INT := 2;		(* Spalten-Nr. des Eintrags *)
	col_usFehler : INT := 3;	(* Spalten-Nr. des Eintrags *)
	col_osFehler : INT := 4;	(* Spalten-Nr. des Eintrags *)
END_VAR
```

Wenn du dann noch eine Laufvariable z.B. row von Typ INT anlegst, kannst du die CSV-Datei (bzw. das String array) mit folgender Schleife einlesen:


```
FOR row := 0 TO MAX_CSV_ROWS DO
	temp[row].Zo := STRING_TO_UINT(data[row, col_Zo]);
	temp[row].sTemp:= STRING_TO_LREAL(data[row, col_sTemp]);
	temp[row].eTemp:= STRING_TO_LREAL(data[row, col_eTemp]);
	temp[row].usFehler:= STRING_TO_LREAL(data[row, col_usFehler]);
	temp[row].osFehler:= STRING_TO_LREAL(data[row, col_osFehler]);
END_FOR
```

Ich hoffe das war es was du gemeint hast.

Wenn du dir nicht sicher sein kannst dass die CSV-Einträge korrekt sind z.B. wenn sie von einem Mitarbeiter händisch bearbeitet werden, muss noch geprüft werden ob die Stringumwandlung korrekt war.


----------



## Frau (24 Juli 2011)

Danke Thomas,

Sehr gute Idee, ich bin dabei jetzt das zu testen

tu es       
	

	
	
		
		

		
			









génial  et merci


----------

