Sincronizzare comandi macchina con encoder virtuale
Home › Forum › Discussioni su problematiche generali › Sincronizzare comandi macchina con encoder virtuale
- Questo topic ha 1 risposta, 1 partecipante ed è stato aggiornato l'ultima volta 4 anni, 3 mesi fa da
Sergio Bertana.
-
AutorePost
-
Dicembre 23, 2020 alle 8:13 am #58574
milesi.1907
PartecipanteHo la necessita di automatizzare un macchinario in cui, invece di utilizzare un encoder fisico montato su un albero motore, si vuole utilizzare un “encoder virtuale” master, al quale i vari azionamenti, attuatori, elettrovalvole, ecc. devono fare riferimento.
Questo encoder sarà sincrono alla velocità di lavorazione della macchina (ad esempio, se l’encoder effettua un periodo al secondo, la macchina eseguirà un ciclo/s). In ogni momento serve sapere la posizione attuale dell’encoder virtuale, in modo che le attivazioni (ad esempio inizio spruzzo colla) siano sempre sincrone.
Avete suggerimenti su quali funzioni potrei usare?
Dicembre 23, 2020 alle 8:29 am #58589Sergio Bertana
Amministratore del forumMi sembra una applicazione molto simile ad una camma elettronica, utilizzata per il controllo dei movimenti nelle presse di tranciatura. La camma fraziona il movimento dell’albero in 360 parti a cui è possibile abbinare comandi di specifici attuatori.
Nel tuo caso il movimento dell’albero non verrà rilevato dalla lettura di un encoder ma dovrà essere simulato matematicamente, quindi se ho ben capito basterà gestire l’incremento di un contatore che arrivato a 360 (O decidi tu a quale valore) si resetta per simulare il giro dell’albero.
Non specifichi la velocità massima del ciclo, ad esempio a 60 cicli minuto dovremo gestire la variazione da 0 a 360 in un secondo, quindi dovremo incrementare il contatore ogni 2,77 mS. Se gestiamo l’incremento in task Fast ad 1mS possiamo decidere di incrementare ogni 2 o 3 mS. ma non 2,77mS. Magari ti è sufficente avere step di velocità di 1mS ma ti ricordo che con la funzione SysSetTaskLpTime puoi variare il tempo di esecuzione della task Fast portandolo ad un minimo di 100uS.
Ho realizzato il programma VirtualShaft (Download) che realizza quello che credo possa servirti, di seguito il programma eseguito in task Fast.
VAR i : UDINT; (* Auxiliary variable *) Time : UDINT := 1000; (* Tempo esecuzione task (uS) *) Speed : REAL := 1; (* Velocità albero (g/min) *) FAdd : REAL; (* Fattore incremento quota *) VShaft : REAL; (* Albero virtuale (gradi) *) CDs : ARRAY[0..3] OF BOOL; (* Comandi *) END_VAR // ------------------------------------------------------------------------- // INIZIALIZZAZIONE // ------------------------------------------------------------------------- // Imposto tempo di esecuzione task Fast. IF (SysFirstLoop) THEN i:=SysSetTaskLpTime(ID_TASK_FAST, Time); END_IF; // ------------------------------------------------------------------------- // GESTIONE ALBERO VIRTUALE // ------------------------------------------------------------------------- // Ad ogni esecuzione incremento la quota virtuale del valore relativo alla // velocità definita dell'albero. FAdd:=((Speed/60.0)/(1000000.0/TO_REAL(Time)))*360.0; VShaft:=VShaft+FAdd; //Albero virtuale (gradi) VShaft:=MOD(VShaft, 360.0); //Albero virtuale (gradi) // ------------------------------------------------------------------------- // GESTIONE COMANDI // ------------------------------------------------------------------------- // Alle varie posizioni albero comando i dispositivi. CDs[0]:=TO_BOOL((VShaft >= 10.0) AND (VShaft < 80.0)); //Attivo da 10 a 80 gradi CDs[1]:=TO_BOOL((VShaft >= 50.0) AND (VShaft < 100.0)); //Attivo da 50 a 100 gradi CDs[2]:=TO_BOOL((VShaft >= 180.0) AND (VShaft < 200.0)); //Attivo da 180 a 200 gradi CDs[3]:=TO_BOOL((VShaft >= 300.0) AND (VShaft < 350.0)); //Attivo da 300 a 350 gradi // [End of file]
-
AutorePost
- Devi essere connesso per rispondere a questo topic.