Vai al contenuto
PLC Forum


Campionamento valore INT


marcob1984

Messaggi consigliati

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à

 

Modificato: da marcob1984
Link al commento
Condividi su altri siti


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.

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

Grazie ancora Batta,

 

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

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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

 

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