FUNCTION_BLOCK FB_BASE_LOG
VAR_INPUT
bExecute : BOOL;
bReset : BOOL;
sFilename : T_MaxString;
pString : POINTER TO T_MaxString;
pBuf : POINTER TO ARRAY [0..99] OF T_MaxString;
END_VAR
VAR_OUTPUT
bBusy : BOOL;
bError : BOOL;
iErrId : UDINT;
bResetOk : BOOL;
sLast : STRING;
nCount : UINT;
END_VAR
VAR
iCount : UINT := 0;
fbOpen : FB_FileOpen;
fbClose : FB_FileClose;
fbPuts : FB_FilePuts;
fbDelete : FB_FileDelete;
hFile : UINT;
fbStringBuf : FB_StringRingBuffer:=(pBuffer:=ADR(aRingBuf),cbBuffer:=SIZEOF(aRingBuf),bOverwrite:=TRUE);
aRingBuf : ARRAY [0..1024] OF STRING;
sRingValue : T_MaxString;
nRingCount : UDINT;
iStep : DWORD;
stRTRIG : R_TRIG;
END_VAR
fbStringBuf(getValue => sRingValue, nCount => nRingCount);
stRTRIG(CLK:=nRingCount > 0);
CASE iStep OF
0: (*Idle state*)
IF stRTRIG.Q THEN
bBusy := TRUE;
iStep := 1;
bResetOk := FALSE;
END_IF;
1: (* Open source file*)
fbOpen( bExecute := FALSE);
fbOpen(sNetId:='',sPathName:=sFilename,nMode:=PATH_GENERIC,nMode:=FOPEN_MODEAPPEND OR FOPEN_MODEPLUS OR FOPEN_MODETEXT,tTimeout:=T#3S,bExecute:=TRUE, hFile => hFile, bError => bError, bBusy => bBusy, nErrId => iErrId);
iStep := iStep + 1;
2:
fbOpen( bExecute := FALSE);
IF NOT(fbOpen.bBusy) THEN
hFile := fbOpen.hFile;
iStep := iStep + 1;
END_IF;
3: (* Write to source file*)
fbStringBuf.A_RemoveHead(getValue => sRingValue, nCount => nRingCount);
fbPuts(bExecute:=FALSE);
fbPuts(sNetId:='',hFile:=hFile,sLine:=fbStringBuf.getValue,bExecute:=TRUE, tTimeout:=T#5S, bError => bError, bBusy => bBusy, nErrId => iErrId);
iStep := iStep + 1;
4:
fbPuts(bExecute:=FALSE);
IF NOT(fbPuts.bBusy) THEN
iStep := iStep + 1;
END_IF;
5:
IF nRingCount > 0 THEN
iStep := 3;
ELSE
iStep := iStep + 1;
END_IF;
6: (* Close source file *)
fbClose(bExecute := FALSE);
fbClose(sNetId:='',hFile:=hFile, bExecute:= TRUE, tTimeout:=T#3S, bError => bError, bBusy => bBusy, nErrId => iErrId);
iStep := iStep + 1;
7:
fbClose(bExecute := FALSE);
IF NOT(fbClose.bBusy) THEN
iStep := iStep + 1;
bBusy := FALSE;
END_IF;
8: (* Delete file *)
IF bReset THEN
fbDelete(bExecute:=FALSE);
fbDelete(sPathName:=sFilename, ePath:=PATH_GENERIC, bExecute:=TRUE);
iStep := iStep + 1;
ELSE
iStep := 0; (* Go to 0 *)
END_IF;
9:
fbDelete(bExecute:=FALSE);
IF NOT(fbDelete.bBusy) THEN
bResetOk := TRUE;
iStep := 0; (* Go to 0 *)
END_IF
END_CASE;