Vai al contenuto
PLC Forum


Conversione Da Intero In Bit


Reverendo bit

Messaggi consigliati


Per come hai scritto il titolo e la domanda, sembra che tu voglia estrarre, da un numero i singoli bit. Però, appunto, non sei stato affatto chiaro:

1) un numero intero, con o senza segno, che sia ad 8, 16 o 32 bit, è contenuto all'interno, rispettivamente, di un byte, di una word, o di una dword. Questi dati possono poi essere interpretati, e ne nascono le dichiarazioni formali: char, int, unsigned int, long, etc, etc ... senza virgola od in virgola fissa; tante dichiarazioni formali per dire sempre la stessa cosa, da interpretarsi in vari modi.

2) A meno che non si tratti di numeri in formato BCD, o numeri in virgola mobile, allora non esiste più conversione, ma semmai, emplicemente adattamento di lunghezza: da byte a word oppure a dword: (8, 16 o 32 bit).

3) Quando manipoli quindi i numeri, devi, in buona sostanza, sapere se: sono in formato BCD o doppia virgola, ed allora serve un vera e propria conversione di formato. Altrimenti, devi sapere se sono memorizzati in un byte, in una word od in una dword. Un intero, ad esempio, è un numero di due byte, ovvero una word, con segno, che ha come campo possibile da -32767 a +32768. In questo caso, almeno nei PLC, non esiste la conversione da intero a bit, la variabile sarà contenuta in un area di memoria definita, con indirizzo assoluto, o simbolico che sia, basterà interrogare i 16 bit della variabile. (I PLC lo permettono). Quindi, se ad esempio la variabile "contatore" è dichiarata nella MW100, ti basterà leggere i singoli bit, nel caso di Siemens, da M101.0, fino a M100.7.

4) Non ti racconto qui la storia di little endian e big endian, prendi google, cerchi i due termini, e capirari tutto, anche perché, almeno con Siemens, bisogna sembre invertire il byte superiore con quello inferiore.

Questa la risposta per il tipo di domanda fatta nel titolo.

Link al commento
Condividi su altri siti

Forse se spiegassi con qualche parola in più quello che ti serve, si riuscirebbe anche a darti qualche "dritta".

Non temere, su PLCForum scrrivere dieci parole o cento, si spende sempre la stessa cifra: 0,00€ :)

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

Scusate per la risposta un po succinta ma è stata fatta al volo in piccolissimo buci di tempo. :rolleyes:

comunque cerco di spiegarmi un po meglio:

Per come hai scritto il titolo e la domanda, sembra che tu voglia estrarre, da un numero i singoli bit

è esattamente quello che devo fare, scambiare tramite modbus verso il DCS, sia in lettura che in scrittura dell variabili booleane e reali.

Per i reali ho usato la funzione CEIL, che converte da virgola mobile in numero DINT, per i booleani mi serviva capire come posso sapere lo stato del singolo bit all'interno dalla variabile Intera a 16bit che scrive il DCS.

Altrimenti, devi sapere se sono memorizzati in un byte, in una word od in una dword. Un intero, ad esempio, è un numero di due byte, ovvero una word, con segno, che ha come campo possibile da -32767 a +32768. In questo caso, almeno nei PLC, non esiste la conversione da intero a bit, la variabile sarà contenuta in un area di memoria definita, con indirizzo assoluto, o simbolico che sia, basterà interrogare i 16 bit della variabile. (I PLC lo permettono). Quindi, se ad esempio la variabile "contatore" è dichiarata nella MW100, ti basterà leggere i singoli bit, nel caso di Siemens, da M101.0, fino a M100.7.

Se ho ben capito:

Mettiamo il caso che il DCS mi scrive una variabile intera a 16 bit, nella DB1.DBW0 (dichiarata come intero).

Anche se la DB1.DBW0 è dichiarata come intero all'interno del DB, posso interrogare lo stato dei singoli bit come ad esempio DB1.DBX0.7 ?

E viceversa se, se volessi scrivere un singolo bit della DB1.DBW0, posso farlo ad esempio con L DB5.DBX0.7

T DB1.DBW0 (oppure DB1.DBX0.7)?

Grazie a tutti

Saluti da Reverendo

Link al commento
Condividi su altri siti

Mettiamo il caso che il DCS mi scrive una variabile intera a 16 bit, nella DB1.DBW0 (dichiarata come intero).

Anche se la DB1.DBW0 è dichiarata come intero all'interno del DB, posso interrogare lo stato dei singoli bit come ad esempio DB1.DBX0.7 ?

Si puoi benissimo, certo, non vedi il commento del singolo bit.

Volendo potresti fare anche quello copiando la tua word/Dword in un merker word/dword e nel simbolico scrivere un commento bit per bit

E viceversa se, se volessi scrivere un singolo bit della DB1.DBW0, posso farlo ad esempio con L DB5.DBX0.7

T DB1.DBW0 (oppure DB1.DBX0.7)?

In quella forma no.

Puoi però scrivere u DB5.DBX0.7 =DB1.DBX0.7 e così via per tutti i bit

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