Показано с 1 по 4 из 4

Тема: Протокол ОВЕН

  1. #1

    Question Протокол ОВЕН

    Делаю модуль (класс) для работы с устройствами ОВЕН на 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??
    Последний раз редактировалось O_o; 23.07.2011 в 13:54.

  2. #2

    По умолчанию

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

  3. #3

    По умолчанию

    Благодарю за помощь!
    Почитав про 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
    Последний раз редактировалось O_o; 05.08.2011 в 06:59.

  4. #4

    По умолчанию

    Так держать, коллега!)

Ваши права

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