TwinCAT Probleme mit FB Aufruf

ReMaTho

Level-1
Beiträge
3
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo alle miteinander,

ich glaube, mein Problem wird für euch ein klacks sein- und ihr werdet mir schnell helfen können:
Ich habe (versucht) mir einen Baustein zu schreiben, in dem ich die Kommandos FB_Fileopen, FileWrite und FileClose automatisiert ablaufen lasse.

So weit so gut- ich kann mit die drei Bausteine umgehen- wenn ich sie "händisch hintereinander antriggere tun sie genau was sie sollen- nur in meiner Case Anweisung tun Sie das leider nur beim ersten Durchlauf nachdem ich die Konfiguration geladen habe- beim zweiten bleib ich beim case 10- den File Open stecken- der wird nicht ausgeführt- geht auch dann nicht auf busy.
Hier mein Code:


Code:
CASE uiStpLogger OF    0:    //Wait for Trigger
         IF bWriteData THEN
            bWritingDone := FALSE;
            
            uiStpLogger := 10;
            
        END_IF
    10: // create or open File
    //fopen.bExecute := TRUE;
        fOpen(
            sNetId:= , 
            sPathName:= sPathname, 
            nMode:= FOPEN_MODEAPPEND OR FOPEN_MODETEXT, 
            ePath:= , 
            bExecute:= TRUE, 
            tTimeout:= tTimeout, 
            bBusy=> ob, 
            bError=> ob1, 
            nErrId=> ner, 
            hFile=> hFile);
            
        fOBusy(CLK:= fopen.bBusy, Q=> );
                    
        IF fobusy.Q THEN
            fopen.bExecute:=FALSE;
            
            uiStpLogger := 20;
                            
        END_IF
        
        IF fopen.bError =TRUE THEN
            uiStpLogger := 100;
        END_IF
    
    20: //write to file
    fwrite.bExecute := TRUE;
        fWrite(
            sNetId:= , 
            hFile:= hFile, 
            pWriteBuff:= ADR(sStringtoWrite), 
            cbWriteLen:= INT_TO_UDINT(len(sStringtoWrite)), 
            bExecute:= , 
            tTimeout:= tTimeout, 
            bBusy=> , 
            bError=> , 
            nErrId=> , 
            cbWrite=> );
        
        fWBusy(CLK:= fwrite.bBusy, Q=> );
            
        IF fwbusy.Q THEN
            fwrite.bExecute := FALSE;
            
            uiStpLogger := 30;
            
        END_IF
        
        IF fwrite.bError = TRUE THEN
            uiStpLogger := 100;
        END_IF
    30: //Close File
    fclose.bExecute := TRUE;
        fClose(
            sNetId:= , 
            hFile:= hfile, 
            bExecute:= TRUE, 
            tTimeout:= tTimeout, 
            bBusy=> , 
            bError=> , 
            nErrId=> );
        
        fCBusy(CLK:= fclose.bBusy, Q=> );    
        
        IF fcbusy.Q THEN
            fclose.bExecute := FALSE;
            bWritingDone := TRUE;
            bWriteData := FALSE;
            uiStpLogger := 0;
            
            
            
        END_IF
        
        IF fclose.bError =TRUE THEN
            uiStpLogger := 100;
        END_IF
        
    
    100: //Error Handling
        IF fopen.bError THEN //Error at Open File
            bError := TRUE;
            udiErrorId := fopen.nErrId;
            ELSE
                IF fwrite.bError THEN //Error at Write File
                    berror := TRUE;
                    udiErrorId:= fwrite.nErrId;
                    ELSE
                        IF fclose.bError THEN //Error at Close File
                            berror := TRUE;
                            udiErrorid := fclose.nErrId;                    
                        END_IF                    
                END_IF
        END_IF
            
END_CASE

Ich bedank mich schonmal für eure Hilfe :)

Und ich würd mich auch freuen- wenn ich einen Input bekommen würd, was man da noch verbessern könnt... steh erst am Anfang meiner Programmierkarriere :) :) Also auch dafür danke :)
 
Zuletzt bearbeitet:
Das "bExecute:=false" nach der Dateioperation reicht nicht, Du muss den Datei-FB auch noch einmal mit bExecute:=false aufrufen.

Zum Thema Verbesserungen:
Warum setzt Du bExecute vor dem FB-Aufruf auf True? Das kannst Du doch auch beim Aufruf tun.
Anstatt die Low-Flanke von bBusy mit einem Trigger-FB zu erkennen, kannst Du für das Warten auf bBusy=false auch eigene Schritte in Deiner Schrittkette definieren. Grundsätzlich sind bedingt aufgerufene Trigger-FBs gefährlich, wenn sie nach dem Trigger nicht mehr aufgerufen werden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Okay- vielen Dank- ich glaub, ich weiss was du meinst.
Das heisst, ich könnt einfach die drei FB Aufrufe ausserhalb der Schrittkette Aufruren und darin Beschrieben?
Damit wäre Problem Nummer 1 erledigt- und für die Busy auswertung werde ich noch eigeen Schritte machen.
Danke einstweilen :)
 
Zurück
Oben