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

Modbus TCP / RTU RS-485 + WEB server

pvvx

Активный участник сообщества
@pvvx Modbus TCP может работать мастером?
В данной реализации - Нет, но... у нас "мост" - Bridge со всеми вытекающими :) Все условия описать сложно - там пытались https://esp8266.ru/forum/threads/modbus-tcp-rtu-rs-485-web-server.911/page-2#post-14051
Понятия Modbus TCP Клиент / Сервер Мастер / Подчиненный Ведущий / Ведомый Master / Slave в базовой версии описания имеют инверсию...
В прошивке TCP сервер. Клиент к нему подключается. По понятиям Modbus может быть всё сверху наголову, смотря кого и чем называть: "клиент TCP" обычно имеет мастера Modbus.
Для Bridge это всё равно...
 
Последнее редактирование:

Алексей.

Active member
Подскажите пожалуйста есть ли возможность использовать это решение для построения обычного tty устройства на ПК?
Задача простая, приложение third party ничего не знает про всякие пробросы tcp в uart, но замечательно работает с последовательным интерфейсом.
Необходимо построить драйвер ядра который будет монтировать tty устройство например /dev/ttyESPx и через него взаимодействовать с преобразователем tcp-uart.
 

pvvx

Активный участник сообщества
Подскажите пожалуйста есть ли возможность использовать это решение для построения обычного tty устройства на ПК?
Задача простая, приложение third party ничего не знает про всякие пробросы tcp в uart, но замечательно работает с последовательным интерфейсом.
Необходимо построить драйвер ядра который будет монтировать tty устройство например /dev/ttyESPx и через него взаимодействовать с преобразователем tcp-uart.
Возможно вам надо Прошивка TCP2UART переходника с настройкой по Web ?
 

Алексей.

Active member
Спасибо за ответ, но немного не то, прошивка то может быть и то что нужно но дело не в ней, нужно решение в котором прошивка - только часть (back-end если хотите).
Стороннее приложение занимается сбором данных согласно (или почти согласно) протокола modbus, открывает /dev/ttyxxx какой скажут и на указанной скорости, перед опросом выдерживает 3.5 байтных интервала тишины, отправляет запрос и ожидает ответ, при получении ответа контролирует таймаут получения очередного байта (1.5 байтного интервала), ну в общем как в учебнике.
Так вот хотелось получить код, установив который на ПК я бы получил tty устройство (пусть виртуальное).
Я для kernel 3.19 делал простенький tty драйвер для железяки подключенной к usb, но давно это было ;)
Может кто нибудь здесь делал нечто подобное для tcp2uart?
А может и никому и не нужно всё это...
 

pvvx

Активный участник сообщества
Стороннее приложение занимается сбором данных согласно (или почти согласно) протокола modbus, открывает /dev/ttyxxx какой скажут и на указанной скорости, перед опросом выдерживает 3.5 байтных интервала тишины, отправляет запрос и ожидает ответ, при получении ответа контролирует таймаут получения очередного байта (1.5 байтного интервала), ну в общем как в учебнике.
Так вот хотелось получить код, установив который на ПК я бы получил tty устройство (пусть виртуальное).
Примерно про это и прописал направление в TCP2UART. Передача по инет блочная, а UART - последовательное устройство. В итоге в TCP2UART и стоит определение тишины при приеме в стандарте modbus, как разделитель передаваемых блоков по TCP. Именно tty. Ели набиваете символы быстро, то при возникновении паузы блок будет передан, а так-же там стоит задаваемая задержка в ms до отсылки накапливающегося буфера приема, чтобы реакция передачи не была долгой, если символы разбавлены паузами менее 3.5 символов...
Modbus не является классическим tty - он полудуплекс.
 

Алексей.

Active member
Примерно про это и прописал направление в TCP2UART. Передача по инет блочная, а UART - последовательное устройство. В итоге в TCP2UART и стоит определение тишины при приеме в стандарте modbus, как разделитель передаваемых блоков по TCP. Именно tty. Ели набиваете символы быстро, то при возникновении паузы блок будет передан, а так-же там стоит задаваемая задержка в ms до отсылки накапливающегося буфера приема, чтобы реакция передачи не была долгой, если символы разбавлены паузами менее 3.5 символов...
Никому и в голову не придет, я думаю, "набивать" кадры для modbus-а руками :):)
На один байт 10-11 бит-ов (1(старт) + 8(данные) + 1 или 2 (стопы или четность)) умножаем на 3.5 получаем 35-38 битов, на 19200 один бит 52 микросекунды соответственно 3.5 байтных интервала 1820-1976 микросекунд, задержка в ms - как то совсем грубо.
Не смотря на то что спецификация предусматривает для скоростей более 19200 1.75 миллисекунд тишины существуют контроллеры modbus работающие на скоростях до 115200, там ждать одну миллисекунду, просто терять время :)
 

pvvx

Активный участник сообщества
Никому и в голову не придет, я думаю, "набивать" кадры для modbus-а руками :):)
На один байт 10-11 бит-ов (1(старт) + 8(данные) + 1 или 2 (стопы или четность)) умножаем на 3.5 получаем 35-38 битов, на 19200 один бит 52 микросекунды соответственно 3.5 байтных интервала 1820-1976 микросекунд, задержка в ms - как то совсем грубо.
Не смотря на то что спецификация предусматривает для скоростей более 19200 1.75 миллисекунд тишины существуют контроллеры modbus работающие на скоростях до 115200, там ждать одну миллисекунду, просто терять время :)
Есть с другой головой - MCU и прочие автоматы - они набивают и быстрее, тем более что TCP2UART тянет и за 3 Мегабита... Данный modbus, впрочем тоже, но в стандарте оговорены уже другие паузы для таких скоростей, совсем как для человека - типа MCU не успеет (?)
Вы уж там определитесь - вам tty для терминала с человеком или для автомата? Автомату то совсем бир-бар какие там у вас паузы в голове - он может и по другому... :)
Есть и смешанные типы протоколов разбивки на блоки для передачи (заголовки и время) через последовательные каналы. Если вспомните историю, то это xmodem. А также с выбором приоритета для выхода на (в)однопроводную шину, по типу соединения TX в виде Oтрк.Kол. и RX... далее выразившееся в CAN протокол... Его подобие можно и на UART слепить :)
Т.е. modbus - это чистое принуждение автомата поступать по решению человека набивать кадры руками :p Из медного века, когда для изготовления меди по началу требовалось освоить всю цепочку технологий производства и обработки железа... Но история всегда идет по обратной спирали :)
 
Последнее редактирование:

Astronomocon

New member
Здравствуйте.
Есть задача обмениваться данными с modbus устройством. (настраивать его)

Не подскажете как сделать rest запрос для чтения одной или нескольких ячеек буфера обмена.

Сохранять данные в устройстве получается способом из инструкции:
http://aesp8266/web.cgi?mdba123=Hello!&mdbt0=1,16,4,123,0,0,0"
А вот как прочитать через get запрос?
 

Miekl

New member
Добрый день. Проект заинтересовал. Проектирую подобное. Просветите пжл несколько вопросов, правильно ли я понял:
1. PLC или PC передаёт данные по RS-484 Modbus RTU на модуль-конвертер RS-484-в-UART
2. модуль-конвертер RS-484-в-UART передаёт в ESP-8266 в WEB-сервер
3. С AP на смартфоне заходим по WiFi на WEB-сервер ESP-8266 и считываем информацию в память
 

pvvx

Активный участник сообщества
Добрый день. Проект заинтересовал. Проектирую подобное. Просветите пжл несколько вопросов, правильно ли я понял:
1. PLC или PC передаёт данные по RS-484 Modbus RTU на модуль-конвертер RS-484-в-UART
2. модуль-конвертер RS-484-в-UART передаёт в ESP-8266 в WEB-сервер
3. С AP на смартфоне заходим по WiFi на WEB-сервер ESP-8266 и считываем информацию в память
1.2.3 = Да, + поддерживаются другие варианты... Все основные варианты описаны в первом сообщении со ссылками.
 

AlekseyK

New member
Приветствую!
Пытаюсь запустить модуль esp07 на этой прошивке.
Вывел Debug на терминал.
Вэб морда работает.
Modbus TCP работает.
А вот Modbus RTU ну никак не могу получить ответы от модуля на запросы. Железяка 100% рабочая (UART проверял на других прошивках). Перепроверил осциллографом - на Rx модуля пакеты от поллера приходят, на Tx тишина. Может есть подводные камни какие?
В Debug порт выводятся сообщения о пакетах Modbus-RTU, или еще лучше трафик с UART-а ESP8266?
 

Вложения

Последнее редактирование:

pvvx

Активный участник сообщества
Приветствую!
Пытаюсь запустить модуль esp07 на этой прошивке.
Вывел Debug на терминал.
Вэб морда работает.
Modbus TCP работает.
А вот Modbus RTU ну никак не могу получить ответы от модуля на запросы. Железяка 100% рабочая (UART проверял на других прошивках). Перепроверил осциллографом - на Rx модуля пакеты от поллера приходят, на Tx тишина. Может есть подводные камни какие?
В Debug порт выводятся сообщения о пакетах Modbus-RTU, или еще лучше трафик с UART-а ESP8266?
В Modbus RTU не бывает 1 stop bit без parity. Символ в Modbus RTU всегда 11 бит.
Снимок50.gif
The Modbus Organization
http://www.modbus.org/docs/Modbus_over_serial_line_V1.pdf
http://www.modbus.org/docs/Modbus_over_serial_line_V1_02.pdf
...
Снимок51.gif
 
Последнее редактирование:

Virtual

New member
Спасибо за ответ, но немного не то, прошивка то может быть и то что нужно но дело не в ней, нужно решение в котором прошивка - только часть (back-end если хотите).
Стороннее приложение занимается сбором данных согласно (или почти согласно) протокола modbus, открывает /dev/ttyxxx какой скажут ....
проще взять исходник этого приложения и часть что работает с уарт-ом переделать на TCP-IP всяко получится более стабильно. и даже более кратко.
 

AlekseyK

New member
Благодарю Вас за ответ!
Разобрался. В трёх соснах заблудился)))
Жаль железяка не под рукой. После НГ буду пробовать запустить.
Спасибо за Ваш проект!
Всех с наступающим Новым Годом!
P.S. а можно ли всё таки задать настройки 8N1 не залезая в исходники ? В Вашем help:
Parity– выбор варианта передачи бита parity. Если равно “none”, то передается 2 стоп бита, один за место parity (стандарт Modbus RTU использует 11 бит на символ). Устанавливается и нестандартная передача в 1 стоп бит (10 бит на символ).
 
Последнее редактирование:

Urbas81

Member
Подскажите, решит ли проблему нехватки памяти использование платы с 16Mb памяти, проблема в следующем, хочу добавить в проект поддержку карт SD, но при компиляции -24000 kB, хотя сам проект компилируется, сейчас 4Mb, но в самом проекте это вроде как нигде не указывается, или может есть возможность высвободить память за счет уменьшения WeB, при выводе из проекта ModBus RTU все ОК, но модбас как раз нужен, есть ли выход?
 

pvvx

Активный участник сообщества
Подскажите, решит ли проблему нехватки памяти использование платы с 16Mb памяти, проблема в следующем, хочу добавить в проект поддержку карт SD, но при компиляции -24000 kB, хотя сам проект компилируется, сейчас 4Mb, но в самом проекте это вроде как нигде не указывается, или может есть возможность высвободить память за счет уменьшения WeB, при выводе из проекта ModBus RTU все ОК, но модбас как раз нужен, есть ли выход?
Имеющиеся варианты подключения SD карты с FAT/FAT32 на ESP8266 очень медленные. Перенос туда файлов для Web вызовет сильное падение его производительности в отдаче файлов. Остается вариант использования SD как накопителя со своей линейной структурой, без всяких FAT.
Так-же, многие SD не терпят отключения питания в момент записи. Для этого вам придется или не использовать запись на SD или ставить систему поддержки резервного питания на время записи SD.
Т.е. всё это очень специфично и не оптимально для реализации на ESP8266.
Проще взять WiFi-SoC имеющий полный стандартный аппаратный контроллер SD. При этом работа с такими контроллерами заключается в указании ему какие сектора прочитать и куда их положить по DMA в память.

И ещё не понятны ваш указания на "-24000 kB" и "4Mb".
"4Mb" - это Flash на 512 килобайт?
"-24000 kB" - это надо 24 МегаБайта? Для чего?

Непонятно что не лезет. Сам код проекта? У ESP XIP ограничен 1 МБайт. Для увеличения от базового в 512 килобайт требуется изменение *.ld файла и перенос области сохранения WiFi настроек.
Сам Web-диск работает вне области XIP. В базе, с Flash на модуле в 16 Мегабайт - размер диска 15.5 Мегабайт.
На любой Flash у модуля, имеющей более 512 килобайт, Web-диск располагается за границей 512 килобайт. Базовый проект на таких flash имеет пустое место на 230 килобайт. У вас такой длинный дополнительный код - имеет размер больше SDK + Web? :eek:
Вот данные при сборке базового проекта:
Код:
------------------------------------------------------------------------------
   Section|                   Description| Start (hex)|   End (hex)|Used space
------------------------------------------------------------------------------
      data|        Initialized Data (RAM)|    3FFE8000|    3FFE838C|     908
    rodata|           ReadOnly Data (RAM)|    3FFE838C|    3FFE8E04|    2680
       bss|      Uninitialized Data (RAM)|    3FFE8E08|    3FFEF888|   27264
      lit4|     Uninitialized Data (IRAM)|    40105910|    4010651C|    3084
      text|          Uncached Code (IRAM)|    40100000|    40105910|   22800
irom0_text|             Cached Code (SPI)|    40207000|    402400DB|  233691
------------------------------------------------------------------------------
В irom0_text области с 0x40207000 размером в 0x72000 байт использовано всего 233691 байт.
Остаток -> 233253 байт для вашего кода, при условии, что web-диск записывается за областью первых 512 килобайт Flash ( т.е. это автоматически почти на всех модулях с Flash более 512 килобайт). Незанятая область в irom0_text используется для Web-диска только в случае, если модуль имеет Flash в 512 килобайт всего.
 
Последнее редактирование:

Urbas81

Member
Имеющиеся варианты подключения SD карты с FAT/FAT32 на ESP8266 очень медленные. Перенос туда файлов для Web вызовет сильное падение его производительности в отдаче файлов. Остается вариант использования SD как накопителя со своей линейной структурой, без всяких FAT.
Так-же, многие SD не терпят отключения питания в момент записи. Для этого вам придется или не использовать запись на SD или ставить систему поддержки резервного питания на время записи SD.
Т.е. всё это очень специфично и не оптимально для реализации на ESP8266.
Проще взять WiFi-SoC имеющий полный стандартный аппаратный контроллер SD. При этом работа с такими контроллерами заключается в указании ему какие сектора прочитать и куда их положить по DMA в память.

И ещё не понятны ваш указания на "-24000 kB" и "4Mb".
"4Mb" - это Flash на 512 килобайт?
"-24000 kB" - это надо 24 МегаБайта? Для чего?

Непонятно что не лезет. Сам код проекта? У ESP XIP ограничен 1 МБайт. Для увеличения от базового в 512 килобайт требуется изменение *.ld файла и перенос области сохранения WiFi настроек.
Сам Web-диск работает вне области XIP. В базе, с Flash на модуле в 16 Мегабайт - размер диска 15.5 Мегабайт.
На любой Flash у модуля, имеющей более 512 килобайт, Web-диск располагается за границей 512 килобайт. Базовый проект на таких flash имеет пустое место на 230 килобайт. У вас такой длинный дополнительный код - имеет размер больше SDK + Web? :eek:
Вот данные при сборке базового проекта:
Код:
------------------------------------------------------------------------------
   Section|                   Description| Start (hex)|   End (hex)|Used space
------------------------------------------------------------------------------
      data|        Initialized Data (RAM)|    3FFE8000|    3FFE838C|     908
    rodata|           ReadOnly Data (RAM)|    3FFE838C|    3FFE8E04|    2680
       bss|      Uninitialized Data (RAM)|    3FFE8E08|    3FFEF888|   27264
      lit4|     Uninitialized Data (IRAM)|    40105910|    4010651C|    3084
      text|          Uncached Code (IRAM)|    40100000|    40105910|   22800
irom0_text|             Cached Code (SPI)|    40207000|    402400DB|  233691
------------------------------------------------------------------------------
В irom0_text области с 0x40207000 размером в 0x72000 байт использовано всего 233691 байт.
Остаток -> 233253 байт для вашего кода, при условии, что web-диск записывается за областью первых 512 килобайт Flash ( т.е. это автоматически почти на всех модулях с Flash более 512 килобайт). Незанятая область в irom0_text используется для Web-диска только в случае, если модуль имеет Flash в 512 килобайт всего.
Я не силен во всех этих разметках, WEB на SD я не планировал переносить, SD хочу для архивации данных полученных при опросе через ModBus в виде файлов csv или обычнх txt, вот такой лог у меня при компиляции:
------------------------------------------------------------------------------
Section| Description| Start (hex)| End (hex)|Used space
------------------------------------------------------------------------------
data| Initialized Data (RAM)| 3FFE8000| 3FFE839C| 924
rodata| ReadOnly Data (RAM)| 3FFE839C| 3FFE9044| 3240
bss| Uninitialized Data (RAM)| 3FFE9048| 3FFF04C0| 29816
lit4| Uninitialized Data (IRAM)| 40106584| 4010718C| 3080
text| Uncached Code (IRAM)| 40100000| 40106584| 25988
irom0_text| Cached Code (SPI)| 40207000| 40241FC8| 241608
------------------------------------------------------------------------------
Entry Point : 4010016C call_user_start()
Total Used RAM : 63048
Free IRam : 3700 or 20084 (option 48k IRAM)
Free Heap : 47940
Total Free RAM : 68024
------------------------------------------------------------------------------
Add rapid_loader...
0+1 records in
0+1 records out
176 bytes (176 B) copied, 0.001 seconds, 176 kB/s
58+1 records in
58+1 records out
30192 bytes (30 kB) copied, 0.001 seconds, 30 MB/s
Make: ../bin/firmware.bin
Firmware size: 271976, WebFS addr: 274432, Max OTA size: 249856
Space available for OTA: -22120
mingw32-make[1]: Leaving directory 'C:/Espressif/examples/esp8266web-0.6.2_all/app'
mingw32-make[1]: Entering directory 'C:/Espressif/examples/esp8266web-0.6.2_all/webbin'
mingw32-make[1]: 'WEBFiles.bin' is up to date.
mingw32-make[1]: Leaving directory 'C:/Espressif/examples/esp8266web-0.6.2_all/webbin'

про -24 это я писал по памяти, речь шла о строке Space available for OTA: -22120
дополнительный код файлы из этого проекта из этой темы https://esp8266.ru/forum/threads/esp8266-sd-mmc-fat16-32-demo.501/
c таким логом создается точка доступа, но на сам модуль зайти не получается.
 

pvvx

Активный участник сообщества
Firmware size: 271976, WebFS addr: 274432, Max OTA size: 249856
Space available for OTA: -22120
А у меня такого в проекте нет, как и OTA. Я не знаю к чему эти сообщения и от куда они взялись у вас.
дополнительный код файлы из этого проекта из этой темы https://esp8266.ru/forum/threads/esp8266-sd-mmc-fat16-32-demo.501/
c таким логом создается точка доступа, но на сам модуль зайти не получается.
Наверно что-то не учли или не так состыковали...
 

Urbas81

Member
А у меня такого в проекте нет, как и OTA. Я не знаю к чему эти сообщения и от куда они взялись у вас.
Это нашел, дорабатывал прошивку для сохранения и загрузки настроек, код перекочевал из проекта CO от форумчанина vad7

Наверно что-то не учли или не так состыковали...
т.е дело точно не в размере?
Стоит только разрешить USE_RS485DRV и все, такое чувство что где-то висим, как это отловить не могу сообразить, вставлял в разные места инициализацию SPI карты, ничего не меняется. Возможно драйвер конфликтует с SPI, ведь ноги там общие?
 
Сверху Снизу