• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Modbus TCP / RTU RS-485 + WEB server

alikxus

New member
С "parity" поиграйтесь. Может не соответствует установкам с другой стороны модуля.
заработало, проблема была в - при больших скоростях, может потребовать дополнительной подтяжки к +3.3В - как то не обратил на это особого внимания, скорость выставил 9600, а оказалось тоже не хватает. Спасибо за помощь. Осталось понять как этот буфер сохранять при отключения питания в самом nodemcu.
 

DorianGray

New member
Добрый день. Возникло несколько сложностей. Пытаюсь добавить подключение к серверу с помощью TCP/IP, но что-то не очень получается. Вот у вас есть возможность через WEB-морду настроить подключение к серверу, задав IP сервера. Разобрался где в коде происходит прием данных - насколько я понял это функция tcpsrv_received_data_default(TCP_SERV_CONN *ts_conn).
Поискав, я нашел функцию tcpsrv_int_sent_data, с помощью которой отправляю данные на сервер.
Но непонятно что значит "вызывать только из call back с текущим pcb!" в описании функции tcpsrv_int_sent_data.
В общем мне необходимо настроить передачу параметров на сервер, но как добавить новый сокет я немогу понять никак.
Плиз, дайте пинок в нужном направлении.
 

pvvx

Активный участник сообщества
Но непонятно что значит "вызывать только из call back с текущим pcb!" в описании функции tcpsrv_int_sent_data.
Соединение уже может быть закрыто, по этому и написано. Надо проверять активность pcb перед выводом и что она принадлежит тому соединению. Индекс pcb - это указатель в памяти heap на блок pcb. Он быть уже освобожден LwIP и занят другой pcb. Обработка ввода идет по прерываниям - асинхронно к другим процессам...
В общем мне необходимо настроить передачу параметров на сервер, но как добавить новый сокет я немогу понять никак.
Плиз, дайте пинок в нужном направлении.
По аналогии с тем не сделать, т.к. он специфический. Для этого есть пример - esp8266web/ovls/tcp_client:
Пример TCP клиента.
Считывает температуру воздуха из HTML по адресу weather-in.ru - погода в Санкт-Петербург (север) (г. Санкт-Петербург, Пушкинский район) - прогноз погоды в России на 3 и 5 дней
 

DorianGray

New member
Окей, в плане сокетов понял куда копать, спасибо большое за напутствие.
Пока данные передаю с помощью сокета ModbusTcpClient-а. Но возникла какая-то непонятная проблема - при формировании пакета для передачи (простенькой JSON посылки), с помощью функций os_memcpy получается следующая непонятка, пакет в буфере собирается нормально и отправляется на сервер, на сервере все принимается корректно. Но возникает проблема в расчете CRC для транзактора - не погу понять почему так происходит. При размере JSON пакета больше 170 байт, CRC перестает правильно рассчитываться :(
UPD 1:
Ощущение что чего-то не хватает , то ли стека, то ли RAM то-ли flash =(
UPD 2:
Решил проблему, тем что переместил таблицу для расчета CRC из flash в RAM. Получается, не хватает памяти для пользовательской прошивки и данные немного перетираются другим сегментом - буду смотреть линковку и сегментацию адрресного пространства.
 
Последнее редактирование:

Urbas81

Member
Добрый день! Подскажите реально ли прикрутить к этому проекту протокол mqtt, в examples есть рабочий esp_mqtt, но с переносом всех библиотек в проект возникает куча ошибок, хватит ли ресурсов, может и не стоит пытаться, а если ресурсов хватит, подскажите как это сделать, структура проекта отличается от тех что в примерах и вообще возможно ли это?
 

pvvx

Активный участник сообщества
Добрый день! Подскажите реально ли прикрутить к этому проекту протокол mqtt, в examples есть рабочий esp_mqtt, но с переносом всех библиотек в проект возникает куча ошибок, хватит ли ресурсов, может и не стоит пытаться, а если ресурсов хватит, подскажите как это сделать, структура проекта отличается от тех что в примерах и вообще возможно ли это?
Нет - я против mqtt, но сделать можно всё. :)
 

Urbas81

Member
Руками. Берете исходники, стыкуете и собираете :)
Можно и без этого - прописываете скрипт на роутере на стыковку Websocket <-> mqtt.
Ну я так и начал, но так как в Вашем проекте используется не весь функционал SDK и стек другой то появились сразу проблемы.
 

pvvx

Активный участник сообщества
Ну я так и начал, но так как в Вашем проекте используется не весь функционал SDK и стек другой то появились сразу проблемы.
Стек у ESP8266 у всех один = LwIP.
Китайскую нашлепку espconn не использую - она от версии к версии SDK с разными багами...
 

Urbas81

Member
А такой еще вопрос, хочу попробовать присоединить 7 сегментный индикатор на MAX7219, обмен по SPI, есть работающие варианты из других проектов, хотел попробовать втиснуть сюда, хотел узнать в каком файле лучше добавить код, так чисто для проверки без создания своих файлов?
 

Urbas81

Member
имхо в оверлей.
скомпилил загрузил, проверил, не понравилось п1. (без перепрошивки)
Подключил библиотеку, в первом приближении работает, попробую библиотеку дрделать, а то она под матрицу была, а у меня индикатор. С оерлеями пока не сильно понял как работать, да и что то у меня не прописано, выскакивают ошибки при сборке.
 

Urbas81

Member
а скромно так лог ошибок спросить можно?
и как обошли? что оверлеи не компилятся.
Ну прошивка то собиратся, а пишет вот что:
c:/Espressif/xtensa-lx106-elf/bin/xtensa-lx106-elf-gcc -Os -Wall -Wno-pointer-sign -fno-tree-ccp -mno-target-align -mno-serialize-volatile -foptimize-register-move -Wundef -Wpointer-arith -Werror -Wl,-EL -fno-inline-functions -nostdlib -mlongcalls -mtext-section-literals -DICACHE_FLASH -DPBUF_RSV_FOR_WLAN -DLWIP_OPEN_SRC -DEBUF_LWIP -I ./include -I ../include -I ../../include -I C:/Espressif_new/Work/esp8266web-0.6.2/include -I C:/Espressif_new/Work/esp8266web-0.6.2/app/include -o .output/eagle/obj/main.o -c main.c
main.c: In function 'drv_recv':
main.c:72:7: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
drv_host_ip = *addr;
^
main.c:74:4: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
udpbuflen = ets_sprintf(pudpbuf, DRV_ip_str, IP2STR(&drv_host_ip), port);
^
main.c:74:4: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
main.c:74:4: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
main.c:74:4: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
main.c: In function 'test_timer_isr':
main.c:156:4: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
drv_press = sblk_data->press = bmp280_compensate_P_int32(&bmp280);
^
main.c:162:9: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
if(err == ERR_OK) udp_sendto(pcb_udp_drv, z, &drv_host_ip, drv_host_port);
^
main.c: In function 'init_udp_drv':
main.c:187:2: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
if(drv_host_port == 0 || drv_host_ip.addr == 0) {
^
main.c:189:3: error: dereferencing type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
drv_host_ip.addr = 0xFFFFFFFF;
^
cc1.exe: all warnings being treated as errors
make[4]: *** [.output/eagle/obj/main.o] Error 1
make[4]: Leaving directory `/c/Espressif_new/Work/esp8266web-0.6.2/ovls/10dof/main'
make[3]: *** [.subdirs] Error 2
make[3]: Leaving directory `/c/Espressif_new/Work/esp8266web-0.6.2/ovls/10dof'
make[2]: *** [.subdirs] Error 2
make[2]: Leaving directory `/c/Espressif_new/Work/esp8266web-0.6.2/ovls'
mingw32-make[1]: *** [.output/eagle/bin/eagle.app.v6.bin] Error 2
../Makefile:225: recipe for target '.output/eagle/bin/eagle.app.v6.bin' failed
mingw32-make.exe: *** [.subdirs] Error 2
mingw32-make[1]: Leaving directory 'C:/Espressif_new/Work/esp8266web-0.6.2/app'
C:/Espressif_new/Work/esp8266web-0.6.2/Makefile:282: recipe for target '.subdirs' failed

19:41:57 Build Finished (took 6s.422ms)
 
Сверху Снизу