<< Click to Display Table of Contents >> Navigation: Modbus Universal MasterOPC Server > Руководство по языку Lua 5.1 > Примеры и полезности > Преобразование данных > Float формат |
Float числа - это вещественное число, одинарной точности (32 бита - 4 байта). Число состоит из мантиссы, экспоненты и бита знака в следующей последовательности (Википедия:Число одинарной точности):
Формула подсчета 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.