глава из пояснительной записки к дипломному проекту.
В данной главе подробно рассматривается приложение мониторинга и представления данных.
При выборе языка программирования, который был использован для написания приложения, рассматривались следующие критерии:
Тип аппаратной платформы. Приложение должно выполняться на сервере лаборатории нейтронной физики ОИЯИ. В настоящее время в качестве сервера ЛНФ используется компьютер Sun под управлением операционной системы Solaris 2.7, следовательно, приложение должно работать на данной аппаратно-программной платформе. Кроме того, принимая во внимание высокую производительность новых моделей компьютеров, основанных на микропроцессорах фирмы Intel, а так же их относительно невысокую стоимость, необходима возможность использования приложения на таких системах, поскольку вероятно их использование в будущем. При этом желательна возможность легкого переноса приложения с одной платформы на другую.
Работа с физическими данными. В задачу приложения входит обработка физических данных, таких как значение мощности источника, время работы и т.д. Работа с такими данными должна быть выполнена средствами языка программирования с достаточной точностью.
Роль серверного приложения. Программа выполняет задачи, характерные для серверного приложения, такие как взаимодействие с web-сервером, формирование HTML кода, и т.д. Необходимо, чтобы реализация таких функций была предусмотрена создателями языка программирования.
Перечисленным выше требованиям отвечает язык программирования Java. Java является объектно-ориентированным языком программирования, разработанным фирмой Sun Microsystems.
Основные достоинства языка Java:
Основные недостатки языка Java:
Благодаря использованию интерпретатора байт-кода приложения, написанные на языке Java, могут выполняться на различных аппаратно-программных платформах, в том числе на системах, построенных на основе микропроцессоров Intel и SPARC. Интерпретатор языка Java заранее встроен в современные операционные системы.
В Java реализованы необходимые типы данных и математические функции, а так же необходимые для визуализации графические функции.
Данный язык удобен для создания серверных приложений благодаря использованию Java сервлетов и технологии JSP. Помимо этого, язык Java обеспечивает удобный механизм взаимодействия с базами данных, что может быть полезно при дальнейшем развитии информационной системы.
Для организации хранения данных в процессе работы используются специально созданные классы . Далее приводится описание реализованных классов с указанием доступных извне методов и переменных.
Значение мощности. Класс PowerPoint. Данный класс предназначен для хранения данных, полученных в результате одного измерения средней мощности источника. Класс содержит следующие переменные:
date - дата и время измерения мощности (java.util.Date)
power - значение мощности источника (integer)
error - значение относительной погрешности (double)
Информация, которую содержит экземпляр класса, соответствует строке файла данных о мощности источника.
Набор значений мощности. Класс PowerSet. Назначение класса - сохранение ряда значений мощности и предоставление удобного механизма для последовательного обращения к ним. Помимо этого, класс предусматривает сохранение некоторых характеристик набора, таких как максимальное значение мощности и др. Содержит следующие методы:
put(PowerPoint p) - добавление значения мощности
PowerPoint get() - считывание очередного элемента набора
int size() - предоставление количества значений в наборе
reset() - обнуление номера последнего считанного значения
PowerPoint getFirstPoint() - считывание первого элемента
PowerPoint getLastPoint() - считывание последнего элемента
Кроме того, класс PowerSet содержит следующие переменные:
maxpower - максимальное значение мощности за цикл (integer)
full - длительность цикла в миллисекундах (long)
shutdown - количество отключений источника за цикл (integer)
poweron - время работы источника в миллисекундах (long)
Информация, которую содержит экземпляр класса, соответствует файлу данных о мощности источника за цикл.
Состояние нейтронных каналов. Класс BeamState. Данный класс предназначен для хранения данных о состоянии нейтронных каналов, полученных в результате одной регистрации. Класс содержит следующие переменные:
date - дата и время регистрация состояния (java.util.Date)
beam - массив состояний всех каналов (byte[12])
Информация, которую содержит экземпляр класса, соответствует строке файла данных о состоянии каналов.
Набор состояний каналов. Класс BeamSet. Назначение класса - сохранение ряда состояний каналов и предоставление удобного механизма для последовательного обращения к ним. Содержит следующие методы:
put(BeamState p) - добавление значения мощности
BeamState get() - считывание очередного элемента набора
int size() - предоставление количества значений в наборе
reset() - обнуление номера последнего считанного значения
Информация, которую содержит экземпляр класса, соответствует файлу данных о состоянии нейтронных каналов за цикл.
Функции приложения распределены между отдельными компонентами. Это позволяет упростить программирование и написать удобный для отладки исходный код. Далее подробно описано назначение каждого компонента.
Компонент загрузки данных. Класс DataSource. Данный компонент предназначен для загрузки необходимой информации из файлов данных и формирования наборов значений мощности (экземпляр класса PowerSet) и состояний нейтронных каналов (экземпляр класса BeamSet). Помимо этого, класс формирует список идентификаторов циклов, данные о которых доступны для представления. Класс DataSource содержит следующие доступные извне методы:
PowerSet getPowerSet(String name) Метод предназначен для
формирования набора значений мощности для цикла, имеющего идентификатор,
указываемый в параметре метода. В процессе выполнения из файла конфигурации
считывается путь к рабочей директории, а из идентификатора цикла формируется
имя файла. Затем производится построчное чтение файла данных о мощности
источника. При этом из данных, содержащихся в каждой строке, формируется
экземпляр класса PowerPoint, который добавляется в набор значений мощности
(экземпляр класса PowerSet). После достижения конца файла метод возвращает
заполненный набор.
BeamSet getBeamSet(String name) Метод предназначен для
формирования набора состояний нейтронных каналов для цикла, имеющего
идентификатор, указываемый в параметре метода. Работает аналогично предыдущему
методу, за тем исключением, что из каждой строки считанного файла формируется
экземпляр класса BeamState, который добавляется в набор значений состояний
каналов (экземпляр класса BeamSet).
CycleSet getCycleSet() Метод используется для получения списка
идентификаторов цикла, файлы данных которых находятся в рабочей директории. Для
этого формируются список файлов данных о мощности и список файлов данных о
состоянии каналов. Метод возвращает экземпляр класса, содержащий идентификаторы
тех циклов, для которых доступны оба файла.
Компонент графического представления. Класс QuickPlot. Компонент предназначен для формирования графика мощности импульсного источника и диаграммы состояний каналов транспортировки нейтронов. Выполняемая компонентом функция зависит от того, какой конструктор применяется для создания экземпляра класса:
QuickPlot(long min, long max, PowerSet ps, BeamSet bs) создает
экземпляр класса, который формирует изображение, содержащее график мощности и
диаграмму состояний нейтронных каналов за период времени начиная с min и
заканчивая max.
QuickPlot(long min, long max, PowerSet ps) создает экземпляр
класса, который формирует изображение, содержащее только график мощности
реактора. График представляет данные за период времени начиная с min и
заканчивая max.
QuickPlot(long min, long max, BeamSet bs) создает экземпляр
класса, который формирует изображение, содержащее только диаграмму состояний
нейтронных каналов. График представляет данные за период времени начиная с min
и заканчивая max.
В процессе работы компонента в памяти создается графический объект Image построенный на основе цветовой модели RGB с 8 битным представлением каждого цвета.
Для вычисления координат элементов графика и диаграммы производится вычисление отношения отрезка времени (max - min) к горизонтальному размеру графика мощности и диаграммы состояний нейтронных каналов:
s_x = (max - min) / width
где width - ширина графика мощности и диаграммы состояний.
Так же вычисляется отношение диапазона мощности импульсного источника к вертикальному размеру графика:
s_y = power_max / power.height
где power_max - максимальное значение мощности,
power.height - высота графика мощности.
Производится выбор необходимого числа временных меток, необходимых для построения координатной сетки, в зависимости от величины временного диапазона; составление набора, содержащего информацию о позиции каждой метки и текст, обозначающий соответствующие метке дату и время.
Затем выполняется построение границ графика мощности, границ диаграммы состояний нейтронных каналов; построение осей координатной сетки;
При построении графика мощности координаты точек вычисляются по формуле:
X = power.x + (point.date - min) / s_x Y = power.y + power.height - point.power / s_y
где power.x - отступ границы графика от левого края изображения,
point.date - момент времени, соответствующий точке,
power.y - отступ границы графика от верхнего края изображения,
power.height - высота графика мощности,
point.power - значение мощности источника.
Все действия по созданию изображения производятся во время выполнения метода getImage(int width, int height), который возвращает графический объект Image. В параметрах метода указываются размеры изображения по горизонтали и вертикали соответственно. Это делает компонент довольно универсальным, однако следует заметить, что в том случае, если размер изображения задан относительно небольшим, возможно наложение меток координатной сетки и прочие неприятности. Фактически, на странице приложения мониторинга и представления параметров, используется изображение размером 500 x 500 пикселей.
Компонент мониторинга и представления. Класс DreadBean. Основной компонент приложения. В процессе выполнения производится загрузка данных с помощью компонента DataSource, построение графика мощности и диаграммы состояний нейтронных каналов с помощью компонента QuickPlot. Затем выполняется расчет рабочих параметров, таких как:
Энергия, выделенная реактором, считается равной интегралу от мощности по времени. Фактически для каждого измерения мощности рассчитывается произведение значения мощности в мегаваттах на отрезок времени до следующего измерения, выраженный в часах. Сумма произведений для представленного отрезка времени равняется выделенной энергии в мегаватт часах.
В дальнейшем значения полученных параметров включаются в страницу представления данных status.jsp.
Компонент формирования списка циклов. Класс IndexBean. В процессе выполнения компонента производится загрузка набора циклов, данные о которых доступны для представления, и формирование элементов списка циклов. В дальнейшем список используется в индексной странице index.jsp.
Страница представления данных. Файл status.jsp. Компонент является страницей JSP и содержит HTML разметку и инструкции включения значений параметров из компонента DreadBean. Страница содержит ссылку на компонент формирования изображения.
Страница списка доступных циклов. Файл index.jsp. Компонент является страницей JSP и содержит HTML разметку и инструкции включения элементов списка циклов из компонента IndexBean.
Компонент формирования изображения. image servlet. Компонент предназначен для преобразования объекта Image в графическое изображение формата GIF. Для формирования изображения используется класс GIFOutputStream написанный Кэрри Шетлайном и распространяемый бесплатно.
Функции приложения, связанные с формированием страниц в ответ на запросы пользователя, можно условно разделить на две категории:
Далее изложена последовательность действий, выполняемая при обработке запросов вышеуказанных страниц.
Формирование индексной страницы. При формировании индексной страницы параметры запроса не используются. В случае если в запросе присутствуют параметры, они игнорируются. Выполняется следующая последовательность действий:
Передача сформированной страницы пользователю выполняется web-сервером без участия приложения мониторинга и представления данных.
Формирование страницы представления данных. При формировании страницы представления данных приложение получает и анализирует параметры запроса пользователя, если они присутствуют. Параметры указывают информацию о цикле и запрашиваемом временном отрезке в пределах этого цикла.
Используется стандартный механизм передачи параметров, используемый в работе протокола HTTP [5]. Запрос может содержать следующие параметры:
cycle - идентификатор цикла
from - начало временного отрезка
to - конец временного отрезка
В случае отсутствия в запросе какого-либо из перечисленных параметров, для отсутствующего запроса принимаются следующие значения по умолчанию:
cycle - текущий цикл
from - начало цикла
to - конец цикла
Таким образом, запрос без параметров подразумевает запрос полной информации о текущем цикле.
Значение идентификатора цикла представляет собой восьмизначное целое число, которое формируется из даты первого измерения, входящего в цикл и позволяет определить названия файлов данных о мощности и состоянии нейтронных каналов.
В процессе формирования страницы представления данных выполняются следующие действия:
Передача сформированной HTML-страницы и графического файла пользователю выполняется web-сервером без участия приложения.
Иллюстрация 3.1 содержит блок-схему, на которой представлено взаимодействие компонентов приложения между собой.

Рис. 3.1 Схема взаимодействия компонентов приложения
На иллюстрации 3.2 представлена схема преобразования данных в процессе формирования страницы представления рабочих параметров импульсного источника нейтронов.

Рис. 3.2 Схема преобразования данных
Файл конфигурации содержит информацию, необходимую для чтения данных из файлов результатов измерений. Файл имеет название source.properties и содержит следующие параметры:
source.encoding - кодировка символов файлов данных
source.directory - название директории, содержащей файлы данных
source.timezone - временная зона местоположения источника
Каждый параметр задается с начала строки. Значение параметра отделяется от имени символом равенства. Например, строка, содержащая значение параметра кодировки равное iso8859-1 имеет вид:
source.encoding = iso8859-1
Подробно о допустимых значениях параметров указано в руководстве по установке и настройке программы.
Под обработкой ошибок понимается выполнение приложением некоторых действий в случае возникновения нештатной ситуации, такой как, например, неправильные значения параметров запроса, поврежденный файл данных и т. д. В зависимости от типа ошибки целью обработки данной ошибки является либо сообщение пользователю о возникновении ошибки и ее вероятных причинах, либо обеспечение дальнейшего нормального выполнения приложения.
Для решения таких задач используется механизм обработки исключительных ситуаций, встроенный в язык программирования Java [2]. Он позволяет применить одинаковый подход к обработке как ошибок, возникающих в процессе работы встроенных в Java методов, так и логических ошибок работы приложения.
В программе используются следующие классы исключений:
BrowseException Исключение вызывается при возникновении ошибок во время формирования списка доступных для представления циклов. Вызов исключения приводит к возвращению пользователю сообщения, в котором указана причина ошибки.
LoadException Исключение вызывается при возникновении ошибок во время загрузки файла данных в память. Возможные причины следующие:
Вызов исключения приводит к возвращению пользователю сообщения, в котором указана причина ошибки.
ResourceException Исключение вызывается при возникновении ошибок во время считывания параметров из файла конфигурации. Ниже перечислены следующие возможные причины возникновения ошибки:
Вызов исключения приводит к возвращению пользователю сообщения, в котором указана причина ошибки. В случае отсутствия необходимого параметра пользователь получает сообщение об ошибке с указанием параметра.
PaintException Исключение вызывается при возникновении ошибок во время построения графика мощности источника и диаграммы состояний нейтронных каналов.
В случае если нормальное завершение приложения невозможно, пользователь получает сообщение об ошибке вместо данных мониторинга. Пример страницы сообщения об ошибке представлен на иллюстрации 4.4 в главе 4.