Vai al contenuto

Creare un timer giornaliero con LogicLab

Home Forum Discussioni su problematiche generali Creare un timer giornaliero con LogicLab

Stai visualizzando 3 post - dal 1 a 3 (di 3 totali)
  • Autore
    Post
  • #82745
    valter murgia
    Partecipante

    Come si può creare un timer giornaliero con possibilità di inserire fasce orarie on-off ?

    Ho cercato tra i FB senza esito…

    #82802
    Sergio Bertana
    Amministratore del forum

    Molte volte abbiamo pensato di realizzare un FB temporizzatore, ma sono talmente tante e varie le opzioni richieste che è impossibile soddisfarle tutte, così è più facile risolvere il problema scrivendo un programma ad-hoc. Ecco allora un semplice blocco funzione che gestisce una temporizzazione con orario di attivazione e disattivazione.

    FUNCTION_BLOCK FB_DailyTimer
    VAR
        SysDTime : UDINT; (* Ora corrente del giorno *)
    END_VAR
    VAR_INPUT
        StartTime : TIME_OF_DAY; (* Ora inizio (es. T#8h10m20s) *)
        EndTime : TIME_OF_DAY; (* Ora fine (es. T#10h30m15s) *)
    END_VAR
    VAR_OUTPUT
        Output : BOOL; (* TRUE se attivo *)
        CurrentTime : TIME_OF_DAY; (* Ora corrente del giorno (es. T#15h10m5s *)
    END_VAR
    
        // Calcolo valore TIME_OF_DAY da orologio di sistema.
    
        SysDTime:=(MOD(SysDateLocalize(SysDateGetS(), +1, 1), 86400))*1000;
        eTO_JUNK(SwapData(ADR(CurrentTime), ADR(SysDTime), UDINT_TYPE, SWAP_COPY));
    
        // Gestisco fascia oraria nello stesso giorno.
    
        IF (StartTime < EndTime) THEN
            Output:=(CurrentTime >= StartTime) AND (CurrentTime < EndTime);
            RETURN;
        END_IF;
    
        // Gestisco fascia oraria a cavallo della mezzanotte.
    
        Output:=(CurrentTime >= StartTime) OR (CurrentTime < EndTime);
    
    // [End of file]

    Come puoi vedere dalla variabile di sistema SysDateTime che ritorna la data ora in epoch time ricavo CurrentTime di tipo TIME_OF_DAY, viene poi eseguita la comparazione con i valori di set ed attivata l’uscita di conseguenza. La funzione SwapData esegue unicamente la copia tra un valore UDINT ed un valore TIME_OF_DAY, l’uguglianza “:=” produce errore in quanto sono due tipi di dato disomogenei.

    Avendo definito nella funzione SysDateLocalize di generazione tempo attuale il valore di TimeZone:=+1 e la DaylightZone:=1, si ha il tempo localizzato con il cambio automatico tra ora solare e legale, ma attenzione se gli orari sono impostati a cavallo del cambio ora si può accorciare o allungare la temporizzazione di un’ora. In alternativa si può impostare DaylightZone:=0.

    Se occorrono più temporizzazioni nella giornata basterà istanziare più FB con tempi diversi ed eseguire il comando con la OR tra le uscite di tutte le FB.

    #82812
    Sergio Bertana
    Amministratore del forum

    Immaginando la domanda seguente che può essere:

    Come posso impostare i valori di StartTime ed EndTime da pannello operatore Weintek?

    Ipotizzando di definire il tempo di start come variabile PLC StartTime di tipo UDINT allocata in DB100.2048 in modo da essere in area ritentiva, riprendendo il discorso già trattato in questo topic, si utilizza un oggetto Numeric input, che come si vede dallo screenshot punta alla variabile PLC StartTime (Indirizzo Modbus %MW 41024). Definendo le proprietà dell’oggetto vanno settate come indicato si avrà una visualizzazione suddivisa in HH:MM:SS, ipotizzando il valore 12:10:50 avremo StartTime=121050.

    Ora nel programma PLC occorrerà convertite questo valore in una valore di tipo TIME_OF_DAY da passare al FB di gestione temporizzazione, ecco l’esempio:

        DailyTimer.StartTime:=CONCAT_TOD(TO_INT(StartTime/10000), //Hour
                    TO_INT(MOD((StartTime/100), 100)), //Minute
                    TO_INT(MOD(StartTime, 100)), //Second
                    0); //Millisecond
Stai visualizzando 3 post - dal 1 a 3 (di 3 totali)
  • Devi essere connesso per rispondere a questo topic.