\chapter{Инструкция по подключению релиза библиотеки {\ttfamily STM Modbus} }
\hypertarget{index}{}\label{index}\index{Инструкция по подключению релиза библиотеки $<$tt$>$STM Modbus$<$/tt$>$@{Инструкция по подключению релиза библиотеки $<$tt$>$STM Modbus$<$/tt$>$}}
\label{index_md__e_1_2_8_w_o_r_k_2_s_t_m32_2_diod___test_2diode__tester_2_core_2_modbus_2_r_e_a_d_m_e}%
\Hypertarget{index_md__e_1_2_8_w_o_r_k_2_s_t_m32_2_diod___test_2diode__tester_2_core_2_modbus_2_r_e_a_d_m_e}%


Данная библиотека подключается напрямую из Git, как субмодуль. Позволяя при желании обновлять её напрямую через git.\hypertarget{index_структура-библиотеки}{}\doxysection{\texorpdfstring{Структура библиотеки}{Структура библиотеки}}\label{index_структура-библиотеки}
\texorpdfstring{$\ast$}{*}\+Note\+: Файлы начинающиеся с {\ttfamily \+\_\+\+\_\+} и которых {\bfseries{нет}} в этом дереве являются \texorpdfstring{$\ast$}{*}\texorpdfstring{$\ast$}{*}внутренними/непротестированными/недокументированными\texorpdfstring{$\ast$}{*}\texorpdfstring{$\ast$}{*}\texorpdfstring{$\ast$}{*} 
\begin{DoxyCode}{0}
\DoxyCodeLine{Modbus/\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ Иерархия\ модулей:}
\DoxyCodeLine{│\ \ \ inc/\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ modbus}
\DoxyCodeLine{│\ \ \ ├──\ modbus.h\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \#\ Главный\ заголовочный\ файл\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ modbus\_slave}
\DoxyCodeLine{│\ \ \ ├──\ modbus\_core.h\ \ \ \ \ \ \ \ \ \ \ \#\ Базовые\ определения\ и\ структуры\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ modbus\_master}
\DoxyCodeLine{│\ \ \ ├──\ modbus\_coils.h\ \ \ \ \ \ \ \ \ \ \#\ Работа\ с\ дискретными\ выходами\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ├──\ modbus\_coils}
\DoxyCodeLine{│\ \ \ ├──\ modbus\_holdregs.h\ \ \ \ \ \ \ \#\ Работа\ с\ регистрами\ хранения\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ├──\ modbus\_inputregs}
\DoxyCodeLine{│\ \ \ ├──\ modbus\_inputregs.h\ \ \ \ \ \ \#\ Работа\ с\ входными\ регистрами\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ├──\ modbus\_inputregs}
\DoxyCodeLine{│\ \ \ ├──\ modbus\_devid.h\ \ \ \ \ \ \ \ \ \ \#\ Идентификация\ устройства\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ├──\ modbus\_devid}
\DoxyCodeLine{│\ \ \ ├──\ rs\_message.h\ \ \ \ \ \ \ \ \ \ \ \ \#\ Драйвер\ обмена\ по\ RS/UART\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ├──\ modbus\_diag}
\DoxyCodeLine{├──\ src/\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ └──\ rs\_message}
\DoxyCodeLine{│\ \ \ ├──\ modbus.c\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \#\ Основная\ логика\ Modbus\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ │}
\DoxyCodeLine{│\ \ \ ├──\ modbus\_slave.c\ \ \ \ \ \ \ \ \ \ \#\ Основная\ логика\ Slave\ Modbus\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ └──\ modbus\_core\ (единое\ ядро)}
\DoxyCodeLine{│\ \ \ ├──\ modbus\_master.c\ \ \ \ \ \ \ \ \ \#\ Основная\ логика\ Master\ Modbus\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ├──\ modbus\_config}
\DoxyCodeLine{│\ \ \ ├──\ modbus\_coils.c\ \ \ \ \ \ \ \ \ \ \#\ Реализация\ работы\ с\ coils\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ ├──\ modbus\_data}
\DoxyCodeLine{│\ \ \ ├──\ modbus\_holdregs.c\ \ \ \ \ \ \ \#\ Реализация\ регистров\ хранения\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ └──\ \_\_crc\_algs}
\DoxyCodeLine{│\ \ \ ├──\ modbus\_inputregs.c\ \ \ \ \ \ \#\ Реализация\ входных\ регистров\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }
\DoxyCodeLine{│\ \ \ ├──\ modbus\_devid.c\ \ \ \ \ \ \ \ \ \ \#\ Реализация\ идентификации\ устройства\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }
\DoxyCodeLine{│\ \ \ ├──\ modbus\_data.c\ \ \ \ \ \ \ \ \ \ \ \#\ Функции\ доступа\ к\ данным\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }
\DoxyCodeLine{│\ \ \ └──\ rs\_message.c\ \ \ \ \ \ \ \ \ \ \ \ \#\ Реализация\ драйвера\ RS\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }
\DoxyCodeLine{├──\ \_\_modbus\_config.h\ \ \ \ \ \ \ \#\ Конфигурация\ Modbus\ (надо\ заменить)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }
\DoxyCodeLine{├──\ \_\_modbus\_data.h\ \ \ \ \ \ \ \ \ \#\ Структуры\ данных\ (надо\ заменить)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }
\DoxyCodeLine{└──\ \_\_modbus\_data.c\ \ \ \ \ \ \ \ \ \#\ Функции\ доступа\ (надо\ заменить)\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ }

\end{DoxyCode}
\hypertarget{index_инструкция-по-подключению}{}\doxysection{\texorpdfstring{Инструкция по подключению}{Инструкция по подключению}}\label{index_инструкция-по-подключению}
\hypertarget{index_autotoc_md1-склонируйте-субмодуль-в-ваш-проект}{}\doxysubsection{\texorpdfstring{1. {\bfseries{Склонируйте субмодуль}} в ваш проект\+:}{1. {\bfseries{Склонируйте субмодуль}} в ваш проект\+:}}\label{index_autotoc_md1-склонируйте-субмодуль-в-ваш-проект}

\begin{DoxyCode}{0}
\DoxyCodeLine{git\ submodule\ add\ https://git.arktika.cyou/set506/STM32\_Modbus\ path/to/Modbus}
\DoxyCodeLine{git\ submodule\ update\ -\/-\/init\ -\/-\/recursive}

\end{DoxyCode}
\hypertarget{index_autotoc_md2-скопируйте-файлы-конфигурации-в-отдельную-папку-в-вашем-проекте-вне-субмодуля-и-удалите-__-из-имени-файлов}{}\doxysubsection{\texorpdfstring{2. {\bfseries{Скопируйте файлы конфигурации}} в отдельную папку в вашем проекте (вне субмодуля) и удалите {\ttfamily \+\_\+\+\_\+} из имени файлов\+:}{2. {\bfseries{Скопируйте файлы конфигурации}} в отдельную папку в вашем проекте (вне субмодуля) и удалите {\ttfamily \+\_\+\+\_\+} из имени файлов\+:}}\label{index_autotoc_md2-скопируйте-файлы-конфигурации-в-отдельную-папку-в-вашем-проекте-вне-субмодуля-и-удалите-__-из-имени-файлов}

\begin{DoxyCode}{0}
\DoxyCodeLine{ProjectRoot/}
\DoxyCodeLine{├──\ Configs/}
\DoxyCodeLine{│\ \ \ ├──\ modbus\_config.h\ \ \ \ \ \ \ \ \ \ \#\ скопировать\ из\ \_\_modbus\_config.h}
\DoxyCodeLine{│\ \ \ ├──\ modbus\_data.h\ \ \ \ \ \ \ \ \ \ \ \ \#\ скопировать\ из\ \_\_modbus\_data.h}
\DoxyCodeLine{│\ \ \ └──\ modbus\_data.c\ \ \ \ \ \ \ \ \ \ \ \ \#\ скопировать\ из\ \_\_modbus\_data.c}
\DoxyCodeLine{└──\ Modbus/\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \#\ Субмодуль}

\end{DoxyCode}
\hypertarget{index_autotoc_md3-настройте-конфигурацию-под-ваш-проект}{}\doxysubsection{\texorpdfstring{3. {\bfseries{Настройте конфигурацию}} под ваш проект\+:}{3. {\bfseries{Настройте конфигурацию}} под ваш проект\+:}}\label{index_autotoc_md3-настройте-конфигурацию-под-ваш-проект}
\hypertarget{index_autotoc_md31-настройка-периферии}{}\doxysubsubsection{\texorpdfstring{3.\+1. Настройка периферии}{3.\+1. Настройка периферии}}\label{index_autotoc_md31-настройка-периферии}

\begin{DoxyItemize}
\item {\bfseries{UART}}\+: Настройте в режиме Asynchronous, нужная скорость (9600, 19200, etc), 8N1
\item {\bfseries{TIM}}\+: Настройте таймер для генерации прерываний (например, 1ms tick)
\item {\bfseries{Включите прерывания}} для UART и TIM
\end{DoxyItemize}\hypertarget{index_autotoc_md32-подключение-обработчиков-прерываний}{}\doxysubsubsection{\texorpdfstring{3.\+2. Подключение обработчиков прерываний}{3.\+2. Подключение обработчиков прерываний}}\label{index_autotoc_md32-подключение-обработчиков-прерываний}
Подключите обработчики прерываний {\bfseries{UART}} и {\bfseries{TIM}} в свои IRQ обработчики {\itshape {\bfseries{вместо}}} HAL-\/обработчиков\+:


\begin{DoxyCode}{0}
\DoxyCodeLine{\textcolor{preprocessor}{\#include\ "{}\mbox{\hyperlink{modbus_8h}{modbus.h}}"{}}}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keywordtype}{void}\ USARTx\_IRQHandler(\textcolor{keywordtype}{void})}
\DoxyCodeLine{\{}
\DoxyCodeLine{\ \ \ \ \mbox{\hyperlink{group___r_s___t_o_o_l_s_gab27567456df0329130c7fe4fc43c6ee1}{RS\_UART\_Handler}}(\&\mbox{\hyperlink{group___r_s___t_o_o_l_s_gadaef5cb7e494d0fd139199f5b6cbeb86}{hmodbus1}});}
\DoxyCodeLine{\ \ \ \ \textcolor{keywordflow}{return};}
\DoxyCodeLine{\ \ \ \ HAL\_UART\_IRQHandler(\&huart);}
\DoxyCodeLine{\}}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keywordtype}{void}\ TIMx\_IRQHandler(\textcolor{keywordtype}{void})}
\DoxyCodeLine{\{}
\DoxyCodeLine{\ \ \ \ \mbox{\hyperlink{group___r_s___t_o_o_l_s_ga2d356b2a0b4af43460bb2cacb81779ce}{RS\_TIM\_Handler}}(\&\mbox{\hyperlink{group___r_s___t_o_o_l_s_gadaef5cb7e494d0fd139199f5b6cbeb86}{hmodbus1}});}
\DoxyCodeLine{\ \ \ \ \textcolor{keywordflow}{return};}
\DoxyCodeLine{\ \ \ \ HAL\_TIM\_IRQHandler(\&htim);}
\DoxyCodeLine{\}}

\end{DoxyCode}
 \hypertarget{index_autotoc_md33-в-modbus_configh-укажите-параметры-устройства}{}\doxysubsubsection{\texorpdfstring{3.\+3. В {\ttfamily modbus\+\_\+config.\+h} укажите параметры устройства}{3.\+3. В {\ttfamily modbus\+\_\+config.\+h} укажите параметры устройства}}\label{index_autotoc_md33-в-modbus_configh-укажите-параметры-устройства}
\hypertarget{index_autotoc_md34-инициализация-в-коде}{}\doxysubsubsection{\texorpdfstring{3.\+4. Инициализация в коде}{3.\+4. Инициализация в коде}}\label{index_autotoc_md34-инициализация-в-коде}
Чтобы настроить Slave-\/режим {\ttfamily main()} после инициализации HAL\+:


\begin{DoxyCode}{0}
\DoxyCodeLine{\textcolor{preprocessor}{\#include\ "{}\mbox{\hyperlink{modbus_8h}{modbus.h}}"{}}}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{keywordtype}{int}\ main(\textcolor{keywordtype}{void})}
\DoxyCodeLine{\{}
\DoxyCodeLine{\ \ \ \ \textcolor{comment}{//\ Инициализация\ HAL}}
\DoxyCodeLine{\ \ \ \ HAL\_Init();}
\DoxyCodeLine{\ \ \ \ SystemClock\_Config();}
\DoxyCodeLine{\ \ \ \ MX\_GPIO\_Init();}
\DoxyCodeLine{\ \ \ \ MX\_USART1\_UART\_Init();}
\DoxyCodeLine{\ \ \ \ MX\_TIM3\_Init();}
\DoxyCodeLine{\ \ \ \ }
\DoxyCodeLine{\ \ \ \ \textcolor{comment}{//\ Инициализация\ Modbus}}
\DoxyCodeLine{\ \ \ \ \mbox{\hyperlink{group___m_o_d_b_u_s___f_u_n_c_t_i_o_n_s_ga9e787c3454aab3293dec6e6795f687f5}{MODBUS\_FirstInit}}(\&\mbox{\hyperlink{group___r_s___t_o_o_l_s_gadaef5cb7e494d0fd139199f5b6cbeb86}{hmodbus1}},\ \&\mbox{\hyperlink{group___m_o_d_b_u_s___c_o_n_f_i_g_s_ga370986118b8227cb6cb33c6b748fbbcb}{mb\_huart}},\ \&\mbox{\hyperlink{group___m_o_d_b_u_s___c_o_n_f_i_g_s_ga6723a1608946a4f86cd7c9c7e614d04e}{mb\_htim}});}
\DoxyCodeLine{\ \ \ \ \mbox{\hyperlink{group___m_o_d_b_u_s___f_u_n_c_t_i_o_n_s_ga460466907693a256487d31f09b16edfe}{MODBUS\_Config}}(\&\mbox{\hyperlink{group___r_s___t_o_o_l_s_gadaef5cb7e494d0fd139199f5b6cbeb86}{hmodbus1}},\ \mbox{\hyperlink{group___m_o_d_b_u_s___c_o_n_f_i_g_s_gab9b18e108b98b225a52c5ccca58e7f2b}{MODBUS\_DEVICE\_ID}},\ \mbox{\hyperlink{group___m_o_d_b_u_s___c_o_n_f_i_g_s_ga66f7c59a25c8cca6d5b0991895c26b69}{MODBUS\_TIMEOUT}},\ \mbox{\hyperlink{group___m_o_d_b_u_s___f_u_n_c_t_i_o_n_s_gac0b3749af91f1007fd0291157b66b305}{MODBUS\_MODE\_SLAVE}});}
\DoxyCodeLine{\ \ \ \ }
\DoxyCodeLine{\ \ \ \ \textcolor{comment}{//\ Запуск\ приема\ Modbus}}
\DoxyCodeLine{\ \ \ \ \mbox{\hyperlink{group___m_o_d_b_u_s___f_u_n_c_t_i_o_n_s_ga9a17402983188566254b7096342ba69e}{MODBUS\_SlaveStart}}(\&\mbox{\hyperlink{group___r_s___t_o_o_l_s_gadaef5cb7e494d0fd139199f5b6cbeb86}{hmodbus1}},\ NULL);}
\DoxyCodeLine{\ \ \ \ }
\DoxyCodeLine{\ \ \ \ \textcolor{keywordflow}{while}\ (1)}
\DoxyCodeLine{\ \ \ \ \{}
\DoxyCodeLine{\ \ \ \ \ \ \ \ \textcolor{comment}{//\ Основной\ цикл}}
\DoxyCodeLine{\ \ \ \ \}}
\DoxyCodeLine{\}}

\end{DoxyCode}
 Чтобы настроить Master-\/режим {\ttfamily main()} после инициализации HAL\+:


\begin{DoxyCode}{0}
\DoxyCodeLine{\textcolor{preprocessor}{\#include\ "{}\mbox{\hyperlink{modbus_8h}{modbus.h}}"{}}}
\DoxyCodeLine{\textcolor{comment}{//\ Запрос\ на\ 1\ ID,\ считать\ холдинг\ регистры\ с\ 0\ адреса\ 10\ штук}}
\DoxyCodeLine{\mbox{\hyperlink{struct_r_s___msg_type_def}{RS\_MsgTypeDef}}\ read\_hold\_cmd\ =\ \mbox{\hyperlink{group___m_o_d_b_u_s___r_e_q_u_e_s_t___m_s_g_ga4a4798a15608f3aac04150115a628f8e}{MB\_REQUEST\_READ\_HOLDING\_REGS}}(1,\ 0,\ 10);}
\DoxyCodeLine{\textcolor{comment}{//\ коллбек,\ вызовется\ при\ получении\ ответа\ от\ слейва}}
\DoxyCodeLine{read\_hold[10];}
\DoxyCodeLine{\textcolor{keywordtype}{void}\ callback\_func(\mbox{\hyperlink{struct_r_s___handle_type_def}{RS\_HandleTypeDef}}\ *hmodbus,\ \mbox{\hyperlink{struct_r_s___msg_type_def}{RS\_MsgTypeDef}}\ *modbus\_msg)\ }
\DoxyCodeLine{\{}
\DoxyCodeLine{\ \ \ \ \textcolor{comment}{//\ MB\_RespGet\_...\ Чтобы\ достать\ нужные\ данные\ из\ ответа}}
\DoxyCodeLine{\ \ \ \ \textcolor{keywordflow}{if}(hmodbus-\/>\mbox{\hyperlink{struct_r_s___handle_type_def_a8bbcb263ae7a61790b559bcb55cd9aa9}{RS\_STATUS}}\ ==\ RS\_OK)}
\DoxyCodeLine{\ \ \ \ \{}
\DoxyCodeLine{\ \ \ \ \ \ \ \ \textcolor{keywordflow}{for}(\textcolor{keywordtype}{int}\ addr\ =\ \mbox{\hyperlink{group___m_o_d_b_u_s___m_e_s_s_a_g_e___d_e_f_i_n_e_s_ga679c526f339999281b97010876e7a295}{MODBUS\_MSG}}.Addr;\ addr\ <\ \mbox{\hyperlink{group___m_o_d_b_u_s___m_e_s_s_a_g_e___d_e_f_i_n_e_s_ga679c526f339999281b97010876e7a295}{MODBUS\_MSG}}.Addr\ +\ \mbox{\hyperlink{group___m_o_d_b_u_s___m_e_s_s_a_g_e___d_e_f_i_n_e_s_ga679c526f339999281b97010876e7a295}{MODBUS\_MSG}}.Qnt;\ addr++)}
\DoxyCodeLine{\ \ \ \ \ \ \ \ \{}
\DoxyCodeLine{\ \ \ \ \ \ \ \ \ \ \ \ uint16\_t\ value;}
\DoxyCodeLine{\ \ \ \ \ \ \ \ \ \ \ \ \textcolor{keywordflow}{if}(\mbox{\hyperlink{group___m_o_d_b_u_s___r_e_g_s___a_p_i_ga1f80317087624a23f84224c6f2c1d596}{MB\_RespGet\_RegisterValue}}(\&\mbox{\hyperlink{group___m_o_d_b_u_s___m_e_s_s_a_g_e___d_e_f_i_n_e_s_ga679c526f339999281b97010876e7a295}{MODBUS\_MSG}},\ addr,\ \&value))}
\DoxyCodeLine{\ \ \ \ \ \ \ \ \ \ \ \ \{}
\DoxyCodeLine{\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ read\_hold[i]\ =\ value;}
\DoxyCodeLine{\ \ \ \ \ \ \ \ \ \ \ \ \}}
\DoxyCodeLine{\ \ \ \ \ \ \ \ \}}
\DoxyCodeLine{\ \ \ \ \}}
\DoxyCodeLine{\}}
\DoxyCodeLine{\textcolor{keywordtype}{int}\ main(\textcolor{keywordtype}{void})}
\DoxyCodeLine{\{}
\DoxyCodeLine{\ \ \ \ \textcolor{comment}{//\ Инициализация\ HAL}}
\DoxyCodeLine{\ \ \ \ HAL\_Init();}
\DoxyCodeLine{\ \ \ \ SystemClock\_Config();}
\DoxyCodeLine{\ \ \ \ MX\_GPIO\_Init();}
\DoxyCodeLine{\ \ \ \ MX\_USART1\_UART\_Init();}
\DoxyCodeLine{\ \ \ \ MX\_TIM3\_Init();}
\DoxyCodeLine{\ \ \ \ }
\DoxyCodeLine{\ \ \ \ \textcolor{comment}{//\ Инициализация\ Modbus}}
\DoxyCodeLine{\ \ \ \ \mbox{\hyperlink{group___m_o_d_b_u_s___f_u_n_c_t_i_o_n_s_ga9e787c3454aab3293dec6e6795f687f5}{MODBUS\_FirstInit}}(\&\mbox{\hyperlink{group___r_s___t_o_o_l_s_gadaef5cb7e494d0fd139199f5b6cbeb86}{hmodbus1}},\ \&\mbox{\hyperlink{group___m_o_d_b_u_s___c_o_n_f_i_g_s_ga370986118b8227cb6cb33c6b748fbbcb}{mb\_huart}},\ \&\mbox{\hyperlink{group___m_o_d_b_u_s___c_o_n_f_i_g_s_ga6723a1608946a4f86cd7c9c7e614d04e}{mb\_htim}});}
\DoxyCodeLine{\ \ \ \ \mbox{\hyperlink{group___m_o_d_b_u_s___f_u_n_c_t_i_o_n_s_ga460466907693a256487d31f09b16edfe}{MODBUS\_Config}}(\&\mbox{\hyperlink{group___r_s___t_o_o_l_s_gadaef5cb7e494d0fd139199f5b6cbeb86}{hmodbus1}},\ 0,\ \mbox{\hyperlink{group___m_o_d_b_u_s___c_o_n_f_i_g_s_ga66f7c59a25c8cca6d5b0991895c26b69}{MODBUS\_TIMEOUT}},\ \mbox{\hyperlink{group___m_o_d_b_u_s___f_u_n_c_t_i_o_n_s_gad91eec9c3350f2705f1bbe1856cb0159}{MODBUS\_MODE\_MASTER}});}
\DoxyCodeLine{\ \ \ \ }
\DoxyCodeLine{\ \ \ \ \textcolor{comment}{//\ Запрос\ по\ Modbus}}
\DoxyCodeLine{\ \ \ \ \mbox{\hyperlink{group___m_o_d_b_u_s___f_u_n_c_t_i_o_n_s_ga19090cabfba2345391e37398125a2f55}{MODBUS\_MasterRequest}}(\&\mbox{\hyperlink{group___r_s___t_o_o_l_s_gadaef5cb7e494d0fd139199f5b6cbeb86}{hmodbus1}},\ \&read\_hold\_cmd,\ \&callback\_func);}
\DoxyCodeLine{}
\DoxyCodeLine{\}}

\end{DoxyCode}
 \hypertarget{index_autotoc_md35-настройка-карты-данных}{}\doxysubsubsection{\texorpdfstring{3.\+5. Настройка карты данных}{3.\+5. Настройка карты данных}}\label{index_autotoc_md35-настройка-карты-данных}
В {\ttfamily \doxylink{modbus__data_8h}{modbus\+\_\+data.\+h}} настройте регистры и coils под ваше устройство\+:

{\bfseries{Input Registers (только чтение)}} 
\begin{DoxyCode}{0}
\DoxyCodeLine{\textcolor{keyword}{typedef}\ \textcolor{keyword}{struct}}
\DoxyCodeLine{\{}
\DoxyCodeLine{\ \ \ \ uint16\_t\ Temperature;\ \ \ \ \ \ \textcolor{comment}{//\ Адрес\ 0}}
\DoxyCodeLine{\ \ \ \ uint16\_t\ Humidity;\ \ \ \ \ \ \ \ \ \textcolor{comment}{//\ Адрес\ 1\ \ }}
\DoxyCodeLine{\ \ \ \ uint16\_t\ Pressure;\ \ \ \ \ \ \ \ \ \textcolor{comment}{//\ Адрес\ 2}}
\DoxyCodeLine{\ \ \ \ uint16\_t\ Voltage;\ \ \ \ \ \ \ \ \ \ \textcolor{comment}{//\ Адрес\ 3}}
\DoxyCodeLine{\}\ \mbox{\hyperlink{struct_m_b___data_in_regs_type_def}{MB\_DataInRegsTypeDef}};}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{preprocessor}{\#define\ R\_INPUT\_ADDR\ \ \ \ \ \ \ \ 0\ \ }\textcolor{comment}{//\ Начальный\ адрес\ Input\ регистров}}
\DoxyCodeLine{\textcolor{preprocessor}{\#define\ R\_INPUT\_QNT\ \ \ \ \ \ \ \ \ 4\ \ }\textcolor{comment}{//\ Количество\ Input\ регистров}}

\end{DoxyCode}
 {\bfseries{Holding Registers (чтение/запись)}} 
\begin{DoxyCode}{0}
\DoxyCodeLine{\textcolor{keyword}{typedef}\ \textcolor{keyword}{struct}}
\DoxyCodeLine{\{}
\DoxyCodeLine{\ \ \ \ uint16\_t\ SetpointTemp;\ \ \ \ \ \textcolor{comment}{//\ Адрес\ 0}}
\DoxyCodeLine{\ \ \ \ uint16\_t\ SetpointHumidity;\ \textcolor{comment}{//\ Адрес\ 1}}
\DoxyCodeLine{\ \ \ \ uint16\_t\ ControlMode;\ \ \ \ \ \ \textcolor{comment}{//\ Адрес\ 2}}
\DoxyCodeLine{\}\ \mbox{\hyperlink{struct_m_b___data_hold_regs_type_def}{MB\_DataHoldRegsTypeDef}};}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{preprocessor}{\#define\ R\_HOLDING\_ADDR\ \ \ \ \ \ 0\ \ }\textcolor{comment}{//\ Начальный\ адрес\ Holding\ регистров\ \ }}
\DoxyCodeLine{\textcolor{preprocessor}{\#define\ R\_HOLDING\_QNT\ \ \ \ \ \ \ 3\ \ }\textcolor{comment}{//\ Количество\ Holding\ регистров}}

\end{DoxyCode}
 {\bfseries{Coils (1-\/битные)}} 
\begin{DoxyCode}{0}
\DoxyCodeLine{\textcolor{keyword}{typedef}\ \textcolor{keyword}{struct}}
\DoxyCodeLine{\{}
\DoxyCodeLine{\ \ \ \ \textcolor{keywordtype}{unsigned}\ Relay1\ \ \ \ :\ 1;\ \ \ \ \textcolor{comment}{//\ Адрес\ 0}}
\DoxyCodeLine{\ \ \ \ \textcolor{keywordtype}{unsigned}\ Relay2\ \ \ \ :\ 1;\ \ \ \ \textcolor{comment}{//\ Адрес\ 1\ \ }}
\DoxyCodeLine{\ \ \ \ \textcolor{keywordtype}{unsigned}\ Pump\ \ \ \ \ \ :\ 1;\ \ \ \ \textcolor{comment}{//\ Адрес\ 2}}
\DoxyCodeLine{\ \ \ \ \textcolor{keywordtype}{unsigned}\ Heater\ \ \ \ :\ 1;\ \ \ \ \textcolor{comment}{//\ Адрес\ 3}}
\DoxyCodeLine{\ \ \ \ \textcolor{keywordtype}{unsigned}\ reserved\ \ :\ 12;\ \ \ \textcolor{comment}{//\ Резерв\ (выравнивание\ до\ 16\ бит)}}
\DoxyCodeLine{\}\ \mbox{\hyperlink{struct_m_b___data_coils_type_def}{MB\_DataCoilsTypeDef}};}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{preprocessor}{\#define\ C\_COILS\_ADDR\ \ \ \ \ \ \ \ 0\ \ }\textcolor{comment}{//\ Начальный\ адрес\ Coils}}
\DoxyCodeLine{\textcolor{preprocessor}{\#define\ C\_COILS\_QNT\ \ \ \ \ \ \ \ \ 4\ \ }\textcolor{comment}{//\ Количество\ Coils}}

\end{DoxyCode}
 \hypertarget{index_autotoc_md36-доступ-к-данным-в-коде}{}\doxysubsubsection{\texorpdfstring{3.\+6. Доступ к данным в коде}{3.\+6. Доступ к данным в коде}}\label{index_autotoc_md36-доступ-к-данным-в-коде}
В режиме слейва есть дефайны для удобного выставления Коилов. На случай если они не упакованы в битовые поля 
\begin{DoxyCode}{0}
\DoxyCodeLine{\textcolor{comment}{//\ Чтение\ входных\ регистров}}
\DoxyCodeLine{uint16\_t\ temp\ =\ MB\_DATA.InRegs.Temperature;}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{comment}{//\ Запись\ в\ регистры\ хранения}}
\DoxyCodeLine{MB\_DATA.HoldRegs.SetpointTemp\ =\ 2500;}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{comment}{//\ Управление\ coils}}
\DoxyCodeLine{\mbox{\hyperlink{group___m_o_d_b_u_s___d_a_t_a___a_c_c_e_s_s___f_u_n_c_t_i_o_n_s_ga635a6c4fbce49bd1e6797642b36dae7e}{MB\_Coil\_Set\_Local}}(\&MB\_DATA.Coils,\ 0);\ \ \textcolor{comment}{//\ Включить\ Relay1}}
\DoxyCodeLine{\mbox{\hyperlink{group___m_o_d_b_u_s___d_a_t_a___a_c_c_e_s_s___f_u_n_c_t_i_o_n_s_gabc4efb5e2a6aaa021ef5fe6c69476927}{MB\_Coil\_Reset\_Local}}(\&MB\_DATA.Coils,\ 1);\ \textcolor{comment}{//\ Выключить\ Relay2}}
\DoxyCodeLine{}
\DoxyCodeLine{\textcolor{comment}{//\ Чтение\ coil}}
\DoxyCodeLine{\textcolor{keywordflow}{if}\ (\mbox{\hyperlink{group___m_o_d_b_u_s___d_a_t_a___a_c_c_e_s_s___f_u_n_c_t_i_o_n_s_ga0f8474120df77dc5f334d60d6a5f6f8f}{MB\_Coil\_Read\_Local}}(\&MB\_DATA.Coils,\ 2))\ \{}
\DoxyCodeLine{\ \ \ \ \textcolor{comment}{//\ Pump\ включен}}
\DoxyCodeLine{\}}

\end{DoxyCode}
 В режиме мастера есть функции для получения информации из ответа {\ttfamily MB\+\_\+\+Resp\+Get\+\_\+...()} 
\begin{DoxyCode}{0}
\DoxyCodeLine{\textcolor{comment}{//\ \ Чтение\ регистров:\ Получить\ запрошенные\ регистры}}
\DoxyCodeLine{uint16\_t\ value;}
\DoxyCodeLine{\textcolor{keywordflow}{if}(\mbox{\hyperlink{group___m_o_d_b_u_s___r_e_g_s___a_p_i_ga1f80317087624a23f84224c6f2c1d596}{MB\_RespGet\_RegisterValue}}(\&\mbox{\hyperlink{group___m_o_d_b_u_s___m_e_s_s_a_g_e___d_e_f_i_n_e_s_ga679c526f339999281b97010876e7a295}{MODBUS\_MSG}},\ 105,\ \&reg\_value))}
\DoxyCodeLine{\{}
\DoxyCodeLine{\ \ \ \ printf(\textcolor{stringliteral}{"{}Register\ 105\ value:\ \%d\(\backslash\)n"{}},\ reg\_value);}
\DoxyCodeLine{\}}
\DoxyCodeLine{\textcolor{comment}{//\ \ Чтение\ коилов:\ Получить\ запрошенные\ коилы}}
\DoxyCodeLine{\textcolor{keywordtype}{int}\ state;}
\DoxyCodeLine{\textcolor{keywordflow}{if}(\mbox{\hyperlink{group___m_o_d_b_u_s___r_e_q___c_o_i_l_s___a_p_i_ga643a0be1ccd587a6dfe544d9fd5ed018}{MB\_RespGet\_CoilState}}(\&\mbox{\hyperlink{group___m_o_d_b_u_s___m_e_s_s_a_g_e___d_e_f_i_n_e_s_ga679c526f339999281b97010876e7a295}{MODBUS\_MSG}},\ 25,\ \&coil\_state))}
\DoxyCodeLine{\{}
\DoxyCodeLine{\ \ \ \ printf(\textcolor{stringliteral}{"{}Coil\ 25\ state:\ \%s\(\backslash\)n"{}},\ coil\_state\ ?\ \textcolor{stringliteral}{"{}ON"{}}\ :\ \textcolor{stringliteral}{"{}OFF"{}});}
\DoxyCodeLine{\}}
\DoxyCodeLine{\textcolor{comment}{//\ \ Чтение\ диагностики:\ Получить\ запрошенныую\ диагностику}}
\DoxyCodeLine{uint16\_t\ counter\_value;}
\DoxyCodeLine{\textcolor{keywordflow}{if}(MB\_RespGet\_DiagnosticResponse(\&\mbox{\hyperlink{group___m_o_d_b_u_s___m_e_s_s_a_g_e___d_e_f_i_n_e_s_ga679c526f339999281b97010876e7a295}{MODBUS\_MSG}},\ \&counter\_value))}
\DoxyCodeLine{\{}
\DoxyCodeLine{\ \ \ \ printf(\textcolor{stringliteral}{"{}Counter\ value:\ \%d\(\backslash\)n"{}},\ counter\_value);}
\DoxyCodeLine{\}}
\DoxyCodeLine{\textcolor{comment}{//\ \ Чтение\ идентификаторов:\ Получить\ запрошенные\ идентификаторы}}
\DoxyCodeLine{uint8\_t\ length;}
\DoxyCodeLine{\textcolor{keywordtype}{char}\ vendor\_name[64];}
\DoxyCodeLine{\textcolor{keywordflow}{if}(\mbox{\hyperlink{group___m_o_d_b_u_s___r_e_q___d_e_f_i_d___a_p_i_ga0dc4119c008af34d5997eab339c437be}{MB\_RespGet\_ObjectById}}(\&\mbox{\hyperlink{group___m_o_d_b_u_s___m_e_s_s_a_g_e___d_e_f_i_n_e_s_ga679c526f339999281b97010876e7a295}{MODBUS\_MSG}},\ 0x00,\ vendor\_name,\ \&length))}
\DoxyCodeLine{\{}
\DoxyCodeLine{\ \ \ \ printf(\textcolor{stringliteral}{"{}Vendor\ Name:\ \%s\ (length:\ \%d)\(\backslash\)n"{}},\ vendor\_name,\ length);}
\DoxyCodeLine{\}\ \ \ }
\DoxyCodeLine{}
\DoxyCodeLine{uint8\_t\ obj\_id,\ obj\_length;}
\DoxyCodeLine{\textcolor{keywordtype}{char}\ obj\_data[64];}
\DoxyCodeLine{\textcolor{keywordflow}{if}(\mbox{\hyperlink{group___m_o_d_b_u_s___r_e_q___d_e_f_i_d___a_p_i_ga3fc5fc5abfe4f8767ccee5c11ea3d5d5}{MB\_RespGet\_ObjectByIndex}}(\&\mbox{\hyperlink{group___m_o_d_b_u_s___m_e_s_s_a_g_e___d_e_f_i_n_e_s_ga679c526f339999281b97010876e7a295}{MODBUS\_MSG}},\ 0x00,\ \&obj\_id,\ obj\_data,\ \&obj\_length))}
\DoxyCodeLine{\{}
\DoxyCodeLine{\ \ \ \ printf(\textcolor{stringliteral}{"{}First\ object\ -\/\ ID:\ 0x\%02X,\ Data:\ \%s\(\backslash\)n"{}},\ obj\_id,\ obj\_data);}
\DoxyCodeLine{\}\ \ \ }

\end{DoxyCode}
\hypertarget{index_autotoc_md5-обновление-библиотеки}{}\doxysubsection{\texorpdfstring{5. {\bfseries{Обновление библиотеки}}\+:}{5. {\bfseries{Обновление библиотеки}}\+:}}\label{index_autotoc_md5-обновление-библиотеки}
После обновления субмодуля из Git, исходные файлы библиотеки будут обновлены, и ваши конфиги вне субмодуля не перезапишутся\+:


\begin{DoxyCode}{0}
\DoxyCodeLine{git\ submodule\ update\ -\/-\/remote}

\end{DoxyCode}
 