software:devices:oopos2

Differenze

Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina.

Link a questa pagina di confronto

Entrambe le parti precedenti la revisione Revisione precedente
Prossima revisione
Revisione precedente
software:devices:oopos2 [2017/01/19 16:05] – [5.5.2. Rallentamento proporzionale alla velocità] qem103software:devices:oopos2 [2020/07/13 15:15] (versione attuale) qem103
Linea 1: Linea 1:
 +====== DEVICE OOPOS2 ======
 +
 +
 +====== - Introduzione ======
 +
 +  * Il device OOPOS2 consente di controllare la posizione di un asse movimentato fondamentalmente da comandi digitali di avanti, indietro e rallentamento; la posizione dell’asse viene acquisita tramite un trasduttore bidirezionale.
 +  * I comandi di movimentazione possono essere inviati direttamente al motore in AC tramite teleruttori, oppure essere inviati ad un inverter.
 +  * Il device OOPOS2 include tutte le funzioni necessarie per l’esecuzione di posizionamenti ON/OFF, oltre a funzioni particolari quali il ricalcolo automatico dell’inerzia, la gestione del recupero dei giochi meccanici, la gestione del rallentamento proporzionale alla velocità e una completa ricerca di preset per la sincronizzazione della posizione reale dell’asse con il valore interno del device.
 +
 +{{ :software:devices:oopos2:oopos2_01.png?nolink700 |}}
 +
 +
 +===== - Installazione =====
 +
 +==== - Dichiarazione device nel file di configurazione (.CNF) ====
 +
 +Nel file di configurazione (.CNF), la sezione BUS deve essere dichiarata in modo tale che siano
 +presenti le risorse hardware necessarie all’implementazione del device OOPOS2. Devono essere
 +presenti almeno un contatore bidirezionale. Il device può utilizzare anche un ingresso e una linea
 +di interrupt per le funzioni di ricerca di preset.\\
 +Nella sezione INTDEVICE del file .CNF deve essere aggiunta la seguente definizione:
 +<code QCL>
 +;---------------------------------
 +; Dichiarazione devices interni
 +;---------------------------------
 +INTDEVICE
 +<nome device> OOPOS2 TCamp IQCTL ILine IAZero OutAva OutInd OutDir OutMov OutRal OutFre
 +</code>
 +
 +^:info:^È necessario che tutte le voci di definizione siano presenti sulla stessa linea. Nel caso in cui non si desideri associare una risorsa, ad esempio OutFre, si deve comunque inserire nel relativo campo la stringa X.X.^
 +
 +dove:
 +|<nome device>|Nome assegnato al device.|
 +|OOPOS2|Parola chiave che identifica il device posizionatore on/off.|
 +|TCamp|Tempo campionamento device (1÷255 ms).|
 +|IQCTL|Indirizzo del contatore bidirezionale incrementale.|
 +|ILine|Linea di interrupt dedicata per l'impulso di zero.|
 +|IAZero|Ingresso per l'abilitazione alla cattura dell'impulso di zero.|
 +|OutAva|Indirizzo dell'uscita utilizzata come uscita avanti.|
 +|OutInd|Indirizzo dell'uscita utilizzata come uscita indietro.|
 +|OutDir|Indirizzo dell'uscita utilizzata come uscita direzione.|
 +|OutMov|Indirizzo dell'uscita utilizzata come uscita movimento.|
 +|OutRal|Indirizzo dell'uscita utilizzata come uscita rallentamento.|
 +|OutFre|Indirizzo dell'uscita utilizzata come uscita freno.|
 +
 +=== - Esempio ===
 +<code QCL>
 +;--------------------------------
 +; Dichiarazione devices interni
 +;--------------------------------
 +INTDEVICE
 +Asse OOPOS2 0004 2.CNT01 1 2.IN01 2.OUT01 2.OUT02 X.X X.X 2.OUT3 X.X
 +</code>
 +
 +
 +===== - Nozioni preliminari sul posizionamento ON/OFF =====
 +
 +Le uscite digitali per la gestione del posizionamento vengono eccitate/diseccitate in funzione
 +della posizione dell’asse (conteggio), opportunamente controllata dal device in funzione delle
 +parametrizzazioni.\\
 +Il posizionamento ON/OFF può essere eseguito in entrambe le direzioni (avanti/indietro) con la
 +possibilità di introdurre il recupero giochi, per l’eliminazione di eventuali giochi meccanici.
 +
 +==== - Recupero giochi ====
 +
 +La precisione con la quale è stata realizzata la meccanica è fondamentale per l'esito dei
 +posizionamenti. È infatti impossibile ricercare, nei posizionamenti, la precisione del centesimo
 +se gli organi di movimento hanno dei laschi dell'ordine del decimo. Inoltre, nei posizionamenti
 +di assi verticali molto pesanti (ed esempio una pressa o una fresa verticale), l'inerzia nei movimenti
 +verso l'alto è nettamente inferiore all'inerzia nei movimenti verso il basso.\\
 +In queste ed altra situazioni l'implementazione del recupero giochi nel posizionamento migliora
 +sensibilmente la precisione.
 +
 +^:info:^Il posizionamento viene sempre concluso nella stessa direzione.\\ Ad esempio, considerando i posizionamenti con recupero giochi avanti (vedi figura 1), sia per il posizionamento in avanti che indietro, il movimento dell'asse di conclude sempre spostandosi da sinistra verso destra (in avanti).^
 +
 +|Figura 1: diagramma di posizionamento con recupero giochi.|
 +|{{ :software:devices:oopos2:oopos2_02.png?nolink550 |}}|
 +
 +==== - Posizionamento in avanti senza recupero giochi ====
 +
 +Nel grafico di figura 2 vengono illustrate le varie fasi di un posizionamento ON/OFF in avanti
 +senza l’implementazione del recupero giochi.\\
 +L’eccitazione delle uscite di movimento (in questo caso l’uscita di avanti) movimenta l’asse;
 +l’incremento del conteggio acquisito e l’opportuna impostazione dei parametri del device comporta
 +l’eccitazione di altre uscite dedicate alla gestione del movimento, fino ad arrivare alla
 +conclusione del posizionamento ed all’eccitazione dell’uscita di tolleranza ( segnalazione di
 +posizionamento concluso correttamente).
 +
 +|Figura 2: posizionamento in avanti senza recupero giochi.|
 +|{{ :software:devices:oopos2:oopos2_03.png?nolink450 |}}|
 +
 +=== - Condizioni iniziali ===
 +  * L’asse è fermo (//st_still = 1//).
 +  * Il conteggio è azzerato (//posit = 0//).
 +  * Tutte le uscite sono diseccitate (ad esclusione dell’uscita freno).
 +  * Sono state impostate sia la quota di posizionamento (//setpos//) che la quota di rallentamento (//slowpos//).
 +
 +=== - Fase 1 ===
 +  * Il device OOPOS2 riceve il comando di //START// posizionamento.
 +  * L’uscita freno si diseccita (//st_brake = 0//).
 +  * Il timer di anticipo sblocco freno viene impostato al valore definito dal parametro //tbrake//
 +
 +=== - Fase 2 ===
 +  * Termina il timer di anticipo sblocco freno.
 +  * Viene eccitata l’uscita di avanti (//st_movfwd = 1//).
 +  * L’asse inizia il movimento (//vel//) ed il conteggio (//posit//) si incrementa.
 +  * Dopo un rampa di accelerazione (definita dall’inerzia della meccanica o dagli eventuali valori di accelerazione impostati nell’inverter), la velocità dell’asse è costante.
 +
 +=== - Fase 3 ===
 +  * Il posizionamento raggiunge la fascia di rallentamento (//setpos - slowpos//).
 +  * L’uscita di avanti si diseccita (//st_movfwd = 0//).
 +  * Il timer di rallentamento viene impostato al valore definito dal parametro slowdly.
 +  * Quando il timer di rallentamento di trova a metà del valore impostato, viene attivata l’uscita di Rallentamento (//st_movslow = 1//): questo serve per evitare problemi con le commutazioni di particolari dispositivi elettromeccanici.
 +
 +=== - Fase 4 ===
 +  * Termina il timer di rallentamento.
 +  * Viene eccitata l’uscita di avanti (//st_movfwd = 1//).
 +  * L’asse si viene movimentato con velocità lenta.
 +
 +=== - Fase 5 ===
 +  * Il posizionamento raggiunte la fascia di inerzia (//setpos - iner[ninert]//).
 +  * Le uscite di avanti (//st_movfwd = 0//) e di rallentamento (//st_movslow = 0//) vengono diseccitate.
 +  * Il timer di ritardo attivazione tolleranza viene impostato al valore di //toldly// ed inizia a contare.
 +  * L’asse continua a muoversi a causa della sua inerzia (variabile in funzione del sua peso, velocità, condizioni di attrito).
 +
 +=== - Fase 6 ===
 +  * L’asse si ferma.
 +  * È importante che l’asse finisca il movimento prima del termine del timer di ritardo attivazione tolleranza.
 +
 +=== - Fase 7 ===
 +  * Termina il timer di ritardo attivazione tolleranza.
 +  * L’uscita freno viene eccitata (//st_brake = 1//).
 +  * Se abilitato, viene eseguito il ricalcolo delle inerzie.
 +  * Se il posizionamento si conclude in tolleranza, viene eccitata l’uscita di tolleranza (//st_toll = 1//).
 +
 +==== - Posizionamento in avanti con recupero giochi indietro ====
 +
 +Nel grafico di figura 3 vengono illustrate le varie fasi di un posizionamento ON/OFF in avanti con
 +l’implementazione del recupero giochi indietro.\\
 +L’eccitazione delle uscite di movimento (avanti / indietro) movimentano l’asse; l’incremento
 +del conteggio acquisito e l’opportuna impostazione dei parametri del device comporta l’eccitazione
 +di altre uscite dedicate alla gestione del movimento, fino ad arrivare alla conclusione del
 +posizionamento ed all’eccitazione dell’uscita di tolleranza ( segnalazione di posizionamento
 +concluso correttamente).
 +
 +|Figura 3: posizionamento in avanti con recupero giochi indietro.|
 +|{{ :software:devices:oopos2:oopos2_04.png?nolink450 |}}|
 +
 +=== - Premessa ===
 +  * Per la completa comprensione di questa descrizione è necessario avere letto il paragrafo precedente (posizionamento in avanti senza recupero giochi).
 +
 +=== - Condizioni iniziali ===
 +  * L’asse si muove alla velocità di posizionamento.
 +  * Conteggio maggiore di zero.
 +  * Tutte le uscite diseccitate ad esclusione dell’uscita di avanti.
 +
 +=== - Fase 1 ===
 +  * Il conteggio raggiunge la fascia di rallentamento per l’oltrequota recupero giochi (//setpos + overpos - slowpos//).
 +  * L’uscita di avanti viene diseccitata (//st_movfwd = 0//).
 +  * Il timer di rallentamento viene impostato al valore impostato con il parametro //slowdly//.
 +
 +=== - Fase 2 ===
 +  * Termina il timer di anticipo sblocco freno.
 +  * Viene eccitata l’uscita di avanti (//st_movfwd = 1//).
 +
 +=== - Fase 3 ===
 +  * Termina il timer di rallentamento.
 +  * Viene eccitata l’uscita di avanti (//st_movfwd = 1//).
 +  * L’asse si muove alla velocità lenta.
 +
 +=== - Fase 4 ===
 +  * Il posizionamento raggiunge la fascia di inerzia (//setpos + overpos + iner[ninert]//).
 +  * Le uscite di avanti (//st_movfwd = 0//) e di rallentamento (//st_movslow = 0//) vengono diseccitate.
 +  * Il timer di inversione viene impostato al valore di tinv.
 +
 +=== - Fase 5 ===
 +  * Termina il timer di inversione.
 +  * Il posizionamento riprende nella direzione indietro.
 +
 +=== - Fase 6÷8 ===
 +  * Fasi di posizionamento normale come descritto in precedenza.
 +
 +
 +===== - Funzionamento =====
 +
 +==== - Collegamento dell’hardware ====
 +
 +Il device OOPOS2 necessita di alcune risorse hardware indispensabili, quali un ingresso di conteggio
 +per trasduttore bidirezionale (CNTxx) e delle uscite digitali.
 +
 +==== - Verifica del funzionamento della risorsa contatore ====
 +
 +La seguente procedura serve per verificare il funzionamento dell’ingresso di conteggio.
 +  * Inizializzare il device Asse con il comando di INIT.\\ ''INIT Asse''
 +  * Verificare l’attivazione dello stato //st_init//.\\ ''WAIT Asse:st_init''
 +  * Inserire il valore 100000 nel parametro //cntratio//.\\ ''Asse:cntratio = 100000''
 +  * Azzerare il valore del parametro //posit//.\\ ''Asse:posit = 0''
 +  * Muovere l’asse in avanti facendo muovere un giro completo all’encoder: verificare che il valore della variabile Asse:posit sia positivo e corrisponda al numero di impulsi giro dell’encoder.
 +  * Se il valore di Asse:posit è negativo, scambiare le fasi dell’encoder.\\ Se il valore di Asse:posit rimane a zero, controllare i collegamenti elettrici.
 +
 +==== - Verifica del funzionamento delle uscite digitali ====
 +
 +^:info:^Prima di movimentare l'asse, verificare il corretto funzionamento dei dispositivi di emergenza e protezione.^
 +
 +La seguente procedura serve per verificare il funzionamento delle uscite digitali di avanti, indietro
 +e rallentamento movimentando l'asse con i comandi manuali del device.\\
 +Per proseguire, verificare che il device Asse sia inizializzato e con il valore di ''Asse:cntratio'' corretto.
 +  * Impostare al massimo valore i limiti software del device in modo da consentirne il movimento. Inserire il valore 999999 nel parametro //maxpos// ed il valore -999999 nel parametro //minpos//.\\ ''Asse:maxpos = 999999''\\ ''Asse:minpos = -999999''
 +  * Dare il comando MANFFW per fare attivare la sola uscita di avanti.\\ ''MANFFW Asse''
 +  * Per verificare la corretta esecuzione del comando, controllare che lo stato //st_still// sia 0 e //st_movfwd// sia 1:\\ ''WAIT NOT Asse:st_still AND Asse:st_movfwd''
 +  * Verificare che l'asse si muova in avanti e che il conteggio visualizzato in ''Asse:posit'' si incrementi, quindi fermare il movimento con il comando //STOP//.\\ ''STOP Asse''
 +  * Se l'uscita di avanti, corrispondente ad esempio alla risorsa 2.OUT01, non si attiva, verificare il collegamento elettrico.
 +  * Dare il comando //MANFBW// per eccitare la sola uscita di Indietro.\\ ''MANFBW Asse''
 +  * Per verificare la corretta esecuzione del comando, controllare che lo stato //st_still// sia 0 e //st_movbwd// sia 1:\\ ''WAIT NOT Asse:st_still AND Asse:movbwd''
 +
 +
 +===== - Funzioni =====
 +
 +==== - Gestione multiasse ====
 +
 +In alcune applicazioni viene richiesto di posizionare un numero elevato di assi movimentando un
 +singolo asse alla volta. La scelta progettuale ricade sull’installazione di un solo azionamento che
 +a seconda dell’asse da posizionare si collega elettricamente al motore interessato al
 +posizionamento; il trasduttore é sempre vincolato al relativo asse.\\
 +Il device EPICPOS permette di controllare l’accesso al dispositivo DAC tramite i comandi //REGON//
 +e //REGOFF//. In questo modo tramite l’applicativo in QCL definisce una serie di device tanti quanti
 +sono gli assi da posizionare; nella definizione, tutti i device utilizzano la stessa risorsa DAC
 +(//IOutA//).\\
 +Normalmente tutti i device devono essere nello stato //st_regoff = 1// in modo da non avere accesso
 +al dispositivo DAC. Prima di iniziare il posizionamento, con il comando //REGON//, il device interessato
 +viene portato allo stato di //st_regoff = 0//. Viene eseguito il posizionamento e, al suo
 +completamento, il device viene riportato nello stato di //st_regoff = 1// con il comando //REGOFF//. Per
 +nessun motivo due device si devono trovare contemporaneamente nello stato di //st_regoff = 0//.\\
 +Quando il device viene posto nella condizione di regoff, l’uscita analogica rimane fissa all’ultimo
 +valore di tensione definito prima del comando //REGOFF//.
 +
 +==== - Cambio quota e conteggio in movimento ====
 +
 +^:info:^Il cambio della quota viene accettato solamente se la nuova posizione é raggiungibile con la direzione in uso e se l'asse non é già in fase di decelerazione per raggiungere la quota precedentemente impostata.^
 +
 +In alcune applicazioni viene richiesto di definire la quota di destinazione durante il posizionamento,
 +in base ad eventi esterni al device. Questa caratteristica si traduce nella possibilità di
 +scrittura nel parametro //setpos// anche con posizionamenti in corso.
 +
 +{{:software:devices:oopos2:oopos2_05.png?nolink450}}
 +
 +Durante il posizionamento é possibile anche modificare il valore del conteggio //posit//. Questa
 +funzione viene utilizzata solitamente quando un device deve, in particolari condizioni, continuare
 +un profilo di velocitá per un tempo molto lungo, superiore al tempo che l'asse impiega per
 +raggiungere la quota limite (//maxpos// o //minpos//).
 +
 +  * Verificare che l'asse si muova in Indietro e che il conteggio visualizzato in ''Asse:posit'' si decrementi, quindi interromper il movimento con il comando //STOP//.\\ ''STOP Asse''
 +  * Se l'uscita di Indietro, corrispondente ad esempio alla risorsa ''2.OUT02'', non si attiva, verificare il collegamento elettrico.
 +  * Dare il comando //MANSFW// per fare eccitare le uscite di avanti e rallentamento.\\ ''MANSFW Asse''
 +  * Per verificare la corretta esecuzione del comando, controllare che lo stato //st_still// sia 0, //st_movfwd// sia 1 e //st_movslow// sia 1:\\ ''WAIT NOT Asse:st_still AND Asse:st_movfwd AND Asse:st_movslow''
 +  * Verificare che l'asse si muova in avanti ad una velocità inferiore alla precedente e che il conteggio visualizzato in ''Asse:posit'' si incrementi, quindi interrompere il movimento con il comando //STOP//.\\ ''STOP Asse''
 +  * Se l'uscita di rallentamento, corrispondente ad esempio alla risorsa ''2.OUT03'', non si attiva, verificare il collegamento elettrico.
 +
 +==== - Impostazione del parametro di risoluzione dell’asse ====
 +
 +Per introdurre le quote di posizionamento nell’unità di misura desiderata (Um) è necessario
 +moltiplicare gli impulsi generati dal trasduttore per il coefficiente moltiplicativo (//cntratio//);
 +questo parametro deve essere compreso tra i valori: 374 < cntratio < 400000.
 +
 +**Calcolo del coefficiente moltiplicativo**
 +Come esempio consideriamo di introdurre le quote in millimetri; l’unità di misura (Um) sarà quindi millimetri.
 +
 +Se lo spazio di 1000 mm viene compiuto con 20000 impulsi, la variabile ''Asse:cntratio'' dovrà essere impostata a:\\ Asse:cntratio = Um x 100000 / numero_impulsi\\ cioè:\\ Asse:cntratio = 1000 x 100000 / 20000 = 5000
 +
 +Il valore moltiplicativo di 100000 adatta il risultato della divisione al formato con cui viene
 +espressa la variabile ''Asse:cntratio''.\\
 +Questa è un numero intero che però esprime un valore con un punto decimale alla quinta cifra significativa. Scrivere ''Asse:cntratio=100000'' significa impostare un rapporto Um/numero_impulsi pari a 1.00000.
 +
 +=== - Esempio ===
 +  * Inserire il valore 100000 nel parametro cntratio\\ ''Asse:cntratio = 100000''
 +  * Azzerare il valore del parametro posit\\ ''Asse:posit = 0''
 +  * Spostare l’asse di uno spazio ben preciso, ad esempio 1000 mm., che chiameremo Sp.
 +  * Acquisire il valore del parametro Asse:posit
 +  * Introdurre in Asse:cntratio il valore intero derivante dalla formula:\\ ''Asse:cntratio = Sp * 100000 / Asse:posit''
 +
 +==== - Parametrizzazioni base ====
 +
 +Per fare funzionare correttamente il device OOPOS2, è necessario inserire alcuni parametri
 +base.
 +  * Determinare i limiti software da introdurre nei parametri //maxpos// e //minpos//.\\ ''Asse:minpos = xxx'' (xxx = valore minimo dell’asse espresso in Um).\\ ''Asse:maxpos = yyy'' (yyy = valore massimo dell’asse espresso in Um).
 +  * Se si utilizza un sistema a due velocità, impostare lo spazio necessario all’asse per passare dalla velocità alta alla velocità lenta all’eccitazione dell’uscita di rallentamento; introdurre il dato nel parametro //slowpos//.\\ ''Asse:slowpos = zzz'' (zzz = valore di rallentamento dell’asse espresso in Um).
 +  * Impostare il tempo di disattivazione dell’uscita di movimento quando l’asse entra nella fascia di rallentamento in modo che l’eccitazione dell’uscita di rallentamento non provochi scompensi elettrici; introdurre il dato nel parametro //slowdly//.\\ ''Asse:slowdly = ttt'' (ttt = tempo di rallentamento espresso in s/100).
 +  * Impostare i limiti di tolleranza che si vuole ottenere durante il posizionamento nei parametri //tollp// e //tolln//. Come prima impostazione, introdurre dei valori superiori alle precisioni richieste.\\ ''Asse:tollp = tpx'' (tpx = valore di tolleranza positiva espresso in Um/10).\\ ''Asse:tolln = tnx'' (tpn = valore di tolleranza negativa espresso in Um/10).
 +  * Impostare il tempo di inversione dell’asse nel parametro tinv.\\ ''Asse:tinv = tempo di inversione espresso in s/100''
 +  * Considerare un’unica fascia di inerzia per tutto l’asse; impostare quindi il parametro //ninert// ad “1”.\\ ''Asse:ninert = 1''
 +  * Abilitare il ricalcolo dell’inerzia quando il posizionamento si conclude fuori tolleranza; impostare quindi il parametro //inertmode// ad “1”.\\ ''Asse:inertmode = 1''
 +  * Impostare il tempo di ritardo attivazione tolleranza, considerando il tempo che impiega l’asse per decelerare fino a fermarsi; impostare quindi il parametro //toldly//.\\ ''Asse:toldly = tdly'' (tdly = tempo di ritardo attivazione tolleranza espresso in s/1000).
 +
 +==== - Il rallentamento ====
 +
 +=== - Introduzione ===
 +
 +Nei posizionamenti ON/OFF lo spazio di rallentamento deve essere sufficientemente lungo per
 +portare l'asse alla velocità lenta (di fine posizionamento), con la quale entrare nella fascia di
 +inerzia e concludere il posizionamento in tolleranza. È fondamentale che la velocità al momento
 +dell'ingresso nella fascia di inerzia sia sempre uguale, in modo che l'inerzia sia ripetitiva e
 +vangano quindi evitati continui ricalcoli che provocherebbero un'imprecisione nel posizionamento.
 +
 +^:info:^Quota di rallentamento corretta: prima dello stop l'asse si muove alla velocità lenta, facilitando lo stop senza compromettere i tempi di esecuzione del posizionamento^
 +{{:software:devices:oopos2:oopos2_06.png?nolink550}}
 +
 +^:info:^Quota di rallentamento troppo lunga: questo permette all'asse di concludere il posizionamento muovendosi alla velocità lenta, però viene mantenuta per uno spazio eccessivo, allungando notevolmente i tempi del posizionamento.^
 +
 +{{:software:devices:oopos2:oopos2_07.png?nolink550|}}
 +
 +^:info:^Quota di rallentamento troppo corta: l'asse si avvicina alla quota di posizionamento con una velocità troppo alta per consentire alla meccanica un rapido arresto; la dinamica del sistema compromette quindi il posizionamento, fermando l'asse fuori dalla fascia di tolleranza impostata.^
 +
 +{{:software:devices:oopos2:oopos2_08.png?nolink550|}}
 +
 +In alcuni casi il device OOPOS2 deve gestire degli assi in cui la velocità di posizionamento è
 +variabile. Per questo motivo il device OOPOS2 è dotato di un sistema di calcolo automatico della
 +quota di rallentamento, in modo che la velocità di fine posizionamento ed il valore dell'inerzia
 +siano ripetitivi, indipendentemente dalla velocità dell'asse.\\
 +Il device OOPOS2 dispone di due metodi (selezionati dal parametro //slowtype//), per il calcolo del
 +rallentamento:
 +  * Con //slowtype// = 1, il rallentamento viene calcolato proporzionalmente alla velocità di posizionamento.
 +  * Con //slowtype// = 2, il rallentamento viene calcolato in funzione del quadrato della velocità di posizionamento.
 + 
 +== Impostazione della variabile di velocità ==
 +Per il calcolo del valore di rallentamento è necessario parametrizzare il device per l’acquisizione
 +della velocità dell’asse.\\
 +L’unità di misura della velocità è in funzione delle seguenti variabili:
 +  * unitvel
 +  * decpt
 +
 +//**Parametro unitvel**//
 +Definisce se i valori di velocità sono espressi in Um al minuto (//unitvel = 0//) o in Um al secondo (//unitvel = 1//).
 +
 +**//Parametro decpt//**
 +Stabilisce se impostare i valori di velocità in multipli dell’unità di misura fondamentale Um. Ad esempio, se l’unità di misura fondamentale Um=mm, ed unitvel=1 si ottiene la visualizzazione della velocità nella variabile vel in:
 +  * con decpt = 0 in mm/s
 +  * con decpt = 1 in cm/s
 +  * con decpt = 2 in dm/s
 +  * con decpt = 3 in m/s
 +
 +== Calcolo velocitá massima ==
 +**Metodo teorico**\\
 +si deve applicare la formula:\\
 +Velocità = Frequenza * ....
 +
 +**Il metodo pratico**
 +Si basa sulla lettura della velocitá rilevata dal device nel parametro //vel// fornendo all’azionamento una tensione nota. Se l’azionamento lo permette, fornire all’asse la tensione massima di lavoro e quindi leggere il valore nel parametro //vel//; se viene fornita una tensione inferiore, la velocità massima sarà in proporzionale alla tensione fornita.
 +
 +Introdurre il valore della velocitá massima rilevato nel parametro //maxvel//.
 +
 +=== - Rallentamento proporzionale alla velocità ===
 +
 +Il device calcola automaticamente il rallentamento basandosi sulla formula:\\
 +Rallentamento = (Rallentamento massimo x Velocità)/Velocità massima
 +
 +^:info:^Il calcolo del rallentamento, come evidenziato dal grafico, non può superare uno dei due limiti //maxslow// o //minslow//.^
 +
 +{{:software:devices:oopos2:oopos2_09.png?nolink500|}}
 +
 +dove:\\
 +Rallentamento massimo = corrisponde alla variabile //maxslow//.\\
 +Rallentamento minimo= corrisponde alla variabile //minslow//.\\
 +Rallentamento calcolato = corrisponde alla variabile //exeslow//.\\
 +Velocità massima = corrisponde alla variabile //maxvel//.\\
 +Velocità istantanea = corrisponde alla variabile //vel//.\\
 +
 +== Rallentamento proporzionale al quadrato della velocità ==
 +Il device calcola automaticamente il rallentamento basandosi sulla formula:\\
 +Rallentamento = (Rallentamento massimo x Velocità2)/Velocità massima
 +
 +{{:software:devices:oopos2:oopos2_10.png?nolink500|}}
 +
 +dove:\\
 +Rallentamento massimo = corrisponde alla variabile maxslow.\\
 +Rallentamento minimo= corrisponde alla variabile minslow.\\
 +Rallentamento calcolato = corrisponde alla variabile exeslow.\\
 +Velocità massima = corrisponde alla variabile maxvel.\\
 +Velocità istantanea = corrisponde alla variabile vel.
 +
 +==== - Ricalcolo dell’inerzia ====
 +
 +I valori di inerzia possono essere introdotti direttamente dall’operatore oppure calcolati automaticamente
 +dal device; la modalità viene scelta con l’impostazione del parametro //inertmode//.\\
 +Il device gestisce la suddivisione della corsa dell’asse (compresa tra //minpos// e //maxpos//) in più
 +fasce uguali tra loro; il numero delle fasce viene definito dal parametro //ninert//. In questo modo
 +si possono avere inerzie in funzione della fascia entro la quale si conclude il posizionamento.
 +
 +Impostando il parametro //dobiner// = 0, il device gestisce un’unico valore di inerzia indipendentemente
 +dalla direzione del movimento (avanti o indietro).\\
 +Impostando il parametro //dobine//r = 1, il device gestisce due valori di inerzia per ogni fascia, uno
 +per la direzione avanti ed un’altro per la direzione indietro. Questa modalità è applicabile, per
 +esempio, quando si movimentano assi verticali.\\
 +Per la memorizzazione delle inerzie, vengono utilizzati i parametri //iner01÷ iner08// (nel caso in
 +cui //dobiner// = 0) o i parametri //iner01÷ iner16// (se //dobiner// = 1):
 +
 +^ ^  dobiner = 0  ^  dobiner = 1  ^
 +|iner01|Inerzia Fascia 1|Inerzia Avanti Fascia 1|
 +|iner02|Inerzia Fascia 2|Inerzia Indietro Fascia|
 +|iner03|Inerzia Fascia 3|Inerzia Avanti Fascia 2|
 +|iner04|Inerzia Fascia 4|Inerzia Indietro Fascia 2|
 +|iner05|Inerzia Fascia 5|Inerzia Avanti Fascia 3|
 +|iner06|Inerzia Fascia 6|Inerzia Indietro Fascia 3|
 +|iner07|Inerzia Fascia 7|Inerzia Avanti Fascia 4|
 +|iner08|Inerzia Fascia 8|Inerzia Indietro Fascia 4|
 +|iner09|n.u.|Inerzia Avanti Fascia 5|
 +|iner10|n.u.|Inerzia Indietro Fascia 5|
 +|iner11|n.u.|Inerzia Avanti Fascia 6|
 +|iner12|n.u.|Inerzia Indietro Fascia 6|
 +|iner13|n.u.|Inerzia Avanti Fascia 7|
 +|iner14|n.u.|Inerzia Indietro Fascia 7|
 +|iner15|n.u.|Inerzia Avanti Fascia 8|
 +|iner16|n.u.|Inerzia Indietro Fascia 8|
 +Per definizione, l’inerzia avanti viene utilizzata solamente nei movimenti in avanti (uscita di avanti eccitata) mentre, l’inerzia indietro, viene utilizzata solamente nei movimenti indietro (uscita di indietro eccitata).
 +
 +{{:software:devices:oopos2:oopos2_11.png?nolink500|}}
 +
 +==== - Gestione ricalcolo automatico inerzia ====
 +
 +Il calcolo delle inerzie relative alle varie fasce può essere fatto automaticamente dal device;
 +alla conclusione di ogni posizionamento, il device quantifica il valore dell’inerzia da utilizzare
 +nei posizionamenti successivi che si concluderanno nella medesima fascia.\\
 +È possibile definire una serie di personalizzazioni relative al ricalcolo automatico delle inerzie.
 +
 +=== - Inertmode ===
 +Con l’impostazione di questo parametro è possibile definire quando il device esegue il ricalcolo
 +dell’inerzia; sono disponibili due possibilità:
 +  * Il ricalcolo viene eseguito solamente se il posizionamento si conclude fuori dalla fascia di tolleranza.
 +  * Il ricalcolo viene eseguito alla conclusione di ogni posizionamento, indipendentemente dal fatto che sia concluso dentro o fuori dalla fascia di tolleranza.
 +
 +=== - Todly ===
 +  * Il ricalcolo automatico dell’inerzia viene eseguito dal device OOPOS2 quando termina il tempo di ritardo attivazione tolleranza (//toldly//), allo scadere del quale l’asse viene considerato sicuramente fermo.
 +
 +=== - Maxiner ===
 +  * Se il valore dell’inerzia ricalcolata si discosta oltre un certo valore dall’inerzia in uso, è possibile avere una segnalazione (stato //st_erin// = 1); questa segnalazione può comunque essere disabilitata.
 +
 +==== - La ricerca di preset ====
 +
 +La ricerca di preset é una procedura per sincronizzare il valore del parametro //posit// con la reale
 +posizione dell'asse. Consiste nel caricare sul conteggio un valore (precedentemente memorizzato)
 +al momento dell'acquisizione dell'impulso di zero del trasduttore; è comunque possibile
 +eseguire la ricerca di preset anche se si dispone di un trasduttore senza impulso di zero, ma è
 +comunque necessaria un ingresso (camma o sensore) di "abilitazione impulso di zero trasduttore".
 +
 +Precedentemente alla ricerca di preset il conteggio acquisito può avere un qualsiasi valore e
 +l'asse può trovarsi in qualsiasi punto. Per eseguire il caricamento della quota di preset, l'asse si
 +deve dirigere verso l'ingresso di "abilitazione impulso di zero trasduttore".\\
 +La direzione iniziale del movimento viene definita dal parametro //prsdir//:\\
 +//prsdir// = 0 l'asse partirà sempre in avanti.\\
 +//prsdir// = 1 l'asse partirà sempre indietro.
 +
 +^:info:^Durante la ricerca preset i limiti software maxpos e minpos non sono abilitati.^
 +
 +L'avvio della ricerca di preset viene dato dal comando //PRESET//.\\
 +Se durante la ricerca di preset viene dato nuovamente il comando //PRESET// la direzione di movimento
 +dell'asse viene invertita, mantenendo inalterato il funzionamento della direzione ricerca
 +preset impostato.\\
 +È da sottolineare che la quota di preset (//prspos//) deve essere sempre compresa tra la quota
 +minima e la quota massima e che, dopo il caricamento della quota di preset, l'asse si posiziona
 +automaticamente alla quota di preset.
 +
 +=== - Modo 0: caricamento preset con procedura di movimentazione ===
 +
 +^:info:^L'ingresso di abilitazione impulso di zero ha un filtro hardware che ritarda l'acquisizione e quindi influenza la precisione del caricamento.\\ La velocità dell'asse deve quindi essere sufficientemente bassa da permettere l'acquisizione dell'ingresso.^
 +
 +L'asse si dirige verso il sensore collegato all'ingresso di abilitazione impulso di zero con la
 +normale velocitá di posizionamento. Lo stato //st_prson// segnala che la procedura di preset è in
 +corso. Quando, nella sua corsa, l'asse incontra l'ingresso di abilitazione impulso di zero trasduttore,
 +inverte la direzione ed assume la velocitá lenta.\\
 +Alla disattivazione dell'ingresso di abilitazione impulso di zero viene caricata la quota di preset
 +sul conteggio (parametro //posit//).\\
 +L'asse si ferma, lo stato //st_prson// si disattiva e lo stato //st_prsok// si attiva per segnalare la
 +conclusione della ricerca. Questo stato rimane attivo fino all'avviamento di una nuova procedura
 +di preset. All'accensione del sistema questo stato é sempre a zero. Vedi figura 1.
 +
 +|Figura 1: caricamento preset utilizzando la sola camma di abilitazione.|
 +|{{ :software:devices:oopos2:oopos2_12.png?nolink500 |}}|
 +
 +=== - Modo 1: caricamento preset con procedura di movimentazione ===
 +
 +^:info:^L'acquisizione viene fatta su ingresso in interrupt quindi la velocitá dell'asse non é determinante. Bisogna comunque verificare che il tempo di attivazione dell'impulso di zero sia sufficientemente lungo da essere acquisito dalla scheda.^
 +
 +L'asse si dirige verso il sensore collegato all'ingresso di abilitazione impulso di zero con la normale
 +velocitá di posizionamento. Lo stato //st_prson// segnala che la procedura di preset è in corso.
 +Quando, nella sua corsa, l'asse incontra l'ingresso di abilitazione impulso di zero trasduttore,
 +inverte la direzione ed assume la velocitá lenta.\\
 +Alla disattivazione dell'ingresso di abilitazione impulso di zero viene abilitata la lettura del
 +primo impulso di zero fornito dal trasduttore e, al momento dell'acquisizione di questo segnale,
 +viene caricata la quota di preset nel conteggio (parametro //posit//).\\
 +L'asse si ferma, lo stato //st_prson// si disattiva e lo stato //st_prsok// si attiva per segnalare la conclusione
 +della ricerca. Questo stato rimane attivo fino all'avviamento di una nuova procedura di
 +preset. All'accensione del sistema questo stato é sempre a zero. Vedi figura 2.
 +
 +|Figura 2: caricamento preset utilizzando camma di abilitazione ed impulso di zero trasduttore.|
 +|{{ :software:devices:oopos2:oopos2_13.png?nolink500 |}}|
 +
 +=== - Modo 2: caricamento con asse fermo ===
 +Con questa procedura la ricerca di preset non è abilitata. Il comando di caricamento della quota
 +di preset viene fornito dall’attivazione dell’ingresso di abilitazione impulso di zero e viene attivato
 +lo stato //st_prsok//.
 +  * Se l’ingresso rimane attivo il caricamento é continuo.
 +  * Se all’accensione l’ingresso é già attivo il primo caricamento viene eseguito solo dopo una sua disattivazione.
 +
 +==== - Delta conteggio ====
 +
 +^:info:^Il comando è inviabile solamente se l'asse è fermo, condizione di st_still = 1.^
 +
 +Il device visualizza sempre la posizione assoluta dell'asse; per eseguire posizionamenti incrementali
 +é necessario disporre di uno strumento per sottrarre o sommare un determinato valore
 +al conteggio (//posit//) senza introdurre errori. Il cambio di conteggio può essere eseguito anche
 +con una scrittura diretta nel nuovo valore nel parametro //posit//.\\
 +Volendo sottrarre 100 unità di misura al conteggio è possibile:\\
 +//Asse:posit = Asse:posit - 100//
 +
 +^:info:^La modifica del valore di risoluzione (//cntratio//) o la scrittura della variabile //posit//, provoca l'azzeramento dei resti della conversione.^
 +
 +Questa operazione introduce un errore perché impone la posizione "//posit// = -100", quando l'asse
 +poteva avere una posizione intermedia tra una unità di misura e la successiva (es. 100.3). Questa
 +frazione (0.3) viene persa ed il ripetersi di queste operazioni provocano l'accumularsi di un
 +errore non trascurabile.\\
 +Il comando //DELCNT// somma al conteggio una quantità pari al parametro //delta// senza perdere la
 +parte frazionaria della posizione:\\
 +//Asse:delta = -100//\\
 +//DELCNT Asse//\\
 +Il comando di //DELCNT// può essere inviato solamente con asse fermo (//st_still=1//)
 +
 +=== - Esempio ===
 +La lettura della posizione dell’asse risulta essere di 2 unità e si trova nel punto A. Si vuole
 +sommare al conteggio //posit// tre unità di misura.\\
 +Con le istruzioni:\\
 +//Asse:posit = Asse:posit + 2//\\
 +l’asse assume la nuova posizione B.\\
 +Con le istruzioni:\\
 +//Asse:delta = 2//\\
 +//DELCNT Asse//\\
 +viene raggiunta la posizione C.
 +
 +{{:software:devices:oopos2:oopos2_14.png?nolink400|}}
 +
 +Si noti che con le prime istruzioni l’asse ha compiuto un delta inferiore a 3 unità e quindi è stato
 +introdotto un errore.\\
 +Se si devono inviare comandi //DELCNT// in successione, é conveniente calcolare la grandezza da
 +sommare ed inviare una sola volta il comando; in caso contrario prestare attenzione a non
 +inviare comandi successivi senza interporre una istruzione di lettura su parametro device.
 +
 +=== - Esempio ===
 +//Asse:delta = 3//
 +//DELCNT Asse//
 +//WAIT Asse:st_init//
 +//Asse:delta = 40//
 +//DELCNT Asse//
 +
 +Una scrittura del tipo:
 +<code QCL>
 +Asse:posit = 1000
 +Asse:delta = - 100
 +DELCNT Asse
 +DELCNT Asse
 +...
 +</code>
 +non assicura che il valore di posit sia di 800, come ci si aspetterebbe da due sottrazioni consecutive,
 +mentre è possibile che sia di 900 per la sovrapposizione dei due comandi. La scrittura
 +diventa quindi:
 +<code QCL>
 +Asse:posit = 1000
 +Asse:delta = - 100
 +DELCNT Asse
 +WAIT Asse:st_init
 +DELCNT Asse
 +WAIT Asse:st_init
 +...
 +</code>
 +
 +=== - Comandi REGON e REGOFF ===
 +Con l'utilizzo del device OOPOS2 le uscite di movimento sono ad uso esclusivo del device; pertanto
 +non possono essere utilizzate da altri device o dall'applicativo.\\
 +Il comando di //REGOFF// permette di mettere a disposizione tali risorse, disabilitandone l'aggiornamento
 +da parte del device OOPOS2. Questa condizione, verificata con lo stato //st_regoff// = 1,
 +pone il device in uno stato di attesa in cui comunque continua ad aggiornare la posizione dell'asse
 +(conteggio acquisito).\\
 +Il comando di //REGON// ripristina le normali condizioni riassegnando al device l'aggiornamento
 +delle uscite.
 +
 +^:info:^Per evitare conflitti e malfunzionamenti, deve necessariamente essere attivo un solo device per ogni gruppo di uscite di movimento.^
 +
 +Nelle applicazioni in cui non è necessario movimentare contemporaneamente più assi l'uso dei
 +comandi //REGON/REGOFF// permette di utilizzare sempre le stesse uscite di movimento risparmiando
 +risorse hardware.
 +
 +==== - Movimentazione ====
 +
 +Le procedure fin qui descritte hanno permesso di completare le fasi di definizione delle risorse
 +hardware necessarie al device, di verifica dei collegamenti elettrici, di impostazione dei parametri
 +fondamentali del device.\\
 +Ora é possibile eseguire una semplice movimentazione dell’asse.
 +  * Spostare l’asse in una posizione tale per cui possa compiere un determinato spazio senza incontrare i finecorsa di quota massima.
 +  * Azzerare il conteggio (parametro //posit// = 0).
 +  * Impostare la quota di posizionamento (parametro //setpos//).\\ ''Asse:setpos = quota di posizionamento'' (in Um compresa tra minpos e maxpos).
 +  * Start posizionamento (comando di START).\\ ''START Asse''
 +  * Per interrompere il posizionamento utilizzare il comando di //STOP//.
 +
 +
 +===== - Funzioni speciali =====
 +
 +==== - Sistema di posizionamento QPS (QEM Positioning System) ====
 +
 +^:info:^Questo sistema consente, se la risoluzione del trasduttore lo permette, di aggiustare e verificare il posizionamento di tipo On/Off con una risoluzione 10 volte superiore a quella impostata nel parametro //cntratio//.^
 +
 +L'introduzione dei parametri relativi alle inerzie (//iner01 ÷ iner16//), alle tolleranze (//tolp// e //toln//)
 +ed allo spessore utensile (//tool//), viene proposta con una cifra in più, in modo da poter introdurre
 +il dato con una precisione 10 volte maggiore.\\
 +Per un buon funzionamento del sistema QPS, il parametro //cntratio// deve essere inferiore a 40000;
 +se il coefficiente moltiplicativo è compreso tra 40001 e 399999 l'influenza dell'ultima cifra
 +diminuirà gradatamente fino a cessare completamente quando tale coefficiente è pari a 400000.
 +Il sistema QPS viene introdotto anche in fase di lettura dei dati sopradescritti.
 +
 +=== - Esempi ===
 +
 +^:info:^Gli esempi sono riferiti ad un sistema di posizionamento con precisione del millimetro.^
 +
 +  * Se una quota di posizionamento pari a 10 millimetri viene normalmente inserita con il numero 10, per introdurre lo stesso valore di tolleranza (quindi con il QPS), sarà necessario introdurre il valore 100.
 +  * Una fascia di tolleranza pari a 10 millimetri verrà visualizzata con il numero 100.
 +
 +
 +===== - Tabella comandi e parametri =====
 +
 +==== - Simbologia adottata ====
 +
 +Il **nome** del parametro, stato o comando viene riportato alla sinistra della tabella.
 +
 +**R**\\
 +Indica se il relativo parametro o stato è ritentivo (al momento dell’inizializzazione del device mantiene lo stato precedentemente definito), oppure lo stato che assume al momento dell’inizializzazione del device.\\
 +Se il device non necessita di inizializzazione il campo “R” indica il valore che il parametro o stato assume all’accensione della scheda.\\
 +R = Ritentivo\\
 +0 = Al momento dell’inizializzazione del device il valore viene forzato a zero.\\
 +1 = Al momento dell’inizializzazione del device il valore viene forzato a uno.\\
 +- = Al momento dell’inizializzazione del device viene presentato il valore significativo.
 +
 +**D**\\
 +Indica la dimensione del parametro.\\
 +F = Flag\\
 +B = Byte\\
 +W = Word\\
 +L = Long\\
 +S = Single Float\\
 +
 +=== - Condizioni ===
 +Vengono descritte tutte le **condizioni necessarie affinchè il parametro sia considerato corretto o perchè il comando venga accettato**.\\
 +In alcuni casi vengono specificati dei valori limite per l’accettazione del parametro: se vengono
 +introdotti dei valori esterni ai limiti impostati, il dato viene comunque accettato; pertanto
 +devono essere previsti opportuni controlli dell’applicativo tali da garantire il corretto funzionamento.\\
 +Per l’esecuzione di un comando, tutte le relative condizioni devono necessariamente essere
 +soddisfatte; in caso contrario il comando non viene inviato.
 +
 +**A**\\
 +Indica la **modalità di accesso**.\\
 +R = Read (lettura).\\
 +W = Write (scrittura).\\
 +RW = Read / Write.
 +
 +==== - Comandi ====
 +
 +I comandi sono stati ordinati con priorità decrescente. Ad esempio, in caso di contemporaneità
 +dei comandi //STOP// ed //START//, viene acquisito per primo il comando //STOP//.
 +
 +^Nome^Condizioni^Descrizione^
 +|INIT|st_init = 0|**Initialization**\\ Comando di inizializzazione device.\\ Se il device non é inizializzato non vengono eseguiti i calcoli relativi all'asse e quindi rimane inattivo. All'accensione è possibile scaricare tutti i parametri in DPR; successivamente, con comando INIT l'asse verrà inizialiazzato, eseguendo i calcoli una sola volta.\\ Attiva lo stato //st_init//.|
 +|START|st_init = 1\\ st_regoff = 0\\ st_still = 1|**Start**\\ Comanda il posizionamento alla quota setpos e velocitá //setvel//.|
 +|STOP|st_init = 1\\ st_regoff = 0\\ st_emrg = 0|**Stop**\\ Interrompe l'eventuale posizionamento in corso dell'asse. La fermata dell'asse avviene seguendo la rampa di decelerazione in uso. L'asse rimane in reazione di spazio.|
 +|CNTLOCK|st_init = 1|**Counter lock**\\ Blocca l'acquisizione del conteggio asse anche se il trasduttore continua ad inviare i segnali. In questa fase l'eventuale spostamento dell'asse non viene rilevato. Disabilita il caricamento della quota di preset sul conteggio.\\ Attiva lo stato //st_cntlock//|
 +|CNTUNLOCK|st_init = 1|**Counter unlock**\\ Sblocca il conteggio dell'asse.\\ Viene ripresa la lettura dei segnali inviati dal trasduttore e l'aggiornamento del conteggio.\\ Disattiva lo stato //st_cntlock//.|
 +|CNTREV|st_init = 1|**Counter reverse**\\ Consente di invertire le fasi del trasduttore all'interno della scheda.\\ Viene quindi invertito il senso del conteggio (incremento/decremento).\\ Attiva lo stato //st_cntrev//.|
 +|CNTREV|st_init = 1\\ st_still = 1|**Counter reverse**\\ Consente di invertire le fasi del trasduttore all'interno della scheda.\\ Viene quindi invertito il senso del conteggio (incremento/decremento).\\ Attiva lo stato //st_cntrev//.|
 +|PRESET|st_init = 1\\ st_regoff = 0|**Preset**\\ Start ricerca preset asse.\\ Viene dato inizio alla procedura di ricerca di preset con le modalità impostate con i parametri prsmode e prsdir. Se la ricerca di preset è già in esecuzione, il comando esegue l'inversione del senso di ricerca.\\ Attiva lo stato st_prson e disattiva lo stato //st_prsok//.|
 +|MANSFW|st_init = 1\\ st_regoff = 0\\ posit < maxpos|**Manual slow forward**\\ Posizionamento manuale avanti lento. Vengono eccitate le uscite di avanti e di rallentamento.|
 +|MANSBW|st_init = 1\\ st_regoff = 0\\ posit > minpos|**Manual slow backward**\\ Posizionamento manuale indietro lento. Vengono eccitate le uscite di indietro e di rallentamento.|
 +|MANFFW|st_init = 1\\ st_regoff = 0\\ posit < maxpos|**Manual forward**\\ Posizionamento manuale avanti. Viene eccitata l'uscita di avanti.|
 +|MANFBW|st_init = 1\\ st_regoff = 0\\ posit > minpos|**Manual backward**\\ Posizionamento manuale indietro. Viene eccitata l'uscita di indietro.|
 +|REGON|st_init = 1|**Regulation ON**\\ Abilita la regolazione e l'aggiornamento delle uscite di movimento, nonché tutti i comandi di movimento.\\ Disattiva lo stato //st_regoff//.|
 +|REGOFF|st_init = 1|**Regulation OFF**\\ Disabilita la regolazione e l'aggiornamento delle uscite di movimento, nonché tutti i comandi di movimento. Solamente l'uscita di freno continua ad essere aggiornata.\\ Attiva lo stato //st_regoff//.|
 +|DELCNT|st_init = 1\\ st_still = 0|**Delta counter**\\ Questo comando viene accettato solamente se l'asse è fermo; il conteggio (posizione dell'asse) viene modificato sommandogli algebricamente il valore specificato nella variabile delta.|
 +
 +==== - Parametri ====
 +
 +^Nome^D^R^A^Condizioni^Descrizione^
 +|cntratio|L|R|R-W|Nessuna|**Counter ratio**\\ Definisce per quanto vanno moltiplicati gli impulsi del trasduttore in modo che l'acquisizione degli spostamenti venga espressa nell'unità di misura desiderata.\\ Impostando 100000 la variazione del conteggio è di 1 bit per impulso trasduttore.\\ Range valido: 347 ÷ 400000|
 +|posit|L|R|R-W|st_init = ON|**Actual position**\\ È il valore della posizione istantanea dell'asse in unità di misura definite dal parametro cntratio. Valore espresso in unità di misura (Um).\\ Range valido: -999999 ÷ 999999|
 +|minpos|L|R|R-W|Nessuna|**Minimum position**\\ Definisce la minima quota raggiungibile dall'asse; il valore impostato è da considerarsi anche come limite minimo per l'introduzione delle quote di lavoro. Valore espresso in unità di misura (Um).\\ Range valido: -999999 ÷ 999999|
 +|maxpos|L|R|R-W|Nessuna|**Maximum position**\\ Definisce la massima quota raggiungibile dall'asse; il valore impostato è da considerarsi anche come limite massimo per l'introduzione delle quote di lavoro. Valore espresso in unità di misura (Um).\\ Range valido: -999999 ÷ 999999|
 +|slowpos|W|R|R-W|Nessuna|**Slow position**\\ È la distanza dalla quota di posizionamento alla quale viene eccitata l'uscita di rallentamento per concludere il posizionamento alla velocità lenta. Valore espresso in unità di misura (Um).\\ Range valido: 0 ÷ 9999|
 +|tollp|W|R|R-W|Nessuna|**Positive tolerance**\\ È il limite di tolleranza positivo consentito al posizionamento (massimo errore per eccesso). Viene espresso in Um/10 (QPS).\\ Range valido: 0 ÷ 9999|
 +|tolln|W|R|R-W|Nessuna|**Negative tolerance**\\ È il limite di tolleranza negativo consentito al posizionamento (massimo errore per difetto). Viene espresso in Um/10 (QPS).\\ Range valido: 0 ÷ 9999|
 +|tinv|W|R|R-W|Nessuna|**Direction inversion delay**\\ Viene utilizzato per evitare stress meccanici dovuti a troppo rapide inversioni del senso di movimento. Il valore introdotto è espresso in centesimi di secondo.\\ Range valido: 0 ÷ 999|
 +|slowdly|W|R|R-W|Nessuna|**Slow delay**\\ Quando il posizionamento entra nella fascia di rallentamento, l'uscita di movimento viene disattivata per un tempo determinato dal parametro slowpos. L'uscita di rallentamento viene attivata con tempo slowpos/2 prima dell'uscita di movimento. Viene espresso in centesimi di secondo (s/100).\\ Range valido: 0 ÷ 999|
 +|tbrake|W|R|R-W|Nessuna|**Brake time**\\ È il tempo che intercorre, allo start posizionamento, tra lo sblocco del freno (in funzione del parametro breaktype) e l'attivazione delle uscite di movimento. Viene espresso in centesimi di secondo (s/100).\\ Range valido: 0 ÷ 999|
 +|overpos|W|R|R-W|Nessuna|**Over position**\\ Oltrequota per il recupero giochi e/o delta minimo di posizionamento. Se impostato a zero non viene eseguito il recupero giochi. Valore espresso in unità di misura (Um).\\ Range valido: 0 ÷ 9999|
 +|bklashmode|B|R|R-W|Nessuna|**Backslash mode**\\ Seleziona il tipo di recupero giochi:\\ **0**=posizionamento senza recupero giochi.\\ **1**=posizionamento con recupero giochi avanti.\\ **2**=posizionamento con recupero giochi indietro.\\ **3**=posizionamento con recupero giochi avanti senza rallentamento.\\ **4**=posizionamento con recupero giochi indietro senza rallentamento.\\ Se il parametro è fuori dai limiti ammessi, utilizza per default il modo 0.|
 +|ninert|B|R|R-W|Nessuna|**Inertia number**\\ È il numero di fasce d'inerzia in cui si vuole suddividere l'asse. Se viene impostato il valore zero, si considera una sola fascia.\\ Range valido: 1 ÷ 8|
 +|maxiner|W|R|R-W|Nessuna|**Maximum inertia**\\ È il massimo valore di variazione dell'inerzia dopo ogni posizionamento. Se il valore calcolato supera tale parametro, viene segnalato con l'attivazione dello stato st_erin. Se il valore viene posto a zero, il controllo è inibito. Viene espresso in Um/10 (QPS).\\ Range valido: 0 ÷ 9999|
 +|toldly|W|R|R-W|Nessuna|**Tolerance delay**\\ Definisce il tempo che intercorre tra l'arrivo dell'asse nella fascia di tolleranza e la relativa segnalazione di stato. Il valore introdotto è espresso in centesimi di secondo.\\ Range valido: 0 ÷ 9999|
 +|inertmode|B|R|R-W|Nessuna|**Inertia mode selection**\\ Indica il tipo di ricalcolo inerzia eseguito dal device al termine del posizionamento:\\ **0**=ricalcolo inerzie disabilitato.\\ **1** = ricalcolo inerzie eseguito solo se il posizionamento si conclude fuori tolleranza.\\ **2**=ricalcolo inerzie eseguito ad ogni posizionamento.|
 +|tool|L|R|R-W|Nessuna|**Tool thickness**\\ É il valore dello spessore utensile. Questo valore, espresso in Um/10 (QPS), viene sommato alla quota di posizionamento setpos quando viene comandato START. La quota finale dell'asse sarà quindi data da: setpos + tool\\ Range valido: -999999 ÷ 999999|
 +|setpos|L|R|R-W|Nessuna|**Setted position**\\ É la quota di posizionamento impostata. Essa viene posta in esecuzione dal comando START. Se essa viene cambiata durante il posizionamento, l'asse si posziona comunque alla quota precedente.\\ Valore espresso in unità di misura (Um).\\ Range valido: -999999 ÷ 999999|
 +|iner01÷iner16|W|R|R-W|Nessuna|**Inertia 01 ÷ 16 value**\\ Sono le 16 memorie dei valori di inerzia. Se il parametro dobiner è 0, verranno utilizzate dal device solamente le prime otto (iner01 ÷ iner08).\\ Viene espresso in Um/10 (QPS).|
 +|dobiner|B|R|R-W|Nessuna|**Double inertia**\\ Con questo parametro è possibile scegliere di ricalcolare un'inerzia unica per ogni fascia in cui è diviso l'asse oppure di averne due per ogni fascia: una per ogni direzione di arrivo dell'asse.\\ **0**=Memoria inerzia di fascia uguale per le due direzioni.\\ **1**=Memoria inerzia di fascia distinta per ogni direzione.|
 +|enstol|B|R|R-W|Nessuna|**Enable start in tolerance**\\ Abilitazione start con asse in tolleranza:\\ **0** = START in tolleranza disabilitato. Al comando di START lo stato st_sttoll viene abilitato e l'asse rimane fermo.\\ **1** = START in tolleranza abilitato. Al comando di START l'asse esegue un riposizionamento alla quota in uso e lo stato st_sttoll viene disabilitato.|
 +|prsmode|B|R|R-W|Nessuna|**Preset mode**\\ Definisce il tipo di ricerca di preset:\\ **0** = Per la ricerca dell'abilitazione impulso di zero, l'asse inizia il movimento, incontra la camma di abilitazione, inverte la direzione ed in lento, sul fronte di discesa relativo al segnale di camma, carica la quota di preset.\\ **1** = Per la ricerca dell'abilitazione impulso di zero, l'asse inizia il movimento, incontra la camma di abilitazione, inverte la direzione ed in lento acquisisce il primo impulso di zero (dopo la disattivazione del segnale di camma).\\ **2** = Non viene attivata la procedura di ricerca preset con movimentazione dell'asse. Il conteggio viene aggiornato alla quota di preset all'attivazione dell'abilitazione impulso di zero.|
 +|prspos|L|R|R-W|Nessuna|**Preset position**\\ Definisce il valore che viene caricato sul conteggio con la procedura di ricerca di preset.\\ Valore espresso in unità di misura (Um).\\ Range valido: minpos ÷ maxpos|
 +|prsdir|B|R|R-W|Nessuna|**Preset search direction**\\ Definisce la direzione del movimento asse per la ricerca della camma di abilitazione impulso di zero.\\ **0**=L'asse esegue la ricerca in avanti, prima in rapido, poi in lento.\\ **1**=L'asse esegue la ricerca indietro, prima in rapido, poi in lento. **2**= L'asse esegue la ricerca in avanti sempre in lento.\\ **3**= L'asse esegue la ricerca indietro sempre in lento.|
 +|actiner|B|R|R|Nessuna|**Actual inertia**\\ Indica la fascia di inerzia in uso.\\ Range valido: 0 ÷ 7|
 +|delta|L|R|R-W|Nessuna|**Delta counter**\\ Variabile d'uso come operando dal comando DELCNT.\\ Valore espresso in unità di misura (Um).\\ Range valido: -999999 ÷ 999999|
 +|decpt|B|R|R-W|Nessuna|**Decimal point**\\ Definisce la precisione con la quale si intendono impostare le preselezioni e visualizzare i conteggi relativamente all'asse.\\ Range valido: 0 ÷ 3|
 +|unitvel|B|R|R-W|Nessuna|**Velocity unit**\\ Definisce se l'unità di tempo della velocità è espressa in minuti o secondi.\\ **0** = Um/min\\ **1** = Um/sec|
 +|frq|L|-|R|Nessuna|**Actual frequency**\\ É il valore della frequenza istantanea dell'asse, considerando una fase dell'encoder. Valore espresso in Hz.|
 +|vel|L|-|R|Nessuna|**Actual velocity**\\ É il valore della velocitá istantanea dell'asse. Il valore viene espresso in Um/s o Um/min in base al parametro unitvel e dipende anche dal parametro decpt.|
 +|breaktype|B|R|R-W|Nessuna|**Brake type**\\ É il tipo di logica d'intervento dell'uscita freno.\\ **0** = L'uscita viene eccitata per la frenata.\\ **1** = L'uscita, normalmente eccitata, viene diseccitata per la frenata.\\ Lo stato st_brake segue lo stato elettrico dell'uscita.|
 +|breaktype|B|R|R-W|Nessuna|**Brake type**\\ É il tipo di logica d'intervento dell'uscita freno.\\ **0** = L'uscita viene eccitata per la frenata.\\ **1** = L'uscita, normalmente eccitata, viene diseccitata per la frenata.\\ Lo stato st_brake segue lo stato elettrico dell'uscita.|
 +|slowtype|B|R|R-W|Nessuna|**Slow type**\\ É il tipo di calcolo del rallentamento\\ **0**=fisso con parametro slowpos.\\ **1**=proporzionale alla velocità rilevata.\\ **2**=proporzionale al quadrato della velocità rilevata.|
 +|maxvel|L|R|R-W|Nessuna|**Maximum velocity**\\ Definisce la massima velocità dell'asse. Il valore introdotto è nell'unità di tempo della velocità impostata unitvel. Questo parametro viene utilizzato se slowtype ? 0.|
 +|maxslow|W|R|R-W|Nessuna|**Maximum slowdown**\\ É il valore di rallentamento calcolato alla massima velocità dell'asse definita dal parametro maxvel. Questo parametro viene utilizzato se slowtype ? 0.\\ Valore espresso in unità di misura (Um).\\ Range valido: 0 ÷ 9999|
 +|minslow|W|R|R-W|Nessuna|**Minimum slowdown**\\ É il minimo valore di rallentamento che puó essere calcolato.\\ Questo parametro viene utilizzato se slowtype ?0.\\ Valore espresso in unità di misura (Um).\\ Range valido: 0 ÷ 9999|
 +|exeslow|W|-|R|Nessuna|**Execution slowdown**\\ Se il parametro slowtype ¹ 0 indica il valore di rallentamento calcolato dal device in funzione della velocità dell'asse.\\ Valore espresso in unità di misura (Um).|
 +
 +==== - Stati ====
 +
 +^Nome^D^R^A^Condizioni^Descrizione^
 +|st_init|F|-|R|Nessuna|**Initialization**\\ Segnalazione di device inizializzato.\\ **0** = Device non inizializzato.\\ **1** = Device inizializzato.|
 +|st_cntlock|F|R|R|Nessuna|**Counter locked**\\ Segnalazione di conteggio asse bloccato.\\ **0** = Conteggio asse sbloccato.\\ **1** = Conteggio asse bloccato|
 +|st_cntrev|F|R|R|Nessuna|**Counter reversed**\\ Segnalazione di conteggio asse invertito\\ **0** = Conteggio asse non invertito\\ **1** = Conteggio asse invertito.|
 +|st_movfwd|F|0|R|Nessuna|**Forward movement**\\ Segnala l'eccitazione dell'uscita di movimento avanti.\\ **0** = Uscita avanti non eccitata.\\ **1** = Eccitazione uscita avanti.|
 +|st_movbwd|F|0|R|Nessuna|**Backward movement**\\ Segnala l'eccitazione dell'uscita di movimento indietro.\\ **0** = Uscita indietro non eccitata.\\ **1** = Eccitazione uscita indietro.|
 +|st_movslow|F|0|R|Nessuna|**Slowdown movement**\\ Segnala l'eccitazione dell'uscita di rallentamento.\\ **0** = Uscita rallentamento non eccitata.\\ **1** = Eccitazione uscita rallentamento.|
 +|st_toll|F|0|R|Nessuna|**Tolerance**\\ Segnalazione di asse in tolleranza rispetto alla quota posta in esecuzione dal comando di START. La segnalazione di asse in tolleranza può essere ritardata tramite il parametro toldly.\\ **0** = Asse non in tolleranza.\\ **1** = Asse in tolleranza.|
 +|st_brake|F|0|R|Nessuna|**Brake**\\ Segnala l'eccitazione dell'uscita di freno (per l'attivazione di freni o di dispositivi di bloccaggio dell'asse).\\ **0** = Uscita freno non eccitata.\\ **1** = Eccitazione uscita freno.|
 +|st_movdir|F|0|R|Nessuna|**Backward direction**\\ Segnalazione della direzione del movimento.\\ **0** = Avanti\\ **1** = Indietro.|
 +|st_still|F|1|R|Nessuna|**Still**\\ Segnalazione di asse fermo.\\ **0** = Asse in movimento.\\ **1** = Asse fermo.|
 +|st_erin|F|0|R|Nessuna|**Inertia ricalculation error**\\ Segnala un errore di ricalcolo inerzia. L'indicazione si attiva se il ricalcolo dell'inerzia fornisce un valore maggiore del parametro maxiner.\\ **0** = Ricalcolo inerzia corretto.\\ **1** = Ricalcolo inerzia con valori maggiori di maxiner.|
 +|st_sttoll|F|0|R|Nessuna|**Start in tolerance**\\ Attivo segnala, se il parametro enstol <sup>1</sup> 1, che é stato dato un comando di movimento e l'asse era giá in tolleranza sulla quota di traguardo. Lo stato rimane invariato fino al prossimo comando di movimento (START, MANSFW, MANFFW, MANSBW, MANFBW).\\ **0** = Start con asse fuori tolleranza.\\ **1** = Start con asse in tolleranza.|
 +|st_prsok|F|0|R|Nessuna|**Preset ok**\\ Segnalazione di ricerca di preset asse conclusa correttamente.\\ **0** = Ricerca di preset non ancora conclusa o non eseguita.\\ **1** = Ricerca di preset conclusa correttamente.|
 +|st_prson|F|0|R|Nessuna|**Preset**\\ Segnalazione di ricerca di preset asse in corso.\\ **0** = Ricerca di preset non in corso.\\ **1** = Ricerca di prest in corso.|
 +|st_regoff|F|0|R|Nessuna|**Regulation off**\\ Segnala lo stato di disabilitazione delle uscite e dei comandi di posizionamento.\\ **0** = Uscite di movimento abilitate.\\ **1** = Uscite di movimento disabilitate.|
 +
 +
 +===== - Limitazioni =====
 +
 +Nessuna limitazione.
 +
 +
 +===== - Esempio applicativo =====
 +
 +==== - File di configurazione ====
 +
 +<code QCL>
 +;*************************************************************************************
 +; Nome Modulo: Ex_Oopos.CNF              Progetto: Ex_OOPOS2
 +; Autore: QEM srl                        Data: 01/05/99
 +; Sistema: QMove1 / QCL3                 Libreria: 1LIB3B04
 +; Funzionalità: Esempio gestione OOPOS2  Release: 0
 +;-------------------------------------- Note -----------------------------------------
 +; [1] - Applicativo di esempio per utilizzo device OOPOS 2
 +;*************************************************************************************
 +
 +;-------------------------------------------------------------------------------------
 +; Definizione Costanti
 +;-------------------------------------------------------------------------------------
 +CONST
 +
 +;-------------------------------------------------------------------------------------
 +; Definizione Variabili SYSTEM
 +;-------------------------------------------------------------------------------------
 +SYSTEM
 +slQuotaPos                                    ;Variabile per quota di posizionamento
 +
 +;-------------------------------------------------------------------------------------
 +; Definizione Variabili GLOBAL
 +;-------------------------------------------------------------------------------------
 +GLOBAL
 +gfMovMan                                      ;Flag segnalazione movimenti manuali in
 +                                                ;corso
 +gfMovAuto      F                                ;Flag segnalazione movimenti automatici
 +                                                ;in corso
 +                                                
 +;-------------------------------------------------------------------------------------
 +; Definizione Variabili TIMER
 +;-------------------------------------------------------------------------------------
 +TIMER
 +
 +;-------------------------------------------------------------------------------------
 +; Definizione DATAGROUP
 +;-------------------------------------------------------------------------------------
 +;DATAGROUP
 +
 +;-------------------------------------------------------------------------------------
 +; Configurazione Bus
 +;-------------------------------------------------------------------------------------
 +BUS
 +       1CPUB   02
 +       1MIXA   00
 +       .
 +       .
 +     
 +;-------------------------------------------------------------------------------------
 +; Definizione Variabili INPUT
 +;-------------------------------------------------------------------------------------
 +INPUT
 +ifAvMan     2.INP01                          ;Ingresso di avanti manuale
 +ifInMan     2.INP02                          ;Ingresso di indietro manuale
 +ifStart     2.INP03                          ;Ingresso di START asse
 +ifStop    F   2.INP04                          ;Ingresso di STOP asse
 +
 +;-------------------------------------------------------------------------------------
 +; Definizione Variabili OUTPUT
 +;-------------------------------------------------------------------------------------
 +OUTPUT
 +ofToll    F   2.OUT04                          ;Uscita di tolleranza asse
 +
 +;-------------------------------------------------------------------------------------
 +; Dichiarazione device interni
 +;-------------------------------------------------------------------------------------
 +INTDEVICE
 +;Nome   Tipo   TCamp  Contatore  Inter  AbilZero  OutAva  OutInd  OutDir  OutMov
 +Asse    OOPOS2 0004   2.CNT01    1      2.INP01   2.OUT01 2.OUT02         X.X    X.X
 +
 +OutRal  OutFre
 +2.OUT03 X.X
 +
 +END
 +</code>
 +
 +==== - Gestione OOPOS2 ====
 +
 +<code QCL>
 +;-------------------------------------------------------------------------------------
 +; Nome File: TASK_00.MOD
 +; Progetto: EX_OOPOS2
 +; Descrizione: Gestione Posizionamento
 +;-------------------------------------------------------------------------------------
 +
 +;-------------------------------------------------------------------------------------
 +; Operazioni di Inizializzazione Asse
 +;-------------------------------------------------------------------------------------
 +Asse:cntratio = 100000                          ;Risoluz.encoder = Spazio in 1 giro
 +                                                ;encoder(Um) / impulsi giro encoder
 +Asse:maxpos = 999999                            ;Quota massima
 +Asse:minpos = -999999                           ;Quota minima
 +Asse:slowpos = 100                              ;Quota di rallentamento
 +Asse:tollp = 10                                 ;Tolleranza positiva
 +Asse:tolln = 50                                 ;Tolleranza negativa
 +Asse:tinv = 50                                  ;Tempo di inversione
 +Asse:slowdly = 50                               ;Tempo di rallentamento
 +Asse:tbrake = 30                                ;Tempo di intervento freno
 +Asse:overpos = 0                                ;Oltrequota recupero giochi
 +Asse:bklashmode = 0                             ;Tipo recupero giochi
 +Asse:ninert = 1                                 ;Numero fasce di inerzia
 +Asse:maxiner = 100                              ;Massima inerzia ricalcolata
 +Asse:toldly = 50                                ;Tempo ritardo segnalazione tolleranza
 +Asse:inertmode = 1                              ;Tipo di ricalcolo inerzia
 +Asse:tool = 0                                   ;Spessore lama
 +Asse:dobiner = 0                                ;Abilitazione inerzie sdoppiate
 +                                                ;(avanti e indietro)
 +Asse:enstol = 0                                 ;Abilitazione START con l'asse in
 +                                                ;tolleranza
 +Asse:prsmode = 0                                ;Tipo di ricerca di preset
 +Asse:prspos = 0                                 ;Quota di preset
 +Asse:prsdir = 0                                 ;Direzione della ricerca di preset
 +Asse:decpt = 1                                  ;Cifre decimali
 +Asse:unitvel = 1                                ;Unità di tempo della velocità
 +Asse:breaktype = 0                              ;Logica di intervento del freno
 +Asse:slowtype = 0                               ;Tipo di calcolo rallentamento
 +Asse:maxvel = 1000                              ;Velocità massima
 +Asse:maxslow = 8                                ;Rallentamento calcolato massimo
 +Asse:minslow = 80                               ;Rallentamento calcolato minimo
 +INIT Asse                                       ;Inizializza il device
 +WAIT Asse:st_init                               ;Attendi che il device sia inizializzato
 +CNTUNLOCK Asse                                  ;Sblocca conteggio
 +WAIT NOT Asse:st_cntlock                        ;Attendi che il conteggio sia sbloccato
 +CNTDIR Asse                                     ;Imposta il senso del conteggio
 +WAIT NOT Asse:st_cntrev                         ;Attendi che sia impostato il senso del
 +                                                ;conteggio
 +REGON Asse                                      ;Abilita la regolazione
 +WAIT NOT Asse:st_regoff                         ;Attendi l'abilitazione alla regolazione
 +IF (slQuotaPos EQ 0)                            ;Nel caso in cui la quota di posizionamento
 +                                                ;dell'asse sia zero
 +  slQuotaPos = 2000                             ;Imposta una quota di posizionamento
 +ENDIF
 +
 +;-------------------------------------------------------------------------------------
 +; Operazioni di Posizionamento
 +; ------------------------------ variabili utilizzate -------------------------------
 +; slQuotaPos: Variabile impostabile che rappresenta la quota di posizionamento dell'asse
 +; -------------------------------- flag utilizzati ----------------------------------
 +; gfMovMan: movimento manuale in corso
 +; gfMovAuto: Movimento automatico in corso
 +;-------------------------------------------------------------------------------------
 +MAIN:
 +
 +;-------------------------------------------------------------------------------------
 +; Gestione uscite
 +;-------------------------------------------------------------------------------------
 +ofToll = Asse:st_toll                           ;Imposto l'uscita di tolleranza come lo
 +                                                ;stato di tolleranza
 +
 +;-------------------------------------------------------------------------------------
 +; Gestione movimenti automatici
 +;-------------------------------------------------------------------------------------
 +IF ifStart                                      ;Attende l'ingresso di START
 +  IF NOT gfMovMan                               ;Controlla che non ci siano movimenti
 +;manuali
 +    IF Asse:st_still                            ;Controlla che l'asse sia fermo
 +      Asse:setpos = slQuotaPos                  ;Imposta la quota di posizionamento
 +      START Asse                                ;Esegue lo start dell'asse
 +      gfMovAuto = 1                             ;Segnala movimento automatico in corso
 +    ENDIF
 +  ENDIF
 +ENDIF
 +IF ifStop                                       ;Attende l'ingresso di STOP
 +  IF NOT Asse:st_still                          ;Controlla che l'asse NON sia fermo
 +    STOP Asse                                   ;Esegue lo stop dell'asse
 +  ENDIF
 +ENDIF
 +
 +IF gfMovAuto                                    ;Controlla segnalazione movimento
 +                                                ;automatico in corso
 +  IF Asse:st_still                              ;Controlla che l'asse sia fermo
 +    gfMovAuto = 0                               ;Resetta stato di movimento Automatico
 +  ENDIF
 +ENDIF
 +
 +;-------------------------------------------------------------------------------------
 +; Gestione movimenti manuali
 +;-------------------------------------------------------------------------------------
 +IF ifAvMan                                      ;Attende l'ingresso di movimento manuale
 +  IF NOT (gfMovAuto OR gfMovMan)                ;Controlla che non ci siano movimenti
 +;autometici o manuali
 +    IF Asse:st_still                            ;Controlla che l'asse sia fermo
 +      MANFFW Asse                               ;Avanti asse in manuale
 +      gfMovMan = 1                              ;Segnala movimento manuale in corso
 +    ENDIF
 +  ENDIF
 +ENDIF
 +IF ifInMan                                      ;Attende l'ingresso di movimento manuale
 +  IF NOT (gfMovAuto OR gfMovMan)                ;Controlla che non ci siano movimenti
 +                                                ;autometici o manuali
 +    IF Asse:st_still                            ;Controlla che l'asse sia fermo
 +      MANFBW Asse                               ;Avanti asse in manuale
 +      gfMovMan = 1                              ;Segnala movimento manuale in corso
 +    ENDIF
 +  ENDIF
 +ENDIF
 +IF gfMovMan                                     ;Se l'asse si muove in manuale
 +  IF NOT (ifAvMan OR ifInMan)                   ;Se gli ingressi di avanti e indietro
 +                                                ;manuale sono OFF
 +    STOP Asse                                   ;Ferma l'asse
 +    gfMovMan = 0                                ;Togli la segnalazione di asse in
 +                                                ;movimento manuale
 +  ENDIF
 +ENDIF
 +
 +;-------------------------------------------------------------------------------------
 +; Operazioni finali
 +;-------------------------------------------------------------------------------------
 +  WAIT 1
 +  JUMP MAIN
 +
 +END
 +</code>
 +