Название: Система сбора и отображения данных Отправлено: 8Observer8 от Март 06, 2014, 07:31 Привет! С работы, на которую я хочу устроиться, мне дали задание. От граммотного выполнения которого зависит моя судьба :)
Задание на разработку системы сбора и отображения данных Описание В отсеке реактора атомного ледокола есть около 10 датчиков считывающих различную информацию о работе реактора. Датчики подключенны к компьютеру с Unix подобной ОС, для обработки информации с каждого датчика запущен свой процесс или тред (в дальнейшем - "Драйвер Датчика"). Сбор информации с драйверов датчиков осуществляет установленное на этом же компьютере приложение - "Сервер Данных". На удаленном компьютере установлено приложение, отображающее полученную с датчиков информацию - "Приложение Оператора" Драйвер Датчика В каждый момент времени хранит текущее значение измеряемого датчиком параметра. Сервер Данных - Опрашивает Драйвера Датчиков и получает текущие значения. - Хранит все изменения значений датчиков. - По запросу от Приложения Оператора предоставляет следующие данные о состоянии датчиков: - текущее состояние датчика - состояние датчика на определённый момент времени - история изменений состояния датчиков за указанный период времени Приложение Оператора Запрашивает с Сервера Данных информацию и отображает ее. Задание - Разработать Драйвер Датчика, Сервер Данных и обеспечить между ними обмен данными - Обеспечить обмен данными между Сервером Данных и Приложением Оператора - Если потребуется - разработать Приложение Оператора Условия - Драйвер Датчика и Сервер Данных должны быть разработаны на .NET-или (C++(Qt)) - Технология обмена данными с Приложением Оператора может быть любая. - Приложение Оператора может быть разработанно на любой платформе и любой ОС, или может быть использованно готовое программное обеспечение. - В Драйвере Датчика в качестве источника данных можно использовать случайные значения. Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 06, 2014, 07:33 Я открыл примеры из Qt Creator'а. Ввёл в поиске Server. Там есть примеры: "Fortune Server Expample" и "Threaded Fortune Server"
Я так понимаю, что мне, во время написания приложения, нужно руководствоваться примером "Threaded Fortune Server" Опишите, пожалуйста, как можно подробнее, как с точки зрения профи должно выглядить это приложение. Название: Re: Система сбора и отображения данных Отправлено: Old от Март 06, 2014, 07:58 Опишите, пожалуйста, как можно подробнее, как с точки зрения профи должно выглядить это приложение. Печально, что вы так и не открыли книгу Гради Буч. :(Там у него один из примеров, как раз разработка системы сбора данных, правда метеорологических, но это в данном случае значения не имеет. Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 06, 2014, 08:54 Печально, что вы так и не открыли книгу Гради Буч. :( Там у него один из примеров, как раз разработка системы сбора данных, правда метеорологических, но это в данном случае значения не имеет. Это удивительно, но я нашёл такой же пример и в этой книге: "Быстрая разработка программ: принципы, примеры, практика" http://rutracker.org/forum/viewtopic.php?t=905917 Причём авторы этой книги делают ссылки на книгу и статьи Гради Буч :) (http://i.pixs.ru/storage/7/7/3/143png_9619880_11124773.png) Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 06, 2014, 08:55 Буду выполнять это задание, опираясь на эти три книги:
Быстрая разработка программ: принципы, примеры, практика (издание 2004, есть пример с метеостанцией, язык примеров - Java) Скачать: http://rutracker.org/forum/viewtopic.php?t=905917 (http://rutracker.org/forum/viewtopic.php?t=905917) Принципы, паттерны и методики гибкой разработки (издание 2011, нет примера с метеостанцией, язык примеров - C#) Скачать: http://rutracker.org/forum/viewtopic.php?t=4295746 (http://rutracker.org/forum/viewtopic.php?t=4295746) Исходники: http://www.objectmentor.com/PPP/ (http://www.objectmentor.com/PPP/) Объектно-ориентированный анализ и проектирование с примерами приложений (3-е издание) Перевод: http://rutracker.org/forum/viewtopic.php?t=3343958 (http://rutracker.org/forum/viewtopic.php?t=3343958) Оригинал: http://kickass.to/object-oriented-analysis-and-design-with-applications-3rd-editio-t2753820.html (http://kickass.to/object-oriented-analysis-and-design-with-applications-3rd-editio-t2753820.html) И на эти примеры из Qt: - Fortune Server Example - Threaded Fortune Server - Fortune Client Expample Название: Re: Система сбора и отображения данных Отправлено: Old от Март 06, 2014, 09:02 Причём автор этой книги делает ссылки на книгу и статьи Гради Буч :) Не удивительно, ребята небось просто переработали Буча для C#. :)Название: Re: Система сбора и отображения данных Отправлено: kuzulis от Март 06, 2014, 10:33 Ну нифигасе задачка. :)
Для таких случаев используют разные SCADA. Возьми готовую SCAD-у и забацай в ней то что нужно. Например можешь эту OpenScada (http://oscada.org/ru/)взять (она свободная и на Qt). В ней ты можешь и эмулировать сбор данных с датчиков и прочие няшки делать. Документация на русском, плюс там есть форум на котором ответят. [нацпол] А может и не ответят, т.к. разработчики из Украины, и там не до датчиков сейчас. :) [/нацпол] Название: Re: Система сбора и отображения данных Отправлено: OKTA от Март 06, 2014, 10:36 Его тогда программистом на работу не возьмут, если он в OpenScada будет делать ;D
к тому же в OpenScada и программировать ничего не надо - только настраивать ;D Название: Re: Система сбора и отображения данных Отправлено: kuzulis от Март 06, 2014, 10:37 Так у него ж в требованиях написано:
Цитировать Приложение Оператора может быть разраоотанно на любой платформе и любой ОС, или может быть использованно готовое программное обеспечение. Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 06, 2014, 10:51 Для таких случаев используют разные SCADA. Возьми готовую SCAD-у и забацай в ней то что нужно. Спасибо! Уверен, мне в будущем это пригодится :)Ну нифигасе задачка. :) Тут нужно понимать, что никакого ледокола нет и это просто тестовое задание :)Так у него ж в требованиях написано: Там написано, что на приложение оператора "можно забить" и использовать готовое решение. В вот Клиенты и Сервер должны быть написаны на .NET-или (C++(Qt)) Цитировать - Драйвер Датчика и Сервер Данных должны быть разработаны на .NET-или (C++(Qt)) - Приложение Оператора может быть разработанно на любой платформе и любой ОС, или может быть использованно готовое программное обеспечение. Название: Re: Система сбора и отображения данных Отправлено: OKTA от Март 06, 2014, 10:56 Пока в опенскаде этой что-либо настроишь человеческое, состаришься ;D
Название: Re: Система сбора и отображения данных Отправлено: Bepec от Март 06, 2014, 12:17 Задание простейшее на уровне 3 курса колледжа. Если убрать все красивости типо атомохода, то выливается - есть удалённый компьютер. С ним надо связаться. Нужно создать N клиентов и 1 сервер. Способ связи любой, http\сокеты\ftp. FortuneServer после переработки подойдёт на все 100%.
PS если такое не сделает парень, изучающий ООП уже ммм... ну месяца 2, то ничего он не изучал :P Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 06, 2014, 12:28 Я так понимаю, что мне нужно будет в Qt создать несколько проектов:
1) Сервер. К нему подключаются клиенты (датчики). Сервер ждёт от датчиков показаний. Сохраняет показания (вместе с датой и временем) в бинарный (или текстовый файл) 3) Клиент [1, 2, 3, ..., и т.д.]. При запуске подключается к Серверу. Отправляет серверу показания (с периодом... правда, не знаю, кто задаёт период...). 2) Приложение Оператора. Соединяется с сервером. Отображает данные с датчиков, для этого делает запросы с периодом указанных секунд (можно менять период запросов). С Приложения Оператора можно сделать запрос прислать с сервера данные за определённый промежуток времени. P.S. Пожалуйста, поправьте, если что-то не так. Название: Re: Система сбора и отображения данных Отправлено: OKTA от Март 06, 2014, 12:38 Сервер сам опрашивает датчики, судя из задания.
Сервер и датчики на одном компьютере типа, если что. Я вот только не могу понять, зачем уточнение про Unix-подобную ОС.. Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 06, 2014, 12:56 FortuneServer после переработки подойдёт на все 100%. По-моему, FortuneServer может работать только с одним клиентом. Здесь нужен ThreadedFortuneServerСервер сам опрашивает датчики, судя из задания. Да, точно! Спасибо! :)Сервер и датчики на одном компьютере типа, если что. А мне кажется, что на разных.Я вот только не могу понять, зачем уточнение про Unix-подобную ОС.. А это мне тоже непонятно, так как в задании написано можно применять фрейворк .Net, а он ведь только для Windows.Название: Re: Система сбора и отображения данных Отправлено: Bepec от Март 06, 2014, 12:59 А, ну всё правильно меня поправил OKTA. Тут гораздо проще. На 1 компе сервер и датчики. На втором клиент с оператором. Вот и всё. И как раз fortune server подойдёт на 100% :D Оператор в задании то один.
Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 06, 2014, 13:09 Да, кстати, скорее всего, вы правы, сервер, ну ,к примеру, через USB-порты считывает данные от датчиков на одной машине.
Оператор в задании то один. В задании сказано, что один. А на практике, возможно, нужно будет предусмотреть возможность запуска нескольких, ведь ледокол то большой :)Название: Re: Система сбора и отображения данных Отправлено: Bepec от Март 06, 2014, 13:18 А ещё возможно система будет общаться с ядерным реактором и в зависимости от потребления мощностей на ледоколе будет регулироваться процесс распада в ядре.
PS идите от задачи, а не от "может быть". :P Название: Re: Система сбора и отображения данных Отправлено: OKTA от Март 06, 2014, 13:23 Соответственно еще вопрос - каким методом будешь "читать данные из датчика"?
Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 07, 2014, 11:18 Соответственно еще вопрос - каким методом будешь "читать данные из датчика"? Хороший вопрос и он на данный момент самый трудный. Сейчас продумываю такую идею. В классе IcebreakerServer будут методы, которые возвращают текущее значение с датчика (сделаю случайное число из разных диапазонов для каждого датчика, чтобы их различать по данным) Код
В бессконечном цикле с задержкой по времени, буду вызывать эти функции. Название: Re: Система сбора и отображения данных Отправлено: OKTA от Март 07, 2014, 11:22 Так датчики тоже надо отдельно реализовать, разве нет?
Лучше не бесконечный цикл, а QTimer использовать я думаю и по таймауту вызывать соответствующие слоты) Название: Re: Система сбора и отображения данных Отправлено: popper от Март 07, 2014, 11:24 для обработки информации с каждого датчика запущен свой процесс или тред (в дальнейшем - "Драйвер Датчика"). Мне тоже кажется, что исходя из этой записи в ТЗ, функционал опроса датчика нужно вынести как минимум в отдельный класс.Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 07, 2014, 11:35 Так датчики тоже надо отдельно реализовать, разве нет? Как это? Я представляю, что у нас есть комьютер с кучей USB-портов. К каждому порту подсоединён свой датчик. У сервера есть такие функции, которые возвращают данные из портов: Код
Лучше не бесконечный цикл, а QTimer использовать я думаю и по таймауту вызывать соответствующие слоты) Хорошо, сделаю через QTimer. Я сейчас создал два проекта: - консольный. Назвал его: IcebreakerServer - оконный (QMainWindow). Назвал его: IcebreakerViewer Сейчас хочу наладить взаимодействие между IcebreakerViewer и IcebreakerServer на основе примеров: "Fortune Server" и "Fortune Client" для обработки информации с каждого датчика запущен свой процесс или тред (в дальнейшем - "Драйвер Датчика"). Мне тоже кажется, что исходя из этой записи в ТЗ, функционал опроса датчика нужно вынести как минимум в отдельный класс.Да, Вы правы, но для меня это пока сложно. Я для начала сделаю через функции, а потом подумаю, что дальше делать. Название: Re: Система сбора и отображения данных Отправлено: Bepec от Март 07, 2014, 11:44 А вот тут уже переход к ООП нужен, а не функциональное программирование :D
Классы: Менеджер Датчиков - Сервер - Клиент. Опрос, хранение, выдача - Запрос, получение, хранение, отдача клиенту - Получение, отображение. Название: Re: Система сбора и отображения данных Отправлено: Old от Март 07, 2014, 11:49 Как это? Я представляю, что у нас есть комьютер с кучей USB-портов. К каждому порту подсоединён свой датчик. У сервера есть такие функции, которые возвращают данные из портов: Вы серьезно? Вас не возьмут на работу. :)Вы хотите захардкодить все датчики в одном классе? А если нужно будет в процессе работы программы добавлять/удалять датчики? Они могут выходить из строя.... Почитайте уже книгу. ::) Название: Re: Система сбора и отображения данных Отправлено: OKTA от Март 07, 2014, 11:52 Ну, видимо самый просто вариант - это когда у каждого датчика свой временный файл и сервер читает эти файлы.
А вариант посложнее, это использовать именованные каналы, а соответственно для Qt - QLocalServer и QLocalSocket. Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 07, 2014, 11:54 Вы хотите захардкодить все датчики в одном классе? А если нужно будет в процессе работы программы добавлять/удалять датчики? А что мешает разработчику открыть код с классом и чуть-чуть его подкорректировать?Они могут выходить из строя.... Почитайте уже книгу. ::) Пока я полностью прочитаю эти книги... Мне нужно сочитать это с практикой. Я и в книги заглядываю, и пытаюсь на практике, что-то делать.Название: Re: Система сбора и отображения данных Отправлено: Old от Март 07, 2014, 12:00 А что мешает разработчику открыть код с классом и чуть-чуть его подкорректировать? Для этого разработчик должен находится на ледоколе. :)К тому же сделать это без остановки программы вряд ли получиться. Пока я полностью прочитаю эти книги... Мне нужно сочитать это с практикой. Я и в книги заглядываю, и пытаюсь на практике, что-то делать. Прочитайте одну главу, где разбирается пример с метеостанцией.Название: Re: Система сбора и отображения данных Отправлено: Bepec от Март 07, 2014, 12:02 Чую вся та тема с ООП не дала ничего полезного :D
Название: Re: Система сбора и отображения данных Отправлено: Old от Март 07, 2014, 12:03 Чую вся та тема с ООП не дала ничего полезного :D В той теме от ООП было только название.Название: Re: Система сбора и отображения данных Отправлено: OKTA от Март 07, 2014, 12:08 Да что вы накинулись на человека? Он же говорит, что пока не знает, как реализовать замуту с датчиками и сделает временно через функции, чтобы другую часть проекта сделать и протестировать. :)
Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 07, 2014, 12:17 Вы хотите захардкодить все датчики в одном классе? А если нужно будет в процессе работы программы добавлять/удалять датчики? Они могут выходить из строя.... Пока я сделаю датчики №1, №2 и т.д. Но ведь на самом деле они должны как-то называться? Ну, к примеру: ДатчикТемпературы, ДатчикДавления. А если делать что-то универсальное, то как клиент поймёт, что и куда выводить? Если мы изменим датчик давления на датчик температуры, то как клиент это поймёт? Вот пример клиента: (http://i6.pixs.ru/storage/5/0/4/144png_2294333_11139504.png) Да что вы накинулись на человека? Он же говорит, что пока не знает, как реализовать замуту с датчиками и сделает временно через функции, чтобы другую часть проекта сделать и протестировать. :) Совершенно верно! Я хочу сделать черновой рабочий проект, чтобы он выполнял функциональность и чтобы я потратил меньше сил и времени на это. А потом я уже буду переделывать, как надо. Улучшать и улучшать. Название: Re: Система сбора и отображения данных Отправлено: OKTA от Март 07, 2014, 12:21 Удобно при запуске каждого драйвера датчика, указывать его тип и имя, тогда не будет проблем с тем, что и где отображать.
Название: Re: Система сбора и отображения данных Отправлено: Bepec от Март 07, 2014, 12:28 Каждый датчик имеет определённый идентификатор. Не бывает безымянных датчиков :D А по идентификатору можно сделать словарь или карту. И уже по ней будет всё ясно пользователю.
А "черновые" проекты имеют свойство превращаться в постоянные, причем дальше человек уже идёт по накатанному (функциональное), а не делает по новому :) PS главное начать, а так всё комом покатится и ООП станет легко и просто :) Ну и главное иметь бумагу и карандаш. Более продвинутая версия - планшет для водных маркеров, их и тряпочку :) Название: Re: Система сбора и отображения данных Отправлено: Old от Март 07, 2014, 15:13 Пока я сделаю датчики №1, №2 и т.д. Но ведь на самом деле они должны как-то называться? Ну, к примеру: ДатчикТемпературы, ДатчикДавления. А если делать что-то универсальное, то как клиент поймёт, что и куда выводить? Например так: Код
А можно вообще оставить оператору назвать их так, как ему будет понятно. Совершенно верно! Я хочу сделать черновой рабочий проект, чтобы он выполнял функциональность и чтобы я потратил меньше сил и времени на это. А потом я уже буду переделывать, как надо. Улучшать и улучшать. Вы изначально его хотите сделать не правильно, что бы потом выкинуть его и сделать правильно?Название: Re: Система сбора и отображения данных Отправлено: Bepec от Март 07, 2014, 15:22 Вот и пример с наследованием. Вот и практика в ООП. И следующей фразой будет "Я же уже так много сделал на функциях, зачем мне всё переделывать?" :)
Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 07, 2014, 15:36 Мне сейчас нужно будет уехать на выходные. Я буду без компа и интернета. Как вернусь, постараюсь сделать это задание достойно. Спасибо огромное всем, кто помогает!
Название: Re: Система сбора и отображения данных Отправлено: Igors от Март 08, 2014, 14:27 Задача выглядит очень типовой, наверняка есть подходящие либы. Если же самому, я бы рассуждал примерно так:
- датчик есть класс который собирает данные и хранит их в контейнере. Что есть единица данных? Ну пусть float значение. Нужно ли хранить время когда получено новое значение? Может и да, но может и ограничиться предположением что "данные приходят с фиксированной частотой". В любом случае датчик может быть вкл/выкл, уметь накапливать данные в своем буфере и знать какому времени соответствует каждое значение. Емкость буфера ограничена/задается. В общем датчик - класс который умеет по запросу выдать N единиц данных в заданном интервале времени Название: Re: Система сбора и отображения данных Отправлено: Old от Март 09, 2014, 13:58 Задача выглядит очень типовой, наверняка есть подходящие либы. Если же самому, я бы рассуждал примерно так: Слишком много задач возложено на простой датчик. По мне, так датчик должен только возвращать текущее значение, все остальное должен делать клиентский код: опрашивать датчик с нужным заданным интервалом, хранить значения и делать выборки. Не стоит на датчик сваливать разные задачи. Каждый объект системы должен выполнять свою задачу.- датчик есть класс который собирает данные и хранит их в контейнере. Что есть единица данных? Ну пусть float значение. Нужно ли хранить время когда получено новое значение? Может и да, но может и ограничиться предположением что "данные приходят с фиксированной частотой". В любом случае датчик может быть вкл/выкл, уметь накапливать данные в своем буфере и знать какому времени соответствует каждое значение. Емкость буфера ограничена/задается. В общем датчик - класс который умеет по запросу выдать N единиц данных в заданном интервале времени Название: Re: Система сбора и отображения данных Отправлено: lesav от Март 09, 2014, 20:15 Слишком много задач возложено на простой датчик. По мне, так датчик должен только возвращать текущее значение Все зависит от важности данных, если это банальная температура неких узлов то проблем нет, а если это датчики системы управления реактором то тут совсем другие требования. Датчики подключены к компьютеру с Unix подобной ОС, для обработки информации с каждого датчика запущен свой процесс или тред (в дальнейшем - "Драйвер Датчика"). Какая ось, QNX ?Название: Re: Система сбора и отображения данных Отправлено: lesav от Март 09, 2014, 20:26 Как подсоединены датчики ?
На каком интерфейсе ? Используются дополнительные платы расширения pci или isa ? Название: Re: Система сбора и отображения данных Отправлено: Old от Март 09, 2014, 21:11 а если это датчики системы управления реактором то тут совсем другие требования. Мы говорим про класс датчика учебного проекта. :)Название: Re: Система сбора и отображения данных Отправлено: Igors от Март 10, 2014, 08:54 Слишком много задач возложено на простой датчик. По мне, так датчик должен только возвращать текущее значение, все остальное должен делать клиентский код: опрашивать датчик с нужным заданным интервалом, хранить значения и делать выборки. Не стоит на датчик сваливать разные задачи. Каждый объект системы должен выполнять свою задачу. Можно и так, но тогда надо создавать класс напр "контроллер" отвечающий за опрос и буферирование, а то "клиентский код" - неясно что этоНазвание: Re: Система сбора и отображения данных Отправлено: Old от Март 10, 2014, 09:06 но тогда надо создавать класс напр "контроллер" отвечающий за опрос и буферирование Не один класс, а несколько, объекты которых будут опрашивать датчики, сохранять показания во внешнем хранилище, передавать их и т.д. В общем, каждый объект занимается непосредственно своей работой."клиентский код" - неясно что это Клиентский код это код, который взаимодействует с объектом датчика.Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 11, 2014, 17:17 Сделал сегодня небольшой набросок. Приложение IcebreakerViewer отправляет серверу (IcebreakerServer) запрос раз в секунду. Сервер, в ответ на запросы, передаёт текущие значения датчиков:
(http://i7.pixs.ru/storage/0/4/3/147png_8288103_11194043.png) (http://i7.pixs.ru/storage/0/3/6/146png_2511246_11194036.png) Исходники: IcebreakerServer: https://github.com/8Observer8/IcebreakerServer IcebreakerViewer: https://github.com/8Observer8/IcebreakerViewer Датчики реализованы следующем образом: Код
Вот так Viewer принимает данные и парсит их для отображения на экране: Код
Название: Re: Система сбора и отображения данных Отправлено: Bepec от Март 11, 2014, 23:32 Вот так функции побеждают ООП :D
Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 12, 2014, 14:24 Вот так функции побеждают ООП :D Мне нужно было разобраться с такими техническими вопросами, как: 1) Обмен данными между Server'ом и Viewer'ом 2) Хранение данных С первым вопросом вчера разобрался, а сегодня - со вторым. Решил хранить данные в базе данных SQLite, в виде: название датчика, значение, дата-врамя. Кому интересно, вот видео, как работать с SQLite из Qt: http://www.youtube.com/watch?v=cc06D3wuTn4 (http://www.youtube.com/watch?v=cc06D3wuTn4) Я добился того, чтобы Server сохранял текущие значения датчиков в базу данных (а так же дату-время). Теперь надо разобраться с SQL. А именно, как получить данные за период по столбцу дата-врамя. Как сделаю, то оформлю проект в виде ООП. Отправлено: Март 11, 2014, 17:17 Написал пошаговую инструкцию, как работать с базой данных SQLite в Qt: http://www.prog.org.ru/topic_26665_0.html (http://www.prog.org.ru/topic_26665_0.html) Сделал вот такой GUI интерфейс, но пока не реализовал передачу данных из диапазона по времени съёма параметров: (http://i7.pixs.ru/storage/2/4/6/148png_7514394_11218246.png) (http://i7.pixs.ru/storage/2/7/0/149png_1507427_11218270.png) Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 15, 2014, 08:24 Я уточнил ТЗ. Теперь сохраняю данные в базе данных SQLite.
Правда в моём варианте база данных располагается на стороне клиента. Удалённый сервер просто присылает посылку данных с датчиков. Я думаю, что нужно будет всё-таки сделать сбор данных на стороне удалённого сервера. Я заметил, что у меня GUI клиента фризится (то есть замирает, притормаживает). Скорее всего это происходит в моменты записи в базу данных. Вариант с базой данный считаю оправданным, так как в этом случае легко организовать доступ к данным и обработку их. К примеру, легко получить данные за период времени, так как в базу данных я сохраняю и время в формате: миллисекунды с начала эпохи (со времени рождения ОС Unix, то есть с 1970 года) (http://i7.pixs.ru/storage/3/7/6/152png_2288254_11241376.png) Почему ТЗ требует, чтобы получение данных с датчиков было отдельным тредом или процессом? Если это отдельный процесс, то получается, что это отдельное приложение, то есть Клиент и приложение датчика может быть на другой машине в сети. Правильно ли я понимаю? Название: Re: Система сбора и отображения данных Отправлено: Old от Март 15, 2014, 08:37 Почему ТЗ требует, чтобы получение данных с датчиков было отдельным тредом или процессом? Что бы этот прием шел параллельно с мониторингом данных. В случае с отдельным процессом - это еще и надежней, т.к. падение процесса получения данных не повлияет на процесс мониторинга и мы сможем отслеживать падения процессов и быстро их перезапускать.И неплохое разделение функций получается: процесс приема просто складывает данные в БД - он знает и умеет получать данные, знает источники/протоколы и т.д., а процесс мониторинга берет данные исключительно из БД и ему не важно откуда и как эти данные получаются. Если это отдельный процесс, то получается, что это отдельное приложение, то есть Клиент и приложение датчика может быть на другой машине в сети. Тут зависит как эти два процесса будут взаимодействовать друг с другом.Название: Re: Система сбора и отображения данных Отправлено: Old от Март 15, 2014, 08:47 Я заметил, что у меня GUI клиента фризится (то есть замирает, притормаживает). Скорее всего это происходит в моменты записи в базу данных. Да как бы не очень понятно с чего ему притормаживать. Отключите сохранение данных в БД и проверьте, пройдут ли фризы.Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 15, 2014, 09:27 Да как бы не очень понятно с чего ему притормаживать. Я понял - это не фризы. У меня есть два текстовых поля LineEdit. В одном из них выводится время самого первого съёма, в другом - последнего. В моём приложении эти значения обновляются каждую секунду. Когда я пытаюсь выделить, к примеру, дату и время первого съёма, чтобы скопипастить, то выделение пропадает из-за обновления. Но всё же, при наборе в полях: Требуемый диапазон - быстро набирать не получается. Есть небольшое притормаживание. Можете у себя просто запустить и попробовать набрать текст в поле "Введите начало диапазона". Только базу данных нужно расположить по этому пути: Код
Файл с базой данных можно найти в папке с исходниками Viewer'а. Исходники: https://github.com/8Observer8/IcebreakerServer/tree/dataFromRange https://github.com/8Observer8/IcebreakerViewer/tree/dataFromRange (http://i6.pixs.ru/storage/7/7/6/153png_3489517_11241776.png) Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 23, 2014, 10:04 Помогите, пожалуйста, разобраться с таким вопросом. Хочу чтобы у каждого датчика был свой уникальный идентификатор. Поэтому я написал: static int mID; но компилятор ругается на эту строку:
Цитировать Sensor.cpp:10: error: undefined reference to `Sensor::mID' Sensor.h Код
Sensor.cpp Код
Название: Re: Система сбора и отображения данных Отправлено: Old от Март 23, 2014, 10:15 Статическая переменная будет всегда одна, на все объекты и содержать она будет самое последнее значение.
Для статических переменных нужно определить в cpp файле: Код
Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 23, 2014, 10:18 Огромное спасибо :)
Посмотрите, пожалуйста, мой план-описание проекта. Всё ли здесь я правильно описал: - пользователь запускает программу "Сервер Данных" "Драйвер Датчика" - пользователь запускает программу "Драйвер Датчика" (на том же, что и "Сервер Данных" или удалённом компьютере) - добавляет датчики в таблицу, нажимая в меню "Добавить". В открывшимся диалоге указывает: имя датчика, номер COM-порта. В меню есть так же пункты: "Редактировать", "Удалить" запись из таблицы. - вводит IP адрес (или имя компьютера) и порт "Сервера Данных" - нажимает кнопку "Подсоединиться к серверу" - пользователь может наблюдать текущие значения каждого датчика в приложении "Драйвер Датчика" в таблице "Сервер Данных" - после того, как пользователь нажал кнопку "Подсоединиться к серверу" в приложении "Драйвер Датчика", то "Сервер Данных" начинает принимать данные - "Сервер Данных" сохраняет данные от датчиков в базу данных в таком виде: имя датчика, значение датчика, дата и время съёма "Приложение Оператора" - пользователь запускает "Приложение Оператора" - вводит IP адрес (или имя компьютера) и порт сервера - нажимает кнопку "Подсоединиться к серверу" - "Приложение Оператора" начинает отправлять запросы приложению "Сервер Данных" каждую секунду - в ответ приложение "Сервер Данных" присылает текущие значения датчиков - "Приложение Оператора" отображает текущие значения датчиков - пользователь вводит требуемый временной диапазон (дата-время) и получает от приложения "Сервер Данных" значения датчиков за указанный период - пользователь так же может узнать значение указанного датчика в указанный момент времени, а так же значения указанного датчика в указанный период времени Дополнительная функциональность. Пользователь может наблюдать текущие значения датчиков на графике в "Приложении Оператора" (графики рисуются в реальном времени) Название: Re: Система сбора и отображения данных Отправлено: Old от Март 23, 2014, 10:19 Статический будет сам счетчик:
Sensor.h Код
Sensor.cpp Код
Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 23, 2014, 10:20 Да, это то, что я хотел :) Спасибо :)
Название: Re: Система сбора и отображения данных Отправлено: Igors от Март 23, 2014, 11:10 Код
Название: Re: Система сбора и отображения данных Отправлено: Old от Март 23, 2014, 11:11 Возвращаемое значение зависит от порядка опроса датчиков Ну rand так устроен. :)Название: Re: Система сбора и отображения данных Отправлено: Johnik от Март 23, 2014, 11:24 Помогите, пожалуйста, разобраться с таким вопросом. Хочу чтобы у каждого датчика был свой уникальный идентификатор. Поэтому я написал: static int mID; но компилятор ругается можно еще так: Код
Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 24, 2014, 14:40 Спасибо с генератором :)
Сейчас 3 часа бился с проблемой и вроде подошёл к источнику. У меня Server отравляет QString Viewer'у. В строке содержатся данные по датчикам в формате: название, значение. Вот так: sensor1,18;sensor2,22;sensor3,28. Так вот. Когда это одно значение (sensor1,18), то Viewer нормально принимает. Если два и более, то Viewer перестаёт принимать. Вот так Server отправляет строку: Код
А вот так Viewer принимает: Код
Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 24, 2014, 19:10 Я видимо, перемудрил с сокетами. У меня Server и Viewer соединены по одному каналу. Каждую секунду я перебрасываю строку от Viewer - запрос "currentValues". На этот запрос Sever мне передаёт посылку-строку с названиями и значениями текущих датчиков (которых может быть сколько угодно, по ТЗ не больше 10). По этому же каналу я передаю запрос "getRequiredRange,времяНачала,времяОкончания". Server считывает из базы данных названия и значения датчиков и передаёт их Viewer'у, которых может быть много (в базе данных я также храню время-дату съёма). В том числе вся база данных. И всё это по-одному каналу. Придётся капать в сторону потоков, чтобы завести несколько сокетных соединений.
Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 25, 2014, 08:35 Я нашёл, как мне кажется, подходящий пример из Qt: ThreadedFortuneServer. Он позволил бы мне обрабатывать такие запросы от клиентов как: запрос на текущие (ежесекундные) данные с датчиков (название датчиков, их значение и время съёма данных), а так же запрос на историю изменений значений датчиков за указанный период.
Проблем появилось очень много. К примеру, клиент тоже придётся как-то переделать через потоки. Один поток запрашивает текущие данные, другой по желанию пользователя запрашивает данные за указанный период. Одна из текущих проблем: как переделать ThreadedFortuneServer, чтобы он принимал данные от клиента. Так как в этом примере данные генерируются внутри самого класса FortuneServer: Код
Название: Re: Система сбора и отображения данных Отправлено: Bepec от Март 25, 2014, 11:11 Не вижу ваших проблем в упор.
Fortune Server спокойно держит до 15 клиентов, принимает и отсылает данные. И есть подозрение что так будет и при 100+ клиентах. Вам нужно всего-то свой протокол сделать. Команды запроса-ответа, механизм верификации. Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 25, 2014, 13:55 Да, точно, Вы правы! Со стороны сервера при новом соединении создаётся новый сокет:
Код
Надо со стороны Viewer несколько сокетов завести. Скорее всего, сервер переделывать не придётся. Спасибо! :) Название: Re: Система сбора и отображения данных Отправлено: Bepec от Март 25, 2014, 15:23 Зачем несколько сокетов?
Цитировать В упор не вижу ваших проблем .По одному сокету можно спокойно запросить одну команду, потом другую. И периодически посылать третью с интервалом. Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 25, 2014, 15:35 А если я запросил командой переслать всю информацию из базы данных? У меня тогда клиент зависнет. Разве нет?
Название: Re: Система сбора и отображения данных Отправлено: Bepec от Март 25, 2014, 16:20 м... это долгая операция. Хотя смотря как пересылать. Всё равно в одном пакете не получится, значит просто будут части посылаться. А между пакетами с частями всей инфы можно и любой другой пакет запросить.
PS и да, можно просто блочить интерфейс на ресурсоёмкую операцию. Все так делают, ничего постыдного нет. Название: Re: Система сбора и отображения данных Отправлено: Old от Март 25, 2014, 16:23 А если я запросил командой переслать всю информацию из базы данных? У меня тогда клиент зависнет. Разве нет? Почему? Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 26, 2014, 10:04 Ура! Я выполнил задание! Всем огромное спасибо! :D
Вот так на рисунке выглядят программы: Server, Viewer, Менеджер датчиков: (http://i.pixs.ru/storage/7/4/9/157png_6499387_11407749.png) Исходники Server: https://github.com/8Observer8/IcebreakerServer/tree/with_sensors_manager (https://github.com/8Observer8/IcebreakerServer/tree/with_sensors_manager) Viewer: https://github.com/8Observer8/IcebreakerViewer/tree/with_sensors_manager (https://github.com/8Observer8/IcebreakerViewer/tree/with_sensors_manager) Менеджер датчиков: https://github.com/8Observer8/Sensors (https://github.com/8Observer8/Sensors) Краткое описание проекта: "Сервер Данных" - пользователь запускает программу "Сервер Данных" "Драйвер Датчика" - пользователь запускает программу "Драйвер Датчика" (на том же компьютере, что и "Сервер Данных" или удалённом компьютере) - добавляет датчики в таблицу, нажимая в меню "Добавить". В открывшимся диалоге указывает: имя датчика, номер COM-порта. В меню есть так же пункты: "Редактировать", "Удалить" запись из таблицы. - вводит IP адрес (или имя компьютера) и порт "Сервера Данных" - нажимает кнопку "Подсоединиться к серверу" - пользователь может наблюдать текущие значения каждого датчика в приложении "Драйвер Датчика" в таблице "Сервер Данных" - после того, как пользователь нажал кнопку "Подсоединиться к серверу" в приложении "Драйвер Датчика", то "Сервер Данных" начинает принимать данные - "Сервер Данных" сохраняет данные от датчиков в базу данных в таком виде: имя датчика, значение датчика, дата и время съёма "Приложение Оператора" - пользователь запускает "Приложение Оператора" - вводит IP адрес (или имя компьютера) и порт сервера - нажимает кнопку "Подсоединиться к серверу" - "Приложение Оператора" начинает отправлять запросы приложению "Сервер Данных" каждую секунду - в ответ приложение "Сервер Данных" присылает текущие значения датчиков - "Приложение Оператора" отображает текущие значения датчиков - пользователь вводит требуемый временной диапазон (дата-время) и получает от приложения "Сервер Данных" значения датчиков за указанный период - пользователь так же может узнать значение указанного датчика в указанный момент времени, а так же значения указанного датчика в указанный период времени Дополнительная функциональность (которую я не успел реализовать на Qwt). Пользователь может наблюдать текущие значения датчиков на графике в "Приложении Оператора" (графики рисуются в реальном времени). Как в примере из Qwt: (http://i.pixs.ru/storage/7/6/3/155png_7892683_11407763.png) Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 27, 2014, 15:46 Облом... Вчера отправил задание на проверку. Сегодня позвонил. Сказали, что у них в компании какие-то проблемы и они экстренно все вакансии закрыли. Вот эта вакансия: http://www.volgasoft.com/careers.htm#cppj
По Qt в Саратове ничего больше нет. И эта компания подходила, так как они работают с зарубежным заказчиком. Хотелось ещё английский, чтобы пригодился (хотя он ещё очень плох). Теперь либо удалённо искать на Qt, либо изучать C# или Java. Наверное всё же посижу ещё немного на шеи у родителей, отлично изучу C++ и Qt и найду себе работу по удалёнке! Название: Re: Система сбора и отображения данных Отправлено: Old от Март 27, 2014, 15:52 они экстренно все вакансии закрыли. А что они там вообще делали?Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 27, 2014, 16:19 По-моему, то же самое что и я делал, только для конкретных систем и в других масштабах. Системы сбора, хранения и визуализации данных. Российский заказчик у них ГазПром. Пишут ПО для управления промышленным оборудованием.
Название: Re: Система сбора и отображения данных Отправлено: Bepec от Март 27, 2014, 16:51 Если они используют то, что я думаю, то о Qt можно было бы забыть в начинке :D Есть вроде одна система специально под газпром написанная :)
Разве что для интерфейса :) Название: Re: Система сбора и отображения данных Отправлено: 8Observer8 от Март 27, 2014, 16:56 У них ещё .NET. А так они в основном с зарубежным заказчиком работают. Вот что они применяют для разработок: http://www.volgasoft.com/expertise/
Название: Re: Система сбора и отображения данных Отправлено: Old от Март 27, 2014, 16:58 Если они используют то, что я думаю, то о Qt можно было бы забыть в начинке :D Для чего искать разработчиков Qt, что бы они забыли про Qt? :)Разве что для интерфейса :) Ну так Qt для этого и предназначен. :)Название: Re: Система сбора и отображения данных Отправлено: pilot.net от Май 13, 2014, 21:05 Может они этот форум читают, вот и закрыли вакансии :)
Почему то у них на сайте общими словами написано и не понятно что за софт конкретно они пишут Ни рекламы ни чего. Название: Re: Система сбора и отображения данных Отправлено: Bepec от Май 13, 2014, 22:00 И не будут писать. И я не буду писать :D Мне свобода дорога :D
|