Alessandro Nandi Report Share Posted February 8, 2018 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 Quote Link to post Share on other sites
Ctec Report Share Posted February 8, 2018 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. Quote Link to post Share on other sites
Alessandro Nandi Author Report Share Posted February 8, 2018 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 Quote Link to post Share on other sites
Ctec Report Share Posted February 8, 2018 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ì: 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: 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: 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: Quote Link to post Share on other sites
Alessandro Nandi Author Report Share Posted February 12, 2018 Sono riuscito a fare quello che mi ero prefissato Grazie mille Quote Link to post Share on other sites