TwinCAT program problem

schakel

Level-1
Beiträge
15
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
TwinCAT program probleme

Hallo allen zusammen,

Ich bin neu mit TwinCAT und bin fur mein Praktikum beschäftigt mit ein EPC CX9020-0111.
Das Programm was ich geschrieben hab, macht drei log Dateien.
Mann kann ein log machen via ein HMI Schirm.

Wenn ich den EPC starte und ein log mach, funktioniert alles richtig. Die Datei haben die richtige grobe und enthalten die richtige Daten.
Aber wenn ich ein zweiten log machen möchte gibt es immer ein Fehler. Er fehlt Data in ein Datei oder ein Datei ist komplett leer.

Ich begreife nur nicht warum es den erste Mahl richtig funktioniert und danach nicht mehr.


Code:
Communication;                                (*In het blok communication zal er gekeken worden of er nog communicatie is tussen PLC en EPC*)

IF NOT TON1.Q AND  NOT TON2.Q THEN         (*Als de communicatie aanwezig is dan zullen de uitgangen van TON1 en TON2 niet aanwezig zijn*)

    IF HMI_test_Bit_PLC AND NOT HMI_test_bit_Epc AND NOT tp1.Q AND NOT alarm_bit THEN
        log_bit_EPC:=TRUE;
        STEP:=1;
    ELSIF  NOT hmi_test_bit_plc AND hmi_test_bit_EPC  THEN
        hmi_test_bit_EPC:=FALSE;
    ELSIF alarm_bit THEN
         Alarms;
    ELSE
        Time_update;
    END_IF


    CASE STEP OF
    0:    Time_update;


    1:    (*Data klaarzetten*)
        Change_data;

    16:     (*TEST*)
        IF ChecksumEPC = ChecksumPLC THEN
            STEP:=2;
        ELSE
            alarm_byte:= 8;
            Alarms;
        END_IF

    2:    (*Log bestemming*)
        Log_Destination;
        STEP:=3;


    3:    (*Bestand openen*)
        file_open:= TRUE;
        Create_File;
        STEP:=4;

    4:    (*Bestand openen*)
        file_open:= FALSE;
        IF FB_FileOpen1.bBusy OR FB_FileOpen2.bBusy OR FB_FileOpen3.bBusy THEN
        Create_File;
        ELSIF FB_FileOpen1.bError OR FB_FileOpen2.bError OR FB_FileOpen3.bError THEN
            alarm_byte:=1;
            Alarms;
        ELSE
            STEP:=5;
            R_TRIG1.CLK:=FALSE;
        END_IF

    5:    (*Bestand schrijven*)
        file_writer:=TRUE;
        Write_File;
        STEP:=6;

    6:
        file_writer:=FALSE;
        IF FB_FileWrite1.bBusy OR FB_FileWrite2.bBusy OR FB_FileWrite3.bBusy THEN
        Write_File;
        ELSIF FB_FileWrite1.bError OR FB_FileWrite2.bError OR FB_FileWrite3.bError THEN
            alarm_byte:=2;
            Alarms;
        ELSE
            STEP:=7;
            R_TRIG2.CLK:=FALSE;
        END_IF

    7:    (*Bestand sluiten*)
        file_Closer:=TRUE;
        Close_file;
        STEP:=8;

    8:     (*Bestand sluiten*)
        file_closer:=FALSE;
        IF  FB_FileClose1.bBusy OR FB_FileClose2.bBusy OR FB_FileClose3.bBusy THEN
        Close_file;
        ELSIF FB_FileClose1.bError OR FB_FileClose2.bError OR FB_FileClose3.bError THEN
            alarm_byte:=3;
            Alarms;
        ELSE
            STEP:=11;
            R_TRIG3.CLK:=FALSE;
        END_IF

    9:    (*Bestand verzenden*)
        file_sender:=TRUE;
        Send_Files;
        STEP:=10;

    10:     (*Bestand verzenden*)
        file_sender:=FALSE;
        IF FB_FTP_FileUploadEx1.bBusy OR FB_FTP_FileUploadEx2.bBusy OR FB_FTP_FileUploadEx3.bBusy THEN
        Send_Files;
        ELSIF FB_FTP_FileUploadEx1.bError OR FB_FTP_FileUploadEx2.bError OR FB_FTP_FileUploadEx3.bError THEN
                alarm_byte:=4;
                Alarms;
        ELSE
            STEP:=11;
            R_TRIG4.CLK:=FALSE;
        END_IF


    11:     (*Bestand verplaatsen*)
        file_mover:=TRUE;
        Move_Files;
        STEP:=12;

    12:     (*Bestand verplaatsen*)
        file_mover:=FALSE;
        IF NOT FB_FileRename1.bBusy AND NOT FB_FileRename2.bBusy AND NOT FB_FileRename3.bBusy THEN
            IF FB_FileRename1.bError OR FB_FileRename2.bError OR FB_FileRename3.bError THEN
                alarm_byte:=5;
                Alarms;
            ELSE
                STEP:=0;
                hmi_test_bit_Epc:=TRUE;
                lastlogdate:=logtimedate;
                log_bit_EPC:=FALSE;
                tp1.IN:=TRUE;
                Time_Wait;
                R_TRIG5.CLK:=FALSE;
            END_IF
        ELSE
            Move_Files;
        END_IF

    13:    TP1.IN:=FALSE;

    END_CASE


ELSE
    alarm_byte:= 7;
    Alarms;
END_IF

Das ist mein Code.
In ein Step rufe ich ein block an, zum beispiel "Create_File". Das block enthalt code für das öffenen von ein Datei.
Und so wird von den Main jeden block angesteurt.

Kann jemand Mahl schauen ob das stimmt?
Ich werde euch sehr dankbar.

Freundliche Grusse aus Holland
 
Zuletzt bearbeitet:
Eigentlich habe ich noch ein Frage. Die Funktionsbausteine haben allen ein bExecute. Ich verstehe das mann damit die bausteine startet.
Aber was wenn zum Beispiel das schreiben mehrere Zyklen nötig ist? Dann wird der Baustein busy, aber muss er auch jeden Zyklus ein neue signal bekommen van bExecute?

Grusse aus Holland
 
Zuviel Werbung?
-> Hier kostenlos registrieren
bExecute braucht nur in dem Zyklus True sein, in dem Du die Funktion starten willst.
Die Beckhoff-File-FB's haben aber eine Eigenheit: Nach dem Aufruf, in dem bBusy=False wird, musst Du sie ein weiteres Mal mit bExecute=False aufrufen, sonst wird die nächste bExecute-High-Flanke nicht erkannt. Ist ein wenig anwenderunfreundlich programmiert, um es mal vorsichtig zu sagen.
 
Zurück
Oben