0.2.2 doxygen update

This commit is contained in:
2025-11-04 13:43:15 +03:00
parent af34ac941f
commit 465f293397
16 changed files with 156 additions and 173 deletions

View File

@@ -17,35 +17,30 @@
@section Инструкция по подключению @section Инструкция по подключению
Для корректной работы надо: Для корректной работы надо:
- Подключить обработчики RS_UART_Handler(), RS_TIM_Handler(), в соответствубщие - Подключить обработчики 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, но можно сделать свой - Инициализировать хендл мобдас. По умолчанию глобально создается hmodbus1
После для запуска Modbus: - После для запуска Modbus:
@verbatim @verbatim
//----------------Прием модбас----------------// //----------------Прием модбас----------------//
#include "modbus.h" #include "modbus.h"
MODBUS_FirstInit(&hmodbus1, &huart1, &htim3); MODBUS_FirstInit(&hmodbus1, &huart1, &htim3);
MODBUS_SlaveStart(&hmodbus1, NULL); //MODBUS_Config(&hmodbus1, 1, 1000, 0); // - если нужны другие настройки, не из modbus_config.h
// или если нужно переключится на другой MODBUS_SlaveStart(&hmodbus1, NULL);
@endverbatim @endverbatim
@section Подключаемые модули: @section Подключаемые модули:
- rs_message.h - работа с uart
- modbus_core.h - базовые определения - modbus_core.h - базовые определения
- modbus_coils.h - работа с дискретными выходами - modbus_coils.h - работа с дискретными выходами
- modbus_holdregs.h - работа с регистрами хранения - modbus_holdregs.h - работа с регистрами хранения
- modbus_inputregs.h - работа с входными регистрами - modbus_inputregs.h - работа с входными регистрами
- modbus_devid.h - идентификация устройства - modbus_devid.h - идентификация устройства
- __crc_algs.h - алгоритмы CRC - modbus_diag.h - диагностика modbus
@section Использование в проекте:
1. Настроить modbus_config.h под устройство
2. Определить структуры данных в modbus_data.h
3. Подключить этот файл в rs_message.h
4. Вызвать MODBUS_FirstInit() и RS_Receive_IT()
@section Структура данных Modbus @section Структура данных Modbus
@@ -62,7 +57,6 @@ MODBUS_SlaveStart(&hmodbus1, NULL);
#ifndef __MODBUS_H_ #ifndef __MODBUS_H_
#define __MODBUS_H_ #define __MODBUS_H_
#include "__crc_algs.h"
#include "rs_message.h" #include "rs_message.h"
#include "modbus_coils.h" #include "modbus_coils.h"
#include "modbus_holdregs.h" #include "modbus_holdregs.h"

View File

@@ -42,13 +42,14 @@ typedef enum
//-------------------------------------------------- //--------------------------------------------------
/** /**
* @brief Macros to set pointer to a certain register that contains certain coil * @brief Макрос для установки указателя на регистр, содержащий запрашиваемый коил
* @param _parr_ - массив коилов. * @param _parr_ - массив коилов.
* @param _coil_ - Номер коила от начала массива _arr_. * @param _coil_ - Номер коила от начала массива _arr_.
* @note Используется вместе с @ref MB_Set_Coil_Mask * @note Используется вместе с @ref MB_Set_Coil_Mask
@verbatim Пояснение выражений @verbatim Пояснение выражений
(_coil_/16) - get index (address shift) of register that contain certain coil - (_coil_/16) - индекс регистра, в котором содержится коил по адресу _coil_
Visual explanation: 30th coil in coils registers array
Визуальный пример: 30 коил будет в 30/16 = 1 регистре (индексация с 0)
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxCx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxCx
|register[0]----| |register[1]----| |register[0]----| |register[1]----|
|skip this------| |get this-------| |skip this------| |get this-------|
@@ -57,15 +58,17 @@ typedef enum
*/ */
#define MB_Set_Coil_Reg_Ptr(_parr_, _coil_) ((uint16_t *)(_parr_)+((_coil_)/16)) #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 * @brief Макрос для установки маски, чтобы выделить запрашиваемый коил из регистра
* @param _coil_ - Номер коила от начала массива _arr_. * @param _coil_ - Номер коила от начала массива _arr_.
* @note Используется вместе с @ref MB_Set_Coil_Reg_Ptr * @note Используется вместе с @ref MB_Set_Coil_Reg_Ptr
@verbatim Пояснение выражений @verbatim Пояснение выражений
(16*(_coil_/16) - how many coils we need to skip. e.g. (16*30/16) - skip 16 coils from first register - (16*(_coil_/16) - сколько коилов нужно пропустить. прим. (16*30/16) - первые 16 коилов находятся вне регистра
_coil_-(16*(_coil_/16)) - shift to certain coil in certain register - _coil_-(16*(_coil_/16)) - сдвинуть бит на место запрашиваемого коила в регистре
e.g. Coil(30) gets in register[1] (30/16 = 1) coil №14 (30 - (16*30/16) = 30 - 16 = 14)
Визуальный пример: 30 коил будет регистре[1], на 14 бите:
register = 30/16 = 1
bit = 30 - (16*30/16) = 30 - 16 = 14
Visual explanation: 30th coil in coils registers array
xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxCx xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxCx
|register[0]----| |register[1]----| |register[0]----| |register[1]----|
|skip this------| |get this-------| |skip this------| |get this-------|
@@ -86,7 +89,7 @@ typedef enum
*/ */
/** /**
* @brief Read Coil at its local address. * @brief Считать коил по локальному адресу.
* @param _parr_ - массив коилов. * @param _parr_ - массив коилов.
* @param _coil_ - Номер коила от начала массива _arr_. * @param _coil_ - Номер коила от начала массива _arr_.
* @return uint16_t Возвращает запрошенный коил на 0м бите. * @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_)) #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 _parr_ Указатель на массив коилов.
* @param _coil_ - Номер коила от начала массива _arr_. * @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_) #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 _parr_ Указатель на массив коилов.
* @param _coil_ - Номер коила от начала массива _arr_. * @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_)) #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 _parr_ Указатель на массив коилов.
* @param _coil_ - Номер коила от начала массива _arr_. * @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_) #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); 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); uint16_t MB_Read_Coil_Global(uint16_t Addr, MB_ExceptionTypeDef *Exception);
/** MODBUS_DATA_ACCESS_FUNCTIONS /** 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 * @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); 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); 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); uint8_t MB_Write_Miltuple_Coils(RS_MsgTypeDef *modbus_msg);
/** MODBUS_CMD_PROCESS_FUNCTIONS /** MODBUS_CMD_PROCESS_FUNCTIONS

View File

@@ -27,6 +27,7 @@
#include "modbus_config.h" #include "modbus_config.h"
#include "modbus_data.h" #include "modbus_data.h"
#include "__crc_algs.h"
/** /**
* @addtogroup MODBUS_MESSAGE_DEFINES Modbus Message Tools * @addtogroup MODBUS_MESSAGE_DEFINES Modbus Message Tools

View File

@@ -77,17 +77,18 @@ void MB_DeviceInentificationInit(void);
///////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////
/////////////////////////---FUNCTIONS---///////////////////////////// /////////////////////////---FUNCTIONS---/////////////////////////////
/* Записать Один Объект Идентификатора в массив данных */
void MB_WriteSingleObjectToMessage(char *mbdata, unsigned *ind, MB_DeviceObjectTypeDef *obj);
/* Записать Массив Объектов Идентификатора в массив данных */
void MB_WriteObjectsToMessage(RS_MsgTypeDef *modbus_msg, unsigned maxidofobj);
//---------PROCESS MODBUS COMMAND FUNCTIONS--------- //---------PROCESS MODBUS COMMAND FUNCTIONS---------
/** /**
* @addtogroup MODBUS_CMD_PROCESS_FUNCTIONS * @addtogroup MODBUS_CMD_PROCESS_FUNCTIONS
@{ @{
*/ */
/* Write Object of Device Identification to MessageData */ /* Обработать функцию Read Device Identification (43/14 - 0x2B/0E) */
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) */
uint8_t MB_Proccess_Read_Device_Identification(RS_MsgTypeDef *modbus_msg); uint8_t MB_Proccess_Read_Device_Identification(RS_MsgTypeDef *modbus_msg);
/** MODBUS_CMD_PROCESS_FUNCTIONS /** MODBUS_CMD_PROCESS_FUNCTIONS
* @} * @}

View File

@@ -32,19 +32,18 @@ typedef enum
/** @brief Структура со диагностической информацией устройства модбас */ /** @brief Структура со диагностической информацией устройства модбас */
typedef struct typedef struct
{ {
uint16_t DiagnosticRegister; uint16_t DiagnosticRegister; ///< Регистр диагностики. 0 бит - overrun. Остальное заполняется пользователем
MB_DeviceModeTypeDef DeviceMode; MB_DeviceModeTypeDef DeviceMode;///< Режим устройства - NORMAL/LISTEN_ONLY
uint8_t AsciiDelimiter;
struct struct
{ {
uint16_t BusMessage; uint16_t BusMessage; ///< Все принятые фреймы modbus на линии (с всех адресов)
uint16_t BusCommunicationErr; uint16_t BusCommunicationErr; ///< Ошибки при приеме фрейма modbus
uint16_t BusExceptionErr; uint16_t BusExceptionErr; ///< Ошибки при обработке фрейма modbus
uint16_t SlaveMessage; uint16_t SlaveMessage; ///< Принятые сообщения (только запросы на адрес данного устройства)
uint16_t SlaveNoResponse; uint16_t SlaveNoResponse; ///< Счетчик сколько мы раз не ответили на запрос
uint16_t SlaveNAK; uint16_t SlaveNAK; ///< Счетчик аномальной ошибки при обработке фрейма
uint16_t SlaveBusy; uint16_t SlaveBusy; ///< Счетчик принятых запросов когда устройство занято. Здесь не работает: из-за архитектуры отследить невозможно
uint16_t BusCharacterOverrun; uint16_t BusCharacterOverrun; ///< Overrun Error
} Counters; } Counters;
} MB_DiagnosticsInfoTypeDef; } MB_DiagnosticsInfoTypeDef;

View File

@@ -29,11 +29,11 @@
* @addtogroup MODBUS_CMD_PROCESS_FUNCTIONS * @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); 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); 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); uint8_t MB_Proccess_Write_Miltuple_Regs(RS_MsgTypeDef *modbus_msg);
/** MODBUS_CMD_PROCESS_FUNCTIONS /** MODBUS_CMD_PROCESS_FUNCTIONS

View File

@@ -29,7 +29,7 @@
* @brief Функции обработки запросов модбас * @brief Функции обработки запросов модбас
@{ @{
*/ */
/* Proccess command Read Input Registers (04 - 0x04) */ /* Обработать функцию Read Input Registers (04 - 0x04) */
uint8_t MB_Proccess_Read_Input_Regs(RS_MsgTypeDef *modbus_msg); uint8_t MB_Proccess_Read_Input_Regs(RS_MsgTypeDef *modbus_msg);
/** MODBUS_CMD_PROCESS_FUNCTIONS /** MODBUS_CMD_PROCESS_FUNCTIONS

View File

@@ -4,21 +4,21 @@
## Структура библиотеки ## Структура библиотеки
*Note: Файлы начинающиеся с `__` и которых нет в этом дереве являются **внутренними/непротестированными/недокументированными*** *Note: Файлы начинающиеся с `__` и которых **нет** в этом дереве являются **внутренними/непротестированными/недокументированными***
``` ```
Modbus/ Modbus/ Иерархия:
│ inc/ │ inc/ modbus
│ ├── modbus.h # Главный заголовочный файл │ ├── modbus.h # Главный заголовочный файл ├── modbus_coils
│ ├── modbus_core.h # Базовые определения и структуры │ ├── modbus_core.h # Базовые определения и структуры ├── modbus_inputregs
│ ├── modbus_coils.h # Работа с дискретными выходами │ ├── modbus_coils.h # Работа с дискретными выходами ├── modbus_inputregs
│ ├── modbus_holdregs.h # Работа с регистрами хранения │ ├── modbus_holdregs.h # Работа с регистрами хранения ├── modbus_devid
│ ├── modbus_inputregs.h # Работа с входными регистрами │ ├── modbus_inputregs.h # Работа с входными регистрами ├── modbus_diag
│ ├── modbus_devid.h # Идентификация устройства │ ├── modbus_devid.h # Идентификация устройства └── rs_message
│ ├── rs_message.h # Драйвер обмена по RS/UART │ ├── rs_message.h # Драйвер обмена по RS/UART
├── src/ ├── src/ └── modbus_core.h (единое ядро)
│ ├── modbus.c # Основная логика Modbus Slave │ ├── modbus.c # Основная логика Modbus Slave ├── modbus_config
│ ├── modbus_coils.c # Реализация работы с coils │ ├── modbus_coils.c # Реализация работы с coils ├── modbus_data
│ ├── modbus_holdregs.c # Реализация регистров хранения │ ├── modbus_holdregs.c # Реализация регистров хранения └── __crc_algs
│ ├── modbus_inputregs.c # Реализация входных регистров │ ├── modbus_inputregs.c # Реализация входных регистров
│ ├── modbus_devid.c # Реализация идентификации устройства │ ├── modbus_devid.c # Реализация идентификации устройства
│ ├── modbus_data.c # Функции доступа к данным │ ├── modbus_data.c # Функции доступа к данным
@@ -42,9 +42,9 @@ git submodule update --init --recursive
``` ```
ProjectRoot/ ProjectRoot/
├── Configs/ ├── Configs/
│ ├── modbus_config.h # скопировать из __modbus_config.h │ ├── modbus_config.h # скопировать из __modbus_config.h
│ ├── modbus_data.h # скопировать из __modbus_data.h │ ├── modbus_data.h # скопировать из __modbus_data.h
│ └── modbus_data.c # скопировать из __modbus_data.c (опционально) │ └── modbus_data.c # скопировать из __modbus_data.c
└── Modbus/ # Субмодуль └── Modbus/ # Субмодуль
``` ```

View File

@@ -9,16 +9,16 @@
@section Функции и макросы @section Функции и макросы
### Инициализация: ### Инициализация:
- MODBUS_FirstInit() — Инициализация модуля Modbus. - MODBUS_FirstInit() — Инициализация Modbus (подключение UART, TIM)
- MODBUS_Config() — Инициализация модуля Modbus. - MODBUS_Config() — Конфигурацмя Modbus (ID, Timeout).
- MODBUS_SlaveStart() — Запуск Modbus как Slave. - MODBUS_SlaveStart() — Запуск Modbus как Slave.
### Функции для Modbus ### Функции для Modbus
- MB_Slave_Response() - MB_Slave_Response() — Ответ на запрос
- MB_Slave_Collect_Message() - MB_Slave_Collect_Message()Сбор сообщения в режиме слейва.
- MB_Slave_Parse_Message() - MB_Slave_Parse_Message() — Парс сообщения в режиме слейва.
- MB_Master_Collect_Message() - MB_Master_Collect_Message()Сбор сообщения в режиме мастера
- MB_Master_Parse_Message() - MB_Master_Parse_Message() — Парс сообщения в режиме мастера
### Функции для работы с RS (UART): ### Функции для работы с RS (UART):
- RS_Parse_Message() / RS_Collect_Message() — Парсинг и сборка сообщения. - RS_Parse_Message() / RS_Collect_Message() — Парсинг и сборка сообщения.
@@ -50,7 +50,6 @@ HAL_StatusTypeDef MODBUS_FirstInit(RS_HandleTypeDef *hmodbus, UART_HandleTypeDef
return HAL_ERROR; return HAL_ERROR;
} }
MB_DeviceInentificationInit(); MB_DeviceInentificationInit();
MB_DiagnosticsInit();
//-----------SETUP MODBUS------------- //-----------SETUP MODBUS-------------
// set up modbus: MB_RX_Size_NotConst and Timeout enable // set up modbus: MB_RX_Size_NotConst and Timeout enable
hmodbus->ID = MODBUS_DEVICE_ID; hmodbus->ID = MODBUS_DEVICE_ID;
@@ -116,6 +115,9 @@ HAL_StatusTypeDef MODBUS_SlaveStart(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *mo
{ {
return HAL_ERROR; return HAL_ERROR;
} }
MB_DiagnosticsInit();
if(modbus_msg) if(modbus_msg)
hmodbus->RS_STATUS = RS_Receive_IT(hmodbus, modbus_msg); hmodbus->RS_STATUS = RS_Receive_IT(hmodbus, modbus_msg);
else else
@@ -228,7 +230,6 @@ static RS_StatusTypeDef MB_Slave_Response(RS_HandleTypeDef *hmodbus, RS_MsgTypeD
/* unknown func code */ /* unknown func code */
default: default:
modbus_msg->Except_Code = 0x01; /* set exception code: illegal function */ modbus_msg->Except_Code = 0x01; /* set exception code: illegal function */
MB_Diagnostics_SlaveNAKCnt();
} }
@@ -545,15 +546,6 @@ static RS_StatusTypeDef MB_Slave_Parse_Message(RS_HandleTypeDef *hmodbus, RS_Msg
TrackerCnt_Err(hmodbus->rs_err); TrackerCnt_Err(hmodbus->rs_err);
modbus_msg->Func_Code |= ERR_VALUES_START; 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; i<ind;i++)
check_empty_buff += modbus_uart_buff[i];
// if(check_empty_buff == 0)
// hmodbus->MB_RESPONSE = MB_EMPTY_MSG; //
return RS_OK; return RS_OK;
} }

View File

@@ -15,7 +15,7 @@
#ifdef MODBUS_ENABLE_COILS #ifdef MODBUS_ENABLE_COILS
/** /**
* @brief Set or Reset Coil at its global address. * @brief Выставить/сбросить коил по глобальному адресу.
* @param Addr Адрес коила. * @param Addr Адрес коила.
* @param WriteVal Что записать в коил: 0 или 1. * @param WriteVal Что записать в коил: 0 или 1.
* @return ExceptionCode Код исключения если коила по адресу не существует, и NO_ERRORS если все ок. * @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 Addr Адрес коила.
* @param Exception Указатель на переменную для кода исключения, в случа неудачи при чтении. * @param Exception Указатель на переменную для кода исключения, в случа неудачи при чтении.
* @return uint16_t Возвращает весь регистр с маской на запрошенном коиле. * @return uint16_t Возвращает весь регистр с маской на запрошенном коиле.
@@ -87,7 +87,7 @@ 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. * @param modbus_msg Указатель на структуру собщения modbus.
* @return fMessageHandled Статус о результате обработки комманды. * @return fMessageHandled Статус о результате обработки комманды.
* @details Обработка команды Read Coils. * @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. * @param modbus_msg Указатель на структуру собщения modbus.
* @return fMessageHandled Статус о результате обработки комманды. * @return fMessageHandled Статус о результате обработки комманды.
* @details Обработка команды Write Single Coils. * @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. * @param modbus_msg Указатель на структуру собщения modbus.
* @return fMessageHandled Статус о результате обработки комманды. * @return fMessageHandled Статус о результате обработки комманды.
* @details Обработка команды Write Multiple Coils. * @details Обработка команды Write Multiple Coils.

View File

@@ -18,11 +18,11 @@
#ifdef MODBUS_ENABLE_DEVICE_IDENTIFICATORS #ifdef MODBUS_ENABLE_DEVICE_IDENTIFICATORS
MB_DeviceIdentificationTypeDef MB_DEVID; ///< Device Identificatino= MB_DeviceIdentificationTypeDef MB_DEVID; ///< Глобальная структура идентификаторов устройства
/** /**
* @brief Write Object of Device Identification to MessageData * @brief Записать Один Объект Идентификатора в массив данных
* @param mbdata Указатель на массив данных в структуре RS_MsgTypeDef. * @param mbdata Указатель на массив данных в структуре RS_MsgTypeDef.
* @return obj Объект для записи. * @return obj Объект для записи.
*/ */
@@ -37,7 +37,7 @@ void MB_WriteSingleObjectToMessage(char *mbdata, unsigned *ind, MB_DeviceObjectT
/** /**
* @brief Write Object of Device Identification to MessageData * @brief Записать Массив Объектов Идентификатора в массив данных
* @param mbdata Указатель на массив данных в структуре RS_MsgTypeDef. * @param mbdata Указатель на массив данных в структуре RS_MsgTypeDef.
* @return obj Объект для записи. * @return obj Объект для записи.
*/ */
@@ -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. * @param modbus_msg Указатель на структуру собщения modbus.
* @return fMessageHandled Статус о результате обработки комманды. * @return fMessageHandled Статус о результате обработки комманды.
* @details Обработка команды Write Single Register. * @details Обработка команды Write Single Register.
@@ -144,8 +144,9 @@ uint8_t MB_Proccess_Read_Device_Identification(RS_MsgTypeDef *modbus_msg)
/**
* @brief Инициализация идентификаторов.
*/
void MB_DeviceInentificationInit(void) void MB_DeviceInentificationInit(void)
{ {
MB_ObjectInit(&MB_DEVID.VendorName, MODBUS_VENDOR_NAME); MB_ObjectInit(&MB_DEVID.VendorName, MODBUS_VENDOR_NAME);

View File

@@ -13,8 +13,8 @@
#include "modbus_diag.h" #include "modbus_diag.h"
#ifdef MODBUS_ENABLE_DIAGNOSTICS #ifdef MODBUS_ENABLE_DIAGNOSTICS
// Глобальная структура диагностики
MB_DiagnosticsInfoTypeDef MB_DIAG = {0}; MB_DiagnosticsInfoTypeDef MB_DIAG = {0}; ///< Глобальная структура диагностики
/** /**
* @brief Инициализация диагностических счетчиков * @brief Инициализация диагностических счетчиков
@@ -23,7 +23,6 @@ void MB_DiagnosticsInit(void)
{ {
MB_DIAG.DiagnosticRegister = 0; MB_DIAG.DiagnosticRegister = 0;
MB_DIAG.DeviceMode = MODBUS_NORMAL_MODE; MB_DIAG.DeviceMode = MODBUS_NORMAL_MODE;
MB_DIAG.AsciiDelimiter = '\n'; // LF по умолчанию
// Инициализация счетчиков // Инициализация счетчиков
MB_DIAG.Counters.BusMessage = 0; 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 * @param modbus_msg Указатель на структуру сообщения modbus
* @return fMessageHandled Статус обработки команды * @return fMessageHandled Статус обработки команды
*/ */

View File

@@ -25,7 +25,7 @@
/** /**
* @brief Proccess command Read Holding Registers (03 - 0x03). * @brief Обработать функцию Read Holding Registers (03 - 0x03).
* @param modbus_msg Указатель на структуру собщения modbus. * @param modbus_msg Указатель на структуру собщения modbus.
* @return fMessageHandled Статус о результате обработки комманды. * @return fMessageHandled Статус о результате обработки комманды.
* @details Обработка команды Read Holding Registers. * @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. * @param modbus_msg Указатель на структуру собщения modbus.
* @return fMessageHandled Статус о результате обработки комманды. * @return fMessageHandled Статус о результате обработки комманды.
* @details Обработка команды Write Single Register. * @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. * @param modbus_msg Указатель на структуру собщения modbus.
* @return fMessageHandled Статус о результате обработки комманды. * @return fMessageHandled Статус о результате обработки комманды.
* @details Обработка команды Write Multiple Registers. * @details Обработка команды Write Multiple Registers.

View File

@@ -15,7 +15,7 @@
#ifdef MODBUS_ENABLE_INPUTS #ifdef MODBUS_ENABLE_INPUTS
/** /**
* @brief Proccess command Read Input Registers (04 - 0x04). * @brief Обработать функцию Read Input Registers (04 - 0x04).
* @param modbus_msg Указатель на структуру собщения modbus. * @param modbus_msg Указатель на структуру собщения modbus.
* @return fMessageHandled Статус о результате обработки комманды. * @return fMessageHandled Статус о результате обработки комманды.
* @details Обработка команды Read Input Registers. * @details Обработка команды Read Input Registers.

View File

@@ -35,7 +35,7 @@ extern void RS_TIM_DeInit(TIM_HandleTypeDef *htim);
//------------------------------------------------------------------- //-------------------------------------------------------------------
//-------------------------GENERAL FUNCTIONS------------------------- //-------------------------GENERAL FUNCTIONS-------------------------
/** /**
* @brief Start receive IT. * @brief Начать прием по прерываниям.
* @param hRS Указатель на хендлер RS. * @param hRS Указатель на хендлер RS.
* @param RS_msg Указатель на структуру сообщения. * @param RS_msg Указатель на структуру сообщения.
* @return RS_RES Статус о состоянии RS после инициализации приема. * @return RS_RES Статус о состоянии 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 hRS Указатель на хендлер RS.
* @param RS_msg Указатель на структуру сообщения. * @param RS_msg Указатель на структуру сообщения.
* @return RS_RES Статус о состоянии RS после инициализации передачи. * @return RS_RES Статус о состоянии RS после инициализации передачи.
@@ -112,7 +112,6 @@ RS_StatusTypeDef RS_Transmit_IT(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg)
//----------INITIALIZE TRANSMIT------------- //----------INITIALIZE TRANSMIT-------------
RS_EnableTransmit(); RS_EnableTransmit();
// for(int i = 0; i < hRS->sRS_Timeout; i++);
RS_Set_Busy(hRS); // set RS busy RS_Set_Busy(hRS); // set RS busy
RS_Set_TX_Flags(hRS); // initialize flags for transmit IT 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 hRS Указатель на хендлер RS.
* @param suart Указатель на структуру с настройками UART. * @param suart Указатель на структуру с настройками UART.
* @param stim Указатель на структуру с настройками таймера. * @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 hRS Указатель на хендлер RS.
* @param AbortMode Выбор, что надо отменить. * @param AbortMode Выбор, что надо отменить.
- ABORT_TX: Отмена передачи по ЮАРТ, с очищением флагов TX, - ABORT_TX: Отмена передачи по ЮАРТ, с очищением флагов TX,
@@ -238,7 +237,7 @@ RS_StatusTypeDef RS_Abort(RS_HandleTypeDef *hRS, RS_AbortTypeDef AbortMode)
//------------------------------------------------------------------- //-------------------------------------------------------------------
//--------------------CALLBACK/HANDLER FUNCTIONS--------------------- //--------------------CALLBACK/HANDLER FUNCTIONS---------------------
/** /**
* @brief Handle for starting receive. * @brief Обработчик для начала приема.
* @param hRS Указатель на хендлер RS. * @param hRS Указатель на хендлер RS.
* @param RS_msg Указатель на структуру сообщения. * @param RS_msg Указатель на структуру сообщения.
* @return RS_RES Статус о состоянии RS после инициализации приема или окончания общения. * @return RS_RES Статус о состоянии RS после инициализации приема или окончания общения.
@@ -264,7 +263,7 @@ RS_StatusTypeDef RS_Handle_Receive_Start(RS_HandleTypeDef *hRS, RS_MsgTypeDef *R
return RS_RES; return RS_RES;
} }
/** /**
* @brief Handle for starting transmit. * @brief Обработчик для начала передачи.
* @param hRS Указатель на хендлер RS. * @param hRS Указатель на хендлер RS.
* @param RS_msg Указатель на структуру сообщения. * @param RS_msg Указатель на структуру сообщения.
* @return RS_RES Статус о состоянии RS после инициализации передачи. * @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. * @param hRS Указатель на хендлер RS.
* @return RS_RES Статус о состоянии RS после обработки приема. * @return RS_RES Статус о состоянии RS после обработки приема.
* @note Определяет поведение RS после передачи сообщения. * @note Определяет поведение RS после передачи сообщения.
@@ -307,24 +306,18 @@ RS_StatusTypeDef RS_UART_TxCpltCallback(RS_HandleTypeDef *hRS)
//--------------ENDING TRANSMITTING------------- //--------------ENDING TRANSMITTING-------------
RS_Set_TX_End(hRS); RS_Set_TX_End(hRS);
RS_EnableReceive();
// for(int i = 0; i < hRS->sRS_Timeout; i++);
//-----------START RECEIVING or END RS---------- //-----------START RECEIVING or END RS----------
RS_RES = RS_Handle_Receive_Start(hRS, hRS->pMessagePtr); RS_RES = RS_Handle_Receive_Start(hRS, hRS->pMessagePtr);
// if(RS_RES != RS_OK)
// {
// __NOP();
// }
return RS_RES; return RS_RES;
} }
/** /**
* @brief Handler for UART. * @brief Обработчик прерывания UART.
* @param hRS Указатель на хендлер RS. * @param hRS Указатель на хендлер RS.
* @note Обрабатывает ошибки если есть и вызывает RS Коллбеки. * @note Обрабатывает ошибки если есть и вызывает RS Коллбеки.
* Добавить вызов этой функции в UARTx_IRQHandler() после HAL_UART_IRQHandler(). * Добавить вызов этой функции в UARTx_IRQHandler() ВМЕСТО HAL_UART_IRQHandler().
*/ */
void RS_UART_Handler(RS_HandleTypeDef *hRS) void RS_UART_Handler(RS_HandleTypeDef *hRS)
{ {
@@ -431,10 +424,10 @@ void RS_UART_Handler(RS_HandleTypeDef *hRS)
/** /**
* @brief Handler for TIM. * @brief Обработчик прерывания TIM.
* @param hRS Указатель на хендлер RS. * @param hRS Указатель на хендлер RS.
* @note Попадание сюда = таймаут и перезапуск RS приема * @note Попадание сюда = таймаут и перезапуск RS приема
* Добавить вызов этой функции в TIMx_IRQHandler() после HAL_TIM_IRQHandler(). * Добавить вызов этой функции в TIMx_IRQHandler() ВМЕСТО HAL_TIM_IRQHandler().
*/ */
void RS_TIM_Handler(RS_HandleTypeDef *hRS) void RS_TIM_Handler(RS_HandleTypeDef *hRS)
{ {
@@ -472,7 +465,7 @@ __weak RS_StatusTypeDef RS_Response(RS_HandleTypeDef *hRS, RS_MsgTypeDef *RS_msg
} }
/** /**
* @brief Собрать сообщение в буфер UART. * @brief Пользовательская функция для сбора сообщения в буфер UART.
* @param hRS Указатель на хендлер RS. * @param hRS Указатель на хендлер RS.
* @param RS_msg Указатель на структуру сообщения. * @param RS_msg Указатель на структуру сообщения.
* @param msg_uart_buff Указатель на буффер UART. * @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 hRS Указатель на хендлер RS.
* @param RS_msg Указатель на структуру сообщения. * @param RS_msg Указатель на структуру сообщения.
* @param msg_uart_buff Указатель на буффер UART. * @param msg_uart_buff Указатель на буффер UART.