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

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

pvvx

Активный участник сообщества
Это то понятно. А окончанием фрейма что является ? Та же пауза более 1.5 символов.
А на это однозначного ответа нет. Такова специфика. :) Но указано, что следующий фрейм должен иметь перед собой паузу в 3.5 символа.
Т.е. мастер имеет полное право гнать последовательно тысячу фреймов "всем" (адрес = 0) с паузой в 3.5 символа, а устройства должны их всех отработать и не давать ответов, т.к. адрес сообщения "для всех".
 
Последнее редактирование:

al.kl

New member
А это однозначного ответа нет.
Есть. Всё есть :)
Вслед за последним передаваемым символом также следует интервал тишины продолжительностью не менее 3.5 символов. Новое сообщение может начинаться после этого интервала.

Фрейм сообщения передается непрерывно. Если интервал тишины продолжительностью 1.5 возник во время передачи фрейма, принимающее устройство заканчивает прием сообщения и следующий байт будет воспринят как начало следующего сообщения.

Таким образом, если новое сообщение начнется раньше 3.5 интервала, принимающее устройство воспримет его как продолжение предыдущего сообщения. В этом случае устанавливается ошибка, так как будет несовпадение контрольных сумм.
Вот и ответы :)
 

pvvx

Активный участник сообщества
А на это однозначного ответа нет. Такова специфика. :) Но указано, что следующий фрейм должен иметь перед собой паузу в 3.5 символа.
Есть. Всё есть :)
Вот и ответы :)
А вам что написал?
Вы ещё не вникли во все тонкости modbus RTU и не читайте переводов, а смотрите оригинальную спецификацию. :)
 

al.kl

New member
Что касается таймаутов по ответам :
Пользователь может устанавливать продолжительность интервала таймаута в течении которого головное устройство будет ожидать ответа от подчиненного. Если подчиненный обнаружил ошибку передачи, то он не формирует ответ главному.
Вот тут уже не оговаривается. Пользователь сам решает, какое время мастер будет ждать таймаут от подчинённого.
 

pvvx

Активный участник сообщества
Что касается таймаутов по ответам :Вот тут уже не оговаривается. Пользователь сам решает, какое время мастер будет ждать таймаут от подчинённого.
Время ответа нормируется в доп. ограничении.
Я успел быстрее прочитать Ваше сообщение, чем Вы его отредактировать :)
Я не редактирую, а дописываю - уточняю. И тут не гонка по кол-ву сообщений в сек :)
И не ясно - что вы привязались к паузе до ответа подчиненного, если не можете обработать входной поток?
Эта назначаемая пауза вам не поможет спастись от кривизны приемника:
Т.е. мастер имеет полное право гнать последовательно тысячу фреймов "всем" (адрес = 0) с паузой в 3.5 символа, а устройства должны их всех отработать и не давать ответов, т.к. адрес сообщения "для всех".
 
Последнее редактирование:

al.kl

New member
А я и не гоняюсь :) Ну не увидел Вашей дописи, чтож теперь :)
В общем, мысль я уловил. Измерениме времени между байтами, Вы решаете задачу разделения фреймов между собой, расчитывая на то, что попадутся добросовестные производители и сделают реально паузу между фреймами в несколько микросекунд :) Так бы сразу и сказали. А то - каллбеки чтоб вызывать, ... :)
Каллбек надо вызывать когда приняты все данные, чтобы сообщить об этом пользовательской программе, для её дальнейшего решения (отвечать, не отвечать, что-то сделать, ...) И вот тут уже время вполне может измеряться в миллисекундах.
 
Последнее редактирование:

pvvx

Активный участник сообщества
А я и не гоняюсь :) Ну не увидел Вашей дописи, чтож теперь :)
В общем, мысль я уловил. Измерениме времени между байтами, Вы решаете задачу разделения фреймов между собой, расчитывая на то, что попадутся добросовестные производители и сделают реально паузу между фреймами в несколько микросекунд :) Так бы сразу и сказали. А то - каллбеки чтоб вызывать, ... :)
каллбек надо вызывать когда приняты все данные, чтобы сообщить об этом пользовательской программе, для её дальнейшего решения (отвечать, не отвечать, что-то сделать, ...)
Это и решено в прошивке Modbus хоть ка-то. Ещё встроен анализ "коллизии" перед выводом ответа - если в паузу вклинялись символы или помеха, то мастер или другие не воспримут этот фрейм. Ещё бы хорошо встроить ответ о тай-ауте при истечении времени ответа, чтобы мастер не тупил.
И мне пофиг до других недо-производителей, которые не могут обеспечить стандарт modbus RTU. Пример - фирма "Овен". :D
 
Последнее редактирование:

al.kl

New member
Ладно, ответ на свой вопрос я от Вас услышал. Спасибо ! Приятно было пообщаться.
Спать надо ложиться, денёк сегодня будет нелёгким :confused:
С праздником, кстати ! ;)
 

PostLast

Member
С праздником!
Вопрос не ясен. Что и кому и когда?
перефразирую: Настройку по умолчанию имени точки доступа задаем в esp8266web/wifi.h at master · pvvx/esp8266web · GitHub
скорость порта тут esp8266web/flash_eep.h at master · pvvx/esp8266web · GitHub
Где можно задать значение для TCP2UART0 Server IP: попадающее в ~cfg_tcp_url~ ?

Количество подключений к TCP2UART порту задается в esp8266web/tcp2uart.c at master · pvvx/esp8266web · GitHub
и ограничено esp8266web/wifi.c at master · pvvx/esp8266web · GitHub
или связано с ограничениями heap size ?
Пытаюсь получить данные с четырех источников но пока только 2 работают:(.
 

pvvx

Активный участник сообщества
С прошедшим!
перефразирую: Настройку по умолчанию имени точки доступа задаем в esp8266web/wifi.h at master · pvvx/esp8266web · GitHub
скорость порта тут esp8266web/flash_eep.h at master · pvvx/esp8266web · GitHub
Где можно задать значение для TCP2UART0 Server IP: попадающее в ~cfg_tcp_url~ ?
Где-то вписать new_tcp_client_url("ваш url"). По первому старту строка не задана и нет такого блока в сохранениях эмулятора EEPROM в Flash.
Оно и задается пользователем через передачу cfg_tcp_url="xxx" в Web и переключает тип TCP2UART сервер/клиент.
Количество подключений к TCP2UART порту задается в esp8266web/tcp2uart.c at master · pvvx/esp8266web · GitHub
и ограничено esp8266web/wifi.c at master · pvvx/esp8266web · GitHub
или связано с ограничениями heap size ?
Пытаюсь получить данные с четырех источников но пока только 2 работают:(.
Более одного соединения у TCP2UART невозможно. Буфера UART привязаны к первому соединению. Необходимо всё переделывать на отдельные буфера и не понятно что будет у вас с алго - с одного UART высылать данные всем соединениям? Не успеет и смысла в этом никакого - гнать один поток в несколько выходов? Изобретаете велосипед с треугольными колесами? Он не поедет.
В несколько устройств передавать можно только через UDP Broadcast и мериться с потерей информации...
 
Последнее редактирование:

vad7

Active member
@pvvx, Пытаюсь использовать GPIO2, GPIO0 в качестве I2C - глючит, то читает, то ошибка.
UART1 не используется - заремарил в uart_init:
uart_read_fcfg(2) и os_install_putc1((void *)uart1_write_char)
еще отключил WDT - вызов wdt_init(1)
DEBUG_UART = 0
удалось только заставить работать когда обрамил функциями ets_isr_mask(0xFFFFFFFF) и ets_isr_unmask(0xFFFFFFFF)

Однако, после ets_isr_unmask - зависон! :(
Что ему еще может мешать?
 

pvvx

Активный участник сообщества
@pvvx, Пытаюсь использовать GPIO2, GPIO0 в качестве I2C - глючит, то читает, то ошибка.
UART1 не используется - заремарил в uart_init:
uart_read_fcfg(2) и os_install_putc1((void *)uart1_write_char)
еще отключил WDT - вызов wdt_init(1)
DEBUG_UART = 0
удалось только заставить работать когда обрамил функциями ets_isr_mask(0xFFFFFFFF) и ets_isr_unmask(0xFFFFFFFF)

Однако, после ets_isr_unmask - зависон! :(
Что ему еще может мешать?
Если выключить вывод отладки в меню, то ничего этим портам не мешает.
@pvvx, функция ets_intr_lock() какие прерывания запрещает, не подскажете?
Все, кроме NMI.
 
Последнее редактирование:

vad7

Active member
@pvvx, по-отключал еще доступ к UART1, ситуация такая:
делаю ets_set_idle_cb(user_idle, NULL)
в user_idle() идет блочное чтение, запись, проверка по i2c (где-то 6 - 7 секунд на операцию)
WDT сбрасывается в цикле - WDT_FEED = WDT_FEED_MAGIC;
если на это время не блокировать прерывания, то где-то через 3 сек в отладку сыпется мусор и зависон.
если прерывания заблокировать ets_intr_lock(), то первые 2 операции проходят нормально, а на 3-ию (проверка) стабильно через где-то 2 секунды - мусор в отладку и либо зависает, либо уходит в перезагрузку по
SoftWdt.
Heap в это время = 48800.
 

pvvx

Активный участник сообщества
@pvvx, по-отключал еще доступ к UART1, ситуация такая:
делаю ets_set_idle_cb(user_idle, NULL)
в user_idle() идет блочное чтение, запись, проверка по i2c (где-то 6 - 7 секунд на операцию)
WDT сбрасывается в цикле - WDT_FEED = WDT_FEED_MAGIC;
если на это время не блокировать прерывания, то где-то через 3 сек в отладку сыпется мусор и зависон.
если прерывания заблокировать ets_intr_lock(), то первые 2 операции проходят нормально, а на 3-ию (проверка) стабильно через где-то 2 секунды - мусор в отладку и либо зависает, либо уходит в перезагрузку по
SoftWdt.
Heap в это время = 48800.
Нельзя использовать ets_set_idle_cb() в новых SDK. Её задействовали китайцы, особенно во время инициализации...
WDT не просто так срабатывает. Там два аппаратных таймера и ещё была проверка у китайцев на исполнение post/task (не смотрел в последнем SDK про таблицу post/task - но ранее была). Если не даете жить и обслуживать WiFi, т.е. запрещаете прерывания и не даете исполняться ets_run() (управляет вызовом отработки таймеров и post/task) то всё накроется. Так-же всё накроется даже если у вас долго отрабатывает NMI процедура, вклинившись в цикл обработки WiFi у китайцев... Но вроде до этого вы ещё не дошли...
 
Сверху Снизу