luca_82 Inserito: 13 ottobre 2016 Segnala Inserito: 13 ottobre 2016 Ciao a tutti. dovrei leggere e scrivere su dei dati USINT che ho in ingresso ed in uscita. Per la lettura dei dati in ingresso non ci sono problemi, ho usato la funzione TESTABIT dopo aver trasformato il dato da USINT a byte. Stessa cosa però non riesco a fare per andare a scrivere ogni singolo bit dei dati USINT che ho in uscita. Per l'esattezza io ho creato tante variabili array da 0...7 of bool quanti sono i dati USINT che devo scrivere in uscita. Nel programma vado a scrivere i singoli elementi degli array che pensavo poi di trasferire sulle variabili USINT, cosa però che non riesco a fare. Qualcuno sa dirmi quali funzioni potrebbero tornarmi utili? Ne ho provate diverse, ma il problema è che in qualsiasi funzione lui non riesce a convertire array in byte o USINT..... Ciao e grazie a tutti.
Ctec Inserita: 13 ottobre 2016 Segnala Inserita: 13 ottobre 2016 Immagino tu stia usando il SysmacStudio (non hai specificato né software né PLC...). Se così è, il sistema per avere un accesso in scrittura/lettura sia a bit che a word o byte, è quella di usare le Union. Io le uso spessisimo con dati word (16bit). Definisci quindi un tipo dati Union che chiamerai per esempio Pippo. Come membri dell'unione, avrai il primo definito come word e il secondo come array di bool (per i byte dovrebbe essere lo stesso), e per comodità li chiamiamo W il primo e b i secondi: Pippo UNION W WORD b ARRAY[0..15] OF BOOL A questo punto, definirai una variabile, locale o globale, di nome per esempio Asd con tipo Pippo Asd Pippo Se necessario la assegni anche a un indirizzo fisico (I/O, ecc) Nel tuo programma ci accederai come Asd.W per scrivere o leggere tutti i bit insieme (per esempio, se fai una Asd.W := 0; metterai a 0 tutti i bit contemporaneamente), oppure al singolo bit come Asd.b[n], dove con n specificherai il bit voluto (quindi Asd.b[3] := 1; accenderà il bit 3 della variabile, lasciando inalterati gli altri). Spero di esser stato chiaro
luca_82 Inserita: 13 ottobre 2016 Autore Segnala Inserita: 13 ottobre 2016 Ciao Ctec, hai ragione, non ho specificato che era un Plc Omron, essendo nella sezione Omron l'ho dato per scontato....errore!! Il Plc è un NJ101, e quello che veramente non mi piace di questa piattaforma è il fatto che dall'interfaccia Ethercat di un robot io prendo 32 dati USINT in ingresso e 32USINT in uscita. In realtà mi avevi già proposto questa soluzione, visto che non l'ho capita benissimo ed avevo problemi nel dichiarare le Union non l'ho applicata, ma forse mi stò complicando la vita... In realtà se ho capito bene quello che tu hai scritto sopra è per un dato USINT che io vado a leggere sia a Word che a bit (array of bool), e dovrei replicarlo per tutti e 64 i dati USINT, 32 ingressi e 32 uscite, corretto? Significa che io devo dichiarare 64 Union? Ciao grazie, e scusami se sono un pò duro!!
Ctec Inserita: 13 ottobre 2016 Segnala Inserita: 13 ottobre 2016 Le union le puoi fare con qualsiasi cosa. Per esempio potresti fare una union i cui elementi sono Word, array di 2 byte, array di 16 bit, e gestirli come ti pare a seconda di cosa devi fare. Se nel tuo caso hai 32 USINT (Unsigned Short Int che in sysmac sono 8bit, cioè un byte) che potresti definire contemporaneamente come BYTE (o USINT se lo gestirai in decimale, cosa che dubito) e come array di 8 BOOL. Il problema che hai uno scambio in USINT, dipende dal file di configurazione del robot, e Sysmac ci si adegua... Se non rammento male, a te quello che interessa è avere una gestione al bit di tali variabili. Se ti interessa solo la gestione a bit, non ti servono le Union, basta che usi gli array di bool e un'area condivisa. Cerco di spiegarmi. Te assegni a ogni USINT di ingresso e uscita una variabile definita come tale, e la assegni a un indirizzo fisico (per esempio da %D100 a %D163) Poi definisci 32+32 array di Bool a 8 elementi ciascuno e li assegni ciascuno sempre agli indirizzi di cui sopra. Avrai l'accesso in scrittura e lettura ciascuno bit a bit. E' possibile chiedere al fornitore del robot di fare un xml di configurazione che scambi i dati non a USINT singole, ma magari con array?
dott.cicala Inserita: 13 ottobre 2016 Segnala Inserita: 13 ottobre 2016 Quante complicazioni per scrivere un bit // dato_usint USINT // Dato_byte BYTE // Numero_del_bit USINT // Valore_del_bit BOOL Dato_byte:=USINT_TO_BYTE(dato_usint); OutABit(Dato_byte,Numero_del_bit,Valore_del_bit); // Oppure, per scrivere il bit 0 del dato_usint Dato_byte:=USINT_TO_BYTE(dato_usint); OutABit(Dato_byte,USINT#0,Valore_del_bit);
luca_82 Inserita: 13 ottobre 2016 Autore Segnala Inserita: 13 ottobre 2016 Per quanto riguarda il file XML in array dovrei chiedere,dubito che lo facciano ma comunque ci provo,e domani proverò anche le union!! In merito all'esempio postato da dottor Cicala è quello che avevo gatto credo,ma nel trasformare il dato da USINT a BYTE il sistema compilando mi generava degli errori!! Poi mi viene il dubbio,così facendo io prendo il dato dell'interfaccia Ethercat,lo trasformo in Byte e vado a scrivere i singoli Bit ma poi dovrei riscroverlo nell'interfaccia Ethercat giusto? Scrivendo : Dato_Usint:=Byte_to_usint(dato_byte) Dico una baggianata?
dott.cicala Inserita: 13 ottobre 2016 Segnala Inserita: 13 ottobre 2016 Affermazione corretta. Io mi creo degli FB/FC con variabili I/O e uso array....ciò che mi lascia sconcertato, fra le tante cose di questo sysmac poco intelligente... è che serva convertire un usint in byte e viceversa...deprimente!
Ctec Inserita: 14 ottobre 2016 Segnala Inserita: 14 ottobre 2016 Non è una complicazione, le Union sono un sistema ganzissimo per la gestione multipla della stessa area di memoria. C docet... Per me, scrivere OutABit(Dato_byte,Numero_del_bit,Valore_del_bit); invece di Dato_Byte.Numero_bit := valore; mi pare un'aberrazione totale e privo di immediatezza. E poi dover scrivere Dato_byte:=USINT_TO_BYTE(dato_usint); invece di non doverlo scrivere assolutamente (casting automatico), è anche peggio. Tutto ciò mi fa odiare chi ha sviluppato lo ST dell'IEC (questo problema non è solo del Sysmac, ma proprio del linguaggio normalizzato).
luca_82 Inserita: 14 ottobre 2016 Autore Segnala Inserita: 14 ottobre 2016 Scusami Ctec, quello che realmente non ho capito è questo, quando tu dici di assegnare la variabile ad un indirizzo fisico significa scrivere nella voce AT della tabella delle variabili globali %D100 giuso? Ma come faccio a farlo per le variabili USINT se hanno quella casella già compilata dalla voce : ECAT://node#1/Receive PDO 1_Rx Buffer 000_2100_00 ad esempio Quà mi sono perso, il resto è chiaro. Ciao grazie.
Ctec Inserita: 14 ottobre 2016 Segnala Inserita: 14 ottobre 2016 Ah, aspetta, ti ho fatto confusione. Scusa, ma sono al lavoro e ho la testa anche in altre cose. Dunque, l'assegnazione fisica di un qualcosa che viene/va da ethercat ha locazioni fisiche sulla rete, con quell'indirizzo che hai indicato. Il mio ragionamento era generale, per assegnazioni di variabili nella stessa area di memoria. Per aggirare il problema sopra, quando ho avuto necessità del genere, ho adottato un sistema mooolto poco elegante, ma funziona. Assegno nella Mappa I/O al device da leggere come ingresso la (o più di una) variabile, per esempio Pippo. Poi nel programma, subito all'inizio, faccio una copia della Pippo in una mia variabile globale eventualmente definita con una Union, per avere la gestione che mi pare e tutte le letture dello stato degli ingressi le faccio sulla mia globale. Per le uscite, più o meno uguale. Associo al device la variabile Pappo, ne leggo il contenuto e lo copio in una variabile globale mia definita come mi pare, uso poi la mia variabile per le operazioni di scrittura dei bit di uscita, e poi alla fine del programma scrivo il nuovo contenuto della Pappo, per aggiornare le uscite fisiche. Funziona bene perché si sfrutta il sistema a scansione dei PLC, ovviamente non puoi avere aggiornamenti immediati fuori scansione. Se usi altre reti (p.e. Ethernet/IP, ottima per I/O e più economica) puoi assegnare direttamente te le variabili in scambio, e quindi non avrai bisogno di questo lacchezzo
luca_82 Inserita: 14 ottobre 2016 Autore Segnala Inserita: 14 ottobre 2016 Scusa,e ci mancherebbe altro,anzi grazie dell'aiuto. Ora mi è chiaro il senso della Union e le varie possibilità che ho,non mi rimane che provare e prenderci un po' mano con questa piattaforma. In ogni caso posso dire che dare un giudizio totalmente negativo del sysmac e dell'NJ non è corretto,ha una velocità veramente invidiabile,però come gestisce le variabili mi fa confusione anche se alla fine se vai a guardare è simile a quello che sono abituato ad usare..... Grazie a tutti di nuovo!!
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora