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

Разработка ‘библиотеки’ малого webсервера на esp8266.

relink

New member
История с вашим приращением ещё старее:
RE: [lwip-users] Bug in snd_buf calculation
lwip-users-tcp-ip - RE: [lwip-users] Bug in snd_buf calculation - msg#00009 - Programming Mailing Lists
lwIP - A Lightweight TCP/IP stack - Bugs: bug #2679, Data packet split on odd... [Savannah]
Но у нас этих проблем нет, что в ESP8266, что в ARM RTL871x. У них у всех байтный доступ к областям памяти, где находятся буфера данных.
Результаты тестирования показали, что исправление oddbyte (snd_buf) для связки esp-lwip не нужно. Логически это понятно, но утверждение лучше и быстрее было-бы перепроверить отладчиком, последовательность все-таки через какое-то время нарушается.
Никому не удалось запустить вот эту прошивку для jtag отладки в VisualGDB 7.11, или это у меня только openOCD jtag transport не видит.
 

pvvx

Активный участник сообщества
Никому не удалось запустить вот эту прошивку для jtag отладки в VisualGDB 7.11, или это у меня только openOCD jtag transport не видит.
Не видит USB устройство или ? Zadig - USB driver installation made easy
Снимок1261.gif Снимок1262.gif
Код:
@echo off
PATH=D:\MCU\OpenOCD;%PATH%
taskkill /F /IM openocd.exe
start openocd -f interface\Jlink.cfg -f xxxxx.cfg
Не думаю, что там какие-то ошибки.
Пример - на том-же LwiP работает RTL8710AF, читаем SD через FTP сервер:
Connecting in passive mode
Sending AMBA1858.MOV
150-Connected to port 55600
150 914220179 bytes to download
226-File successfully transferred
226 643788 ms, 1420 kbytes/s

Уже много Гега-Байт туда-сюда и ошибок нет.
 
Последнее редактирование:

vad7

Active member
@pvvx, у вас в свалке этот код выполняется?
CLEAR_PERI_REG_MASK(I2SCONF, I2S_I2S_RESET_MASK);

Выдает:
Fatal exception (28):
epc1=0x4020758f, epc2=0x00000000, epc3=0x00000000, excvaddr=0x02190000, depc=0x00000000
 

vad7

Active member
Чего-то I2S не заводится.

Куда не вставлял этот код, все тот же эксепшен LoadProhibitedCause (28).
Пробовал даже в самый стартап app_main.c, откатывал свалку на самые первые версии в гитхабе - то же самое.

Что-то лишнее удалено из SDK или не инициализировано...

Код:
rom_i2c_writeReg_Mask(i2c_bbpll, i2c_bbpll_hostid, i2c_bbpll_en_audio_clock_out,
      i2c_bbpll_en_audio_clock_out_msb, i2c_bbpll_en_audio_clock_out_lsb, 1);

   CLEAR_PERI_REG_MASK(I2SCONF, I2S_I2S_RESET_MASK); // <-  exception here
  
   SET_PERI_REG_MASK(I2SCONF, I2S_I2S_RESET_MASK);
   CLEAR_PERI_REG_MASK(I2SCONF, I2S_I2S_RESET_MASK);

   WRITE_PERI_REG(I2SCONF, (READ_PERI_REG(I2SCONF) & 0xf0000fff)|
         (((26&I2S_BCK_DIV_NUM )<<I2S_BCK_DIV_NUM_S)|
               ((5&I2S_CLKM_DIV_NUM)<<I2S_CLKM_DIV_NUM_S)|
               ((1&I2S_BITS_MOD) << I2S_BITS_MOD_S ) ) );
              
   PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_I2SO_BCK);
 
Последнее редактирование:

pvvx

Активный участник сообщества
Чего-то I2S не заводится.

Куда не вставлял этот код, все тот же эксепшен LoadProhibitedCause (28).
Пробовал даже в самый стартап app_main.c, откатывал свалку на самые первые версии в гитхабе - то же самое.

Что-то лишнее удалено из SDK или не инициализировано...

Код:
rom_i2c_writeReg_Mask(i2c_bbpll, i2c_bbpll_hostid, i2c_bbpll_en_audio_clock_out,
      i2c_bbpll_en_audio_clock_out_msb, i2c_bbpll_en_audio_clock_out_lsb, 1);

   CLEAR_PERI_REG_MASK(I2SCONF, I2S_I2S_RESET_MASK); // <-  exception here
 
   SET_PERI_REG_MASK(I2SCONF, I2S_I2S_RESET_MASK);
   CLEAR_PERI_REG_MASK(I2SCONF, I2S_I2S_RESET_MASK);

   WRITE_PERI_REG(I2SCONF, (READ_PERI_REG(I2SCONF) & 0xf0000fff)|
         (((26&I2S_BCK_DIV_NUM )<<I2S_BCK_DIV_NUM_S)|
               ((5&I2S_CLKM_DIV_NUM)<<I2S_CLKM_DIV_NUM_S)|
               ((1&I2S_BITS_MOD) << I2S_BITS_MOD_S ) ) );
             
   PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDO_U, FUNC_I2SO_BCK);
Для этого кода от SDK ничего не требуется. Тактирование у I2S включено - можете посмотреть на веб странице
Снимок1268.gif
Описание в Харде ESP8266 хидере.
Никчемные MEMW() инструкции отключены в трансляторе. Что это такое - тоже написано в том-же хидере.
Меняйте ключи трансляции к своему коду если они нужны.
 

DorianGray

New member
Добрый день. Использую ESP для подключения к Modbus устройству. Как клиент используется два ПК, но вот сложилась ситуация, что если ПК1 держит сокет открытым, а ПК2 открывает соединение, то соответственно сокет ПК1 закрывается. Вопрос: это ограничение в вашем проекте? Мне прост необходимо что б можно было подключится несколькими устройствами к одной ESP8266.
 

pvvx

Активный участник сообщества
Добрый день. Использую ESP для подключения к Modbus устройству. Как клиент используется два ПК, но вот сложилась ситуация, что если ПК1 держит сокет открытым, а ПК2 открывает соединение, то соответственно сокет ПК1 закрывается. Вопрос: это ограничение в вашем проекте? Мне прост необходимо что б можно было подключится несколькими устройствами к одной ESP8266.
Многопользовательский интерфейс для Modbus не встречал. Там всегда есть мастер и подчиненные. При многопользовательском варианте нарушается сия концепция. 10 мастеров на шине modbus? :)
Закрытие текущего соединения при запросе нового отключается на странице конфигурации...
 

DorianGray

New member
А вообще есть ли возможность реализовать такую идею с несколькими подключениями от двух ПК (допустим понизив скорость опроса прибора - в модбасе, насколько я понимаю максимальный таймаут ответа от прибора ограничивается протоколом modbus ).
 

pvvx

Активный участник сообщества
А вообще есть ли возможность реализовать такую идею с несколькими подключениями от двух ПК (допустим понизив скорость опроса прибора - в модбасе, насколько я понимаю максимальный таймаут ответа от прибора ограничивается протоколом modbus ).
А кому надо такое извращение? Многопользовательский UART ? :) Как там разделять когда кому и куда? Пол бита передать от Васи, а четверть от Сани?
Решили NAT построить на COM порт?
 

DorianGray

New member
Использовать очередь (но будет тормозить), сначала один пообщался, закрыл сокет, потом второй пообщался и тоже закрыл.
 

DorianGray

New member
Тогда вопрос, модуль закрывает старое соединение сразу?(ситуация когда, по предыдущему сокету был отправлен modbus пакет на устройство, но ответа от прибора еще не поступило, но к esp уже ломяться по другому сокету).
 

DorianGray

New member
Меня интересует вот такая реализация
upload_2017-2-2_18-4-16.png
Насколько я понимаю то Modbus TCP это позволяет.
 

pvvx

Активный участник сообщества
Меня интересует вот такая реализация
Посмотреть вложение 3360
Насколько я понимаю то Modbus TCP это позволяет.
Да - по физической линии изернет можно обращаться к разным устройствам. Вот вы сейчас обращаетесь на данный сайт, т.е. имеете выбор с кем соединится. А по протоколу Modbus - нет - там мастер один и он задает арбитраж подчиненных. Например сетевой кабель у вас работает только как точка-точка. Старый инет по коаксиалу работал сразу со всеми устройствами и имел кучу коллизий.
Устройство Modbus TCP на ESP позволяет использовать схему на вашем приведенном рисунке. Соединяетесь с ней и передаете на локальную шину RS-485 запросы разным устройствам и наоборот. Включив вторую ESP к одной физической линии, в данном случае это у нас радио-эфир WiFi, соединяете его мастера с другим участком Modbus...
Т.е. на физике WiFi (как линии) вы можете иметь несколько цепей server-client. Соединение кто- скем в данном случае распределятся по MAC и IP.
Для "сборки" множественных "линий" server-client существуют специальные программные серверы. К примеру вы на своем компе открываете одно Modbus TCP соединение с одной ESP и второе соединение Modbus TCP с другой ESP. Данные с них сливаете в единую таблицу. Это уже программный уровень. Для контроля за массой соединений в промышленности используется специальное ПО - серверы (к примеру SCADA).
У нас же уровень ниже - обычный Modbus TCP мост (gateway) на ESP. Он полностью обеспечивает уровень Modbus TCP и имеет дополнительные фишки.
 
Последнее редактирование:

DorianGray

New member
Спасибо за разъяснения! То есть, если ESP будет выступать в роли шлюза между RS485 и TCP, ESP должен реализовывать арбитраж шины RS485 в соответствии со спецификацией Modbus TCP, и перенаправлять пакеты из сети TCP в RS485 по очереди. Но использовать ESP для такой задачи смысла нет - так как не хватит ее мощности для подобных задач. И по этому вы не реализовывали подобную возможность и делали реализацию точка-точка между одним TCP клиентом и модулем ESP8266, который уже может общаться с несколькими устройствами на шине RS485.
 

pvvx

Активный участник сообщества
Спасибо за разъяснения! То есть, если ESP будет выступать в роли шлюза между RS485 и TCP, ESP должен реализовывать арбитраж шины RS485 в соответствии со спецификацией Modbus TCP
Это и сделано.
, и перенаправлять пакеты из сети TCP в RS485 по очереди.
А не по очереди как? :) Перемешивая данные в пакете? :)
Но использовать ESP для такой задачи смысла нет - так как не хватит ее мощности для подобных задач.
Не понял. - именно это и работает - реализовано.
Вы хоть тему то Modbus TCP / RTU RS-485 + WEB server читали?
Там описание в первом сообщении с ссылками.
Кроме того работает и многопользовательский шлюз к Modbus-ам через web-сервер и даже подобие сервера сборки данных по Modbus сетям...
 

DorianGray

New member
Не, я читал, просто я с двух разных TCP устройств одновременно не могу подключиться, я про это.
 

pvvx

Активный участник сообщества
Не, я читал, просто я с двух разных TCP устройств одновременно не могу подключиться, я про это.
В modbus один мастер. Если нет - это не modbus, а что-то другое. Общение мастера со слейв - это точка-точка. Подчиненных может быть много. Мастер - один.
 

DorianGray

New member
Но один мастер в Modbus RTU/ASCII, а в Modbus TCP может быть несколько мастеров (так как у нас есть устройства Modbus TCP Gate). В документашке на modbus tcp про это есть. Или я не понимаю сути преобразователей =(

"The definition of the number of TCP client and server connections is not on the scope of this document (value n in this document). Depending on the device capacities the number of TCP connections can be different."
 
Последнее редактирование:

pvvx

Активный участник сообщества
Но один мастер в Modbus RTU/ASCII, а в Modbus TCP может быть несколько мастеров (так как у нас есть устройства Modbus TCP Gate). В документашке на modbus tcp про это есть. Или я не понимаю сути преобразователей =(

"The definition of the number of TCP client and server connections is not on the scope of this document (value n in this document). Depending on the device capacities the number of TCP connections can be different."
Сложно понять куцый язык: "В зависимости от возможностей устройства количество соединений TCP могут быть разными."
Но всё равно не может быть несколько мастеров. Нарушится всё.
Номер транзакции у меня сопровождается полностью, а большинство ПО его просто отбрасывает. Если к нему привязываться, то возможно расширение протокола по типу NAT :)
 
Сверху Снизу