Jump to content
PLC Forum


HERE_TO_LEARN

si possono usare i puntatori in kop?

Recommended Posts

HERE_TO_LEARN

volevo chiedervi se si possono usare i puntatori in nel linguaggio kop ?

Share this post


Link to post
Share on other sites

acquaman

Si, il nome dell'elemento seguito dalla parentesi quadra con all'interno il numero o la variabile del puntatore.

Share this post


Link to post
Share on other sites
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? 

 

 

Share this post


Link to post
Share on other sites
acquaman

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.

Share this post


Link to post
Share on other sites
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

Edited by HERE_TO_LEARN

Share this post


Link to post
Share on other sites
acquaman

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

 

Share this post


Link to post
Share on other sites
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? 

Share this post


Link to post
Share on other sites
acquaman

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

Edited by acquaman

Share this post


Link to post
Share on other sites
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

Edited by HERE_TO_LEARN

Share this post


Link to post
Share on other sites
acquaman

No, devi chiamare il nome della variabile, il TIA ci mette poi bavanti al nome il cancelletto #.

Share this post


Link to post
Share on other sites
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. 

Share this post


Link to post
Share on other sites
batta
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.

Share this post


Link to post
Share on other sites
acquaman
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.

Share this post


Link to post
Share on other sites
batta

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.
 

Edited by batta

Share this post


Link to post
Share on other sites
acquaman
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. 

Share this post


Link to post
Share on other sites
84paolo

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

Share this post


Link to post
Share on other sites
batta
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.

Share this post


Link to post
Share on other sites
HERE_TO_LEARN
il 12/7/2019 at 11:04 , batta scrisse:

 

Signori, grzie dei vostri presiossimi consigli. 

Sono riuscito ad ottenere un risultato. 

🙏🙏

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...