venerdì 23 maggio 2014

MAPPARE CORRETTAMENTE BYTE PLC - PARTE I

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


byte[]:getBytes(short)
byte[]:getBytes(int)
byte[]:getBytes(float)
byte[]:getBytes(bool)
byte[]:getBytes(string)
short:toShort(byte[])
int:toInt(byte[])
float:toFloat(byte[])
double:toDouble(byte[])
bool:toBool(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