PDA

Просмотр полной версии : Протокол ОВЕН



O_o
23.07.2011, 11:50
Делаю модуль (класс) для работы с устройствами ОВЕН на vb2010 для wince 5.0

Изучил исходник owen_protocol.c и Официальное описание протокола обмена по RS485 приборов фирмы ОВЕН(15.01.07).doc.

Не могу разобраться как представляются и помещаются данные(параметры) в Frame ОВЕН.
Пример owen_protocol.c написан для функции 'read'.

Например для ReadFloat24(25,0,'r.oe',1#,-1) , где 1# устанавливает 1 на дискретном выходе, asciiframe выглядит так #HPGJUOPKJVOGGGGUGQ

Здесь JVOGG - поле данных во фрейме #HPGJUOPKJVOGGGGUGQ
JVOGG = 0011 1111 1000 0000 0000, где тут знак, экспонента и мантисса?

Как представить 1 , чтобы получилось JVOGG?? :rolleyes:

Enst
01.08.2011, 16:55
Добрый день, O_o. Поле данных в вашем случае будет не JVOGG, а JVOGGG.
Что соответствует 0x3F 0x80 0x00.
Если представить в двоичной форме, то 0b00111111 0b10000000 0b00000000.
Для всех чисел формата с плавающей запятой знаковый бит- всегда старший. Экспонента следующие восемь бит, включая старший бит второго байта. Всё остальное- мантисса.
Этот формат отличается от обычного float32- отрезанием самого младшего байта мантиссы.
Вот несколько чисел, для справки..
0,55--> 0x3F 0x0C 0xCC 0xC
0,99--> 0x3F 0x7D 0x70 0xA4

O_o
04.08.2011, 09:38
Благодарю за помощь! :)
Почитав про float32 (IEEE 754), узнал еще, что из экпоненты надо вычитать 127.

Может кому понадобиться, ниже привожу пример функции на VB .NET для конвертации чисел с плавающей точкой в байты:

Для Float24:

Private Sub GetByteFromFloat24(ByVal fdata As Single, ByRef data0 As Byte, ByRef data1 As Byte, ByRef data2 As Byte)
Dim arr(3) As Byte
Dim value As Single
value = fdata
arr = BitConverter.GetBytes(value)
data0 = arr(3)
data1 = arr(2)
data2 = arr(1)
End Sub

Для Float32:

Private Sub GetByteFromFloat32(ByVal fdata As Single, ByRef data0 As Byte, ByRef data1 As Byte, ByRef data2 As Byte, ByRef data3 As Byte)
Dim arr(3) As Byte
Dim value As Single
value = fdata
arr = BitConverter.GetBytes(value)
data0 = arr(3)
data1 = arr(2)
data2 = arr(1)
data3 = arr(0)
End Sub

Enst
04.08.2011, 14:04
Так держать, коллега!):)