ESP32 + RS-485(Mudbus RTU) = работает
- Войдите на сайт для отправки комментариев
Втр, 27/03/2018 - 10:47
Приветствую.
Собственно столкнулся с задачей, надо считать при помощи ESP32 данные из промышленного контроллера OWEN МВ110-8А(использую MAX485).
Пока что не одна библиотека даже не заставила мигнуть индикатор RS-485 на Овене.
Пробовал считать при помощи Arduino Nano - без проблем, библиотека SimpleModbusMaster справляется на ура, под ESP32 компилится, но переводит состояние ножки RE/DE раз в 20 медленее.
Может кто-то сталкивался с подобными делами, пусть даже на ESP8266?
Чуть позже сделаю фото осциллограм, что происходит.
OFFTOP: Привіт, друже, рад видеть ))).
По теме сказать нечего, моя ESP32 где-то в дороге ещё...
Araris - здоровенькі були.
А если конкретнее - к Овену подключен промышленный термодатчик, и стоит задача получить от Овена по интерфейсу RS-485 температуру которую она измеряет.
Вот этот код на ардуино нано работает так как мне нужно:
Синий луч - изменение состояния на RE/DE ножках микросхемы MAX485, жёлтый - TXD микроконтроллера.
Данный код под ESP32 компилится и работает, но ооочень медленно(обратите внимание на временную равёртку):
Мало того, ещё и переключает режим MAX485 раньше чем нужно:
Подключился к RS-485 через USB переходник и вижу что в шине нули:
Из-за особенностей реализации Serial.flush() для ESP32 переключение ноги прием-передача происходит раньше. Естественно, никакого вменяемого пакета клиент не получает, поскольку контрольная сумма не совпадает. Нужно изменять реализацию sendPack, в файле SimpleModbusMaster.cpp.
Например вот так
Да, функция Serial.flush() на ESP32 работает некорректно, это факт.
Пожалуйста.
Вот этот код чётко работает на Arduino Nano:
Ссылка на библиотеку SimpleModbusMasterV2rev2:
https://drive.google.com/file/d/1AQggEa6UnQLptpZGrw3t3ZvFZ_RR3wzH/view?usp=sharing
Вот так работа выглядит на осциллографе:
Жёлтый - TX ардуины, синий - RE/DE ножка микросхемы MAX485.
Вот такое наблюдаю в RS-485 шине при помощи переходника с RS-485 на USB.
Сейчас попробую аналогичным образом всё показать как на ESP32 этот же код крутится.
На ESP32 приведённая мною выше библиотека работает следующим образом:
В сериале ESP32 полная тишына, если подключить USB - RS-485 переходник то можно в шине увидить следующее:
Как видно одни нули.
На осциллографе следующая картина:
Обратите внимание на время через которее изменяется состояние на ножке RE/DE, это секунд 7-8 примерно, что наталкивает на мысль - библиотека работает значительно медленее чем ра Arduino Nano.
имхо, если на нано все работает - надо сделать из атмеги переходник для общения с ОВЕНом и все дела. Если пойдет библиотека, можно под переходник взять не атмегу328, а что-нибудь попроще, типа тини45 или 85
Пробовал считать при помощи Arduino Nano - без проблем
Схему подключения не скинете?
Да, вот:
Питаю микросхему от 3.3 В в случае с ESP32, и от 5-ти - Arduino.
имхо, если на нано все работает - надо сделать из атмеги переходник для общения с ОВЕНом и все дела. Если пойдет библиотека, можно под переходник взять не атмегу328, а что-нибудь попроще, типа тини45 или 85
Я думал над этим... Но хз как-то, городить горы микроконтроллеров это вообще как-то не это... Комильфо. Хотя в данный момент ничего не вижу кроме как сделать так.
На осциллограмме скорее всего шум. Что на шине МодБас, можно посмотреть ?
В "новой" библиотеке так же используется flush, так почему же она должна работать ? Я же дал вам пример исправления библиотеки, чем он вам не подошел ?
На осциллограмме скорее всего шум. Что на шине МодБас, можно посмотреть ?
В "новой" библиотеке так же используется flush, так почему же она должна работать ? Я же дал вам пример исправления библиотеки, чем он вам не подошел ?
Нет, не шум это, это шлёт ЕСПшка по мудбас, как я и говорил - в шине мудбас нули одни.
Спасибо большое за код, я подставлял его, всё равно ничего корректно не отрабатывало. Скорее всего где-то есть привязка к частоте микроконтроллера, у ардуины 16, а у есп32 240 МГц.
Не, нет никаких привязок. Вы можете в цикле с поднятой ножкой передача просто отправлять что то типа 0xAA и глянуть осциллографом что на шинах A и B ?
Да, вот:
Спасибо. Попробую Ваш скетч прикрутить к своей задаче, а то на библиотеке
ModbusRtu.h
у меня пока не получается.Спасибо. Попробую Ваш скетч прикрутить к своей задаче, а то на библиотеке
ModbusRtu.h
у меня пока не получается.Нет, это не мой скетч.
Не, нет никаких привязок. Вы можете в цикле с поднятой ножкой передача просто отправлять что то типа 0xAA и глянуть осциллографом что на шинах A и B ?
Без диференциирования интересует осциллограмма?
Лучше отдельно A-земля и B-земля...
Таки да, рекомендуютпитать от 5V.
Не, нет никаких привязок. Вы можете в цикле с поднятой ножкой передача просто отправлять что то типа 0xAA и глянуть осциллографом что на шинах A и B ?
Прошил код из этого поста в ESP32, на линии А относительно земли следующая картина(синий луч - А, жёлтый - RE/DE):
На линии В:
Вот такое с Вашей функцией, A:
На линии B:
Ножка направления явно рано сбрасывается
Попробуйте 11 строку в моей правке изменить :
А по правильности данных - не понятно. Меня вообще эти осциллограммы удивляют. У вас A и B обязаны быть противофазными. А я вижу обратное. Точно знаю что чудес не бывает. А у вас - чудо.
Вообщем принял решение выгрузить работу с RS-485 на ардуинку, устроил общение посредтвом UART и AT команд.
Надо же, нашёл библиотеку, которая завелась на ESP32, обзывается она - SimpleModbusMasterV2rev2_DUE.
Скетч:
Крутость этого решения заключается в том, что тут тебе и 2 ядра, и вай фай, и блютуз, АЦП и ЦАП... Я в своих наработках использую одно ядро под RS-485 а второе под простенький вебсервер, и ещё куча процессорного времени есть в запасе. ESP32 можная штука, это факт.
Ирония заключается в том, что когда вообщем всё сделал уже на ардуине в формате АТ-комманд, случайно наткнулся на эту библиотеку, месяц тупежа по сути.
Предлагаю изменить название темы на "ESP32 + RS-485(Mudbus RTU) = работает"
[ Araris: - изменил )) ]
Подтверждаю работу на ESP32 библиотеки SimpleModbusSlaveV10_DUE(режим Slave) из поста выше.
Прикинулся Овеном по ID и отсылал содержимое нужных регистров.
Схема подключения аналогичная как в этом посте, только питаю MAX485 от 5 В и сигнал подаю на RX/TX еэспэшки.
Вообщем огромный простор для полёта фантазии учитывая колличество памяти в ESP32 ;)
Ха, поспешил я радоваться. примерно через минут 5 еспшка перестаёт отвечать на запросы по RS-485
И лечится всё только перегрузкой платы...
Похоже всё решилось, слишком часто теребил функцию modbus_update(); - прибавил делей на 50 мс и всё заработало.
Похоже всё решилось, слишком часто теребил функцию modbus_update(); - прибавил делей на 50 мс и всё заработало.
Hello HWMan,
can you please share the code and modifications done to run this library on ESP32
Похоже всё решилось, слишком часто теребил функцию modbus_update(); - прибавил делей на 50 мс и всё заработало.
Hello HWMan,
can you please share the code and modifications done to run this library on ESP32
Здравствуйте господа! Может кто знает? Библиотека SimpleModbusMaster_DUE, опрос, а также запись регистров ведется пачкой, и по циклу при помощи modbus_update();, есть ли в этой библиотеке возможность записи отдельно каждого пакета? Смысл в том, что мне необходимо запись производить только один раз, когда мне это нужно, а не в цикле вмеcте с чтением. И если есть, может примеры найдутся? В сети информацию на эту тему найти не получается.
Приведённая в статье библиотека не работает на передачу. Пробовал её использовать в своём проекте - мастер не может корректно прочитать данные, причём на любой скорости. Читает две переменные по два регистра, а третью уже не читает. На приём всё работает.
Для ESP32 используйте лучше вот это:
emelianov/modbus-esp8266: Наиболее полная библиотека Modbus для Arduino. Библиотека, которая позволяет вашей плате Arduino взаимодействовать по протоколу Modbus, выступая в качестве хозяина, ведомого или обоих. Поддержка сетевого транспорта (Modbus TCP) и последовательной линии/RS-485 (Modbus RTU). Поддержка безопасности Modbus TCP для ESP8266/ESP32. (github.com)
Объектно-ориентированный драйвер MODBUS, поддерживает весь стандарт MODBUS, поддерживает многопоточность и события. Можно несколькими потоками работать с общим портом. Можно несколькими портами обращаться к одним и тем же данным. Рекомендую.
З.Ы. Как убрать простыню текста из ссылки я не понял. Куча каких-то мутных настроек, которые ни на что не влияют.
...
Приведённая в статье библиотека не работает на передачу. Пробовал её использовать в своём проекте - мастер не может корректно прочитать данные, причём на любой скорости. Читает две переменные по два регистра, а третью уже не читает. На приём всё работает.
Для ESP32 используйте лучше вот это:
emelianov/modbus-esp8266: Наиболее полная библиотека Modbus для Arduino. Библиотека, которая позволяет вашей плате Arduino взаимодействовать по протоколу Modbus, выступая в качестве хозяина, ведомого или обоих. Поддержка сетевого транспорта (Modbus TCP) и последовательной линии/RS-485 (Modbus RTU). Поддержка безопасности Modbus TCP для ESP8266/ESP32. (github.com)
Объектно-ориентированный драйвер MODBUS, поддерживает весь стандарт MODBUS, поддерживает многопоточность и события. Можно несколькими потоками работать с общим портом. Можно несколькими портами обращаться к одним и тем же данным. Рекомендую.
З.Ы. Как убрать простыню текста из ссылки я не понял. Куча каких-то мутных настроек, которые ни на что не влияют.
Здравствуйте. Вопрос к МОРЗЕ.
Поработал с библиотекой, что вы порекомендовали (https://github.com/emelianov/modbus-esp8266)
Возможно у вас есть рабочий пример кода записи с ЕСП32 в ПЛК, или в ПР200. Поделитесь пожалуйста, не могу справиться с библиотекой.
Вот мой код для считывания с ПР200-го. Он рабочий, а вот записать не получается.
Записать может только мастер. Слейв может только ответить. Мастер поднимается в 19 строке, но дальше в коде вызова нет. Нужно заполнить так называемую телеграмму и отправить. В примерах работа с мастером есть.
А вы вообще в курсе, как MODBUS работает? В сегменте сети MODBUS есть один ведущий (он же мастер) и до 32 ведомых. Ведущий по очереди отправляет ведомым сообщения. Ведомые отвечают только тогда, когда у них запрашивают данные. Сами по себе ведомые никогда ничего не отправляют. Говоря компьютерными терминами, мастер является клиентом, а все ведомые - серверами.
Я делал ведомого, работу с ПЛК через обработчики событий реализовал, работал только с регистрами. Но там можно с любой адресной зоной MODBUS работать, смотрите примеры.
1. Делаете ПЛК мастером, а ардуинку ведомым.
2. Настраиваете у мастера в свойствах скорость обмена, адрес ведомого в сети и опрашиваемые регистры.
Вот пример программы:
строчки 45-50 лишние....
Угу, давайте не будем чистить регистры перед отладкой чтобы любоваться мусором в них. :)
Угу, давайте не будем чистить регистры перед отладкой чтобы любоваться мусором в них. :)
так вы не регистры чистите, а локальный массив для них. А в нем и так нули после ресета, читайте описание языка
МОРЗЕ если уж вы хотите, чтобы инициализация массива была явной, просто добавте ее в обьявление массива:
хотя повторяю. по стандарту языка в этом нет необходимости
Я очень хорошо знаю как работать c MODBUS. Написал кучу мастеров и слейвов и даже на Delphi PCшном. У меня в реальном режиме времени через него графики шестифазного выпрямителя бегают. Вот только проблема в том, что мастера ничего нельзя попросить. Совсем нельзя. Если сделать мастером ПЛК, то надо его программировать на выдачу данных либо через интервалы времени, либо по внешнему событию. Очень интересно узнать, как у Вас реализован обработчик событий.
Точно мусором ?
Я все время думал, что при объявлении переменных в них не мусор, а инициализация по умолчанию (0)...
Записать может только мастер. Слейв может только ответить. Мастер поднимается в 19 строке, но дальше в коде вызова нет. Нужно заполнить так называемую телеграмму и отправить. В примерах работа с мастером есть.
Я знаю что записать может только мастер
У меня ПР-200 будет точно "slave", и ЕСП32 "master", я хочу слать команды с ЕСП32 на овен.
Я сейчас ничего не отписываю, нашел эту тему (http://arduino.ru/forum/programmirovanie/modbus-rtu), перечитываю ее и пытаюсь разобраться.
В данной ветке обсуждается несколько библиотек
1. (https://github.com/emelianov/modbus-esp8266)
#include <ModbusRTU.h>
2. (https://github.com/smarmengol/Modbus-Master-Slave-for-Arduino)
#include <ModbusRtu.h>
Видите слово RTU / Rtu один раз большие а второй раз маленькие буквы, это две разные библиотеки.
Сейчас пытаюсь разобраться с той, где телеграмм (https://github.com/smarmengol/Modbus-Master-Slave-for-Arduino).
Для ESP святцы рекомендуют только #11
Для ESP святцы рекомендуют только #11
Я и начинал с этой библиотеки. И вот на ней получилось получить данные с ОВЕН (конфигарация ESP- master, овен - slave) #34.
Но тогда вы сказали, что нужно слать через телеграмму, а в данной библиотеке я не нашел как это сделать, поэтому и начал пробовать на такой (https://github.com/smarmengol/Modbus-Master-Slave-for-Arduino)
В этой библиотеке телеграмму спрятали в библиотеку. Упростили до нельзя. Пример тут. Создание запроса строка 38. Печать ответа слэйва 43-44.
В этой библиотеке телеграмму спрятали в библиотеку. Упростили до нельзя. Пример тут. Создание запроса строка 38. Печать ответа слэйва 43-44.
Получилось. Спасибо.
Здравствуйте, люди добрые. Помогите, пожалуйста. Что-то я совсем застрял.
Пример из сообщения #47 не выводит в сериал-порт содержимое регистров.
Ведомое устройство (прога на компе) получает запрос и правильно отвечает на него:
Rx:000000-01 03 00 00 00 02 C4 0B
Tx:000001-01 03 04 00 42 7E B2 FB F2
А ESP32(master) с кодом из примера #47 в сериал выводит только:
Request result: 0xE40
0
Request result: 0xE40
0
...
Как я догадываюсь, обработка ответа уже есть в библиотеке modbus-esp8266 и строки 43-44 должны печать ответ слэйва?
Или ESP32 нужен обработчик ответа (как в примерах для слэйва из той же библиотеки)?
Меня смущает, что контакты DE, RE у MAX485 висят в воздухе.
А ни кто не обещал что с 485 будет работать. Тут только 485 с автоматическим Rx-Tx пользовать. А результат должен быть 0 если всё правильно, иначе печатает код ошибки - Е4, что мы и видим. Пробуйте без 485, когда всё получится думайте как 485 прикрутить.