Вывод параметров Json из MQTT

Помечено: ,

Просмотр 11 сообщений - с 1 по 11 (из 11 всего)
  • Автор
    Записи
  • #29042
    DaniilOpushnev
    Участник

    Всем добрый день!

    Немного вводной информации: использую брокер Mosquitto, версия драйвера KpMQTT.dll 5.3.3.

    Суть в чем. С брокера приходят пакеты в формате Json. Соответственно, прописал конфигурационный файл для драйвера с подпиской на необходимый мне топик, прописал JSHandlerPath. Переписал файл для парсинга пакета. Настроил все необходимое в коммуникаторе.

    При публикации сообщения в формате json, в лог файле комммуникатора отображается пришедший пакет, пишет, что скрипт для парсинга отработал успешно (т.к. в самом скрипте прописана строка для этого). Однако в таблице текущих данных КП никаких абсолютно данных нет.

    Вероятно, в скрипте нужно прописывать команды на передачу тега в канал, но при попытке команд SetCnldata или WriteCnldata не работает, по лог файлу пишет, что не опознанная команда. Значит ее нет в библиотеке Jint.dll, которая идет в архиве с драйвером.

    Подскажите, что я упустил? Может есть какие то другие команды для этого?

    P.S. Мой первый опыт, я не программист, сильно не ругайтесь 🙂

    #29043
    DaniilOpushnev
    Участник

    P.S.S. При отправке данных не в формате json, показание отображается в таблице текущих данных КП.

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

    Добрый день! Сравните синтаксис JS с примером, учитывая регистр символов. Возможно, удобнее сразу перейти на 6-ю версию, т. к. драйвер MQTT был переработан.

    #29060
    DaniilOpushnev
    Участник

    В примере был следующий код:

    var data = JSON.parse(InMsg);
    
    jsvals[0].TagName = "My tag";
    jsvals[0].Stat = data.Stat;
    jsvals[0].Val = data.Val;

    Мой код выглядит так:

    var data = JSON.parse(InMsg);
    
    jsvals[0].time = data.time;
    jsvals[0].type = data.type;
    jsvals[0].temp = data.temp;
    jsvals[0].hum = data.hum;
    jsvals[0].press = data.press;
    jsvals[0].status = data.status;
    jsvals[0].signal = data.signal;

    Вроде как отличий по синтаксису нет.

    У нас уже есть функционирующий проект на версии 5, поэтому на 6 версию достаточно проблематично перейти, хотелось бы все реализовать на 5.

    Может как то влиять настройка входных каналов во вкладке «Система» на отображение значений в таблице текущих данных?

    #29061
    DaniilOpushnev
    Участник

    Кстати, с кодом из примера, передача данных работала частично, то есть, посылал пакет { «Val»: 12.3, «Stat»: 1 } и отображалось в таблице как MyTag = 12.300, значение Stat никак не отражалось.

    #29064
    manjey73
    Участник

    Значение stat в явном виде и не отражается. 1 = значит достоверное
    0 — не достоверное и будут --- или можете вместо 1 задать 2, и так далее и увидеть как изменится цвет текста…

    #29066
    a80808
    Участник

    К началу темы — так можно же подписаться на конкретный топик и получать сразу в канал значение этого топика. В 5 версии там несколько замысловато описано а в 6 так просто сказка )))

    #29074
    DaniilOpushnev
    Участник

    Пакет json мне приходит в таком виде: { "time": 1688035347, "type": 5, "temp": 251, "hum": 461, "press": 0, "status": 192, "signal": 80 }, приходят они в топик temp/000000000000, где 000000000000 — серийный номер датчика. Если я вас правильно понял, вы предлагаете подписаться на топик temp/000000000000/hum, например, но так работать не будет. А так я и подписан на конкретный топик temp/000000000000.

    #29077
    DaniilOpushnev
    Участник

    Всем спасибо, разобрался с кодом скрипта, все заработало!

    #39743
    DaniilOpushnev
    Участник

    Всем добрый день!
    Есть устройство, которое передает данные формата json (например {"time": 1625097600, "type": 5, "temp": 250, "hum": 500, "status": 1, "signal": 2}), а так же простые строчные сообщения типа get, end. При простом скрипте парсинга json, при появлении сообщения на входе не формата json, значения в тегах сбрасываются, т.к. была ошибка выполнения скрипта. В скрипте реализовал игнорирование данные не json формата, но в таком случае все равно значения в тегах сбрасывались, доработал код, хотел, чтобы при получении обычной строки в теги передавались последние значения json пакета, но максимум добился того, что данные в тегах не сбрасываются, а устанавливаются на 0. Полагаю, так происходит из-за того, что при вызове и завершении скрипта, сохраненные данные в коде стираются.
    Может кто то сталкивался с похожей проблемой? Как сделать так, чтобы данные в тегах не сбрасывались/обнулялись?
    Использую 5ю версию scada.

    • Ответ изменён 11 месяцев, 3 недели назад пользователем DaniilOpushnev. Причина: пояснение
    #39757
    Mikhail
    Модератор

    чтобы при получении обычной строки в теги передавались последние значения json пакета, но максимум добился того, что данные в тегах не сбрасываются, а устанавливаются на 0.

    Добрый день!
    Предыдущие данные негде взять на уровне драйвера. Эту функцию можно реализовать с помощью формул каналов. Переходите на Rapid SCADA 6 (безотносительно Вашего вопроса).

Просмотр 11 сообщений - с 1 по 11 (из 11 всего)
  • Для ответа в этой теме необходимо авторизоваться.