Creare un timer giornaliero con LogicLab
Home › Forum › Discussioni su problematiche generali › Creare un timer giornaliero con LogicLab
- Questo topic ha 2 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 6 giorni, 5 ore fa da
Sergio Bertana.
-
AutorePost
-
Giugno 12, 2025 alle 6:10 pm #82745
valter murgia
PartecipanteCome si può creare un timer giornaliero con possibilità di inserire fasce orarie on-off ?
Ho cercato tra i FB senza esito…
Giugno 13, 2025 alle 3:05 pm #82802Sergio Bertana
Amministratore del forumMolte 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.
Giugno 13, 2025 alle 4:35 pm #82812Sergio Bertana
Amministratore del forumImmaginando 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
-
AutorePost
- Devi essere connesso per rispondere a questo topic.