Общее ядро команд 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.