marcob1984 Inserito: 12 agosto 2019 Segnala Share Inserito: 12 agosto 2019 (modificato) 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: 12 agosto 2019 da marcob1984 Link al commento Condividi su altri siti More sharing options...
batta Inserita: 12 agosto 2019 Segnala Share Inserita: 12 agosto 2019 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 More sharing options...
marcob1984 Inserita: 12 agosto 2019 Autore Segnala Share Inserita: 12 agosto 2019 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 More sharing options...
batta Inserita: 12 agosto 2019 Segnala Share Inserita: 12 agosto 2019 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 More sharing options...
marcob1984 Inserita: 12 agosto 2019 Autore Segnala Share Inserita: 12 agosto 2019 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 More sharing options...
84paolo Inserita: 12 agosto 2019 Segnala Share Inserita: 12 agosto 2019 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 More sharing options...
DesmoGiec Inserita: 13 agosto 2019 Segnala Share Inserita: 13 agosto 2019 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 More sharing options...
batta Inserita: 13 agosto 2019 Segnala Share Inserita: 13 agosto 2019 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 More sharing options...
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