coquinati Inserito: 21 ottobre 2017 Segnala Share Inserito: 21 ottobre 2017 ciao a tutti. premetto che son passati 3 anni da l'ultima volta che ho aperto un programma di un plc, pochi giorni fa ho ripreso in mano per necessità anche un pò per sfida un programma che avevo scritto tempo fa. ho una struttura dati nel db di questo tipo : MDIB STRUCT MDI movement block b_176 BYTE B#16#0 b_177 BYTE B#16#0 G_1_EN BOOL FALSE enable bit for G function group 1 G_2_EN BOOL FALSE enable bit for G function group 2 b_178_2 BOOL FALSE b_178_3 BOOL FALSE X_T_EN BOOL FALSE enable bit for position / dwell time b_178_5 BOOL FALSE b_178_6 BOOL FALSE b_178_7 BOOL FALSE V_EN BOOL FALSE enable bit for velocity M_1_EN BOOL FALSE enable bit for M function group 1 M_2_EN BOOL FALSE enable bit for M function group 2 M_3_EN BOOL FALSE enable bit for M function group 3 b_179_4 BOOL FALSE b_179_5 BOOL FALSE b_179_6 BOOL FALSE b_179_7 BOOL FALSE G_1_VAL BYTE B#16#0 value G function group 1 G_2_VAL BYTE B#16#0 value G function group 2 b_182 BYTE B#16#0 b_183 BYTE B#16#0 X_T_VAL DINT L#0 value position / dwell time V_VAL DINT L#0 value velocity M_1_VAL BYTE B#16#0 value M function group 1 M_2_VAL BYTE B#16#0 value M function group 2 M_3_VAL BYTE B#16#0 value M function group 3 b_195 BYTE B#16#0 END_STRUCT Visto che non mi è permesso modificare l'ordine dei byte/bit/word ho pensato di provare attraverso l'utilizzo dei puntatori: per ora mi ero limitato a provare copiare solo i byte scrivendo cosi: AUF DI 353 AUF "SIMODRIVE_DATE_CTRL1" L P#DBX 0.0 LAR1 L DIB [AR1,P#0.0] L DIB [AR1,P#1.0] T DBB [AR1,P#0.0] T DBB [AR1,P#1.0] L DIB [AR1,P#4.0] L DIB [AR1,P#5.0] L DIB [AR1,P#6.0] T DBB [AR1,P#4.0] T DBB [AR1,P#5.0] T DBB [AR1,P#6.0] L DIB [AR1,P#16.0] L DIB [AR1,P#17.0] L DIB [AR1,P#18.0] L DIB [AR1,P#19.0] T DIB [AR1,P#16.0] T DIB [AR1,P#17.0] T DIB [AR1,P#18.0] T DIB [AR1,P#19.0] ho simulato la funzione ma mi va in stop . e credo anche di aver capito il perchè. se non ricordo male i registri AR sono registri a 32bit, son convinto di aver mandato in sovracarico il registro AR. cercando nei manuali non trovo però un istruzione che mi permetta di "pulire" tale registro. ripeto sono 3 anni abbondanti che non aprivo un programma , grazie in anticipò . Link al commento Condividi su altri siti More sharing options...
coquinati Inserita: 21 ottobre 2017 Autore Segnala Share Inserita: 21 ottobre 2017 ho fatto un casino pazzesco ,tutti errori da principiante. 1) sono andato ad aprire con l'istruzione un blocco dati dati d'istanza dentro la propria FB 2)mi ero scordato della storia dei 2 accumulatori L DIB [AR1,P#0.0] --------- CARICA IN ACCU 1 L DIB [AR1,P#1.0] --------- ACCU 1 VA IN ACCU 2 E CARICA IL VALORE IN ACCU 1 T DBB [AR1,P#0.0] -------- TRASFERISCE IL VALORE DI ACCU 1 T DBB [AR1,P#1.0] ------TRASFERISCE IL VALORE DI ACCU 1 ma esiste una funzione SFC in grado di copiare blocchi dati? . mi ricordo che usavo la SFC20 blk_move però può essere usata solo per dati di tipo uguale Link al commento Condividi su altri siti More sharing options...
batta Inserita: 21 ottobre 2017 Segnala Share Inserita: 21 ottobre 2017 Quote mi ricordo che usavo la SFC20 blk_move però può essere usata solo per dati di tipo uguale Non mi pare. Alla SFC20 BLKMOVE passi i paramatri in formato ANY, e non gliene frega niente di cosa contengano i DB. Nel 1500 c'è l'istruzione MOVE_BLK che presenta i limiti da te citati, ma esiste ancora anche l'istruzione BLKMOVE (nelle istruzioni di base, gruppo Legacy, non disponibile per il 1200) che si comporta alla vecchia maniera. Link al commento Condividi su altri siti More sharing options...
mrsunday Inserita: 22 ottobre 2017 Segnala Share Inserita: 22 ottobre 2017 nel 1200 c'è la funzione Poke_blk (SCL) che ti permette di muovere dati da un DB all'altro o all'interno dello stesso DB Link al commento Condividi su altri siti More sharing options...
batta Inserita: 22 ottobre 2017 Segnala Share Inserita: 22 ottobre 2017 Quote nel 1200 c'è la funzione Poke_blk (SCL) che ti permette di muovere dati da un DB all'altro o all'interno dello stesso DB Vero. Disponibile, ovviamente, anche per il 1500, spesso può risultare più comoda di BLKMOVE, perché come parametri richiede numero DB e offset, più facili da gestire in modo dinamico rispetto ad una variabile ANY. Poi, da TIA V14 è possibile inserire segmenti in SCL, e questo rende molto pratico l'utilizzo di POKE_BLK anche in blocchi in KOP. Link al commento Condividi su altri siti More sharing options...
DesmoGiec Inserita: 23 ottobre 2017 Segnala Share Inserita: 23 ottobre 2017 blkmov è limitata nel senso che devi definire la db d'origine e destinazione, altre limitazioni non ne conosco (per questo motivo mi son creato un mio blkmov ) comunque sia.. Dato che devi rispettare la struttura d'origine non hai problemi, ti basta usare blkmov così Link al commento Condividi su altri siti More sharing options...
coquinati Inserita: 23 ottobre 2017 Autore Segnala Share Inserita: 23 ottobre 2017 il 21/10/2017 at 21:19 , batta scrisse: Non mi pare. Alla SFC20 BLKMOVE passi i paramatri in formato ANY, e non gliene frega niente di cosa contengano i DB. Nel 1500 c'è l'istruzione MOVE_BLK che presenta i limiti da te citati, ma esiste ancora anche l'istruzione BLKMOVE (nelle istruzioni di base, gruppo Legacy, non disponibile per il 1200) che si comporta alla vecchia maniera. salve flavio. ho dimenticato di specificare che lavoro con una unita s7-300 , come mi ha detto sto eseguendo delle prove con la sfc 20, ma resta il fatto che io devo parametrizzare il formato ANY , e anche li mi sono sorti dei dubbi di questo tipo: AUF "SIMODRIVE_DATE_CTRL1" //*********************** LAR1 P##Sorgente_dati // ANY //*********************** L W#16#1002 // carico ID tipo ( 10) , è il tipo dati(02)=byte --------------> ma è corretto impostarla con 02 che equivale a tipo dati byte? T LW [AR1,P#0.0] L 20 // NR byte da trasferire, fattore di ripetizione T LW [AR1,P#2.0] L #DB_SORGENTE // nr db sorgente T LW [AR1,P#4.0] L 0 // (0=inizio lettura) SLD 3 // OD DW#16#85000000 // (85=blocco dati instanza) T LD [AR1,P#6.0] // // //*************************** LAR1 P##Destinatario_dati // ANY //*************************** L W#16#1002 // ID code & type T LW [AR1,P#0.0] L 20 // Nr. bytes T LW [AR1,P#2.0] L #DB_DESTINAZIONE // Nr. DB destination = DB 20 T LW [AR1,P#4.0] L DBB 0 // From DW number SLD 3 OD DW#16#84000000 T LD [AR1,P#6.0] CALL "BLKMOV" SRCBLK :=#Sorgente_dati RET_VAL:=#ret_val_sfc20 DSTBLK :=#DB_DESTINAZIONE 11 ore fa, DesmoGiec scrisse: blkmov è limitata nel senso che devi definire la db d'origine e destinazione, altre limitazioni non ne conosco (per questo motivo mi son creato un mio blkmov ) comunque sia.. Dato che devi rispettare la struttura d'origine non hai problemi, ti basta usare blkmov così cioè io volendo posso saltare tutto il procedimento di parametrizzazione dei dati tipo ANY? GRAZIE MILLE A TUTTI:) Link al commento Condividi su altri siti More sharing options...
batta Inserita: 23 ottobre 2017 Segnala Share Inserita: 23 ottobre 2017 Quote cioè io volendo posso saltare tutto il procedimento di parametrizzazione dei dati tipo ANY? Certo! La creazione del puntatore di tipo ANY ti serve solo se hai bisogno di modificare dinamicamente gli indirizzi. Se le aree da copiare sono fisse, scrivi direttamente come nell'esempio di DesmoGiec. Che poi, se devi modificare dinamicamente gli indirizzi, fai prima a crearti una tua funzione di copia area piuttosto che la funzione per creare i puntatori ANY. Link al commento Condividi su altri siti More sharing options...
coquinati Inserita: 26 ottobre 2017 Autore Segnala Share Inserita: 26 ottobre 2017 il 23/10/2017 at 19:51 , batta scrisse: Certo! La creazione del puntatore di tipo ANY ti serve solo se hai bisogno di modificare dinamicamente gli indirizzi. Se le aree da copiare sono fisse, scrivi direttamente come nell'esempio di DesmoGiec. Che poi, se devi modificare dinamicamente gli indirizzi, fai prima a crearti una tua funzione di copia area piuttosto che la funzione per creare i puntatori ANY. grazie molte batta per le risposte. comunque non riesco a capire perchè il codice sopra (parametrizzazione dei daty tipo any) . lei a primo impatto vede qualche errore ? grazie Link al commento Condividi su altri siti More sharing options...
DesmoGiec Inserita: 27 ottobre 2017 Segnala Share Inserita: 27 ottobre 2017 16 ore fa, coquinati scrisse: grazie molte batta per le risposte. comunque non riesco a capire perchè il codice sopra (parametrizzazione dei daty tipo any) . lei a primo impatto vede qualche errore ? grazie CALL "BLKMOV" SRCBLK :=#Sorgente_dati RET_VAL:=#ret_val_sfc20 DSTBLK :=#DB_DESTINAZIONE L'errore è in DSTBLK. Non è #db_destinazione ma #Destinatario_dati Link al commento Condividi su altri siti More sharing options...
coquinati Inserita: 28 ottobre 2017 Autore Segnala Share Inserita: 28 ottobre 2017 il 27/10/2017 at 10:45 , DesmoGiec scrisse: CALL "BLKMOV" SRCBLK :=#Sorgente_dati RET_VAL:=#ret_val_sfc20 DSTBLK :=#DB_DESTINAZIONE L'errore è in DSTBLK. Non è #db_destinazione ma #Destinatario_dati Grazie mille 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