Vai al contenuto
PLC Forum


Puntatore S7-1200


starktony

Messaggi consigliati

Buongiorno,

sto usando un s7-1200 e non mi è chiara una cosa:

ho un array di booleani composta da 32 elementi: NOK [1..32] OF BOOL. Tramite un indice riesco a impostare gli elementi dell'array: NOK[INDEX] e fino a qui nessun problema.

Vorrei fare un controllo sull'array del tipo: alzare un ulteriore bit se almeno uno dei 32 bit dell'array è a 1.

Non riesco a capire come fare con le db ottimizzare, in precedenza avrei poturo controllare la doppia word dell'array comparandola con zero oppure usando una OR ecc ecc, ora che non ci sono gli indirizzi fisici come faccio a fare una cosa del genere?

Grazie

Link al commento
Condividi su altri siti


Fai un ciclo FOR che controlla tutti i bit, oppure usi la "sovrapposizione delle variabili con AT", oppure usi un puntatore per leggere tutta la variabile da 32 bit.

Link al commento
Condividi su altri siti

Grazie per la risposta Batta.

 1. Il ciclo for dovrei farlo in slc vero? È la soluzione a cui stavo pensando.

2. Non so cos'è la sovrapposizione delle variabili con AT potresti darmi qualche rifermimento sul manuale?

3. Come faccio a creare un puntatore che mi legga la variabile a 32 bit se non c'è un indirizzo. Ho letto che i parametri Variant dovrebbero fare qualcosa del genere ma poi come li comparo con quello che mi serve?

Grazie

Link al commento
Condividi su altri siti

Quote

1. Il ciclo for dovrei farlo in slc vero? È la soluzione a cui stavo pensando.

Potresti farlo anche in KOP o in AWL (AWL non con il 1200), ma sarebbe una scelta decisamente masochistica. In SCL è semplicissimo.
Poi, se hai il TIA V14, in un blocco in KOP puoi inserire un segmento in SCL.

 

Quote

2. Non so cos'è la sovrapposizione delle variabili con AT potresti darmi qualche rifermimento sul manuale?

Se nella casella "cerca" della guida in linea scrivi "sovrapposizione variabili", quello che ti interessa è una delle prime voci.

 

Quote

3. Come faccio a creare un puntatore che mi legga la variabile a 32 bit se non c'è un indirizzo. Ho letto che i parametri Variant dovrebbero fare qualcosa del genere ma poi come li comparo con quello che mi serve?

In SCL potresti usare le istruzioni PEEK e POKE.
Nel tuo caso, potresti usare l'istruzione PEEK_DWORD. Il DB dove c'è l'array però deve essere "non ottimizzato".
A questo punto, tanto vale che utilizzi direttamente l'indirizzamento assoluto.

 

La soluzione più semplice direi che è quella col ciclo FOR.

Link al commento
Condividi su altri siti

  • 1 year later...

Ciao Starktony, un'altra soluzione che ti permetterebbe di rimanere totalmente nel 'mondo' del simbolico, è quella di creare un'altro array identico (magari nelle temporanee così non ti occupa spazio e viene sempre forzato tutto a FALSE). Questo array può esserti utile per due motivi:

- Se vuoi azzerare tutto l'array in una volta sola puoi farlo con un semplcie MOVE dell'array temporaneo su quello di lavoro;

- Se vuoi sapere se almeno un bit è a TRUE, basta confrontare i due array (con la semplice istruzione di confronto, da una delle ultime versioni del TIA è possibile confrontare anche i VARIANT). Se il risultato del confronto è TRUE allora l'array d lavoro è tutto a zero, altrimenti esiste almeno un bit a TRUE.

 

Questo funziona chiaramente con qualsiasi tipo di dato e quindi anche Struct per esempio (per azzerarle o confrontarle con dei valori particolari).

Link al commento
Condividi su altri siti

  • Livio Orsini locked this discussione
Ospite
Questa discussione è chiusa alle risposte.
×
×
  • Crea nuovo/a...