From 465f2933972c960a5caa13d1b270f321a7a63a6a Mon Sep 17 00:00:00 2001 From: Razvalyaev Date: Tue, 4 Nov 2025 13:43:15 +0300 Subject: [PATCH] 0.2.2 doxygen update --- Inc/modbus.h | 32 ++++++++++++---------------- Inc/modbus_coils.h | 43 +++++++++++++++++++------------------ Inc/modbus_core.h | 13 ++++++------ Inc/modbus_devid.h | 11 +++++----- Inc/modbus_diag.h | 21 +++++++++--------- Inc/modbus_holdregs.h | 6 +++--- Inc/modbus_inputregs.h | 2 +- Inc/rs_message.h | 2 +- README.md | 48 +++++++++++++++++++++--------------------- Src/modbus.c | 38 +++++++++++++-------------------- Src/modbus_coils.c | 12 +++++------ Src/modbus_devid.c | 25 +++++++++++----------- Src/modbus_diag.c | 23 ++++++++++---------- Src/modbus_holdregs.c | 6 +++--- Src/modbus_inputregs.c | 2 +- Src/rs_message.c | 45 +++++++++++++++++---------------------- 16 files changed, 156 insertions(+), 173 deletions(-) diff --git a/Inc/modbus.h b/Inc/modbus.h index afb51dd..107b80a 100644 --- a/Inc/modbus.h +++ b/Inc/modbus.h @@ -17,35 +17,30 @@ @section Инструкция по подключению Для корректной работы надо: - Подключить обработчики RS_UART_Handler(), RS_TIM_Handler(), в соответствубщие - низкоуровневые прерывания UART_IRQHandler, TIM_IRQHandler. Вместо HAL'овского обработчика + низкоуровневые прерывания UART_IRQHandler, TIM_IRQHandler вместо HAL'овского обработчика -В modbus_config.h настроить дефайны для нужной работы UART +- В modbus_config.h настроить дефайны для нужной работы UART -- Инициализировать хендл мобдас. По умолчанию глобально создается hmodbus1, но можно сделать свой -После для запуска Modbus: -@verbatim -//----------------Прием модбас----------------// -#include "modbus.h" +- Инициализировать хендл мобдас. По умолчанию глобально создается hmodbus1 +- После для запуска Modbus: + @verbatim + //----------------Прием модбас----------------// + #include "modbus.h" -MODBUS_FirstInit(&hmodbus1, &huart1, &htim3); -MODBUS_SlaveStart(&hmodbus1, NULL); -// или если нужно переключится на другой -@endverbatim + MODBUS_FirstInit(&hmodbus1, &huart1, &htim3); + //MODBUS_Config(&hmodbus1, 1, 1000, 0); // - если нужны другие настройки, не из modbus_config.h + MODBUS_SlaveStart(&hmodbus1, NULL); + @endverbatim @section Подключаемые модули: +- rs_message.h - работа с uart - modbus_core.h - базовые определения - modbus_coils.h - работа с дискретными выходами - modbus_holdregs.h - работа с регистрами хранения - modbus_inputregs.h - работа с входными регистрами - modbus_devid.h - идентификация устройства -- __crc_algs.h - алгоритмы CRC - -@section Использование в проекте: -1. Настроить modbus_config.h под устройство -2. Определить структуры данных в modbus_data.h -3. Подключить этот файл в rs_message.h -4. Вызвать MODBUS_FirstInit() и RS_Receive_IT() +- modbus_diag.h - диагностика modbus @section Структура данных Modbus @@ -62,7 +57,6 @@ MODBUS_SlaveStart(&hmodbus1, NULL); #ifndef __MODBUS_H_ #define __MODBUS_H_ -#include "__crc_algs.h" #include "rs_message.h" #include "modbus_coils.h" #include "modbus_holdregs.h" diff --git a/Inc/modbus_coils.h b/Inc/modbus_coils.h index 01e2da3..38414ff 100644 --- a/Inc/modbus_coils.h +++ b/Inc/modbus_coils.h @@ -42,13 +42,14 @@ typedef enum //-------------------------------------------------- /** - * @brief Macros to set pointer to a certain register that contains certain coil - * @param _parr_ - массив коилов. - * @param _coil_ - Номер коила от начала массива _arr_. + * @brief Макрос для установки указателя на регистр, содержащий запрашиваемый коил + * @param _parr_ - массив коилов. + * @param _coil_ - Номер коила от начала массива _arr_. * @note Используется вместе с @ref MB_Set_Coil_Mask @verbatim Пояснение выражений - (_coil_/16) - get index (address shift) of register that contain certain coil - Visual explanation: 30th coil in coils registers array + - (_coil_/16) - индекс регистра, в котором содержится коил по адресу _coil_ + +Визуальный пример: 30 коил будет в 30/16 = 1 регистре (индексация с 0) xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxCx |register[0]----| |register[1]----| |skip this------| |get this-------| @@ -57,15 +58,17 @@ typedef enum */ #define MB_Set_Coil_Reg_Ptr(_parr_, _coil_) ((uint16_t *)(_parr_)+((_coil_)/16)) /** - * @brief Macros to set mask to a certain bit in coils register - * @param _coil_ - Номер коила от начала массива _arr_. + * @brief Макрос для установки маски, чтобы выделить запрашиваемый коил из регистра + * @param _coil_ - Номер коила от начала массива _arr_. * @note Используется вместе с @ref MB_Set_Coil_Reg_Ptr @verbatim Пояснение выражений - (16*(_coil_/16) - how many coils we need to skip. e.g. (16*30/16) - skip 16 coils from first register - _coil_-(16*(_coil_/16)) - shift to certain coil in certain register - e.g. Coil(30) gets in register[1] (30/16 = 1) coil №14 (30 - (16*30/16) = 30 - 16 = 14) + - (16*(_coil_/16) - сколько коилов нужно пропустить. прим. (16*30/16) - первые 16 коилов находятся вне регистра + - _coil_-(16*(_coil_/16)) - сдвинуть бит на место запрашиваемого коила в регистре - Visual explanation: 30th coil in coils registers array + Визуальный пример: 30 коил будет регистре[1], на 14 бите: + register = 30/16 = 1 + bit = 30 - (16*30/16) = 30 - 16 = 14 + xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxCx |register[0]----| |register[1]----| |skip this------| |get this-------| @@ -86,7 +89,7 @@ typedef enum */ /** - * @brief Read Coil at its local address. + * @brief Считать коил по локальному адресу. * @param _parr_ - массив коилов. * @param _coil_ - Номер коила от начала массива _arr_. * @return uint16_t Возвращает запрошенный коил на 0м бите. @@ -95,7 +98,7 @@ typedef enum */ #define MB_Read_Coil_Local(_parr_, _coil_) (( *MB_Set_Coil_Reg_Ptr(_parr_, _coil_) & MB_Set_Coil_Mask(_coil_) ) >> (_coil_)) /** - * @brief Set Coil at its local address. + * @brief Выставить коил по локальному адресу. * @param _parr_ Указатель на массив коилов. * @param _coil_ - Номер коила от начала массива _arr_. * @@ -103,7 +106,7 @@ typedef enum */ #define MB_Set_Coil_Local(_parr_, _coil_) *MB_Set_Coil_Reg_Ptr(_parr_, _coil_) |= MB_Set_Coil_Mask(_coil_) /** - * @brief Reset Coil at its local address. + * @brief Сбросить коил по локальному адресу. * @param _parr_ Указатель на массив коилов. * @param _coil_ - Номер коила от начала массива _arr_. * @@ -111,7 +114,7 @@ typedef enum */ #define MB_Reset_Coil_Local(_parr_, _coil_) *MB_Set_Coil_Reg_Ptr(_parr_, _coil_) &= ~(MB_Set_Coil_Mask(_coil_)) /** - * @brief Set Coil at its local address. + * @brief Переключить состояние коила по локальному адресу. * @param _parr_ Указатель на массив коилов. * @param _coil_ - Номер коила от начала массива _arr_. * @@ -119,9 +122,9 @@ typedef enum */ #define MB_Toogle_Coil_Local(_parr_, _coil_) *MB_Set_Coil_Reg_Ptr(_parr_, _coil_) ^= MB_Set_Coil_Mask(_coil_) -/* Set or Reset Coil at its global address */ +/* Выставить/сбросить коил по глобальному адресу */ MB_ExceptionTypeDef MB_Write_Coil_Global(uint16_t Addr, MB_CoilsOpTypeDef WriteVal); -/* Read Coil at its global address */ +/* Считать коил по глобальному адресу */ uint16_t MB_Read_Coil_Global(uint16_t Addr, MB_ExceptionTypeDef *Exception); /** MODBUS_DATA_ACCESS_FUNCTIONS @@ -133,11 +136,11 @@ uint16_t MB_Read_Coil_Global(uint16_t Addr, MB_ExceptionTypeDef *Exception); * @addtogroup MODBUS_CMD_PROCESS_FUNCTIONS @{ */ -/* Proccess command Read Coils (01 - 0x01) */ +/* Обработать функцию Read Coils (01 - 0x01) */ uint8_t MB_Proccess_Read_Coils(RS_MsgTypeDef *modbus_msg); -/* Proccess command Write Single Coils (05 - 0x05) */ +/* Обработать функцию Write Single Coils (05 - 0x05) */ uint8_t MB_Proccess_Write_Single_Coil(RS_MsgTypeDef *modbus_msg); -/* Proccess command Write Multiple Coils (15 - 0x0F) */ +/* Обработать функцию Write Multiple Coils (15 - 0x0F) */ uint8_t MB_Write_Miltuple_Coils(RS_MsgTypeDef *modbus_msg); /** MODBUS_CMD_PROCESS_FUNCTIONS diff --git a/Inc/modbus_core.h b/Inc/modbus_core.h index dabc870..c29400b 100644 --- a/Inc/modbus_core.h +++ b/Inc/modbus_core.h @@ -27,6 +27,7 @@ #include "modbus_config.h" #include "modbus_data.h" +#include "__crc_algs.h" /** * @addtogroup MODBUS_MESSAGE_DEFINES Modbus Message Tools @@ -93,8 +94,8 @@ typedef enum //MB_FunctonTypeDef MB_W_COILS = 0x0F, ///< Запись нескольких битовых ячеек MB_W_HOLD_REGS = 0x10, ///< Запись нескольких регистров - MB_R_DIAGNOSTIC = 0x08, ///< Чтение диагностической информации устройства - MB_R_DEVICE_INFO = 0x2B, ///< Чтение информации об устройстве + MB_R_DIAGNOSTIC = 0x08, ///< Чтение диагностической информации устройства + MB_R_DEVICE_INFO = 0x2B, ///< Чтение информации об устройстве /* ERRORS */ // error reading @@ -122,20 +123,20 @@ typedef enum //MB_FunctonTypeDef /** @brief Structure for comformity */ typedef enum //MB_FunctonTypeDef { - MB_BASIC_IDENTIFICATION = 0x01, /*!< @brief Basic Device Identification. + MB_BASIC_IDENTIFICATION = 0x01, /*!< @brief Basic Device Identification. @details All objects of this category are mandatory: VendorName,Product code, and revision number */ - MB_REGULAR_IDENTIFICATION = 0x02, /*!< @brief Regular Device Identification. + MB_REGULAR_IDENTIFICATION = 0x02, /*!< @brief Regular Device Identification. @details The device provides additional and optional identification and description data objects */ - MB_EXTENDED_IDENTIFICATION = 0x03, /*!< @brief Extended Device Identification. + MB_EXTENDED_IDENTIFICATION = 0x03, /*!< @brief Extended Device Identification. @details The device provides additional and optional identification and description private data about the physical device itself. All of these data are device dependent. */ - MB_SPEDIFIC_IDENTIFICATION = 0x04, /*!< @brief Specific Device Identification. + MB_SPEDIFIC_IDENTIFICATION = 0x04, /*!< @brief Specific Device Identification. @details The device provides one specific identification object. */ /* ERRORS */ diff --git a/Inc/modbus_devid.h b/Inc/modbus_devid.h index 6acee42..00f514e 100644 --- a/Inc/modbus_devid.h +++ b/Inc/modbus_devid.h @@ -77,17 +77,18 @@ void MB_DeviceInentificationInit(void); ///////////////////////////////////////////////////////////////////// /////////////////////////---FUNCTIONS---///////////////////////////// +/* Записать Один Объект Идентификатора в массив данных */ +void MB_WriteSingleObjectToMessage(char *mbdata, unsigned *ind, MB_DeviceObjectTypeDef *obj); +/* Записать Массив Объектов Идентификатора в массив данных */ +void MB_WriteObjectsToMessage(RS_MsgTypeDef *modbus_msg, unsigned maxidofobj); + //---------PROCESS MODBUS COMMAND FUNCTIONS--------- /** * @addtogroup MODBUS_CMD_PROCESS_FUNCTIONS @{ */ -/* Write Object of Device Identification to MessageData */ -void MB_WriteSingleObjectToMessage(char *mbdata, unsigned *ind, MB_DeviceObjectTypeDef *obj); -/* Write Object of Device Identification to MessageData */ -void MB_WriteObjectsToMessage(RS_MsgTypeDef *modbus_msg, unsigned maxidofobj); -/* Proccess command Read Device Identification (43/14 - 0x2B/0E) */ +/* Обработать функцию Read Device Identification (43/14 - 0x2B/0E) */ uint8_t MB_Proccess_Read_Device_Identification(RS_MsgTypeDef *modbus_msg); /** MODBUS_CMD_PROCESS_FUNCTIONS * @} diff --git a/Inc/modbus_diag.h b/Inc/modbus_diag.h index 8f85db0..ccba95c 100644 --- a/Inc/modbus_diag.h +++ b/Inc/modbus_diag.h @@ -32,19 +32,18 @@ typedef enum /** @brief Структура со диагностической информацией устройства модбас */ typedef struct { - uint16_t DiagnosticRegister; - MB_DeviceModeTypeDef DeviceMode; - uint8_t AsciiDelimiter; + uint16_t DiagnosticRegister; ///< Регистр диагностики. 0 бит - overrun. Остальное заполняется пользователем + MB_DeviceModeTypeDef DeviceMode;///< Режим устройства - NORMAL/LISTEN_ONLY struct { - uint16_t BusMessage; - uint16_t BusCommunicationErr; - uint16_t BusExceptionErr; - uint16_t SlaveMessage; - uint16_t SlaveNoResponse; - uint16_t SlaveNAK; - uint16_t SlaveBusy; - uint16_t BusCharacterOverrun; + uint16_t BusMessage; ///< Все принятые фреймы modbus на линии (с всех адресов) + uint16_t BusCommunicationErr; ///< Ошибки при приеме фрейма modbus + uint16_t BusExceptionErr; ///< Ошибки при обработке фрейма modbus + uint16_t SlaveMessage; ///< Принятые сообщения (только запросы на адрес данного устройства) + uint16_t SlaveNoResponse; ///< Счетчик сколько мы раз не ответили на запрос + uint16_t SlaveNAK; ///< Счетчик аномальной ошибки при обработке фрейма + uint16_t SlaveBusy; ///< Счетчик принятых запросов когда устройство занято. Здесь не работает: из-за архитектуры отследить невозможно + uint16_t BusCharacterOverrun; ///< Overrun Error } Counters; } MB_DiagnosticsInfoTypeDef; diff --git a/Inc/modbus_holdregs.h b/Inc/modbus_holdregs.h index 2d6898e..e4ffca4 100644 --- a/Inc/modbus_holdregs.h +++ b/Inc/modbus_holdregs.h @@ -29,11 +29,11 @@ * @addtogroup MODBUS_CMD_PROCESS_FUNCTIONS @{ */ -/* Proccess command Read Holding Registers (03 - 0x03) */ +/* Обработать функцию Read Holding Registers (03 - 0x03) */ uint8_t MB_Proccess_Read_Hold_Regs(RS_MsgTypeDef *modbus_msg); -/* Proccess command Write Single Coils (06 - 0x06) */ +/* Обработать функцию Write Single Coils (06 - 0x06) */ uint8_t MB_Proccess_Write_Single_Reg(RS_MsgTypeDef *modbus_msg); -/* Proccess command Write Multiple Register (16 - 0x10) */ +/* Обработать функцию Write Multiple Register (16 - 0x10) */ uint8_t MB_Proccess_Write_Miltuple_Regs(RS_MsgTypeDef *modbus_msg); /** MODBUS_CMD_PROCESS_FUNCTIONS diff --git a/Inc/modbus_inputregs.h b/Inc/modbus_inputregs.h index 53360b0..3dc3010 100644 --- a/Inc/modbus_inputregs.h +++ b/Inc/modbus_inputregs.h @@ -29,7 +29,7 @@ * @brief Функции обработки запросов модбас @{ */ -/* Proccess command Read Input Registers (04 - 0x04) */ +/* Обработать функцию Read Input Registers (04 - 0x04) */ uint8_t MB_Proccess_Read_Input_Regs(RS_MsgTypeDef *modbus_msg); /** MODBUS_CMD_PROCESS_FUNCTIONS diff --git a/Inc/rs_message.h b/Inc/rs_message.h index c8a8d18..0625fd4 100644 --- a/Inc/rs_message.h +++ b/Inc/rs_message.h @@ -204,7 +204,7 @@ typedef struct unsigned MessageHandled:1; ///< flag: 1 - RS command is handled, 0 - RS command isnt handled yet unsigned EchoResponse:1; ///< flag: 1 - response with received msg, 0 - response with own msg unsigned DeferredResponse:1; ///< flag: 1 - response not in interrupt, 0 - response in interrupt - unsigned DataUpdated:1; ///< flag: 1 - Received command to write colis/resg + unsigned DataUpdated:1; ///< flag: 1 - Received command to write colis/resg unsigned ReInit_UART:1; ///< flag: 1 - need to reinitialize uart, 0 - nothing }RS_FlagsTypeDef; diff --git a/README.md b/README.md index 321b7c3..71b23e6 100644 --- a/README.md +++ b/README.md @@ -4,28 +4,28 @@ ## Структура библиотеки -*Note: Файлы начинающиеся с `__` и которых нет в этом дереве являются **внутренними/непротестированными/недокументированными*** +*Note: Файлы начинающиеся с `__` и которых **нет** в этом дереве являются **внутренними/непротестированными/недокументированными*** ``` -Modbus/ -│ inc/ -│ ├── modbus.h # Главный заголовочный файл -│ ├── modbus_core.h # Базовые определения и структуры -│ ├── modbus_coils.h # Работа с дискретными выходами -│ ├── modbus_holdregs.h # Работа с регистрами хранения -│ ├── modbus_inputregs.h # Работа с входными регистрами -│ ├── modbus_devid.h # Идентификация устройства -│ ├── rs_message.h # Драйвер обмена по RS/UART -├── src/ -│ ├── modbus.c # Основная логика Modbus Slave -│ ├── modbus_coils.c # Реализация работы с coils -│ ├── modbus_holdregs.c # Реализация регистров хранения -│ ├── modbus_inputregs.c # Реализация входных регистров -│ ├── modbus_devid.c # Реализация идентификации устройства -│ ├── modbus_data.c # Функции доступа к данным -│ └── rs_message.c # Реализация драйвера RS -├── __modbus_config.h # Конфигурация Modbus (надо заменить) -├── __modbus_data.h # Структуры данных (надо заменить) -└── __modbus_data.c # Функции доступа (надо заменить) +Modbus/ Иерархия: +│ inc/ modbus +│ ├── modbus.h # Главный заголовочный файл ├── modbus_coils +│ ├── modbus_core.h # Базовые определения и структуры ├── modbus_inputregs +│ ├── modbus_coils.h # Работа с дискретными выходами ├── modbus_inputregs +│ ├── modbus_holdregs.h # Работа с регистрами хранения ├── modbus_devid +│ ├── modbus_inputregs.h # Работа с входными регистрами ├── modbus_diag +│ ├── modbus_devid.h # Идентификация устройства └── rs_message +│ ├── rs_message.h # Драйвер обмена по RS/UART │ +├── src/ └── modbus_core.h (единое ядро) +│ ├── modbus.c # Основная логика Modbus Slave ├── modbus_config +│ ├── modbus_coils.c # Реализация работы с coils ├── modbus_data +│ ├── modbus_holdregs.c # Реализация регистров хранения └── __crc_algs +│ ├── modbus_inputregs.c # Реализация входных регистров +│ ├── modbus_devid.c # Реализация идентификации устройства +│ ├── modbus_data.c # Функции доступа к данным +│ └── rs_message.c # Реализация драйвера RS +├── __modbus_config.h # Конфигурация Modbus (надо заменить) +├── __modbus_data.h # Структуры данных (надо заменить) +└── __modbus_data.c # Функции доступа (надо заменить) ``` ## Инструкция по подключению @@ -42,9 +42,9 @@ git submodule update --init --recursive ``` ProjectRoot/ ├── Configs/ -│ ├── modbus_config.h # ← скопировать из __modbus_config.h -│ ├── modbus_data.h # ← скопировать из __modbus_data.h -│ └── modbus_data.c # ← скопировать из __modbus_data.c (опционально) +│ ├── modbus_config.h # скопировать из __modbus_config.h +│ ├── modbus_data.h # скопировать из __modbus_data.h +│ └── modbus_data.c # скопировать из __modbus_data.c └── Modbus/ # Субмодуль ``` diff --git a/Src/modbus.c b/Src/modbus.c index 2c6514a..06fe021 100644 --- a/Src/modbus.c +++ b/Src/modbus.c @@ -9,16 +9,16 @@ @section Функции и макросы ### Инициализация: -- MODBUS_FirstInit() — Инициализация модуля Modbus. -- MODBUS_Config() — Инициализация модуля Modbus. +- MODBUS_FirstInit() — Инициализация Modbus (подключение UART, TIM) +- MODBUS_Config() — Конфигурацмя Modbus (ID, Timeout). - MODBUS_SlaveStart() — Запуск Modbus как Slave. ### Функции для Modbus -- MB_Slave_Response() -- MB_Slave_Collect_Message() -- MB_Slave_Parse_Message() -- MB_Master_Collect_Message() -- MB_Master_Parse_Message() +- MB_Slave_Response() — Ответ на запрос +- MB_Slave_Collect_Message() — Сбор сообщения в режиме слейва. +- MB_Slave_Parse_Message() — Парс сообщения в режиме слейва. +- MB_Master_Collect_Message() — Сбор сообщения в режиме мастера +- MB_Master_Parse_Message() — Парс сообщения в режиме мастера ### Функции для работы с RS (UART): - RS_Parse_Message() / RS_Collect_Message() — Парсинг и сборка сообщения. @@ -50,7 +50,6 @@ HAL_StatusTypeDef MODBUS_FirstInit(RS_HandleTypeDef *hmodbus, UART_HandleTypeDef return HAL_ERROR; } MB_DeviceInentificationInit(); - MB_DiagnosticsInit(); //-----------SETUP MODBUS------------- // set up modbus: MB_RX_Size_NotConst and Timeout enable hmodbus->ID = MODBUS_DEVICE_ID; @@ -116,6 +115,9 @@ HAL_StatusTypeDef MODBUS_SlaveStart(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *mo { return HAL_ERROR; } + + MB_DiagnosticsInit(); + if(modbus_msg) hmodbus->RS_STATUS = RS_Receive_IT(hmodbus, modbus_msg); else @@ -228,7 +230,6 @@ static RS_StatusTypeDef MB_Slave_Response(RS_HandleTypeDef *hmodbus, RS_MsgTypeD /* unknown func code */ default: modbus_msg->Except_Code = 0x01; /* set exception code: illegal function */ - MB_Diagnostics_SlaveNAKCnt(); } @@ -245,7 +246,7 @@ static RS_StatusTypeDef MB_Slave_Response(RS_HandleTypeDef *hmodbus, RS_MsgTypeD { MB_Diagnostics_ExceptionErrorCnt(); TrackerCnt_Warn(hmodbus->rs_err); - modbus_msg->Func_Code |= ERR_VALUES_START; + modbus_msg->Func_Code |= ERR_VALUES_START; } else { @@ -488,9 +489,9 @@ static RS_StatusTypeDef MB_Slave_Parse_Message(RS_HandleTypeDef *hmodbus, RS_Msg } if((hmodbus->pMessagePtr->Func_Code == 0x0F) || (hmodbus->pMessagePtr->Func_Code == 0x10)) - hmodbus->pMessagePtr->ByteCnt = modbus_uart_buff[ind++]; - else - hmodbus->pMessagePtr->ByteCnt = 0; + hmodbus->pMessagePtr->ByteCnt = modbus_uart_buff[ind++]; + else + hmodbus->pMessagePtr->ByteCnt = 0; expected_size = MB_Define_Size_of_Function(hmodbus, modbus_msg); // если размер меньше ожидаемого - продолжаем принимать @@ -544,16 +545,7 @@ static RS_StatusTypeDef MB_Slave_Parse_Message(RS_HandleTypeDef *hmodbus, RS_Msg MB_Diagnostics_CommunicationErrorCnt(); TrackerCnt_Err(hmodbus->rs_err); modbus_msg->Func_Code |= ERR_VALUES_START; - } -// hmodbus->MB_RESPONSE = MB_CRC_ERR; // set func code - error about wrong crc - - // check is buffer empty - check_empty_buff = 0; - for(int i=0; iMB_RESPONSE = MB_EMPTY_MSG; // - + } return RS_OK; } diff --git a/Src/modbus_coils.c b/Src/modbus_coils.c index 456079f..c6f6e7f 100644 --- a/Src/modbus_coils.c +++ b/Src/modbus_coils.c @@ -15,7 +15,7 @@ #ifdef MODBUS_ENABLE_COILS /** - * @brief Set or Reset Coil at its global address. + * @brief Выставить/сбросить коил по глобальному адресу. * @param Addr Адрес коила. * @param WriteVal Что записать в коил: 0 или 1. * @return ExceptionCode Код исключения если коила по адресу не существует, и NO_ERRORS если все ок. @@ -55,7 +55,7 @@ MB_ExceptionTypeDef MB_Write_Coil_Global(uint16_t Addr, MB_CoilsOpTypeDef WriteV /** - * @brief Read Coil at its global address. + * @brief Считать коил по глобальному адресу. * @param Addr Адрес коила. * @param Exception Указатель на переменную для кода исключения, в случа неудачи при чтении. * @return uint16_t Возвращает весь регистр с маской на запрошенном коиле. @@ -86,8 +86,8 @@ uint16_t MB_Read_Coil_Global(uint16_t Addr, MB_ExceptionTypeDef *Exception) } -/** - * @brief Proccess command Read Coils (01 - 0x01). +/** + * @brief Обработать функцию Read Coils (01 - 0x01). * @param modbus_msg Указатель на структуру собщения modbus. * @return fMessageHandled Статус о результате обработки комманды. * @details Обработка команды Read Coils. @@ -140,7 +140,7 @@ uint8_t MB_Proccess_Read_Coils(RS_MsgTypeDef *modbus_msg) } /** - * @brief Proccess command Write Single Coils (05 - 0x05). + * @brief Обработать функцию Write Single Coils (05 - 0x05). * @param modbus_msg Указатель на структуру собщения modbus. * @return fMessageHandled Статус о результате обработки комманды. * @details Обработка команды Write Single Coils. @@ -171,7 +171,7 @@ uint8_t MB_Proccess_Write_Single_Coil(RS_MsgTypeDef *modbus_msg) } /** - * @brief Proccess command Write Multiple Coils (15 - 0x0F). + * @brief Обработать функцию Write Multiple Coils (15 - 0x0F). * @param modbus_msg Указатель на структуру собщения modbus. * @return fMessageHandled Статус о результате обработки комманды. * @details Обработка команды Write Multiple Coils. diff --git a/Src/modbus_devid.c b/Src/modbus_devid.c index 49a9ce5..8ed5ff6 100644 --- a/Src/modbus_devid.c +++ b/Src/modbus_devid.c @@ -18,14 +18,14 @@ #ifdef MODBUS_ENABLE_DEVICE_IDENTIFICATORS -MB_DeviceIdentificationTypeDef MB_DEVID; ///< Device Identificatino= +MB_DeviceIdentificationTypeDef MB_DEVID; ///< Глобальная структура идентификаторов устройства /** - * @brief Write Object of Device Identification to MessageData - * @param mbdata Указатель на массив данных в структуре RS_MsgTypeDef. - * @return obj Объект для записи. - */ + * @brief Записать Один Объект Идентификатора в массив данных + * @param mbdata Указатель на массив данных в структуре RS_MsgTypeDef. + * @return obj Объект для записи. + */ void MB_WriteSingleObjectToMessage(char *mbdata, unsigned *ind, MB_DeviceObjectTypeDef *obj) { mbdata[(*ind)++] = obj->length; @@ -37,10 +37,10 @@ void MB_WriteSingleObjectToMessage(char *mbdata, unsigned *ind, MB_DeviceObjectT /** - * @brief Write Object of Device Identification to MessageData - * @param mbdata Указатель на массив данных в структуре RS_MsgTypeDef. - * @return obj Объект для записи. - */ + * @brief Записать Массив Объектов Идентификатора в массив данных + * @param mbdata Указатель на массив данных в структуре RS_MsgTypeDef. + * @return obj Объект для записи. + */ void MB_WriteObjectsToMessage(RS_MsgTypeDef *modbus_msg, unsigned maxidofobj) { MB_DeviceObjectTypeDef *obj = (MB_DeviceObjectTypeDef *)&MB_DEVID; @@ -88,7 +88,7 @@ void MB_WriteObjectsToMessage(RS_MsgTypeDef *modbus_msg, unsigned maxidofobj) /** - * @brief Proccess command Read Device Identification (43/14 - 0x2B/0E). + * @brief Обработать функцию Read Device Identification (43/14 - 0x2B/0E). * @param modbus_msg Указатель на структуру собщения modbus. * @return fMessageHandled Статус о результате обработки комманды. * @details Обработка команды Write Single Register. @@ -144,8 +144,9 @@ uint8_t MB_Proccess_Read_Device_Identification(RS_MsgTypeDef *modbus_msg) - - +/** + * @brief Инициализация идентификаторов. + */ void MB_DeviceInentificationInit(void) { MB_ObjectInit(&MB_DEVID.VendorName, MODBUS_VENDOR_NAME); diff --git a/Src/modbus_diag.c b/Src/modbus_diag.c index 9690b34..0e67a1d 100644 --- a/Src/modbus_diag.c +++ b/Src/modbus_diag.c @@ -13,17 +13,16 @@ #include "modbus_diag.h" #ifdef MODBUS_ENABLE_DIAGNOSTICS -// Глобальная структура диагностики -MB_DiagnosticsInfoTypeDef MB_DIAG = {0}; + +MB_DiagnosticsInfoTypeDef MB_DIAG = {0}; ///< Глобальная структура диагностики /** - * @brief Инициализация диагностических счетчиков + * @brief Инициализация диагностических счетчиков */ void MB_DiagnosticsInit(void) { MB_DIAG.DiagnosticRegister = 0; MB_DIAG.DeviceMode = MODBUS_NORMAL_MODE; - MB_DIAG.AsciiDelimiter = '\n'; // LF по умолчанию // Инициализация счетчиков MB_DIAG.Counters.BusMessage = 0; @@ -68,7 +67,7 @@ int MB_Diagnostics_GetBit(int bit_num) } /** - * @brief Обработка команды диагностики (0x08) + * @brief Обработать функцию Diagnostics (Serial Line only) (0x08) * @param modbus_msg Указатель на структуру сообщения modbus * @return fMessageHandled Статус обработки команды */ @@ -218,7 +217,7 @@ void MB_Diagnostics_BusMessageCnt(void) } /** - * @brief Увеличивает счетчик ошибок связи + * @brief Увеличивает счетчик ошибок связи */ void MB_Diagnostics_CommunicationErrorCnt(void) { @@ -227,7 +226,7 @@ void MB_Diagnostics_CommunicationErrorCnt(void) } /** - * @brief Увеличивает счетчик исключений + * @brief Увеличивает счетчик исключений */ void MB_Diagnostics_ExceptionErrorCnt(void) { @@ -236,7 +235,7 @@ void MB_Diagnostics_ExceptionErrorCnt(void) } /** - * @brief Увеличивает счетчик переполнения символов + * @brief Увеличивает счетчик переполнения символов */ void MB_Diagnostics_CharacterOverrunCnt(void) { @@ -249,7 +248,7 @@ void MB_Diagnostics_CharacterOverrunCnt(void) } /** - * @brief Увеличивает счетчик отсутствия ответов + * @brief Увеличивает счетчик отсутствия ответов */ void MB_Diagnostics_SlaveMessageCnt(void) { @@ -258,7 +257,7 @@ void MB_Diagnostics_SlaveMessageCnt(void) } /** - * @brief Увеличивает счетчик отсутствия ответов + * @brief Увеличивает счетчик отсутствия ответов */ void MB_Diagnostics_SlaveNoResponseCnt(void) { @@ -267,7 +266,7 @@ void MB_Diagnostics_SlaveNoResponseCnt(void) } /** - * @brief Увеличивает счетчик NAK ответов + * @brief Увеличивает счетчик NAK ответов */ void MB_Diagnostics_SlaveNAKCnt(void) { @@ -276,7 +275,7 @@ void MB_Diagnostics_SlaveNAKCnt(void) } /** - * @brief Увеличивает счетчик занятости устройства + * @brief Увеличивает счетчик занятости устройства */ void MB_Diagnostics_SlaveBusyCnt(void) { diff --git a/Src/modbus_holdregs.c b/Src/modbus_holdregs.c index 8ac96d1..9d048bc 100644 --- a/Src/modbus_holdregs.c +++ b/Src/modbus_holdregs.c @@ -25,7 +25,7 @@ /** - * @brief Proccess command Read Holding Registers (03 - 0x03). + * @brief Обработать функцию Read Holding Registers (03 - 0x03). * @param modbus_msg Указатель на структуру собщения modbus. * @return fMessageHandled Статус о результате обработки комманды. * @details Обработка команды Read Holding Registers. @@ -53,7 +53,7 @@ uint8_t MB_Proccess_Read_Hold_Regs(RS_MsgTypeDef *modbus_msg) } /** - * @brief Proccess command Write Single Register (06 - 0x06). + * @brief Обработать функцию Write Single Register (06 - 0x06). * @param modbus_msg Указатель на структуру собщения modbus. * @return fMessageHandled Статус о результате обработки комманды. * @details Обработка команды Write Single Register. @@ -72,7 +72,7 @@ uint8_t MB_Proccess_Write_Single_Reg(RS_MsgTypeDef *modbus_msg) } /** - * @brief Proccess command Write Multiple Registers (16 - 0x10). + * @brief Обработать функцию Write Multiple Registers (16 - 0x10). * @param modbus_msg Указатель на структуру собщения modbus. * @return fMessageHandled Статус о результате обработки комманды. * @details Обработка команды Write Multiple Registers. diff --git a/Src/modbus_inputregs.c b/Src/modbus_inputregs.c index 62927c5..2db5695 100644 --- a/Src/modbus_inputregs.c +++ b/Src/modbus_inputregs.c @@ -15,7 +15,7 @@ #ifdef MODBUS_ENABLE_INPUTS /** - * @brief Proccess command Read Input Registers (04 - 0x04). + * @brief Обработать функцию Read Input Registers (04 - 0x04). * @param modbus_msg Указатель на структуру собщения modbus. * @return fMessageHandled Статус о результате обработки комманды. * @details Обработка команды Read Input Registers. diff --git a/Src/rs_message.c b/Src/rs_message.c index bea7d7f..0bc0c09 100644 --- a/Src/rs_message.c +++ b/Src/rs_message.c @@ -35,7 +35,7 @@ extern void RS_TIM_DeInit(TIM_HandleTypeDef *htim); //------------------------------------------------------------------- //-------------------------GENERAL FUNCTIONS------------------------- /** - * @brief Start receive IT. + * @brief Начать прием по прерываниям. * @param hRS Указатель на хендлер RS. * @param RS_msg Указатель на структуру сообщения. * @return RS_RES Статус о состоянии RS после инициализации приема. @@ -61,7 +61,7 @@ RS_StatusTypeDef RS_Receive_IT(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg) // start receiving __HAL_UART_ENABLE_IT(hRS->huart, UART_IT_IDLE); - uart_res = HAL_UART_Receive_IT(hRS->huart, &hRS->pBufferPtr[hRS->RS_Message_Size], MSG_SIZE_MAX); // receive until ByteCnt+1 byte, + uart_res = HAL_UART_Receive_IT(hRS->huart, &hRS->pBufferPtr[hRS->RS_Message_Size], MSG_SIZE_MAX); // receive until ByteCnt+1 byte, // then in Callback restart receive for rest bytes // if receive isnt started - abort RS @@ -83,7 +83,7 @@ RS_StatusTypeDef RS_Receive_IT(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg) } /** - * @brief Start transmit IT. + * @brief Начать передачу по прерываниям. * @param hRS Указатель на хендлер RS. * @param RS_msg Указатель на структуру сообщения. * @return RS_RES Статус о состоянии RS после инициализации передачи. @@ -112,7 +112,6 @@ RS_StatusTypeDef RS_Transmit_IT(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg) //----------INITIALIZE TRANSMIT------------- RS_EnableTransmit(); -// for(int i = 0; i < hRS->sRS_Timeout; i++); RS_Set_Busy(hRS); // set RS busy RS_Set_TX_Flags(hRS); // initialize flags for transmit IT @@ -146,7 +145,7 @@ RS_StatusTypeDef RS_Transmit_IT(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg) } /** - * @brief Initialize UART and handle RS stucture. + * @brief Инициалазация структуры @ref RS_HandleTypeDef. * @param hRS Указатель на хендлер RS. * @param suart Указатель на структуру с настройками UART. * @param stim Указатель на структуру с настройками таймера. @@ -183,7 +182,7 @@ RS_StatusTypeDef RS_Init(RS_HandleTypeDef *hRS, UART_HandleTypeDef *huart, TIM_H /** - * @brief Abort RS/UART. + * @brief Отменить прием/передачу RS/UART. * @param hRS Указатель на хендлер RS. * @param AbortMode Выбор, что надо отменить. - ABORT_TX: Отмена передачи по ЮАРТ, с очищением флагов TX, @@ -238,7 +237,7 @@ RS_StatusTypeDef RS_Abort(RS_HandleTypeDef *hRS, RS_AbortTypeDef AbortMode) //------------------------------------------------------------------- //--------------------CALLBACK/HANDLER FUNCTIONS--------------------- /** - * @brief Handle for starting receive. + * @brief Обработчик для начала приема. * @param hRS Указатель на хендлер RS. * @param RS_msg Указатель на структуру сообщения. * @return RS_RES Статус о состоянии RS после инициализации приема или окончания общения. @@ -264,7 +263,7 @@ RS_StatusTypeDef RS_Handle_Receive_Start(RS_HandleTypeDef *hRS, RS_MsgTypeDef *R return RS_RES; } /** - * @brief Handle for starting transmit. + * @brief Обработчик для начала передачи. * @param hRS Указатель на хендлер RS. * @param RS_msg Указатель на структуру сообщения. * @return RS_RES Статус о состоянии RS после инициализации передачи. @@ -295,7 +294,7 @@ RS_StatusTypeDef RS_Handle_Transmit_Start(RS_HandleTypeDef *hRS, RS_MsgTypeDef * } /** - * @brief UART TX Callback: define behaviour after transmiting message. +* @brief UART TX Callback: коллбек после окончания передачи. * @param hRS Указатель на хендлер RS. * @return RS_RES Статус о состоянии RS после обработки приема. * @note Определяет поведение RS после передачи сообщения. @@ -307,24 +306,18 @@ RS_StatusTypeDef RS_UART_TxCpltCallback(RS_HandleTypeDef *hRS) //--------------ENDING TRANSMITTING------------- RS_Set_TX_End(hRS); - RS_EnableReceive(); -// for(int i = 0; i < hRS->sRS_Timeout; i++); //-----------START RECEIVING or END RS---------- RS_RES = RS_Handle_Receive_Start(hRS, hRS->pMessagePtr); -// if(RS_RES != RS_OK) -// { -// __NOP(); -// } return RS_RES; } /** - * @brief Handler for UART. +* @brief Обработчик прерывания UART. * @param hRS Указатель на хендлер RS. * @note Обрабатывает ошибки если есть и вызывает RS Коллбеки. - * Добавить вызов этой функции в UARTx_IRQHandler() после HAL_UART_IRQHandler(). + * Добавить вызов этой функции в UARTx_IRQHandler() ВМЕСТО HAL_UART_IRQHandler(). */ void RS_UART_Handler(RS_HandleTypeDef *hRS) { @@ -332,7 +325,7 @@ void RS_UART_Handler(RS_HandleTypeDef *hRS) { return; } - //-------------CHECK IDLE FLAG FIRST------------- + //-------------CHECK IDLE FLAG FIRST------------- /* Проверяем флаг IDLE в первую очередь - это гарантирует обработку только после idle */ if(__HAL_UART_GET_FLAG(hRS->huart, UART_FLAG_IDLE) && __HAL_UART_GET_IT_SOURCE(hRS->huart, UART_IT_IDLE)) { @@ -365,7 +358,7 @@ void RS_UART_Handler(RS_HandleTypeDef *hRS) if(hRS->htim) { // Останавливаем таймаут - if(hRS->sRS_Timeout) + if(hRS->sRS_Timeout) HAL_TIM_Base_Stop_IT(hRS->htim); } hRS->lastPacketTick = uwTick; @@ -431,10 +424,10 @@ void RS_UART_Handler(RS_HandleTypeDef *hRS) /** - * @brief Handler for TIM. + * @brief Обработчик прерывания TIM. * @param hRS Указатель на хендлер RS. * @note Попадание сюда = таймаут и перезапуск RS приема - * Добавить вызов этой функции в TIMx_IRQHandler() после HAL_TIM_IRQHandler(). + * Добавить вызов этой функции в TIMx_IRQHandler() ВМЕСТО HAL_TIM_IRQHandler(). */ void RS_TIM_Handler(RS_HandleTypeDef *hRS) { @@ -444,10 +437,10 @@ void RS_TIM_Handler(RS_HandleTypeDef *hRS) } HAL_TIM_IRQHandler(hRS->htim); - RS_Abort(hRS, ABORT_RS); + RS_Abort(hRS, ABORT_RS); - if(hRS->pMessagePtr->MbAddr == hRS->ID) // ошибка если таймаут по нашему сообщению - TrackerCnt_Err(hRS->rs_err); + if(hRS->pMessagePtr->MbAddr == hRS->ID) // ошибка если таймаут по нашему сообщению + TrackerCnt_Err(hRS->rs_err); RS_Handle_Receive_Start(hRS, hRS->pMessagePtr); } @@ -472,7 +465,7 @@ __weak RS_StatusTypeDef RS_Response(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg } /** - * @brief Собрать сообщение в буфер UART. + * @brief Пользовательская функция для сбора сообщения в буфер UART. * @param hRS Указатель на хендлер RS. * @param RS_msg Указатель на структуру сообщения. * @param msg_uart_buff Указатель на буффер UART. @@ -486,7 +479,7 @@ __weak RS_StatusTypeDef RS_Collect_Message(RS_HandleTypeDef *hRS, RS_MsgTypeDef } /** - * @brief Разпарсить сообщение из буфера UART. + * @brief Пользовательская функция для парса сообщения из буфера UART. * @param hRS Указатель на хендлер RS. * @param RS_msg Указатель на структуру сообщения. * @param msg_uart_buff Указатель на буффер UART.