Vai al contenuto
PLC Forum


Generatore Sinusoide S7


makemsis

Messaggi consigliati


Si ma come? Per generare una sinusoide ci son praticamente due metodi: o usi una tabella o calcoli il seno usando un'algoritmo che è piuttosto pesante.

Link al commento
Condividi su altri siti

Io posso (se vuoi) fornirTi i codici esadecimali da inserire in una Eprom per ottenere (previo collegamento ad un D.A.C.) in uscita una sinusoide, con risoluzione a 64, 128, oppure 256 bit.

Altro non so.

Saluti

ASMO

Link al commento
Condividi su altri siti

Devo semplicemente moviementare un motore con un uscita analogica. Il motore deve fare un loop tipo: "SU-GIU'-SU", tale loop dovrà avere una durata impostabile da parametro (una sorta di lunghezza d'onda). Quindi avevo pensato di creare una sinusoide...

Link al commento
Condividi su altri siti

o calcoli il seno usando un'algoritmo che è piuttosto pesante.
Ma l' S7-300 non ha l' istruzione nativa "SIN" per calcolare la funzione seno?

Link al commento
Condividi su altri siti

Ma l' S7-300 non ha l' istruzione nativa "SIN" per calcolare la funzione seno?

Certo, ma non lo fa per opera dello spirito santo. E' una delle istruzioni che impiegano più tempo macchina. Se devi reiterarla per n volte diventa piuttosto pesate come tempo di ciclo.

Il motore deve fare un loop tipo: "SU-GIU'-SU"

Ma non basta una rampa, magari raccordata?

Link al commento
Condividi su altri siti

Behe, tanto per cominciare ti do un'idea su come fare una rampa lineare a tempo variabile.

In configurazione Hw setti il tempo del timer di sistema, ti consiglio di non scendere comunque sotto i 10 ms.

Abiliti l'inturrupt legato all'OB35. Nell'OB35 richiami la funzione rampa.

Tanto per fissare le idee annettiamo che il tuo riferimento sia in analogico 0-10v. L'uscita del D/A_C è suddivisa in 2047 gradini elementari.

Se ad ogni richiamo incrementi di 1 l'uscita PAW corrispondente impiegherai 20.47" per andare da 0 al massimo. Se vuoi un tempo più lungo, per esempio 4 volte più lungo, richiami la funzione ogni 4 interrupts. Se vuoi un tempo più corto, per esempio la metà, nella funzione sommi 2 invece di 1.

Questi pametri li può scrivere l'operatore nello HMI e poi li trasformi.

Attenzione che il tempo di timer lo puoi stabilire solo in fase dic onfigurazione, quindi devi farti bene i conti dei limiti delle rampe per stabilire il tempo più idoneo ai tuoi scopi.

Link al commento
Condividi su altri siti

E' una delle istruzioni che impiegano più tempo macchina. Se devi reiterarla per n volte diventa piuttosto pesate come tempo di ciclo.

Il calcolo del seno, su una 315, richiede 3µs. Un po' di più il coseno: 3,65µs. L'operazione più pesante è il calcolo dell'arcoseno: 6,44µs (vedi "Lista operazioni S7-300", a pagina 49).

Il problema, casomai, è che non ci sono dati per poter giudicare se la soluzione con andamento sinusoidale sia adatta o meno per il tipo di applicazione.

Sappiamo solo che c'è qualcosa che deve andare su e giù, ma non sappiamo niente sulle velocità, sulle masse, sul tipo di motore usato per la movimentazione.

Se si tratta solo di calcolare un riferimento con andamento sinusoidale, partendo da un tempo ciclo stabilito, direi che la soluzione è abbastanza banale.

Per esempio, potresti effettuare il calcolo in OB35, con tempo impostato in configurazione hardware di 10ms.

Dal dato di partenza "TempoCiclo" si calcola quante volte devo eseguire l'OB35 per completare il ciclo.

Per comodità, si potrebbe impostare il tempo ciclo in millisecondi, così basta il semplice calcolo N_Step = TempoCiclo / 10 per sapere quanti step (esecuzioni di OB35) devo fare per colmpetare il ciclo.

Fatto questo, si può calcolare l'entità di incremento angolare per ogni step. Visto che le funzioni trigonometriche funzionano con gli angoli espressi in radianti, basta il seguente calcolo: Inc = 2PI/N_Step.

Il tutto si può riassumere come segue:

Inc = 2PI*10/TempoCiclo = 62,83185/TempoCiclo

Il calcolo vale solo per l'esempio sopra descritto, con OB35 avviato ogni 10ms e TempoCiclo espresso in ms.

Calcolato questo incremento, in OB35 si incrementa l'angolo virtuale di tale valore e poi si calcola il seno.

Altro metodo potrebbe essere quello di misurare il tempo trascorso dall'inizio ciclo (basta ad ogni scansione incrementare del tempo impiegato per l'ultimo ciclo, oppure di "OB35_EXC_FREQ" se il tutto è ancora eseguito in OB35).

Si calcola poi la frazione di giro virtuale effettivamente percorsa dividendo il tempo trascorso da inizio ciclo per il tempo totale del ciclo, e si calcola poi il seno dell'angolo corrispondente.

Esempio:

Rif = k * sin(2 * PI * TempoTrascorso / TempoTotale).

Buttato giù grezzo grezzo in AWL, con la costante k = 27848 in modo da ottenere il massimo riferimento pari al 100% del segnale disponibile, diventa:

      L     6.283185e+000
      L     #TempoTrascorso
      *R    
      L     #TempoTotale
      /R    
      SIN
      L     2.764800e+004
      *R    
      RND   
      T     PAW  xxx

Ovviamente, tutti i calcoli vanno eseguiti in virgola mobile.

E non si deve nemmeno dimenticare che il motore, nei punti prossimi ai 0° e ai 180° dell'angolo virtuale, lavorerebbero con riferimento molto basso.

Si dovrebbe quindi prevedere una soglia minima per il riferimento.

Link al commento
Condividi su altri siti

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...