Modbus 0.3
Библиотека Modbus для STM
Loading...
Searching...
No Matches
E:/.WORK/STM32/Diod_Test/diode_tester/Core/Modbus/__modbus_data.c
1/**
2******************************************************************************
3* @file modbus_data.c
4* @brief Функции доступа к данным Modbus
5******************************************************************************
6* @details
7Модуль реализует функции валидации адресов и доступа к данным:
8- Проверка корректности запрашиваемых адресов
9- Определение указателей на реальные данные в памяти
10- Поддержка пользовательских массивов регистров и coils
11
12@section Валидация адресов:
13- MB_Check_Address_For_Arr() - проверка принадлежности адреса массиву
14- MB_DefineRegistersAddress() - получение указателя на регистры
15- MB_DefineCoilsAddress() - получение указателя на coils
16
17******************************************************************************/
18
19#include "modbus_core.h"
20#include "modbus_coils.h"
21#include "modbus_holdregs.h"
22#include "modbus_inputregs.h"
23#include "modbus_devid.h"
24
25
26/**
27 * @brief Check is address valid for certain array.
28 * @param Addr Начальный адресс.
29 * @param Qnt Количество запрашиваемых элементов.
30 * @param R_ARR_ADDR Начальный адресс массива R_ARR.
31 * @param R_ARR_NUMB Количество элементов в массиве R_ARR.
32 * @return ExceptionCode - ET_ILLEGAL_DATA_ADRESS если адресс недействителен, и ET_NO_ERRORS если все ок.
33 *
34 * @details Позволяет определить, принадлежит ли адресс Addr массиву R_ARR:
35 * Если адресс Addr находится в диапазоне адрессов массива R_ARR, то возвращаем NO_ERROR.
36 * Если адресс Addr находится за пределами адрессов массива R_ARR - ET_ILLEGAL_DATA_ADDRESSю.
37 */
38MB_ExceptionTypeDef MB_Check_Address_For_Arr(uint16_t Addr, uint16_t Qnt, uint16_t R_ARR_ADDR, uint16_t R_ARR_NUMB)
39{
40 // if address from this array
41 if(Addr >= R_ARR_ADDR)
42 {
43 // if quantity too big return error
44 if ((Addr - R_ARR_ADDR) + Qnt > R_ARR_NUMB)
45 {
46 return ET_ILLEGAL_DATA_ADDRESS; // return exception code
47 }
48 // if all ok - return no errors
49 return ET_NO_ERRORS;
50 }
51 // if address isnt from this array return error
52 else
53 return ET_ILLEGAL_DATA_ADDRESS; // return exception code
54}
55/**
56 * @brief Define Address Origin for Input/Holding Registers
57 * @param pRegs Указатель на указатель регистров.
58 * @param Addr Адрес начального регистра.
59 * @param Qnt Количество запрашиваемых регистров.
60 * @param WriteFlag Флаг регистр нужны для чтения или записи.
61 * @return ExceptionCode Код исключения если есть, и ET_NO_ERRORS если нет.
62 *
63 * @details Определение адреса начального регистра.
64 * @note WriteFlag пока не используется.
65 */
66MB_ExceptionTypeDef MB_DefineRegistersAddress(uint16_t **pRegs, uint16_t Addr, uint16_t Qnt, uint8_t RegisterType)
67{
68 /* check quantity error */
69 if (Qnt > DATA_SIZE)
70 {
71 return ET_ILLEGAL_DATA_VALUE; // return exception code
72 }
73
74 if(RegisterType == RegisterType_Holding)
75 {
76 // Default holding registers
78 {
79 *pRegs = MB_Set_Register_Ptr(&MB_DATA.HoldRegs, Addr - R_HOLDING_ADDR); // указатель на выбранный по Addr регистр
80 }
81 // if address doesnt match any array - return illegal data address response
82 else
83 {
85 }
86 }
87 else if(RegisterType == RegisterType_Input)
88 {
89 // Default input registers
91 {
92 *pRegs = MB_Set_Register_Ptr(&MB_DATA.InRegs, Addr - R_INPUT_ADDR); // указатель на выбранный по Addr регистр
93 }
94 // if address doesnt match any array - return illegal data address response
95 else
96 {
98 }
99 }
100 else
101 {
102 return ET_ILLEGAL_FUNCTION;
103 }
104 // if found requeried array return no err
105 return ET_NO_ERRORS; // return no errors
106}
107/**
108 * @brief Define Address Origin for coils
109 * @param pCoils Указатель на указатель коилов.
110 * @param Addr Адресс начального коила.
111 * @param Qnt Количество запрашиваемых коилов.
112 * @param start_shift Указатель на переменную содержащую сдвиг внутри регистра для начального коила.
113 * @param WriteFlag Флаг коилы нужны для чтения или записи.
114 * @return ExceptionCode Код исключения если есть, и ET_NO_ERRORS если нет.
115 *
116 * @details Определение адреса начального регистра запрашиваемых коилов.
117 * @note WriteFlag используется для определния регистров GPIO: ODR или IDR.
118 */
119MB_ExceptionTypeDef MB_DefineCoilsAddress(uint16_t **pCoils, uint16_t Addr, uint16_t Qnt, uint16_t *start_shift, uint8_t WriteFlag)
120{
121 /* check quantity error */
122 if (Qnt > 2000)
123 {
124 return ET_ILLEGAL_DATA_VALUE; // return exception code
125 }
126
127 // Default coils
129 {
130 *pCoils = MB_Set_Coil_Reg_Ptr(&MB_DATA.Coils, Addr - C_COILS_ADDR); // указатель на выбранный по Addr массив коилов
131 }
132 // if address doesnt match any array - return illegal data address response
133 else
134 {
136 }
137
138 *start_shift = Addr % 16; // set shift to requested coil
139 // if found requeried array return no err
140 return ET_NO_ERRORS; // return no errors
141}
MB_ExceptionTypeDef MB_DefineRegistersAddress(uint16_t **pRegs, uint16_t Addr, uint16_t Qnt, uint8_t RegisterType)
Define Address Origin for Input/Holding Registers.
MB_ExceptionTypeDef MB_Check_Address_For_Arr(uint16_t Addr, uint16_t Qnt, uint16_t R_ARR_ADDR, uint16_t R_ARR_NUMB)
Check is address valid for certain array.
MB_ExceptionTypeDef MB_DefineCoilsAddress(uint16_t **pCoils, uint16_t Addr, uint16_t Qnt, uint16_t *start_shift, uint8_t WriteFlag)
Define Address Origin for coils.
MB_ExceptionTypeDef
Enum for modbus exception codes.
Definition modbus_core.h:76
#define MB_Set_Register_Ptr(_parr_, _addr_)
Macros to set pointer to register.
#define MB_Set_Coil_Reg_Ptr(_parr_, _coil_)
Макрос для установки указателя на регистр, содержащий запрашиваемый коил
#define DATA_SIZE
maximum number of data: DWORD (NOT MESSAGE SIZE)
Definition modbus_core.h:53
@ ET_ILLEGAL_DATA_VALUE
Значение, содержащееся в поле данных запроса, является недопустимой величиной
Definition modbus_core.h:81
@ ET_NO_ERRORS
no errors
Definition modbus_core.h:78
@ ET_ILLEGAL_FUNCTION
Принятый код функции не может быть обработан
Definition modbus_core.h:79
@ ET_ILLEGAL_DATA_ADDRESS
Адрес данных, указанный в запросе, недоступен
Definition modbus_core.h:80
Работа с коилами Modbus.
Ядро Modbus протокола - определения и структуры
#define R_INPUT_ADDR
Начальный адрес входных регистров
Definition modbus_data.h:61
#define C_COILS_QNT
Количество регистров коилов
Definition modbus_data.h:70
#define C_COILS_ADDR
Начальный адрес коилов
Definition modbus_data.h:69
#define R_HOLDING_ADDR
Начальный адрес регистров хранения
Definition modbus_data.h:65
#define R_INPUT_QNT
Количество входных регистров
Definition modbus_data.h:62
#define R_HOLDING_QNT
Количество регистров хранения
Definition modbus_data.h:66
Идентификаторы устройства Modbus.
Работа с регистрами хранения Modbus.
Работа с входными регистрами Modbus.