Ad Widget

Collapse

шаблон modbus

Collapse
X
 
  • Time
  • Show
Clear All
new posts
  • gospodin.horoshiy
    Senior Member
    • Sep 2008
    • 272

    #31
    В модуль (v0.9) добавлена возможность массового сбора данных Modbus - можно сразу запрашивать много регистров за раз и отдавать их в виде JSON для последующего разбора препроцессингом Zabbix 3.4+.
    Подробнее тут: https://github.com/v-zhuravlev/libzb...ata-collection
    Zbx 2.0.4 on Debian and MYSQL5 on Ubuntu Server 64bit 8.04,
    200+ Win Agents, 50+ Linux Agents, 150+ Network Devices

    Comment

    • Kermestere
      Junior Member
      • Jan 2020
      • 12

      #32
      Здравствуйте
      Zabbix 3.4 требуется ежесекундно(до 5ти сек) собирать данные с нескольких устройств по MODBUS RTU.
      Но постоянно проблемы, то одно из устройств перестаёт быть доступно Connection timed out.
      Если перезагрузить устройства то может заработает передача с одного то оба висят Connection timed out. Может по 10 минут быть Connection timed out.
      А если я подцеплю ещё десяток приборов то даже не знаю что будет.
      Что посоветуете делать?

      Comment

      • wins
        Senior Member
        • Sep 2014
        • 307

        #33
        мб ответ на ваш вопрос постом выше

        Comment

        • shkiper
          Senior Member
          • Mar 2016
          • 123

          #34
          Originally posted by Kermestere
          Здравствуйте
          Zabbix 3.4 требуется ежесекундно(до 5ти сек) собирать данные с нескольких устройств
          а Zabbix точно будет собирать данные каждые 5 сек, а не распределит время по своим алгоритмам?
          эти данные необходимо собирать в строго ограниченном тайминге?
          это одиночные метрики или общий запрос всего состояния и вычисляемые поля?
          или много метрик и для каждой нужен общий запрос к объекту?

          Comment

          • Kermestere
            Junior Member
            • Jan 2020
            • 12

            #35
            Originally posted by shkiper
            а Zabbix точно будет собирать данные каждые 5 сек, а не распределит время по своим алгоритмам?
            эти данные необходимо собирать в строго ограниченном тайминге?
            это одиночные метрики или общий запрос всего состояния и вычисляемые поля?
            или много метрик и для каждой нужен общий запрос к объекту?
            Здравствуйте,
            Сбор данных с приборов должен осуществляться общим количеством около 15 штук, чем чаще будет сбор данных с каждого тем лучше, поэтому пример привёл до пяти секунд.
            С каждого прибора получаю только одно значение.
            Создаю на каждый прибор "элемент данных" ,делаю простой опрос двух приборов таким образом
            modbus_read["/dev/ttyUSB0 19200 N 8 1",1,14,3]
            modbus_read["/dev/ttyUSB0 19200 N 8 1",2,14,3]

            Comment

            • shkiper
              Senior Member
              • Mar 2016
              • 123

              #36
              может можно ускорить шину, выставив скорость 115200?
              видимо заббикс не может распределить запросы равномерно по времени, интерфейс модбас критичен к этому и получается затык
              сразу все устройства за один прием можно опросить и получить все данные со всех устройств сразу, но без конфликтов, что бы устройста опросились последовательно?

              в таких случаях обычно определяю два параметра:
              1) допустимый интервал запуска команды
              2) срок актуальности данных

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

              но это в старых версиях заббикса, на сегодняшний момент можно сразу все данные передавать в jsone, т.е. опросил, затем сразу все передал и далее - зависимыми полями распределил
              и кстати в libzbxmodbus вроде есть такой функционал, он ненавязчиво в посте чуть выше упомянут
              но доверять заббиксу тайминги опроса модбас, я бы не стал, все равно лучше сначала в файл, а потом (проверив время и интервал запуска) в заббикс
              Last edited by shkiper; 29-01-2020, 08:05.

              Comment

              • Kermestere
                Junior Member
                • Jan 2020
                • 12

                #37
                После загрузки ПК и запуска заббикс все устройства опрашиваются одним приёмом, об этом сигнализирует мигание RXTX диодов на конвертере usb-rs585(например раз в 1 сек происходит перемигивание с разницей примерно в 50мс ровно столько раз сколько было устройств потом снова через 1 сек повторяется).
                Если одно из устройств кратковременно потерялось то может долгое время писать connection timeout или вовсе не вернуться.
                При этом перезапуск сервиса zabbix-server не помогает. Может это связано с каким-то timeout самого ttyUSB0. Точно помогает перезагрузка машины.

                В ответе выше видел про JSON, но как я понимаю это про массовый сбор только с одного устройства.

                Comment

                • shkiper
                  Senior Member
                  • Mar 2016
                  • 123

                  #38
                  без заббикса, просто modpull, все норм?

                  Comment

                  • Kermestere
                    Junior Member
                    • Jan 2020
                    • 12

                    #39
                    Попробую увеличить скорость передачи данных.
                    Спасибо за ответы

                    Comment

                    • shkiper
                      Senior Member
                      • Mar 2016
                      • 123

                      #40
                      отпишитесь, что получилось
                      если что, с кэшем и таймингами я помогу, с вас надо будет процедуру опроса на баше, а я ее оберну в "кэш", проверки, логирование и отдачу параметров ключу заббикса

                      Comment

                      • Kermestere
                        Junior Member
                        • Jan 2020
                        • 12

                        #41
                        Здравствуйте, shkiper
                        Спасибо за предложение помощи, поднял скорость до 57600/
                        Пока что имею тестовые два устройства которые опрашиваются напрямую заббиксом и если не делать нештатных ситуаций с разрывом связи по RS то вроде даже ежесекундно опрашиваются без сбоя ).
                        Как поступят остальные(около 13 штук) и будут подключены в кучу сообщу о результате.

                        Comment

                        • Kermestere
                          Junior Member
                          • Jan 2020
                          • 12

                          #42
                          Здравствуйте
                          Тестировал шаблон modbus, в один прекрасный момент перестали собираться данные, и никак не смог избавиться от connection timeout.
                          И перезагружал сервер и перезагружал сам zabbix sever. отключал - включал элементы данных и в результате таким-же чудесным образом он заработал и стал собирать данные вновь. просто чудеса.
                          Из этого хочу попросить помощи в реализации через сбор данных с помощью скрипта.
                          Мне достаточно даже без кэша только передавать данные из скрипта в заббикс.

                          Вот пример скрипта
                          HTML Code:
                          #!/bin/bash
                          #Получаем данные
                          md1=`~/modpoll/linux_i386/modpoll -b 57600 -d8 -s1 -p none -m rtu -l 100 -a1  -r14 -c1 /dev/ttyUSB0 -1 |grep 4]: |awk -F: {'print $2'}`
                          md2=`~/modpoll/linux_i386/modpoll -b 57600 -d8 -s1 -p none -m rtu -l 100 -a2  -r14 -c1 /dev/ttyUSB0 -1 |grep 4]: |awk -F: {'print $2'}`
                          
                          #делим на 100 и добавляем дробную часть
                          md1="$((md1 / 100)).$((md1 % 100))"
                          md2="$((md2 / 100)).$((md2 % 100))"
                          echo $md1;
                          echo $md2;
                          Last edited by Kermestere; 05-02-2020, 10:49.

                          Comment

                          • Kos
                            Senior Member
                            Zabbix Certified SpecialistZabbix Certified Professional
                            • Aug 2015
                            • 3404

                            #43
                            Если надо пересылать данные, получаемые скриптом, то проще всего это делать утилитой zabbix_sender.
                            Кроме того, раз уж вы всё равно вызываете утилиту awk, то можно немного соптимизировать ваш скрипт, переложив на неё ещё немного (избавляясь от ненужного grep-а и выполняя нужные преобразования):
                            Code:
                            #!/bin/bash
                            #Получаем данные
                            md1=$(~/modpoll/linux_i386/modpoll -b 57600 -d8 -s1 -p none -m rtu -l 100 -a1 -r14 -c1 /dev/ttyUSB0 -1 | awk -F: '/4\]:/ {printf "%0.2f",($2/100)}')
                            md2=$(~/modpoll/linux_i386/modpoll -b 57600 -d8 -s1 -p none -m rtu -l 100 -a2 -r14 -c1 /dev/ttyUSB0 -1 | awk -F: '/4\]:/ {printf "%0.2f",($2/100)}')
                            
                            #отладочный вывод
                            echo md1 = $md1 md2 = $md2
                            
                            #отсылка значений в предположении, что на хосте созданы элементы данных "modbus.md1" и "modbus.md2" с типом "Trapper"
                            #DNS-имена либо IP-адрес сервера Zabbix, куда слать данные
                            ZABBIX_SERVER=zabbix.mycompany.org
                            #имя хоста Zabbix, к которому относятся элементы данных "modbus.md1" и "modbus.md2"
                            ZABBIX_HOST=myhost
                            #собственно отсылка данных
                            zabbix_sender -z $ZABBIX_SERVER -s $ZABBIX_HOST -k modbus.md1 -o $md1 >/dev/null
                            zabbix_sender -z $ZABBIX_SERVER -s $ZABBIX_HOST -k modbus.md2 -o $md2 >/dev/null
                            Last edited by Kos; 05-02-2020, 11:23.

                            Comment

                            • Kermestere
                              Junior Member
                              • Jan 2020
                              • 12

                              #44
                              незнаю насколько правильно сделал но свёл всё к чему:
                              Вывод из скрипта modscript.sh привёл к виду
                              {
                              "md1": 3.60,
                              "md2": 0.20
                              }
                              создал /etc/zabbix/zabbix_agentd.d/modbss.conf
                              в нём UserParameter=mymodbus,/etc/zabbix/scripts/modscript.sh

                              #zabbix_agentd -t mymodbus
                              выдаёт
                              libzbxmodbus: loaded version: 0.9
                              mymodbus [t|{
                              "md1": 3.60,
                              "md2": 0.20
                              }]

                              Далее создаю элемент данных с ключом mymodbus тип zabbix агент и Тип информации текст.
                              и ещё два зависимых от mymodbus элемента данных с предобработкой JSON $.md1 и $.md2

                              Показания пошли, сбор идёт каждые две секунды, но что будет дальше ....

                              добалено
                              первые грабли - если один прибор отключить то всё заглохло и не опрашивается вовсе с ошибкой Timeout while executing a shell script!
                              Пробую запустить вручную. Долго но ответ приходит, а заббикс молчит!

                              time zabbix_agentd -t mymodbus
                              libzbxmodbus: loaded version: 0.9
                              mymodbus [t|Reply time-out!
                              {
                              "md1": 3.39,
                              "md2": 0.0
                              }]

                              real 0m1.081s
                              user 0m0.020s
                              sys 0m0.012s

                              поменял таймаут комманды -o 0.1 ! Может затыки именно из-за него и наложений запроса на запрос?!
                              real 0m0.182s
                              user 0m0.020s
                              sys 0m0.012s
                              Last edited by Kermestere; 05-02-2020, 13:26.

                              Comment

                              • Kermestere
                                Junior Member
                                • Jan 2020
                                • 12

                                #45
                                Kos попробую Ваш вариант. Спасибо.
                                а json рушится когда на выходе скрипта он видит слова
                                Reply time-out! и я не знаю как их отключить из вывода баша

                                Comment

                                Working...