USER CODE 2 — алгоритм

page USER CODE 2: последовательность выполнения <tt>main()</tt>

Обзор

Код файла является частью тела main() и исполняется последовательно. Структура сценария включает подготовку питания и интерфейсов, восстановление постоянных параметров, первичную инвентаризацию устройств и основной цикл опроса.

Платформенная конфигурация

Сценарий использует набор платформенных макросов, определяющих наличие и привязку портов:

  • макросы включения питания (например, для линий SDI-12 и Modbus);

  • макросы описания портов SDI-12 (GPIO-порт/пин данных и, при необходимости, направления);

  • макросы управления направлением RS-485 для UART-интерфейсов (если применимо).

Укрупнённые этапы

  1. Включение требуемых цепей питания через платформенные макросы конфигурации.

  2. Инициализация программного I2C (ourI2C) для используемых шин.

  3. Конфигурация портов SDI-12: очистка массива описателей, заполнение полей GPIO и включение портов.

  4. Подготовка UART-интерфейсов, перевод линий в режим приёма и запуск асинхронного приёма в прерываниях.

  5. Восстановление постоянных параметров из Flash и подготовка значений времени/интервалов.

  6. Первичная инвентаризация SDI-12: определение активных адресов и сбор идентификаторов.

  7. При необходимости — специализированная настройка отдельных классов SDI-12-устройств.

  8. Первичная инвентаризация Modbus: определение активных адресов и формирование перечня запросов.

  9. Переход в основной цикл: опрос 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 для всех портов.

Инвентаризация устройств

Инвентаризация строится в два шага:

  1. Широковещательное пробуждение устройств командой ?! и выдержка времени, достаточного для выхода устройств в рабочий режим.

  2. Перебор допустимых адресов SDI-12 и запрос <addr>! на каждом активном порту. Наличие ответа используется как критерий активности адреса на конкретном порту.

Сбор идентификаторов

Для каждого активного адреса выполняется запрос идентификатора (<addr>I!). Ответ сохраняется в таблице идентификаторов с привязкой к порту и адресу.

Специализированная настройка

Для отдельных устройств, распознаваемых по префиксу идентификатора, выполняется установка специфических параметров режима измерения с ожиданием подтверждения выполнения команды.

page USER CODE 2: Modbus (инвентаризация и перечень запросов)

Инвентаризация устройств

Выполняется перебор допустимых адресов Modbus с формированием типового запроса чтения регистров (функция 0x03) и расчётом CRC16. Запрос отправляется на доступные Modbus-порты. Наличие начала ответа в пределах заданного времени трактуется как признак активности устройства.

Таблицы активности и перечень устройств

По результатам опроса заполняются:

  • таблица активности устройств по адресам;

  • список обнаруженных устройств (порт, адрес). При превышении допустимого количества устройств выполняется ограничение до максимума, предусмотренного таблицами.

Перечень запросов для основного цикла

На основании списка устройств формируется массив запросов, используемый далее в основном цикле опроса для последовательного чтения данных.

page USER CODE 2: основной цикл (опрос и накопление данных)

Обзор

Основной цикл выполняет опрос устройств SDI-12 и Modbus, разбор ответов и укладку строк данных в кольцевой буфер накопления. Параллельно выполняется обслуживание командного интерфейса (обработка входных строк и формирование ответов).

Буфер накопления

Для накопления используется кольцевой буфер, в который записываются строки унифицированного формата, включающие идентификаторы системы, временную метку, источник (порт/адрес) и полезные данные, завершённые CRLF.

Обслуживание команд

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