Quantcast
Channel: Modbus – Electronic Product Design
Viewing all articles
Browse latest Browse all 16

Byte ordering

$
0
0

Modbus is a big-endian protocol.  The more significant byte of a 16-bit value is sent before the less significant byte

So, for bytes on the bus a UInt16 is sent like this:

Bits15:8 | Bits7:0

Converting the modbus 16 bit words

UInt32 conversion

UInt16[0] | UInt16[1]

UInt64 conversion

UInt16[0] | UInt16[1] | UInt16[2] | UInt16[3]

Float conversion

UInt16[0] | UInt16[1]


	//Converting big endian modbus registers to float on little endian windows (ModbusRegisterValues[0] was received first)
	array<Byte>^byteArray = gcnew array<Byte>(4);
	byteArray[3] = (Byte)(ModbusRegisterValues[0] >> 8);
	byteArray[2] = (Byte)(ModbusRegisterValues[0] & 0x00ff);
	byteArray[1] = (Byte)(ModbusRegisterValues[1] >> 8);
	byteArray[0] = (Byte)(ModbusRegisterValues[1] & 0x00ff);
	float my_float = BitConverter::ToSingle(byteArray, 0);

	//Converting float on little endian windows to big endian modbus registers (ModbusRegisterValues[0] will be sent first)
	ModbusRegisterValues = gcnew array <UInt16>(2);
	array<Byte>^byteArray = BitConverter::GetBytes(my_float_value);
	ModbusRegisterValues[0] = ((UInt16)byteArray[3] << 8) | ((UInt16)byteArray[2]);		//Converting float on little endian windows to big endian modbus registers
	ModbusRegisterValues[1] = ((UInt16)byteArray[1] << 8) | ((UInt16)byteArray[0]);
char conversion

	//RegisterValues[] is UInt16 array read over modbus
	array<Byte> ^NameArray = gcnew array<Byte>(10);
	NameArray[0] = (Byte)(RegisterValues[0] >> 8);
	NameArray[1] = (Byte)(RegisterValues[0] & 0x00ff);
	NameArray[2] = (Byte)(RegisterValues[1] >> 8);
	NameArray[3] = (Byte)(RegisterValues[1] & 0x00ff);
	NameArray[4] = (Byte)(RegisterValues[2] >> 8);
	NameArray[5] = (Byte)(RegisterValues[2] & 0x00ff);
	NameArray[6] = (Byte)(RegisterValues[3] >> 8);
	NameArray[7] = (Byte)(RegisterValues[3] & 0x00ff);
	NameArray[8] = (Byte)(RegisterValues[4] >> 8);
	NameArray[9] = (Byte)(RegisterValues[4] & 0x00ff);
	sTemp = System::Text::Encoding::UTF8->GetString(NameArray);
	sTemp = sTemp->Replace("\0", "");

 

 

 


Viewing all articles
Browse latest Browse all 16

Latest Images

Trending Articles





Latest Images