Vai al contenuto

Alessandro Nandi

Lettura e scrittura variabile UINT da nodo EtherCat

Recommended Posts

Alessandro Nandi

Ciao a tutti, sto sviluppando la mia prima applicazione con la CPU NX1P2 per l'aggiunta di alcune funzionalità a due macchine tampografiche. Per la prima macchina utilizzo solamente I/O digitali e il problema non sussiste, nella seconda invece utilizzo il protocollo di comunicazione EtherCat per comunicare con l'azionamento di un asse lineare dell'SMC. L'azionamento funziona a richiamo di quote, nel senso che al suo interno ha memorizzato 64 posizioni e tramite un codice binario viene selezionata una delle 64 posizioni.

Il problema è che il PLC vede gli ingressi e le uscite dell'azionamento come un dato di tipo UINT di 2 bytes, un UINT per gli ingressi dell'azionamento e uno per le uscite. Io dovrei andare a leggere e scrivere ogni singolo bit di ogni UINT. Come posso fare?

Ciao e grazie a tutti :) confido in voi ;) 

Condividi questa discussione


Link discussione
Condividi su altri siti
Ctec

La soluzione più comoda è usare una UNION. La definisci come UINT e BOOL, Così puoi indirizzare il singolo bit.

Per capire cosa sono le Union e come lavorano, fare riferimento casomai a un manuale del C.

Sostanzialmente è una variabile alla quale si può accedere in più modi, come ad esempio ogni singolo bit, ai singoli bytes, all'intera word.

Condividi questa discussione


Link discussione
Condividi su altri siti
Alessandro Nandi

Ciao Ctec, grazie mille per la risposta. Potresti per cortesia fare un mini esempio così posso capire meglio come devo fare? Poi per leggere e scrivere il singolo bit all'interno della UNION che istruzione uso?

Grazie mille ancora

Condividi questa discussione


Link discussione
Condividi su altri siti
Ctec

Ok, ho proprio un esempio funzionante da anni. E' per il NJ, ma lo NX mi pare identico. E' usato per analizzare o comandare lo stato di un inverter in Ethercat.

 

Nei Tipi di Dati definisci per esempio una Union così:

image.png.8459443b872e57bd4723e3ff7e82ddc3.png

Come vedi, si definisce un tipo che avrà accesso come word (quindi un UINT nel tuo caso) o come array di bit (matrice 0..15 di bool).

 

Definisci poi una variabile globale con tipo WordBit:

image.png.e6983d3b213e4426888539215da06923.png

Qui vedi sia la variabile di lettura (status) che di comando (cmd).

 

Ora, nella Mappa I/O, assegni tale variabile all'interfaccia col dispositivo Ethercat:

image.png.48ed75edfc06006f6dbffc9d1cb23f59.png

 

Nel tuo programma, quando vorrai leggere il singolo bit (per esempio il bit 5), userai la forma Spint_Status.b[5] mentre se usi la forma Spint_Status.W accederai a tutta la word (UINT).

Qui un esempio dove in base allo stato di un bit di stato, si scrive un comando (word) nella word di comando:

image.png.917d1f383ec3c78c1734c6e555d90b8c.png

Condividi questa discussione


Link discussione
Condividi su altri siti
Alessandro Nandi

Sono riuscito a fare quello che mi ero prefissato:)

Grazie mille:thumb_yello::thumb_yello:

Condividi questa discussione


Link discussione
Condividi su altri siti

Registrati o accedi per inserire messaggi

Devi essere un utente registrato per lasciare un messaggio. La registrazione è GRATUITA.

Crea un account

Iscriviti alla nostra comunità. È facile!

Registra un nuovo account

Connettiti

Hai già un account? Connettiti qui

Connettiti adesso


×