Chriis - 2016-10-27

Hallo,

es tut mir leid wen ich das Thema zum Gefühlt "1000." mal für euch wieder aufrolle.... aber es geht nicht direkt um das Thema Erstellung der .csv Datei sondern eher um ein paar Zusatzfunktionen und um einen etwas formelleren Programmierstil evtl..

Zum Anfang erstmal ich schreibe derzeit meine Bachelorarbeit mithilfe von CODESYS. Programmiert wird mit CODESYS V3 und dazu wird ein Raspberry Pi mit externer E//A-Karte angesteuert.

Zu meinem Problem:

Erstellung der CSV-Datei ist kein Problem auch auf meinem Zielsystem wird sie geöffnet, geschrieben und geschlossen. Ich schreib zum Anfang erst einmal meinen Quellcode und danach meine eigentlichen Probleme

FUNCTION_BLOCK Logfile_uebertragen
VAR_INPUT
   Logfile_komplett : ARRAY[0..8] OF STRING;
END_VAR
VAR_OUTPUT
END_VAR
VAR
   pResult : POINTER TO RTS_IEC_RESULT;
   Filename : STRING := '/home/pi/Desktop/test.csv';
   NewLine : STRING := '$N';
   handle: RTS_IEC_HANDLE ;
   write: __XWORD;
   writeBuffer: STRING;
   Timer : TON;
   Pos: RTS_IEC_RESULT;
   Position: __XWORD;
   i : INT;
END_VAR
Timer(
      IN:= NOT Timer.Q,
      PT:=T#10S
   );
   
IF Timer.Q THEN
   
   writeBuffer := '';
   FOR i := 0 TO 8 DO
      writebuffer := CONCAT(STR1:=writeBuffer,STR2:= Logfile_komplett[i]);
      writebuffer := CONCAT(STR1:=writeBuffer,STR2:=';');
   END_FOR    
    handle := Sysfileopen(
                     szFile:=Filename,
                     am:=ACCESS_MODE.AM_APPEND,
                     pResult:=ADR(presult)
                  );
   
   IF handle <> 0 THEN   
   
    Pos := SysFileGetPos(
                     hFile:=handle,
                     pulPos:=ADR(Position)
                  );               
   
    write := Sysfilewrite(   
                     hFile:=handle,
                     pbyBuffer:=ADR(writeBuffer),
                     ulSize:=LEN(writeBuffer),
                     pResult:=ADR(presult)
                  );
   
    write := Sysfilewrite(   
                     hFile:=handle,
                     pbyBuffer:=ADR(NewLine),
                     ulSize:=LEN(NewLine),
                     pResult:=ADR(presult)
                  );                  
                  
   Sysfileclose(
               hFile:=handle
               );
   END_IF
   
   Position := SysFileGetSize(
                        szFileName:=Filename,
                        pResult:=ADR(presult)
                      );            
END_IF

Nun zu meinen eigetntlichen Fragen:

1) Im Programm selbst hab ich das Schreiben der .CSV-Datei in einem Funktionsbaustein, der immoment dauerhaft im PLC_PRG aufgerufen wird. Ich wollte dies evtl. auf einen Funktionsaufruf ändern, damit er nur beim Setzen einer bestimmten Variable aufgerufen wird oder sollte ich ihn als neues PRG deklarieren und dabei als ein Ereignis aufrufen? Wie ist dabei der "schönste" Programmierstil bzw. die "richtige" Vorgehensweise?

2) Zurzeit wird im Testprogramm selbst, die .CSV alle 5 Sekunden beschrieben mit einem ARRAY OF STRINGS, den ich über einen anderen FB als Input Variable hereinbekomm. Jedoch wollte ich nun den Zyklischen Aufruf soweit abändern, dass die Datei alle 24 Std., d.h. jeden Tag neu erstellt und beschrieben werden kann. Wie kann ich dabei am besten vorgehen? kann ich dabei mir eine Variable mit dem heutigen Datum beschreiben und diese dann bei Aufruf mit dem Systemdatum vergleichen oder gäbe es dabei eine andere Möglichkeit? Und wie kann ich dabei die Datei neu erstellen mit einem neuen Dateiname + Datum (Bsp: test_2016_10_27.csv) ohne dass die alte Datei dabei überschrieben wird? Hat hier jemand vllt. ein Beispiel oder einen Vorschlag für mich?

3) In der .CSV bräuchte ich noch eine Kopfzeile mit den jeweiligen Beschreibungen dazu, ich weiß, dass ich dabei auch wieder mit dem Sysfilewrite() vorgehen muss und mit dabei einen eigenen String erstellen muss der jeweils die Beschreibungen noch dabei hat, jedoch wie kann ich dann abfragen ob die Kopfzeile schon existiert bzw. diesen Befehl dabei nur einmalig pro Datei (also wie in Punkt 2) beschrieben pro Tag) geschrieben wird?

Über Lösungsansätze oder Verbesserungsvorschläge im Quellcode wäre ich euch dankbar.
Vielen Dank schonmal im Vorraus.

Gruß

Chriis