marcob1984 Inserito: 28 luglio 2017 Segnala Share Inserito: 28 luglio 2017 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 More sharing options...
DesmoGiec Inserita: 28 luglio 2017 Segnala Share Inserita: 28 luglio 2017 Edit, avevo letto male ed avevo scritto il codice per campionare ogni ora. Modifico ed aggiorno Link al commento Condividi su altri siti More sharing options...
DesmoGiec Inserita: 28 luglio 2017 Segnala Share Inserita: 28 luglio 2017 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 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) Come vedi punta ad H9 (ore 9) decimo array (minuti 10) Ciao! Link al commento Condividi su altri siti More sharing options...
marcob1984 Inserita: 28 luglio 2017 Autore Segnala Share Inserita: 28 luglio 2017 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 More sharing options...
DesmoGiec Inserita: 28 luglio 2017 Segnala Share Inserita: 28 luglio 2017 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 More sharing options...
marcob1984 Inserita: 28 luglio 2017 Autore Segnala Share Inserita: 28 luglio 2017 Grazie ancora, funziona alla grande 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 Sono alle prime armi con puntatori e spostamenti.... Link al commento Condividi su altri siti More sharing options...
DesmoGiec Inserita: 28 luglio 2017 Segnala Share Inserita: 28 luglio 2017 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 More sharing options...
marcob1984 Inserita: 28 luglio 2017 Autore Segnala Share Inserita: 28 luglio 2017 Chiaro, sei stato di grandissimo aiuto! Alla prossima DesmoGiec!!!! Ho e avrò sempre bisogno di voi 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