purebasic.info

PureBasic forum
Текущее время: Вт ноя 20, 2018 7:14 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Конвертер HEX->Float<-HEX
СообщениеДобавлено: Ср окт 07, 2009 6:54 am 
Не в сети
доцент

Зарегистрирован: Пн июн 01, 2009 8:26 am
Сообщений: 50
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Здравствуйте.
Может кто сможет помочь мне решить головоломку.

Потребовалось написать процедуры для преобразования двух HEX значений в число с плавающей точкой и обратно.

Вообще имею два байта

HEX - FC1C
BIN - 1111 1100 0001 1100
которые соответствую отрицательному числу -99,6

или

HEX - F9С6
BIN - 1111 1001 1100 0110
которые соответствую отрицательному числу - 159,4

Подозреваю что старший разряд отвечает за знак а 11 разрядов за число так как диапазон не более +-2048 а младшие 4 бита под дополнительное число. После запятой не может быть больше одного знака.

В Интернете примеров для преобразования двух байтных чисел не нашёл :(

_________________
Остановите землю, я схожу :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср окт 07, 2009 9:45 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6399
Благодарил (а): 21 раз.
Поблагодарили: 200 раз.
Пункты репутации: 52
Проверил виндоусным инженерным калькулятором твои циферьки - что то значения не сходятся. Видать даже в Мелкософте не знают алгоритма преобразования 2-х байтных HEX значений :D

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср окт 07, 2009 10:01 am 
Не в сети
доцент

Зарегистрирован: Пн июн 01, 2009 8:26 am
Сообщений: 50
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
kvitaliy, это реальные примеры из руководства по термодату

Примеры:
1. «MODBUS-ASCII»

1.1. Получение текущих измеренных значений
Запрос: :010300000004F8<CR><LF>
Ответ: :010308FC1CF9C6F770F51AA7<CR><LF>
Интерпретация полученных данных: на первом канале FC1Ch=-99,6°C; на втором канале F9C6h=-159,4°C; на третьем F770h=-219,2°C; на четвертом F51Ah=-279,0°C.
1.2. Установить значение типа аварийной сигнализации (параметр с кодом 019Ah) в «Максимум» (значение 2) на канале номер 4
(019Ah + (4-1) x 1024 = 0D9Ah)
Запрос: :01060D9A000250<CR><LF>
Ответ: :01060D9A000250<CR><LF>
Подсчет контрольной суммы LRC: 01h+06h+0Dh+9Ah+00h+02h=B0h; -B0h=50h; проверим: 01h+06h+0Dh+9Ah+00h+02h+50h=100h; lo_byte{100h}=00h


2. «MODBUS-RTU»
2.1. Получение текущих измеренных значений

Запрос: [01h][03h][00h][00h][00h][04h][44h][09h][время посылки 4х байтов]
Ответ: [01h][03h][08h][FDh][93h][FCh][1Fh][FAh][AAh][F9h][35h][EBh][42h][время посылки 4х байтов]
Интерпретация полученных данных: на первом канале FD93h=-62,1°C; на втором канале FC1Fh=-99,3°C; на третьем FAAAh=-136,6°C; на четвертом F935h=-173,9°C.
2.2. Запуск регулирования на канале номер 3 (0180h + (3-1) x 1024 = 0980h)
Запрос: [01h][06h][09h][80h][00h][01h][4Ah][7Eh][время посылки 4х байтов]
Ответ: [01h][06h][09h][80h][00h][01h][4Ah][7Eh][время посылки 4х байтов]
Интерпретация полученных данных: регулирование успешно запущено (возвращено значение 0001h).
2.3. Установка значения текущей даты и времени 11 декабря 2007 года, 15 часов, 30 минут, 20 секунд
Запрос:
[01h][10h][01h][40h][00h][06h][0Ch][00h][07h][00h][0Ch][00h][0Bh][00h][0Fh][00h][1Eh][00h][14h]
[ABh][0Bh][время посылки 4х байтов]
Ответ: [01h][10h][01h][40h][00h][06h][40h][23h][время посылки 4х байтов]

видать мантиссу надо искать :)

_________________
Остановите землю, я схожу :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср окт 07, 2009 10:17 am 
Не в сети
доцент

Зарегистрирован: Пн июн 01, 2009 8:26 am
Сообщений: 50
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
кстати интегральные термодатчики типа DS18B20 тоже имеют на выходе двухбайтный код, попробую пока узнать как с них снимать показания.

_________________
Остановите землю, я схожу :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср окт 07, 2009 10:24 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11325
Благодарил (а): 4 раз.
Поблагодарили: 441 раз.
Да чего долго голову ломать?
Всё решается очень просто. :)
Код:
1
2
3
4
5
6
7
x.w=$FC1C
y.d=x/10
Debug y
 
x.w=$F9C6
y.d=x/10
Debug y


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср окт 07, 2009 10:26 am 
Не в сети
доцент

Зарегистрирован: Пн июн 01, 2009 8:26 am
Сообщений: 50
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
А ларчик просто открывался :)
Оказалось достаточно инвертировать все биты и добавить 1
младший знак в десятичном числе это знак после запятой, мантисса не нужна, т.е это число с фиксированной точкой.
Вопрос снят :)

_________________
Остановите землю, я схожу :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср окт 07, 2009 10:32 am 
Не в сети
доцент

Зарегистрирован: Пн июн 01, 2009 8:26 am
Сообщений: 50
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр, спасибо большое, с ручника никак сьехать не мог сегодня :)

_________________
Остановите землю, я схожу :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср окт 07, 2009 12:11 pm 
Не в сети
доцент

Зарегистрирован: Пн июн 01, 2009 8:26 am
Сообщений: 50
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Похоже глюк какой то
Я считал что первый и второй Debug равносильны, а первый похоже не понимает переменную x.w

Код:
1
2
3
4
5
6
 
x.w=$FC1C
Debug Bin(x)
Debug Bin($FC1C)
Debug RSet(Bin(x ~ x), 16, "0")
 


_________________
Остановите землю, я схожу :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср окт 07, 2009 12:57 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11325
Благодарил (а): 4 раз.
Поблагодарили: 441 раз.
Это не глюк.
Надо было явно указать тип перменной в функции Bin
Код:
1
2
3
4
x.w=$FC1C 
Debug Bin(x, #PB_Word)
Debug Bin($FC1C)
Debug RSet(Bin(x ~ x), 16, "0")


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Ср окт 07, 2009 1:11 pm 
Не в сети
доцент

Зарегистрирован: Пн июн 01, 2009 8:26 am
Сообщений: 50
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Понял, спасибо.

_________________
Остановите землю, я схожу :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re:
СообщениеДобавлено: Вт мар 06, 2018 6:36 am 
Не в сети
студент

Зарегистрирован: Чт ноя 10, 2016 12:27 pm
Сообщений: 5
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
Да чего долго голову ломать?
Всё решается очень просто. :)
Код:
1
2
3
4
5
6
7
x.w=$FC1C
y.d=x/10
Debug y
 
x.w=$F9C6
y.d=x/10
Debug y



Добрый день.
Прошу помощи с преобразованием.
Работаю с устройством ОВЕН, по ModBUS получаю значения двух регистров float32
К примеру:
После запроса получаю пакет: 0A030441B50CA30050
Из него я выделяю данные: 41B50CA3
Как из этой строки получить нужное мне представление значения параметра? (в данном случае 22,63117)
Спасибо заранее.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
If OpenSerialPort (0, "COM5", 115200, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake, 1024, 1024)
  Request.s= "0a030004000284b1"
  Amount=Len(Request)
 
  If Amount>0
    *Memory=AllocateMemory(Amount/2)
    For k=0 To (Amount/2)-1
      PokeB(*memory+k,Val("$"+PeekS(@Request+(k*4),2)))
    Next  
  EndIf
  WriteSerialPortData(0, *Memory, Amount/2)
  Delay (15)
  InData = AvailableSerialPortInput (0)
  FreeMemory(*Memory)
  If InData >0
    *Memory=AllocateMemory(InData)
    For k=1 To InData
      ReadSerialPortData(0, *Memory, 1)
      Byte.s= Byte+RSet(Hex(PeekQ(*Memory)), 2, "0")
    Next
    DataByte.s = Mid(Byte, 7, Len(Byte)-10)
    DataByteBinar.s = RSet(Bin(Val("$"+DataByte)), 32, "0")
   
    Debug Byte
    Debug DataByte
    Debug DataByteBinar ; это я уже иду по пути "ручного преобразования числа"
  EndIf
 
Else
  Debug "It does not work"
EndIf
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Конвертер HEX->Float<-HEX
СообщениеДобавлено: Вт мар 06, 2018 9:23 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт апр 14, 2009 7:22 pm
Сообщений: 362
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
Просто для размышления во всех подобных случаях Union для анализа инфы не заменим!
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Structure FL
  StructureUnion
    Float.f
    Asc.a[4]
  EndStructureUnion
EndStructure
 
Define FloatHex.FL
 
FloatHex\Float = 22.63117
 
Debug FloatHex\Float
 
Debug Hex(FloatHex\Asc[0],#PB_Ascii)
Debug Hex(FloatHex\Asc[1],#PB_Ascii)
Debug Hex(FloatHex\Asc[2],#PB_Ascii)
Debug Hex(FloatHex\Asc[3],#PB_Ascii)
 
 
Debug FloatHex\Asc[0]
Debug FloatHex\Asc[1]
Debug FloatHex\Asc[2]
Debug FloatHex\Asc[3]
 
FloatHex\Float = 0
 
Debug Hex(FloatHex\Asc[0],#PB_Ascii)
Debug Hex(FloatHex\Asc[1],#PB_Ascii)
Debug Hex(FloatHex\Asc[2],#PB_Ascii)
Debug Hex(FloatHex\Asc[3],#PB_Ascii)
 
 
FloatHex\Asc[0] = 163
FloatHex\Asc[1] = 12
FloatHex\Asc[2] = 181
FloatHex\Asc[3] = 65
 
Debug FloatHex\Float



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Конвертер HEX->Float<-HEX
СообщениеДобавлено: Вт мар 06, 2018 10:42 am 
Не в сети
студент

Зарегистрирован: Чт ноя 10, 2016 12:27 pm
Сообщений: 5
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
jobless писал(а):
Просто для размышления во всех подобных случаях Union для анализа инфы не заменим!
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Structure FL
  StructureUnion
    Float.f
    Asc.a[4]
  EndStructureUnion
EndStructure
 
Define FloatHex.FL
 
FloatHex\Float = 22.63117
 
Debug FloatHex\Float
 
Debug Hex(FloatHex\Asc[0],#PB_Ascii)
Debug Hex(FloatHex\Asc[1],#PB_Ascii)
Debug Hex(FloatHex\Asc[2],#PB_Ascii)
Debug Hex(FloatHex\Asc[3],#PB_Ascii)
 
 
Debug FloatHex\Asc[0]
Debug FloatHex\Asc[1]
Debug FloatHex\Asc[2]
Debug FloatHex\Asc[3]
 
FloatHex\Float = 0
 
Debug Hex(FloatHex\Asc[0],#PB_Ascii)
Debug Hex(FloatHex\Asc[1],#PB_Ascii)
Debug Hex(FloatHex\Asc[2],#PB_Ascii)
Debug Hex(FloatHex\Asc[3],#PB_Ascii)
 
 
FloatHex\Asc[0] = 163
FloatHex\Asc[1] = 12
FloatHex\Asc[2] = 181
FloatHex\Asc[3] = 65
 
Debug FloatHex\Float


Спасибо за пищу для размышлений)
Нашлось простое решение:
Код:
1
2
Z= Val("$41B50CA3")
Debug StrF(PeekF(@Z))



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Конвертер HEX->Float<-HEX
СообщениеДобавлено: Вт мар 06, 2018 12:56 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Вт апр 14, 2009 7:22 pm
Сообщений: 362
Благодарил (а): 1 раз.
Поблагодарили: 13 раз.
Пункты репутации: 0
Это простое решение для случая, когда ваше оборудование и представления PB о форматах хранения совпадают с общепринятыми.
В моём опыте обработки телеметрии есть например история про 16 способов представления 16 разрядного отрицательного числа, когда хочется впихнуть как бы без знаковое но со знаком )))
p.s. выпрыгнуть из ограничения -32768 to +32767 до пределов 0 to +65535 но с указанием знака.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re:
СообщениеДобавлено: Вс мар 11, 2018 1:01 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 655
Благодарил (а): 2 раз.
Поблагодарили: 34 раз.
Пункты репутации: 9
andrest писал(а):
Похоже глюк какой то
Я считал что первый и второй Debug равносильны, а первый похоже не понимает переменную x.w

Код:
1
2
3
4
5
6
 
x.w=$FC1C
Debug Bin(x)
Debug Bin($FC1C)
Debug RSet(Bin(x ~ x), 16, "0")
 


У меня не скомпилилось это RSet(Bin(x ~ x), 16, "0")
пришлось сделать Fasm вставку :roll:

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
Procedure inversiy_word(*mem)
  !push esi
  !mov dword esi,[esp+8]
  !NOT word [esi]
  !pop esi
EndProcedure
 
x.w=$FC1C
Debug Bin(x, #PB_Word)
Debug Bin($FC1C )
;inversiy_word(@x)
!NOT word [v_x]
Debug RSet(Bin(x,#PB_Word), 16, "0")
 


Хотя в руководстве вроде бы пишут примеры без инверсии с минусом
вот ещё набросал процедуру для дробей(может и будет работать правильно сильно не вникал в результат) :D
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
 
Procedure inversiy_word(*mem)
  !push esi
  !mov dword esi,[esp+8]
  !NOT word [esi]
  !pop esi
EndProcedure
 
x.w=$FC1C
Debug Bin(x, #PB_Word)
Debug Bin($FC1C )
;inversiy_word(@x)
;!NOT word [v_x]
;Debug ValF(StrF(x))
Debug RSet(Bin(x,#PB_Word), 16, "0")
 
s$=StrF(x)
Procedure$ preobrazovanie_Vdrobnoe(*mem)
  Protected s.s="                 "
  !push esi
  !push edi
  !push ecx
  !mov dword esi,[p.p_mem+12]
  !mov dword edi,[p.v_s+12]
  !xor dword ecx,ecx
  !jmp ff
  !sv:
 !add dword ecx,2
  !ff:
 !cmp word [esi+ecx],0
  !jnz sv
  ;
  !cmp dword ecx,0
  !jz vyxod
  !rgw:
 !mov word ax,[esi]
  !mov word [edi],ax
  !add dword esi,2
  !add dword edi,2
  !sub dword ecx,2
  !cmp dword ecx,2
  !jnz rgw
  !mov word [edi],','
  !add dword edi,2
  !mov word ax,[esi]
  !mov word [edi],ax
  !mov word [edi+2],0
  !vyxod:
 !
  !pop ecx
  !pop edi
  !pop esi
  ProcedureReturn s
EndProcedure
Debug s$
Debug Left(s$,Len(s$)-1)+","+Right(s$,1)
Debug preobrazovanie_Vdrobnoe(@s$)
Debug preobrazovanie_Vdrobnoe(@"-996")
Debug preobrazovanie_Vdrobnoe(@"996")
Debug preobrazovanie_Vdrobnoe(@"-990")
Debug preobrazovanie_Vdrobnoe(@"990")
Debug preobrazovanie_Vdrobnoe(@"00")
Debug preobrazovanie_Vdrobnoe(@"-00")
 



Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB