Получение данных через HTTP запрос

Стартовая страница Форумы Понять, как работает ПО Получение данных через HTTP запрос

Просмотр 15 сообщений - с 1 по 15 (из 20 всего)
  • Автор
    Сообщения
  • #42111
    Politen
    Участник

    Добрый день.
    Требуется получить данные с устройства через http-запросы. Используя DrvHttpNotif мне удалось сформировать запрос, чтоб устройство ответило. Проблема в том, что данные содержащиеся в ответа не могу использовать. Возможно как то привязать эти данные к каналам?
    Журнал линии:
    «Отправка запроса:
    http://10.10.4.150/WTEM.HTM
    Ответ получен за 88 мс. Статус: 200 (OK)
    Содержимое ответа:
    30.5»

    #42112
    a80808
    Участник

    Увы, HttpNotif только для отправки. Разве что в файл писать а потом разбирать его скриптом…
    Сам с этим мучался

    #42115
    Mikhail
    Модератор

    Добрый день!
    Универсального драйвера, который бы разбирал ответы по HTTP, на данный момент не существует. Необходимо либо разработать драйвер под конкретное API, либо разработать универсальный драйвер.

    #42120
    Politen
    Участник

    Спасибо. Изучив код, пришел к выводу что нужно писать свой драйвер.

    #42121
    manjey73
    Участник

    я тоже писал свой. На базе HttpNotif

    Универсальный вряд ли получится написать, разве что ответы простые, а если завернутые там в json или еще во что-то то скорее всего не получится

    в принципе, если ответом всегда является строка, то может быть и получится что-то универсальное

    • Ответ изменён 1 месяц, 2 недели назад пользователем manjey73.
    #42560
    Politen
    Участник

    Драйвер написал. Но появилась следующая проблема. Часть данных, которое передает устройство в ответе — текст:»Нагрев включен». В драйвере не получается передать это значение. DeviceData.SetUnicode(Code, text,1) — ни чего не записывает. Есть какие-то ограничения по текстовым значениям (может надо делить на 8 символов)?

    #42561
    manjey73
    Участник

    Нужно, чтобы формат канала был создан как Текст Unicode (прямо из драйвера можно указывать, в том числе и при создании через Мастер).
    И скорее всего вам надо это в массив загонять, так как на один канал у вас 4 символа Unicode

    #42562
    manjey73
    Участник
     else if (channel.Value.ValType.ToLower() == "string")
     {
         try
         {
             dataLen = int.Parse(channel.Value.Length);
             format = FormatCode.String;
             dataType = (int)TagDataType.ASCII;
         }
         catch { }
     }

    это во View части.
    Указывается длина данных (хм, странно что у меня тут не делится на 8 🙂 )

    #42563
    manjey73
    Участник

    Если что, то перед тем как

    string format = FormatCode.N2;
    int cnlTypeId = CnlTypeID.Input;
    int? dataType = null;
    int? dataLen = null;
    #42564
    manjey73
    Участник

    А когда в Logic создаете

    DeviceTag deviceTag = new DeviceTag();

    То там у меня

     else if (type == "string") 
    {
    if (tags.StrLen != 0)
    {
     deviceTag.Format = TagFormat.String;
     deviceTag.DataType = TagDataType.ASCII;
    deviceTag.SetDataLen(tags.StrLen);
     }
    }
    #42565
    manjey73
    Участник

    хм, тоже странно, тоже не делю на 8 ? 🙂

    видимо ядро само это делает, или я еще где-то делаю, быстро не найду

    • Ответ изменён 3 недели, 4 дня назад пользователем manjey73.
    #42567
    manjey73
    Участник

    похоже я где-то в файле шаблона задавал длину, определив самостоятельно по полученной строке

    #42570
    Politen
    Участник

    У меня в View эти данные не нужны.
    В Logic в void Session() и идет запрос и получение данных от оборудования (в журнале линии они отображаются:
    Содержимое ответа:
    Нагрев включен
    Нет потока
    23.9
    10.0
    после обработки в журнал устройства я получаю:
    Текущие данные
    +——-+—————+———————————+———-+——-+
    | Номер | Код | Наименование | Значение | Канал |
    +——-+—————+———————————+———-+——-+
    | 1 | HeatingSt | Статус системы нагрева | — | |
    +——-+—————+———————————+———-+——-+
    | 2 | FiltrationSt | Статус системы фильтрации | — | |
    +——-+—————+———————————+———-+——-+
    | 3 | Twater | Температура воды [гр.С] | 23,800 | |
    +——-+—————+———————————+———-+——-+
    | 4 | TSPwater | Уставка температуры воды [гр.С] | 10,000 | |
    +——-+—————+———————————+———-+——-+
    | 5 | Error | Общее сообщение об ошибке | 1,000 | |
    +——-+—————+———————————+———-+——-+
    значение первых двух параметров пустые. Вопрос в том, вообще возможно в значение передать полученный текст?

    #42571
    manjey73
    Участник

    Да, надо при создании тегов внутри Logic указать, что это строковые данные.
    я же выше код привел, вы же знаете какие именно каналы у вас строковые, вот им и надо назначить

    deviceTag.Format = TagFormat.String;
    deviceTag.DataType = TagDataType.ASCII;
    deviceTag.SetDataLen(tags.StrLen);

    tags.StrLen — это скорее всего длина данных канала, например 5 = 20 символов Unicode, ну и соответственно вместо ASCII у вас будет Unicode

    #42572
    manjey73
    Участник

    Там, где вы в Logic создаете Twater, TSPwater и так далее надо явно указать, какие они будут.
    Иначе Коммуникатор все в double по умолчанию преобразовывает.

    Во View нужно подобное, чтобы создавать каналы мастером создания каналов.

    • Ответ изменён 3 недели, 4 дня назад пользователем manjey73.
Просмотр 15 сообщений - с 1 по 15 (из 20 всего)
  • Для ответа в этой теме необходимо авторизоваться.