Visualizzazione ora:minuti:secondi con scalatura a macro
Home › Forum › Terminali operatore (Weintek) › Visualizzazione ora:minuti:secondi con scalatura a macro
- Questo topic ha 4 risposte, 1 partecipante ed è stato aggiornato l'ultima volta 7 mesi, 1 settimana fa da
Sergio Bertana.
-
AutorePost
-
Febbraio 21, 2024 alle 10:03 am #76091
Anonimo
InattivoHo alcuni contaore su un PLC SlimLine basati su variabili UDINT che si incrementano ad ogni secondo vorrei visualizzarli sul pannello operatore.
Ho provato ad utilizzare un Numeric Object con la scalatura a macro subroutine per ottenere una visualizzazione del valore nel formato hhhh:mm:ss ma dopo diversi tentativi ho gettato la spugna.
Qualcuno ha suggerimenti in merito?
Febbraio 21, 2024 alle 10:05 am #76093Sergio Bertana
Amministratore del forumL’utilizzo della macro per la scalatura valori è stato già trattato in questo topic, una idea su come potresti agire per ottenere quello che desideri è riportata in questo screenshot.
Numeric Object
Per la visualizzazione devi definire nelle proprietà dell’oggetto il tipo Customized impostando il numero di cifre totali (Nell’esempio 8) ed il formato di visualizzazione (Nell’esempio ****:**:**). Nello scaling definire il metodo Macro subroutine definendo la macro di scalatura che andrai a scrivere (Nell’esempio TimeScale).Macro TimeScale
La macro riceve in ingresso il valore UDINT (unsigned int 32 bits) dal PLC e lo elabora ritornando un valore opportunamente scalato in modo da avere sui 2 digit più bassi i secondi, poi a seguire 2 digits di minuti ed infine le ore. Riporto il listato della macro.sub unsigned int TimeScale(unsigned int Value) unsigned int VSecs=0, VMins=0, VHour=0, VResult=0 VSecs=Value%60 VMins=(Value/60)%60 VHour=Value/3600 VResult=(VHour*10000)+(VMins*100)+VSecs return VResult end sub
Febbraio 22, 2024 alle 8:53 am #76133Anonimo
InattivoLa soluzione a macro è perfetta per la visualizzazione ma non ho trovato un modo per poter gestire l’impostazione del valore.
Nella mia applicazione su di un PLC SlimLine devo impostare una serie di soglie orarie nel formato hh:mm e vorrei utilizzare variabili UINT di appoggio per i valori visto che nel caso peggiore 23:59 il valore è comunque nel range accettato da variabili UINT.
Febbraio 22, 2024 alle 8:59 am #76135Sergio Bertana
Amministratore del forumLa soluzione più semplice è definire nell’oggetto numerico visualizzazione/impostazione tempi la visualizzazione a 2 interi e 2 decimali di una variabile 16-bit Unsigned (Screenshot). In questo modo devi accettare che il separatore hh.mm sia il punto decimale che è anche presente nella tastiera virtuale di impostazione valore.
Naturalmente non potrai impostare i limiti sulla impostazione per impedire di impostare orari inesatti, l’operatore potrà impostare infatti qualsiasi valore tra 0.00 e 23.99. Siccome la variabile viene sia scritta che letta dal PLC basterà realizzare una routine di controllo valori nel programma PLC e correggere gli eventuali errori di impostazione. Ecco un esempio di programma PLC.
PROGRAM TimeCheck VAR Hour : USINT; (* Hour *) Minutes : USINT; (* Minutes *) CheckStrobe : TON; (* Check strobe *) SetTime AT %MW100.2048 : UINT; (* %MW 41024] Set time from HMI *) END_VAR // ***************************************************************************** // PROGRAM "Timecheck" // ***************************************************************************** // ------------------------------------------------------------------------- // TIME CHECK // ------------------------------------------------------------------------- // Time check strobe. CheckStrobe(IN:=NOT(CheckStrobe.Q), PT:=T#1s); IF NOT(CheckStrobe.Q) THEN RETURN; END_IF; // Time check. Hour:=TO_USINT(SetTime/100); //Minutes Minutes:=TO_USINT(SetTime-(Hour*100)); //Minutes IF (Minutes > 59) THEN Minutes:=59; //Minutes SetTime:=(Hour*100)+Minutes; //Set time from HMI END_IF; // [End of file]
Per evitare il controllo ad ogni loop di programma ho gestito un timer che comanda il controllo ad ogni secondo. Il limite sull’ora è già controllato dal pannello operatore che non accetta valori superiori a 23.99, quindi il programma controlla solo i minuti e se sono fuori range li reimposta al valore massimo 59.
Settembre 13, 2024 alle 11:06 am #77832Sergio Bertana
Amministratore del forumSiccome in molti mi chiedono la macro complementare alla visualizzazione ora per poter impostare HHMMSS da terminale (Nella impostazione non si possono separare i campi con : ma vanno definiti di seguito e sempre a 2 cifre), ecco le 2 macro.
sub unsigned int TimeRead(unsigned int Value) unsigned int VSecs=0, VMins=0, VHour=0, VResult=0 VSecs=Value%60 VMins=(Value/60)%60 VHour=Value/3600 VResult=(VHour*10000)+(VMins*100)+VSecs return VResult end sub
sub unsigned int TimeWrite(unsigned int Value) unsigned int VSecs=0, VMins=0, VHour=0, VResult=0 VSecs=Value%100 VMins=(Value/100)%100 VHour=Value/10000 VResult=(VHour*3600)+(VMins*60)+VSecs return VResult end sub
Nel programma in LogicLab occorre gestire una variabile UDINT a cui indirizzare l’oggetto di visualizzazione numerica nel mio esempio la variabile HMIVars.ClockTime. Come si vede viene trasferito nella variabile solo il valore di ora della SysDateTime, Data/Ora di sistema.
Su variazione del valore della variabile HMIVars.ClockTime (Sicuramente si è impostato un nuovo valore da terminale) viene aggiornato il valore di SysDateTime, Data/Ora di sistema. Questo programma và eseguito in task Back.
IF (HMIVars.ClockTime <> ClockTime) THEN SysDateTime:=(SysDateTime-MOD(SysDateTime, 86400))+HMIVars.ClockTime; END_IF; ClockTime:=MOD(SysDateTime, 86400); //Clock time HMIVars.ClockTime:=ClockTime; //Clock time
-
AutorePost
- Devi essere connesso per rispondere a questo topic.