Vai al contenuto
PLC Forum


Timer Con Codesys


ndonj86

Messaggi consigliati

Salve a tutti, sono nuovo del forum e del mondo plc.

Mi è stato assegnato un "compito" per la mia azienda.

Mi trovo a sostituire un collega e dovrei creare un timer con Codesys, in grado di sincronizzarsi con l'ora reale attuale.

Ho letto della libreria SysTimeRtc, ma non ho nessun altra idea in merito all'implementazione in Codesys.

Grazie anticipatamente a tutti per la collaborazione....

A presto!

Link al commento
Condividi su altri siti


ciao

inizia almeno dicendo di quale cpu si tratta

e poi qualche spiegazione in dettaglio su quello che devi fare.

per cominciare

se vuoi estrarre la data e ora del plc dovresti usare la libreria syslibtime.lib con il blocco curtimeex

fammi sapere

saluti da Valvolina

Link al commento
Condividi su altri siti

Ciao Valvolina,

grazie inanzitutto per la disponiblità!

Allora, come ti dicevo, sono praticamente a zero in materia....non mi hanno datto notizie del plc finale, simulo una cortex, ma purtroppo non ho ulteriori dettagli.

I dettagli delle loro richieste sono:

un temporizzatore che si sincronizzi con l'ora locale, si avvi e si fermi impostando l'orario.

Spero di averti chiarito e mi scuso se sono stato un pò "brutale" nel primo post!!!

Grazie ancora a tutti!


dovrebbe essere un WAGO il plc finale!

Link al commento
Condividi su altri siti

ciao,

presupponiamo che il plc sia ad esempio un Wago 750-841 !!!

innanzi tutto fai un nuovo programma in linguaggio st.

per prima cosa richiami un blocco per l'estrazione della data e ora attuali del plc dalla libreria syslibtime.lib blocco curtimeEX

dichiarazione delle variabili

VAR

data_ora_plc : CurTimeEx;
data_ora_act: SystemTimeDate;
data_ora_num: SysTime64;

uscita_comandata : BOOL;
END_VAR

codice

(* estrazione data e ora plc attuale ++++++++++++++++++++++++++++++++ *)
data_ora_plc(SystemTime:= data_ora_num , TimeDate:= data_ora_act );

a questo punto nella variabile data_ora_act hai ottenuto una struttura dati così composta:

dwHighMsec DWORD

Year UINT Year, e.g. "2002"

Month UINT Month, e.g. "12"

Day UINT Day of month, e.g. "3"

Hour UINT Hour of the current day, e.g. "13"

Minute UINT Minutes of the current hour, e.g. "43"

Second UINT Seconds of the current minute, e.g. "15"

Milliseconds UINT Milliseconds of the current second, e.g. "649"

DayOfWeek UINT Day of the week, e.g. "2" (Sunday=0, Monday = 1...)

quindi ad esempio con il seguente codice:

uscita_comandata := (data_ora_act.Hour >=10) AND (data_ora_act.Hour <=11);

hai un uscita (bool) che si attiva dalle ore 10 fino alle ore 11

nello stesso modo puoi comparare minuti, secondi, giorno della settimana ecc..

spero di essere stato utile

saluti da Valvolina

Modificato: da valvolina
Link al commento
Condividi su altri siti

buongiorno,

siamo d'accordo sul dispositivo, sul linguaggio ST, ma per sincronizzarsi con l'ora locale, la "UTC" mi pare, il dispositivo deve far uso della libreria: SysTimeRtc e i suoi componenti (almeno dalle specifiche che mi sono state passate!).

Per il resto, qualche idea su funzioni particolari , da creare, per start e stop e per settare il giorno della settimana?

Grazie ancora!!!

Link al commento
Condividi su altri siti

ciao

faccio un pò fatica a capire cosa devi fare.

con la libreria SysTimeRtc e in particolare con la funzione SysRtcSetTime imposti l'ora e data che vuoi, nell'orologio del plc.

una volta settata data e ora, puoi leggere data e ora attuali del plc ad ogni giro di programma (con l'esempio messo sopra) in modo che hai data e ora attuali sempre aggiornati al volo.

Ovviamente l'orologio del plc vive di vita sua e non lo puoi arrestare ed avviare quando vuoi,

per cui non ti resta che compararne i valori

nella struttura hai :

anno

mese

giorno

ore

minuti

secondi

e anche il giorno della settimana

ciascuno messo in una variabile

data_ora_act.DayOfWeek assume i seguenti valori 1=lunedi 2=martedi........ 6=sabato e 0=domenica

questa variabile è legata all'orologio ed è l'orologio che la governa

quindi una volta settato l'orologio verrà aggiornata automaticamente.

quindi per realizzare un uscita che si accende e si spegne in base a ore minuti e giono della settimana non ti resta che comparare i valori,

per il set dell'orologio ad una data e ora impostata posso metterti un esempio se è quello che ti manca.

spero di aver interpretato bene

saluti Valvolina

Modificato: da valvolina
Link al commento
Condividi su altri siti

In effetti anche per me è difficile capire cosa cercano!!!!!!!!!!!

Comunque hai colto nel segno ed io sono riuscito a capire qualcosa in più...

Effettivamente è un esempio pratico quello che mi manca.

Se puoi aiutarmi....te ne sarei molto grato!!!

Grazie comunque....

Link al commento
Condividi su altri siti

ciao

di seguito un esempio per il set dell'orologio:

i dati da scriviere nell'orologio vengono preparati (scritti) in intero

convertiti in caratteri

e poi viene assemblata la stringa da convertire in formato dt da passare al function block di scrittura orologio

dichiarazione variabili

VAR
anno : INT;
mese : INT;
giorno : INT;
ore : INT;
minuti : INT;

anno_str : STRING(4);
mese_str : STRING(4);
giorno_str : STRING(4);
ore_str : STRING(4);
minuti_str : STRING(4);

data_ore : DATE_AND_TIME;
data_ore_str : STRING;

scrivi_data_ora: BOOL;

codice programma +++++++++++++++++++++++++++++++

(* esempio stringa da formare : DT#1970-01-01-00:00 *)

(* conversione dati in stringa ++++++++++++++++++++ *)
anno_str := INT_TO_STRING(anno);
mese_str := INT_TO_STRING(mese);
giorno_str := INT_TO_STRING(giorno);
ore_str := INT_TO_STRING(ore);
minuti_str := INT_TO_STRING(minuti);

(* inizio formazione stringa ++++++++++++++++++++++ *)
data_ore_str := 'DT#';
data_ore_str := CONCAT(data_ore_str , anno_str);
data_ore_str := CONCAT(data_ore_str , '-');
data_ore_str := CONCAT(data_ore_str , mese_str);
data_ore_str := CONCAT(data_ore_str , '-');
data_ore_str := CONCAT(data_ore_str , giorno_str);
data_ore_str := CONCAT(data_ore_str , '-');
data_ore_str := CONCAT(data_ore_str , ore_str);
data_ore_str := CONCAT(data_ore_str , ':');
data_ore_str := CONCAT(data_ore_str , minuti_str);
(* ++++++++++++++++++++++++++++++++++++++++++++++++ *)

(* conversione in date and time +++++++++++++++++++ *)
data_ore := STRING_TO_DT(data_ore_str);


(* scrittura data e ora del plc +++++++++++++++++++ *)
IF scrivi_data_ora THEN
SysRtcSetTime(data_ore);
END_IF;
(* ++++++++++++++++++++++++++++++++++++++++++++++++ *)

saluti da Valvolina

Link al commento
Condividi su altri siti

Perfetto, grazie mille, provvedo subito a testarlo.

Ti faccio sapere i miei eventuali (sicuri) problemi che riscontrerò!!!!

Nel frattempo, avresti qualche suggerimento per creare una sorta di menù con cui selezionare le giornate di interesse in cui attivare il timer??

Grazie davvero!

Link al commento
Condividi su altri siti

Ciao ndonj86 .

Valvolina ha dimostrato grande disponibilità ma pare quasi che a forza di "suggerimenti" tu voglia ricevere l'applicazione già pronta per essere utilizzata (o quasi).

Tra l'altro tu stesso dici

In effetti anche per me è difficile capire cosa cercano!!!!!!!!!!!

Per cui figurati lo sforzo che deve fare una persona per cercare di capire cosa vuoi fare quando nemmeno tu hai piena conoscenza di quello che ti hanno richiesto. :wacko:

bigalex :blink:

Link al commento
Condividi su altri siti

Salve Bigalex,

in effetti premettendo la mia totale ignoranza in materia, non credo di essermi approfittato della buona volontà e disponiblità di Valvolina.

Per qualcuno che conosce l'ambiente di sviluppo, le librerie e quant'altro, credo che sia una passeggiata risolvere i problemi che per me sembrano insormontabili

(con questo non sminuisco assolutamente il lavoro di Valvolina, anzi.......).

Inoltre, posso assicurarti che l'applicazione non consiste solo in quello da me esposto, ma ci sono altre funzioni che ovviamente ho omesso e che sto sviluppando.

Con questo, mi scuso con Valvolina se si sente sfruttato, ma non credo di aver fatto nulla di male ponendo alcuni quesiti e chiedendo "suggerimenti" e consigli a chi è più esperto di me!

Saluti

Modificato: da ndonj86
Link al commento
Condividi su altri siti

ciao ndonj86,

ma devi usera le pagine di visualizzazione di codesys

oppure hai un pannello operatore o altro?

fammi sapere

saluti da Valvolina

Link al commento
Condividi su altri siti

Io utilizzo la visualizzazione di codesys per il momento....

Poi successivamente andrà implementato su un pannello di controllo, ma non saranno più problemi miei!

Grazie mille.....

PS: Valvolina mi scuso se ti sembro un approfittatore, soprattutto alla luce di quanto affermato da Bigalex. Sono nuovo dell'ambiente, non conosco le dinamiche e dunque non vorrei far danno a nessuno....Ti sono comunque grato davvero per la disponiblità che mi ha dimostrato!!!

Link al commento
Condividi su altri siti

Ciao ndonj86 .

Neanche a farlo apposta ho cercato su Google ed ho trovato questo che è una application note di Wago (Using the library Scheduler_03.lib) e che penso farebbe al caso tuo.

bigalex :blink:

Link al commento
Condividi su altri siti

Prego.

Tieni presente che è una libreria che dovrebbe essere in dotazione ai plc Wago quindi dovresti averla a disposizione nell'IDE di programmazione.

Ci dovrebbero essere tutti i blocchi necessari per creare la logica di cui necessiti.

bigalex :blink:

Link al commento
Condividi su altri siti

Non hai la libreria perchè non è presente nell'IDE ? <_<

Stai usando Codesys per Wago o è Codesys stand alone (cioè non è la versione che propone Wago) ?

Poichè avevi detto che il plc sarebbe stato Wago ho dato per scontato che stessi programmando con la versione per quel plc.

Se non hai la libreria è evidente che dovrai lavorare in proporzione alle funzionalità che vorrai ottenere .

Quindi dovresti in qualche modo stendere delle specifiche a cui attenerti per la stesura del progetto e quindi verificare di quali funzioni software avrai bisogno e se alcune di queste già sono in quale modo disponibili per essere integrate.

bigalex :blink:

Link al commento
Condividi su altri siti

  • 2 weeks later...

...se possibile aggiungo una domanda che più che atro è un dubbio,

se il timer si deve avviare alle 23:59 e spegnere alle 0:01

il codice postato non può funzionare ...

in pratica funziona solo "giornalmente" cioè se l'ora di avvio e sempre inferiore a quella di spegnimento,

mi piacerebbe capire anche a me se esiste una via facile per un timer a cavallo delle mezzanotte

Giuseppe

Link al commento
Condividi su altri siti

A me è capitato di dover fare uno schedulatore settimanale con 5 fasce orarie programmabili giornalmente più altre opzioni selezionabili per ogni singola fascia oraria (funzionamento generatori di vapore industriali) e con la possibilità di avere appunto l'avviamento es:20:00 e lo spegnimento alle 05:30. (PL7 Pro Schneider ormai parecchi anni fà)

Quello che occorre considerare tra le altre è appunto questa casistica .

Un modo semplice semplice non lo ho trovato (o meglio il semplice è sempre relativo) , comunque non ho mai utilizzato dei timer ma confrontato sempre l'ora del plc con l'ora di inizio e fine della fascia oraria.

bigalex :blink:

Link al commento
Condividi su altri siti

visto che la "cosa" mi serve e sono capitato quì perchè cercavo uno spunto .. lo spunto è arrivato e ne posto la soluzione :smile:

prima di tutto, come consigliato da qualcuno in questo forum, trasformo tutto in minuti/giorno

anche se sembra macchinosa in realtà poi diventa molto più semplce la gestione,

esempio: timer che deve funzionare dalle 10:00 di mattina alle 20:00 di sera = On dopo 600 minuti Off dopo 1200 minuti

e fin quì la cosa è semplice ma non funziona se il timer deve funzionare esempio dalle 20:00 di sera alle 10:00 del mattino,

ho trovato questa soluzione che sembra addirittura banale

con un semplice IF e due righe di codice (oppure confronto)

esempio

se l'orario di avvio e inferiore all'orario di spegnimento = attivo l'uscita se il valore è superiore a ON e (AND) inferiore a OFF (classico caso)

se l'orario di avvio è superiore all'orario di spegnimento = attivo l'uscita se il valore è superiore a ON o (OR) inferiore a OFF (caso a cavallo della mezzanotte)

francamente non l'ho testato ma solo pensato .. dovrebe fungere

ogni dritta è ben accetta

nota:

mi spiace ma non consosco il PLC di questa sezione, ma per fortuna la logica non ha Brand :P

Giuseppe

Link al commento
Condividi su altri siti

Il tuo ragionamento è corretto.

Non capisco però perchè vuoi utilizzare dei timer (o un timer).

La comparazione ora:minuti:secondi (se vuoi la precisione al secondo) è sufficiente .

Poi nel caso di programmazione settimanale dovrai tenere conto del giorno della settimana e nel caso di programmazione a calenario dovrai tenere conto della data .

bigalex :blink:

Link al commento
Condividi su altri siti

x bigalex,

intaffti non utilizzo nessun timer ... è solo il nome che ho dato a quello che sarà un blocco funzione (timer_giornaliero),

che poi è anche la richiesta iniziale di chi ha generato il trhead, giusto per non essere off-topic :smile:

nel mio caso i secondi non servono e mi basta la precisione al minuto

mentre per il settimanle la vedo più semplice visto che è disponibile la variabile riferita al giorno della settimana

ma per il momento non mi serve e men che meno una gestione mensile/annuale

ciao e grazie,

Giuseppe

Link al commento
Condividi su altri siti

ciao

una soluzione abbastanza semplice per acendere alla sera e spegnere la mattina del giorno dopo potrebbe essere

IF (ore_min_stop < ore_min_start) THEN

accensione := ((ore_min_actual <= 2359) AND (ore_min_actual >= ore_min_start)) OR
((ore_min_actual <= ore_min_stop));

ELSE

accensione := ((ore_min_actual <= ore_min_stop) AND (ore_min_actual >= ore_min_start));
END_IF

magari poi si potrebbe aggiungere qualche ulteriore controllo

saluti da Valvolina

Link al commento
Condividi su altri siti

un grazie valvolina per tradotto ST quanto indicato :smile:

io sono un più macchinoso lo so ma mi serviva dell'altro ....

ma volendo lo si può semplificare di molto

vi posto il codice testato e funzionante in linguaggio ST (ambiente Codesys)

e funziona sia dalla sera alla mattina che dalla mattina alla sera

ma non so se il PLC di questa sezione è in grado di gestirlo

spero si comunque utile a qualcuno

penso che le variabili siano facilmente identificabili

va da se che tutti gli orari (ON/OFF/corrente) sono trasformati in minuti/giorno

****************************************************************

// se il timer è di tipo standard (ON inferiore a OFF)
IF T_Day_ON_Min < T_Day_OFF_Min AND Timer_En THEN
Timer_Std := TRUE ;
Timer_Inv := FALSE ;
ELSE
Timer_Inv := FALSE ;
END_IF

//
// se il timer è di tipo inverso (ON superiore a OFF)
IF T_Day_ON_Min > T_Day_OFF_Min AND Timer_En THEN
Timer_Std := FALSE ;
Timer_Inv := TRUE ;
ELSE
Timer_Inv := FALSE ;
END_IF

//
// gestione timer standard
IF Timer_Std AND Now_Min > T_Day_ON_Min AND Now_Min < T_Day_OFF_Min THEN
Timer_ON := TRUE ;
ELSE
Timer_ON := FALSE ;
END_IF

//
// gestione timer inverso
IF Timer_Inv AND Now_Min > T_Day_ON_Min OR Now_Min < T_Day_OFF_Min THEN
Timer_ON := TRUE ;
ELSE
Timer_ON := FALSE ;
END_IF

//
// gestione uscita OFF
IF Timer_En = FALSE OR Timer_ON = FALSE THEN
Timer_ON := FALSE ;
Timer_OFF := TRUE ;
ELSIF Timer_En = TRUE OR Timer_ON = TRUE THEN
Timer_ON := TRUE ;
Timer_OFF := FALSE ;
END_IF

**************************************************

ciaoo

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...