Vai al contenuto
PLC Forum


si possono usare i puntatori in kop?


HERE_TO_LEARN

Messaggi consigliati


HERE_TO_LEARN

Provato gia a farlo, almeno che non sbglio le sintassi, invece di scrivere db2. Dbx2.3

Scrivo db[mw10]. Dbx2.3 , ma facendo cosi non melo acetta.

Puo essere che la dichiarazione della varabile debba essere fatta con un tipo di dato specifico? 

 

 

Link al commento
Condividi su altri siti

Il TIA lavora con il simbolico, devi dichiarare un array e puoi richiamare il singolo elemento con il nome della variabile con il puntatore tra le parentesi quadre.

Non puoi lavorare ad indirizzo.

Link al commento
Condividi su altri siti

HERE_TO_LEARN

Ciao acquaman, 

Non sono riuscito ad capire

Scusa la mia ignoranza, sono dispiacuto, perdomani il disturbo. 

 

Allora da come mi hai detto ho creato un db globale nella quale ho dicherato una array di byte. 

 

Allora array di byte si chiama ist, di consegenza gli array si chiamano ist[1],, ist2],,,ist[20] ecc. 

 

Nel 'main' ho chiamato un blk move, e gli dico carcia zero e lo sposti su db[ist[1]] .dbb3 ma non melo acetta melo sottolinea ed dice sintassi non coretta. 

 

Cioe quello che non riesco ad capire perche se indirizzo un db con un numero melo acetta ed se invece di usare un numero uso una variabile x non melo deve accettare. La stessa cosa sui byte, doppio, o sui bit. 

 

-Db2. Dbx3. 0 melo acetta

-Se scrivo db[ist[1].db[ist[4]] non melo acetta. 

 

In ogni caso quei array hanno un valore lui sa dove deve andare anche se non gli compilo di default sono zero. 

 

A questo punto per il db mi puo dire che sul db locale non trovo niente, ma nel caso dei indirizzo melo deve acettare per esmp:-db1. Dbb[ist1] 

 

 

comunque cosa intendi per 'elemento'? cioe che singolo array nel nostro caso deve avere un valore iniziale? 

 

 

 

Chiedo ancora scusa per il disturbo. 

 

Grazie

 

 

 

 

Cattura 33.PNG

Modificato: da HERE_TO_LEARN
Link al commento
Condividi su altri siti

Per richiamare un elemento dell'array devi solo scrivere "Blocco_dati_1".IST[1] oppure lo puoi indicizzare con una variabile es. "Blocco_dati_1".IST[Indice] dove in funzione del valore della tua variabile indice richiama l'elemento dell'array desiderato

 

Link al commento
Condividi su altri siti

HERE_TO_LEARN

Grzie, sono riuscito a farlo.

Ti faccio una domanda forse anche stupida, si puo richiamare il db con qualche indice o vara bile? 

 Ce un altro modo indiretto per fare questo lavoro? 

Link al commento
Condividi su altri siti

Non mi risulta, ma non mi è mai capitata la necessità quindi non ho mai approfondito.

Modificato: da acquaman
Link al commento
Condividi su altri siti

HERE_TO_LEARN

Ok grazie, perche dovevo in qualche modo azzerare le memorie locaLi, gli unici due modi che mi sono venuti in mente, uno dalla db di istanza ovvero il db che mi crea lui o direttamente nel fb che stutturo, in kop non so se si possono chiamre le variabili locali? 

 

Pe esmp:- in awl basta scrivere diw11 lui va a prendersi quello locale

Modificato: da HERE_TO_LEARN
Link al commento
Condividi su altri siti

HERE_TO_LEARN

Si quello ok, intendevo se voglio resettare tutto un byte che pero a sua volta e richiamto con singli bit, invece di resettare ogni singolo bit se potevo fare 'move [0] to byte locale. 

Link al commento
Condividi su altri siti

1 minuto fa, HERE_TO_LEARN scrisse:

Si quello ok, intendevo se voglio resettare tutto un byte che pero a sua volta e richiamto con singli bit, invece di resettare ogni singolo bit se potevo fare 'move [0] to byte locale. 

 

Capisco quello che vuoi fare, ma è una pratica che si sta abbandonando.
La tendenza è quella di lavorare solo col simbolico. Inoltre, per fare quello che vorresti, dovresti impostare i DB come "non ottimizzati", e questo aumenta di molto il tempo di accesso alle variabili. Quando non si è costretti per altri motivi, sempre meglio lavorare con blocchi "ottimizzati".
Potresti organizzare i bit in strutture di 8, 16, 32 o 64 bit, ed utilizzare le istruzioni SCATTER e GATHER per trasferirli da o su variabili di tipo byte, word, dword o lword.

Questo offre anche il vantaggio di non dover modificare gli indirizzi se inserisci o rimuovi variabili dal blocco dati (e quindi andresti a modificare gli indirizzi dei bit sui quali stai lavorando).

L'uso dei puntatori veri e propri non è possibile in KOP, ma solo in AWL e in SCL. Il ricorso ai puntatori però con il TIA e le CPU 1200/1500 si può molto spesso evitare.

Non dimentichiamo che usare i puntatori ti permette di fare cose interessanti, ma rende il programma molto meno leggibile. Tanto per cominciare, una variabile alla quale accedi tramite puntatori non la trovi nei riferimenti incrociati.

Link al commento
Condividi su altri siti

32 minuti fa, batta scrisse:

L'uso dei puntatori veri e propri non è possibile in KOP

Cosa intendi puntatori veri e propri, in kop si può richiamare un elemento di un array con un puntatore.

Link al commento
Condividi su altri siti

Sì, ma quello non lo intendo come un vero e proprio puntatore, quello è l'indice di un array, e funziona benissimo anche con blocchi ottimizzati.
Quello che intendo parlando di "puntatori veri e propri", è quando lavori con variabili di tipo Pointer, ANY, e registro indirizzi.
Per questo tipo di utilizzo i blocchi devono essere "non ottimizzati", perché si fa riferimento, in modo indiretto, all'indirizzo delle variabili.
Questo, in KOP, non si può fare. Si fa in AWL lavorando sul registro indirizzi (AR), e in SCL con le istruzioni PEEK e POKE.
Pratica sempre meno in uso, perché con TIA e CPU 1200/1500 quasi sempre si possono adottare strategie diverse, e si fa tutto in simbolico, con vantaggi notevoli anche per quanto riguarda la leggibilità del codice.
 

Modificato: da batta
Link al commento
Condividi su altri siti

6 ore fa, batta scrisse:

Quello che intendo parlando di "puntatori veri e propri", è quando lavori con variabili di tipo Pointer, ANY, e registro indirizzi.

Quelle cose da nostalgici della vecchia scuola come noi. 😂😂😂😂

HERE_TO_LEARN Visto che parlavi di DB di istanza puoi usare anche le variabili con la sovrapposizione AT, così puoi avere il simbolico sia della word che dei singoli bit della word. 

Link al commento
Condividi su altri siti

se vuoi ancora puntare ai dati locali con l'indirizzo, basta che clicchi con il destro su fc o fb e poi proprietà e disabiliti la gestione ottimizzata. in questo modo i dati locali ti ritornano con l'indirizzo come erano sul 300

Link al commento
Condividi su altri siti

50 minuti fa, 84paolo scrisse:

basta che clicchi con il destro su fc o fb e poi proprietà e disabiliti la gestione ottimizzata. in questo modo i dati locali ti ritornano con l'indirizzo come erano sul 300

Sì, ma è proprio quello che, salvo strettamente indispensabile, si cerca di evitare.

I PLC S7-1200/1500 sono molto più efficienti se lavorano su blocchi ottimizzati. Siemens afferma che con i blocchi ottimizzati si lavori fino a 6 volte più veloci.
Posso dire che mi è capitato di fare alcune prove che hanno quasi confermato questa differenza di velocità.

E quello della velocità è solo un motivo, e potrebbe anche non essere il più importante.

Io cerco di evitare il più possibile di utilizzare gli indirizzi diretti, anche internamente ad un blocco.
Anche lavorando col 300, piuttosto che rischiare di trovarmi tutti gli indirizzi sballati per aver aggiunto o eliminato una variabile, preferivo lavorare con il registro indirizzi: nel registro si carica l'indirizzo della variabile (o della struttura) partendo dal nome e, se l'indirizzo cambia, non c'è bisogno di mettere le mani al codice.
Però, ripeto: con TIA e CPU 1200/1500, la necessità di usare gli indirizzi è veramente limitata a pochissimi casi.

Link al commento
Condividi su altri siti

HERE_TO_LEARN
il 12/7/2019 at 11:04 , batta scrisse:

 

Signori, grzie dei vostri presiossimi consigli. 

Sono riuscito ad ottenere un risultato. 

🙏🙏

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