Vai al contenuto
PLC Forum


Media Mobile su TIA portal V15.1 e PLC 1200


Gabriele1997

Messaggi consigliati

Buongiorno,

Ho scritto un FB che dovrebbe fare la media mobile dei valori che riceve in ingresso. Ovvero prende i valori da un segnale analogico e ciclicamente li inserisce in un array che poi somma insieme e ne fa la media. Dopo però che l'array si è riempito il programma non dovrebbe svuotalo completamente l'array ma dovrebbe sostituire il valore più vecchio e sostituirlo con uno nuovo e così via ciclicamente. Sotto trovate il programma che ho scritto ma che non funziona e vorrei chiedervi se potete darmi una mano

1.PNG

2.PNG

3.PNG

Link al commento
Condividi su altri siti


dina_supertramp

Ciao Gabriele,
c'è una libreria Siemens contenete anche funzioni matematiche che fa quello che ti serve (media valori in virgola mobile, ciclica oppure a richiesta tramite trigger).
Ora sono al lavoro, non riesco ad indagare il tuo codice con calma, ma ti allego il link Siemens dove trovi quello che ti serve per andare avanti.

In STEP 7 (TIA Portal), how do you calculate a floating average value for the S7-1... - ID: 39333120 - Industry Support Siemens

Ritengo corretto il tuo voler farti la funzione da solo, è sempre utile provare a creare FB propri anche per funzioni software che vengono usate da tempo immemore, soprattutto per capire.
Un buon programmatore è la fusione di un informatico, matematico, fisico, elettronico, ma non sempre purtroppo c'è il tempo di studiare.

Link al commento
Condividi su altri siti

Grazie mille comunque per l'aiuto.

Però non posso usarlo in quanto io sto usando la versione del tia portal 15.1 e quel blocco vale dalla versione 16 in poi

Link al commento
Condividi su altri siti

Per fare quello che dici o ricominci con l'indice di dove carichi i dati dal primo una volta che sei al fondo oppure carichi i dati tramite una fifo, cioè quando devi caricare un dato fai scorrere tutti in avanti di uno (o indietro dipende da come lo guardi) e poi carichi il primo (o l'ultimo), Oppure usi una fifo con puntatore scorrevole per non dover spostare i dati

Link al commento
Condividi su altri siti

24 minuti fa, 84paolo ha scritto:

Oppure usi una fifo con puntatore scorrevole per non dover spostare i dati

 

Immagina di crearti un vettore di 10 elementi o, se ti è più famigliare, un array di 10 elemeti.

I 10 elementi saranno 10 locazioni di memoria contigue, un puntatore individua l'indirzzo.

Ammesso che "P0" sia l'indirizzo del primo elemto, avrai il secondo elemento all'indirzzo P0+x dove x vale il numero di bytes di ogni elemento.

Memorizzi la prima variabile in P0, poi incrementi di x ed andrai a memorizzare la seconda variabile; così via sino a quandoindirizzarai a P+9x, a questo punto non effettui incremento, ma riporti P a P0 così la nuova variabile andrà a sovrascrivere la variabile più vecchia; poi continui sovrascrivendo le variabili sempre sovrascrivendo la più vecchia.

Link al commento
Condividi su altri siti

dina_supertramp
16 ore fa, Gabriele1997 ha scritto:

Grazie mille comunque per l'aiuto.

Però non posso usarlo in quanto io sto usando la versione del tia portal 15.1 e quel blocco vale dalla versione 16 in poi

Ciao, se spulci online trovi le vecchie versioni compatibili con la V15-15.1 (cerca Siemens LGF Library for TIA 15).
Se non la trovi ti do una mano.

Il blocco presente in libreria "FloatingAverage" fa la media di valori in virgola mobile ciclica oppure a richiesta tramite trigger (in base a come imposti il modo di funzionamento), puoi definire la lunghezza dell'array di registro e usa il principio FIFO. Tutti i blocchi sono scritti in SCL ed aperti (puoi studiarli e modificarli).

 

Link al commento
Condividi su altri siti

Buona sera, ho integrato il blocco della libreria LGF come suggerito. Ma durante la simulazione che stavo facendo mi sono accorto di due cose:

 

1) il valore di output non varia

2) ho sempre il segnale "windowsizereached" a 1

 

Purtroppo sul manuale di questa libreria non ho trovato una risposta al perché questo non funzioni e volevo chiedere se qualcuno di voi l'avesse già utilizzata e nel caso come risolvere.

Sotto vi allego la foto di come l'ho utilizzata:

 

image.thumb.png.40bce0ef55c9160feabcf026567b54ab.png

 

Il mio intento è prendere l'ingresso del PLC, che in formato word, trasformarlo in real e passarlo al blocco (floataverage in questo caso) in modo che possa fargli la media mobile. Dopodiché lo riporto in word per utilizzarlo nel programma

Link al commento
Condividi su altri siti

Simone.Salarsi

hai impostato la funzione con Cyclic read-in (mode=2), quindi immagino che ad ogni scansione plc venga inserito un valore nell'array.

in 100 cicli di scansione hai già raggiunto la dimensione di windowsSize impostata.

 

Per il problema dell'uscita sempre a 0 non saprei, dovrei essere in simulazione e verificare online.

Io per fare una prova metterei modo  =1 e poi manualmente di tanto in tanto inserirei un valore con un trigger.

Nel frattempo puoi tenere monitorata la DB di istanza (DB25) del blocco e vedere se i valori di ingresso vengono correttamente inseriti nell'array degli elementi.

Link al commento
Condividi su altri siti

dina_supertramp
Il 20/10/2023 alle 17:27 , Gabriele1997 ha scritto:

2) ho sempre il segnale "windowsizereached" a 1

 

 

La causa sia stata già identificata da @Simone.Salarsi
In 100 cicli di scansione, hai riempito il suo buffer (dichiarato a 100)
Se metti mode = 1, il valore in ingresso verrà acquisito solo ad un fronte dell'ingresso "trigger"

Se metti mode = 2, il valore viene acquisito ciclicamente
Quando la windows size è raggiunta, il buffer viene aggiornato con principio FIFO

Vedo un errore sul codice AWL che usi per incrementare ciclicamente di 10 la tua variabile:
L'istruzione INC , incrementa con un numero intero a 8 bit. Stai operando con variabili a 32bit (.DBD)
Se vuoi rimanere in AWL Utilizza l'istruzione  +D cioè somma di interi a 32bit . (+I = somma di interi a 16bit, +R = somma di reali a 32bit)

L'errore non viene segnalato dal compilatore, può trarre in inganno, ecco come dovrebbe essere il tuo segmento 1 in AWL

L DB18.DBD28

L 10
+D

T DB18.DBD28


In ogni caso, stai usando un 1200, ti suggerisco il KOP o altro, evita AWL se non strettamente necessario/imposto (l'AWL è in disuso):
Prendi il blocco ADD in KOP (farà già lui le conversioni implicite), inserisci DB18.DB28 in IN1, inserisci 10 in IN2, e rimetti DB18.DB28 in OUT.

 

Ancora meglio: converti prima la tua analogica (invece di sfruttare le conversioni implicite) in un valore reale tramite istruzioni di conversione e poi opera solo con reali
(blocco CONV per KOP)

 

In SCL diventa così (se usi variabili real)
DB18.DBD28 := DB18.DB28 + 10.0;

 

Ti consiglio di cablare sull'ingresso "value" e sull'uscita "average" variabili di tipo REAL.
 

Link al commento
Condividi su altri siti

dina_supertramp

Errata corrige:
Il 1200 non ha AWL che io sappia, se hai inserito quel segmento non stai usando un 1200 oppure mi sono perso qualche aggiornamento per strada (uso molto poco serie 1200).

Modificato: da dina_supertramp
Link al commento
Condividi su altri siti

dina_supertramp

Ciao @Gabriele1997 ho fatto delle prove con TIA 15.1, CPU 1215C Simulata tramite PLCSIM.
Come vedi:

- Prendo una variabile REAL, la incremento di 10 ogni ciclo, fino al valore massimo di 1MLD

- Do in pasto la variabile REAL al blocco "FloatingAverage", e in uscita mi restituisce un LREAL con la media mobile
- Ho usato il blocco con mode = 2, come te. Anche con mode=1 ho provato e funziona.

- Nel DB di istanza, sono presenti nel buffer i valori come me li aspetto (incrementati di 10), e se provo con un buffer di soli 10 valori per potermi fare anche io il calcolo con calcolatrice funziona.

Ti allego qualche screen:

Codice.PNG

Istanza.PNG

Link al commento
Condividi su altri siti

Buongiorno a tutti,

Come segnalato precedentemente da voi, ho provato a far campionare manualmente i valori e ho visto che semplicemente avevo già raggiunto i 100 cicli e era attiva la funzione FIFO.

Dopo aver riempito e svuotato l'array un paio di volte il blocco a preso a funzionare senza problemi 😅

 

Purtroppo non ho una vera e propria spiegazione del perché adesso abbia cominciato a funzionare, comunque presuppongo sia una dei misteri della vita o della siemens.

Allego sotto il codice che ho sritto nel caso possa servire ad altre persone per comprendere visto che non esiste molto materiale su questa libreria

image.thumb.png.0f611c091879cf44ce89717876183f50.png

 

A Sinistra c'è il codice valido per la simulazione della media mobile per un singolo valore, a destra trovate la prova del blocco che riempie la DB d'istanza con i valori campionati

 

Spero di essere stato di aiuto e ringrazio tutti quelli che mi hanno dato una mano in questa discussione e anche per la loro pazienza

 

Link al commento
Condividi su altri siti

dina_supertramp

Bene, hai risolto.
Credo che i tuoi problemi erano i valori che gli davi in ingresso. La funzione INC sicuramente incasinava la variabile incrementata (ho cercato sui manuali Siemens, ricordavo che INC lavorava con interi a 8bit ma non la spiegazione dell'eventuale errore, ti allego la spiegazione come da manuale Siemens per  funzioni AWL)

"Le suddette operazioni non sono adatte alla matematica a 16 bit o a 32 bit, in quanto non viene effettuato nessun riporto dal byte basso della parola bassa di ACCU 1 al byte alto della parola bassa di ACCU 1. Per la matematica a 16 bit o a 32 bit si deve usare rispettivamente l’operazione +I o l’operazione +D."

 

Ciao, alla prossima

PS
Insieme alla libreria trovi il suo manuale di utilizzo, ed inoltre i blocchi non sono protetti. 
La libreria è aggiornata periodicamente, se userai quella per TIA 17 o 18 vedrai che sono state applicate migliorie, anche al blocco "FloatingAverage" ad esempio

Modificato: da dina_supertramp
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...