Files
templates/c/modbus

Общее ядро команд 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 и таймеры остаются обязанностью транспорта.

#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.