Vai al contenuto
PLC Forum


Calcolare La Velocità Di Un Tappeto


tommy93

Messaggi consigliati

Buona sera a tutti, sono tommaso, studente al quarto anno di itis.

Mi sta incuriosendo la programmazione con plc siemens e vorrei spingermi con applicazioni un po più complesse rispetto ai soliti marcia/arresto o avviamenti stella/triangolo che mi fanno fare a scuola.

Mi sono procurato una cpu usata per fare delle prove.

Si tratta di una 312-1AD10-OABA e 2 schede di ingressi e uscite digitali, più avanti se trovo qualche occasione a buon prezzo mi procurerò anche una analogica.

Per ora però vorrei riuscire a vedere in una variabile il valore in mm dell'avanzamento di un tappeto.

Provo a immaginare di avere un segnale proveniente da un micro mosso da una camma calettata sul rullo del tappeto.

Con l'intervallo tra un impulso e un'altro mi determino la distanza e con un temporizzatore campiono il tempo che intercorre.

Dividendo poi lo spazio con il tempo ricavo la velocità del tappeto e................. poi mi perdo :(

Da una ricerca che ho fatto sul forum ho trovato qualcosa di fatto ma purtroppo non riesco a capire come poter iniziare a buttare le istruzioni.

Qualcuno di voi è così gentile da offrirmi assistenza?

Grazie :)

Quello che sto tentando di fare in awl è questo, scusate l'ignoranza:

      UN    E      0.0  // ingresso micro
      L     S5T#1S
      SE    T      1

      U     E      0.0
      FP    M      0.0
      U     M      0.0
      SPB   m001
      SPA   m002
m001: L     T      1
      L     60
      /I    
      T     MW    10  // word per vedere la velocità
m002: NOP   0

Link al commento
Condividi su altri siti


Intanto i miei più sinceri complimenti per come ti sei posto nei confronti della materia e alla tua volontà personale di approfondire per conto tuo l'argomento: la tua curiosità, credo, ti porterà a diventare un'eccellente tecnico! :clap:

Per ora però vorrei riuscire a vedere in una variabile il valore in mm dell'avanzamento di un tappeto
Provo a immaginare di avere un segnale proveniente da un micro mosso da una camma calettata sul rullo del tappeto
rullo di cui conosci il diametro e quindi la sua circonferenza.

Rifletti bene: che senso ha, se già conosci lo spazio fra un'impulso e l'altro percorso dal tappeto, trasformare in velocità per poi ri-trasformare in spazio? Non devi fare altro che sommare tra loro gli impulsi fino a quando il tappeto gira e moltiplicare il conteggio finale per la distanza tra gli impulsi dati dal micro. Ovviamente, se invece devi calcolare istantaneamente la distanza, moltiplichi questa quota (fattore proporzionale) ogni volta che leggi un'impulso per il numero degli impulsi a quel momento.

Modificato: da busanela
Link al commento
Condividi su altri siti

Ti faccio anch'io i complimenti per l'impegno, che dimostra voglia di imparare veramente, e non solo di prendere il sei.

Per quanto riguarda il calcolo del tempo, io abbandonerei l'utilizzo del timer.

Nelle CPU S7-300/400 in OB1 c'è la variabile locale "OB1_PREV_CYCLE" che contiene il tempo in millisecondi dell'ultima scansione.

La cosa più semplice da fare è quindi incrementare ad ogni scansione una variabile del tempo della scansione precedente.

Ad ogni fronte di salita del micro leggi il valore raggiunto dalla variabile, effettui i calcoli (oppure appoggi il valore ad un'altra variabile da utilizzare per i calcoli), ed azzeri la variabile stessa.

A questo punto, dato che sicuramente conosci lo spazio tra un impulso e l'altro, ora che hai anche rilevato il tempo, calcolare la velocità è cosa fatta.

Ultima cosa: nel tuo codice leggo:

U     E      0.0
      FP    M      0.0
      U     M      0.0
      SPB   m001
      ......
      ......
Stai utilizzando il fronte di salita nel modo sbagliato. Nell'esempio, M0.0 non è il fronte di salita, ma solo un merker che serve per rilevare il fronte. Il codice completo per un fronte di salita è:
U  E0.0
FP M20.0
=  M20.1
Il merker che viene attivato per una sola scansione quando E0.0 passa da False a True è M20.1, mentre M20.0 è solo un merker ausiliario. Se si desidera solo effettuare un salto senza attivare un merker, si potrebbe scrivere:
U    E0.0
FP   M20.0
SPB _000
....
....

Il richiamo di

U M20.0

prima dell'istruzione di salto, è un errore.

Link al commento
Condividi su altri siti

Mi incoraggia molto la tua considerazione, e spero tanto di arrivare un giorno al tuo e al livello degli altri del forum.

Siete proprio bravi :thumb_yello:

Adesso faccio un esempio e vediamo se ho capito:

Immagino sempre di avere una circonferenza con sviluppo 100mm con 16 punti di riferimento (o tacche?).

Dividendo la circonferenza con il numero di tacche trovo che la distanza tra le tacche è di 6,25mm.

Ora, se dopo 1sec. ho contato 30 impulsi, significa che il tappeto è avanzato di 187,5mm... dunque sto andando alla velocità di 187,5mm/s dico bene?

Tradotto poi in awl:

// in OB1
      U     E      0.0
      FP    M      0.0
      U     M      0.0
      SPB   m001
      SPA   m002
m001: L     MW    10
      L     1
      +I    
      T     MW    10
m002: NOP   0


// in OB35 con coclo 1000Ms

      L     MW    10  // numero impulsi
      L     6,25      // spazio in mm degli impulsi
      *I    
      T     MW    12  // velocità di avanzamento in mm/s
      L     0
      T     MW    10

Grazie mille per l'aiuto che mi stai dando :)

Link al commento
Condividi su altri siti

Grazie mille anche a te batta, mi sento esplodere dall'entusiasmo.

Adesso ti leggo meglio e provo a capire..... sperando di farcela da subito, eventualmente mi risentite di nuovo :)

Grazie anche per i consigli riguardo agli errori nel codice awl.

Mi prende parecchio rispetto al KOP ma sento che ne ho ancora parecchia di strada da fare..... comunque state certi che non mollo :thumb_yello:

Link al commento
Condividi su altri siti

Per calcolare la velocità come nel tuo caso, ci sono fondamentalmente due metodi:

1) conteggio numero di impulsi in un tempo fisso

2) misura del tempo tra un impulso e l'altro.

Qual è il metodo migliore?

La risposta è: dipende.

Tutto dipende infatti dalla frequenza degli impulsi, dalla velocità di refresh del dato desiderata e dalla precisione richiesta.

Se la frequenza è elevata è meglio contare il numero di impulsi, mentre se la frequenza è bassa è meglio rilevare il tempo tra gli impulsi.

E se la frequenza è una via di mezzo?

E' possibile fondere i due sistemi.

Per esempio, potresti contare il numero di impulsi in un tempo minimo, ed anche il tempo esatto di questi impulsi.

Mi spiego con un esempio numerico.

Supponiamo di avere un impulso ogni 150 ms (frequenza di circa 6,67 Hz).

Un tempo di scansione di 10 ms comporterebbe un errore elevato in una eventuale misura del tempo tra gli impulsi, dato che potrei misurare un tempo di 141 ms oppure di 159 ms.

Percorrendo l'altra strada e supponendo (come nel tuo esempio) di contare gli impulsi ogni secondo, leggerei a volte 6 ed altre volte 7 impulsi, commettendo quindi ancora un errore molto grande.

Per rimediare si potrebbero contare gli impulsi, attendere che sia passato almeno 1 secondo e, al successivo impulso, oltre ad incrementare ancora il conteggio, attivare anche la lettura del tempo col metodo suggerito nel mio precedente post.

Ecco che ci ritroveremmo ad avere letture intorno ai 1050 ms (con variazioni dovute ai tempi di scansione).

Lasciando perdere per ora queste complicazioni, e volendo solo contare gli impulsi in un secondo (come da tuo esempio), stai commettendo un errore nella gestione dell'incremento su fronte di salita (vedi mio precedente post al riguardo).

Inoltre, il codice si potrebbe migliorare:

      U     E      0.0
      FP    M      0.0
      SPBN   m001
      L     MW    10
      +    1    
      T     MW    10
m001: NOP   0
Per il resto, il concetto c'è ma devi fare attenzione ai formati delle variabili. MW10 e MW12 sono variabili a 16 bit di tipo INT, mentre 6,25 è un numero in virgola mobile. Per poter effettuare operazioni i numeri devono essere tutti nello stesso formato, ed anche le istruzioni relative all'operazione devono essere conformi. La moltiplicazione quindi andrebbe così corretta:
      L     MW    10  // numero impulsi
      ITD         //Converti da INT a DINT
      DTR        //Converti da DINT a REAL
      L     6.25      // spazio in mm degli impulsi (usare il punto e non la virgola per il decimale)
      *R         // Moltiplicazione tra REAL
      RND      // Da REAL a DINT con arrotondamento.
                  // Se si è certi che il risultato non supera 32767, si può trasferire in una variabile INT, altrimenti serve una DINT   
      T     MW    12  // velocità di avanzamento in mm/s

Link al commento
Condividi su altri siti

Stai utilizzando il fronte di salita nel modo sbagliato.

Nell'esempio, M0.0 non è il fronte di salita, ma solo un merker che serve per rilevare il fronte.

Il codice completo per un fronte di salita è:

U  E0.0
FP M20.0
=  M20.1
Ho provato a ragionarci sopra, ma non mi riesce di afferrare il concetto di come lavora FP Se dici che M20.0 non è il fronte ma solo un appoggio mentre il fronte è M20.1, mi verrebbe di ragionarla in questo modo:
ciclo 1 - U E0.0   =0
            FP M20.0=0 
            U M 20.1=0
ciclo 2 - U E0.0   =1
            FP M20.0=1
            U M 20.1=1  
ciclo 3 - UE0.0    =0
            FP M20.0=1   // chi lo manda a 0 ?
            U M 20.1=0
Ma qualcosa non mi torna :senzasperanza: Se invece faccio cosi il discorso fila.... o almeno a me sembra:
ciclo 1 - U E0.0    = 0
             UN M20.0 =1
             = M20.1 =0
             UNE0.0  =1
             = M20.0 =0
ciclo 2 -  U E0.0 0 =1
             UN M20.0 =1
             = M20.1  =1    // fronte   
             UN E0.0 =0
             = M20.0 =0
ciclo 3 - U E0.0 =0
             UNM20.0 =1
            = M20.1 =0
            UN E0.0 0 =1
            = M20.1 =0

Scusa se ti stresso :)

Link al commento
Condividi su altri siti

Grazie ancora Flavio, ora devo cedere il pc a mio fratello, è il suo turno.

Domani mi concentro meglio sui suggerimenti e mi faccio risentire..... sperando di aver fatto progressi.

A domani, ciao :thumb_yello:

Link al commento
Condividi su altri siti

per misurare un tappeto puoi o mettere un encoder a rotella che viene azionata dal tappeto , conoscendo il diametro , sapendo pigreco e gli impulsi a giro dell' encoder calcoli il tappeto oppure monti un encoder sul tamburo che aziona il rullo che avvolge il tappeto .Solitamente faccio applicazioni simili per delle macchine in azienda , con due encoder su due tamburi , presettati e sincronizzati per l'antistrappo ect

Con la formula della spirale fatta ad hoc calcolo il diametro per ogni rullo ad ogni istante , o meglio dire ad ogni giro aggiunto e poi calcolo la lunghezza di tappeto avvolta su entrambe i rulli , con dei controlli.

Puoi anche utilizzare un disco forato con almeno 16 fori ed un proxi , una sorta di encoder artigianale per basse prestazioni e basse velocità , in quanto rischi che il proxi non legga tutti gli impulsi in tempo , se il tappeto scorre veloce.

Visto che sei appassionato ti consiglio di iniziare da subito a studiarti SCL , compilatore pseudo pascal per step 7 , lascia perdere puntatori e calcoli in awl , rischi di predere tempo solo epr capire i concetti legati al processore del plc piuttosto che diventare un buon programmatore di automazione ed informatica industriale .

Lo uso da 10 anni senza mai problemi , e' veloce e vedi da subito cosa scrivi .

ciao

walter

Link al commento
Condividi su altri siti

Visto che sei appassionato ti consiglio di iniziare da subito a studiarti SCL , compilatore pseudo pascal per step 7 , lascia perdere puntatori e calcoli in awl

Sono d'accordo sull'utilità di imparare anche SCL, ma sono in completo disaccordo sul lasciar perdere AWL e puntatori.

Per i PLC Siemens l'AWL è ancora il linguaggio più performante (dal punto di vista della macchina, intendo) e col quale puoi fare tutto. Basta solo conoscerlo.

Ci sono sicuramente cose più facili da scrivere in SCL, ma il codice generato è sempre più lungo dell'analogo codice scritto direttamente in AWL.

C'è chi lavora in settori dove installare CPU dalle prestazioni (e costi) esorbitanti non è un problema, ma c'è anche chi deve fare i conti col costo della CPU, e deve scegliere quella appena giusta per l'applicazione.

Non è così raro che un codice non ottimizzato ti costringa a passare ad una CPU di classe (e costo) superiore.

Inoltre, io trovo scomodo il debug di logiche booleane scritte in SCL.

Sebbene io non ami il KOP, per le logiche booleane di segmenti un po' complessi è il linguaggio più chiaro.

Anche l'AWL non è il massimo per il debug di logiche booleane ma, mentre è possibile scrivere una FC mista KOP-AWL non è possibile creare FC miste KOP-SCL.

Però con questi discorsi siamo finiti fuori tema.

Per quanto riguarda il fronte di salita, ora credo non esistano più PLC senza questa istruzione. Ma non è sempre stato così.

Anni addietro i PLC nei quali il fronte di salita si doveva costruire erano parecchi.

Le logiche per creare un fronte di salita erano le seguenti:

Esempio 1

U E0.0  
UN M20.0
= M20.1

U E0.0
= M20.0
Esempio 2
U E0.0
U M20.0
= M20.1

UN E0.0
= M20.0

La differenza tra i due metodi sta nel fatto che, mentre col primo metodo se, alla prima esecuzione del codice, il segnale E0.0 è alto viene subito rilevato il fronte di salita, col secondo sistema invece si rileva il fronte solo se prima si è rilevato E0.0 basso.

Personalmente (salvo casi particolari in cui il falso fronte all'avvio è voluto) preferisco il secondo metodo.

Lasciando perdere queste considerazioni, si nota comunque che, in entrambi gli esempi, il merker M20.0 è utilizzato come merker ausiliario per il rilevamento del fronte di salita, ma il merker che rimane alto una sola scansione nel passaggio da 0 a 1 del segnale è il merker M20.1

In Step7 i fronti di salita (Fronte Positivo da cui l'istruzione FP) e di discesa (fronte negativo da cui l'istruzione FN) si rilevano come segue:

//Fronte di salita

U E0.0

FP M20.0

= M20.1

//Fronte di discesa

U E0.0

FN M20.0

= M20.1

Si tratta di una scrittura più semplice, ma il concetto è lo stesso: M20.0 è un merker ausiliario per il rilevamento del fronte salita/discesa, ed M20.1 è il merker che viene attivato per una sola scansione sul fronte di salita/discesa.

In sostanza, il fronte di salita (o discesa) è il risultato logico delle istruzioni

U E0.0

FP M20.0

e non M20.0

Quindi, se devo utilizzare il fronte di salita in più parti del programma, risulta comodo scrivere:

U E0.0

FP M20.0

= M20.0

In modo da poter utilizzare più volte M20.0.

Se invece il fronte di salita mi interessa in un solo punto del programma, si può scrivere:

U E0.0

FP M20.0

//Seguono istruzioni da eseguire al rilevamento del fronte

Chiarita (credo) la faccenda dei fronti, vediamo cosa riesci a buttar giù per il calcolo della velocità.

Link al commento
Condividi su altri siti

non si scrivono logiche booleane in SCL .Si scrivono calcoli medio complessi , funzionalità avanzate, funzioni di autoapprendimento parametri , gestione di DB strutturati come array di strutture di array o array tridimensionali .

Le logiche macchina , allarmi , richieste di movimento o posizionamento , selettori velocità e coppia si scrivono in Kop

In awl si scrivono logiche dove compaiono 200 bit in or o and , per compattare il codice oppure dove ci sono funzionalità ripetitive che non dovranno essere più toccate

ciao

walter :rolleyes:

Link al commento
Condividi su altri siti

Grazie di cuore a tutti per l'assistenza gratuita e i consigli preziosi che mi state dando.

Prometto di sperimentarli e di farne tesoro :thumb_yello:

Tornando alla mia assurda richiesta di provare a misurare la velocità del tappeto con i limiti della mia conoscenza, vi metto il codice awl che penso possa funzionare.

Purtroppo non ho avuto il tempo per testarlo nel plc, ma al più presto conto di farlo.

ecco le istruzioni.

// in OB1 
// Calcolo la circonferenza del tamburo con la formula r*r*3,14

      L     MD     0                    // raggio
      L     2.000000e+000
      *R    
      T     MD     4
      L     3.140000e+000
      *R    
      T     MD     8                    // circonferenza del tamburo

// Calcolo lo spazio degli impulsi

      L     MD     8
      L     1.600000e+001
      /R    
      T     MD    12                    // spazio degli impulsi


// Conto gli impulsi del micro per sapere quando ho completato un giro
// ipotizzo un numero di 16, per poi usarli in OB35 per il calcolo 
// della velocità di avanzamento del tappeto.

      U     E      0.0                  // ingresso digitale del micro
      FP    M      0.0
      U     M      0.1
      SPB   m001
      SPA   m002
m001: L     MD    16
      L     1.000000e+000
      +R    
      T     MD    16                    // totalizzatore numero di impulsi
m002: NOP   0
// OB35 configurato 1000Ms
// Faccio la somma degli impulsi che sono entrati in un secondo, aggiungo lo spazio 
// il risulatato corrisponde all'avanzamento in mm/s

      L     MD    16                    // numero di impulsi
      L     MD    12                    // spazio tra gli impulsi
      +R    
      T     MD    20                    // velocità di avanzamento

// Cancello gli impulsi contati in precedenza.

      L     0.000000e+000
      T     MD    16

Ho provato a leggere attentamente i passaggi e la mia impressione è che funziona.

Spero tanto che con la vostra analisi la possiate confermare :)

ps: ho provato a considerare "OB1_PREV_CYCLE, ma non ho ben capito come utilizzarlo.

Flavio, so che sto chiedendo tanto, ma potresti aiutarmi a capire magari anche con un esempio :)

Link al commento
Condividi su altri siti

Il mio prof mi ha mandato ora un messaggio, dice che è riuscito a procurarmi un'encoder per generare gli impulsi.

Potrei usarlo per questo studio e per il mio plc?

Domani me lo fa avere, casomai vi metto i dati e le caratteristiche :)

Grazie.

Link al commento
Condividi su altri siti

Direi che ci sono parecchi errori, a cominciare dal calcolo della circonferenza.

Con r*r*PiGreco non si calcola la circonferenza, ma l'area del cerchio.

La circonferenza è 2*r*PiGreco.

Ma si tratta evidentemente di una banale svista, dato che la formula è sbagliata ma le operazioni sono giuste.

Si può però accorciare parecchio la strada, perché non serve memorizzare il risultato di ogni singola azione in una variabile, ma si possono fare i calcoli tutti in fila.

Per capire bene il perché, si dovrebbe parlare di come vengono utilizzati gli accumulatori.

Per il calcolo dello spazio tra due impulsi, basta scrivere:

L MD0    //Raggio (in formato REAL)
L 2.0
*R
L 3.141593
*R
L 16.0
/R
T MD12   //Spazio tra due impulsi
Per quanto riguarda l'incremento degli impulsi, stai ancora usando il fronte di salita nel modo sbagliato, ed utilizzi più istruzioni di quelle necessarie. Per fare il salto solo sul fronte di salita puoi scrivere:
U E0.0
FP M0.0
= M0.1

U M0.1
SPB m001
Oppure:
U E0.0
FP M0.0
SPB m001
Il tutto si può ridurre a quanto segue:
U E0.0
FP M0.0
SPBN _000   //Sul fronte di salita NON effettuo il salto, quindi eseguo l'incremento
L MW16
+ 1
T MW16
_000 NOP 0
Avrai notato che, per il conteggio degli impulsi, sto facendo calcoli con interi, e non in virgola mobile. Ti basta tenerne conto quando farai il calcolo finale, che potrebbe diventare:
L MW16
ITD
DTR
L MD12
*R
T MD20

L 0
T MW16

Per quanto riguarda l'encoder, tieni presente che non disponi di ingressi veloci.

Link al commento
Condividi su altri siti

se l'encoder e' incrementale devi avere una scheda conteggio veloce , FM350

Se invece e' in profibus allora lo connetti alla rete profibus di cui il plc e' master.

Se invece hai un s7-200 allora puoi usare i primi due ingressi , con poche istruzioni inizializzi il tutto e leggi gli impulsi in un registro (HC0 )

ciao

walter

Link al commento
Condividi su altri siti

Si quella della formula è stata una svista, se mi legge il prof di matematica… sai che figura!

Il prof che mi ha procurato l’encoder mi ha detto che potrei usarlo con un plc come questo che ho trovato in ebay, voi cosa ne dite, a quel prezzo potrebbe essere un’occasione?

Se mi dite si la compro per farci degli studi con gli ingressi veloci.

Per la serie s7-200 invece quale potrei prendere a tale scopo, una vale l’altra?

La programmazione so che è a contatti quindi non dovrei avere tutti i problemi che ho con awl.

Mi piacerebbe provare a smanettare anche con questa, se voi mi date assistenza e babbo mi viene incontro.

Avrei voluto comprare la X-Box ma credo che le cpu possano darmi qualche possibilità in più per un lavoro futuro.

Tornando allo studio, a parte gli errori che ho commesso e che ora ho capito, campionare in OB35 ogni secondo è una soluzione buona?

Si potrebbe migliorare?

Casomai mi spiegate come potrei fare con OB1_PREV_CYCLE.

Grazie, a presto.

ps: se riesco vi metto la foto dell'encoder.

Link al commento
Condividi su altri siti

Ecco le foto dell'encoder, ha 5 fili di cui:

1 nero, 2 rosso, 3giallo, 4 verde, 5 blu.

Mi viene da pensare che il nero =negativo, rosso =positivo, e gli altri dei segnali?

th_20110115153119_a.jpgth_20110115153144_b.jpg

Questo è quanto ho trovato sul sito della Eltra in merito:

ø 63 mm [EH - EL63 A / D / E]

Serie encoder standard ø63per ambienti industriali con ottima resistenza meccanica, possibilità di alto carico radiale ed assiale

sull'albero. Montaggio meccanico mezzo flangia o servograffe.

Risoluzioni fino a 10000 imp/giro con zero per serie EL, fino a 1024 imp/giro per serie EH

Varie confi gurazioni elettroniche disponibili con alimentazioni fino a 28 Vdc per serie EL e fino a 24 Vdc per serie EH

Frequenza di esercizio fino a 300 KHz per serie EL, e fino a 100 KHz per serie EH

Uscita cavo con connettore

Varie flangiature disponibili

Velocità di rotazione fino a 6000 rpm

Grado di protezione fino a IP66

Per avere più informazioni chiedono di iscriversi, quindi probabile che lunedì lo faccio.

Nel frattempo se qualcuno conosce il prodotto e sa dirmi qualcosa mi farebbe un regalo.

Adesso mi fermo perchè mi rendo conto di approfittare e stressare abbastanza, scusatemi :)

Link al commento
Condividi su altri siti

Mi viene da pensare che il nero =negativo, rosso =positivo, e gli altri dei segnali?

Dal sito di eltra scarichi, dopo aver fornito i dati, il foglio tecnico dell'encoder. Nella sigla la penultima lettera sta ad indicare il tipo di connessione. Una "P" indica uscita con cavo standard. Vengono riportati colori e funzioni dei fili.

Sempre bene rifarsi al data sheet pittosto che alle supposizioni. :)

Link al commento
Condividi su altri siti

La CPU del link NON ha contatori veloci, quindi ti sconsiglierei l'acquisto.

Per le caratteristiche dell'encoder, dalle foto non si vede nulla. Bisognerebbe leggere la targhetta.

Per PLC Serie 200, si tratta di un prodotto ancora in produzione (e lo rimarrà, probabilmente, ancora per alcuni anni), ma che sta per essere sostituito dalla serie S7-1200.

C'erano in giro KIT che comprendevano CPU S7-1212C, pannello operatore KTP600 a colori e software di sviluppo Step-7 10.5 a 350 euro (IVA esclusa).

Se davvero vuoi buttarti subito anche in qualcosa di diverso dall'S7-300, se puoi arrivare a tale cifra, forse ti conviene lasciar perdere il 200 e vedere se si trovano ancora i kit del 1200.

Il discorso del campionamento in OB35 (impostato in configurazione hardware a 1000 ms) è corretto.

In questo modo sei sicuro di effettuare il controllo ogni 1000 ms, indipendentemente dal tempo di scansione del programma principale.

Come già detto in precedenza, il problema di questo metodo è che, lavorando con frequenze basse (e non può essere diversamente, fino a quando non disporrai di encoder e contatore veloce), avrai sempre letture instabili, perché la differenza di un impulso incide percentualmente in modo rilevante.

Un buon risultato lo potresti ottenere seguendo il metodo descritto nel post #6, che torno a spiegare in modo un po' più dettagliato.

In OB1 esiste la variabile locale OB1_PREV_CYCLE che contiene il valore in millisecondi della scansione precedente.

Trattandosi di una variabile locale, la puoi leggere solo ed esclusivamente in OB1.

Per l'utilizzo di questo valore in una FC, puoi appoggiare il valore letto ad una MW, oppure a una variabile di un DB, oppure passare il valore come parametro in ingresso di una FC richiamata in OB1.

Ora, volutamente, non scrivo il codice per il calcolo della velocità, ma descrivo il procedimento.

1) ad ogni ciclo incrementi una variabile del tempo della precedente scansione.

2) ad ogni impulso incrementi il conteggio degli impulsi e controlli se il tempo totale (rilevato al punto 1) è < 1000 ms. Se il tempo è inferiore a 1000 ms effettui solo l'incremento del conteggio degli impulsi. In caso contrario (tempo >= 1000 ms) effettui il calcolo della velocità (come già facevi in OB35, ma tenendo conto del tempo reale trascorso), azzeri il conteggio impulsi ed il tempo.

Link al commento
Condividi su altri siti

Grazie Livio.

Ho scaricato le caratteristiche dal sito:

EL 63 D 5000 S 5/28 P 8 X 3 P A

EL=encode incrementale

63=dimensione del corpo

D =Tipo di flangiatura (EL 63 D)

5000=imp./giro serie EL da 1a10000

S =senza impulso di zero

5/28=alimentazione Vdc

P =PUSH PULL

8 =diametro albero ø 8 mm

X =grado di protezione standard IP54

3 =R.P.M 3000

P =uscita cavo (lunghezza standard 1,5 m)

A =assiale

però non ho trovato nulla riguardo il significato della colorazione dei fili.

In settimana provo a contattarli per avere eventuali delucidazioni.

Livio, grazie per le dritte :)

Link al commento
Condividi su altri siti

Grazie Flavio.

dunque quella cpu non fa il conteggio veloce, bene proverò in qualche modo a cercarne una che lo abbia.

Per s7-200, pensavo, che per il momento è meglio che lo accantoni.

Prima provo a capire meglio questa serie, visto che qualcosa ho tra le mani di concreto, poi in futuro vediamo.

Per l'encoder ho fatto qualche passo in avanti, grazie alla "spronata" di Livio ho scaricato i dati ma non ho il significato dei fili.

In settimana spero di avere conferma dal sito dell'Eltra.

Per il discorso di OB1_PREV_CYCLE, hai fatto benissimo a non scrivere il codice funzionante :thumb_yello:

Mi leggo attentamente la tua descrizione e faccio tutti i miei ragionamenti/tentativi, poi li espongo al giudizio.

Questo è il modo che preferisco per imparare :)

Ancora tante grazie a tutti.

Link al commento
Condividi su altri siti

La Eltra è una azienda affermata nel settore degli encoder e distribuisce degli ottimi prodotti nel mercato. In genere la sigla identificativa contiene già di suo molti elementi per capire con che tipo di encoder si ha a che fare.

Oltre a ciò, sull'etichetta argento sul corpo che si intravvede nelle foto che hai allegato, dovresti vedere il riferimento ai colori per i vari canali di uscita: sono indicati con A, A negato, B, B negato, C, ... e Z ( se c'è).

La logica d'ingresso del 300 che stai utilizzando dovrebbe permetterti letture di segnali con frequenze fino al massimo 100-120Hz, quindi con un rullo del diametro che hai indicato (circonferenza di 100mm corrisponde ad un diam. di circa 32 mm, pittosto piccolo),potresti "leggere" velocità fino ad un massimo di 1.5 metri al minuto, supponendo che l'encoder abbia una risoluzione di soli 500 imp./giro: 150/60= 2,5 cm/sec, 10/2,5=4 secondi per rivoluzione encoder --> 500/4=125 Hz all'ingresso: decisamente troppo per un ingresso che non sia ad alta velocità.

Visto che sei appassionato ti consiglio di iniziare da subito a studiarti SCL , compilatore pseudo pascal per step 7 , lascia perdere puntatori e calcoli in awl , rischi di predere tempo solo epr capire i concetti legati al processore del plc piuttosto che diventare un buon programmatore di automazione ed informatica industriale .

Non concordo con quanto detto da Walter: ritengo sia indispensabile comprendere "i concetti legati al processore" proprio per diventare un buon programmatore! Solo capendo fino in fondo il meccanismo di certi accadimenti, il modo ed il perchè sono stati progettati in quella maniera, è possibile fare completamente propria questa (ma anche altre) materia.

Per la serie s7-200 invece quale potrei prendere a tale scopo

L'unica cosa a cui devi fare attenzione a mettere troppa carne al fuoco in questa fase è quella di fare attenzione a non eccedere nel numero di concetti che stai per mettere in pratica, e magari anche troppo in fretta.

Link al commento
Condividi su altri siti

Grazie anche a te Alessandro.

Hai messo un sacco di numeri importanti, però devo leggerli con calma per mettere tutto a fuoco :thumb_yello:

Comunque ci risentiamo nel caso avessi dei chiarimenti.

Per i pareri che hai espresso, li concordo a pieno anch'io.

Grazie e a presto :thumb_yello:

Link al commento
Condividi su altri siti

Ho letto sul pdf che ho scaricato da siemens che la cpu 312 IFM codice 312-5AC02-OABO ha queste funzioni integrate:

Gli ingressi di interrupt sono ingressi parametrizzati in modo da attivare un interrupt di processo con il fronte di segnale corrispondente.

Se si intende utilizzare gli ingressi digitali da 124.6 a 125.1 come ingressi di interrupt, è necessario parametrizzarli in STEP 7.

Contatori Per gli ingressi digitali da 124.6 a 125.1 la CPU 312 IFM mette a disposizione in alternativa queste funzioni speciali.

Misuratore di frequenza nativa speciali.

La descrizione delle funzioni speciali ”Contatori” e ”Misuratore di frequenza” è riportata nel manuale Funzioni integrate.

”Ingressi di interrupt” della CPU 312 IFM

Se si intende utilizzare gli ingressi digitali da 124.6 a 125.1 come ingressi di interrupt, è necessario parametrizzarli in STEP 7 nei parametri della CPU.

Osservare le seguenti particolarità:

Questi ingressi digitali hanno un ritardo di segnale molto limitato. Su questo ingresso di interrupt l’unità riconosce già impulsi di una durata da ca. 10 a 50 s. Per impedire l’attivazione di allarmi tramite impulsi di disturbo, è necessario collegare cavi schermati agli ingressi di interrupt attivati.

Avvertenza: l’impulso di attivazione dell’interrupt deve essere di almeno 50 s.

Lo stato di un ingresso appartenente a un interrupt nell’immagine di processo degli ingressi o in L PEB cambia sempre con il ”normale” ritardo all’ingresso di ca. 3 ms.

Il codice di ordinazione è lo stesso che ho trovato qui in e-bay

Flavio, è possibile che ti sia sfuggito qualcosa e che invece con questa cpu posso leggere lo stesso gli impulsi che arrivano dall'encoder?

Scusatemi se continuo a tediarvi ma sento dentro una dinamite e non vedo l'ora di smanettare. :)

Modificato: da tommy93
Link al commento
Condividi su altri siti

  • Livio Orsini locked this discussione
Ospite
Questa discussione è chiusa alle risposte.
×
×
  • Crea nuovo/a...