Controllo Cam per FP0R
Tale istruzione esegue il controllo Cam secondo i parametri nella DUT specificata con un massimo di 31 valori target per il contatore veloce. Un programma di interrupt può essere eseguito ogni volta che il valore corrente corrisponde a uno dei valori target.
Ingresso
Canale contatore veloce: 0–5
Indirizzo di partenza dell'area contenente la tabella dati
Esempio: F165_HighSpeedCounter_Cam_8_Values_DUT
Uscita
Indirizzo iniziale (WR) dell'area contenente l'indirizzo word di uscita, p.es. BOOL32_OVERLAPPING_DUT. Scegliere la dimensione (16 o 32 bit) in base al numero impostato con diNumberOfTargetValuesAndOutputRelays.
Creare la propria DUT usando la seguente DUT come modello: F165_HighSpeedCounter_Cam_8_Values_DUT
Nella DUT possono essere specificati i seguenti parametri:
Codice di controllo
Indirizzo word per uscite
Numero di valori target
Valore target1
...
Valore targetn
Maximum target value
y |
Valore corrente del contatore veloce | 14000 |
Maximum target value |
(1) |
Condizione di esecuzione | 10000 |
Valore target4 |
(2) |
Flag di controllo del contatore veloce | 8000 |
Valore target3 |
(3) |
Uscita0-4 |
4000 |
Valore target2 |
2000 |
Valore target1 |
Quando il valore corrente è compreso nell'area del valore target da n a n+1 (conteggio avanti) o da n+1 a n (conteggio indietro), l'uscita corrispondente n è TRUE.
Nell'esempio sopra riportato, il controllo del valore di target massimo è abilitato. Quando il valore corrente raggiunge il valore target massimo, il valore corrente è reimpostato su 0 e il conteggio riparte.
Specificate l'indirizzo word delle uscite in una DUT sovrapposta, p.es. BOOL32_OVERLAPPING_DUT, e applicate tale DUT a dutBitOutputs.
È possibile specificare un massimo di 31 valori target.
I valori target devono essere disposti in ordine crescente. Non è possibile utilizzare un valore due volte.
Quando l'istruzione inizia, tutte le uscite sono FALSE eccetto l'uscita 0, che passa a TRUE a condizione che il valore corrente sia inferiore al valore target 1. In caso contrario, l'uscita corrispondente all'area del valore target passa a TRUE. Esempio: Se il valore corrente è compreso tra il valore target 2 = -4000 e il valore target 3 = +4000, l'uscita 2 è TRUE. Nell'esempio seguente, il controllo del valore target massimo è stato disabilitato. Quando il valore corrente raggiunge l'ultimo valore target, il conteggio continua e il valore corrente non viene reimpostato su 0.
y |
Valore corrente del contatore veloce | 8000 |
Valore target4 |
(1) |
Condizione di esecuzione | 4000 |
Valore target3 |
(2) |
Flag di controllo del contatore veloce | -4000 |
Valore target2 |
(3) |
Uscita0-4 |
-10000 |
Valore target1 |
INT0 |
Programma di interrupt 0 |
L'istruzione può essere eseguita utilizzando il controllo del valore target massimo per resettare il valore corrente a 0 quando è stato raggiunto il valore target massimo. Il controllo del valore target massimo può essere abilitato nel codice di controllo di F165_HighSpeedCounter_Cam_8_Values_DUT. Anziché utilizzare il controllo del valore target massimo, è anche possibile resettare il valore corrente utilizzando un ingresso di reset o un reset software.
Per eseguire il controllo del valore target massimo è necessario specificare numeri positivi interi per tutti i valori target.
Conteggio avanti e indietro con il controllo del valore target massimo:
y |
Valore corrente del contatore veloce | 14000 |
Maximum target value |
(1) |
Condizione di esecuzione | 10000 |
Valore target4 |
(2) |
Flag di controllo del contatore veloce | 8000 |
Valore target3 |
(3) |
Uscita0-4 |
4000 |
Valore target2 |
2000 |
Valore target1 |
Controllo del valore target massimo: |
abilitato |
disabilitato (vedere la nota) |
---|---|---|
Conteggio avanti: il puntatore della tabella dati si sposta dal valore target 1 all'ultimo valore target. |
Quando il valore corrente raggiunge il valore target massimo:
|
Quando il valore corrente raggiunge l'ultimo valore target:
|
Conteggio indietro: il puntatore della tabella dati si sposta dall'ultimo valore target al valore target 1. |
Quando il valore corrente raggiunge il valore -1:
|
Quando il valore corrente raggiunge il valore -1:
|
Ciò vale a condizione che non sia in uso né un ingresso di reset né un reset software.
Canale |
Ingresso di reset hardware |
---|---|
0 |
X2 |
1 |
|
2 |
X5 |
3 |
Il programma di interrupt viene eseguito quando il valore corrente corrisponde al valore target Ogni interrupt inserito nella lista dei Task viene automaticamente abilitato. Ad ogni numero di canale è assegnato uno speciale numero di programma di interrupt.
Canale |
0 |
1 |
2 |
3 |
4 |
5 |
Programma di interrupt |
0 |
1 |
3 |
4 |
6 |
7 |
Selezionate l'ingresso del contatore veloce per il canale desiderato nei registri di sistema.
Quando viene eseguita un'istruzione contatore veloce, il flag di controllo del contatore veloce (p.es. sys_bIsHscChannel0ControlActive) per il canale utilizzato passa a TRUE. Finché il flag di controllo è TRUE, non è possibile eseguire nessun'altra istruzione contatore veloce utilizzando lo stesso canale.
L'esecuzione delle istruzioni di uscita ad impulsi si interrompe mettendo il bit 3 del registro dati nel quale è memorizzato il codice di controllo per il contatore veloce (sys_wHscOrPulseControlCode) su TRUE. Allora il flag di controllo del contatore veloce passa a FALSE. Per riabilitare l'esecuzione dell'istruzione del contatore veloce, riportare il bit 3 a FALSE.
La riscrittura del valore corrente per il canale utilizzato durante l'esecuzione dell'istruzione può causare un funzionamento imprevisto.
Assicuratevi che l'intervallo di tempo tra valori target vicini sia maggiore di 1ms.
Se l'istruzione viene eseguita nel programma principale, assicuratevi che l'intervallo di tempo minimo tra valori target vicini sia maggiore del tempo di scansione.
Se l'istruzione viene eseguita in un programma di interrupt, assicuratevi che l'intervallo di tempo minimo tra valori target vicini sia maggiore del tempo di esecuzione massimo del programma di interrupt.
Questa istruzione può essere eseguita simultaneamente su un massimo di due canali.
In caso di utilizzo di un ingresso di reset o un reset software, assicuratevi che il valore target 1 sia un numero intero e ³ 1.
Quando il controllo del valore target massimo viene utilizzato insieme ad un ingresso di reset o ad un reset software, fate attenzione a non utilizzarli contemporaneamente.
Lo stato del flag di controllo del contatore veloce o del flag di controllo dell'uscita ad impulsi può variare durante lo svolgimento di una scansione. For example, if the number of received bytes is read more than once different statuses may exist within one scan.
se il valore target > valore target massimo.
se il valore target = 0.
se i valori target non sono disposti in ordine crescente
se il valore target > valore target massimo.
se il valore target = 0.
se i valori target non sono disposti in ordine crescente
La DUT F165_HighSpeedCounter_Cam_8_Values_DUT è predefinita nella FP Library e può essere utilizzata come esempio.
Nella lista variabili globali si definiscono variabili alle quali possono accedere tutti i POU del progetto.
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
bStartCam: BOOL:=FALSE;
dut_F165_CAM_Example1: F165_Cam_Example1_4_Values_DUT;
END_VAR
VAR_EXTERNAL
WR0_bits_F165_CAM_Examples: BOOL16_OVERLAPPING_DUT;
END_VAR
Quando la variabile bStartCam passa a TRUE, la funzione viene eseguita.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 5 ;
NETWORK_BODY
B(B_CONTACT,,sys_bIsFirstScan,5,2,7,4,);
B(B_F,E_MOVE!,Instance,14,1,20,5,,?DEN?D?AENO?C);
B(B_VARIN,,0,12,3,14,5,);
B(B_VAROUT,,sys_diHscChannel0ElapsedValue,20,3,22,5,);
B(B_COMMENT,,Reset the elapsed value,1,0,21,1,);
L(1,3,5,3);
L(7,3,14,3);
L(1,0,1,5);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_F,F165_HighSpeedCounter_Cam!,Instance,14,1,28,6,,?DEN?HiHscChannel?Ds_dutDataTable?AENO?CdutBitOutputs);
B(B_VARIN,,0,12,3,14,5,);
B(B_VARIN,,dut_F165_CAM_Example1,12,4,14,6,);
B(B_VAROUT,,WR1_dut_CAM1,28,3,30,5,);
B(B_CONTACT,,bStartCam,5,2,7,4,R);
B(B_COMMENT,,Start the cam control,1,0,21,1,);
L(1,3,5,3);
L(7,3,14,3);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF (sys_bIsFirstScan) then
sys_diHscChannel0ElapsedValue:=0;
END_IF;
IF DF(bStartCam) then
F165_HighSpeedCounter_Cam(iHscChannel := 0,
s_dutDataTable := dut_F165_CAM_Example1,
dutBitOutputs => WR0_bits_F165_CAM_Examples);
END_IF;
La DUT F165_HighSpeedCounter_Cam_8_Values_DUT è predefinita nella FP Library e può essere utilizzata come esempio.
VAR
bStartCam: BOOL:=FALSE;
dut_F165_CAM_Example2: F165_Cam_Example2_4_Values_DUT;
END_VAR
VAR_EXTERNAL
WR0_bits_F165_CAM_Examples: BOOL16_OVERLAPPING_DUT;
END_VAR
Quando la variabile bStartCam è impostata su TRUE, la funzione viene eseguita.
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 5 ;
NETWORK_BODY
B(B_CONTACT,,sys_bIsFirstScan,5,2,7,4,);
B(B_F,E_MOVE!,Instance,14,1,20,5,,?DEN?D?AENO?C);
B(B_VARIN,,0,12,3,14,5,);
B(B_VAROUT,,sys_diHscChannel0ElapsedValue,20,3,22,5,);
B(B_COMMENT,,Reset the elapsed value,1,0,21,1,);
L(1,3,5,3);
L(7,3,14,3);
L(1,0,1,5);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_F,F165_HighSpeedCounter_Cam!,Instance,14,1,28,6,,?DEN?HiHscChannel?Ds_dutDataTable?AENO?CdutBitOutputs);
B(B_VARIN,,0,12,3,14,5,);
B(B_VARIN,,dut_F165_CAM_Example2,12,4,14,6,);
B(B_VAROUT,,WR0_bits_F165_CAM_Examples,28,3,30,5,);
B(B_CONTACT,,bStartCam,5,2,7,4,R);
B(B_COMMENT,,Start the cam control,1,0,21,1,);
L(7,3,14,3);
L(1,3,5,3);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF (sys_bIsFirstScan) then
sys_diHscChannel0ElapsedValue:=0;
END_IF;
IF DF(bStartCam) then
F165_HighSpeedCounter_Cam(iHscChannel := 0,
s_dutDataTable := dut_F165_CAM_Example2,
dutBitOutputs => WR0_bits_F165_CAM_Examples);
END_IF;