makeng52 Inserito: 31 gennaio 2019 Segnala Inserito: 31 gennaio 2019 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
lucios Inserita: 31 gennaio 2019 Segnala Inserita: 31 gennaio 2019 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?
makeng52 Inserita: 31 gennaio 2019 Autore Segnala Inserita: 31 gennaio 2019 (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: 31 gennaio 2019 da makeng52
lucios Inserita: 31 gennaio 2019 Segnala Inserita: 31 gennaio 2019 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.
Livio Orsini Inserita: 31 gennaio 2019 Segnala Inserita: 31 gennaio 2019 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.
makeng52 Inserita: 31 gennaio 2019 Autore Segnala Inserita: 31 gennaio 2019 (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 Modificato: 31 gennaio 2019 da makeng52
makeng52 Inserita: 31 gennaio 2019 Autore Segnala Inserita: 31 gennaio 2019 SCUSATE!!!! Ho sbagliato il grafico. In effetti dopo 360 passa a 0, non decrementa. Scusate ancora....questo è il grafico corretto.
thinking Inserita: 31 gennaio 2019 Segnala Inserita: 31 gennaio 2019 Guarda se è questo il calcolo che ti serve (guarda le formule all'interno delle celle): https://www.plcforum.it/f/files/file/4737-test-offset/ ciao
lucios Inserita: 31 gennaio 2019 Segnala Inserita: 31 gennaio 2019 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!
makeng52 Inserita: 31 gennaio 2019 Autore Segnala Inserita: 31 gennaio 2019 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.....
makeng52 Inserita: 31 gennaio 2019 Autore Segnala Inserita: 31 gennaio 2019 In buona sostanza come faccio a "fotografare" il valore Ang_rel . Uso un TRIG?
lucios Inserita: 1 febbraio 2019 Segnala Inserita: 1 febbraio 2019 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?
makeng52 Inserita: 1 febbraio 2019 Autore Segnala Inserita: 1 febbraio 2019 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.
lucios Inserita: 1 febbraio 2019 Segnala Inserita: 1 febbraio 2019 Non c'è problema tranquillo, piuttosto dimmi se ce l'hai fatta.
makeng52 Inserita: 5 febbraio 2019 Autore Segnala Inserita: 5 febbraio 2019 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.
makeng52 Inserita: 6 febbraio 2019 Autore Segnala Inserita: 6 febbraio 2019 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.
lucios Inserita: 7 febbraio 2019 Segnala Inserita: 7 febbraio 2019 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.
makeng52 Inserita: 7 febbraio 2019 Autore Segnala Inserita: 7 febbraio 2019 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)
lucios Inserita: 7 febbraio 2019 Segnala Inserita: 7 febbraio 2019 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...
makeng52 Inserita: 7 febbraio 2019 Autore Segnala Inserita: 7 febbraio 2019 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.
makeng52 Inserita: 8 febbraio 2019 Autore Segnala Inserita: 8 febbraio 2019 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?
Livio Orsini Inserita: 8 febbraio 2019 Segnala Inserita: 8 febbraio 2019 Ma chi ha spostato la discussione nel forum PC? Lasciatela qua!
makeng52 Inserita: 8 febbraio 2019 Autore Segnala Inserita: 8 febbraio 2019 ?? 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.
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora