Vai al contenuto
PLC Forum


Campionamento ciclico variabile e salvataggio su DB


marcob1984

Messaggi consigliati

Buongiorno a tutti,

forse mi sto perdendo in un bicchier d'acqua...ho la necessità di campionare un valore di tipo REAL una volta al minuto per ogni giorno e salvarlo in una DB che contenga tutti i valori salvati di un giorno.

Volevo creare una FC unica da richiamare ciclicamente, quindi all'interno di essa dovrei creare un codice che mi facesse trasferisse il valore alla DB e spostare di un offset di 4 byte la porzione di memoria della DB a cui il trasferimento successivo dovrebbe puntare.

Scrivere il codice manualmente per 1440 volte mi sembra poco fattibile...

Ringrazio chiunque mi dia un aiuto o uno spunto per partire.

Link al commento
Condividi su altri siti


      CALL  "READ_CLK"
       RET_VAL:=#RTVL
       CDT    :=#D_T
      LAR1  P##D_T

      L     B [AR1,P#3.0]
      BTI   
      T     #ORA
      L     B [AR1,P#4.0]
      BTI   
      T     #MINUTO

      L     #ORA
      ITD   
      L     L#240
      *D    
      SLD   3
      LAR1  

      L     MW     0
      L     #MINUTO
      <>I   
      FP    M      2.0
      SPBN  _END
      L     #MINUTO
      L     4
      *I    
      SLD   3
      +AR1  
      L     MD    10
      AUF   "DB1"
      T     DBD [AR1,P#0.0]
_END: L     #MINUTO
      T     MW     0

Ok, ecco il codice corretto.

La db è strutturata come 24 campi da 60 array real

dJc1tDN.png

Genero il puntatore basato sull'ora.

Ogni ora ha offset di 240 byte.

Mezzanotte punta a 0

La 1 di notte punta a 240, e così via.

Controllo, ad ogni ciclo, se il minuto è cambiato rispetto il ciclo precedente (codice con il confronto tra mw0 e #minuto)

In caso sia cambiato, parto ad acquisire il dato (codice dopo fp)

Controllo il minuto ed aggiungo l'offset al puntatore generato prima.

Ad esempio, sono le 9:10 adesso.

Il puntatore originale sarà 2160

Siccome sono 10 minuti, avrò:

10*4= 40, sommati ai 2160 = 2200 (è la parte con +ar1)

ujLcRhe.png

Come vedi punta ad H9 (ore 9) decimo array (minuti 10)

 

Ciao!

Link al commento
Condividi su altri siti

Caspita DesmoGiec, un fulmine

Ti ringrazio infinitamente, hai fatto proprio tutto... per il campionamento non c'erano problemi, mi bloccavo quando dovevo spostarmi nella DB per salvare il dato.

Credo che nel tuo codice siano le seguenti istruzioni giusto?:

      L     #MINUTO
      L     4
      *I    
      SLD   3
      +AR1  
      L     MD    10
      AUF   "DB1"
      T     DBD [AR1,P#0.0]

Concettualmente l'hai pensato diverso da come ero partito io. Io avevo pensato di richiamare l'FC che doveva trasferire in quel momento il dato REAL letto nello slot della DB a partire dal primo fino al 1439esimo in OB35 (impostato al minuto).

Tu invece fai sempre elaborare il blocco e fai il confronto sul minuto.

 

Grazie mille, ora provo e poi ti faccio sapere

Link al commento
Condividi su altri siti

Si esatto, quel codice fa il puntamento preciso al minuto, partendo dall'offset generato dall'ora. Sommo poi le cose partendo proprio dal codice evidenziato qui sopra.

Potresti anche usare ob35 clockato al minuto, ma il codice è talmente scarno che se anche lo esegui ciclicamente non ha influenza sul tempo di ciclo ;)

Link al commento
Condividi su altri siti

Grazie ancora, funziona alla grande :thumb_yello::clap:

Non mi è chiara l'istruzione SLD 3.

Tu carichi il minuto, lo moltiplichi per 4 e poi sposti di 3 i bit della doppia parola :wallbash:

Sono alle prime armi con puntatori e spostamenti....

Link al commento
Condividi su altri siti

Carico il minuto e lo moltiplico per 4 perchè lavori in real, quindi in dword.

Se fosse stato in word anzichè dword, avrei fatto *2.

SLD 3 vedilo come moltiplicazione *8.

Adesso sono le 10:09.

Se moltiplicassi i 9 minuti per 4 avrei 36

Se sommassi direttamente il 36, sommerei ad ar1 il valore 36, ma in bit.

Quindi; 10:09 = puntatore dell'ora = 2400, puntatore dei minuti = 36

L'operazione corretta è 2400 + 36*8 = 2688 (il *8 è sld 3)

Senza sld3 otterresti un puntamento a 2404.4 (2400.0 + 36bit) invece di 2688

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