mirror of
https://github.com/eddyem/tsys01.git
synced 2026-03-20 00:31:03 +03:00
fixed doc
This commit is contained in:
BIN
doc/main.pdf
BIN
doc/main.pdf
Binary file not shown.
179
doc/main.tex
179
doc/main.tex
@@ -1,6 +1,7 @@
|
||||
\documentclass[a4paper,12pt]{extarticle}
|
||||
\usepackage{/home/eddy/ed}
|
||||
\usepackage{bytefield}
|
||||
\usepackage{pdflscape}
|
||||
\graphicspath{{./pic/}}
|
||||
\nocolon
|
||||
|
||||
@@ -38,9 +39,10 @@
|
||||
остро эта проблема проявлялась при
|
||||
получении ответа от всех контроллеров на <<широковещательный>> запрос).
|
||||
|
||||
В данном документе описано состояние системы на сентябрь 2024\,г. Опущены все факты, упомянутые в
|
||||
вышеназванном техническом отчете (его, как и данный документ, можно найти в репозитории с
|
||||
кодом~\footnote{\url{https://github.com/eddyem/tsys01}}).
|
||||
В данном документе описано состояние системы на сентябрь 2024\,г. Он является дополнением к
|
||||
вышеназванному техническому отчету (его, как и данный документ, можно найти в репозитории с
|
||||
кодом~\footnote{\url{https://github.com/eddyem/tsys01}}). Принципиальная схема контроллера термодатчиков
|
||||
приведена на рис.~\ref{schematic}.
|
||||
|
||||
\section{Топология системы}
|
||||
Основной компьютер, осуществляющий доступ к свежесобранным данным, установлен в металлическом щитке
|
||||
@@ -224,6 +226,28 @@ $-10\div+20\,\degr$C,
|
||||
|
||||
Итого, из 80~закрепленных на ГЗ БТА датчиков надежные показания дают~70.
|
||||
|
||||
\subsection{Используемые контакты микроконтроллера}
|
||||
\begin{description}
|
||||
\item[I2C:] PB6 (SCL), PB7 (SDA)~-- шина данных датчиков.
|
||||
\item[USART1:] PA9 (Tx), PA10 (Rx)~-- (в новой версии не используется) выводы USART1.
|
||||
\item[CAN:] PB8 (Rx), PB9 (Tx)~-- коммуникации по CAN-шине.
|
||||
\item[I2C MUX:] PB0..PB2 (соответствующие биты адреса, PB0~-- младший), PB12 ($\overline{\mathrm{EN}}$)~--
|
||||
управление мультиплексором, подключающим к I2C микроконтроллера соответствующую пару датчиков.
|
||||
\item[POWER:] PB3 (overcurrent), PA8 (EN)~-- питание (через драйвер TPS2051)
|
||||
термодатчиков; при превышении потребляемого тока величины 0.5\,А, PB3 подтягивается к земле.
|
||||
\item[ADC:] PA0 (V12/4.93), PA1 (V5/2), PA3 (I12 - 1V/A), PA6 (V3.3/2)~-- входы АЦП, здесь
|
||||
\begin{description}
|
||||
\item[V12~--] напряжение питания 12\,В, поступающего на вход АЦП через делитель напряжения $1:4.93$;
|
||||
\item[V5~--] напряжение питания 5\,В после импульсного преобразователя, через делитель $1:2$;
|
||||
\item[V3.3~--] напряжение питания термодатчиков 3.3\,В после линейного преобразователя, через делитель $1:2$;
|
||||
\item[I12~--] потребляемый ток (падение в 1\,В соответствует току в 1\,А), опция измерения силы тока может отсутствовать,
|
||||
если не распаян датчик~MAX471.
|
||||
\end{description}
|
||||
\item[LEDs:] PB10 (LED0), PB11 (LED1)~-- сигнальные светодиоды (могут включаться для отладки, в обычном состоянии
|
||||
отключены): LED0 (ближайший к разъемам датчиков)~-- пульсирует 1~раз в секунду, LED1~-- горит при нормальном состоянии
|
||||
коммуникации по CAN~шине.
|
||||
\end{description}
|
||||
|
||||
\section{Протоколы связи}
|
||||
Протокол связи с собственно термодатчиками по шине I2C документирован производителем, поэтому здесь
|
||||
не озвучивается.
|
||||
@@ -382,23 +406,24 @@ N+M$,
|
||||
|
||||
|
||||
\subsection{Текстовый протокол данных при работе через USB}
|
||||
Связь управляющего компьютера с любым контроллером системы сбора возможна при помощи шины USB.
|
||||
|
||||
Формат команды:
|
||||
Рабочий протокол включает в себя служебные команды, предназначенные для отладки. Формат команды:
|
||||
\verb'[<num>]<char><endline>', где \verb'<char>' "--- символ команды (большая или малая латинская
|
||||
буква), а \verb'<endline>' "--- символ завершения строки (\verb'\n'). Параметр \verb'[<num>]'
|
||||
используется лишь для основной части команд в верхнем регистре, означая номер контроллера, которому
|
||||
будет осуществлена передача следующей команды.
|
||||
Все команды в нижнем регистре запускаются исключительно локально на данном контроллере (существуют
|
||||
также команды, не имеющие <<локального>> варианта, как и команды, не имеющие <<сетевого>>).
|
||||
<<Сетевые>> команды могут быть отправлены с любого контроллера: как ведущего, так и ведомого. При
|
||||
получении команды контроллер сохраняет номер адресата, отправляя ответ с нужным~ID.
|
||||
обязателен для команд в верхнем регистре (данные команды запускают передачу по шине CAN, кроме
|
||||
команды \texttt{O}, являющейся на самом деле локальной), с командами в нижнем регистре он не
|
||||
используется (т.к. это~--- локальные команды); данный параметр является номером контроллера в шине
|
||||
(номером, установленным микропереключателями на плате). Часть команд не имеет локального или
|
||||
<<глобального>> варианта.
|
||||
|
||||
Далее приводится список основных команд.
|
||||
|
||||
\begin{description}
|
||||
\item[@] инвертировать флаг режима отладки: при установленном флаге контроллер выдает
|
||||
дополнительные сообщения в USB (на посылки в CAN-шину данный флаг не влияет);
|
||||
\item[A] разрешение подчиненному узлу отправлять сообщения в CAN-шину (нормальный режим работы);
|
||||
\item[A] разрешение подчиненному узлу отправлять сообщения в CAN-шину (нормальный режим работы),
|
||||
если было отключено командой \texttt{S};
|
||||
\item[a] получение <<сырых>> значений измерений АЦП микроконтроллера;
|
||||
\item[B] посылка тестового сообщения по CAN-шине (на него не приходит ответа, лишь в USB
|
||||
получателя выводится сообщение <<DUMMY>>, если, конечно, к USB кто-либо подключен);
|
||||
@@ -473,38 +498,85 @@ ACTION=="add", ENV{USB_IDS}=="0483:5740", ATTRS{interface}=="?*",
|
||||
SYMLINK+="$attr{interface}%c", MODE="0666", GROUP="tty"
|
||||
\end{verbatim}
|
||||
|
||||
Для возможности разделения последовательного устройства между несколькими независимыми процессами
|
||||
(опрос температурных данных, работа с вентиляторами, диагностика), запускается
|
||||
прокси-демон\footnote{\url{https://github.com/eddyem/eddys_snippets/tree/master/serialsock}},
|
||||
предоставляющий сетевой доступ по заданному локальному INET-сокету или же UNIX-сокету. Полученные
|
||||
из последовательного устройства данные транслируются всем подключенным клиентам, а данные от
|
||||
клиентов записываются в устройство.
|
||||
На управляющем системой термомониторинга компьютере имеется простейший веб-интерфейс для
|
||||
графического и текстового доступа к данным, на нем же запущены все основные демоны:
|
||||
\begin{itemize}
|
||||
\item прокси\footnote{\url{https://github.com/eddyem/eddys_snippets/tree/master/serialsock}} для возможности
|
||||
одновременной работы с последовательным портом нескольких клиентов;
|
||||
\item опроса\footnote{\url{https://github.com/eddyem/tsys01/tree/master/src/netdaemon}} контроллеров термодатчиков;
|
||||
\item NGINX для выдачи статических HTML-файлов;
|
||||
\item баш-скрипты\footnote{\url{https://github.com/eddyem/tsys01/tree/master/src/netdaemon/scripts}}, позволяющие
|
||||
получать в веб-интерфейсе параметры частотного привода вентиляторов оправы и изменять их.
|
||||
\end{itemize}
|
||||
|
||||
Основной сетевой демон\footnote{\url{https://github.com/eddyem/tsys01/tree/master/src/netdaemon}}
|
||||
подключается к сокету прокси-демона, а также открывает общедоступный сетевой сокет, через который
|
||||
любой клиент может получить данные последних измерений. Кроме того, при помощи \verb|gnuplot|
|
||||
каждые 15\,минут формируются изображения с распределением температуры по обоим слоям установки
|
||||
термодатчиков. Данные доступны через веб.
|
||||
Еще один демон\footnote{\url{https://github.com/eddyem/tsys01/tree/master/src/BTAmirtemp}} необходимо запустить на
|
||||
основном управляющем компьютере АСУ БТА. Его задача~--- один раз в минуту получать по сети значение средней
|
||||
температуры зеркала и внедрять его в систему управления.
|
||||
|
||||
При помощи \verb|netcat| и баш-скриптов реализован также веб-интерфейс управления вентиляторами,
|
||||
расположенными внутри оправы ГЗ~БТА. На рис.~\ref{fans} продемонстрирован простейший интерфейс,
|
||||
доступный по адресу \url{http://mirtemp.sao.ru/fans.html}. Переключатели <<Low>>, <<Mid>> и
|
||||
<<High>> позволяют установить заданную скорость вращения вентиляторов. Флажок <<Run middle>>
|
||||
включает вентилятор, расположенный в средней части зеркала (он захватывает воздух из подкупольного
|
||||
пространства, в отличие от остальных вентиляторов, которые лишь перемешивают внутри оправы~ГЗ). При
|
||||
выборе флажка <<Stop>> выключаются все вентиляторы. Кнопка <<Set>> активирует текущий выбор.
|
||||
Под ней отображаются текущие значения потребляемого вентиляторами тока и скорость вращения их
|
||||
двигателей (центральный вентилятор включается пускателем, поэтому в статистике не участвует).
|
||||
Прокси-демон предоставляет сетевой доступ по заданному локальному INET-сокету или же UNIX-сокету.
|
||||
Полученные из последовательного устройства данные транслируются всем подключенным клиентам, а данные
|
||||
от клиентов записываются в устройство.
|
||||
|
||||
Демон опроса подключается к сокету прокси-демона, а также открывает общедоступный сетевой сокет,
|
||||
через который любой клиент может получить данные последних измерений. Кроме того, при помощи
|
||||
\verb|gnuplot| каждые 15\,минут формируются изображения с распределением температуры по обоим слоям
|
||||
установки термодатчиков. Данные доступны через веб.
|
||||
|
||||
\begin{pict}
|
||||
\includegraphics[width=0.4\textwidth]{fans}
|
||||
\caption{Управление вентиляторами.}
|
||||
\label{fans}
|
||||
\label{gfans}
|
||||
\end{pict}
|
||||
|
||||
На рис.~\ref{t0} и~\ref{t1} приведены примеры изображений распределения температур. В тех местах,
|
||||
где термодатчики отсутствуют, либо же их показания выбиваются за $3\sigma$ от медианной по зеркалу,
|
||||
данные не отображены.
|
||||
По адресу \url{http://mirtemp.sao.ru/fans.html} располагается интерфейс управления двигателями
|
||||
системы вентиляции~\look{gfans}. Так как <<сервер>>, обслуживающий запросы из этого
|
||||
веб-интерфейса~--- по сути обертка в баш-скрипт утилиты \texttt{netcat}, никакой возможности
|
||||
аутентификации пока не предусмотрено. Учитывая то, что слабый одноплатник управления системой
|
||||
заменен на более мощный безвентиляторный компьютер, в будущем возможно изменение (как минимум~---
|
||||
простейшая аутентификация средствами NGINX, либо отдельный демон на библиотеке \texttt{onion}).
|
||||
|
||||
Интерфейс осуществляет запросы серверу по порту 8080, получая текущие значения потребляемого двигателями тока и скорости
|
||||
их вращения (кроме скорости вращения центрального вентилятора, т.к. он управляется реле). В интерфейсе можно выбрать
|
||||
один из вариантов <<Set speed>>:
|
||||
\begin{itemize}
|
||||
\item Low~-- наименьшая скорость вращения, 300~об/сек;
|
||||
\item Mid~-- средняя скорость, 800~об/сек;
|
||||
\item High~-- наибольшая скорость, 1300~об/сек;
|
||||
\item Run middle~-- включение центрального вентилятора (забор воздуха из подкупольного в оправу ГЗ БТА),
|
||||
эквивалентно вызову \texttt{SEWcontrol}\footnote{\url{https://github.com/eddyem/eddys_snippets/tree/master/serialsockCANmanage}}
|
||||
с нулевой скоростью (эта опция включает реле);
|
||||
\item Stop~-- выключение всех (в т.ч. и центрального) двигателей.
|
||||
\end{itemize}
|
||||
|
||||
После нажатия кнопки <<Set>> выбранный вариант посылается серверу и данная команда помещается в служебный файл,
|
||||
читаемый в цикле баш-скриптом \texttt{Runsewctrl} с запуском \texttt{SEWcontrol} по необходимости.
|
||||
|
||||
\begin{pict}
|
||||
\includegraphics[width=0.7\textwidth]{T0}
|
||||
\caption{Пример изображения распределения температур приповерхностного слоя.}
|
||||
\label{t0}
|
||||
\end{pict}
|
||||
|
||||
\begin{pict}
|
||||
\includegraphics[width=0.7\textwidth]{T1}
|
||||
\caption{Пример изображения распределения температур тыльной поверхности.}
|
||||
\label{t1}
|
||||
\end{pict}
|
||||
|
||||
По адресам \url{http://mirtemp.sao.ru/T0.html} и \url{http://mirtemp.sao.ru/T0.html} можно получить
|
||||
доступ к изображениям распределения температуры за последние 15~минут На рис.~\ref{t0} и~\ref{t1}
|
||||
приведены примеры этих изображений. В тех местах, где термодатчики отсутствуют, либо же их показания
|
||||
выбиваются за $3\sigma$ от медианной по зеркалу, данные не отображаются.
|
||||
|
||||
Из пользовательского ПО (например, так АСУ БТА получает данные средней температуры ГЗ) возможен более удобный
|
||||
доступ к данным (также можно выполнять и обращения из браузера для получения данных в табличном виде) при
|
||||
запросе к серверу по порту~4444. Веб-запрос может быть как GET вида \url{http://mirtemp.sao.ru:4444/T0}
|
||||
(а также: T1 и Tmean), так и POST. Аналогично можно работать через сокет, открыв его и посылая нужные команды,
|
||||
получая от сервера соответствующий ответ.
|
||||
|
||||
Температура Tmean считается как среднее арифметическое от всех показаний термодатчиков, размещенных на ГЗ БТА,
|
||||
за исключением выбросов, превышающих $3\sigma$ от их медианной величины (чтобы не учитывать неправильные
|
||||
или ошибочные значения).
|
||||
|
||||
Вся подробная информация: исходные коды, схемы и т.п. размещена в
|
||||
репозитории\footnote{\url{https://github.com/eddyem/tsys01}}.
|
||||
@@ -532,19 +604,36 @@ ACTION=="add", ENV{USB_IDS}=="0483:5740", ATTRS{interface}=="?*",
|
||||
бы поддерживать на заданном уровне температуру ГЗ~БТА. Управление этим кондиционером~--- еще одна
|
||||
задача следующего поколения разработчиков.
|
||||
|
||||
\begin{pict}
|
||||
\includegraphics[width=0.7\textwidth]{T0}
|
||||
\caption{Пример изображения распределения температур приповерхностного слоя.}
|
||||
\label{t0}
|
||||
\end{pict}
|
||||
\subsection{Архивирование данных}
|
||||
Для архивирования данных на любом компьютере в сети необходимо в файл \texttt{/etc/crontab} добавить следующую строку:
|
||||
\begin{verbatim}
|
||||
# get data from mirtemp
|
||||
0-55/5 * * * * user /path/to/getdata /path/to/MirtempData
|
||||
\end{verbatim}
|
||||
|
||||
\begin{pict}
|
||||
\includegraphics[width=0.7\textwidth]{T1}
|
||||
\caption{Пример изображения распределения температур тыльной поверхности.}
|
||||
\label{t1}
|
||||
\end{pict}
|
||||
Т.е. с интервалом в 5~минут запускать от имени пользователя \texttt{user} скрипт \texttt{getdata}
|
||||
(см. в директории \texttt{scripts}), расположенный по пути \texttt{/path/to/getdata} и складывать
|
||||
полученные данные в поддиректориях \texttt{/path/to/MirtempData}. Данный скрипт при каждом запуске
|
||||
пишет данные в поддиректорию, соответствующую текущей дате в формате \texttt{YY.MM.DD}, в файлы
|
||||
\verb|HH:MM_Tx.dat|, где \texttt{x}~-- 0, 1 или~2. 2~соответствует термодатчикам в Н2, здесь уже
|
||||
есть лишь обозначение координат: $(1,0)$~-- датчик внутри щита с контроллером, компьютером и блоком питания;
|
||||
$(1,1)$~-- датчик под этим щитом, измеряющий температуру воздуха в данном месте стойки Н2.
|
||||
|
||||
Скрипт \verb'Archive_one_month' позволяет в поддиректории \texttt{archive} создать файлы-архивы заданного
|
||||
месяца (параметром этого скрипта является YY.MM). Весь месяц помещается в один архив.
|
||||
|
||||
Скрипты \verb|plotALLjpg| и \verb|plotjpg| позволяют сгенерировать JPEG-изображения с картами
|
||||
распределения температур на заданную дату, а \texttt{findextrems} и \texttt{findallextr}~---
|
||||
обнаружить все экстремальные значения температур среди выбранных дат.
|
||||
|
||||
\begin{landscape}
|
||||
\begin{pict}
|
||||
\includegraphics[width=1.1\columnwidth]{stm32}
|
||||
\vspace*{-5em}
|
||||
\caption{Принципиальная схема контроллера термодатчиков.}
|
||||
\label{schematic}
|
||||
\end{pict}
|
||||
\end{landscape}
|
||||
|
||||
\end{document}
|
||||
|
||||
|
||||
BIN
doc/pic/stm32.pdf
Normal file
BIN
doc/pic/stm32.pdf
Normal file
Binary file not shown.
Reference in New Issue
Block a user