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

Тема: Обработка данных из протокола ОВЕН

  1. #1

    По умолчанию Обработка данных из протокола ОВЕН

    Получаю кадр по протоколу ОВЕН. Получаю адрес, признак запроса ,размер блока, хэш и 4 бита данных. Эти биты данных перевожу во флоат и получаю огромное число (при нуле градусов = 1,026399E+09, в которое и намёка нет на нужное мне значение. Причём заметил, что приращение этого числа не линейно по сравнению с приращением температуры на приборе. Возле нуля градусов на каждую 0.1 градуса это число изменяется примерно на 0.01. А возле 60 градусов оно изменяется только примерно на 0.0001. И чем дальше тем менее заметны изменения.
    Вопрос в следующем! Как получить именно значение температуры, которое выдаёт прибор.

  2. #2
    Пользователь
    Регистрация
    08.12.2014
    Адрес
    г.Тейково Ивановской обл.
    Сообщений
    239

    По умолчанию

    Добрый вечер!
    При работе с приборами ОВЕН использую функции из проверенной библиотеки ввода/вывода owen_io.dll.
    Особых проблем с использованием не было.
    С уважением

  3. #3

    По умолчанию

    Спасибо за ответ! С библиотекой без проблем. Я без неё делаю. Просто нужно будет реализовать чтение из трм на мк. Всё сделал кроме последнего этапа - интерпретация 4-х байт во флоат. На компе в этом помогла функция BitConvert.toSingle()

    Byte_ch(5) = (Byte_buff(9) << 4) Or (Byte_buff(10))
    Byte_ch(4) = (Byte_buff(11) << 4) Or (Byte_buff(12))
    Byte_ch(3) = (Byte_buff(13) << 4) Or (Byte_buff(14))
    Byte_ch(2) = (Byte_buff(15) << 4) Or (Byte_buff(16))
    ' Byte_ch(1) = (Byte_buff(17) << 4) Or (Byte_buff(18))
    ' Byte_ch(0) = (Byte_buff(19) << 4) Or (Byte_buff(20))

    DATA_R = BitConverter.ToSingle(Byte_ch, 2) 'Тут уже реальная температура

    А вот как на СИ это организовать такой перевод?

  4. #4

    По умолчанию

    Всё получилось)))
    data[3]=65;
    data[2]=151;
    data[1]=46;
    data[0]=55;

    value = *(float*)&data;

    Беру адрес массива байт и принудительно говорю копилятору, что это не байт а флоат. Соответственно он берёт первые 4 байта (тип флоат занимает 4 байта) и интерпретирует их как число типа флоат.
    В переменной value теперь число 18,89.......ну и там ещё много ненужных цифр.

  5. #5

    По умолчанию

    доброе утро. а контрольная сумма не как по modbus ?полином 8F 57?
    Последний раз редактировалось rekbrjaaa; 20.12.2016 в 15:21.

  6. #6

    По умолчанию

    Да, вот расчёт
    /* расчет контрольной суммы */
    unsigned short owenCRC16(unsigned char* packet, size_t length)
    {
    size_t i, j;
    unsigned short crc;
    crc = 0;
    for (i = 0; i < length; ++i)
    {
    unsigned char b = packet[i];
    for (j = 0; j < 8; ++j, b <<= 1)
    {
    if ((b ^ (crc >> 8)) & 0x80)
    {
    crc <<= 1;
    crc ^= 0x8F57;
    }
    else
    crc <<= 1;
    }
    }
    return crc;
    }

Похожие темы

  1. Реализация протокола ОВЕН на C#
    от firefox0013 в разделе Помощь Разработчикам
    Ответов: 4
    Последнее сообщение: 16.03.2022, 13:01
  2. Ответов: 1
    Последнее сообщение: 23.04.2014, 18:58
  3. реализация протокола овен
    от Дмитрий Егоренков в разделе Помощь Разработчикам
    Ответов: 0
    Последнее сообщение: 26.02.2010, 17:35
  4. плк110+мв110 обработка данных
    от woffka в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 19.02.2010, 16:45
  5. Реализация протокола ОВЕН для S7-200
    от ksm в разделе Помощь Разработчикам
    Ответов: 2
    Последнее сообщение: 08.08.2008, 09:49

Ваши права

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