-> Hier kostenlos registrieren
Hey zusammen,
ich bin relativ neu in der SPS Welt und versuche gerade mit Hilfe der WAGO Beispiel Syslibfile.lib Projekte eigene CSV Dateien schreiben zu lassen.
Umgesetzt wird das Projekt auf einem WAGO 750-8202 und in CoDeSys 2.3 programmiert.
tl;dr:
In den erfolgreich geschriebenen Dateien finde ich nach dem Block aus Zeitangabe, Werten und Zeilenabschluss-Steuerzeichen zusätzliche Zeichen, welche dort ungewollt geschrieben wurden.
Könnte der Fehler in meiner Zeigerarithmetik liegen?
Langfassung:
In einer WerteGenerieren()-Funktion wird mir ein selbstdefinierter Datentyp befüllt: Darin ein eindimensionales Array mit 10 Werten (gc_ColumnCount := 9 global definiert) und die aktuelle Systemzeit:
Danach wird in einem Konvertierungs-Funktionsblock die Umwandlung von typCSV (EingangsArray) in ein ByteArray vorgenommen.
Dazu lasse ich das ByteArray: ARRAY[0..gc_RawDataSize] OF BYTE vor jeder Ausführung löschen und nutze im Anschluss die Zeigerarithmetik aus dem WAGO Beispiel Projekt:
Das ByteArray ist natürlich um einiges größer (durch gc_RawDataSize := 100 global festgelegt) als die Summer aller zu schreibenden Werte (usw.) in Byte.
Der Konvertierungs-Funktionsblock wird im Programm Dateischreiben aufgerufen. Beim Aufruf der Konvertierungsinstanz wird auch die WerteGenerieren()-Funktion aufgerufen.
Das zurückgegebene ByteArray wird nun wie folgt geschrieben:
Nach dem Schreiben steht alles Gewünschte in der erzeugten / erweiterten Datei.
Mein Problem ist, dass nach einem Null-Byte hinter dem Zeilenende-Steuerzeichen ein abgehacktes Datum (15 Byte lang) vom Format DATE_AND_TIME folgt.
Am Besten zu sehen in einem Hex-Editor (Das Markierte ist der unbewusst geschriebene Datumsteil):

Es ist hinter jedem geschriebenen Daten(ByteArray)block. Manchmal fehlen die Zeichen, manchmal stehen dort irgendwelche Zeichen, aber kein Datum... dann sogar im Null-Teil nach hinten verschoben.
Habe ich bei meiner Zeigerarithmetik einen Fehler gemacht oder ist es ein anderer Fehler?
Könnte es auch eine WAGO/Controller spezifische Beschränkung geben, welche ich übersehe?
Ich lasse extra bei jedem Konvertierungsaufruf das ByteArray aufs neue mit Nullen beschreiben, von daher kann ich mir nicht erklären, warum hinter den Zeilenende-Steuerzeichen keine Nullen stehen...
Gibt es vielleicht eine andere Methode mein ByteArray zu füllen/ zu löschen oder sollte ich es mit Strings schreiben versuchen?
Ich will allerdings später viel mehr Werte schreiben, sodass die allgemeine String Längenbeschränkung ein Problem darstellt.
Vielen Dank für eure Hilfe.
MfG
TiI
ich bin relativ neu in der SPS Welt und versuche gerade mit Hilfe der WAGO Beispiel Syslibfile.lib Projekte eigene CSV Dateien schreiben zu lassen.
Umgesetzt wird das Projekt auf einem WAGO 750-8202 und in CoDeSys 2.3 programmiert.
tl;dr:
In den erfolgreich geschriebenen Dateien finde ich nach dem Block aus Zeitangabe, Werten und Zeilenabschluss-Steuerzeichen zusätzliche Zeichen, welche dort ungewollt geschrieben wurden.
Könnte der Fehler in meiner Zeigerarithmetik liegen?
Langfassung:
In einer WerteGenerieren()-Funktion wird mir ein selbstdefinierter Datentyp befüllt: Darin ein eindimensionales Array mit 10 Werten (gc_ColumnCount := 9 global definiert) und die aktuelle Systemzeit:
Code:
TYPE typCSV :
STRUCT
dtTageszeit:DT;
Wert:ARRAY[0..gc_ColumnCount] OF REAL;
END_STRUCT
END_TYPE
Danach wird in einem Konvertierungs-Funktionsblock die Umwandlung von typCSV (EingangsArray) in ein ByteArray vorgenommen.
Dazu lasse ich das ByteArray: ARRAY[0..gc_RawDataSize] OF BYTE vor jeder Ausführung löschen und nutze im Anschluss die Zeigerarithmetik aus dem WAGO Beispiel Projekt:
Code:
FOR z:=0 TO gc_RawDataSize BY 1 DO (* ByteArray löschen *)
ByteArray[z] := 0;
END_FOR
ptString := ADR(ByteArray); (* Pointer auf Anfang des Bytearrays *)
index := 0;
ptString^ := DT_TO_STRING(EingangsArray.dtTageszeit); (* Zeitstempel --> Bytefeld *)
index := index + LEN(ptString^); (* feststellen wieviel Byte benutzt sind *)
ptString := ADR(ByteArray[index]); (* Pointer auf Ende des Wertes *)
FOR i:=0 TO gc_ColumnCount BY 1 DO
ptString^:= trenner; (* Trennzeichen hinter letzten Wert *)
index := index + LEN(ptString^);
ptString := ADR(ByteArray[index]);
ptString^ := REAL_TO_STRING(EingangsArray.Wert[i]); (* Wert in ByteArray schreiben *)
index := index + LEN(ptString^);
ptString := ADR(ByteArray[index]);
END_FOR
ptString^:= '$r$n'; (* new line *)
index := index + LEN(ptString^);
ptString := ADR(ByteArray[index]);
Der Konvertierungs-Funktionsblock wird im Programm Dateischreiben aufgerufen. Beim Aufruf der Konvertierungsinstanz wird auch die WerteGenerieren()-Funktion aufgerufen.
Das zurückgegebene ByteArray wird nun wie folgt geschrieben:
Code:
Konvertierungsinstanz(trenner:= ';', EingangsArray:= WerteGenerieren(), convert_ready=> , ByteArray=> );
groesse := SysFileGetSize(g_sDateiname); (* Größe der Datei feststellen *)
IF Konvertierungsinstanz.convert_ready THEN
handle := SysFileOpen(g_sDateiname, g_zugriff); (* g_zugriff wird mit 'a' initialisiert *)
groesse := groesse + SysFileWrite(handle, ADR(Konvertierungsinstanz.ByteArray),SIZEOF(Konvertierungsinstanz.ByteArray));
file_ok := SysFileClose(handle); (* Datei schließen *)
END_IF
Mein Problem ist, dass nach einem Null-Byte hinter dem Zeilenende-Steuerzeichen ein abgehacktes Datum (15 Byte lang) vom Format DATE_AND_TIME folgt.
Am Besten zu sehen in einem Hex-Editor (Das Markierte ist der unbewusst geschriebene Datumsteil):

Es ist hinter jedem geschriebenen Daten(ByteArray)block. Manchmal fehlen die Zeichen, manchmal stehen dort irgendwelche Zeichen, aber kein Datum... dann sogar im Null-Teil nach hinten verschoben.
Habe ich bei meiner Zeigerarithmetik einen Fehler gemacht oder ist es ein anderer Fehler?
Könnte es auch eine WAGO/Controller spezifische Beschränkung geben, welche ich übersehe?
Ich lasse extra bei jedem Konvertierungsaufruf das ByteArray aufs neue mit Nullen beschreiben, von daher kann ich mir nicht erklären, warum hinter den Zeilenende-Steuerzeichen keine Nullen stehen...
Gibt es vielleicht eine andere Methode mein ByteArray zu füllen/ zu löschen oder sollte ich es mit Strings schreiben versuchen?
Ich will allerdings später viel mehr Werte schreiben, sodass die allgemeine String Längenbeschränkung ein Problem darstellt.
Vielen Dank für eure Hilfe.
MfG
TiI
Zuletzt bearbeitet: