Roberto82 Inserito: 4 agosto 2007 Segnala Inserito: 4 agosto 2007 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!
Roberto82 Inserita: 4 agosto 2007 Autore Segnala Inserita: 4 agosto 2007 Hemm... il disegno voleva essere così: ____IN______| FIFO|_______|FUNZIONE|_____OUT___
kamikaze Inserita: 4 agosto 2007 Segnala Inserita: 4 agosto 2007 realizzare il blocco FIFO per ritardare gli ingressiUn 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 openingL DBW8 //read 5th. FIFO positionT DBW10 //discharge on last FIFO position (FIFO Out)L DBW6 //read 4th. FIFO position T DBW8 //Shift to 5th.L DBW4 //read 3th. FIFO positionT DBW6 //Shift to 4th. FIFO position L DBW2 //read 2th. FIFO position T DBW4 //Shift to 3th. FIFO positionL DBW0 //read FIFO input word (FIFO Input)T DBW2 //Shift to second FIFO positionBE: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
Roberto82 Inserita: 4 agosto 2007 Autore Segnala Inserita: 4 agosto 2007 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.
kamikaze Inserita: 4 agosto 2007 Segnala Inserita: 4 agosto 2007 Il problema è che sono delle DW.No problem! Sciverai:L DBD16 //read 5th. FIFO positionT DBD20 //discharge on last FIFO position (FIFO Out)L DBD12 //read 4th. FIFO positionT DBD16 //Shift to 5th.L DBD8 //read 3th. FIFO positionT DBD12 //Shift to 4th. FIFO positionL DBD4 //read 2th. FIFO positionT DBD8 //Shift to 3th. FIFO positionL DBD0 //read FIFO input word (FIFO Input)T DBD4 //Shift to second FIFO positionBE:Ivan
kamikaze Inserita: 4 agosto 2007 Segnala Inserita: 4 agosto 2007 Continua:........ Funzioni da usare per shift delle le doubleWord , SHL_D , SHR_D.Ivan
Savino Inserita: 4 agosto 2007 Segnala Inserita: 4 agosto 2007 (modificato) 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: 4 agosto 2007 da Savino
Roberto82 Inserita: 5 agosto 2007 Autore Segnala Inserita: 5 agosto 2007 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 trendLa 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!
kamikaze Inserita: 5 agosto 2007 Segnala Inserita: 5 agosto 2007 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
Savino Inserita: 5 agosto 2007 Segnala Inserita: 5 agosto 2007 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 ..?
Roberto82 Inserita: 6 agosto 2007 Autore Segnala Inserita: 6 agosto 2007 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 0Dalle 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
kamikaze Inserita: 6 agosto 2007 Segnala Inserita: 6 agosto 2007 Ciao Roberto 82,// INIZIO DELLA FUNZIONE Vout= (Vin*K)+(1-K)*(Vout)L DB1.DBD 2 //MOLTIPLICA Vin*K E LO TRASFRERISCEL DB2.DBD 20 //IN MD 80*RT MD 80L 1.000000e+000 //RICAVA (1-K) E TRASFERISCE IL RISULTATOL DB1.DBD 2 //IN MD 8-RT MD 8L MD 8 // MOLTIPLICA Vout*(1-K) E LO TRASFERISCE IN MD 90L MD 2*RT MD 90L MD 80 //RICAVA IL NUOVO VALORE DI VoutL MD 90+RT MD 2L MD 2 //TRASFERISCE IL NUOVO VALORE DI Vout IN USCITAT AD 0Come 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!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
Roberto82 Inserita: 6 agosto 2007 Autore Segnala Inserita: 6 agosto 2007 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!Modo normale:Mi sa tanto che dovrò fare così! Scriverò i dati uno per uno nella DB e gli andrò a visualizzare on-line.Grazie!byee
Savino Inserita: 6 agosto 2007 Segnala Inserita: 6 agosto 2007 xSAVINO: Sostanzialmente il problema che permane è che vorrei salvare da qualche parte i dati in uscita da AD0Ti servirebbe anche un tempo di scansione e un generatore di valori per Vin per il disegno del trendPer 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'.
Roberto82 Inserita: 7 agosto 2007 Autore Segnala Inserita: 7 agosto 2007 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!
Savino Inserita: 7 agosto 2007 Segnala Inserita: 7 agosto 2007 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.
Roberto82 Inserita: 1 dicembre 2007 Autore Segnala Inserita: 1 dicembre 2007 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!
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