double (double float)
Работа с панелями оператора Weintek - подключение, программирование, совмещение с ПЛК
Модераторы: kiv, 8bit, VanMo
den_po » 21 ноя 2013, 09:58
Пример макроса, конвертирующего double (четыре 16-битных слова) в float (32-bit float). В примере используется жёстко заданное входное значение (заполнение массива src в начале макроса)
- Код: Выделить всё
macro_command main()
short src[4]
//используйте GetData вместо хардкода
src[3]=0x3fd4
src[2]=0x1893
src[1]=0x74bc
src[0]=0x6a7f
short dst[2]
int sign
sign = src[3] & 0x8000
int expn
expn = (src[3]>>4) & 0x7FF
if ( ( (expn & 0x700) <> 0) and ( (expn & 0x700) <> 0x700 ) ) then
//ПОТЕРЯ ЭКСПОНЕНТЫ!
end if
if (expn & 0x400) <> 0 then
expn = (expn & 0x7F) | 0x80
else
expn = expn & 0x7F
end if
int mantis
mantis = ((src[3]&15)<<19) | (src[2]<<3) | (src[1]>>13)
dst[1] = sign | (expn<<7) | (mantis>>16)
dst[0] = mantis
//сохраняем результат в LW0/LW1
SetData(dst[0], "Local HMI", LW, 0, 2)
end macro_command
-
den_po
-
- Сообщения: 436
- Зарегистрирован: 04 фев 2013, 12:25
den_po » 17 мар 2014, 12:15
Обратное преобразование
- Код: Выделить всё
unsigned short srcf32[2]
unsigned short destf64[4]
//чтение float32 из LW40/LW41
GetData(srcf32[0], "Local HMI", LW, 40, 2)
unsigned short signf32
unsigned int mantisf32
unsigned short expf32
signf32 = srcf32[1] & 0x8000
expf32 = (srcf32[1] >> 7) & 0xFF
expf32 = (expf32-127+1023) & 0x7FF
mantisf32 = srcf32[0] | ((srcf32[1] & 0x7F)<<16)
destf64[3] = signf32 | (expf32 << 4) | (mantisf32 >> 19)
destf64[2] = mantisf32 >> 3
destf64[1] = mantisf32 << 13
destf64[0] = 0
//запись float64 в LW50/LW51/LW52/LW53
SetData(destf64[0], "Local HMI", LW, 50, 4)
-
den_po
-
- Сообщения: 436
- Зарегистрирован: 04 фев 2013, 12:25
Вернуться в Weintek
Кто сейчас на конференции
Сейчас этот форум просматривают: Google [Bot] и гости: 9