Modbus 0.3
Библиотека Modbus для STM
Loading...
Searching...
No Matches
modbus_holdregs.c
Go to the documentation of this file.
1/**
2*******************************************************************************
3* @file modbus_holdregs.c
4* @brief Реализация работы с регистрами хранения Modbus
5*******************************************************************************
6* @details
7Модуль для доступа к регистрам внутри программы:
8- Функции для доступа к регистрам хранения по глобальным адресам
9
10Модуль обработки команд для holding registers (регистров хранения):
11- Чтение множественных регистров (0x03) - копирование данных в буфер ответа
12- Запись одиночного регистра (0x06) - прямая запись значения
13- Запись множественных регистров (0x10) - пакетная запись из буфера
14
15@section hvalid Валидация данных:
16- Проверка соответствия количества байт и регистров
17- Валидация адресов через MB_DefineRegistersAddress()
18- Обработка исключений при некорректных запросах
19******************************************************************************/
20#include "modbus_inputregs.h"
21
22
23#ifdef MODBUS_ENABLE_HOLDINGS
24
25
26
27/**
28 * @brief Записать регистр хранения по глобальному адресу.
29 * @param Addr Адрес регистра.
30 * @param WriteVal Число для записи.
31 * @return ExceptionCode Код исключения если регистра по адресу не существует, и ET_NO_ERRORS если все ок.
32 *
33 * @details Позволяет обратиться к любому регистру по его глобальному адрессу.
34 Вне зависимости от того как регистры размещены в памяти.
35 */
36MB_ExceptionTypeDef MB_Holding_Write_Global(uint16_t Addr, uint16_t WriteVal)
37{
38 //---------CHECK FOR ERRORS----------
40 uint16_t *pHoldRegs;
41
42 //------------WRITE COIL-------------
43 Exception = MB_DefineRegistersAddress(&pHoldRegs, Addr, 1, RegisterType_Holding);
44 if(Exception == ET_NO_ERRORS)
45 {
46 *(pHoldRegs) = WriteVal;
47 }
48 return Exception;
49}
50
51
52/**
53 * @brief Считать регистр хранения по глобальному адресу.
54 * @param Addr Адрес регистра.
55 * @param Exception Указатель на переменную для кода исключения, в случае неудачи при чтении.
56 * @return uint16_t Возвращает значение регистра.
57 *
58 * @details Позволяет обратиться к любому регистру по его глобальному адрессу.
59 Вне зависимости от того как регистры размещены в памяти.
60 */
61uint16_t MB_Holding_Read_Global(uint16_t Addr, MB_ExceptionTypeDef *Exception)
62{
63 //---------CHECK FOR ERRORS----------
64 MB_ExceptionTypeDef Exception_tmp = 0;
65
66 uint16_t *pHoldRegs;
67
68 //------------READ COIL--------------
69 Exception_tmp = MB_DefineRegistersAddress(&pHoldRegs, Addr, 1, RegisterType_Holding);
70
71 if(Exception) // if exception is not given to func fill it
72 *Exception = Exception_tmp;
73
74 if(Exception_tmp == ET_NO_ERRORS)
75 {
76 return *(pHoldRegs);
77 }
78 else
79 {
80 return 0;
81 }
82}
83
84
85
86/**
87 * @brief Обработать функцию Read Holding Registers (03 - 0x03).
88 * @param modbus_msg Указатель на структуру собщения modbus.
89 * @return fMessageHandled Статус о результате обработки комманды.
90 * @details Обработка команды Read Holding Registers.
91 */
93{
94 //---------CHECK FOR ERRORS----------
95 // get origin address for data
96 uint16_t *pHoldRegs;
97 modbus_msg->Except_Code = MB_DefineRegistersAddress(&pHoldRegs, modbus_msg->Addr, modbus_msg->Qnt, RegisterType_Holding); // определение адреса регистров
98 if(modbus_msg->Except_Code != ET_NO_ERRORS)
99 return 0;
100
101
102 //-----------READING REGS------------
103 // setup output message data size
104 modbus_msg->ByteCnt = modbus_msg->Qnt*2; // *2 because we transmit 8 bits, not 16 bits
105 // read data
106 int i;
107 for (i = 0; i<modbus_msg->Qnt; i++)
108 {
109 modbus_msg->MbData[i] = *(pHoldRegs++);
110 }
111 return 1;
112}
113
114/**
115 * @brief Обработать функцию Write Single Register (06 - 0x06).
116 * @param modbus_msg Указатель на структуру собщения modbus.
117 * @return fMessageHandled Статус о результате обработки комманды.
118 * @details Обработка команды Write Single Register.
119 */
121{
122 // get origin address for data
123 uint16_t *pHoldRegs;
124 modbus_msg->Except_Code = MB_DefineRegistersAddress(&pHoldRegs, modbus_msg->Addr, 1, RegisterType_Holding); // определение адреса регистров
125 if(modbus_msg->Except_Code != ET_NO_ERRORS)
126 return 0;
127
128 //-----------WRITTING REG------------
129 *(pHoldRegs) = modbus_msg->Qnt;
130 return 1;
131}
132
133/**
134 * @brief Обработать функцию Write Multiple Registers (16 - 0x10).
135 * @param modbus_msg Указатель на структуру собщения modbus.
136 * @return fMessageHandled Статус о результате обработки комманды.
137 * @details Обработка команды Write Multiple Registers.
138 */
140{
141 //---------CHECK FOR ERRORS----------
142 if (modbus_msg->Qnt*2 != modbus_msg->ByteCnt)
143 { // if quantity and bytes count arent match
144 modbus_msg->Except_Code = 3;
145 return 0;
146 }
147 // get origin address for data
148 uint16_t *pHoldRegs;
149 modbus_msg->Except_Code = MB_DefineRegistersAddress(&pHoldRegs, modbus_msg->Addr, modbus_msg->Qnt, RegisterType_Holding); // определение адреса регистров
150 if(modbus_msg->Except_Code != ET_NO_ERRORS)
151 return 0;
152
153 //-----------WRITTING REGS-----------
154 for (int i = 0; i<modbus_msg->Qnt; i++)
155 {
156 *(pHoldRegs++) = modbus_msg->MbData[i];
157 }
158 return 1;
159}
160
161#endif //MODBUS_ENABLE_HOLDINGS
uint8_t MB_Process_Write_Single_Reg(RS_MsgTypeDef *modbus_msg)
Обработать функцию Write Single Register (06 - 0x06).
MB_ExceptionTypeDef MB_DefineRegistersAddress(uint16_t **pRegs, uint16_t Addr, uint16_t Qnt, uint8_t RegisterType)
Define Address Origin for Input/Holding Registers.
uint8_t MB_Process_Write_Miltuple_Regs(RS_MsgTypeDef *modbus_msg)
Обработать функцию Write Multiple Registers (16 - 0x10).
uint8_t MB_Process_Read_Hold_Regs(RS_MsgTypeDef *modbus_msg)
Обработать функцию Read Holding Registers (03 - 0x03).
uint16_t MB_Holding_Read_Global(uint16_t Addr, MB_ExceptionTypeDef *Exception)
Считать регистр хранения по глобальному адресу.
MB_ExceptionTypeDef MB_Holding_Write_Global(uint16_t Addr, uint16_t WriteVal)
Записать регистр хранения по глобальному адресу.
MB_ExceptionTypeDef
Enum for modbus exception codes.
Definition modbus_core.h:76
@ ET_NO_ERRORS
no errors
Definition modbus_core.h:78
Работа с входными регистрами Modbus.
Structure for modbus messsage.
uint16_t Qnt
Quantity of modbus data.
MB_ExceptionTypeDef Except_Code
Exception Code for the command.
uint8_t ByteCnt
Quantity of bytes of data in message to transmit/receive.
uint16_t MbData[DATA_SIZE]
Modbus Data.
uint16_t Addr
Modbus Address of data.