Files
UKSI_TEST/AllLibs/Modbus/Doc/latex/index.tex
2025-12-16 17:57:59 +03:00

264 lines
27 KiB
TeX
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
\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}