Jump to content
PLC Forum


marcob1984

Campionamento valore INT

Recommended Posts

marcob1984

Buongiorno a tutti,

 

come da titolo, avrei bisogno di campionare un valore ogni 100ms per un totale di 3 secondi allo scatenarsi di un evento.

Una volta riempito il "contenitore" di valori (30) devo eseguire la media degli stessi.

 

Il principio logico mi è molto chiaro per campionare il valore, mi manca la o le istruzioni che mi fanno spostare automaticamente di 2 byte l'area di memoria dentro al DB per poter scrivere il nuovo valore. Sono un neofita per quanto riguarda puntatori e operazioni di spostamento. Io ho provato con questo codice all'interno di OB35 (100ms) ma c'è qualcosa che non funziona...

 

u #evento

spb m001

spa m002

m001: l mw0

           lar1

          l #valore

          auf #db

          t dbw [ar1,p#0.0]

  

          l 2

          l mw0

          +I

          t mw0

m002: nop 0

 

ovviamente quando l'evento va a 0, rimetto a 0 la MW0 per predisporre il prossimo campionamento

 

Grazie a tutti della disponibilità

 

Edited by marcob1984

Share this post


Link to post
Share on other sites

batta

Perché non crei un array e lavori con gli indici dell'array anziché con i puntatori?

Comunque l'errore è nel fatto che MW0 parte da un valore sbagliato. Intanto, per essere usata come puntatore ti serve una MD e non una MW, e poi, non è che impostando questa MD a zero significa che punti alla prima word del DB.
Prova ad inizializzare la MD con P#DBX0.0
Un altro errore è nell'incremento. Quel 2 significa 2 bit, non 2 byte.
Quindi, o incrementi di 16, oppure incrementi di P#2.0

Assicurati poi che MD0 (quindi MB0, MB1, MB2, MB3) non sia usata per altri scopi, tipo merker di clock o altro.

Share this post


Link to post
Share on other sites
marcob1984

Grazie Batta,

 

come hai ben capito, la parte puntatori-registri-spostamenti è una scatola nera al momento per me.

Se volessi, come hai suggerito, creare un array di 30 valori es: "campionamenti" | array[0..30] | INT, come suggerisci di procedere per salvare il dato ogni 100 ms?

Io pensavo di appoggiarmi all'OB35, leggere il valore e trasferirlo e ad ogni richiamo dovrei comunque spostarmi di 2byte...

Share this post


Link to post
Share on other sites
batta

Per la faccenda dell'array, mi sono accorto che si parla di un S7-300. Non mi ricordo se si possono indicizzare gli elementi di un array in kop o in awl. Sicuramente si può fare in scl.

 

Per l'OB35, va bene se ti serve precisione nel tempo di campionamento. È però un problema se devi far partire il primo campionamento nell'istante preciso in cui arriva il segnale di trigger.

Attenzione poi che, se è importante il tempo di campionamento, anche il valore da campionare deve essere letto all'interno dell'OB35, e si deve fare una lettura "immediata". Se leggi un valore analogico, quindi usi la sintassi "PEWxxx", stai già facendo una lettura immediata. Se il valore da campionare viene elaborato nel programma, non ha senso eseguire il campionamento ad intervalli con alta precisione, se poi il valore che vai ad archiviare è stato calcolato in un istante diverso.

Share this post


Link to post
Share on other sites
marcob1984

Grazie ancora Batta,

 

ma il mio problema e' che non so come spostarmi  automaticamente di 2 byte una volta eseguito il trasferimento del valore...

Share this post


Link to post
Share on other sites
84paolo

potresti anche fare una cosa leggermente diversa. ti fai un DB con i tuoi 30 elementi. Dentro l'OB35 copi il dato 29 nel 30, il dato 28 nel 29 e  così via fino al primo nel secondo, poi copi il dato attuale nel primo posto. questa procedura la lasci sempre attiva. Quando ti si attiva il trigger di registrazione, attivi un ritardo di 3 secondi e poi fai direttamente la media dei 30 elementi.

Share this post


Link to post
Share on other sites
DesmoGiec

Ma perchè non usi wsr?

Mi pare sia fc90 dei blocchi siemens..

Lo richiami tramite trigger per i tuoi 3 secondi utili, ha come input un bool di reset funzione, un dato da acquisire, da dove partire a scrivere il dato nella destinazione, la lunghezza dello spostamento.

 

Prova con quello.

 

per quanto riguarda lo spostamento dei 2 byte, a fine trasferimento semplicemente scrivi +ar1 p#2.0

Share this post


Link to post
Share on other sites
batta
11 ore fa, marcob1984 scrisse:

non so come spostarmi  automaticamente di 2 byte una volta eseguito il trasferimento del valore...

 

A questo avevo già risposto.

14 ore fa, batta scrisse:

Un altro errore è nell'incremento. Quel 2 significa 2 bit, non 2 byte.
Quindi, o incrementi di 16, oppure incrementi di P#2.0

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...