Показать сообщение отдельно
Старый 18.03.2013, 00:29   #9
sysline
Новичок
 
Регистрация: Feb 2013
Сообщения: 6
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Ответ: Pixel - Modbus - Комп

Всё получилось. Спасибо!!!
вот на LUA скрипты для преобразования real в два байта и обратно:
Код:
function PackIEEE754(number)  -- преобразование обычного числа в Real-pixel ( два байта i1-по адресу, i2-следующий)
    local b1, b2, b3, b4
    local i1,i2
    if number == 0 then
        return 0,0
    elseif number ~= number then
        return 0xFFFF, 0xFFFF
    else
        local sign = 0x00
        if number < 0 then
            sign = 0x80
            number = -number
        end
        local mantissa, exponent = math.frexp(number)
        exponent = exponent + 0x7F
        if exponent <= 0 then
            mantissa = math.ldexp(mantissa, exponent - 1)
            exponent = 0
        elseif exponent > 0 then
            if exponent >= 0xFF then
                return string.char(sign + 0x7F, 0x80, 0x00, 0x00)
            elseif exponent == 1 then
                exponent = 0
            else
                mantissa = mantissa * 2 - 1
                exponent = exponent - 1
            end
        end
        mantissa = math.floor(math.ldexp(mantissa, 23) + 0.5)
	b1=sign + math.floor(exponent / 2)
        b2=(exponent % 2) * 0x80 + math.floor(mantissa / 0x10000)
        b3=math.floor(mantissa / 0x100) % 0x100
        b4=mantissa % 0x100

        i2 = b1 * 256 + b2       
        i1 = b3 * 256 + b4       
        return i1,i2 
    end
end

print(PackIEEE754(20)) -- напечатает 0	16800


function UnpackIEEE754(i1,i2) -- преобразование Real-pixel( два байта i1-по адресу, i2-следующий) в число
    local b1, b2, b3, b4
    b1 = math.floor(i2 / 256)
    b2 =  i2 - b1*256
    b3 = math.floor(i1 / 256)
    b4 =  i1 - b3*256
    local exponent = (b1 % 0x80) * 0x02 + math.floor(b2 / 0x80)
    local mantissa = math.ldexp(((b2 % 0x80) * 0x100 + b3) * 0x100 + b4, -23)
    if exponent == 0xFF then
        if mantissa > 0 then
            return 0 / 0
        else
            mantissa = math.huge
            exponent = 0x7F
        end
    elseif exponent > 0 then
        mantissa = mantissa + 1
    else
        exponent = exponent + 1
    end
    if b1 >= 0x80 then
        mantissa = -mantissa
    end
    return math.ldexp(mantissa, exponent - 0x7F)
end

print(UnpackIEEE754(0,16800)) --напечатает 20
скрипты можно тестировать на http://www.lua.org/cgi-bin/demo

ps: получится ли изменить уставку t при записи в регистр pixel var0=a400#real#SCi_Уставка_t (меня смущает что это разные регистры с var22=a03f#real#SCo_Уставка_t)?
и ещё получится ли менять скорость вентилятора (хочется переводить вент установку в экономичный режим, например в ночное время или во время отсутствия хозяев дома)?
sysline вне форума   Ответить с цитированием