release 0.3.1
doxygen + refactoring
This commit is contained in:
@@ -14,7 +14,7 @@
|
||||
Подключает все необходимые модули:
|
||||
|
||||
|
||||
@section Инструкция по подключению
|
||||
@section init Инструкция по подключению
|
||||
Для корректной работы надо:
|
||||
- Подключить обработчики RS_UART_Handler(), RS_TIM_Handler(), в соответствубщие
|
||||
низкоуровневые прерывания UART_IRQHandler, TIM_IRQHandler вместо HAL'овского обработчика
|
||||
@@ -48,7 +48,7 @@
|
||||
@endverbatim
|
||||
|
||||
|
||||
@section Подключаемые модули:
|
||||
@section Подключаемые модули:
|
||||
- rs_message.h - работа с uart
|
||||
- modbus_core.h - базовые определения
|
||||
- modbus_coils.h - работа с дискретными выходами
|
||||
@@ -58,7 +58,7 @@
|
||||
- modbus_diag.h - диагностика modbus
|
||||
|
||||
|
||||
@section Структура данных Modbus
|
||||
@section Структура данных Modbus
|
||||
|
||||
#### Holding/Input Registers:
|
||||
- Регистры — 16-битные слова. Доступ к регистрам осуществляется через указатель.
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
******************************************************************************
|
||||
@addtogroup MODBUS_COILS Coils Tools
|
||||
@ingroup MODBUS_INTERNAL
|
||||
@{
|
||||
******************************************************************************
|
||||
* @details
|
||||
Модуль предоставляет функции и макросы для работы с битовыми данными:
|
||||
@@ -14,11 +13,11 @@
|
||||
- Запись множественных coils (0x0F) - распаковка байтов в биты
|
||||
- Макросы для локального доступа к coils
|
||||
|
||||
@section Организация битовых данных:
|
||||
@section Организация битовых данных:
|
||||
Coils упакованы в 16-битные слова для эффективного использования памяти.
|
||||
Биты нумеруются от младшего к старшему внутри каждого слова.
|
||||
|
||||
@section Адресация:
|
||||
@section Адресация:
|
||||
- Глобальная - абсолютный адрес в пространстве Modbus
|
||||
- Локальная - относительный адрес внутри массива coils
|
||||
- Макросы автоматически вычисляют смещения и маски
|
||||
@@ -31,16 +30,15 @@ Coils упакованы в 16-битные слова для эффективн
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
////////////////////---MODBUS FUNCTION DEFINES---////////////////////
|
||||
|
||||
/** @brief Structure for coils operation */
|
||||
typedef enum
|
||||
{
|
||||
SET_COIL,
|
||||
RESET_COIL,
|
||||
TOOGLE_COIL,
|
||||
}MB_CoilsOpTypeDef;
|
||||
|
||||
|
||||
//--------------------------------------------------
|
||||
|
||||
/**
|
||||
* @addtogroup MODBUS_COILS
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* @brief Макрос для установки указателя на регистр, содержащий запрашиваемый коил
|
||||
* @param _parr_ - массив коилов.
|
||||
@@ -77,17 +75,14 @@ typedef enum
|
||||
*/
|
||||
#define MB_Set_Coil_Mask(_coil_) (1 << ( _coil_ - (16*((_coil_)/16)) ))
|
||||
|
||||
/** MODBUS_COILS
|
||||
* @}
|
||||
*/
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
/////////////////////////---FUNCTIONS---/////////////////////////////
|
||||
|
||||
/**
|
||||
* @addtogroup MODBUS_DATA_ACCESS_FUNCTIONS API for Data Access
|
||||
* @ingroup MODBUS_FUNCTIONS
|
||||
* @brief Функции для доступа к данным модбас
|
||||
@{
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @addtogroup MODBUS_REQ_COILS_API API for Coils
|
||||
@@ -98,7 +93,7 @@ typedef enum
|
||||
* @code
|
||||
* // Пример: Запросили 10 coils с адреса 20, хотим узнать состояние coil 25
|
||||
* int coil_state;
|
||||
* if(MB_GetCoilState(&MODBUS_MSG, 25, &coil_state))
|
||||
* if(MB_RespGet_CoilState(&MODBUS_MSG, 25, &coil_state))
|
||||
* {
|
||||
* printf("Coil 25 state: %s\n", coil_state ? "ON" : "OFF");
|
||||
* }
|
||||
@@ -107,15 +102,16 @@ typedef enum
|
||||
* for(int addr = MODBUS_MSG.Addr; addr < MODBUS_MSG.Addr + MODBUS_MSG.Qnt; addr++)
|
||||
* {
|
||||
* int state;
|
||||
* if(MB_GetCoilState(&MODBUS_MSG, addr, &state))
|
||||
* if(MB_RespGet_CoilState(&MODBUS_MSG, addr, &state))
|
||||
* {
|
||||
* printf("Coil %d: %s\n", addr, state ? "ON" : "OFF");
|
||||
* }
|
||||
* }
|
||||
* @endcode
|
||||
* @{
|
||||
*/
|
||||
|
||||
int MB_GetCoilState(RS_MsgTypeDef *modbus_msg, uint16_t coil_addr, int *coil_state);
|
||||
int MB_RespGet_CoilState(RS_MsgTypeDef *modbus_msg, uint16_t coil_addr, int *coil_state);
|
||||
|
||||
/** MODBUS_REQ_COILS_API
|
||||
* @}
|
||||
@@ -123,6 +119,22 @@ int MB_GetCoilState(RS_MsgTypeDef *modbus_msg, uint16_t coil_addr, int *coil_sta
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @addtogroup MODBUS_DATA_ACCESS_FUNCTIONS API for Data Access
|
||||
* @ingroup MODBUS_FUNCTIONS
|
||||
* @brief Функции для доступа к данным модбас
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** @brief Structure for coils operation */
|
||||
typedef enum
|
||||
{
|
||||
SET_COIL,
|
||||
RESET_COIL,
|
||||
TOOGLE_COIL,
|
||||
}MB_CoilsOpTypeDef;
|
||||
|
||||
/**
|
||||
* @brief Считать коил по локальному адресу.
|
||||
* @param _parr_ - массив коилов.
|
||||
@@ -131,7 +143,7 @@ int MB_GetCoilState(RS_MsgTypeDef *modbus_msg, uint16_t coil_addr, int *coil_sta
|
||||
*
|
||||
* @details Позволяет обратиться к коилу по адресу относительно _arr_.
|
||||
*/
|
||||
#define MB_Read_Coil_Local(_parr_, _coil_) (( *MB_Set_Coil_Reg_Ptr(_parr_, _coil_) & MB_Set_Coil_Mask(_coil_) ) >> (_coil_))
|
||||
#define MB_Coil_Read_Local(_parr_, _coil_) (( *MB_Set_Coil_Reg_Ptr(_parr_, _coil_) & MB_Set_Coil_Mask(_coil_) ) >> (_coil_))
|
||||
/**
|
||||
* @brief Выставить коил по локальному адресу.
|
||||
* @param _parr_ Указатель на массив коилов.
|
||||
@@ -139,7 +151,7 @@ int MB_GetCoilState(RS_MsgTypeDef *modbus_msg, uint16_t coil_addr, int *coil_sta
|
||||
*
|
||||
* @details Позволяет обратиться к коилу по адресу относительно _arr_.
|
||||
*/
|
||||
#define MB_Set_Coil_Local(_parr_, _coil_) *MB_Set_Coil_Reg_Ptr(_parr_, _coil_) |= MB_Set_Coil_Mask(_coil_)
|
||||
#define MB_Coil_Set_Local(_parr_, _coil_) *MB_Set_Coil_Reg_Ptr(_parr_, _coil_) |= MB_Set_Coil_Mask(_coil_)
|
||||
/**
|
||||
* @brief Сбросить коил по локальному адресу.
|
||||
* @param _parr_ Указатель на массив коилов.
|
||||
@@ -147,7 +159,7 @@ int MB_GetCoilState(RS_MsgTypeDef *modbus_msg, uint16_t coil_addr, int *coil_sta
|
||||
*
|
||||
* @details Позволяет обратиться к коилу по адресу относительно _arr_.
|
||||
*/
|
||||
#define MB_Reset_Coil_Local(_parr_, _coil_) *MB_Set_Coil_Reg_Ptr(_parr_, _coil_) &= ~(MB_Set_Coil_Mask(_coil_))
|
||||
#define MB_Coil_Reset_Local(_parr_, _coil_) *MB_Set_Coil_Reg_Ptr(_parr_, _coil_) &= ~(MB_Set_Coil_Mask(_coil_))
|
||||
/**
|
||||
* @brief Переключить состояние коила по локальному адресу.
|
||||
* @param _parr_ Указатель на массив коилов.
|
||||
@@ -155,12 +167,12 @@ int MB_GetCoilState(RS_MsgTypeDef *modbus_msg, uint16_t coil_addr, int *coil_sta
|
||||
*
|
||||
* @details Позволяет обратиться к коилу по адресу относительно _arr_.
|
||||
*/
|
||||
#define MB_Toogle_Coil_Local(_parr_, _coil_) *MB_Set_Coil_Reg_Ptr(_parr_, _coil_) ^= MB_Set_Coil_Mask(_coil_)
|
||||
#define MB_Coil_Toogle_Local(_parr_, _coil_) *MB_Set_Coil_Reg_Ptr(_parr_, _coil_) ^= MB_Set_Coil_Mask(_coil_)
|
||||
|
||||
/* Выставить/сбросить коил по глобальному адресу */
|
||||
MB_ExceptionTypeDef MB_Write_Coil_Global(uint16_t Addr, MB_CoilsOpTypeDef WriteVal);
|
||||
MB_ExceptionTypeDef MB_Coil_Write_Global(uint16_t Addr, MB_CoilsOpTypeDef WriteVal);
|
||||
/* Считать коил по глобальному адресу */
|
||||
uint16_t MB_Read_Coil_Global(uint16_t Addr, MB_ExceptionTypeDef *Exception);
|
||||
uint16_t MB_Coil_Read_Global(uint16_t Addr, MB_ExceptionTypeDef *Exception);
|
||||
|
||||
/** MODBUS_DATA_ACCESS_FUNCTIONS
|
||||
* @}
|
||||
@@ -176,7 +188,7 @@ uint8_t MB_Process_Read_Coils(RS_MsgTypeDef *modbus_msg);
|
||||
/* Обработать функцию Write Single Coils (05 - 0x05) */
|
||||
uint8_t MB_Process_Write_Single_Coil(RS_MsgTypeDef *modbus_msg);
|
||||
/* Обработать функцию Write Multiple Coils (15 - 0x0F) */
|
||||
uint8_t MB_Write_Miltuple_Coils(RS_MsgTypeDef *modbus_msg);
|
||||
uint8_t MB_Process_Write_Miltuple_Coils(RS_MsgTypeDef *modbus_msg);
|
||||
|
||||
/** MODBUS_CMD_PROCESS_FUNCTIONS
|
||||
* @}
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
Константы размеров полей
|
||||
Вспомогательные макросы
|
||||
|
||||
@section Структура сообщения:
|
||||
@section Структура сообщения:
|
||||
[ADDR][FUNC][DATA...][CRC]
|
||||
- Адрес: 1 байт
|
||||
- Функция: 1 байт
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
******************************************************************************
|
||||
@addtogroup MODBUS_DEVID Device Identifications Tools
|
||||
@ingroup MODBUS_INTERNAL
|
||||
@{
|
||||
******************************************************************************
|
||||
* @details
|
||||
Модуль реализации функции Read Device Identifications (0x2B):
|
||||
@@ -13,7 +12,7 @@
|
||||
- Расширенная идентификация (URL, Model, User fields)
|
||||
- Поддержка потоковой передачи больших объектов
|
||||
|
||||
@section Объекты идентификации:
|
||||
@section Объекты идентификации:
|
||||
- VendorName, ProductCode, Revision - обязательные
|
||||
- VendorUrl, ProductName, ModelName - опциональные
|
||||
- User objects - пользовательские поля
|
||||
@@ -27,6 +26,11 @@
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
///////////////---DEVICE IDENTIVICATIONS DEFINES---//////////////////
|
||||
|
||||
/**
|
||||
* @addtogroup MODBUS_DEVID
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** @brief Структура для объекта (идентификатора устройства модбас) */
|
||||
typedef struct
|
||||
{
|
||||
@@ -61,15 +65,20 @@ void MB_DeviceInentificationInit(void);
|
||||
* @brief Инициализация объектов
|
||||
* @details С помозью этого дефайна инициализируются объекты в @ref MB_DeviceInentificationInit
|
||||
*/
|
||||
#define MB_ObjectInit(_p_obj_, _userstring_) (_p_obj_)->length = sizeof(_userstring_);\
|
||||
(_p_obj_)->name = _userstring_;
|
||||
/**
|
||||
#define MB_ObjectInit(_p_obj_, _userstring_) \
|
||||
(_p_obj_)->length = sizeof(_userstring_);\
|
||||
(_p_obj_)->name = _userstring_;
|
||||
/**
|
||||
* @brief Инициализация пользовательских объектов
|
||||
* @details С помозью этого дефайна инициализируются пользовательские объекты в MB_DeviceInentificationInit
|
||||
*/
|
||||
#define MB_UserObjectInit(_pinfostruct_, _user_numb_) MB_ObjectInit(&(_pinfostruct_)->User[_user_numb_], MODBUS_USEROBJECT##_user_numb_##_NAME)
|
||||
|
||||
|
||||
|
||||
/** MODBUS_DEVID
|
||||
* @}
|
||||
*/
|
||||
////////////////////---MODBUS MESSAGE DEFINES---/////////////////////
|
||||
|
||||
|
||||
@@ -80,14 +89,14 @@ void MB_DeviceInentificationInit(void);
|
||||
/**
|
||||
* @addtogroup MODBUS_REQ_DEFID_API API for Device Identifications
|
||||
* @ingroup MODBUS_REQUEST_MSG
|
||||
* @brief Макросы для чтения идентификторов из ответа в режиме мастер
|
||||
* @brief API для чтения идентификторов из ответа в режиме мастер
|
||||
* @details Примеры использования:
|
||||
*
|
||||
* @code
|
||||
* // Пример 1: Получить VendorName (ID = 0x00)
|
||||
* uint8_t length;
|
||||
* char vendor_name[64];
|
||||
* if(MB_FindObjectById(&MODBUS_MSG, 0x00, vendor_name, &length))
|
||||
* if(MB_RespGet_ObjectById(&MODBUS_MSG, 0x00, vendor_name, &length))
|
||||
* {
|
||||
* // получено
|
||||
* }
|
||||
@@ -96,25 +105,26 @@ void MB_DeviceInentificationInit(void);
|
||||
* uint8_t obj_id, obj_length;
|
||||
* char obj_data[256];
|
||||
*
|
||||
* int obj_count = MB_GetNumberOfObjects(&MODBUS_MSG);
|
||||
* int obj_count = MB_RespGet_NumberOfObjects(&MODBUS_MSG);
|
||||
* printf("Total objects: %d\n", obj_count);
|
||||
*
|
||||
* for(int i = 0; i < obj_count; i++)
|
||||
* {
|
||||
* if(MB_GetObjectByIndex(&MODBUS_MSG, i, &obj_id, obj_data, &obj_length))
|
||||
* if(MB_RespGet_ObjectByIndex(&MODBUS_MSG, i, &obj_id, obj_data, &obj_length))
|
||||
* {
|
||||
* // получено
|
||||
* }
|
||||
* }
|
||||
* @endcode
|
||||
* @{
|
||||
*/
|
||||
|
||||
/* Получить количество объектов в сообщении */
|
||||
int MB_GetNumberOfObjects(RS_MsgTypeDef *modbus_msg);
|
||||
int MB_RespGet_NumberOfObjects(RS_MsgTypeDef *modbus_msg);
|
||||
/* Найти объект по ID в сообщении */
|
||||
int MB_FindObjectById(RS_MsgTypeDef *modbus_msg, uint8_t obj_id, char *obj_data, uint8_t *obj_length);
|
||||
int MB_RespGet_ObjectById(RS_MsgTypeDef *modbus_msg, uint8_t obj_id, char *obj_data, uint8_t *obj_length);
|
||||
/* Получить объект по индексу в сообщении */
|
||||
int MB_GetObjectByIndex(RS_MsgTypeDef *modbus_msg, int index, uint8_t *obj_id, char *obj_data, uint8_t *obj_length);
|
||||
int MB_RespGet_ObjectByIndex(RS_MsgTypeDef *modbus_msg, int index, uint8_t *obj_id, char *obj_data, uint8_t *obj_length);
|
||||
|
||||
|
||||
/** MODBUS_REQ_DEFID_API
|
||||
@@ -122,12 +132,19 @@ int MB_GetObjectByIndex(RS_MsgTypeDef *modbus_msg, int index, uint8_t *obj_id, c
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* @addtogroup MODBUS_DEVID
|
||||
* @{
|
||||
*/
|
||||
|
||||
/* Записать Один Объект Идентификатора в массив данных */
|
||||
void MB_WriteSingleObjectToMessage(char *mbdata, unsigned *ind, MB_DeviceObjectTypeDef *obj);
|
||||
/* Записать Массив Объектов Идентификатора в массив данных */
|
||||
void MB_WriteObjectsToMessage(RS_MsgTypeDef *modbus_msg, unsigned maxidofobj);
|
||||
|
||||
/** MODBUS_DEVID
|
||||
* @}
|
||||
*/
|
||||
//---------PROCESS MODBUS COMMAND FUNCTIONS---------
|
||||
/**
|
||||
* @addtogroup MODBUS_CMD_PROCESS_FUNCTIONS
|
||||
@@ -142,7 +159,3 @@ uint8_t MB_Process_Read_Device_Identifications(RS_MsgTypeDef *modbus_msg);
|
||||
/////////////////////////---FUNCTIONS---/////////////////////////////
|
||||
|
||||
#endif //__MODBUS_DEVID_H_
|
||||
|
||||
/** MODBUS_DEVID
|
||||
* @}
|
||||
*/
|
||||
@@ -5,7 +5,6 @@
|
||||
******************************************************************************
|
||||
@addtogroup MODBUS_DIAG Diagnostics Tools
|
||||
@ingroup MODBUS_INTERNAL
|
||||
@{
|
||||
******************************************************************************
|
||||
* @details
|
||||
Модуль реализации Diagnostics (Serial Line only) (0x08):
|
||||
@@ -13,7 +12,7 @@
|
||||
- Возможность выставить/сбросить любой бит в диагностическом регистре
|
||||
- Сбор статистики работы устройства
|
||||
- Управление режимами работы
|
||||
******************************************************************************/
|
||||
****************************************** ************************************/
|
||||
#ifndef __MODBUS_DIAG_H_
|
||||
#define __MODBUS_DIAG_H_
|
||||
#include "modbus_core.h"
|
||||
@@ -21,6 +20,11 @@
|
||||
/////////////////////////////////////////////////////////////////////
|
||||
/////////////////---DEVICE DIAGNOSTICS DEFINES---////////////////////
|
||||
|
||||
/**
|
||||
* @addtogroup MODBUS_DIAG
|
||||
* @{
|
||||
*/
|
||||
|
||||
/** @brief Режимы работы устройства */
|
||||
typedef enum
|
||||
{
|
||||
@@ -57,6 +61,10 @@ extern MB_DiagnosticsInfoTypeDef MB_DIAG;
|
||||
/* Инициализация диагностических счетчиков */
|
||||
void MB_DiagnosticsInit(void);
|
||||
|
||||
/** MODBUS_DIAG
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup MODBUS_REQ_DIAG_API API for Diagnostics
|
||||
* @ingroup MODBUS_REQUEST_MSG
|
||||
@@ -64,17 +72,20 @@ void MB_DiagnosticsInit(void);
|
||||
* @details Примеры использования:
|
||||
*
|
||||
* @code
|
||||
* Получить данные диагностики (значение счетчика)
|
||||
* // Получить данные диагностики (значение счетчика)
|
||||
* uint16_t counter_value;
|
||||
* if(MB_GetDiagnosticResponse(&MODBUS_MSG, &counter_value))
|
||||
* if(MB_RespGet_Diagnostic(&MODBUS_MSG, &counter_value))
|
||||
* {
|
||||
* printf("Counter value: %d\n", counter_value);
|
||||
* }
|
||||
* @endcode
|
||||
* @{
|
||||
*/
|
||||
int MB_GetDiagnosticResponse(RS_MsgTypeDef *modbus_msg, uint16_t *data);
|
||||
|
||||
int MB_RespGet_Diagnostic(RS_MsgTypeDef *modbus_msg, uint16_t *data);
|
||||
|
||||
/** MODBUS_REQ_DIAG_API
|
||||
* @}
|
||||
* @}
|
||||
*/
|
||||
|
||||
|
||||
@@ -95,6 +106,17 @@ int MB_Diagnostics_WriteBit(int bit_num, int bit_state);
|
||||
int MB_Diagnostics_GetBit(int bit_num);
|
||||
/* Получение текущего режима устройства */
|
||||
MB_DeviceModeTypeDef MB_GetDeviceMode(void);
|
||||
|
||||
|
||||
/* Функции для обновления счетчиков диагностики */
|
||||
void MB_Diagnostics_BusMessageCnt(void);
|
||||
void MB_Diagnostics_CommunicationErrorCnt(void);
|
||||
void MB_Diagnostics_ExceptionErrorCnt(void);
|
||||
void MB_Diagnostics_CharacterOverrunCnt(void);
|
||||
void MB_Diagnostics_SlaveMessageCnt(void);
|
||||
void MB_Diagnostics_SlaveNoResponseCnt(void);
|
||||
void MB_Diagnostics_SlaveNAKCnt(void);
|
||||
void MB_Diagnostics_SlaveBusyCnt(void);
|
||||
/** MODBUS_CMD_PROCESS_FUNCTIONS
|
||||
* @}
|
||||
*/
|
||||
@@ -113,15 +135,6 @@ uint8_t MB_Process_Diagnostics(RS_MsgTypeDef *modbus_msg);
|
||||
*/
|
||||
|
||||
|
||||
/* Функции для обновления счетчиков диагностики */
|
||||
void MB_Diagnostics_BusMessageCnt(void);
|
||||
void MB_Diagnostics_CommunicationErrorCnt(void);
|
||||
void MB_Diagnostics_ExceptionErrorCnt(void);
|
||||
void MB_Diagnostics_CharacterOverrunCnt(void);
|
||||
void MB_Diagnostics_SlaveMessageCnt(void);
|
||||
void MB_Diagnostics_SlaveNoResponseCnt(void);
|
||||
void MB_Diagnostics_SlaveNAKCnt(void);
|
||||
void MB_Diagnostics_SlaveBusyCnt(void);
|
||||
|
||||
|
||||
/////////////////////////---FUNCTIONS---/////////////////////////////
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
******************************************************************************
|
||||
@addtogroup MODBUS_INS Input Register Tools
|
||||
@ingroup MODBUS_INTERNAL
|
||||
@{
|
||||
******************************************************************************
|
||||
* @details
|
||||
Модуль обработки команд для регистров хранения (Holding Registers):
|
||||
@@ -13,7 +12,7 @@
|
||||
- Запись одиночного регистра (0x06)
|
||||
- Запись множества регистров (0x10)
|
||||
|
||||
@section Регистры хранения:
|
||||
@section Регистры хранения:
|
||||
- Read/Write доступ
|
||||
- 16-битные значения (uint16_t)
|
||||
******************************************************************************/
|
||||
@@ -42,7 +41,3 @@ uint8_t MB_Process_Write_Miltuple_Regs(RS_MsgTypeDef *modbus_msg);
|
||||
/////////////////////////---FUNCTIONS---/////////////////////////////
|
||||
|
||||
#endif //__MODBUS_HOLDREGS_H_
|
||||
|
||||
/** MODBUS_INS
|
||||
* @}
|
||||
*/
|
||||
@@ -5,13 +5,12 @@
|
||||
******************************************************************************
|
||||
@addtogroup MODBUS_HOLD Holding Registers Tools
|
||||
@ingroup MODBUS_INTERNAL
|
||||
@{
|
||||
******************************************************************************
|
||||
* @details
|
||||
Модуль обработки команд для входных регистров (Input Registers):
|
||||
- Чтение множества регистров (0x04)
|
||||
|
||||
@section Входные регистры:
|
||||
@section Входные регистры:
|
||||
- Read-Only доступ
|
||||
- 16-битные значения
|
||||
******************************************************************************/
|
||||
@@ -25,7 +24,7 @@
|
||||
//---------PROCESS MODBUS COMMAND FUNCTIONS---------
|
||||
/**
|
||||
* @addtogroup MODBUS_CMD_PROCESS_FUNCTIONS Internal Process Functions
|
||||
* @ingroup MODBUS_FUNCTIONS
|
||||
* @ingroup MODBUS_INTERNAL
|
||||
* @brief Функции обработки запросов модбас
|
||||
@{
|
||||
*/
|
||||
@@ -38,6 +37,3 @@ uint8_t MB_Process_Read_Input_Regs(RS_MsgTypeDef *modbus_msg);
|
||||
/////////////////////////---FUNCTIONS---/////////////////////////////
|
||||
|
||||
#endif //__MODBUS_INPUTREGS_H_
|
||||
/** MODBUS_HOLD
|
||||
* @}
|
||||
*/
|
||||
@@ -5,7 +5,6 @@
|
||||
******************************************************************************
|
||||
@addtogroup MODBUS_MASTER Modbus master funtions
|
||||
@ingroup MODBUS_CMD_PROCESS_FUNCTIONS
|
||||
@{
|
||||
******************************************************************************
|
||||
* @details
|
||||
Модуль реализации обработки UART сообщение в режиме мастер
|
||||
@@ -24,7 +23,7 @@
|
||||
* @ingroup MODBUS_FUNCTIONS
|
||||
* @brief Макросы для создания запросов в режиме мастер
|
||||
* @details Примеры использования:
|
||||
*
|
||||
* @code
|
||||
* // Чтение 10 holding registers начиная с адреса 0
|
||||
* RS_MsgTypeDef read_msg = MB_REQUEST_READ_HOLDING_REGS(1, 0, 10);
|
||||
*
|
||||
@@ -36,6 +35,8 @@
|
||||
*
|
||||
* // Идентификация устройства
|
||||
* RS_MsgTypeDef dev_id_msg = MB_REQUEST_READ_DEVICE_ID_BASIC(1);
|
||||
* @endcode
|
||||
* @{
|
||||
*/
|
||||
|
||||
//---------КЛАССИЧЕСКИЕ ДАННЫЕ-----------
|
||||
@@ -83,7 +84,7 @@ RS_MsgTypeDef MB_REQUEST_READ_DEVICE_ID_SPECIFIC(uint8_t slave_addr, uint8_t obj
|
||||
* @code
|
||||
* // Пример: Запросили 10 регистров с адреса 100, хотим получить значение регистра 105
|
||||
* uint16_t reg_value;
|
||||
* if(MB_GetRegisterValue(&MODBUS_MSG, 105, ®_value))
|
||||
* if(MB_RespGet_RegisterValue(&MODBUS_MSG, 105, ®_value))
|
||||
* {
|
||||
* printf("Register 105 value: %d\n", reg_value);
|
||||
* }
|
||||
@@ -92,30 +93,34 @@ RS_MsgTypeDef MB_REQUEST_READ_DEVICE_ID_SPECIFIC(uint8_t slave_addr, uint8_t obj
|
||||
* for(int addr = MODBUS_MSG.Addr; addr < MODBUS_MSG.Addr + MODBUS_MSG.Qnt; addr++)
|
||||
* {
|
||||
* uint16_t value;
|
||||
* if(MB_GetRegisterValue(&MODBUS_MSG, addr, &value))
|
||||
* if(MB_RespGet_RegisterValue(&MODBUS_MSG, addr, &value))
|
||||
* {
|
||||
* printf("Register %d: %d\n", addr, value);
|
||||
* }
|
||||
* }
|
||||
* @endcode
|
||||
* @{
|
||||
*/
|
||||
|
||||
int MB_GetRegisterValue(RS_MsgTypeDef *modbus_msg, uint16_t reg_addr, uint16_t *reg_value);
|
||||
int MB_RespGet_RegisterValue(RS_MsgTypeDef *modbus_msg, uint16_t reg_addr, uint16_t *reg_value);
|
||||
|
||||
|
||||
/** MODBUS_REQ_REGS_API
|
||||
* @}
|
||||
*/
|
||||
|
||||
/**
|
||||
* @addtogroup MODBUS_MASTER
|
||||
* @{
|
||||
*/
|
||||
|
||||
/* Сбор сообщения в буфер UART в режиме мастер (фрейм мастера из msg -> uart) */
|
||||
RS_StatusTypeDef MB_Master_Collect_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg, uint8_t *modbus_uart_buff);
|
||||
/* Парс сообщения в режиме мастер (фрейм слейва из uart -> msg) */
|
||||
RS_StatusTypeDef MB_Master_Parse_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg, uint8_t *modbus_uart_buff);
|
||||
|
||||
|
||||
#endif //__MODBUS_MASTER_H_
|
||||
|
||||
/** MODBUS_MASTER
|
||||
* @}
|
||||
*/
|
||||
*/
|
||||
|
||||
#endif //__MODBUS_MASTER_H_
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
******************************************************************************
|
||||
@addtogroup MODBUS_SLAVE Modbus slave funtions
|
||||
@ingroup MODBUS_CMD_PROCESS_FUNCTIONS
|
||||
@{
|
||||
******************************************************************************
|
||||
* @details
|
||||
Модуль реализации обработки UART сообщение в режиме слейв
|
||||
@@ -19,6 +18,10 @@
|
||||
#ifdef MODBUS_ENABLE_SLAVE
|
||||
#define MODBUS_MODE_SLAVE 0
|
||||
#endif
|
||||
/**
|
||||
* @addtogroup MODBUS_SLAVE
|
||||
* @{
|
||||
*/
|
||||
|
||||
/* Ответ на сообщение в режиме слейва */
|
||||
RS_StatusTypeDef MB_Slave_Response(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg);
|
||||
@@ -27,8 +30,7 @@ RS_StatusTypeDef MB_Slave_Collect_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeD
|
||||
/* Парс сообщения в режиме слейв (фрейм мастера из uart -> msg) */
|
||||
RS_StatusTypeDef MB_Slave_Parse_Message(RS_HandleTypeDef *hmodbus, RS_MsgTypeDef *modbus_msg, uint8_t *modbus_uart_buff);
|
||||
|
||||
#endif //__MODBUS_SLAVE_H_
|
||||
|
||||
/** MODBUS_MASTER
|
||||
/** MODBUS_SLAVE
|
||||
* @}
|
||||
*/
|
||||
*/
|
||||
#endif //__MODBUS_SLAVE_H_
|
||||
|
||||
@@ -11,19 +11,19 @@
|
||||
Универсальная библиотека для работы с последовательными протоколами (Modbus, Custom)
|
||||
через UART в режиме прерываний с поддержкой таймаутов.
|
||||
|
||||
@section Основные возможности:
|
||||
@section Основные возможности:
|
||||
- Прием/передача в прерываниях
|
||||
- Обработка IDLE линии для определения конца фрейма
|
||||
- Таймауты приема через TIM
|
||||
- Гибкая настройка размера сообщений
|
||||
|
||||
@section Использование:
|
||||
@section Использование:
|
||||
1. Определить структуру сообщения и размеры буфера
|
||||
2. Реализовать weak-функции обработки сообщений
|
||||
3. Добавить вызовы RS_UART_Handler/RS_TIM_Handler в прерывания
|
||||
4. Инициализировать через RS_Init() и запустить прием RS_Receive_IT()
|
||||
|
||||
@section Особенности:
|
||||
@section Особенности:
|
||||
- Буфер: RS_Buffer[MSG_SIZE_MAX] Общий для приема/передачи
|
||||
- Состояния: отслеживается через флаги в RS_HandleTypeDef
|
||||
- Таймауты: контролируют максимальное время ожидания фрейма
|
||||
|
||||
Reference in New Issue
Block a user