\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,\ \®\_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}