fixed doc

This commit is contained in:
2024-10-23 17:43:59 +03:00
parent 3202beec31
commit c44e0cac07
11 changed files with 1981 additions and 45 deletions

Binary file not shown.

View File

@@ -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

Binary file not shown.