Questo argomento è abbastanza specifico per il settore, se non sapete cosa sono i PLC (controllori a logica programmabile) leggete qui. Gran parte dei PLC che conosco hanno una metodologia di memorizzazione dei numeri particolare e leggermente diversa da quella utilizzata nei moderni linguaggi di programmazione. Lo scopo di questo articolo è di mostrare una classe di utilità che permette una facile conversione con questo particolare metodo di memorizzazione.
Iniziamo dal principio: il concetto del big-endian e little-endian. Quando si fa riferimento ad una delle due parole ci si riferisce a come un calcolatore memorizza dati di grandezza superiore ad un byte. big-endian indica che prima viene inserito il valore più significativo e poi quello meno significativo, per il little-endian l’esatto contrario.
Un brevissimo esempio di Big-Endian vs Little-Endian con una Word:
numero/bit
|
little endian
|
big endian
|
256
00000001.00000000
|
1
00000000.00000001 |
256
00000001.00000000 |
512
00000010.00000000
|
2
00000000.00000010
|
512
00000010.00000000 |
128
00000000.10000000
|
32768
10000000.00000000 |
128
00000000.10000000 |
Le cose cambiano quando si utilizza una doppia-word.
numero/bit
|
little endian
|
big endian
|
256
00000000.00000000
00000001.00000000
|
65536
00000000.00000001
00000000.00000000
|
256
00000000.00000000 00000001.00000000 |
512
00000000.00000000
00000010.00000000
|
2
00000000.00000010
00000000.00000000 |
512
00000000.00000000 00000010.00000000 |
128
00000000.00000000
00000000.10000000
|
2147483648
10000000.0000000000000000.00000000 |
128
00000000.00000000 00000000.10000000 |
In automazione industriale questo aspetto diventa cruciale in quanto i programmi PLC utilizzano i byte delle proprie strutture dati in maniera tale da dare ad ogni singolo bit un significato all’interno di un progetto. (ad esempio il bit 0 potrebbe indicare una valvola aperta, il bit 3 potrebbe indicare un motore in marcia, così via…). per maggiori informazioni riguardo l’ordine dei byte consultate qui.
Un’altra brevissima cosa da dire: nei PLC spesso si parla di byte, word o intero e double word o doppio intero. Può capitare che quando un programmatore PLC parla di intero si riferisce al tipo SHORT, quando parla di doppio intero si riferisce al tipo INT.
Adesso parliamo di programmazione, la nostra classe di utilità possiederà una serie di metodi in grado di convertire un array di byte in un numero a seconda del formato che volete leggere e vice-versa. Questa è la struttura della classe (Ho cercato di creare una struttura molto simile alla classe System.BitConverter del Net Framework)
nome: PLCByteConverter
metodi:
nome: PLCByteConverter
metodi:
byte[]:getBytes(short)
byte[]:getBytes(int)
byte[]:getBytes(float)
byte[]:getBytes(bool)
byte[]:getBytes(string)
byte[]:getBytes(string)
short:toShort(byte[])
int:toInt(byte[])
float:toFloat(byte[])
double:toDouble(byte[])
bool:toBool(byte[])
string:toString(byte[])
string:toString(byte[])
Bene, adesso che l’analisi del problema è stata fatta, procederò, nel prossimo post, con la scrittura del codice che implementa la classe PLCByteConverter. Scriverò il codice sia in C# che in Java, fatemi sapere se siete interessati ad avere esempi in altri linguaggi di programmazione.
Nessun commento:
Posta un commento