Vai al contenuto
PLC Forum


variabile angolo sfalsato di un certo valore


Messaggi consigliati

Inserito:

Buongiorno a tutti

Ho iniziato a cimentarmi con la programmazione in linguaggio ST ( tipo pascal) per PLC. Spesso però le problematiche riguardano problemi più generali di programmazione di base. Non sapendo dove inserirmi con il forum eccomi qui.

Il problema è apparentemente semplice : ho una variabile Ang_ist (real) che varia da 0 a 360° . Per ragioni di settaggio relativo devo impostare una variabile Ang_rel che è il complemento a 360° della prima di un certo valore costante ( ad esempio 30°). Quindi se Ang_ist vale 40° , Ang_rel vale 40+30= 70. Fin qui nulla di difficile. Il problema nasce quando Ang_ist si azzera perchè è PERIODICA. 

Potete darmi una mano per favore?

grazie

 


Inserita:

Indipendentemente dal linguaggio, non ho capito bene il problema.

Quando Ang_ist si azzera cosa dovrebbe succedere? Sempre ipotizzando come costante 30° che valore dovrebbe assumere Ang_rel?

Inserita: (modificato)

Il linguaggio è di fatto il pascal, utilizzato in ambienti industriali come programmazione PLC. Il problema però è indipendente. Supponi di avere una ruota che gira e misura un angolo assoluto con un riferimento Ang_ist. Questo varia da 0 a 360 gradi in modo periodico. Mi serve una variabile che si incrementa nello stesso modo ma che ha l'origine "spostata" di un certo valore. All'inizio Ang_ist supponiamo sia = 200 gradi. Questa è la mia partenza "assoluta". Io fisso una variabile relativa Ang_rel = a 0 esattamente in quel punto.

Quando Ang_ist inizia a variare Ang_rel si incrementa nello stesso modo. Ossia

Ang_ist = 201           Ang_rel=1

Ang_ist = 202           Ang_rel=2

Ang_ist = 203           Ang_rel=3 e via cosi.

 

Quando Ang_ist diventa = 360 , Ang_rel diventa 160.

Ma quando Ang_ist si incrementa diventa 0, mentre Ang_rel diventa 161.

Poi ovviamente Ang_rel diventerà a sua volta 0 quando ricomincia il ciclo di Ang_ist.

Scusa l'esposizione un pò elementare ma l'ho fatto per chiarezza.

Dovrebbe essere un struttura ciclica con IF THEN che però non riesco ad inquadrare bene.....

 

Modificato: da makeng52
Inserita:

Beh, basta che sottrai sempre il tuo offset (nell'esempio 200) dall'angolo assoluto e, se il valore risultante è negativo, aggiungi 360.

Comunque ricorda che il valore assoluto non andrà mai a 360, perchè se l'encoder non è assoluto, dopo 359 ritornerà a 0.

Inserita:

Vediamo se l'ho capito, lo espongo in italiano standrad.

 

Leggo un trasduttore angolare e la misura viene memorizzata nella variabile Ang_ist; contemporaneamente aggiorno la variabile Ang_rel.

Durante tutta la prima rivoluzione le 2 variabili concidono.

Quando il la lettura del trasuttore raggiunge 360° aggiorno la variabile Ang_rel sottraendo 200° alla lettura; poi dal momento che la posizione angolare reali è diventata 1° (nuova rivoluzione)  aggiorno la variabile Ang_rel addizionando 160° alla lettrua rale.

 

Sino a qui è tutto comprensibile.

ma poi scrivi:

16 minuti fa, makeng52 scrisse:

Poi ovviamente Ang_rel diventerà a sua volta 0 quando ricomincia il ciclo di Ang_ist.

 

Non si capisce quando Ang_ist si azzera. Se è la lettura di un trasduttore angolare si azzera ogni 2*pi, ma tu prima hai scritto che, in qusto caso, Ang_rel diviene 160°.

Dovresti spiegare un po' meglio cosa intendi.

Inserita: (modificato)

Penso sia meglio inviarvi un grafico che spega meglio il tutto.... Il problema reale riguarda un aggancio che varia a seconda del diametro dell'aspo. quindi l'angolazione cambia . Ma per ragioni di gestione io ho bisogno di far partire la misura non dal valore rilevato sul motore ( che non è assoluto  ma gestisco n° giri + posizione ist da 0 a 360°. Il sensore di zero è fisso) ma con una variabile che inizia da zero per qualunque posizione assuma Ang_ist. Nel grafico è indicata in blu.

Quando ricomincia il ciclo di Ang_ist ( CHE NON PARTE DA ZERO MA DA UN OFFSET)  , la variabile relativa Ang_rel ricomincia da zero

grazie dell'aiuto

Disegno senza titolo.jpg

Modificato: da makeng52
Inserita:

SCUSATE!!!! Ho sbagliato il grafico. In effetti dopo 360 passa a 0, non decrementa. Scusate ancora....questo è il grafico corretto.

Disegno senza titolo (1).jpg

Inserita:

Scusa, sicuramente sono io che non capisco, ma la semplice formuletta di sottrarre l'offset e aggiungere 360 se il risultato è negativo (oppure aggiungere l'offset e togliere 360 se il risultato supera 360) non ti risolve il problema?

Poi, ripeto, secondo me l'encoder ti conta fino a 359,999 e poi si azzera, 360 gradi equivale a 0!

Inserita:

Esatto. Con excel non ho problemi

Più che il calcolo devo impostare il programma. Le due variabili sono di fatto collegate come incremento. Ma non riesco ( per adesso) a "vedere"il ciclo IF o altro per avere quel risultato.

 

Inserire:

IF Ang_ist  >= (360- (Offset iniziale) )  THEN

       Ang_rel:=Ang_ist-Ang_init ;  (* dove Ang_init è l'offset iniziale fra i primi due. Quindi Ang_rel vale zero per il primo step*)

 

(*quando poi Ang_ist torna a zero perchè ripete il ciclo*)

 

        ELSE

          Ang_rel := ( Ang_rel All'istante in cui Ang_ist è a 360)+Ang_ist

 

END_IF

 

Ma non va na ciufola.

Manca qualcosa.....

 

Inserita:

In buona sostanza come faccio a "fotografare" il valore Ang_rel . Uso un TRIG?

Inserita:

Il pascal non lo conosco ma in C farei qualcosa del genere (in caso di sottrazione offset e assumendo che non consideriamo i decimali di grado):
 

Ang_rel = Ang_ist - Offset;
if (Ang_rel < 0)
{
   Ang_rel = Ang_rel + 360;
}
                

Mi sembra banale, non capisco cosa intendi con "fotografare". Dove dovrebbe girare questo software?

Inserita:

Spesso in programmazione fai una figura di M maiuscola e ti chiedi se sei un essere intelligente o no..... Ho ancora una certa insicurezza che mi porta a non vedere banalità. Adesso provo. Grazie e scusa.

Inserita:

Non c'è problema tranquillo, piuttosto dimmi se ce l'hai fatta.

Inserita:

Purtroppo no. Quando è all'inizio mi pone Ang_rel a 360°. E il motore ASPO continua a partire e fermarsi ( halt_exe = true/false).

Sono in alto mare purtroppo. 

Inserita:

il problema è che quando sono all'inizio del ciclo la variabile gradi_rel è =  0. Ma se inserisco quel ciclo alla part\enza il valore è 360°, come si evince dalla schermata . Io devo avere quel valore a 0 , non a 360.

Cattura.JPG

Inserita:

Non ti seguo... ma chi mette gravi_relativ a 360?

E soprattutto: perchè hai un IF che va a vedere quella variabile conteggio_giri?

Se il dato angolare arriva da un encoder (o qualsiasi cosa sia, anche simulato) assoluto sul giro, tu ti troverai un valore che va da 0 a 359 (sempre assumendo che vai a considerare solo gli angoli interi) e su quel valore letto devi fare i calcoli.

Inserita:

Purtroppo la cosa è più complicata. Il sensore di zero non mi serve a nulla perchè quando parto con l'avvolgimento il geardyn tra aspo e traversa NON PARTE SUBITO ma aspetta un certo angolo da ricetta. Quel sensore mi serve solo per lo zero aspo. Ossia:

 

1) inizio il ciclo : Ang_ist assume un valore assoluto in funzione della posizione

2) rilevo l'angolo nella partenza e lo memorizzo Ang_mem

3) fino a quando la differenza fra Ang_ins - Ang_mem < di un certo valore a ricetta Ang_stop  --------------->> Ang_rel := 0

4) quando supera quel valore Ang_rel inizia a contare da zero seguento gli incrementi di Ang_ist. Per far questo devo memorizzare il valore di Ang_ist quando si passa da quella condizione

5) per avere il valore di ang_rel

           calcolo l'offset         Ang_off:= Ang_ist - Ang_mem          ( calcolato un un determinato step) 

 

 

                  IF Ang_ist >= Ang_off THEN  Ang_rel := Ang_ist - Ang_off

 

                  ELSE

 

                    Ang_rel := Ang_ist+( 360- Ang_off) 

 

 

 

 

Inserita:

Si va beh, ma questo esula dal problema come lo hai esposto nel post iniziale. Adesso salta fuori un aspo ed una traversa? Devi prendere uno 0 prima?

Difficile aiutarti senza conoscere cosa vorresti fare veramente.

A questo punto ti conviene esporre in modo chiaro la cinematica della macchina e come dovrebbe funzionare poichè (se ho capito bene) è un problema di come sviluppare un ciclo da plc e non un calcolo angolare.

Se lo esporrai in modo chiaro, in questo forum ci sono dei superspecialisti in avvolgitori, svolgitori, aspi e compagnia briscola (cosa che io non sono) che ti potranno sicuramente dare suggerimenti.

Ti consiglio di aprire una nuova discussione con un titolo un po' più pertinente e magari nella sezione del plc che intendi usare, se esiste...

Inserita:

 

 

Sia l'uno che l'altro:

 

Provo a spiegarmi meglio:

 

DESCRIZIONE : il sistema è formato da:

 

        - un guidatubo che "spalma" il tubo da avvolgere con un passo di traslazione laterale pari al diametro del tubo stesso. Un giro del rocchetto ( o aspo) equivale ad una traslazione del 

           guidatubo pari a un diametro in mm.

        - un ASPO che ruota con una quota angolare MODULO da 0 a 360° impostata in modalità assoluta in base ad un sensore di zero che viene eccitato ogni volta

        - i due sistema sono comandati da un sistema di servomotori in ethercat che entrano in modalità GearLnDyn , ossia una modalità di gearing virtuale con rapporto variabile                                  dinamicamente ( può variare anche se l'aspo continua a ruotare sia in positivo che in negativo.

        - sull'aspo è presente un GANCIO che si posiziona in posizione NON FISSA , ma dipendentemente dal diametro interno della bobina. Alla partenza l'aspo si posiziona quindi con un                angolo ben preciso rispetto all'assolto.

 

Fin qui niente di particolare..... adesso comincia la complicanza:

 

         DA RICETTA posso impostare un settore d'angolo iniziale ( ad esempio 45°) in cui l'aspo giro MA IL GEAR DEL GUIDATUBO è = 0.  Quindi Ang_rel di cui sopra deve partire quando l'aspo ( in modo assoluto) ha ruotato per Ang_Stop ( i 45° di prima esempio) .

 

Quindi io devo imporrre che Ang_rel := 0 se l'angolo relativo ( dato da Ang_ist - Ang_mem_partenza) è maggiore di Ang_stop. 

Quando supero quella condizione il sistema inizia a contare l'angolo esattamente con la logica descritta sopra E SI DEVE DIMENTICARE DELLA CONDIZIONE DI STOP ANGOLO .

( guardando il grafico sopra) 

 

IF Ang_ist >= Ang_off  THEN Ang_rel := Ang_ist - Ang_off

 

IF Ang_ist < Ang_off THEN Ang_rel := 360- (Ang_ist-Ang_off) 

 

L'aspo considera il TRIG in salita quando Ang_rel = 360°. E qui è la difficoltà. Io non posso usare il sensore di zero proprio perchè la partenza è sempre diversa. Ma ho bisogno di contare i giri DEPURATI DALLO STOP LATERALE.

 

Non è proprio chiarissimo da spiegare , ma spero di esserci riuscito.

 

 

 

 

 

Inserita:

 

Buongiorno...

Ho risolto quasi tutto. L'ultima cosa che mi manca è intercettare il valore di 360° per Ang_rel per contare i giri. Ho definito una variabile BOOL Flag_360 ma si setta prima a TRUE. Probabilmente nel calcolo iniziale la Ang_rel ha valori che mi settano a true . Come faccio a creare un "sensore" virtuale di passaggio? 

Allego le condiizioni 

Devo forse creare un TON da quando mi parte l'aspo? 

 

 

 

 

 

 

Cattura.JPG

Inserita:

Ma chi ha spostato la discussione nel forum PC?

Lasciatela qua!

Inserita:

 

?? Scusa non capisco..... io non ho fatto niente! Di quale spostamento parli?? Poi il Pc non c'entra nulla . Queste sono cose di mera programmazione PLC....

Comunque ho risolto finalmente il problema . E' stato particolarmente problematico. ma ci sono riuscito. Grazie comunque.

 

 

 

 

 

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...