API ПОМЕНЯЛОС - Реструктуризация модбас

- Переработана архитектура:
  * modbus_core.h - базовые определения и структуры
  * modbus_coils.[h/c] - работа с коилами
  * modbus_holdregs.[h/c] - работа с регистрами хранения (R/W)
  * modbus_inputregs.[h/c] -работа с входными регистрами (R/O)
  * modbus_devid.[h/c] - идентификаторы устройства
  * modbus_data.[h/c] - карта регистров и коилов и валидация адресов

- Улучшена документация:
  * Обновлены Doxygen-комментарии к функциям
  * Обновлены шапки файлов с подробным описанием
  * Обновлена инструкция по подключению и использованию
This commit is contained in:
2025-11-03 19:32:53 +03:00
parent 52de3f9c08
commit 7e21fc7f28
36 changed files with 6269 additions and 2259 deletions

View File

@@ -0,0 +1,45 @@
/**
******************************************************************************
* @file modbus_inputregs.c
* @brief Реализация работы с входными регистрами Modbus
******************************************************************************
* @details
Модуль обработки команды чтения input registers (0x04):
- Чтение множественных входных регистров
Копирование данных из структур устройства в буфер ответа
- Поддержка знаковых и беззнаковых значений
******************************************************************************/
#include "modbus_inputregs.h"
/**
* @brief Proccess command Read Input Registers (04 - 0x04).
* @param modbus_msg Указатель на структуру собщения modbus.
* @return fMessageHandled Статус о результате обработки комманды.
* @details Обработка команды Read Input Registers.
*/
uint8_t MB_Proccess_Read_Input_Regs(RS_MsgTypeDef *modbus_msg)
{
//---------CHECK FOR ERRORS----------
// get origin address for data
uint16_t *pInRegs;
modbus_msg->Except_Code = MB_DefineRegistersAddress(&pInRegs, modbus_msg->Addr, modbus_msg->Qnt, RegisterType_Input); // определение адреса регистров
if(modbus_msg->Except_Code != NO_ERRORS)
return 0;
//-----------READING REGS------------
// setup output message data size
modbus_msg->ByteCnt = modbus_msg->Qnt*2; // *2 because we transmit 8 bits, not 16 bits
// read data
int i;
for (i = 0; i<modbus_msg->Qnt; i++)
{
if(*((int16_t *)pInRegs) > 0)
modbus_msg->DATA[i] = (*pInRegs++);
else
modbus_msg->DATA[i] = (*pInRegs++);
}
return 1;
}