Лепить на ардуино сервер, лепить какой-то протокол для обмена данными между основным МК и ESP... Плодить слои абстракций, привязанных к конкретному устройству...
Уж лучше возьму готовое устройство WiFi-модем, напишу универсальную библиотеку и подключу к своей системе, в последствии и к другим системам. И буду счастлив.
Может и тепличные, но я думаю что всякая офисная техника с импульсными БП, лампы с электронными баластами создают помех не меньше, чем коллекторный движок.
Ну выбьет искра один модбасовский пакет, ну перезапросит мастер еще раз, для моей задачи не критично.
Обновил проект!
Переписал функцию вычисления CRC по таблице, время выполнения функции сократилось на 32%
Итоговое быстродействие Modbus RTU для наилучшего случая (вариант 8):
AVR среднее-105; минимальное-99; максимальное-1924;
STM32 среднее-86; минимальное-59; максимальное-1293;
Снижение максимального времени выполнения
STM32 — 1417-1293=124 такта
AVR — 2026-1924=102 такта
Имеется в ввиду минимальное и максимальное время выполнения.
Минимальное время выполнения соответствует ветке кода — «вошли, проверили таймер, таймер не дотикал и вышли» или «вошли проверили прием, принятых данных нет и вышли „
Максимальное время — завершение приема пакета запроса и формирование пакета ответа.
1) Для АВР, и для СТМ, компилировался один и тот же код
2) В модуле как-бы две библиотеки, RTU и ASCII
3) Каждая содержит модбас функции 1,2,3,4,5,6,15,16,22
4) Код модуля Модбас полностью отвязан от аппаратуры, и использует 3 функции для связи с системой ModBusSysTimer, ModBusPUT(), ModBusGET()
5) в СТМ ModBusGET() работает через ПДП
#define FifoTxBuf (256)
static unsigned char TxFifo[FifoTxBuf];//буфер для передачи данных
static unsigned short TxHead=0;//голова, байт для передачи кладем на голову
static volatile unsigned short TxTail=0;//хвост, с хвоста в UART
void AES_RNG_LPUART1_IRQHandler(void)
{//обработчик прерывания "передача закончена"
if(LPUART1->ISR & USART_ISR_TC)
{
if(TxHead==TxTail)//проверяем наличие байт в буфере
{//Данных нет, сбрасываем флаг прерывания
LPUART1->ICR=USART_ICR_TCCF;
}
else
{//данные есть, передаем, FIFO->UART
LPUART1->TDR=TxFifo[TxTail];
TxTail=(TxTail+1)&(FifoTxBuf-1);
}
}
}
void PutUart0(unsigned char data)
{
//если в TX буфере пусто и регистр передачи пуст
if(
(TxHead==TxTail)
&&
(((LPUART1->ISR)&USART_ISR_TXE)!=0)
)
{//сразу запускаем передачу
LPUART1->TDR=data;
return;
}
//если в буфере не пусто кладем в Tx буфер
TxFifo[TxHead]=data;
TxHead=(TxHead+1)&(FifoTxBuf-1);
Я тоже пятого размера не видел, но не могу сказать, что в этом нет смысла.
Использование потокового ввода-вывода (stream), позволяет полностью абстрагироваться от способа приема-передачи данных.
Задача для тех, кто никогда не рисовал турнирную таблицу
х^2=2*78+x
Решаем, получаем два корня 13 и -12
Лапша из if не читаема. Воспользовались бы switch-case вариантом.
Не читаема? ну и не читайте! Я бы воспользовался switch-case, но мне нужен if.
Велосипедов полон код. Особенно доставило ваше "!0".
Некоторые пишут false-true, я предпочитаю 0 и !0, Меньше букв, больше смысла. В первом стандарте Си они и были так определены, привычка.
С комментариями переборщили, следует писать код так чтобы он был понятен с минимумом комментариев.
Кому следует? Последствия многократного код ревью и рефакторинга
"Магических" констант в коде не должно быть, ваша переменная SostWiFi постоянно сравнивается с этими "магическими" константами.
Это вы программистам на бейсике скажите, там в каждой строке магическая константа.
Харбрардунинодетект дает отрицательные результаты. Не все потеряно!
Спасибо. Хоть кто-то прочитал статью.
Потому что на ESP8266 есть недорогой доступный WiFi-модем.
в заголовке же сказано, чтоб не зашкварится.
Зачем мне осваивать Ардуино?
У меня в стеке освоенные МК, с кучей наработок.
Лепить на ардуино сервер, лепить какой-то протокол для обмена данными между основным МК и ESP... Плодить слои абстракций, привязанных к конкретному устройству...
Уж лучше возьму готовое устройство WiFi-модем, напишу универсальную библиотеку и подключу к своей системе, в последствии и к другим системам. И буду счастлив.
Тогда "не оскоромиться". Аминь.
Зашквар. По моему вполне современное слово, без всякой уголовно-блатной окраски. Не только ли некоторые знают его происхождение.
Если АТ-команду существуют, должен же ими кто-то пользоваться
Объяснение очень простое. Программисты PLC не утруждают себя обработкой исключений установки, сбитых концевиков, заклинивших моторов итд.
Поиск такой неисправности осуществляется анализом в отладчике. И тут язык LD подходит идеально.
inline float absF(float a) { return (*(((unsigned long*)(&a))))&0x7FFFFFF;} // :)
Может и тепличные, но я думаю что всякая офисная техника с импульсными БП, лампы с электронными баластами создают помех не меньше, чем коллекторный движок.
Ну выбьет искра один модбасовский пакет, ну перезапросит мастер еще раз, для моей задачи не критично.
Я уже решил. Буду ставить на объект.
Ну... например, система управления уличным освещением
На каждом столбе стоит коробочка Modbus-PLC, модуль дискретного выхода Модбас и реле.
Другая коробочка стоит в начале линии, там где обычно рубильник.
Коробочка подключена к одноплатнику, который подключен к интернету. Шлюз TCP RS485.
В офисе на писишке (или на смартфоне) стоит скада, из которой мы можем управлять отдельно каждой лампой. Только не спрашивайте зачем!
Переписал функцию вычисления CRC по таблице, время выполнения функции сократилось на 32%
Итоговое быстродействие Modbus RTU для наилучшего случая (вариант 8):
AVR среднее-105; минимальное-99; максимальное-1924;
STM32 среднее-86; минимальное-59; максимальное-1293;
Снижение максимального времени выполнения
STM32 — 1417-1293=124 такта
AVR — 2026-1924=102 такта
Минимальное время выполнения соответствует ветке кода — «вошли, проверили таймер, таймер не дотикал и вышли» или «вошли проверили прием, принятых данных нет и вышли „
Максимальное время — завершение приема пакета запроса и формирование пакета ответа.
Я перебрал 48 вариантов, мне уже лень…
Попробуйте сами — github.com/IBAH-II/modbus-M48/archive/main.zip
2) В модуле как-бы две библиотеки, RTU и ASCII
3) Каждая содержит модбас функции 1,2,3,4,5,6,15,16,22
4) Код модуля Модбас полностью отвязан от аппаратуры, и использует 3 функции для связи с системой ModBusSysTimer, ModBusPUT(), ModBusGET()
5) в СТМ ModBusGET() работает через ПДП
Использование потокового ввода-вывода (stream), позволяет полностью абстрагироваться от способа приема-передачи данных.