ifachsoftware Inserito: 29 novembre 2019 Segnala Inserito: 29 novembre 2019 Buongiorno , viste le recenti discussioni circa al TON di Siemens , ho realizzato il seguente FB che potrebbe sostituire il TON di Siemens aggiungendo le seguenti caratteristiche : 1) Su fronte di salita l'Enable inizializza il conteggio ed inizia a contare 2) Cambiando il Set Value (Sv) lo prende anche se è già partito a contare 2) Oltre all'ET (Elapsed Time) riporta il TIME_LEFT (ossia il count down per l'attivazione dell'uscita Q) Lo condivido pensando di fare cosa gradita. Se avete dei suggerimenti per migliorarlo sono bene accetti.
MatteoR11 Inserita: 29 novembre 2019 Segnala Inserita: 29 novembre 2019 Molto gentile da parte tua, lo proverò appena possibile. Grazie
STEU Inserita: 29 novembre 2019 Segnala Inserita: 29 novembre 2019 (modificato) Lo proverò Modificato: 29 novembre 2019 da STEU
batta Inserita: 30 novembre 2019 Segnala Inserita: 30 novembre 2019 E pensare che se, dopo 2147483647, anziché ripartire da zero il conteggio fosse continuato passando a -2147483648 (Dint con segno), non ci sarebbe nemmeno stato bisogno di gestire l'overflow.
pigroplc Inserita: 30 novembre 2019 Segnala Inserita: 30 novembre 2019 Il 29/11/2019 alle 10:25 , ifachsoftware ha scritto: Lo condivido pensando di fare cosa gradita. Settimana prossima lo provo di sicuro, per mia comodità, tutto in SCL.
pigroplc Inserita: 3 dicembre 2019 Segnala Inserita: 3 dicembre 2019 @ifachsoftware mi sono permesso di aggiungere una funzione al tuo prezioso codice in modo da discriminare il timer che tiene il tempo in memoria se si toglie l'abilitazione prima dello scadere. Quando scade il tempo il flag si azzera e per far ripartire basta ridare i bit di enable e ritenzione. FUNCTION_BLOCK "FbTON_Tck" { S7_Optimized_Access := 'TRUE' } VERSION : 0.1 VAR_INPUT Enable : Bool; // Timer start enable Sv : Time; // Delay END_VAR VAR_OUTPUT Q : Bool; // Output TimeLeft : Time; // Time left ET : Time; // Elapsed time END_VAR VAR_IN_OUT TimeRetain : Bool; // 0=timer restart 1=timer hold on last elapsed END_VAR VAR LastTck : Time; CurrTck : Time; Increments : Time; PvTime : Time; TmpDifu : Bool; rtTimerStart {InstructionName := 'R_TRIG'; LibVersion := '1.0'; ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : R_TRIG; rtTimerStop {InstructionName := 'R_TRIG'; LibVersion := '1.0'; ExternalAccessible := 'False'; ExternalVisible := 'False'; ExternalWritable := 'False'} : R_TRIG; END_VAR VAR CONSTANT cMaxTcks : Time := T#24D_20H_31M_23S_647MS; // Max Ticks supported END_VAR BEGIN REGION Handle increments (* leggi ora di sistema (solo per 1500) *) #CurrTck := TIME_TCK(); IF #Enable THEN IF #LastTck > #CurrTck THEN #Increments := (#cMaxTcks - #LastTck) + #CurrTck; ELSE #Increments := #CurrTck - #LastTck; END_IF; ELSE #LastTck := #CurrTck; #Increments := T#0ms; END_IF; END_REGION REGION Handle Timer #rtTimerStart(CLK := #Enable); IF #rtTimerStart.Q AND NOT #TimeRetain THEN #PvTime := t#0ms; END_IF; #rtTimerStop(CLK :=NOT #Enable AND #Q); IF #rtTimerStop.Q THEN #PvTime := t#0ms; END_IF; #LastTck := #CurrTck; // save last Tck END_REGION REGION Output IF #Enable THEN IF #PvTime < #Sv THEN #PvTime := #PvTime + #Increments; IF #PvTime > #Sv THEN #PvTime := #Sv; END_IF; END_IF; #Q := #PvTime >= #Sv; IF #Q AND #TimeRetain THEN #TimeRetain := false; END_IF; #ET := #PvTime; #TimeLeft := #Sv - #ET; END_IF; IF NOT #Enable THEN IF NOT #TimeRetain THEN #TimeLeft := T#0ms; END_IF; #Q := FALSE; END_IF; END_REGION END_FUNCTION_BLOCK spero sia utile a qualcuno.....
ifachsoftware Inserita: 3 dicembre 2019 Autore Segnala Inserita: 3 dicembre 2019 Ottimo lavoro, i suggerimenti sono sempre bene accetti. 😉
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora