Имя:
TemperatureSensor
Ответственность:
Поддержание информации о текущей температуре. Операции:
CurrentTemperature – текущая температура
SetLowTemperature - установка минимальной температуры
setHighTemperature — установка максимальной температуры Атрибуты:
temperature - температура
Название операции CurrentTemperature (текущая температура) говорит само за себя. Назначение двух других операций (установка минимальной и максимальной температур) прямо определяется требованием к системе, а именно необходимостью проведения калибровки датчиков. Сигнал от каждого датчика - это число с фиксированной точкой из некоторого рабочего диапазона, граничные значения которого должны быть заданы. Промежуточные значения температуры вычисляются простой линейной интерполяцией между этими двумя точками, как показано на рис. 2.2.
Можно задать закономерный вопрос: зачем мы создается специальный класс для данной абстракции, когда в требованиях к системе ясно сказано, что температурный датчик может быть только один? Это верно, но в целях обеспечения возможности повторного использования абстракции мы все же выделяем ее в отдельный класс. На самом деле количество температурных датчиков не должно влиять на архитектуру нашей системы, и, выделяя отдельный класс TemperatureSensor, мы открываем возможность его использования в других программах подобного типа.
Абстракция для датчика барометрического давления может выглядеть следующим образом:
Имя:
Pressuresensor
Ответственность:
Поддержание информации о текущем барометрическом давлении. Операции:
currentPressure – текущее давление
setLowPressure – установка минимального давления
setHighPressure - установка максимального давления Атриуты:
pressure - давление
Абстракцию, соответствующую датчику влажности, можно определить следующим образом:
Имя:
Humiditysensore
Ответственность:
Поддержание информации о текущей влажности, выраженной в процентах от 0% до 100%.
Операции:
CurretnHumidity - текущая влажность
SetLowHumidity - установка минимальной влажности
SetHighHumidity - установка максимальной влажности Атрибуты:
Humidity - влажность
Абстракция для датчика скорости ветра может выглядеть следующим образом;
Имя:
WindSpeedSensore
Ответственность:
Поддержание информации о текущей скорости ветра. Операции:
CurrentSpeed - текущая скорость
SetLowSpeed - установка минимальной скорости
SetHighSpeed - установка максимальной скорости Атрибуты:
speed - скорость
Требования к системе не предполагают возможности получения скорости непосредственно от датчика; текущая скорость ветра должна определяться как отношение числа оборотов на счетчике к величине интервала времени, за которое производились измерения. Полученное число затем надо умножить на калибровочный коэффициент, значение которого определяется конструкцией измерительного устройства. Этот алгоритм должен быть, естественно, реализован внутри класса. Клиенты не должны заботиться о том, каким образом посчитана текущая скорость ветра.
Последний рассматриваемый датчик - датчик определения направления ветра - несколько отличается от всех остальных, так как он не нуждается в вычислении минимальных и максимальных значений. Мы можем определить данную абстракцию следующим образом:
Имя:
WindDirectionSensor
Ответственность:
Поддержание информации о текущем направлении ветра, указываемом как точка на розе ветров. Операции:
currentDirection - текущее направление Атрибуты:
direction - направление
Чтобы объединить все классы, относящиеся к датчикам, в одну иерархию, имеет смысл создать еще один абстрактный базовый класс TDatchic, который является непосредственным суперклассом для всех классов. Рис. 2.3 иллюстрирует полную иерархию классов датчиков.
Рис.2.3 – Иерархия классов датчиков
Однако требования к системе подразумевают наличие общего поведения для всех трех вышеперечисленных классов. В частности, мы должны обеспечить показ текущих значений датчиков в графической форме.
Дня этого имеет смысл создать простой класс WindIndicator для графического представления направления ветра. Изолированный анализ поведения этого класса дает в первом приближении следующий результат:
Имя:
Ответственность:
Графическое представления направления ветра. Операции:
Update - отображение текущего направления ветра.
Абстракций для индикатора температуры TemperatureIndicator может выглядеть следующим образом:
Имя:
TemperatureIndicator
Ответственность:
Графическое представления величины температуры.
Update — отображение текущей температуры.
Абстракция для индикатора атмосферного давлении PressureIndicator может выглядеть следующим образом:
Имя:
PressureIndicator
Ответственность:
Графическое представления величины атмосферного давления. Операции:
Update - отображение текущего значения атмосферного давления.
Абстракция для индикатора влажности воздуха HumidityIndicator может выглядеть следующим образом:
Имя:
HumidityIndicator
Ответственноcть:
Графическое представления величины влажности воздуха. Операции:
Update - отображение текущего значения влажности воздуха.
Чтобы объединить все классы, относящиеся к индикаторам, в одну иерархию, имеет смысл создать еще один абстрактный базовый класс Indicator, который является непосредственным суперклассом для всех классов. Рисунок 2.4 иллюстрирует иерархию классов индикаторов.
Рисунок 2.4 - Иерархия классов индикаторов
2.2 Взаимодействие объектов
В системе имеется глобальный объект-сервер и четыре объекта-датчика. Их взаимодействие заключается в следующем. Датчик отсылает показания на сервер в несколько этапов. Сначала полученное значение записывает в динамический список, затем по истечении заданного момента времени он берет первое значение из очереди и суммирует его с предыдущим. Потом проверяется заданное число на осреднение значения. Если мы накопили это число, то отсылается усредненное число, если же нет, то отсылается полученное значение. После вышеперечисленных действий значение из очереди удаляется. Очередь была введена затем, что интервал времени считывания значения, и его отсылки на сервер может не совпадать.
Сервер в свою очередь определяет, получил ли он текущее или усредненное значение датчика. Если он получил усредненное значение, тогда он проверяет заданный на сервере интервал времени, обновления минимакса. Если интервал времени истек, тогда значение минимакса за заданный промежуток времени сохраняется в файле отчета и пришедшее значение с датчика присваивается как текущее. Если пришедшее значение с датчика не усредненное, а текущее, тогда обновляется диаграмма текущих показаний.
Взаимодействие сервера с датчиками можно представить схемой, представленной на Рис.2.5.
Рис.2.5 — Схема взаимодействия объектов в системе
Цикл жизни датчика можно представить схемой представленной на рис. 2.6.
Рисунок 2.6 — Схема жизненного цикла датчика
3. Пути реализации критериев качества
3.1 Среда разработки
Чтобы максимально использовать преимущества объектно-ориентированного подхода программа была реализована в среде разработки Delphi 5.5 с использованием дополнительных компонент:
DinamicSkinForm v1.6 for Delphi
RX Library 2.75
Delphi была выбрана для реализации системы по следующим причинам:
Высокопроизводителъный компилятор в машинный код.
Объектно-ориентированная модель компонент.
Визуальное (а, следовательно и скоростное) построение приложений изпрограммных прототипов.
С целью улучшения интерфейса программы с пользователем и более удобного представления показаний датчиков были применены графические компоненты.
4. Руководство пользователя
4.1 Руководство по программе-серверу
4.1.2 Назначение
Программа-сервер (далее сервер) предназначена для обработки и отображение информации полученной от датчиков. Сервер может располагаться как на отдельном компьютере, так и на одном компьютере вместе с датчиками. В основные функции сервера входит:
Графическое отображение показаний датчиков;
Вычисление минимакса за заданный промежуток времени;
Ведение отчета
4.1.3 Графическое отображение показаний датчиков
Для каждого датчика отображается хронологическая диаграмма, в которой представлено последние несколько измерений, причем при приеме очередного показания датчика все остальные показания смещаются влево. Кроме этого присутствуют индикаторы для наглядного представления усредненных значений по каждому датчику. Эти индикаторы вынесены в отдельное окно, которое можно вызвать, поставив флажок в поле индикаторы в главном окне сервера.
4.1.4 Вычисление минимакса
Сервер, по каждому датчику производит мониторинг максимального и минимального значения параметра. Временной диапазон обновления этих значений может быть настроен в диалоговом окне Настройки интервалов, которое можно вызвать из основного меню Настройки --> Интервалы или нажав кнопку «Настроить» на панели инструментов внизу главного окна сервера.
4.1.5 Ведение отчета
Сервер может вести отчет, в котором содержится время приема и значения датчиков. Кроме того, через указанные промежутки времени в отчет выводится значение минимумов и максимумов. Кроме показаний датчиков в отчете отображается сведения о подключении и отключения датчиков. Для более удобного просмотра отчета можно нажать на кнопку Просмотреть лог.
4.1.6 Соединение с датчиками
Соединение датчиков с сервером осуществляется средствами самих датчиков. Сервер, при успешном соединении с датчиком, помещает в отчет сведения следующего содержания: