plctwincatststructured-text

FB_FileOpen stays busy, Statemachine not working - TwinCat3


i am trying to get into the beckhoff/twincat universe, therefore is was following along with some twincat tutorials. While programming a simple event-logger I encountered the following problem:

After executing FB_FileOpen, it´s bBusy variable stays True - therefore my statemachine won´t execute any further and is stuck in FILE_OPEN. Any idea, what I did wrong? Here is my code:

VAR
    
FileOpen : FB_FileOpen := (sPathName := 'C:\Events-log.txt', nMode := FOPEN_MODEAPPEND OR FOPEN_MODETEXT);
FileClose :FB_FileClose;
FilePuts : FB_FilePuts;
stEventWrittenToFile : ST_Event;
CsvString : T_MaxString;

eWriteState :(TRIGGER_FILE_OPEN, FILE_OPEN, WAIT_FOR_EVENT,TRIGGER_WRITE_EVENT, WRITE_EVENT, FILE_CLOSE, ERROR);

END_VAR


CASE eWriteState OF 

    TRIGGER_FILE_OPEN : 
        FileOpen(bExecute := TRUE); 
        eWriteState := FILE_OPEN;
        

    FILE_OPEN :
            
        FileOpen(bExecute := FALSE);
        IF FileOpen.bError THEN
            eWriteState := ERROR;
        ELSIF NOT FileOpen.bBusy AND FileOpen.hFile <> 0 THEN
            eWriteState := WAIT_FOR_EVENT;
        END_IF
            
    WAIT_FOR_EVENT :

        //Do nothing, triggered externally by method
        
    TRIGGER_WRITE_EVENT :
            CsvString := ConvertStructureToString(stEvent := stEventWrittenToFile); 
            FilePuts(   sLine:= CsvString,
                        hFile := FileOpen.hFile,
                                bExecute := TRUE,); 
            eWriteState := WRITE_EVENT;
        
    WRITE_EVENT : 
        FilePuts(bExecute := FALSE);
        IF FilePuts.bError THEN
            eWriteState := ERROR;
        ELSIF NOT FilePuts.bBusy THEN
            eWriteState := FILE_CLOSE;
        END_IF
    

    FILE_CLOSE :
        FileClose(  hFile := FileOpen.hFile,
                    bExecute := TRUE);
        IF FileClose.bError = TRUE THEN
            FileClose.bExecute := FALSE;
            eWriteState := ERROR;
        ELSIF NOT FileClose.bBusy THEN
            FileClose.bExecute := FALSE;
            eWriteState := TRIGGER_FILE_OPEN;
        END_IF          
    
    ERROR : // Do nothing





END_CASE

screenshot


Solution

  • I found the error. My mistake was, that I started the state machine with a positive edge from a start variable. Since I am running the task in a 1ms cycle, the whole thing would´ve needed to complete within 1ms then.