Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Новинка
Распродажа
Новости
Доставка
Оплата
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Настройка
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    Форум
    RouterOS
    KNOT — маршрутизация Modbus через MQTT

    KNOT — маршрутизация Modbus через MQTT

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    KNOT — маршрутизация Modbus через MQTT, RouterOS
     
    iiLaw
    Guest
    #1
    0
    22.03.2021 15:29:00
    Привет! Очень рад по поводу KNOT, но посмотрев документацию и примеры приложений, складывается впечатление, что Modbus работает как RTU к IP клиент/сервер. Значит, похоже, что мы не можем маршрутизировать Modbus через MQTT или HTTPS REST? Спасибо, Лоренс.
     
     
     
    Beliy
    Guest
    #2
    0
    17.08.2021 19:19:00
    Modbus работает частично. Читается только holding register. Никак не получается получить ответ в формате high-low. Ответы приходят только в целочисленном формате. Экспорт данных возможен только в файл.
     
     
     
    ywilien
    Guest
    #3
    0
    18.06.2021 10:10:00
    Кто-нибудь может подтвердить возможности по Modbus? Было бы здорово иметь возможность слушать RTU/Modbus и публиковать данные в MQTT.
     
     
     
    christal87
    Guest
    #4
    0
    28.10.2021 16:14:00
    Думаю перейти от обычных шлюзов ModBus RTU->TCP к новому KNOT. RouterOS — отличный инструмент для защиты обычного ModBus/TCP трафика по публичным каналам. Ещё более компактное решение получается, если объединить всё в одном устройстве со шлюзом RTU в TCP, как в KNOT. На сегодняшний день новая документация Mikrotik на базе Atlassian Confluence пока ещё не включает команды ModBus в раздел IoT. Если я правильно понимаю: когда я хочу считать, например, значение кВт⋅ч с электросчётчика, которое представлено в формате float и хранится минимум в двух 16-битных регистрах, то на выходе получаю эти данные как два отдельных 16-битных регистра (по крайней мере в терминале RouterOS). Единственное, что можно задать — это количество регистров для чтения, а порядок байт фиксирован. Чтобы обойти это, придётся делать какую-то магию на стороне обработки данных, чтобы собрать эти части в одно корректное значение. Ты говоришь, что нельзя задать тип регистра, как в mbpoll (mbpoll … -t 3:float)? Это так же в случае удалённого запроса по IP, когда KNOT выступает как ModBus/TCP сервер? Планируется ли улучшение или развитие этого механизма в будущем?
     
     
     
    majdichebil
    Guest
    #5
    0
    08.11.2021 12:34:00
    Я вообще не нашёл способ прочитать регистры. Я пробовал poll out. Кто-нибудь может помочь, пожалуйста?
     
     
     
    denissMT
    Guest
    #6
    0
    20.12.2021 11:49:00
    В данный момент MODBUS в RouterOS может отображать только ответ на запрос с кодом функции 3 (Modbus) (то есть если устройство-«ведомый» Modbus, подключённое к KNOT, поддерживает «код функции 3»): https://help.mikrotik.com/docs/pages/viewpage.action?pageId=61046813#heading-ReadingMODBUSdatausingRouterOS. Так что пока это можно «вывести» в CLI, можно написать скрипт и отправить данные через MQTT.
     
     
     
    asiobob
    Guest
    #7
    0
    17.05.2022 07:55:00
    Я понимаю это ограничение, если вы пишете скрипты внутри RouterOS. Однако, может ли RouterOS передавать запросы/ответы с кодом функции 4 через мост RS485-TCP? Сейчас я не могу читать FC4 по TCP, но FC3 получается. Когда я использую другие шлюзы, не от Mikrotik, у меня выходит читать и передавать сообщения с FC4, поэтому и возник этот вопрос.
     
     
     
    asiobob
    Guest
    #8
    0
    18.05.2022 12:33:00
    Для тех, кто собирается использовать KNOT с MODBUS: порт RS485 «modbus» на KNOT настраивается в Winbox через меню System/ports.

    Известная проблема — RouterOS версии 6 и версии, включая 7.2.3 (текущая стабильная версия на момент этого сообщения), где настройка паритета «even» или «odd» фактически работает как «none». Если ваша сеть MODBUS использует паритет «even» или «odd», соединение не будет работать должным образом. Эта проблема исправлена в версии 7.3beta33.

    RouterOS может выступать в роли моста MODBUS RS485-TCP. Это позволяет стороннему ПО подключаться к вашей сети modbus через TCP/IP с помощью KNOT. Функция активируется в меню IOT/modbus — это меню доступно в версии 7 и только через CLI в версии 6.

    Рекомендуется настроить фаервол, так как Modbus-TCP не имеет собственной системы безопасности.

    Мост MODBUS RS485-TCP поддерживает все запросы и ответы с функциями MODBUS, которые идут от внешнего ПО. В самом RouterOS есть встроенные команды запросов modbus. Можно писать скрипты для опроса значений и передачи их в MQTT.

    Ограничение: версии RouterOS на момент этого сообщения поддерживают внутри себя запросы только с функцией 3. Если нужны другие функции, нужно активировать мост MODBUS RS485-TCP и использовать внешнее ПО.

    Надеюсь, это поможет.
     
     
     
    Chiara
    Guest
    #9
    0
    13.01.2023 14:51:00
    @asiobob спасибо за быстрый старт, можно подробнее про пункт 4? В RouterOS есть встроенные команды для опроса Modbus. Можно написать скрипты, чтобы опрашивать значения и отправлять их через MQTT.
     
     
     
    Amm0
    Guest
    #10
    0
    13.01.2023 17:54:00
    В других темах есть несколько примеров. Например: http://forum.mikrotik.com/t/mqtt-script-simple-data/162494/3
     
     
     
    Chiara
    Guest
    #11
    0
    19.01.2023 08:53:00
    Спасибо, это как раз то, что я искал, только пару вопросов: что значит "as-value once"? Это есть в официальной документации, но описания нет: https://help.mikrotik.com/docs/pages/viewpage.action?pageId=61046813

    В любом случае, всё это должно быть в скрипте, а потом в system>scheduled, так что минимальный интервал между опросами — 1 секунда? Поддерживается только read-holding-registers или есть ещё и write-holding-registers? Спасибо!
     
     
     
    Amm0
    Guest
    #12
    0
    19.01.2023 13:30:00
    Есть советы и хитрости по скриптам, которые обсуждают параметр «once»: https://wiki.mikrotik.com/wiki/Manual:Scripting_Tips_and_Tricks#Get_values_from_looped_interactive_commands_like_“monitor”

    Про «as-value»: если попробовать из CLI, заметите, что с «once», но без «as-value», например:

    /iot modbus read-holding-registers slave-id=0x03 num-regs=0x1 reg-addr=0x0 once

    эта команда просто «выводит» значения в консоль. Если убрать «once» из этой команды, увидите, что она будет бесконечно выводить значения.

    Но если вам нужно получить значение для продолжения скрипта, вы не хотите, чтобы значения выводились постоянно — «once» значит «получить первое значение и перейти к следующей команде». Если же добавить «as-value» к той же команде, она ничего не выведет — потому что «as-value» возвращает значение в переменную.

    В примере Mikrotik пытаются показать и использование скрипта, и CLI в одной команде (то есть сохранить вывод в переменную через «as-value», а другой командой:put вывести на консоль):

    {:local output [/iot modbus read-holding-registers slave-id=0x03 num-regs=0x1 reg-addr=0x0 as-value once];:put [($output->"values")]}

    Без «once» ваш скрипт в расписании будет выполняться бесконечно. Это граница расписания — например, 1 секунда.

    Но возвращаясь к «once»... Команда read-holding-registers также поддерживает блок кода «do=», который позволяет читать регистры непрерывно.

    По сути, вместо «once» можно использовать do={ # код, где используется $values } — это делает команду похожей на бесконечный цикл while, в котором блок do={} выполняется с заданным интервалом. Можно сделать do= «не бесконечным», задав timeout=1s, и если внутри цикла do вызвать MQTT, то вызовы будут происходить так часто, как будут возвращаться значения.

    Но такой подход неудобен в плане планировщика, ведь тот уже управляет интервалами.

    Метод с do={} иногда бывает полезен.

    Но если нужна надежная непрерывная считывающая команда для отчётов в что-то типа MQTT, проще всего использовать расписание с интервалом 1 секунда и опцией «once as-value».

    В документации указано, что KNOT поддерживает только функцию 3 — чтение регистров.
     
     
     
    Chiara
    Guest
    #13
    0
    20.01.2023 09:29:00
    Небольшое замечание по пункту 3) — в официальной документации в описании структуры пакета указано: «Параметры функции — обычно содержат адрес регистра, длину данных и данные для записи в случае использования функции «write»». Поэтому я подумал, что могут быть какие-то дополнительные скрытые параметры, но это не так. @Amm0, большое спасибо за твои разъяснения, их точно нужно добавить в официальную документацию!
     
     
     
    denissMT
    Guest
    #14
    0
    15.05.2023 09:53:00
    https://mikrotik.com/download/changelogs/testing-release-tree Что нового в 7.10beta5 (09 мая 2023, 13:38): *) iot – добавлена возможность отправлять команды с кодами функций Modbus напрямую из RouterOS (только через CLI); Это значит, что теперь можно скриптом заставить KNOT отправлять команды с кодами функций напрямую подключенному устройству MODBUS, сохранять ответы в переменные и дальше передавать их через MQTT или /tool fetch.
     
     
     
    wgjhonathan
    Guest
    #15
    0
    30.05.2023 02:56:00
    Мы ждём функцию 04 для чтения входного регистра.
     
     
     
    denissMT
    Guest
    #16
    0
    21.06.2023 11:11:00
    Согласно руководству: https://help.mikrotik.com/docs/pages/viewpage.action?pageId=61046813#heading-ReadingMODBUSdatausingRouterOS новая функция «transceive» позволяет отправлять команду «function=x». В примере мы показываем: /iot modbus transceive address=1 function=3 data=20000001 Но замените «function=4» — и это отправит команду «read input register».
     
     
     
    wcsnet
    Guest
    #17
    0
    21.06.2024 10:52:00
    Вот что я делаю, чтобы отправлять данные режимов в MQTT  
    #wcs, copyright © 2010. Все права защищены  
    # версия скрипта: 1.0

             :local errors 0
    #
             :global gostatusXscript
             :while ($gostatusXscript = "no") do={
                       :delay 5s;
             }
             :set gostatusXscript "no"
    #
             :do {
                  :global modbusregisters {
                                                {":set tmp [/iot modbus read-holding-registers slave-id=0x01 num-regs=0x1 reg-addr=154 as-value once]";"0";"154";"grid_voltage"};
                                                {":set tmp [/iot modbus read-holding-registers slave-id=0x01 num-regs=0x1 reg-addr=192 as-value once]";"0";"192";"grid_frequency"};
                                                {":set tmp [/iot modbus read-holding-registers slave-id=0x01 num-regs=0x1 reg-addr=167 as-value once]";"0";"167";"grid_power"};

                                                {":set tmp [/iot modbus read-holding-registers slave-id=0x01 num-regs=0x1 reg-addr=183 as-value once]";"0";"183";"battery_voltage"};
                                                {":set tmp [/iot modbus read-holding-registers slave-id=0x01 num-regs=0x1 reg-addr=184 as-value once]";"0";"184";"battery_state_of_charge"};
                                                {":set tmp [/iot modbus read-holding-registers slave-id=0x01 num-regs=0x1 reg-addr=190 as-value once]";"0";"190";"battery_power"};

                                                {":set tmp [/iot modbus read-holding-registers slave-id=0x01 num-regs=0x1 reg-addr=175 as-value once]";"0";"175";"inverter_power"};
                                                {":set tmp [/iot modbus read-holding-registers slave-id=0x01 num-regs=0x1 reg-addr=164 as-value once]";"0";"164";"inverter_current"};

                                                {":set tmp [/iot modbus read-holding-registers slave-id=0x01 num-regs=0x1 reg-addr=186 as-value once]";"0";"186";"mppt_1"};
                                                {":set tmp [/iot modbus read-holding-registers slave-id=0x01 num-regs=0x1 reg-addr=187 as-value once]";"0";"187";"mppt_2"};

                                                {":set tmp [/iot modbus read-holding-registers slave-id=0x01 num-regs=0x1 reg-addr=172 as-value once]";"0";"172";"172?"};
                                           }
                  :global tmp
    #
                  :log info "[ старт - modbus mqtt ]"
    #
                  :foreach register in=$modbusregisters do={
                       :log info ($register->3)
    #
                       :log info ("     регистр:")
                       :log info ("          " . ($register->2))
    #
                       :log info ("     команда:")
                       :log info ("          " . ($register->0))
                       :execute ($register->0)
                       :delay 2.5s
    #
                       :set ($register->1) [($tmp->"values")]
                       :log info ("     прочитано:")
                       :log info ("          " . ($register->1))
    #
                       :log info ""
    #
                       /iot mqtt publish broker="x x x x" topic=("feeds/thing-x/process-power-x/outgoing/sunsynk/" . $register->2) message=($register->1) qos=2
                    }
    #
                  :log info "[ конец - modbus mqtt ]"
    #                    
             } on-error={
                       :set gostatusXscript "yes"
                       :log error "ошибка скрипта [modbus mqtt]"
             }
    #
             :log info "скрипт завершён с $errors ошибками"
             :set gostatusXscript "yes"
             :log info " "
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2026 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры