• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Modbus TCP / RTU RS-485 + WEB server

pvvx

Активный участник сообщества
pvvx, вы писали, что для инициализации транзакторов при старте ESP нужно файл mdb.bin переименовать в mbdini.bin и записать его на диск в директорию protect. Так вот я настроил транзакторы, выкачал mdb.bin, переименовал его, а вот как его в ESP отправить в директорию protect? Всю голову сломал, подскажите как это делается?
Кладете в папочку проекта WEBFiles\protect\ ваш файл, редактируете если надо другие HTM и прочие файлы, затем создаете новый образ диска с помощью make_webfs.bat или через программу WEBFS22.exe. Далее заргужаете новый образ диска с изменениями в ESP... Путей тут множество и неоднократно всё описано в соседних темах про данный Web.
Инициализацию можно описать и командами в WEBFiles\protect\init.ini... Отредактируйте его, прежде чем создавать новый образ Web-диска. Изначально он содержит глупый пример :)
Не хочется дублировать темы. Про Web, WiFi, как редактировать, как работать с переменными и прочие настройки и манипуляции с ним уже есть основная тема Разработка ‘библиотеки’ малого webсервера на esp8266...
А тут, чтобы не заваливать дублированием желательно разбирать только что связано Modbus...
 

MagISTRa

New member
@pvvx Привет, клас проект. Тоже реализовал его даже в 2-х устройствах. У меня 2 счетчика с ModBus - Интегрировал в первый и во второй ESP-01. получилось 2 устройства в WiFi сети отвечающие на ModBus/TCP все это чудо опрашивает Fibaro HC2. и все бы вроде работает по 1 счетчику, а вот по второму даже когда опрос устройства не идет время от времени сбрасывается номер порта 502 в настройках ModBus. Взял другой ESP-01 пролил проектом, такая же проблема. Slave устройства по ModBus одинаковые. читается от туда 20-30 регистров. Уже всю голову изломал почему может номер порта сбрасываться ?
 

pvvx

Активный участник сообщества
Уже всю голову изломал почему может номер порта сбрасываться ?
Найдите привязку по конкретнее, что -там и когда. Сейчас просто не занят этим, но для исправления ошибки надо побольше инфы...
Проект то лепился всего за несколько дней и ничего не откатано ещё... Некогда его протестировать полностью...
Если закрывается порт, то там задание время ограничения соединения есть. Паузы до первой посылки и после последней - вроде 10 секунд по умолчанию. Возможно это у вас надо увеличить - на веб странице...
 
Последнее редактирование:

MagISTRa

New member
@pvvx Вообщем из конкретики.
У меня на Fibaro HC2 есть скрипт что шлет запрос типа
tcpSocket = Net.FTcpSocket("192.168.1.22", 502)
frame = string.char(0x00,0x01,0x00,0x00,0x00,0x06,ModBusAdr,0x03,RegNum1,RegNum0,0x00,0x02)
ждем ответ
fibaro:sleep(200)
s, e = tcpSocket:read()
Далее разбираем ответ и смотрим что нам прислали.

Сам скрипт работает на виртуальном устройстве.
Так вот если в параметры виртуального устройства вбить ("192.168.1.22", 502) - адрес шлюза в домашней сети. Получаем на странице настроек ModBus - регулярный сброс параметра Modbus TCP port: 502 в 0

То есть я так понимаю какой то командой из вне, или запросом можно менять параметры шлюза.
Это правильно ?
 

pvvx

Активный участник сообщества
То есть я так понимаю какой то командой из вне, или запросом можно менять параметры шлюза.
Это правильно ?
Да. Через web запросы с переменными. Переменные указаны в WebVars.xlsx и в Info на самом Web-Esp.
Так-же есть "дырка" (для отладки) в буфере данных Modbus с 1300 ячейки - они прямо в памяти heap ESP :) Закройте её в https://github.com/pvvx/esp8266rs485/blob/master/app/mdbtcp/mdbtab.c#L205
К примеру так:
Код:
{MDB_SYS_VAR_ADDR+100,0x7FFF, NULL, NULL}, // с адреса 1300 до 32767 отображать нули и запись запрещена.
 
Последнее редактирование:

pvvx

Активный участник сообщества
Проверил, не сбрасывает порт. Скинул в git. Прошивки готовой в релизах пока нет... позже будет с номером 0.0.0.4.
 

MagISTRa

New member
@pvvx Еще несколько проблем.
Если собрать, прошить все. Работает, порт вроде не сбрасывает, но -
- для прошивки использую USB то UART на базе SP2102 -
Если флеш пустая( после clear) или с родным NodeMCU шьется под Eclipse и определяется переходник. Заливаем прошивку - все переходника не видно в системе:((

Может делаю что не так ? на 3 платах проверял. Везде аналогично :(

Берем переходник на FTDI 232 - с прошитой платой то определяется то нет.
Ловим момент когда Com порт нормально определился - шьемся. Все ОК
Странно.

- привязка к конкретному BSSID в настройках WiFi - не запоминается
- прописываем MAC конкретный, ставишь птичку - говоришь сохранить - модуль считает 10 секунд, страница загружается все тоже остается без птички привязки к BSSID.
Пробовал через поиск - конектиться к нужной сети ставишь галку - перезагружаешь модуль конектиться к сети с лучшим сигналом и галка пропадает. У меня для теста 3 точки с одинаковым именем сети - на разных каналах !!

Фантастика :)))
Ну там по мелочи - типа - ставишь канал в WiFi SofAP - в Auto - нет тоже не запоминает,
Причем на одной плате запомнил на 2-х други нет !!
Пробовал под Safari, Crome, Mozzila - думал может в браузере дело - нет, одна то плата запомнила.
 
Последнее редактирование:

pvvx

Активный участник сообщества
@pvvx Еще одна трабла. Если собрать, прошить все. Работает, порт вроде не сбрасывает, но -
- Раньше уровень приемного сигнала RSSI: по лучше был !!
Я на это не влияю :)
- для прошивки использую USB то SP2102 переходник на UART -
Если флеш пустая( после clear) или с родным NodeMCU шьеться и определяется переходник
Заливаем прошивку - все переходника не видно :((

Может делаю что не так ? на 3 платах проверял.
Большинство вариантов плат NodeMCU кривые. Там много чего не работает. Например deep_sleep. Напаяны неверные номиналы и схема не позволяет соединить правильно reset c GPIO16...
Счас в наличии только плата аналог NodeMCU c надписью ESP12E DevKit с 4Mbytes Flash. Все работает, но deep_sleep только после перепайки номиналов резисторов.
Да и как ESP8266 может влиять на USB? :confused:
Только питанием - значит что-то не то прописано в конфиг микросхемы USB - не тот ток потребления или неисправен комп (выход USB - не может выдать ток по стандарту).
- привязка к конкретному BSSID в настройках WiFi - не запоминается
- прописываем MAC конкретный, ставишь птичку - говоришь сохранить - модуль считает 10 секунд, страница загружается все тоже остается без птички привязки к BSSID.
Пробовал через поиск - конектиться к нужной сети ставишь галку - перезагружаешь модуль конектиться к сети с лучшим сигналом и галка пропадает. У меня для теста 3 точки с одинаковым именем сети - на разных каналах !!
И не будет - это китай фича. Надо стирать имя SSID.

Ну там по мелочи - типа - ставишь канал в WiFi SofAP - в Auto - нет тоже не запоминает,
Причем на одной плате запомнил на 2-х други нет !!
Номер канала только тот к которому включена ESP как STATION = номеру канала AP к которой подключена. По другому никак - не будет связи и ESP неполноценная AP, а SOFTAP.

Как я понял глюков больше нет. :)
 
Последнее редактирование:

pvvx

Активный участник сообщества
С bssid расширенно, т.к. ошибся и написал по старому...
Теперь у китайцев написано: Note: If bssid_set is 1, station will just connect to the router with both ssid[] and bssid[] matched. Please check about this.
Т.е. bssid как доп. проверка.
Поиск подключения (авто-коннект) включает только если задано ssid.
Обращайтесь к китайцам, я эту часть патчить в их коде не буду.

С галкой - она не ставится, т.к. это они оставили по старому - галка включения bssid не воспринимается если задано ssid. Ну китайцы - что с них взять :(
В итоге только такой манипуляцией можно заставить воспринять китайский код принять галочку включения bssid:
1) Скачать новую версию c git - там теперь можно задать пустое имя ssid
2) Задать пустое ssid, правильный bssid, включить галочку и сохранить.
3) Задать имя ssid и сохранить.
 
Последнее редактирование:

ACQ

New member
Доброго всем дня! Команда mdbfini не работает. Файл mbdini.bin создал (в нем транзакторы вижу), в диск добавил в папку protect. В init.ini команда прописана: mdbfini=protect/mbdtini.bin. И все равно при старте esp транзакторы обнуляются. Пробовал командой http://aesp8266/web.cgi?mdbfini=protect/mbdini.bin тоже не работает (
 

pvvx

Активный участник сообщества
Доброго всем дня! Команда mdbfini не работает. Файл mbdini.bin создал (в нем транзакторы вижу), в диск добавил в папку protect. В init.ini команда прописана: mdbfini=protect/mbdtini.bin. И все равно при старте esp транзакторы обнуляются. Пробовал командой http://aesp8266/web.cgi?mdbfini=protect/mbdini.bin тоже не работает (
mdbini.gif
make_webfs.bat:
WEBFS22.exe -h "*.htm, *.html, *.cgi, *.xml, *.bin, *.txt, *.wav" -z "*.bin, *.inc, *.ini, snmp.bib" .\WEBFiles .\webbin WEBFiles.bin

На web-диске файлы, которые не парсятся на переменные сжимаются gzip для уменьшения размера и передаются по HTTP сжатыми.
Файл с бинарными данными для mdb не должен быть сжат gzip и желательно исключен из проверки на динамические переменные. Можно ему дать спец. расширение и вписать в список исключений для сжатия. Можно использовать уже готовое вписанное исключение для "*.ini" - например назвать: "protect/mdbini.ini".
 
Последнее редактирование:

Dito85

New member
@pvvx, спасибо за подсказки, все получилось! Столкнулся еще с одной сложностью. В буфере есть десять байт, которые пишутся в slave устройство. Инициализировать при старте esp эти десять байт нет смысла, т.к. они периодически меняются. Получается при перезапуске ESP, буфер обнуляется и в slave устройство отправляются нули. Я пока не силен в архитектуре esp, но может есть возможность, например, при пропадании питания (по пропаданию сигнала с GPIO) переводить esp в режим сна и держать буфер от резервного источника питания - ионистора или аккумулятора? Или может есть еще способ сохранять буфер при потере питания?
 

pvvx

Активный участник сообщества
В буфере есть десять байт, которые пишутся в slave устройство. Инициализировать при старте esp эти десять байт нет смысла, т.к. они периодически меняются. Получается при перезапуске ESP, буфер обнуляется и в slave устройство отправляются нули. Я пока не силен в архитектуре esp, но может есть возможность, например, при пропадании питания (по пропаданию сигнала с GPIO) переводить esp в режим сна и держать буфер от резервного источника питания - ионистора или аккумулятора? Или может есть еще способ сохранять буфер при потере питания?
Записывать в Flash часто меняемые данные накладно - дыра выйдет. Можно подключить память RTC, но для неё надо выводить ножку питания с чипа, которая не выведена.
См. Потребление по питанию часов (по ноге RTC_VDD)...
Можно инициализировать этот буфер (как и другие переменные) по старту командами в WEBFiles\protect\init.ini вписав туда mdbwADDRBUF=x,x,x,x,x,x... А если провели питание на RTC - инициализируйте один раз, вызовом через Web специально составленного hml файла.
В git скинута новая версия - в ней теперь в mdb отображены 256 слов RTC памяти с адреса 1300 по 1555.
 
Последнее редактирование:
Сверху Снизу