пятница, 4 марта 2022 г.

Как я настраивал связь по ModBus

Про Модбас написано огромное количество статей и снято множество видео: казалось бы, настроить его и принимать по нему нужные данные не составит большого труда, но на практике оказывается не совсем так. Безусловно все это очень помогает, но все же есть несколько нюансов, способных сильно затормозить работу для новичка, впервые столкнувшего с этим, о чем я и хочу поведать на конкретном примере. Имеется измерительный преобразователь тока Е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 - что в принципе и означает шестнадцатеричное представление адреса. Но опять же это не отменяет того факта что впервые столкнувшись с таким в инструкции новичок сразу же сможет сообразить что вообще к чему и почему именно так.

Так же в комментах к статье на хабре упомянули про заземление, и терминальные резисторы. Возможно это тоже нужно будет иметь ввиду при настройке соединения

 

Комментариев нет:

Отправить комментарий