Modbus 0.3
Библиотека Modbus для STM
Loading...
Searching...
No Matches
modbus_inputregs.c
Go to the documentation of this file.
1/**
2*******************************************************************************
3* @file modbus_inputregs.c
4* @brief Реализация работы с входными регистрами Modbus
5*******************************************************************************
6* @details
7Модуль для доступа к регистрам внутри программы:
8- Функции для доступа к входным регистрам по глобальным адресам
9
10Модуль обработки команды чтения input registers (0x04):
11
12@section ivalid Валидация данных:
13- Проверка соответствия количества байт и регистров
14- Валидация адресов через MB_DefineRegistersAddress()
15- Обработка исключений при некорректных запросах
16******************************************************************************/
17#include "modbus_inputregs.h"
18
19
20#ifdef MODBUS_ENABLE_INPUTS
21
22
23/**
24 * @brief Записать входной регистр по глобальному адресу.
25 * @param Addr Адрес регистра.
26 * @param WriteVal Число для записи.
27 * @return ExceptionCode Код исключения если регистра по адресу не существует, и ET_NO_ERRORS если все ок.
28 *
29 * @details Позволяет обратиться к любому регистру по его глобальному адрессу.
30 Вне зависимости от того как регистры размещены в памяти.
31 */
32MB_ExceptionTypeDef MB_Input_Write_Global(uint16_t Addr, uint16_t WriteVal)
33{
34 //---------CHECK FOR ERRORS----------
36 uint16_t *pInRegs;
37
38 //------------WRITE COIL-------------
39 Exception = MB_DefineRegistersAddress(&pInRegs, Addr, 1, RegisterType_Input);
40 if(Exception == ET_NO_ERRORS)
41 {
42 *(pInRegs) = WriteVal;
43 }
44 return Exception;
45}
46
47
48/**
49 * @brief Считать входной регистр по глобальному адресу.
50 * @param Addr Адрес регистра.
51 * @param Exception Указатель на переменную для кода исключения, в случае неудачи при чтении.
52 * @return uint16_t Возвращает значение регистра.
53 *
54 * @details Позволяет обратиться к любому регистру по его глобальному адрессу.
55 Вне зависимости от того как регистры размещены в памяти.
56 */
57uint16_t MB_Input_Read_Global(uint16_t Addr, MB_ExceptionTypeDef *Exception)
58{
59 //---------CHECK FOR ERRORS----------
60 MB_ExceptionTypeDef Exception_tmp = 0;
61
62 uint16_t *pInRegs;
63
64 //------------READ COIL--------------
65 Exception_tmp = MB_DefineRegistersAddress(&pInRegs, Addr, 1, RegisterType_Input);
66
67 if(Exception) // if exception is not given to func fill it
68 *Exception = Exception_tmp;
69
70 if(Exception_tmp == ET_NO_ERRORS)
71 {
72 return *(pInRegs);
73 }
74 else
75 {
76 return 0;
77 }
78}
79
80
81/**
82 * @brief Обработать функцию Read Input Registers (04 - 0x04).
83 * @param modbus_msg Указатель на структуру собщения modbus.
84 * @return fMessageHandled Статус о результате обработки комманды.
85 * @details Обработка команды Read Input Registers.
86 */
88{
89 //---------CHECK FOR ERRORS----------
90 // get origin address for data
91 uint16_t *pInRegs;
92 modbus_msg->Except_Code = MB_DefineRegistersAddress(&pInRegs, modbus_msg->Addr, modbus_msg->Qnt, RegisterType_Input); // определение адреса регистров
93 if(modbus_msg->Except_Code != ET_NO_ERRORS)
94 return 0;
95
96
97 //-----------READING REGS------------
98 // setup output message data size
99 modbus_msg->ByteCnt = modbus_msg->Qnt*2; // *2 because we transmit 8 bits, not 16 bits
100 // read data
101 int i;
102 for (i = 0; i<modbus_msg->Qnt; i++)
103 {
104 if(*((int16_t *)pInRegs) > 0)
105 modbus_msg->MbData[i] = (*pInRegs++);
106 else
107 modbus_msg->MbData[i] = (*pInRegs++);
108 }
109 return 1;
110}
111
112#endif //MODBUS_ENABLE_INPUTS
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_Read_Input_Regs(RS_MsgTypeDef *modbus_msg)
Обработать функцию Read Input Registers (04 - 0x04).
uint16_t MB_Input_Read_Global(uint16_t Addr, MB_ExceptionTypeDef *Exception)
Считать входной регистр по глобальному адресу.
MB_ExceptionTypeDef MB_Input_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.