Vai al contenuto

Strano comportamento function block eTOF allo startup

Home Forum Programmazione IEC 61131 (LogicLab) Strano comportamento function block eTOF allo startup

Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Autore
    Post
  • #35004
    Piergiorgio
    Partecipante

    Ho il seguente semplice progamma.

        VAR_GLOBAL
        DigOUT_M01_00 AT %QX0.0 : BOOL;
        DigIN_M01_00 AT %IX0.0 : BOOL;
        END_VAR

    PROGRAM Prova

        VAR
        FB_eTOF : eTOF;
        FB_TRIG : R_TRIG;
        END_VAR

        { CODE:ST }
    FB_TRIG();
    FB_TRIG.CLK:=DigIN_M01_00;
    FB_eTOF(PT:=3000);
    FB_eTOF.IN:=FB_TRIG.Q;
    DigOUT_M01_00:=FB_eTOF.Q;

    END_PROGRAM

    Aappena parte l’esecuzione del programma l’uscita DigOUT_M01_00 viene attivata senza che ci sia segnale su DigIN_M01_00, come mai ?

    Dopo questa prima “anomalia” DigOUT_M01_00 resta attivato per 3 secondi dopo il fronte di salita di DigIN_M01_00, come mi aspetterei. Sicuramente mi sfugge qualcosa, potreste aiutarmi ?

    #36720
    Sergio Bertana
    Amministratore del forum

    Ho provato il tuo programma, effettivamente non è un problema tuo ma è un bug del blocco funzione eTOF, ho provveduto a correggerlo, allego il programma con la nuova FB corretta per il download. Allego anche sorgente blocco funzione eTOF così hai una idea di come funziona.

    FUNCTION_BLOCK eTOF

        VAR_INPUT
        IN : BOOL; { DE:”Timer input” }
        PT : UDINT; { DE:”Preset time value (mS)” }
        END_VAR

        VAR_OUTPUT
        Q : BOOL; { DE:”Delayed output” }
        ET : UDINT; { DE:”Executing time (mS)” }
        END_VAR

        VAR_EXTERNAL
        SysTime : UDINT; { DE:”System time (mS)” }
        END_VAR

        VAR
        TimeBf : UDINT; { DE:”Time buffer” }
        END_VAR

        { CODE:ST }
        IF (IN) THEN
            ET:=0; (* Executing time (mS) *)
            Q:=TRUE; (* Delayed output *)
            TimeBf:=SysTime; (* Time buffer *)
            RETURN;
        END_IF;

        IF NOT(Q) THEN RETURN; END_IF;

        ET:=SysTime-TimeBf; (* Executing time (mS) *)
       
        IF (ET >= PT) THEN
            ET:=PT; (* Executing time (mS) *)
            Q:=FALSE; (* Delayed output *)
        END_IF;

    END_FUNCTION_BLOCK

Stai visualizzando 2 post - dal 1 a 2 (di 2 totali)
  • Devi essere connesso per rispondere a questo topic.