USER CODE 2 — алгоритм¶
- page USER CODE 2: последовательность выполнения <tt>main()</tt>
Обзор¶
Код файла является частью тела
main()и исполняется последовательно. Структура сценария включает подготовку питания и интерфейсов, восстановление постоянных параметров, первичную инвентаризацию устройств и основной цикл опроса.Платформенная конфигурация¶
Сценарий использует набор платформенных макросов, определяющих наличие и привязку портов:
макросы включения питания (например, для линий SDI-12 и Modbus);
макросы описания портов SDI-12 (GPIO-порт/пин данных и, при необходимости, направления);
макросы управления направлением RS-485 для UART-интерфейсов (если применимо).
Укрупнённые этапы¶
Включение требуемых цепей питания через платформенные макросы конфигурации.
Инициализация программного I2C (
ourI2C) для используемых шин.Конфигурация портов SDI-12: очистка массива описателей, заполнение полей GPIO и включение портов.
Подготовка UART-интерфейсов, перевод линий в режим приёма и запуск асинхронного приёма в прерываниях.
Восстановление постоянных параметров из Flash и подготовка значений времени/интервалов.
Первичная инвентаризация SDI-12: определение активных адресов и сбор идентификаторов.
При необходимости — специализированная настройка отдельных классов SDI-12-устройств.
Первичная инвентаризация Modbus: определение активных адресов и формирование перечня запросов.
Переход в основной цикл: опрос SDI-12 и Modbus, разбор ответов, накопление строк в буфере, обслуживание командного интерфейса.
- page USER CODE 2: подготовка транспорта UART/USB
Обзор¶
В рамках сценария
main()выполняется приведение линий UART к безопасным исходным уровням, запуск приёма и подготовка обмена по нескольким интерфейсам.RS-485 и управление направлением¶
При наличии макросов управления направлением передача по RS-485 переводится в состояние «приём» до начала основного цикла, чтобы исключить конфликт на линии при запуске.
Асинхронный приём¶
После инициализации UART запускается приём байта в прерываниях, а накопление данных происходит в кольцевых буферах. Переход к обработке команд основан на счётчике принятых строк (
lines_counterлибо интерфейсных счётчиках строк).
- page USER CODE 2: SDI-12 (инициализация и первичный опрос)
Конфигурация портов¶
Порты SDI-12 активируются на основании платформенных макросов. Для каждого включённого порта задаются:
GPIO-порт и пин линии данных;
GPIO-порт и пин линии направления (при раздельной схеме управления), либо используется линия данных как линия направления. После заполнения описателей выполняется инициализация GPIO для всех портов.
Инвентаризация устройств¶
Инвентаризация строится в два шага:
Широковещательное пробуждение устройств командой
?!и выдержка времени, достаточного для выхода устройств в рабочий режим.Перебор допустимых адресов SDI-12 и запрос
<addr>!на каждом активном порту. Наличие ответа используется как критерий активности адреса на конкретном порту.
Сбор идентификаторов¶
Для каждого активного адреса выполняется запрос идентификатора (
<addr>I!). Ответ сохраняется в таблице идентификаторов с привязкой к порту и адресу.Специализированная настройка¶
Для отдельных устройств, распознаваемых по префиксу идентификатора, выполняется установка специфических параметров режима измерения с ожиданием подтверждения выполнения команды.
- page USER CODE 2: Modbus (инвентаризация и перечень запросов)
Инвентаризация устройств¶
Выполняется перебор допустимых адресов Modbus с формированием типового запроса чтения регистров (функция
0x03) и расчётом CRC16. Запрос отправляется на доступные Modbus-порты. Наличие начала ответа в пределах заданного времени трактуется как признак активности устройства.Таблицы активности и перечень устройств¶
По результатам опроса заполняются:
таблица активности устройств по адресам;
список обнаруженных устройств (порт, адрес). При превышении допустимого количества устройств выполняется ограничение до максимума, предусмотренного таблицами.
Перечень запросов для основного цикла¶
На основании списка устройств формируется массив запросов, используемый далее в основном цикле опроса для последовательного чтения данных.
- page USER CODE 2: основной цикл (опрос и накопление данных)
Обзор¶
Основной цикл выполняет опрос устройств SDI-12 и Modbus, разбор ответов и укладку строк данных в кольцевой буфер накопления. Параллельно выполняется обслуживание командного интерфейса (обработка входных строк и формирование ответов).
Буфер накопления¶
Для накопления используется кольцевой буфер, в который записываются строки унифицированного формата, включающие идентификаторы системы, временную метку, источник (порт/адрес) и полезные данные, завершённые CRLF.
Обслуживание команд¶
В каждой итерации основного цикла выполняется обработчик диалога, который извлекает полностью принятые строки из доступных интерфейсов и выполняет соответствующие команды, направляя ответ в интерфейс-источник.