Textdatei schreiben

B_Hag

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
[FONT=&quot]Guten Tag zusammen,


Für mein Projekt muss eine .txt- Datei mit dem Inhalt eines Array of Strings aus einer SQL- Abfrage erstellt werden.
Derzeit erstelle ich mir meine Zeilen aus dem Inhalt des Arrays und Formatierungszeichen mit CONCAT und schreibe die Datei dann zeilenweise mit CAA_File.

Jedoch werden meistens nur noch die Erste und eventuell auch ein paar weitere Zeilen richtig geschrieben, ansonsten nur die Trennzeichen, die ich mit CONCAT eingefügt habe.
icon_sad.gif

Vermutlich ist die Zugriffszeit meiner SD-Karte zu lang.

Kennt jemand eine Lösung für dieses Problem oder eine andere Methode zum schreiben von Dateien?

PS: Meine Steuerung ist ein PiXtend V2 (Raspberry Pi mit Stretch) mit Codesys 3.5 SP14[/FONT]
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Klar, hier ist der Code. Ich habe mich an Quellen im Netz orientiert, und bin mit meinem Latein am Ende.

Code:
IF xInit THEN	
	CASE iState OF
	0:									 //Datei mit Schreibrechten öffnen/erstellen
	   FileOpen(xExecute:= TRUE, sFileName:= sFileName, xExclusive:= FALSE, eFileMode:= File.MODE.MWRITE);
	   IF FileOpen.xDone = TRUE THEN
		   iState := 1;						// Zählvariable
		   hfile := FileOpen.hFile;
		   FileOpen(xExecute:= FALSE);
	   ELSIF FileOpen.xError = TRUE THEN
		   iState:= 32000;					
		   FileOpen(xExecute:= FALSE);
	   END_IF
	
	1: 								// Erste Zeile schreiben		
	   sWriteLine := 'Vorgangsnummer:' ; 		// 1. Zeile
	   sWriteLine := CONCAT(sWriteLine, gvl.sVorgNr);
	   sWriteLine := CONCAT(sWriteLine, sCR);
	   FileWrite(xExecute:= TRUE,hFile:= hfile, pBuffer:= ADR(sWriteLine), szSize:= INT_TO_UDINT(LEN(sWriteLine)));
	  IF FileWrite.xDone = TRUE THEN
		   iState := 2;
		   FileWrite(xExecute:= FALSE);
	   ELSIF FileOpen.xError = TRUE THEN
		   iState:= 32767;
		   FileWrite(xExecute:= FALSE);
	   END_IF
			 
	2: 									// Datei schliessen.
	   FileClose(xExecute:= TRUE, hFile:= hfile);
	   IF FileClose.xDone = TRUE THEN
		   iState := 6;													
		   FileClose(xExecute:= FALSE);
	   ELSIF FileClose.xError = TRUE THEN
		   iState:= 32000;
		   FileClose(xExecute:= FALSE);
	   END_IF
	  
	6: 					// Datei mit Append-Rechten erneut öffnen.
	   FileOpen(xExecute:= TRUE, sFileName:= sFileName, xExclusive:= FALSE, eFileMode:= File.MODE.MAPPD);
	   IF FileOpen.xDone = TRUE THEN
		   iState := 7;
		   hfile := FileOpen.hFile;
		   FileOpen(xExecute:= FALSE);
	   ELSIF FileOpen.xError = TRUE THEN
		   iState:= 32000;
		   FileOpen(xExecute:= FALSE);
	   END_IF
	   
	7: 					// String anhängen.								
	   sWriteLine := CONCAT(POU_Main.inSqlExampleSCL.asData[(iWriteIndex),0],',$T'); 			// "Stringmontage"
	   sWriteLine := CONCAT(sWriteLine,POU_Main.inSqlExampleSCL.asData[(iWriteIndex),1]);
	   sWriteLine := CONCAT(sWriteLine,sCR);                                                                                   // Zeile vollständig mit Zeilenumbruch
	   
	   FileWrite(xExecute:= TRUE, hFile:= hfile, pBuffer:=ADR(sWriteLine), szSize:= INT_TO_UDINT(LEN(sWriteLine))); // schreiben
	   iWriteIndex := iWriteIndex + 1;
	   
	   IF FileWrite.xDone = TRUE THEN									
		   iState := 8;
		   FileWrite(xExecute:= FALSE);
	   ELSIF FileWrite.xError = TRUE THEN
		   iState:= 32000;
		   FileWrite(xExecute:= FALSE);
	   END_IF
	
	8: 					// Neue Zeile anhängen bis alle Zeilen aus SQL-Antwort geschrieben wurden.	  
	   IF iWriteIndex <= gvS4A.inSQL4Codesys.stResult.dwResultRows THEN	
		   iState := 7;
	   ELSIF iWriteIndex > gvS4A.inSQL4Codesys.stResult.dwResultRows THEN
		   iState := 9;
	   END_IF
	      
	9:				 // Datei schliessen
	   FileClose(xExecute:= TRUE, hFile:= hfile);
	   IF FileClose.xDone = TRUE THEN
		   iState := 16;
		   FileClose(xExecute:= FALSE);
	   ELSIF FileClose.xError = TRUE THEN
		   iState:= 32000;
		   FileClose(xExecute:= FALSE);
	   END_IF
	   
	
	16: 		// Test erfolgt.
	  	xTestDone := TRUE;
		xError := FALSE; 
					
	32000: 
		xTestDone := FALSE;
		xError := TRUE;				 
	 
END_CASE

Ich freue mich über Anregungen und Verbesserungsvorschläge.
 
Wie groß wird der String denn? Das die Stringbefehle nur bis 255 Zeichen arbeiten weißt Du?
Wenn die Trennzeichen geschrieben werden aber sonst nichts scheint der Schreibbefehl an sich ja zu arbeiten, kontrollier doch mal, ob die auch wirklich in den Variablen stehen wenn CONCAT aufgerufen wird. Ansonsten gilt noch der Hinweis mit der Länge.
 
Du hast Recht, das Array ist teilweise leer. Hab also auch ein Problem mit dem SQL-FB.
Aber es werden auch die vorhanden Felder nicht geschrieben. Die erste Zeile klappt meistens noch, aber bei den Zeilen mit MAPPEND-Rechten kommt vielleicht noch die Erste, seltener auch noch die Dritte, Fünfte Zeile.
An der Stringlänge liegt es nicht, Keiner hat mehr als 50 Zeichen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich glaube ich habe den Fehler.
Du erhöst iWriteIndex zu früh, Du darfst ihn erst nach der IF-Abfrage erhöhen. Das Schreiben dauert meist mehr als einen Zyklus und in der Zeit wird der Index bei jedem Zyklus erhöht, er soll aber denke ich mal nur nach dem erfolgreichen Schreiben um 1 erhöht werden..
 
Ja!
Jetzt hab ich zwar noch das Problem mit dem unvollständigen Array, aber nach dem ich die Zeile unter die IF-Abfrage verschoben habe, werden die vorhanden Einträge auch geschrieben.

Danke, da wäre ich von alleine nie drauf gekommen.
 
Zuletzt bearbeitet:
Zurück
Oben