# Общее ядро команд Modbus Обработка coils и регистров функций 01/03/04/05/06/0F/10 без HAL, UART, таймеров, глобальной карты регистров и выделения памяти. Приложение → декодированный запрос → проверка и отображение адреса портом → `mb_data_transfer` → банк регистров/битов приложения. | Файл | Назначение и зависимости | |---|---| | `include/modbus_data.h` | Контракт, только stdint/stddef | | `src/modbus_data.c` | Общие ограничения количества, обработка coils и регистров | | `ports/stm32-legacy/modbus.c` | Совместимый адаптер старого John; зависит от проектного `rs_message.h` | | `tests/test_modbus_data.c` | Границы и проход через все смещения coils 0..15 | Порт сначала вызывает `mb_data_validate`, затем отображает **весь** диапазон адресов в память, и только после успешного отображения вызывает transfer. Коды возврата соответствуют исключениям Modbus: 0 — успех, 1 — функция, 3 — значение. Ёмкость данных передаётся в 16-битных словах. Адресная карта, права записи, RTU framing, CRC и таймеры остаются обязанностью транспорта. ```c #include "modbus_data.h" uint16_t registers[2] = {123, 456}; uint16_t response[2]; uint16_t response_bytes = 0; uint8_t status = mb_data_validate(3, 2, 0, 2); /* Пример банка уже отображён; реальный порт проверяет адрес до вызова. */ if (status == 0) { status = mb_data_transfer(3, 2, 0, registers, 0, response, 2, &response_bytes); } /* status == 0, response_bytes == 4; сериализацию выполняет транспорт. */ ``` Используется в `home/climate/core/STM32_Modbus`, `john103C6T6` и `ds18b20-c8t6test`. Два последних подключают один совместимый адаптер; климат сохраняет свой master/slave транспорт и диагностические функции. Это не замена `pcan_modbus_server`, у которого другой транспортный контракт. Проверка: `python tools/test_shared_libraries.py` из корня templates.