0.2.2 doxygen update
This commit is contained in:
20
Inc/modbus.h
20
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:
|
||||
- Инициализировать хендл мобдас. По умолчанию глобально создается hmodbus1
|
||||
- После для запуска Modbus:
|
||||
@verbatim
|
||||
//----------------Прием модбас----------------//
|
||||
#include "modbus.h"
|
||||
|
||||
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"
|
||||
|
||||
@@ -42,13 +42,14 @@ typedef enum
|
||||
//--------------------------------------------------
|
||||
|
||||
/**
|
||||
* @brief Macros to set pointer to a certain register that contains certain coil
|
||||
* @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
|
||||
* @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)) - сдвинуть бит на место запрашиваемого коила в регистре
|
||||
|
||||
Визуальный пример: 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
|
||||
|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
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
|
||||
#include "modbus_config.h"
|
||||
#include "modbus_data.h"
|
||||
#include "__crc_algs.h"
|
||||
|
||||
/**
|
||||
* @addtogroup MODBUS_MESSAGE_DEFINES Modbus Message Tools
|
||||
|
||||
@@ -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
|
||||
* @}
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
34
README.md
34
README.md
@@ -4,21 +4,21 @@
|
||||
|
||||
## Структура библиотеки
|
||||
|
||||
*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/ Иерархия:
|
||||
│ 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 # Функции доступа к данным
|
||||
@@ -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/ # Субмодуль
|
||||
```
|
||||
|
||||
|
||||
28
Src/modbus.c
28
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();
|
||||
}
|
||||
|
||||
|
||||
@@ -545,15 +546,6 @@ static RS_StatusTypeDef MB_Slave_Parse_Message(RS_HandleTypeDef *hmodbus, RS_Msg
|
||||
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; i<ind;i++)
|
||||
check_empty_buff += modbus_uart_buff[i];
|
||||
// if(check_empty_buff == 0)
|
||||
// hmodbus->MB_RESPONSE = MB_EMPTY_MSG; //
|
||||
|
||||
|
||||
return RS_OK;
|
||||
}
|
||||
|
||||
@@ -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 Возвращает весь регистр с маской на запрошенном коиле.
|
||||
@@ -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.
|
||||
* @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.
|
||||
|
||||
@@ -18,11 +18,11 @@
|
||||
|
||||
#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.
|
||||
* @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.
|
||||
* @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.
|
||||
* @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);
|
||||
|
||||
@@ -13,8 +13,8 @@
|
||||
#include "modbus_diag.h"
|
||||
|
||||
#ifdef MODBUS_ENABLE_DIAGNOSTICS
|
||||
// Глобальная структура диагностики
|
||||
MB_DiagnosticsInfoTypeDef MB_DIAG = {0};
|
||||
|
||||
MB_DiagnosticsInfoTypeDef MB_DIAG = {0}; ///< Глобальная структура диагностики
|
||||
|
||||
/**
|
||||
* @brief Инициализация диагностических счетчиков
|
||||
@@ -23,7 +23,6 @@ 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 Статус обработки команды
|
||||
*/
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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 после инициализации приема.
|
||||
@@ -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)
|
||||
{
|
||||
@@ -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)
|
||||
{
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user