
- •Оглавление
- •Глава 1 анализ проблемы старения информации по рассогласованию признаков объекта и его информационной модели 5
- •Глава 2 разработка задачи обеспечения качества оперативной информации 13
- •Глава 3 контрольные примеры 34
- •Глава 4. Анализ человеко-машинного взаимодействия 48
- •Глава 5 экономическое обоснование целесообразности разработки задачи обеспечения качества оперативной информации 64
- •Введение
- •Глава 1 анализ проблемы старения информации по рассогласованию признаков объекта и его информационной модели
- •Анализ способов оценки старения информации по рассогласованию признаков объекта и его информационной модели
- •Обоснование целесообразности разработки задачи обеспечения качества оперативной информации
- •Требования к разрабатываемой задаче
- •Требования к функциям, выполняемым задачей
- •1.3.2 Требования к видам обеспечения
- •2.1.1 Обеспечение качества оперативной информации с непрерывным опросом датчиков без прогнозирования
- •2.1.2 Обеспечение качества оперативной информации с непрерывным опросом датчиков с прогнозированием
- •2.1.3 Обеспечение качества оперативной информации с циклическим опросом датчиков без прогнозирования
- •2.1.4 Обеспечение качества оперативной информации с циклическим опросом датчиков с прогнозированием
- •2.2 Разработка программы оценки временных свойств оперативных данных
- •2.2.1 Описание среды разработки программы
- •2.2.2 Структура программы
- •2.3 Разработка задачи обеспечения качества оперативной информации
- •2.4 Инструкция пользователя
- •Глава 3 контрольные примеры
- •3.1 Оценка старения информации о пассажирского движении локомотивов на Большом окружном кольце мжд
- •3.2 Оценка старения информации о процессе переработки состава на сортировочной станции
- •Глава 4. Анализ человеко-машинного взаимодействия
- •4.1 Постановка задачи
- •4.2 Результаты опроса
- •4.3 Важность и срочность информации
- •4.4 Проверка значимости различий
- •Заключение
- •Глава 5 экономическое обоснование целесообразности разработки задачи обеспечения качества оперативной информации
- •Постановка задачи
- •Расчет затрат, связанных с разработкой задачи
- •Капитальные затраты на разработку и внедрение проекта, предназначенного для анализа идентичности данных
- •Предпроизводственные затраты
- •5.3.2. Затраты на создание программных комплексов анализа идентичности данных
- •Затраты на приобретение аппаратных комплексов
- •Затраты на создание информационного и организационного обеспечения
- •Суммарные затраты на разработку и внедрение проекта
- •Текущие затраты на эксплуатацию внедряемых систем
- •Расчет основных параметров результативности проекта задачи обеспечения качества оперативной информации
- •Заключение
- •Список используемой литературы
2.2.2 Структура программы
Для графического представления структуры программы был использован инструмент моделирования AllFusion Process Modeler 7.
На
рисунке 2.3 представлена DFD
диаграмма (моделирование потоков данных)
для разрабатываемой задачи.
Рисунок 2.3 DFD диаграмма структуры разрабатываемой задачи
На рисунке 2.4 представлено функциональное моделирование IDF0 разрабатываемой задачи.
Рисунок
2.4 IDF0
диаграмма структуры разрабатываемой
задачи
На рисунке 2.5 представлено моделирование потока работ IDF3 для построения графика функции адекватных состояний системы.
Рисунок
2.5 IDF3
диаграмма функции построения графика
АС системы
2.3 Разработка задачи обеспечения качества оперативной информации
Создаем форму для ввода данных, настройки вариантов запуска программы, вывода графического и расчетных отображений результатов работы программы.
В левой части формы MainWindow располагаем рамку с заголовком groupBox под названием «Настройки». В ней находятся:
окна для ввода параметров количества состояний spinBox_N, математического ожидания времени обработки информации doubleSpinBox_M, дисперсии времени обработки информации doubleSpinBox_D, время опроса датчиков doubleSpinBox_S, количества итераций spinBox_i , частоты сбора информации для построения графика АС spinBox_j, времени задержки вывода графика на экране spinBox_t;
таблица для ввода данных tableWidget_MiDi;
кнопки «Сохранить» pushButton_Save и «Сбросить» pushButton_Reset;
рамка groupBox_2 под названием «Без датчика» с кнопками вариантов запуска программы: «Старт без прогноза» button_Start_withoutForecast и «Старт с прогнозом» button_Start_withForecast;
рамка groupBox_3 под названием «С датчиком», на которой расположены кнопки «Старт с прогнозом» button_Start_withForecast_Sensor и «Старт без прогноза» button_Start_withoutForecast_Sensor;
рамка groupBox_4 под названием «Настройка отображения», в которые помещаем поля выбора прорисовки сетки «Сетка» checkBox_Net, специальных линий при построении графиков отображения информации в системе и функции АС «Линии» checkBox_SpecNet, прорисовки риски датчика «Датчик» checkBox_Sensor и подписи значений по оси у «Значения» checkBox_ValueY.
С помощью менеджеров компоновки, таких как horizontalSpacer, horizontalLayout, verticalLayout и gridLayout выравнивает дочерние элементы горизонтально или вертикально, настраиваем корректное расположение элементов при изменении размеров окна.
Правую часть окна программы используем для получения графического отображения результатов. Панель tabWidget_3 служит для просмотра вариантов построения графиков «Без датчика» withoutSensor и «С датчиком» withSensor. На каждой из этих панелей содержатся вкладки для выбора дополнительных вариантов. Панель tabWidget, расположенная на вкладе «Без датчика», предоставляет выбор одного из вариантов: «Без прогноза» withoutForecast и «С прогнозом» withForecast. Панель tabWidget_2, расположенная на вкладке «С датчиком» предоставляет выбор вкладок «Без прогноза» withoutForecast_Sensor и «С прогнозом» withForecast_Sensor.
На панели «Без датчика» -> «Без прогноза» tabWidget расположены четыре поля для вывода графиков graph_1_withoutForecast (График функции реального изменения состояний объекта во времени), graph_2_withoutForecast (График функции изменения состояний объекта, отображенный в системе), graph_3_withoutForecast (График функции АС), graph_4_withoutForecast (График функции совпадения) и поле для вывода среднего значения функции совпадения lineEdit_withoutForecast.
На панели «Без датчика» -> «С пронозом» tabWidget расположены четыре поля для вывода графиков graph_1_withForecast (График функции реального изменения состояний объекта во времени), graph_2_withForecast (График функции изменения состояний объекта с прогнозированием, отображенный в системе), graph_3_withForecast (График функции АС), graph_4_withForecast (График функции совпадения) и поле для вывода среднего значения функции совпадения lineEdit_withForecast.
На панели «С датчиком» -> «Без прогноза» tabWidget_2 расположены четыре поля для вывода графиков: graph_1_withoutForecast_Sensor (График функции реального изменения состояний объекта во времени), graph_2_withoutForecast_Sensor (График функции изменения состояний объекта, отображенный в системе), graph_3_withoutForecast_Sensor (График функции АС), graph_4_withoutForecast_Sensor (График функции совпадения) и поле для вывода среднего значения функции совпадения lineEdit_withoutForecast_Sensor.
На панели «С датчиком» -> «С прогнозом» tabWidget_2 расположены четыре поля для вывода графиков graph_1_withForecast_Sensor (График функции реального изменения состояний объекта во времени), graph_2_withForecast_Sensor (График функции изменения состояний объекта, отображенный в системе), graph_3_withForecast_Sensor (График функции АС), graph_4_withForecast_Sensor (График функции совпадения) и поле для вывода среднего значения функции совпадения lineEdit_withForecast_Sensor.
Данная форма сохраняется в файл описания пользовательского интерфейса в формате XML (.ui) – mainwindow.ui. С помощью компилятора пользовательского интерфейса (User Interface Compiler, uic) из данного файла создается соответствующий заголовочный файл C++-ui_mainwindow.h. В результате получается графический класс Ui_MainWindow.
Далее переходим к непосредственному написанию программы.
Описываем компоненты и методы, используемые в программе.
Программа состоит из 4 основных классов – MainWindow, DataForGraphs, Graph и графического класса Ui_MainWindow.
Класс MainWindow служит каркасом всей программы. Он наследует класс QMainWindow, который предоставляет главное окно приложения. Главное окно предоставляет структуру для создания пользовательского интерфейса приложения. Qt имеет класс QMainWindow и связанные с ним классы для управления главным окном. В классе MainWindow создаются классы DataForGraphs, Graph, Ui_MainWindow, обеспечивается механизм сохранения и загрузки входных данных, работа таймера.
С помощью слота void on_spinBox_N_valueChanged(int arg1) происходит информирование программы о том, что произошло изменение текущего значения окна on_spinBox_N. Это обеспечивается механизмом сигналов и слотов в Qt. В данном слоте реализовано изменения количества строк в таблице tableWidget_MiDi в соответствии со значением окна on_spinBox_N.
С помощью слотов void on_pushButton_Reset_clicked(), void on_pushButton_Save_clicked() происходит информирование программы о том, что произошло нажатие мышью на соответствующую кнопку pushButton_Reset или pushButton_Save. В слоте, который обрабатывает нажатие на кнопку «Сохранить», реализовано сохранение входных параметров в файл, посредством объекта settings класса QSettings. В слоте, который обрабатывает нажатие на кнопку «Сбросить», реализована загрузка входных параметров из файла, посредством объекта settings класса QSettings. Данный слот вызывается в конструкторе класса MainWindow.
С помощью слотов void on_button_Start_withoutForecast_clicked(), void on_button_Start_withForecast_clicked(), void on_button_Start_withoutForecast_ Sensor_clicked(), void on_button_Start_withForecast_Sensor_clicked() происходит информирование программы о том, что произошло нажатие на соответствующую кнопку button_Start_withoutForecast, button_Start_ withForecast, button_Start_withoutForecast_Sensor, button_Start_withForecast_ Sensor. Данный слот запускает процесс построения соответствующих графиков.
С помощью слотов
void on_graph_4_withoutForecast_mouseDoubleClick(),
void on_graph_4_withForecast_mouseDoubleClick(),
void on_graph_4_withoutForecast_Sensor_mouseDoubleClick() ,
void on_graph_4_withForecast_Sensor_mouseDoubleClick()
происходит информирование программы о том, что произошло двойное нажатие на соответствующий график graph_4_withoutForecast, graph_4_withForecast, graph_4_withoutForecast_Sensor, graph_4_withForecast_Sensor. Данный слот создает объект uiFor4Graph класса Graph, представляющий собой отдельное окно с графиком. Соответственно в зависимости по какому графику будет двойное нажатие мыши, тот график и отобразится в отдельном окне.
Слот void on_uiFor4Graph_destroyed() информирует программу о закрытия окна uiFor4Graph . В нем реализовано обнуление указателя uiFor4Graph.
Слот void on_graph_1_graphComplete() информирует программу об окончания процесса построения графика graph_1_withForecast, graph_1_withoutForecast, graph_1_withForecast_Sensor или graph_1_withoutForecast_Sensor. В нем реализован процесс построения соответствующего второго и третьего графика.
Слот void on_timer_timeout() информирует программу о срабатывания таймера на ожидание задержки перед построением следующего набора графиков. В данном слоте вызывается метод void _drawingGraphs().
Слот void _drawOnly4Graphs() информирует программу о срабатывания таймера на ожидание задержки перед построением четвертого графика. Собственно в данном слоте реализовано построение всех графиков. Также происходит очистка поля вывода графиков с помощью метода clearGraph().
С помощью метода bool initCoordinates (DataForGraphs::Param &prm) происходит считывание входных данных с формы для построения графиков. В качестве входного параметра передается ссылка на объект prm. В данный объект и запишутся данные. Данный метод возвращает значение true если данные успешно прочитаны. В случае возврата методом initCoordinates значение false произойдет вывод на экран сообщения об ошибке с помощью класса QMessageBox.
Метод void drawingGraphs(DataForGraphs::Data data) начинает процесс построения графиков по данным data. В данном метода вызывается метод _drawingGraphs и происходит старт таймера timer.
Метод void _drawingGraphs() строит соответствующий первый график.
Метод void closeEvent(QCloseEvent */*event*/) служит для отслеживания события закрытия главного окна проекта.
Метод void on_button_Start() начинает подготовку построения графика. В нем вызываются: метод initCoordinates, который считывает входные данные с формы; метод start объекта dataForGraphs, который рассчитывает данные для построения графиков; метод drawingGraphs, который начинает процесс построения графиков.
Так как в программе реализовано 4 возможных варианта запуска программы, то предусмотрен признак построения выбранного типа графика SignGraph.
Класс DataForGraphs производит расчет данных для построения графиков.
Метод QList<double> randomizerNormalDistr(int n, double m, double d) генерирует n случайных чисел, распределенных по нормальному закону с математическим ожиданием m и дисперсией d.
Метод Data start(Param param) подсчитывает по входным параметрам param данные для построения графика. Эти данные структурированы, формат описан структурами Data, DataOneType, DataOnePass, Coordinates. Структура Coordinates имеет переменные для сохранения координат точки графика. В структуре DataOnePass есть переменные для построения одного набора первых трех графиков. Структура DataOneType имеет набор переменных для сохранения данных для построения всех наборов четырех графиков одного типа, то есть или с датчиком или без.
Также в классе DataForGraphs описан формат входных параметров для метода start – структура Param.
Класс Graph служит для рисования графика в окне. Он наследует класс QFrame, который является базовым классом для графических окон.
Данный класс имеет 2 сигнала: void graphComplete(), void mouseDoubleClick(). Сигнал graphComplete испускается классом, когда график будет нарисован по новым координатам. Сигнал mouseDoubleClick испускается, когда происходит двойное нажатие мыши по области формы, отводимой классу Graph.
Класс хранит настройки отображения графика в приватной локальной переменной settings типа TSettingsGraph. Координаты для построения графика хранятся в листах listCoordinatesGraph, listCoordinatesHistogram типа QList<TCoordinates>.
Метод void settingsToDefault() сбрасывает настройки отображения графика по умолчанию. Данная функция вызывается в конструкторе класса Graph.
Метод void setCoordinates(QList<TCoordinates> listCoordinatesGraph, QList<TCoordinates> listCoordinatesHistogram) публичный, служит для установки новых координат по которым строится график. Данный метод сохраняет новые координаты в локальные переменные listCoordinatesGraph, listCoordinatesHistogram и вызывает функцию update(). Эта функция инициирует перерисовку графика. В качестве координат будут браться уже новые значения. По окончании рисования графика будет испущен сигнал graphComplete.
Методы QList<TCoordinates> getListCoordinatesGraph(), QList<TCoordinates> getListCoordinatesHistogram() служат для получения координат, по которым строится график.
Метод void setSettings(TSettingsGraph settings) служит для изменения настроек отображения графика. Также инициирует перерисовку графика, но после окончания рисования графика сигнал graphComplete не будет испущен.
Метод TSettingsGraph getSettings() служит для получения настроек отображения графика.
Метод void clearGraph() очищает переменные координат. Это приводит к рисованию «пустого» графика.
Также в классе Graph переопределены два события: void paintEvent(QPaintEvent *event), void mouseDoubleClickEvent( QMouseEvent * event ). Метод mouseDoubleClickEvent срабатывает, когда происходит двойное нажатие по области класса Graph. В реализации данного метода испускается сигнал mouseDoubleClick, описанный ранее.
Метод paintEvent вызывается всегда, когда требуется перерисовать окно класса Graph. В частности это метод вызывается после вызова функции update, после изменения положения главного окна на экране монитора, изменение размера окна и т.д. В методе paintEvent, собственно, и реализовано рисование самого графика. Рисуется график с помощью класса QPainter. Этот класс выполняет низкоуровневое рисование на формах и других устройствах рисования. Используются функции drawLine, drawText, drawPolyline, drawPoints и drawRect класса QPainter, соответственно, для рисования линий, текста, полилиний (графический примитив, являющийся соединением отрезков линий и дуг), точек и прямоугольников. Также используются функции setPen,setBrush, setFont, setFontsetRenderHint класса QPainter для установки настроек рисования, соответственно, «пера», «кисти», шрифтов, сглаживания границ примитивов или текста. Функции save() и restore() класса QPainter сохраняют текущий набор настроек и восстанавливают сохранённые настойки.