Search code examples
plcsttwincat

FB_FileClose is only the first time busy


I'm working with TwinCAT 3 and ST to save data from a socket connection. The sockets work and parts of the saving too, but not all of it. The first array I try to save works fine. But if i want to save another one, it fails. The FB_FileClose doesn't go bBusy.

IF reset THEN // I reset the FB after it saved one array.
    bSuccess := FALSE;
    iError := 0;
    step := 1;
    reset := FALSE;
    MEMSET(ADR(saveArray), 0, SIZEOF(saveArray));
    RETURN;
END_IF
CASE step OF
1:
    IF path = '' THEN
        bSuccess := FALSE;
        iError := 12;
        step := 1;
    END_IF
    fbFileOpen.sPathName := path;
    fbFileOpen.nMode := FOPEN_MODEAPPEND OR FOPEN_MODEPLUS;
    fbFileOpen.bExecute := TRUE;
    fbFileOpen.tTimeout := T#2S;
    fbFileOpen();
    step := 2;

2:
    fbFileOpen(bExecute := FALSE);
    IF NOT fbFileOpen.bBusy AND NOT fbFileOpen.bError THEN 
        step := 3;
    ELSE 
        iError := fbFileOpen.nErrId;
    END_IF

3:
    fbWriteFile.hFile := fbFileOpen.hFile;
    fbWriteFile.bExecute := TRUE;
    fbWriteFile.pWriteBuff := ADR(saveArray);
    fbWriteFile.cbWriteLen := SIZEOF(saveArray);
    fbWriteFile.tTimeout := T#2S;
    fbWriteFile();
    step := 4;

4:
    fbWriteFile(bExecute := FALSE);
    IF NOT fbWriteFile.bBusy AND NOT fbWriteFile.bError THEN
        step := 5;
    END_IF

5:
    fbCloseFile.hFile := fbFileOpen.hFile;
    fbCloseFile.bExecute := TRUE;
    fbCloseFile.tTimeout := T#3S;
    fbCloseFile();
    IF fbCloseFile.bBusy THEN //Gets suck here at the second run. And if I remove it, the FB doesn't get busy and doesn't close my hFile.
        step := 6;
    END_IF


6:
    fbCloseFile(bExecute := FALSE);
    IF NOT fbCloseFile.bBusy AND NOT fbCloseFile.bError THEN
        bSuccess := TRUE;
    ELSE
        iError := fbCloseFile.nErrId;
    END_IF
END_CASE

I also noticed that FB_FileOpen opens the same hFile two times in a row. The second one of it can't get closed from the FB_FileClose. The next run it gets a new hFile and then it can save the data. Next one it can't, and so on. What's my error in this one?

Thank you!


Solution

  • Found the solution by myself after a bit of hackaround. Before I set all the parameters for FB_FileOpen, FB_FileWrite and FB_FileClose I set the execute to false like this:

    1:
        IF path = '' THEN
            bSuccess := FALSE;
            iError := 12;
            step := 1;
        END_IF
        fbFileOpen(bExecute := FALSE); // Set this to false before.
        fbFileOpen.sPathName := path;
        fbFileOpen.nMode := FOPEN_MODEAPPEND OR FOPEN_MODEPLUS;
        fbFileOpen.bExecute := TRUE;
        fbFileOpen.tTimeout := T#2S;
        fbFileOpen();
        step := 2;
    

    Now it's working.