Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Русский
    3. ioBroker
    4. ioBroker драйвера
    5. Драйвер ModBus

    NEWS

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    • Monatsrückblick - April 2025

    Драйвер ModBus

    This topic has been deleted. Only users with topic management privileges can see it.
    • Bluefox
      Bluefox last edited by

      @Adav:

      Попробовал. Cначала удалил в админе старую установку modbus, потом установил из строки. Вроде установилось. Никаких сообщений об ошибках в консоли не увидел, в логах админа вообще пусто, npm-debug.log не появился. Но… захожу в админ - закладки "драйвера" - вижу установленный modbus adapter, захожу в закладку "настройки драйверов" - там нет modbus. Когда до этого игрался с этим делом - обнаружил, что именно так и бывает с версией 0.5.2, а вот если поставить ее поверх 0.5.0 - то нормально. Видимо в свежей версии есть в этой части ошибки. `
      Надо просто выполнить

      iobroker upload modbus
      iobroker add modbus
      

      @Adav:

      Пробую еще раз, но теперь из админа. Удаляю драйвер, ставлю 0.5.2 с github - установилось на этот раз без ошибок (node-serialport сохранился от установки через консоль?), но с настройками драйвера все та же беда. Еще раз удаляю драйвер и на этот раз ставлю в админе версию 0.5.0 - повторяется ошибка с node-serialport-ia32 (разные версии modbus смотрят в разные каталоги?), но при этом а настройках драйверов появляется modbus. Ставлю через админ (обновляю) драйвер с github на версию 0.5.2 - ошибок с ia32 нет (в этот раз увидела сохраненное от установки через строку?), в настройках драйверов modbus сохранился.

      Надеюсь, что заработает, проверить смогу не скоро, когда прибудет из Китая новое modbus устройство, те что есть не хочу отключать пока от существующего контроллера. Будут проблемы - отпишусь. А пока на лицо помимо ошибки с ia32 (как видим преодолимо через строку), так и ошибки в новой версии с настройками драйверов. `
      @Adav:

      Кстати, node-serialport используется не совсем свежий по каким-то важным причинам? `
      Новый serialport ломает поддержку 0.12.x node.js версий

      1 Reply Last reply Reply Quote 0
      • A
        Adav last edited by

        Был немного занят другими делами…

        @Bluefox:

        Надо просто выполнить

        iobroker upload modbus
        iobroker add modbus
        ```` `  
        

        После этого действительно появляется modbus последней версии в настройках, но вот в процессе опять появляется та же ошибка:

        root@ioBroker:/opt/iobroker# iobroker add modbus

        host.ioBroker install adapter modbus

        npm install –production (System call) in "/opt/iobroker/node_modules/iobroker.modbus"

        node-pre-gyp ERR! Tried to download: https://github.com/voodootikigod/node-s ... a32.tar.gz

        node-pre-gyp ERR! Pre-built binaries not found for serialport@3.1.2 and node@4.8.1 (node-v46 ABI) (falling back to source compile with node-gyp)

        Я правильно понимаю, что в итоге node-serialport так и не ставится на моей версии linux?

        Попробовал еще на Orange Pi Zero с Armbian - та же проблема:

        ERR! Tried to download(404): https://github.com/EmergingTechnologyAd ... arm.tar.gz node-pre-gyp ERR! Pre-built binaries not found for serialport@4.0.7 and node@4.8.1 (node-v46 ABI) (falling back to source compile with node-gyp)

        Но вот почему-то лезет уже к свежей версии. Хотя Вы говорили выше, что нужна старая... ничего не понимаю 😞

        build-essential здесь также установлен.

        1 Reply Last reply Reply Quote 0
        • Bluefox
          Bluefox last edited by

          @Adav:

          Был немного занят другими делами…

          @Bluefox:

          Надо просто выполнить

          iobroker upload modbus
          iobroker add modbus
          ```` `  
          

          После этого действительно появляется modbus последней версии в настройках, но вот в процессе опять появляется та же ошибка:

          root@ioBroker:/opt/iobroker# iobroker add modbus

          host.ioBroker install adapter modbus

          npm install –production (System call) in "/opt/iobroker/node_modules/iobroker.modbus"

          node-pre-gyp ERR! Tried to download: https://github.com/voodootikigod/node-s ... a32.tar.gz

          node-pre-gyp ERR! Pre-built binaries not found for serialport@3.1.2 and node@4.8.1 (node-v46 ABI) (falling back to source compile with node-gyp)

          Я правильно понимаю, что в итоге node-serialport так и не ставится на моей версии linux?

          Попробовал еще на Orange Pi Zero с Armbian - та же проблема:

          ERR! Tried to download(404): https://github.com/EmergingTechnologyAd ... arm.tar.gz node-pre-gyp ERR! Pre-built binaries not found for serialport@4.0.7 and node@4.8.1 (node-v46 ABI) (falling back to source compile with node-gyp)

          Но вот почему-то лезет уже к свежей версии. Хотя Вы говорили выше, что нужна старая... ничего не понимаю 😞

          build-essential здесь также установлен. `
          Это только надпись. А устанавливать все равно должен.

          1 Reply Last reply Reply Quote 0
          • A
            Adav last edited by

            @Bluefox:

            Это только надпись. А устанавливать все равно должен. `

            Понятно. Надеюсь заработает, когда будет с чем попробовать. А что на счет версий? Почему на разных железках пытается ставиться разные версии? Как это соответствует Вашему утверждению, что нужна старая?

            1 Reply Last reply Reply Quote 0
            • K
              kab1561 last edited by

              Доброго времени суток всем!

              Пытаюсь использовать драйвер Modbus для работы с самосборным контроллером, работающим по протоколу Modbus RTU.

              Настроил драйвер на опрос holdingRegisters. Опрос ведется, данные с контроллера принимаются - проблем нет. Как я понимаю, здесь драйвер использует функцию 03 (Read Holding Registers) протокола Modbus.

              Но, я пока так и не понял, как записать из ioBroker какие-нибудь данные в единичный регистр контроллера.

              Это вообще возможно?

              Сейчас драйвер Modbus каким-либо образом может использовать функции 06 (Preset Single Register) и 16 (Preset Multiple Regs)? Если может, то как?

              1 Reply Last reply Reply Quote 0
              • Bluefox
                Bluefox last edited by

                @kab1561:

                Доброго времени суток всем!

                Пытаюсь использовать драйвер Modbus для работы с самосборным контроллером, работающим по протоколу Modbus RTU.

                Настроил драйвер на опрос holdingRegisters. Опрос ведется, данные с контроллера принимаются - проблем нет. Как я понимаю, здесь драйвер использует функцию 03 (Read Holding Registers) протокола Modbus.

                Но, я пока так и не понял, как записать из ioBroker какие-нибудь данные в единичный регистр контроллера.

                Это вообще возможно?

                Сейчас драйвер Modbus каким-либо образом может использовать функции 06 (Preset Single Register) и 16 (Preset Multiple Regs)? Если может, то как? `
                Для записи используется 16 если длина адресов больше 1 и

                6 если нужно считать только один адрес.

                А что не работает?

                1 Reply Last reply Reply Quote 0
                • K
                  kab1561 last edited by

                  @Bluefox:

                  Для записи используется 16 если длина адресов больше 1 и

                  6 если нужно считать только один адрес.

                  А что не работает? `

                  Я понимаю, что для Вас это "азы", но я просто не могу "въехать" в логику обработки событий ioBroker.

                  В моем случае ioBroker получает от удаленного контроллера данные из 17 Holding Registers (в драйвере Modbus они описаны как 40001 … 40017). У этого контроллера есть один входной регистр (Preset Single Register), если записать в него какое-либо шестнадцатиричное число, то он исполняет сооветствующие команды.

                  К примеру, я хочу, чтобы при появлении значения 280 в 40002 Holding Registers ioBroker отправлял значение 4 (0x4) в указанный Single Register контроллера посредством функции 06 (Preset Single Register) протокола Modbus. Как мне это реализовать в ioBroker?

                  Какие драйверы кроме Modbus необходимо установить для реализации этого?

                  И, если подобную логику кто-то делал - то где можно об этом почитать?

                  1 Reply Last reply Reply Quote 0
                  • Bluefox
                    Bluefox last edited by

                    @kab1561:

                    @Bluefox:

                    Для записи используется 16 если длина адресов больше 1 и

                    6 если нужно считать только один адрес.

                    А что не работает? `

                    Я понимаю, что для Вас это "азы", но я просто не могу "въехать" в логику обработки событий ioBroker.

                    В моем случае ioBroker получает от удаленного контроллера данные из 17 Holding Registers (в драйвере Modbus они описаны как 40001 … 40017). У этого контроллера есть один входной регистр (Preset Single Register), если записать в него какое-либо шестнадцатиричное число, то он исполняет сооветствующие команды.

                    К примеру, я хочу, чтобы при появлении значения 280 в 40002 Holding Registers ioBroker отправлял значение 4 (0x4) в указанный Single Register контроллера посредством функции 06 (Preset Single Register) протокола Modbus. Как мне это реализовать в ioBroker?

                    Какие драйверы кроме Modbus необходимо установить для реализации этого?

                    И, если подобную логику кто-то делал - то где можно об этом почитать? `
                    Понятно, что было не понятно 😄

                    Тебе нужен Javascript драйвер и твой случай будет выглядеть так:
                    48_2017-04-20_00_00_27-iobroker.admin.png

                    Для этого можешь импортировать код отсюда.

                    ! ````
                    <xml xmlns="http://www.w3.org/1999/xhtml"><block type="on_ext" id="6o:Z)o={6z!yNYw2%Q!u" x="63" y="63"><mutation items="1"></mutation>
                    <field name="CONDITION">any</field>

                    <value name="OID0"><shadow type="field_oid" id=";R*F2k/]wqu#aGAZo8d*"><field name="oid">modbus.0.holdingRegisters.1</field></shadow></value> 
                    <statement name="STATEMENT"><block type="controls_if" id="WVf9W,,C2j?,BMc{mWKU"><value name="IF0"><block type="logic_compare" id="1,b~SR78igB..=oouJ5y"><field name="OP">EQ</field>
                            <value name="A"><block type="on_source" id="9hE-J`4B{`*Xh^By3sZC"><field name="ATTR">state.val</field></block></value> 
                            <value name="B"><block type="math_number" id="%n0=RkQG]^IJ=MjnabbD"><field name="NUM">280</field></block></value></block></value> 
                        <statement name="DO0"><block type="control" id="-CL55G=Hr[UyJ5_p/xI]"><mutation delay_input="false"></mutation>
                            <field name="OID">modbus.0.holdingRegisters.2</field>
                            <field name="WITH_DELAY">FALSE</field>
                            <value name="VALUE"><block type="math_number" id="T%[O)Rm:B`Uz=HGuP7W("><field name="NUM">4</field></block></value></block></statement></block></statement></block></xml> 
                    
                     ![48_2017-04-20_00_01_48-iobroker.admin.png](/assets/uploads/files/48_2017-04-20_00_01_48-iobroker.admin.png) 
                    
                    В моём примере читается регистр с адресом 1 и если там появляется 280, то пишется в регистр с адресом 2 значение 4.
                    
                    Или можно javascript:
                    
                    

                    on({id: 'modbus.0.holdingRegisters.1', change: "any"}, function (obj) {
                    if (obj.state.val === 280) setState("modbus.0.holdingRegisters.2", 4);
                    });

                    1 Reply Last reply Reply Quote 0
                    • K
                      kab1561 last edited by

                      @Bluefox:

                      Понятно, что было не понятно 😄

                      Или можно javascript:

                      on({id: 'modbus.0.holdingRegisters.1', change: "any"}, function (obj) {
                        if (obj.state.val === 280) setState("modbus.0.holdingRegisters.2", 4);
                      });
                      ```` `  
                      

                      Большое спасибо за пинок в нужном направлении!

                      Никогда бы не подумал, что здесь необходимо для отправки контроллеру числа в его входной регистр указывать адрес Holding Registers. У меня была твердая убежденность, что это и логически и физически разные ячейки памяти Modbus контроллера. По крайней мере я в прошивке своего контроллера сделал именно такое разделение.

                      Кстати, в моем случае Ваш скрипт не сработает совсем из-за неверной адресации регистров. Но работает следующий код, который и обрабатывает мой пример :

                      on({id: 'modbus.0.holdingRegisters.40002', change: "any"}, function (obj) {
                        if (obj.state.val == 280) setState("modbus.0.holdingRegisters.40001", 4);
                      });
                      
                      1 Reply Last reply Reply Quote 0
                      • A
                        Adav last edited by

                        Добрался наконец попробовать modbus напрямую с ioBroker. Девайс имеет набор разных входов - AO-AI-DO-DI и подключен через TCP. Настройки драйвера оставлены по умолчанию. Адреса регистров девайса совпадают с адресами, назначаемыми драйвером ioBroker по умолчанию.

                        ~~![](</s><URL url=)<link_text text="http://www.strict-con.com/product/pics/ ... 659916.jpg">http://www.strict-con.com/product/pics/20170131/201701311485849659916.jpg</link_text>" />

                        Аналоговые входы-выходы (AI-AO), они же регистры входа и holding работают. А вот дискретные входы и выходы (регистры флагов) - никак не удалось заставить работать. Не отрабатываются изменения. Настроек там совсем мало, пробовал менять роль - никакой реакции. Что еще и где можно подкрутить?

                        С контроллером WB5 сей девайс через 485 работает по всем входам-выходам нормально.

                        И еще заметил странность - может работать довольно долго и стабильно, потом начинают в логах идти сообщения вроде

                        warn Poll error count: 1 code: {"err":"timeout"}

                        причем понять причину с чего вдруг это начинает происходить не удается, перезапуск драйвера помогает. Отчего может происходить такой сбой?~~

                        1 Reply Last reply Reply Quote 0
                        • A
                          Adav last edited by

                          Разобрался с дискретными входами-выходами. Надо было поставить галку "использовать прямые адреса при alias". После этого увидел что адреса созданных ранее дискретных регистров уползли вверх на 8, адреса аналоговых - не изменились. После этого удалил то, что уползло и создал заново с правильными адресами. После чего дискретные входы-выходы заработали. Не понял в чем смысл alias и почему при этом изменяются адреса регистров, причем только дискретных.

                          1 Reply Last reply Reply Quote 0
                          • A
                            Adav last edited by

                            Появился у меня еще девайс, который хотелось бы прикрутить к ioBroker. Девайс - контроллер заряда батареи. Выход у него - 485, подключается через конвертер в TCP, в итоге в ioBroker я настраиваю Modbus TCP. Описание протокола девайса - http://www.solar-elektro.cz/data/dokume … otocol.pdf, в наличии все 4 типа регистров. Наиболее интересны input регистры. Результат получается странный - бОльшая часть регистров опрашивается нормально, но некоторые не работают - в логах идет "Poll error count: 6 code: {"errorCode":132,"exceptionCode":2,"message":"ILLEGAL DATA ADDRESS"}", то есть как бы регистра такого нет… при этом через Modbus poll я без проблем считываю данные с этого адреса. Ошибиться с пересчетом адресов из HEX в десятичные трудно, поскольку, к примеру, с адреса 3111 данные считываются, с 311A - не считываются, 311D - опять нормально считываются. То есть они идут почти подряд. Галки alias ставил-снимал - ничего не меняется. Дискретные входы не пробовал - не интересны, holding - нормально работают, а вот регистры флагов - вообще никак не идут. Но самое забавное с input - как такое может быть совсем не понятно.

                            1 Reply Last reply Reply Quote 0
                            • A
                              Adav last edited by

                              Возвращаюсь к вопросу о работе с новым девайсом. С input регистрами удалось разобраться. Стали считываться все переменные при параметре "максисмальное кол-во регистров при чтении = 1". А вот с регистрами флагов ничего не выходит. Есть подозрение что причина в том, что ioBroker пытается считать сразу группу coil одним запросом с номерами подряд. А дело в том, что не все адреса с coil у устройства рабочие. К примеру, 0, 2, 3 - рабочие, 1 - нет (просто нет такого регистра в реальном устройстве). Ну и получается в итоге ошибка адреса у ioBroker. При этом с modbus poll считывается все нормально (кроме 1 конечно). Другое же устройство у меня имеет coil адреса подряд и там как раз все работает с ioBroker нормально. Если все так - получается необходимо предусмотреть в софте и такую возможность.

                              1 Reply Last reply Reply Quote 0
                              • Vumer
                                Vumer last edited by

                                Вечер добрый,

                                поприветствуйте ещё одного чайника. Только просьба, сильно не пинать.

                                Приобрёл два месяца назад Siemens LOGO последнюю, поигрался, понравилась. Сейчас хочу, с вашей помощью, познакомиться с Modbus.Можно сказать с нуля. Начну с входом NI1, как его и драйвер настроить чтоб друг друга понимали?

                                Спасибо
                                2071_01-ni1.jpg
                                2071_01_1-ni1.jpg

                                1 Reply Last reply Reply Quote 0
                                • A
                                  Adav last edited by

                                  Так и не получилось заставить работать драйвер modbus в ioBroker c coil на конкретном устройстве (о чем выше)…

                                  Возникла и другая проблема - два одинаковых устройства на одной шине RS485 отказываются нормально опрашиваться. Разумеется, они с разными ID. По одному работают нормально. А вот парой - никак. Пробовал через COM сервер с настройкой как RTU over TCP, так и Modbus TCP - секунд 10 работают, после чего в логах идут постоянные ошибки timeout c рестартами. По отдельности - все нормально. Modbus poll работает нормально... Попробовал подключить на serial (usb-485) - то же самое, по одному работают, парой - нет. При этом при старте второго драйвера в его логе сразу ошибка On error: {}. Тут, как я понимаю, первый драйвер просто блокирует серийный порт и не дает второму работать с ним. Получается, что ioBroker не умеет работать на одной 485 шине с несколькими устройствами? Если так - то печально...

                                  1 Reply Last reply Reply Quote 0
                                  • A
                                    Adav last edited by

                                    Две недели прошло - результат все тот же - тишина. Никто не использует подключение по modbus нескольких устройств на одной RS-485 шине? Очень-очень странно, что такое не работает в ioBroker, вполне типичный способ подключения группы modbus устройств. Или все же есть какой-то "тайный" способ настройки драйвера в ioBroker на несколько устройств на шине?

                                    1 Reply Last reply Reply Quote 0
                                    • A
                                      avaal last edited by

                                      Разбираюсь с драйвером modbus.

                                      Не может открыть порт. Лог:

                                      modbus.0 2017-07-18 15:57:38.048 error Cannot create modbus master!

                                      modbus.0 2017-07-18 15:57:38.045 error Cannot open port "/dev/ttyUSB0" [19200]: ReferenceError: serialport is not defined

                                      В чем может быть проблема?

                                      1 Reply Last reply Reply Quote 0
                                      • A
                                        avaal last edited by

                                        Так же пробовал устанавливать драйвера по инструкции

                                        http://www.iobroker.net/docu/?page_id=5506&lang=ru

                                        и устанавливать на виртуалку ubuntu

                                        результат все тот же

                                        куда копать?

                                        1 Reply Last reply Reply Quote 0
                                        • A
                                          avaal last edited by

                                          На винде тоже самое(((((

                                          1 Reply Last reply Reply Quote 0
                                          • A
                                            Adav last edited by

                                            @avaal:

                                            На винде тоже самое((((( `

                                            COM порт у Вас вообще работает? Не пробовали опрашивать устройства через софт modbus poll? Что за USB-COM переходник используете? Драйвера ставили? Там в зависимости от чипсета могут быть разные заморочки, а в линуксе вообще могут потребоваться танцы с бубнами при какой-нибудь экзотике. К примеру мне попался как-то на Exar XR21B1411 - специфичная вещь.

                                            1 Reply Last reply Reply Quote 0
                                            • First post
                                              Last post

                                            Support us

                                            ioBroker
                                            Community Adapters
                                            Donate

                                            790
                                            Online

                                            31.7k
                                            Users

                                            79.8k
                                            Topics

                                            1.3m
                                            Posts

                                            25
                                            174
                                            48656
                                            Loading More Posts
                                            • Oldest to Newest
                                            • Newest to Oldest
                                            • Most Votes
                                            Reply
                                            • Reply as topic
                                            Log in to reply
                                            Community
                                            Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                            The ioBroker Community 2014-2023
                                            logo