Danke Zotos. Ich habe es versucht mir selbst zu erarbeiten mit Hilfe eines Vordruckes. Nur leider bin ich nach 8 Stunden noch immer zu keinem Ergebnis gekommen. Hier mal mein Versuch.
Funktionsbaustein
RisingEdgeWriteData(clk:=xStrobeWriteData);
IF RisingEdgeWriteData.q THEN
IF( xFileOpen = FALSE) THEN
dwFileHandle := SysFileOpen(sFileName, 'a');
xFileOpen := TRUE;
END_IF;
IF xHeader THEN
SysFileWrite(dwFileHandle, ADR( sHeader), LEN(sHeader));
END_IF
SysFileWrite(dwFileHandle, ADR( sDataString), LEN(sDataString));
udiWriteCounter :=udiWriteCounter+1;
IF sFileNameOld<>sFileName THEN
udiWriteCounter :=1;
END_IF
sFileNameOld:=sFileName;
END_IF;
IF( NOT xKeepFileOpen AND xFileOpen)THEN
xError:= SysFileClose(dwFileHandle);
IF xError THEN
xFileOpen := FALSE;
xError:=FALSE;
END_IF;
END_IF;
PLC_PRG
(*Data logging every 5s*)
Timer(IN:=TRUE , PT:=t#5s );
xStrobeWriteData:=Timer.q;
IF Timer.q THEN
Timer(IN:=FALSE , PT:=t#5s );
Timer(IN:=TRUE , PT:=t#5s );
END_IF
(*Take Header if the file is new*)
RisingEdgeWriteData(clk:=xStrobeWriteData);
IF RisingEdgeWriteData.q THEN
(*Header*)
sHeader:='Date;Time;Info1;Info2;Data1;Data2;$N';
(*Date and Time for file name and data*)
S40_GetRealTimeClock1(
Month=>usiMonth ,
Day=>usiDay ,
Hour=>usiHour ,
Minute=>usiMinute ,
Second=>usiSecond );
uiYear:=USINT_TO_UINT(S40_GetRealTimeClock1.Year)+2000;
(*Data String*)
sDataString1:='';
sDataString1:= CONCAT(sDataString1,USINT_TO_STRING(usiDay));
sDataString1:= CONCAT(sDataString1,'.');
sDataString1:= CONCAT(sDataString1,USINT_TO_STRING(usiMonth));
sDataString1:= CONCAT(sDataString1,'.');
sDataString1:= CONCAT(sDataString1,UINT_TO_STRING(uiYear));
sDataString1:= CONCAT(sDataString1,';');
sDataString1:= CONCAT(sDataString1,USINT_TO_STRING(usiHour));
sDataString1:= CONCAT(sDataString1,':');
sDataString1:= CONCAT(sDataString1,USINT_TO_STRING(usiMinute));
sDataString1:= CONCAT(sDataString1,':');
sDataString1:= CONCAT(sDataString1,USINT_TO_STRING(usiSecond));
sDataString1:= CONCAT(sDataString1,';');
sDataString1:= CONCAT(sDataString1,Info1);
sDataString1:= CONCAT(sDataString1,';');
sDataString1:= CONCAT(sDataString1,Info2);
sDataString1:= CONCAT(sDataString1,';');
sDataString1:= CONCAT(sDataString1,INT_TO_STRING(iData1));
sDataString1:= CONCAT(sDataString1,';');
sDataString1:= CONCAT(sDataString1,INT_TO_STRING(iData2));
sDataString1:= CONCAT(sDataString1,'$N');
(*Filename for data logging. Every day a new file name*)
sDataloggingFileName:= '\DISK_MMC\' ;
(*sDataloggingFileName:= CONCAT(sDataloggingFileName, Directory);
sDataloggingFileName:= CONCAT(sDataloggingFileName,'\');*)
sDataloggingFileName:= CONCAT(sDataloggingFileName, 'TestDataloggingFile');
sDataloggingFileName:= CONCAT(sDataloggingFileName,'_');
sDataloggingFileName:= CONCAT(sDataloggingFileName,USINT_TO_STRING(usiDay));
sDataloggingFileName:= CONCAT(sDataloggingFileName,'-');
sDataloggingFileName:= CONCAT(sDataloggingFileName,USINT_TO_STRING(usiMonth));
sDataloggingFileName:= CONCAT(sDataloggingFileName,'-');
sDataloggingFileName:= CONCAT(sDataloggingFileName,UINT_TO_STRING(uiYear));
sDataloggingFileName:= CONCAT(sDataloggingFileName,'.csv');
(*Header or Data*)
xHeader:=sDataloggingFileNameOld<>sDataloggingFileName;
sDataloggingFileNameOld:=sDataloggingFileName;
END_IF
(*Open, write and close the data logging file*)
OpenWriteCloseFile_1(
xStrobeWriteData:=xStrobeWriteData ,
xHeader:=xHeader,
sHeader:=sHeader,
sDataString:=sDataString1,
sFileName:=sDataloggingFileName,
xFileOpen=>xFileOpen,
udiWriteCounter=>udiWriteCounter );
Aber das kann nicht in ein PLC geschrieben werden und er macht keine zusätzliche Freizeile rein. Das Prog läuft ohne Fehler aber die Datei wird nicht befüllt bei mir.
Vielleicht findest du ein schreibfehler oder ähnliches.
MFG Dennis