Ingresso conteggio AVANTI/INDIETRO
Il Function Block CTUD (count up/down) vi consente di programmare procedure di conteggio (avanti e indietro).
Count up (CU impostato su TRUE)
Il conteggio parte da zero fino a raggiungere il valore massimo di 32767. Ogni fronte di salita al conteggio in avanti a CU aumenta il valore al valore attuale CV di 1.
Count down (CD impostato su TRUE)
Il countdown parte da zero fino a raggiungere il valore minimo di -32768. Ogni fronte di salita al countdown verso CD diminuisce il valore al valore attuale CV di 1.
Ingresso
conteggio avanti
il valore 1 viene sommato al valore CV attuale per ogni fronte di salita rilevato in CU, eccetto quando vengono impostati R e/o LD.
conteggio indietro
il valore 1 viene sottratto dal valore CV attuale per ogni fronte di salita rilevato in CD, eccetto quando vengono impostati R e/o LD.
se CU e CD vengono impostati simultaneamente su TRUE non si avranno operazioni di conteggio.
Reset
CV viene resettato a zero per ogni fronte di salita in R e il conteggio si arresta. L'uscita QU/QD viene impostata su FALSE.
Il successivo fronte di discesa a R riavvia il conteggio.
Carica l'accumulatore
se LD è impostato, PV viene caricato in CV e QU viene impostato su TRUE. Questo, tuttavia, non vale se viene simultaneamente impostato R. In tal caso, LD verrà ignorato.
Valore preimpostato
definisce il valore preimpostato da raggiungere con l'addizione o la sottrazione
Se non è stato impostato un valore preimpostato o se il valore preimpostato è zero, l'uscita QU viene impostata su TRUE subito dopo l'avvio del conteggio.
Uscita
uscita segnale – conteggio avanti
viene impostata su TRUE se CV è maggiore di/uguale a PV
viene impostata su FALSE se viene rilevato un fronte di salita su R.
uscita segnale – conteggio indietro
viene impostata su TRUE se CV = zero
viene impostata su FALSE se viene rilevato un fronte di salita su R.
Valore attuale
è il risultato della somma/sottrazione
conteggio in avanti:
Se CV raggiunge il valore preimpostato PV, l'uscita QU viene impostata su TRUE, ma il conteggio continua fino a quando il limite massimo di 32767 viene raggiunto.
countdown
Se CV raggiunge lo zero, l'uscita QD viene impostata su TRUE, ma il conteggio continua fino a quando il limite minimo di -32768 viene raggiunto.
Il valore può essere modificato durante l'operazione di conteggio scrivendo sulla variabile dall'editor di programmazione.
Tutte le variabili di ingresso e uscita utilizzate per programmare questa funzione sono state dichiarate nell'intestazione del POU. La stessa intestazione del POU è utilizzata per tutti i linguaggi di programmazione.
VAR
CTUD1: CTUD;
bCountUp: BOOL:=FALSE;
(*increments CV if TRUE*)
bCountDown: BOOL:=FALSE;
(*decrements CV if TRUE*)
bReset: BOOL:=FALSE;
(*sets CV to zero if TRUE*)
bLoad: BOOL:=FALSE;
(*sets CV to PV if TRUE*)
iPresetValue: INT:=3;
(*if CV reaches this value,
output QU is set*)
bUpCounting_PV_reached: BOOL:=FALSE;
(*is set, if CV reaches PV*)
bDownCounting_zero_reached: BOOL:=FALSE;
(*is set, if CV reaches zero*)
iCurrentValue: INT:=0;
(*contains the current value*)
END_VAR
Conteggio avanti:
Se bReset è impostato, iCurrentValue (CV) verrà resettato a zero. Se bCountUp è impostato, il valore 1 viene sommato a iCurrentValue. Questa procedura viene ripetuta per ogni fronte di salita rilevato in bCountUp finché iCurrentValue è maggiore di/uguale a iPresetValue. Dopo di che viene impostato bUpCounting_PV_reached. La procedura non viene eseguita se vengono impostati bReset e/o bLoad.
Conteggio indietro:
Se bReset è impostato (stato = TRUE), iPresetValue (PV = valore preimpostato) verrà caricato in iCurrentValue. Se bCountDown è impostato, il valore 1 viene sottratto da iPresetValue. Questa procedura viene ripetuta per ogni fronte di salita finché iCurrentValue è minore di/uguale a zero. Dopo di che viene impostato bDownCounting_zero_reached su TRUE. La procedura non viene eseguita se vengono impostati bReset e/o bLoad. Se CU e CD vengono impostati simultaneamente, il conteggio sarà in avanti.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 14 ;
NETWORK_BODY
B(B_CONTACT,,bCountUp,5,3,7,5,);
B(B_CONTACT,,bCountDown,5,5,7,7,);
B(B_FB,CTUD!,CTUD1,12,4,18,11,,?BCU?BCD?BR?BLD?BPV?AQU?AQD?ACV);
B(B_COIL,,bUpCounting_PV_reached,25,5,27,7,);
B(B_CONTACT,,bReset,5,7,7,9,);
B(B_COIL,,bDownCounting_zero_reached,25,8,27,10,);
B(B_CONTACT,,bLoad,5,9,7,11,);
B(B_VAROUT,,iCurrentValue,20,10,22,12,);
B(B_VARIN,,iPresetValue,7,11,9,13,);
L(1,0,1,14);
L(1,4,5,4);
L(7,4,10,4);
L(10,4,10,6);
L(1,6,5,6);
L(7,6,9,6);
L(10,6,12,6);
L(18,6,25,6);
L(9,6,9,7);
L(9,7,12,7);
L(18,7,20,7);
L(20,7,20,9);
L(1,8,5,8);
L(7,8,12,8);
L(18,8,19,8);
L(19,8,19,11);
L(9,9,12,9);
L(20,9,25,9);
L(9,9,9,10);
L(1,10,5,10);
L(7,10,9,10);
L(10,10,12,10);
L(10,10,10,12);
L(19,11,20,11);
L(9,12,10,12);
END_NETWORK_BODY
END_NET_WORK
END_BODY
CTUD1(CU := bCountUp, CD := bCountDown, R := bReset, LD := bLoad,
PV := iPresetValue, QU => bUpCounting_PV_reached,
QD => bDownCounting_zero_reached, CV => iCurrentValue);