Float формат

<< Click to Display Table of Contents >>

Navigation:  Modbus Universal MasterOPC Server > Руководство по языку Lua 5.1 > Примеры и полезности > Преобразование данных >

Float формат

Float числа - это вещественное число, одинарной точности (32 бита - 4 байта). Число состоит из мантиссы, экспоненты и бита знака в следующей последовательности (Википедия:Число одинарной точности):

preobrazovanie_dannykh.float_format

Формула подсчета Float числа:

y = (-1)^s*2^(exp-127)*(1+fraction/2^23);

Пример функции

function ToFloat(register)

   local fraction=bit.BitAnd(register,0x7FFFFF); --маскируем 23 бита - получем мантиссу

   local exp=bit.BitRshift(register,23); --смещаемся вправо на 23 бита - получаем экспоненту

   local exp=bit.BitAnd(exp,0xFF); --маскируем биты экспоненты

   local sign=bit.BitFromData(register,31); --выделяем бит знака

   local float=2^(exp-127)*(1+fraction/2^23); --вычисляем число

   if sign==true then float=float*(-1); end; --проверяем знак

   return float;

end

Пример вызова функции.

val=1042284544;

FloatNumber=ToFloat(val);

Если требуется выполнить обратное преобразование - из Float числа получить его 4 байта, можно использовать функцию server.SendAndReciveDaByMask. Для этого используется такой код:

--конвертация из float в HEX

local HexValueDump={};

function ConvertFloatToHex(val)    

   local sendmask={"float:0123"};            

   HexValueDump={};

   --псевдопосылка одного значения

   server.SendAndReceiveDataByMask(0,1,sendmask,{val},{"byte"},200,"SendCrc","SendCrc");        

   return HexValueDump;

end

--сохраняем значение и запрещаем отправку

function SendCrc(SendTable)

   for i=1,table.maxn(SendTable),1 do

       table.insert(HexValueDump,SendTable[i]);

   end                    

   return -1,SendTable;

end

Принцип работы кода следующий. В функции ConverFloatToHex объявляется маска в таблице sendmask в которой указывается тип преобразования и порядок байт. Переменная HexValueDump очищается. Затем в функции server.SendAndReceiveDataByMask происходит псевдопосылка значения в порт - отправляемое значение, преобразуется функцией в набор байт, после чего этот набор байт поступает в функцию SendCrc. В данной функции байты перекладываются в целевую таблицу HexValueDump и возвращается значение -1. Функция SendAndReciveDataByMask при получении отрицательного значения приостанавливает выполнение и не производит отправки значения. Сформированная таблица HexValueDump может быть возвращена в вызываемый код.

Пример вызова:

local HexValueDump=ConvertFloatToHex(12.3); --в таблице HexValueDump будет 4 байта представления числа 12.3

Аналогичным образом можно делать преобразования любых чисел - float, double, int32, int16.