Vai al contenuto
PLC Forum


Fare Esperienza Con Step7 - Principiante Cerca Aiuto


Roberto82

Messaggi consigliati

Salve a tutti, questo è il mio primo post!

Sto iniziando una tesi di laurea triennale e sto cercando di fare esperienza con step7. Attualmente mi è stato chiesto di fare questa cosa:

1) realizzare una particolare funzione. Vout= Vin*K+ (1-K)*Vout (fatto)

2) ritardare gli ingressi della funzione con un blocco FIFO (realizzato con degli shift register?).

3) plottare i risultati in caso di assenza di ritardo e con la presenza di ritardo.

Mi spiego meglio con un disegno:

 
               ______________
_____IN______ |              |
              |       FIFO   |     ___________
              |              |____| Funzione  |___OUT____
              |______________|    |___________|

I miei problemi sono 2:

- realizzare il blocco FIFO per ritardare gli ingressi

- trasferire i risultati della funzione in una DB per poi prelevare tutti i risultati e plottarli in excel. Ho provato con la funzione BLKMOV ma non riesco proprio a farla funzionare!

Potreste aiutarmi perfavore?

Grazie!

Link al commento
Condividi su altri siti


realizzare il blocco FIFO per ritardare gli ingressi

Un fifo si puo' realizzare anche cosi':

Esempio un FIFO a 6 posizioni, dove i dati entrano nella DB10.DBW0 ed escono dalla DB10.DBW10 , il ritardo e' dato dal ciclo di scansione della CPU, moltiplicato X n.volte il numero di spostamenti del registro . Esempio 50ms * 5=250ms di ritardo tra l'aggiornamento di DBW0 (FIFO Input) e il trasferimento del medesimo valore su DBW10 (FIFO Out).

AUF DB10 //FIFO DB opening

L DBW8 //read 5th. FIFO position

T DBW10 //discharge on last FIFO position (FIFO Out)

L DBW6 //read 4th. FIFO position

T DBW8 //Shift to 5th.

L DBW4 //read 3th. FIFO position

T DBW6 //Shift to 4th. FIFO position

L DBW2 //read 2th. FIFO position

T DBW4 //Shift to 3th. FIFO position

L DBW0 //read FIFO input word (FIFO Input)

T DBW2 //Shift to second FIFO position

BE:

Oppure piu' semplicemente con le funzioni SHL_W (shift left word) , SHR_W (shift right word)

- trasferire i risultati della funzione in una DB per poi prelevare tutti i risultati e plottarli in excel. Ho provato con la funzione BLKMOV ma non riesco proprio a farla funzionare!

Non ho ben capito cosa intendi fare , ma la funzione BKLMOVE , muove solo un gruppo di informazioni, decidi tu' l'indirizzo iniziale e la quantita' in un'indirizzo di memoria finale, ma non vedo nessuna relazione con Excel.

Ivan

Link al commento
Condividi su altri siti

Non ho ben capito cosa intendi fare , ma la funzione BKLMOVE , muove solo un gruppo di informazioni, decidi tu' l'indirizzo iniziale e la quantita' in un'indirizzo di memoria finale, ma non vedo nessuna relazione con Excel.

Nel senso che i dati, ad ogni iterazione, escono in AD 0 e sono in virgola mobile. Volevo, man mano che uscivano, trasferirli in una DB per tenerene traccia. A fine operazione avrei copiato i risultati della DB e li avrei usati per ricavare un grafico in Excel.

Oppure piu' semplicemente con le funzioni SHL_W (shift left word) , SHR_W (shift right word)

Il problema è che sono delle DW.

Grazie per la risposta celere, ci ragionerò un pò su.

Link al commento
Condividi su altri siti

Il problema è che sono delle DW.

No problem! :)

Sciverai:

L DBD16 //read 5th. FIFO position

T DBD20 //discharge on last FIFO position (FIFO Out)

L DBD12 //read 4th. FIFO position

T DBD16 //Shift to 5th.

L DBD8 //read 3th. FIFO position

T DBD12 //Shift to 4th. FIFO position

L DBD4 //read 2th. FIFO position

T DBD8 //Shift to 3th. FIFO position

L DBD0 //read FIFO input word (FIFO Input)

T DBD4 //Shift to second FIFO position

BE:

Ivan

Link al commento
Condividi su altri siti

plottarli in excel
come?

Facendo un copy and paste dal supposto DB_VoutList in un file .XLS, .CSV.. oppure salvare direttamente sul PC in RUNTIME .?

Ti servirebbe anche un tempo di scansione e un generatore di valori per Vin per il disegno del trend

Modificato: da Savino
Link al commento
Condividi su altri siti

Grazie mille Kamikaze per la risposta esaustiva!

Mi rimane ancora una perplessità, decisamente terra terra: non riesco a capire la "meccanica" che sta dietro ad una FIFO fatta con uno shift register. Non sono riuscito a trovare esempi da nessuna parte, chiaramente è solo una mia curiosità personale ma vorrei colmare questa lacuna.

come?

Facendo un copy and paste dal supposto DB_VoutList in un file .XLS, .CSV.. oppure salvare direttamente sul PC in RUNTIME .?

Ti servirebbe anche un tempo di scansione e un generatore di valori per Vin per il disegno del trend

La mia idea era la prima: copy and paste dalla DB direttamente in un file .XLS.

Il problema è proprio copiare le uscite nella DB e non riportarle sulla tabella Excel.

Grazie a tutti!

Link al commento
Condividi su altri siti

Ciao Roberto 82,

non riesco a capire la "meccanica" che sta dietro ad una FIFO fatta con uno shift register.

Sostanzialmente applicando un shift SLW crei un registro a scorrimento a 32bit.

Dall'. di S7:

Descrizione dell'operazione

SHL_DW (Fai scorrere doppia parola verso sinistra (a 32 bit)) viene attivata se lo stato di segnale all'ingresso di abilitazione (EN) è "1". L'operazione SHL_DW fa scorrere a sinistra, bit per bit, i bit da 0 a 31 dall'ingresso IN. L'ingresso N sta a specificare il valore dell'operazione di scorrimento che deve essere caricato nell'ACCU 1. L'ingresso N specifica il numero di posizioni di bit nella misura in cui va effettuato lo scorrimento. N può variare tra 0 e 31. Sulla destra viene fatto scorrere nell'accumulatore lo stesso numero di zeri (N) per occupare le posizioni libere. La doppia parola di risultato dell'operazione di scorrimento può essere rilevata all'uscita OUT. L'operazione imposta sempre a "0" il bit OV.

ENO ha lo stesso stato di segnale di EN.

In sostanza, puoi crare un FIFO a singoli bit.

Nel tuo caso specifico, devi attuare la prima soluzione che ti ho proposto .

La uso spesso per "smorzare"le fluttuazioni dei valori di lettura analogica dove ho problemi di disturbi e/o oscillazioni.

Generalmente creo un FIFO a 6 o ad 8 posizioni, poi faccio la media tra tutte le letture e tiro fuori un valore accettabilmente stabile da visualizzare sul display.

Il problema è proprio copiare le uscite nella DB e non riportarle sulla tabella Excel.

Effettivamente, ho visto che salvo il fatto di copiarsi ogni singolo campo per volta, non esiste un sistema pratico per copiarlo in un file CSV.

Al contario sono riuscito a creare un file .CSV con le informazioni della DB attraverso uno scriptVB in Runtime su WINCC o Protool.

Ivan

Link al commento
Condividi su altri siti

Ciao Roberto82, non riesco a capire bene tuo quesito... <_<

Dunque, tu hai l'insieme dominio DB_Vin degli elementi Vin poi l'insieme codominio DB_Vout degli elementi univoci Vout = f (Vin).. giusto..? poi ..

____IN______| FIFO|_______|FUNZIONE|_____OUT___
Vout= Vin*K+ (1-K)*Vout.
dovresti definire il tipo di data (Bit, Byte,Word,DWord, ASCII) per gli elementi Vin. ..Quale sarebbe il suo intervallo ?

Poi, la forma per FIFO ..voglio dire .. e' una coda di elementi a bit, Byte,Word,DWord, ASCII ..?

Link al commento
Condividi su altri siti

Rieccomi qua!

Mettendo insieme le cose che mi avete detto e che già avete fatto ho ricavato questo codice:

      AUF   DB     1                    //APERTURA DEI BLOCCHI DATI, DB1 contiene il valore di Vin e di K
      AUF   DB     2                    //mentre DB2 gli elementi della pila FIFO


      L     DB1.DBD    6                //TRASFERISCO IL VALORE DI Vin DENTRO LA PRIMA
      T     DB2.DBD    0                //POSIZIONE DELLA PILA FIFO

//PILA FIFO

      L     DBD   16                    //LEGGE LA 5a POSIZIONE
      T     DBD   20                    //SCAMBIA CON L'ULTIMA POSIZIONE

      L     DBD   12                    //LEGGE LA 4a POSIZIONE
      T     DBD   16                    //SCAMBIA CON LA 5a POSIZIONE

      L     DBD    8                    //LEGGE LA 3a POSIZIONE
      T     DBD   12                    //SCAMBIA CON LA 4a POSIZIONE

      L     DBD    4                    //LEGGE LA 2a POSIZIONE
      T     DBD    8                    //SCAMBIA CON LA 3a POSIZIONE

      L     DBD    0                    //LEGGE LA 1a POSIZIONE
      T     DBD    4                    //SCAMBIA CON LA 2a POSIZIONE

//FINE PILA FIFO

// INIZIO DELLA FUNZIONE Vout= (Vin*K)+(1-K)*(Vout)

      L     DB1.DBD    2                //MOLTIPLICA Vin*K E LO TRASFRERISCE
      L     DB2.DBD   20                //IN MD 80
      *R    
      T     MD    80


      L     1.000000e+000              //RICAVA (1-K) E TRASFERISCE IL RISULTATO
      L     DB1.DBD    2                //IN MD 8
      -R    
      T     MD     8


      L     MD     8                    // MOLTIPLICA Vout*(1-K) E LO TRASFERISCE IN MD 90
      L     MD     2
      *R    
      T     MD    90


      L     MD    80                    //RICAVA IL NUOVO VALORE DI Vout
      L     MD    90
      +R    
      T     MD     2


      L     MD     2                    //TRASFERISCE IL NUOVO VALORE DI Vout IN USCITA
      T     AD     0

Dalle prove effettuate stamattina sembra funzionare!

xSAVINO: Sostanzialmente il problema che permane è che vorrei salvare da qualche parte i dati in uscita da AD0, questo perchè vorrei utilizzarli per ricavarne un grafico in un secondo tempo. Per rispondere a quanto mi chiedevi, non ho una DB solo per le Vin ma unicamente un valore Vin =0 in DB1 che forzo al valore che desidero tramite la tabella delle variabili. Il tipo di elementi usati sono delle DW, probabilmente dovrò poi modificarlo in base a future richieste (ho usato le DW perchè supponevo calcoli in virgola mobile).

Grazie ancora per l'aiuto che mi state dando!

Byee

Link al commento
Condividi su altri siti

Ciao Roberto 82,

// INIZIO DELLA FUNZIONE Vout= (Vin*K)+(1-K)*(Vout)

L DB1.DBD 2 //MOLTIPLICA Vin*K E LO TRASFRERISCE

L DB2.DBD 20 //IN MD 80

*R

T MD 80

L 1.000000e+000 //RICAVA (1-K) E TRASFERISCE IL RISULTATO

L DB1.DBD 2 //IN MD 8

-R

T MD 8

L MD 8 // MOLTIPLICA Vout*(1-K) E LO TRASFERISCE IN MD 90

L MD 2

*R

T MD 90

L MD 80 //RICAVA IL NUOVO VALORE DI Vout

L MD 90

+R

T MD 2

L MD 2 //TRASFERISCE IL NUOVO VALORE DI Vout IN USCITA

T AD 0

Come mai realizzi un FIFO in Doppie parole a partire dall'indirizzo DBD0 , (DBB0+DBB1+DBB2+DBB3) e poi nei tuoi calcoli vai a prelevare il valore da DBD2?

Non e' corretto.

Per la lettura dei valori dalla DB, ribadisco che esistono vari modi , ma dipende dal tipo di progetto ,CPU e hw che hai a disposizione.

Modo piu' economico, ma non piu' semplice:

Dalla tabella DB "on line" copia/incolla..... ma la singola riga!:blink:

Modo normale:

Tramite una connessione MPI/Profibus/Ethernet verso un dispositivo come un PC, o un HMI o SCADA.

Sarei curioso di sapere se esistono altri modi.

Ivan

Link al commento
Condividi su altri siti

Come mai realizzi un FIFO in Doppie parole a partire dall'indirizzo DBD0 , (DBB0+DBB1+DBB2+DBB3) e poi nei tuoi calcoli vai a prelevare il valore da DBD2?

Non e' corretto.

Che furbo che sono... non me ne ero proprio accorto, si vede che correggendo il programma mi è sfuggito! Grazie!

Modo piu' economico, ma non piu' semplice:

Dalla tabella DB "on line" copia/incolla..... ma la singola riga!:blink:

Modo normale:

Mi sa tanto che dovrò fare così! :unsure:

Scriverò i dati uno per uno nella DB e gli andrò a visualizzare on-line.

Grazie!

byee

Link al commento
Condividi su altri siti

xSAVINO: Sostanzialmente il problema che permane è che vorrei salvare da qualche parte i dati in uscita da AD0
Ti servirebbe anche un tempo di scansione e un generatore di valori per Vin per il disegno del trend
Per quanto rigurada il tempo di scansione, mi riferivo appunto al clock di campionamento che salvera' ogniuno degli elementi univoci nel codominio DB_Vout...
non ho una DB solo per le Vin ma unicamente un valore Vin =0 in DB1 che forzo al valore che desidero tramite la tabella delle variabili. Il tipo di elementi usati sono delle DW, probabilmente dovrò poi modificarlo in base a future richieste (ho usato le DW perchè supponevo calcoli in virgola mobile).
Va bene.. ma il DB_Vout che conterrebbe l'array di elementi rappressentanti il trend della funzione lo ci devi creare. Poi, quale sarebbe l'intervallo del input a 32 bit Vin..? dovresti anche definire il commincio e fine della funzione.. cioe' quando comminci a salvare nella DB_Vout, e quando finisci... a ritmo (frequenza) di clock ... (spezzata..?)
(ho usato le DW perchè supponevo calcoli in virgola mobile).
...Si' doppia word! infatti per la rappressentazione floating point, in S7 utilizza 32 bit IEEE 754 Link..
Scriverò i dati uno per uno nella DB e gli andrò a visualizzare on-line.
Se invece ti crei il DB_Vout, potresti copiare tutto il blocco insieme in un solo colpo, anche se un trasferimento online sarebbe stato l'ideale ma trattandosi di una tesi andrebbe bene anche cosi'.
Link al commento
Condividi su altri siti

Per quanto rigurada il tempo di scansione, mi riferivo appunto al clock di campionamento che salvera' ogniuno degli elementi univoci nel codominio DB_Vout...

Il ciclo di scansione è di 20ms.

Va bene.. ma il DB_Vout che conterrebbe l'array di elementi rappressentanti il trend della funzione lo ci devi creare. Poi, quale sarebbe l'intervallo del input a 32 bit Vin..?

Questo programma in realtà va inserito in un contesto un pò più ampio, il prossimo passo sarà quello di provarlo in un attuatore di un PID. Non conosco ancora l'intervallo esatto dell'input ma dovrebbe essere da 0.0 a 100.0.

Il mio scopo per ora è quello di provare questo programma separatamente dal resto, esaminare i dati in uscita e poi confrontarli con quello che mi darebbe in uscita se "agganciato" all'attuatore.

Se invece ti crei il DB_Vout, potresti copiare tutto il blocco insieme in un solo colpo, anche se un trasferimento online sarebbe stato l'ideale ma trattandosi di una tesi andrebbe bene anche cosi'.

L'ideale sarebbe proprio creare la DB_Vout!

Link al commento
Condividi su altri siti

L'ideale sarebbe proprio creare la DB_Vout!
Dunque, dovresti creare una funzione che scrivirebbe 4 bytes(doppia word) in una data DB a partire di un diterminato offset. Questa funzione avrebbe come parametri d'input il numero di DB, l'offset(indice DB) e i valori per i 4 bytes. Poi, il valore del offset viene incrementato di 4 per ogni clock di campionamento... 0123-4567-891011.... Il tempo ciclo per il timer di campionamento (clock) sarebbe independente del tempo cilco RunTime PLC.
Link al commento
Condividi su altri siti

  • 3 months later...

Salve a tutti!

Rieccomi di ritorno con un nuovo quesito, spero che possiate aiutarmi anche questa volta! ;)

Ho un problema similare a quello proposto l'ultima volta: devo creare uan funzione di ritardo in base alla velocità di un motore.

In pratica: nella realtà ho un motore che fa scorrere un nastro a velocità diverse e devo simulare il ritardo del nastro a secondo della velocità a cui sta andando il motore.

Posso ancora utilizzare la DB per fare una pila FIFO dipendente dalla velocità? c'è qualche alttra soluzione?

grazie!

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