{attribute 'no_assign'} FUNCTION_BLOCK SD_Card_Bin VAR CONSTANT frIdle : INT :=0; frStart : INT :=1; frOpenTest : INT :=2; frCloseTest : INT :=3; frOpen : INT :=4; frWrite : INT :=5; frRead : INT :=6; frClose : INT :=7; frDone : INT :=8; frError : INT :=9; frDelete : INT :=10; frFlush : INT :=11; fileop_Read : INT :=1; fileop_OverWrite: INT :=2; fileop_Append : INT :=3; fileop_Delete : INT :=4; END_VAR VAR_INPUT xExecute : BOOL; WriteBuffer : Buffer; strFileName : CAA.FILENAME; iFileOperation : INT; END_VAR VAR_OUTPUT xDone : BOOL; xError : BOOL; strErrorCodes : STRING; ReadBuffer : Buffer; MessageString : STRING(255); END_VAR VAR fbFileOpen : FILE.Open; fbFileWrite : FILE.Write; fbFileRead : FILE.Read; fbFileClose : FILE.Close; fbFileDelete : FILE.Delete; fbFileFlush : FILE.Flush; fileMode : FILE.Mode; save_handle : CAA.HANDLE; route : INT :=frStart; bytesRead : UINT; END_VAR IF xExecute THEN CASE route OF frStart : fbFileOpen(xExecute:=FALSE); fbFileClose(xExecute:=FALSE); fbFileWrite(xExecute:=FALSE); fbFileRead(xExecute:=FALSE); fbFileDelete(xExecute:=FALSE); fbFileFlush(xExecute:=FALSE); messageString :='Started'; xError :=FALSE; xDone :=FALSE; strErrorCodes := ''; IF iFileOperation = fileop_Append THEN route :=frOpenTest; ELSIF iFileOperation = fileop_OverWrite THEN fileMode :=File.MODE.MRDWR; route :=frOpen; ELSIF iFileOperation = fileop_Delete THEN route := frDelete; ELSE fileMode :=File.MODE.MREAD; route :=frOpen; END_IF frOpenTest: MessageString :='File Present Test;'; fbFileOpen.sFileName :=strFileName; fbFileOpen.eFileMode :=File.MODE.MREAD; fbFileOpen(xExecute :=TRUE); IF fbFileOpen.xDone = TRUE THEN // File Found. so close file and then open for appeand save_handle :=fbFileOpen.hFile; fbFileOpen(xExecute :=FALSE); fileMode :=File.MODE.MAPPD; route :=fRCloseTest; END_IF; IF fbFileOpen.xError THEN // File not Found Therefore Open for Write fbFileOpen(xExecute :=FALSE); fileMode :=File.MODE.MRDWR; route :=frOpen; END_IF frCloseTest: fbFileClose.hFile :=save_handle; fbFileClose(xExecute :=TRUE); IF (fbFileClose.xDone = TRUE) THEN fbFileClose(xExecute :=FALSE); route :=frOpen; END_IF IF (fbFileClose.xError = TRUE) THEN fbFileClose(xExecute :=FALSE); route :=frDone; END_IF frOpen: MessageString :='Open File for Write'; fbFileOpen.sFileName :=strFileName; fbFileOpen.eFileMode :=fileMode; fbFileOpen.xExclusive := TRUE; fbFileOpen(xExecute :=TRUE); IF fbFileOpen.xDone = TRUE THEN // File Open so we can write the data save_handle :=fbFileOpen.hFile; //fbFileOpen(xExecute :=FALSE); IF (iFileOperation= fileop_Read) THEN route :=frRead; ELSE route :=frWrite; END_IF END_IF IF fbFileOpen.xError THEN // Open Failed so exit MessageString :='File Open Failed'; strErrorCodes := CONCAT(strErrorCodes, CONCAT('frOpen:',CONCAT(DecodeFileError(fbFileOpen.eError),' '))); xError :=TRUE; //fbFileOpen(xExecute :=FALSE); route := frDone; END_IF frRead: MessageString :='Read Data'; fbFileRead.hFile :=save_handle; fbFileRead.udiTimeOut :=250000; fbFileRead.pBuffer :=ADR(ReadBuffer.Data); fbFileRead.szBuffer :=SIZEOF(ReadBuffer.Data); fbFileRead(xExecute :=TRUE); IF fbFileRead.xDone = TRUE THEN // read ok MessageString :='Read OK'; ReadBuffer.DataLength := CAA.SIZE_TO_UINT(fbFileRead.szSize); //fbFileRead(xExecute :=FALSE); route :=frClose; END_IF IF fbFileRead.xError = TRUE THEN // Read fail MessageString :='Read Failed'; strErrorCodes := CONCAT(strErrorCodes, CONCAT('frRead:',CONCAT(DecodeFileError(fbFileRead.eError),' '))); xError :=TRUE; //fbFileRead(xExecute :=FALSE); ReadBuffer.DataLength :=0; route :=frClose; END_IF frWrite: MessageString :='Save Data'; fbFileWrite.hFile :=save_handle; fbFileWrite.pbuffer :=ADR(WriteBuffer.Data); fbFileWrite.szSize := WriteBuffer.DataLength; fbFileWrite.udiTimeOut :=100000; fbFileWrite(xExecute :=TRUE); IF fbFileWrite.xDone = TRUE THEN // Write OK so close file MessageString :='Write OK'; //fbFileWrite(xExecute :=FALSE); route :=frFlush; END_IF IF fbFileWrite.xError THEN // Write Failed so set error and close file MessageString :='Write Failed'; strErrorCodes := CONCAT(strErrorCodes, CONCAT('frWrite:',CONCAT(DecodeFileError(fbFileWrite.eError),' '))); xError :=TRUE; //fbFileWrite(xExecute :=FALSE); route :=frClose; END_IF frFlush: fbFileFlush.hfile := save_handle; fbFileFlush(xExecute :=TRUE); IF fbFileFlush.xDone = TRUE THEN MessageString :='File Flushed to Card'; //fbFileFlush(xExecute :=FALSE); route :=frClose; END_IF IF fbFileFlush.xError THEN MessageString :='File Flush Failed'; strErrorCodes := CONCAT(strErrorCodes, CONCAT('frFlush:',CONCAT(DecodeFileError(fbFileFlush.eError),' '))); xError :=TRUE; //fbFileFlush(xExecute :=FALSE); route :=frClose; END_IF frClose: fbFileClose.hfile :=save_handle; // CLose the file which was opened fbFileClose(xExecute :=TRUE); IF fbFileClose.xDone = TRUE THEN MessageString :='File Closed'; //fbFileClose(xExecute :=FALSE); route :=frDone; END_IF IF fbFileClose.xError THEN MessageString :='Close File Failed'; strErrorCodes := CONCAT(strErrorCodes, CONCAT('frClose:',CONCAT(DecodeFileError(fbFileClose.eError),' '))); xError :=TRUE; //fbFileClose(xExecute :=FALSE); route :=frDone; END_IF frDelete: MessageString := 'Delete File'; fbFileDelete.sFileName := strFileName; fbFileDelete(xExecute := TRUE); IF fbFileDelete.xDone THEN MessageString := 'File Deleted'; //fbFileDelete(xExecute :=FALSE); route := frDone; END_IF; IF fbfileDelete.xError THEN MessageString := 'Delete Failed'; strErrorCodes := CONCAT(strErrorCodes, CONCAT('frDelete:',CONCAT(DecodeFileError(fbFileDelete.eError),' '))); xError :=TRUE; //fbFileDelete(xExecute :=FALSE); route := frDone; END_IF frDone: fbFileOpen(xExecute:=FALSE); fbFileClose(xExecute:=FALSE); fbFileWrite(xExecute:=FALSE); fbFileRead(xExecute:=FALSE); fbFileFlush(xExecute:=FALSE); fbFileDelete(xExecute:=FALSE); MessageString := 'Done'; route :=frIdle; xDone :=TRUE; END_CASE ELSE xDone :=TRUE; route :=frStart; END_IF