Vai al contenuto
PLC Forum


Scrittura su dato USINT


luca_82

Messaggi consigliati

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.

Link al commento
Condividi su altri siti


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

 

 

Link al commento
Condividi su altri siti

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!!

Link al commento
Condividi su altri siti

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?

 

Link al commento
Condividi su altri siti

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);

 

Link al commento
Condividi su altri siti

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?

Link al commento
Condividi su altri siti

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!

Link al commento
Condividi su altri siti

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).

 

 

Link al commento
Condividi su altri siti

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.

Link al commento
Condividi su altri siti

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

Link al commento
Condividi su altri siti

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!!

Link al commento
Condividi su altri siti

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 account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...