Про Модбас написано огромное количество статей и снято множество видео: казалось бы, настроить его и принимать по нему нужные данные не составит большого труда, но на практике оказывается не совсем так. Безусловно все это очень помогает, но все же есть несколько нюансов, способных сильно затормозить работу для новичка, впервые столкнувшего с этим, о чем я и хочу поведать на конкретном примере. Имеется измерительный преобразователь тока Е854ЭЛ c RS485 на борту и поддержкой протокола Modbus RTU (здесь и далее разговор ведется только за этот формат). Моя задача писать данные с токового трансформатора, подключенного к этому преобразователю, на удаленный сервер, у которого уже установлена и настроена программа для приема и записи сигналов, и у нее вроде как есть возможность подключения по Модбасу, но опыта настройки этого вида связи нет. Ну что же, будем пробовать. 

Для начала было бы интересно попробовать подключиться к прибору со своего компа, чтобы просто разобраться что и как там вообще работает. Для этого подойдет уже имеющийся в наличии адаптер USB to RS485. Подключаем адаптер USB кабелем к компу, и он конечно же требует драйвера: скачиваем их, устанавливаем и снова подключаем - в диспетчере устройств появляется новый COM порт. Это хорошо, все идет по плану. Теперь нужно запитать сам прибор и присоединить двумя проводами к адаптеру.

Уже тут появляется первый нюанс: на приборе RS485 обозначен клеммами A и B, а на адаптере обозначен как DATA+ и DATA-, всего два варианта подключения, но если не угадать, то можно потом долго мучиться почему нет связи с прибором. Мне повезло - я подключил сразу правильно A на +, B на - (уже позже проверил, поменяв местами, связи не будет)

После того как подключил прибор и подал на него питание, нужно пробовать законнектиться к нему. На сайте производителя скачал инструкцию к измерителю и программу конфигуратор для него. Пытаюсь открыть программу, но она ругается на отсутствие библиотеки. Конечно это не критично, несколько минут гугления и скачивания недостающих компонентов и программа успешно запустилась, но это еще один небольшой затуп в копилку (UPD лезть в инет не нужно было, внутри архива был установщик библиотек, но он валялся среди кучи других файлов и не сразу его разглядел). В программе выставил свой порт, и заодно узнал, что по умолчанию настройки порта у прибора 9600-N-2 (скорость 9600, контроля четности нет, и 2 стоповых бита). Кстати в инструкции об этом нет ни слова.

Дальше выполняется подключение к прибору в программе и при считывании конфигурации удалось увидеть номер измерителя такой же, как и на его морде - значит соединение есть и все работает. Хотя нет, не все - нет уверенности что прибор может показывать ток, так как на табло в программе стоят нули. Интересно теперь подключить трансформатор тока, пропустить через него провод и подключить нагрузку, чтобы глянуть что покажет прибор. Соответственно сооружается розетка-удлинитель, в которую планируется воткнуть чайник на 1,5 кВт у которого ток потребления будет примерно 6,8-6,5 Ампер (зависит от напряжения в сети). Самое забавное, что даже на этом шаге произошел затуп: чайник который был под рукой оказался нерабочим и пришлось идти за другим. Но в итоге подключив чайник к своей розетке удалось увидеть то что хотелось (здесь ток 0,11 так как трансформатор преобразует в отношении 300/5, соответственно умножив 0,11 на 60, получим ожидаемые 6,6):

Теперь для собственного развития интересно побаловаться с модбасом, чтобы понять как он работает. Для этого хорошо подходит бесплатная программа-терминал Termite. В ней можно на выбранный порт отправлять команды модбаса (причем что удобно - есть подсказка-расшифровка команд), а контрольная сумма считается автоматически. В инструкции к прибору написано, что показания частоты берутся из регистра с адресом 0014 - вот их-то и попробуем получить. Получается, что наша команда должна выглядеть как 01 03 00 14 00 02 - то есть 01 адрес устройства, 03 - это запрос холдинг регистра, 0014 – адрес, как и говорилось, 0002 - количество запрашиваемых регистров

И вот тут снова случился затуп, так как не внимательно читал инструкцию. Я очень долго пытался получить что-то кроме ошибок в ответ, запрашивая не 2 регистра, а всего один, при этом пытался поиграться запрашиваемыми регистрами (не 03, а 04 или даже 01-02) - везде возвращались ошибки, но это был очень хороший знак, т.е. ошибки приходили от самого прибора и в ответе контрольная сумма CRC была OK. Нужно отдать мне должное что методом научного тыка я-таки смог получить заветные нули в ответ при отключенной нагрузке, запросив 2 холдинг регистра (то есть то что видно на скрине выше). Уже позже в очередной раз столкнувшись с какой-то другой проблемой, изучил инструкцию доскональней, я увидел что запрашивается именно 2 регистра (про регистры хранения Holding Registers похоже читал в другой инструкции не к этому прибору):

Можно увидеть на предыдущем скрине что вторым запросом после включения чайника запрашивалась так же частота (0014 адрес), но в ответ пришел текущий ток (если его перевести в формат float Mid-Little Endian). Вообще все 3 адреса возвращают ток, а при запросе таких же данных в другом формате (0024 адрес, например) возвращает ошибку Illegal Data Address. И да, очень повезло опять же что формат адреса в инструкции указан в HEX (но об этом не сказано что это HEX), так как запрашивая 14 регистр в десятичном формате - ничего не выйдет, с этим тоже позже возник затуп.

Я уже написал очень много, а к поставленной цели приблизился совсем немного - есть подключенный и настроенный прибор, есть какое-то понимание протокола, видно что прибор в рабочем состоянии и отзывается на запросы как ожидается, но вот удаленно принимать данные на нужную программу я все еще не могу. Под рукой есть адаптер MOXA nport 5230 и теперь буду настраивать его - установив на компьютер программу Nport Administrator можно добавить в систему виртуальный com-порт, который будет работать через сетевую карту - в общем через Ethernet можно управлять устройствами RS485. И уже на этом этапе снова появляются нюансы: у мохи было не 2 клеммы, а 5 для подключения 485 интерфейса: одна пара T+ и T-, вторая R+/D и R-/D и еще GND. Мне почему-то показалось что логичнее подключать на T+T-, а надо было на пару R+/D и R-/D. Этот маневр обошёлся мне в несколько часов безуспешных попыток соединиться тупо пытаясь настроить порты в МОХЕ, несколько раз сбрасывая ее в заводским установкам и пробуя заново. После прочтения инструкции и правильного подключения все заработало как и ожидалось. После этого протестировал режим TCP сервера - прикольная штука, но нужно двигаться дальше.

Программа для сбора сигналов - это старая версия IBA PDA - работает на 32 битных машинах. Чтобы не ломать сервак экспериментами, нужно ставить на 32 битную виртуалку Ибу, и там все это проворачивать еще раз. Проблема в пробросе портов на виртуалку, но Nport  Administrator вроде как решил проблему, хотя и не без танцев с бубном. Самая мякота начинается тут: снова методом тыка (но с IBA PDA я знаком хорошо, поэтому это нормально) вроде как настраиваю все как надо, есть соединение с прибором, но в ответ ничего не приходит. Нагуглил классную программу Virtual Serial Ports Emulator - там можно разделить порт на несколько абонентов, и отслеживать запросы и ответы к этому виртуальному порту (где галочка появляются подключенные абоненты и по каждому можно смотреть входящие и исходящие запросы):

Для начала я погонял запросы в терминале и понял как это работает, а потом включил отслеживание запросов Ибы и все сразу встало на свои места: запрос выглядел следующим образом: 01 03 00 0E 00 02 A5 C8 то есть запрос не 14 регистра а регистра E что является 14 в hex формате. Перевел 14 в десятичный формат, поставил его в настройках ибы - и все заработало)) На скрине решил запрашивать не 14 регистр, а 12 (18 в dec) - разницы нет, зато первый по списку:

Вот теперь, пожалуй, и все. В заключении хочу сказать спасибо всем, кто дочитал до конца, а еще отдельное спасибо авторам программ по Модбасу, а в особенности Termite и VSPEmulator - очень приятные в работе и реально полезные)

PS вдруг кому-то пригодится: частота сети в формате Mid-Little Endian (F1032 - в инструкции, что показывает порядок следования байт первый-нулевой-третий-второй) запрашивается по 0x0010 регистру (причем как оказалось без разницы 03 - holding, или 04 - input это же касается и токов во всех других регистрах - это к слову о том почему в инструкции об этом не было написано - нет необходимости уточнять). Чтобы получить ток в формате Little Endian (F0123) нужно запрашивать адрес 0x0018, а Big Endian (F3210) адрес 0x001a . И как справедливо заметили в комментарии автор сам дурак что не увидел формат записи 0x - что в принципе и означает шестнадцатеричное представление адреса. Но опять же это не отменяет того факта что впервые столкнувшись с таким в инструкции новичок сразу же сможет сообразить что вообще к чему и почему именно так.

Комментарии (16)


  1. little-brother
    17.09.2021 17:49
    +2

    При подключении иногда еще требуются оконечные резисторы и без них не понимается/нестабильная связь (смотрим мануалы на конкретные девайсы).


    1. Weron2 Автор
      17.09.2021 18:15
      +1

      Хорошое замечание!

      Наверно я мог бы столкнуться с таким, если бы подключал несколько приборов. Можно сказать повезло что не было такого, а то мог бы убить еще больше времени)


  1. tea1975
    17.09.2021 18:44
    +2

    у мохи было не 2 клеммы, а 5 для подключения 485 интерфейса: одна пара T+ и T-, вторая R+/D и R-/D

    Это для реализации RS-422 (дуплексного обмена то бишь).

    А мануалы то смотреть надо, я бы глядя на эту картинку из мануала к 5230 часов бы не потратил, минуты хватило бы:


  1. VT100
    17.09.2021 19:51
    +2

    "В поле" - может понадобиться и линия GND. Смотря по наличию требований к гальванической изоляции и её наличию в имеющихся аппаратах.


    1. AntonSor
      17.09.2021 22:20

      Обязательно. И не только в поле


  1. ne555
    17.09.2021 20:14
    +2

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

    на этом шаге произошел затуп: чайник который был под рукой оказался нерабочим и пришлось идти за другим

    Вот такие проблемы (несерьезнын с модбас) случаются. На Пикабу бы...


    1. ne555
      18.09.2021 12:05
      +1

      Можно минусовать, но статья все равно останется "отстой*.


  1. rediskus
    17.09.2021 21:23
    +3

    Сложилось ощущение, что автору даташиты читать лень и он мужественно продирался через Гугл с запросами типа «не работает модбас что делать». К сожалению очень характерная черта для многих современных разработчиков.


    1. Weron2 Автор
      17.09.2021 21:37
      -1

      В гугл лез только за инструкциями к устройствам, многое делалось методом тыка только потому что интересно было дойти до всего своим умом. Теперь имея такой опыт гораздо проще повторить все шаги быстрее и сразу правильно


  1. AntonSor
    17.09.2021 22:26

    Подскажите, пожалуйста, стоит ли в новый разрабатываемый прибор Modbus-RTU по RS-485 закладывать или сейчас актуальны какие-нибудь более новые протоколы? Что посоветуете? Это, по сути, датчик влажности, который раз в минуту передает данные.


    1. rediskus
      17.09.2021 22:41
      +2

      Modbus это протокол промышленный. Т.е. его из коробки поддерживают практически все промышленные контроллеры и сименс и адам и овен, не говоря уж о всяких прочих wirenboard’ах. И если вы планируете чтоб ваш датчик работал с чём-то из них, вам придётся реализовать modbus. Ещё можно посмотреть на 1-wire ;)


      1. Mitya78
        17.09.2021 23:15
        +1

        Сименс сейчас из коробки поддерживает Modbus TCP


    1. ryo_oh_ki
      18.09.2021 07:48
      +2

      Если сам датчик передаёт данные, то рекомендуется рассмотреть применение протоколов из области IoT, например, MQTT.


  1. AKP1
    19.09.2021 15:52
    +1

    ...формат адреса в инструкции указан в HEX (но об этом не сказано что это HEX)...

    Странно, что автору формат записи 0x0014 ничего не сказал...

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

    Правильно было отмечено @rediskus,автору просто лень было открыть соответствующие документы для каждого подключаемого девайса, проблем было бы гораздо меньше.

    Что касается фразы:

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

    когда надо было разобраться с modbus (я тоже достаточно ленив) посмотрел статейку "Просто о Modbus RTU с подробным описанием и примерами", чего мне хватила для полного понимания происходящего, аналогично про modbus-tcp.


    1. Weron2 Автор
      19.09.2021 16:01

      Странно, что автору формат записи 0x0014 ничего не сказал...

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

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

      Прочитав эту статью может сложиться впечатление

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


  1. PR200SD
    21.09.2021 10:26

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