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.
 
Последнее редактирование:
Сверху Снизу