Controllo trapezoidale
Questa istruzione effettua automaticamente un controllo trapezoidale secondo i parametri della DUT specificata. Gli impulsi vengono emessi dal canale specificato quando il flag di controllo per tale canale è FALSE e la condizione di esecuzione è TRUE.
Ingresso
Indirizzo di partenza dell'area contenente la tabella dati
FP-S, FP-X:
F171_PulseOutput_Trapezoidal_DUT
FP0R:
F171_PulseOutput_Trapezoidal_Type0_DUT
F171_PulseOutput_Trapezoidal_Type1_DUT
Canale uscita ad impulsi:
FP-XH C30 T/P: 0–3
FP-XH C60 T/P: 0–5
FP-S: 0, 2
FP-X R: 0, 1
FP-XC14T: 0, 1, 2
FP-X C30T/C60T: 0, 1, 2, 3
FP0R: 0, 1, 2, 3
Utilizzare la seguente DUT predefinita: F171_PulseOutput_Trapezoidal_DUT.
Nella DUT possono essere specificati i seguenti parametri:
Velocità iniziale e finale
Velocità target
Tempo di accelerazione/decelerazione
Valore target
Flag di controllo dell'uscita ad impulsi
Condizione di esecuzione
La frequenza dell'uscita ad impulsi cambia secondo il tempo di accelerazione/decelerazione.La differenza fra velocità target e velocità iniziale determina il tipo di rampa.
FP-X: Mentre viene eseguita un'istruzione uscita ad impulsi e gli impulsi vengono emessi, il flag di controllo dell'uscita ad impulsi (p.es. sys_bIsPulseChannel0Active) del rispettivo canale è TRUE. Finché questo flag è TRUE non può essere eseguita nessun'altra istruzione uscita ad impulsi.
FPS: Il flag di controllo del contatore veloce (p.es. sys_bIsHscChannel0ControlActive) e il flag di controllo dell’uscita ad impulsi (p.es. sys_bIsPulseChannel0Active) vengono allocati allo stesso numero di flag interno speciale (p.es. R903A). Pertanto, quando viene eseguita un'istruzione contatore veloce o un'istruzione uscita ad impulsi, il flag di controllo del contatore veloce (p.es. sys_bIsHscChannel0ControlActive) e il flag di controllo dell'uscita ad impulsi (p.es. sys_bIsPulseChannel0Active) per il canale utilizzato sono TRUE. Finché questo flag è TRUE non può essere eseguita nessun’altra istruzione contatore veloce o istruzione uscita ad impulsi.
FPS: L’esecuzione dell’istruzione di controllo di interpolazione circolare F176_PulseOutput_Center imposta il flag controllo interpolazione circolare (sys_bIsCircularInterpolationActive) su TRUE. Lo stato di questo flag viene mantenuto fino a quando viene raggiunto il valore target (anche se la condizione di esecuzione non è più TRUE). Durante questo lasso di tempo non è possibile eseguire altre istruzioni uscita ad impulsi
FPS: Nei registri di sistema impostare un contatore veloce assegnato ad un canale di uscita ad impulsi su "Non utilizzato".
FP-X: Nei registri di sistema impostare "uscita ad impulsi" per il canale desiderato.
Si raccomanda vivamente di incorporare un'opzione di stop uscita impulsi nel proprio programma di posizionamento.
Utilizzare la seguente DUT predefinita: F171_PulseOutput_Trapezoidal_Type0_DUT (velocità massima = prima velocità target) oppure F171_PulseOutput_Trapezoidal_Type1_DUT (velocità massima = 50kHz).
La velocità target può essere cambiata durante l’uscita ad impulsi.
Sono disponibili due metodi di controllo:
Tipo 0: La velocità può essere modificata entro l'intervallo della velocità target specificato per primo.
Tipo 1: La velocità può cambiare ma deve essere sempre inferiore alla massima velocità ammessa (50kHz).
Nella DUT possono essere specificati i seguenti parametri:
Caratteristiche dell’uscita ad impulsi
Velocità iniziale e finale
Velocità target
Tempo di accelerazione
Tempo di decelerazione
Valore target
Flag di controllo dell'uscita ad impulsi
Condizione di esecuzione
Richiesta stop decelerato
Tipo 0:
La differenza fra velocità target e velocità iniziale determina la pendenza della rampa di accelerazione.La differenza fra velocità target e velocità finale determina la pendenza della rampa di decelerazione.
Tipo 1:
La differenza fra velocità massima di 50kHz e velocità iniziale determina la pendenza della rampa di accelerazione.La differenza fra velocità massima di 50kHz e velocità finale determina la pendenza della rampa di decelerazione.
Gli impulsi vengono emessi utilizzando un duty ratio del 25%Con la tipologia di uscita ad impulsi “impulsi/direzione,” gli impulsi sono emessi all’incirca 300ms dopo che è stato emesso il segnale della direzione; contemporaneamente viene tenuto conto delle caratteristiche del motore.
Stop decelerato
Per eseguire uno stop decelerato, impostate il bit 5 del registro dati che memorizza il codice di controllo dell’uscita impulsi da FALSE a TRUE (p.es. MOVE(16#120, sys_wHscOrPulseControlCode);
).Se durante l'accelerazione viene richiesto uno stop decelerato, la decelerazione viene eseguita con lo stesso tipo di rampa della decelerazione dalla velocità target.
Cambiamento della velocità target durante l’uscita ad impulsi
Tipo 1: La velocità può cambiare ma deve essere sempre inferiore alla massima velocità ammessa (50kHz).
Velocità target
1° cambio della velocità target
2° cambio della velocità target
Tempo di accelerazione
Accelerazione
Decelerazione
Tempo di decelerazione
Flag di controllo dell'uscita ad impulsi
Condizione di esecuzione
Per modificare la velocità, mantenere la condizione di esecuzione su TRUE.
Tipo 0:
Se viene specificato un valore maggiore della velocità target all’avvio, esso verrà corretto nella velocità target all’avvio.
Tipo 1:
Se la velocità target viene impostata su un valore maggiore di 50kHz, essa verrà corretta a 50kHz.
Se il valore corrente supera la posizione iniziale dell'area vietata di accelerazione (p.es. sys_diPulseChannel0AccelerationForbiddenAreaStartingPosition) durante l'accelerazione, la stessa non potrà essere eseguita.
La velocità di decelerazione non può essere inferiore alla velocità finale corretta.
Non appena si inizia a modificare un programma online (ossia in modalità RUN) utilizzando questa istruzione, l’emissione di impulsi si arresta.
Se sia il programma principale sia il programma di interrupt contengono un codice per lo stesso canale, essi non devono poter esser eseguiti contemporaneamente.
Si raccomanda vivamente di incorporare un'opzione di stop uscita impulsi nel proprio programma di posizionamento.
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
bMotorSwitch: BOOL:=FALSE;
dutTrapez: F171_PulseOutput_Trapezoidal_DUT:=dwControlCode := 16#1100;
(*Control code:
Digit 3: 1=Duty ratio 25%
Digit 2: 1=Frequency range 48Hz-100kHz
Digit 1: 0=Relative value control
Digit 0: 0=CW/CCW*)
END_VAR
VAR_EXTERNAL
X0_bMotorSwitch: BOOL:=FALSE;
(*at X0*)
END_VAR
VAR
diInitialSpeed: DINT:=100;
diTargetSpeed: DINT:=2000;
diAccelerationTime: DINT:=300;
diTargetValue: DINT:=10000;
@'': @'';
END_VAR
BODY
WORKSPACE
NETWORK_LIST_TYPE := NWTYPELD ;
ACTIVE_NETWORK := 0 ;
END_WORKSPACE
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 16 ;
NETWORK_BODY
B(B_CONTACT,,bMotorSwitch,4,1,6,3,R);
B(B_F,E_MOVE!,Instance,17,4,23,8,,?DEN?D?AENO?C);
B(B_F,E_MOVE!,Instance,17,8,23,12,,?DEN?D?AENO?C);
B(B_VAROUT,,dutTrapez.diTargetSpeed,23,6,25,8,);
B(B_VARIN,,diTargetSpeed,15,6,17,8,);
B(B_VAROUT,,dutTrapez.diAccelerationAndDecelerationTime,23,10,25,12,);
B(B_VARIN,,diAccelerationTime,15,10,17,12,);
B(B_F,E_MOVE!,Instance,17,12,23,16,,?DEN?D?AENO?C);
B(B_VAROUT,,dutTrapez.diTargetValue,23,14,25,16,);
B(B_VARIN,,diTargetValue,15,14,17,16,);
B(B_F,E_MOVE!,Instance,17,0,23,4,,?DEN?D?AENO?C);
B(B_VAROUT,,dutTrapez.diInitialAndFinalSpeed,23,2,25,4,);
B(B_VARIN,,diInitialSpeed,15,2,17,4,);
L(7,2,7,6);
L(7,6,7,10);
L(1,2,4,2);
L(6,2,7,2);
L(7,2,17,2);
L(7,6,17,6);
L(7,10,17,10);
L(7,10,7,14);
L(7,14,17,14);
L(1,0,1,16);
END_NETWORK_BODY
END_NET_WORK
NET_WORK
NETWORK_TYPE := NWTYPELD ;
NETWORK_LABEL := ;
NETWORK_TITLE := ;
NETWORK_HEIGHT := 6 ;
NETWORK_BODY
B(B_CONTACT,,bMotorSwitch,4,2,6,4,R);
B(B_VARIN,,dutTrapez,14,3,16,5,);
B(B_VARIN,,0,14,4,16,6,);
B(B_F,F171_PulseOutput_Trapezoidal!,Instance,16,1,31,6,,?DEN?Ds_dutDataTable?Hn_iPulseOutputChannel?AENO);
L(6,3,16,3);
L(1,3,4,3);
L(1,0,1,6);
END_NETWORK_BODY
END_NET_WORK
END_BODY
IF DF(bMotorSwitch) then
dutTrapez.diInitialAndFinalSpeed:=diInitialSpeed;
dutTrapez.diTargetSpeed:=diTargetSpeed;
dutTrapez.diAccelerationDecelerationTime:=diAccelerationTime;
dutTrapez.diDeviationCounterClearSignalOutputTime:=10;
END_IF;
IF DF(bMotorSwitch) then
F171_PulseOutput_Trapezoidal(s_dutDataTable := dutTrapez,
n_iPulseOutputChannel :=0);
END_IF;