ПЗ (Виртуальная лаборатория для проведения занятий по дисциплине Электротехника), страница 4
Описание файла
Файл "ПЗ" внутри архива находится в следующих папках: Виртуальная лаборатория для проведения занятий по дисциплине Электротехника, Цай В.С. Документ из архива "Виртуальная лаборатория для проведения занятий по дисциплине Электротехника", который расположен в категории "". Всё это находится в предмете "дипломы и вкр" из 8 семестр, которые можно найти в файловом архиве ДВГУПС. Не смотря на прямую связь этого архива с ДВГУПС, его также можно найти и в других разделах. .
Онлайн просмотр документа "ПЗ"
Текст 4 страницы из документа "ПЗ"
Недостатком данного языка является более низкая производительность по сравнению с С/С++ языками. Связано это с тем что программный код, как и в языке Java транслируется в байт-код.
4.2 Среды разработки
4.2.1 LabView
LabView представляет собой программное обеспечение для решения технических задач тестирования, измерения и управления с быстрым доступом к оборудованию и результатам обработки измерений.
Рисунок 12 – Программа созданная в LabView.
LabView использует собственный язык программирования, который постоянно дорабатывается. В LabView разрабатываемые программные модули называются «Virtual Instruments» (VI). Каждый VI представляет собой функцию написанную на графическом коде и состоит из двух частей – Block Diagram и Front Panel.
Рисунок 13 – Составляющие Virtual Instruments
Несмотря на удобство LabView для создания виртуальной лаборатории, от нее пришлось отказаться из-за того, что для запуска требуются компоненты, которые невозможно установить на каждом компьютере в университете.
4.2.2 Qt Creator
Qt Creator – кроссплатформенный инструментарий разработки ПО на языке программирования C++. Есть также «привязки» ко многим другим языкам программирования: Python, Ruby, Java, PHP и другие.
Qt позволяет запускать написанное с его помощью ПО в большинстве современных операционных систем путём простой компиляции программы для каждой ОС без изменения исходного кода. Включает в себя все основные классы, которые могут потребоваться при разработке прикладного программного обеспечения, начиная от элементов графического интерфейса и заканчивая классами для работы с сетью, базами данных и XML. Qt является полностью объектно-ориентированным, легко расширяемым и поддерживающим технику компонентного программирования.
Рисунок 14 – Интерфейс Qt Creator
Основная задача Qt Creator – упростить разработку приложения с помощью фреймворка Qt на разных платформах. Поэтому среди возможностей, присущих любой среде разработки, есть и специфичные, такие как отладка приложений на QML и отображение в отладчике данных из контейнеров Qt, встроенный дизайнер интерфейсов как на QML, так и на QtWidgets.
Qt позволяет создавать собственные плагины и размещать их непосредственно в панели визуального редактора. Также существует возможность расширения привычной функциональности виджетов, связанной с размещением их на экране, отображением, перерисовкой при изменении размеров окна.
В Qt Creator имеются библиотеки, упрощающие обработку выходных данных, например Qwt.
Qwt – графическая библиотека, позволяющая значительно упростить процесс визуализации данных в программе. Упрощение заключается в следующем: нет необходимости вручную прописывать элементы отображения, такие как шкалы координат, сетки, кривые данных и прочее. Следует лишь задавать параметры этих элементов.
Для реализации поставленной задачи была выбрана среда Qt Creator из-за удобства работы с графическим интерфейсом и отсутствием проблем с запуском присущие LabView.
4.2.3 Visual studio
Microsoft Visual Studio 2015 – это набор инструментов для создания программного обеспечения: от планирования до разработки пользовательского интерфейса, написания кода, тестирования, отладки, анализа качества кода и производительности, развертывания в средах клиентов и сбора данных телеметрии по использованию.
Рисунок 15 – Интерфейс Visual Studio
По умолчанию Visual Studio обеспечивает поддержку C#, C и C++, JavaScript, F# и Visual Basic. Visual Studio хорошо работает и интегрируется со сторонними приложениями, например Unity и Apache Cordova с помощью различных расширений.
Visual Studio включает эффективные инструменты для статического анализа и анализа во время выполнения. Инструменты статического анализа помогут выявить потенциальные ошибки проектирования, глобализации, взаимодействия, производительности, безопасности и других категорий. Тестирование производительности (или профилирование) включает измерение выполнения программы.
Visual Studio включает платформу модульного тестирования для управляемого кода (.NET) и для машинного кода C++.
Так же в Visual Studio присутствует конструктор позволяющий создавать интерфейс без написания кода.
5 Реализация
В главном окне программы предлагается выбрать тематику лабораторной работы (рисунок).
Рисунок 16 – Главное окно программы
Кнопки привязаны к слотам on_But1_clicked() и on_But2_clicked().
void MainWindow::on_But1_clicked()
{
f1 = new Form;
f1->show();
}
void MainWindow::on_But2_clicked()
{
f2 = new Form2;
f2->show();
}
Переменные f1 и f2 объявляются как переменные классов Form и Form2, которые используются для вызова окон для выбора лабораторных работ.
При нажатии на кнопку создается новая форма в которой можно выбрать необходимую электрическую цепь (рисунок).
Рисунок 17 – Окно выбора типа цепи
Выбор лабораторной работы происходит с помощью класса QMouseEvcnt. При нажатии на кнопку мыши определяется находится ли курсор над объектом и в положительном случае открывается соответствующая лабораторная работа.
void Form::mousePressEvent(QMouseEvent *eventPress){
if(aitem1->isUnderMouse()){
win = new Posl;
win->show();
}
if(aitem1->isUnderMouse()){
win1 = new Posl1;
win1->show();
}
if(aitem1->isUnderMouse()){
win2 = new Posl2;
win2->show();
}
}
Классы лабораторных работ имеют переменные для хранения значений силы тока, напряжения и сопротивления каждого элемента. Конструктор класса создает сцену и устанавливает ее в объект graphicsView, загружает в переменные QPixmap изображения используемые в лабораторной работе, затем передает их в объекты QGraphicsPixmapItem и с помощью функции setPos устанавливаются в соответствующие места рабочего поля.
Posl::Posl(QWidget *parent) :
QWidget(parent),
ui(new Ui::Posl)
{
ui->setupUi(this);
scene = new QGraphicsScene();
k1.load("C:/Users/User/Desktop/kur/k1.png");
aicon.load("C:/Users/User/Desktop/kur/aicon.png");
vicon.load("C:/Users/User/Desktop/kur/vicon.png");
r1.load("C:/Users/User/Desktop/kur/res.png");
doticon.load("C:/Users/User/Desktop/kur/dot.png");
ui->graphicsView->setScene(scene);
akk = scene->addPixmap(k1);
akk->setPos(150,350);
aitem1 = scene->addPixmap(aicon);
aitem1->setPos(100,0);
vitem[0] = scene->addPixmap(vicon);
vitem[0]->setPos(50,200);
vitem[1] = scene->addPixmap(vicon);
vitem[1]->setPos(200,200);
vitem[2] = scene->addPixmap(vicon);
vitem[2]->setPos(350,200);
ritem[0] =scene->addPixmap(r1);
ritem[0]->setPos(0,50);
ritem[1] =scene->addPixmap(r1);
ritem[1]->setPos(150,50);
ritem[2] =scene->addPixmap(r1);
ritem[2]->setPos(300,50);
for(int i=0; i<20;i++){
dots[i]=scene->addPixmap(doticon);
}
dots[0]->setPos(45,18);
dots[1]->setPos(139,18);
dots[2]->setPos(3,235);
dots[3]->setPos(65,235);
dots[4]->setPos(3,335);
dots[5]->setPos(65,335);
dots[6]->setPos(3,435);
dots[7]->setPos(65,435);
dots[8]->setPos(103,235);
dots[9]->setPos(165,235);
dots[10]->setPos(103,335);
dots[11]->setPos(165,335);
dots[12]->setPos(103,435);
dots[13]->setPos(165,435);
dots[14]->setPos(326,120);
dots[15]->setPos(425,115);
dots[16]->setPos(326,220);
dots[17]->setPos(425,215);
dots[18]->setPos(326,320);
dots[19]->setPos(425,315);
}
Объект akk описывает источник тока, aitem1 – амперметр, массив vitem описывает положение всех вольтметров, а массив ritem положение всех резисторов. Массив dots описывает точки соединения для каждого из элементов.
Рисунок 18 – Рабочее поле
Слот on_pushButton_clicked() вызывается при нажатии кнопки "Пуск". Он проверяет правильность введенных данных и соединений элементов. Также он вносит в переменные значения силы тока и напряжения, которые затем передаются в классы измерительных приборов.
void MainWindow::on_pushButton_clicked()
{
if(l[0]&&(l[1]||(l[4]&&l[5]))&&l[2]&&l[3]){
QString b;
b=ui->lineEdit->text();
rm[0]=b.toFloat();
b=ui->lineEdit_2->text();
rm[1]=b.toFloat();
b=ui->lineEdit_3->text();
rm[2]=b.toFloat();
b=ui->lineEdit_4->text();
vm[3]=b.toFloat();
rm[3]=rm[0]+rm[1]+rm[2];
am[3]=vm[3]/rm[3];
am[0]=am[3];
am[1]=am[3];
am[2]=am[3];
vm[0]=rm[0]*am[0];
vm[1]=rm[1]*am[1];
vm[2]=rm[2]*am[2];}
else{
QMessage::warning(this,"Проверьте верность введенных данных или правильность подключения элементов",str);
}
}
В массиве l хранится информация о существовании соединений, в массивах am, vm, rm хранится информация об общем сопротивленни, силе тока и напряжении, а также на каждом из элементов.
Взаимодействие с элементами производится с помощью класса QMouseEvent.
if(dots[0]->isUnderMouse()){
if(sw==-1){
sw=0;
}
else{
switch(sw){
case 19:
l[0].setLine(xx[0],yy[0],xx[sw],yy[sw]);
scene->addLine(l[0]);
lines[0]=1;
scene->update();
sw=-1;
}
}
}
Все точки соединения пронумерованы и при нажатии на точку, ее номер записывается в специально отведенную для этого переменную. При нажатии на другую точку между ними рисуется линия соединяющая два элемента. Если соединить элементы нельзя, например при попытке соединения двух точек одного резистора, то ничего не происходит.
При нажатии на иконку измерительного устройства вызывается функция проверяющая подключение его к цепи:
if(aitem1->isUnderMouse()&&(dots[2]->isUnderMouse()==0)&&(dots[3]->isUnderMouse()==0)){
win = new amper;
if((l[4]==1)&&(l[5]==1))
win->senddata(am[0]);
else QMessage::warning(this,"Амперметр не подключен к цепи",str);
win->show();
}
Если устройство не подключено к цепи, то приложение предупреждает об этом, окно с измерительным устройством открывается и стрелка прибора будет указывать на 0.
Конструктор амперметра:
amper::amper(QWidget *parent) :
QWidget(parent),
ui(new Ui::amper)
{
ui->setupUi(this);
a1.load("C:/Users/User/Desktop/kur/Ampermetr2.jpg");
a2.load("C:/Users/User/Desktop/kur/Ampermetr3.jpg");
a3.load("C:/Users/User/Desktop/kur/Ampermetr4.png");
scene = new QGraphicsScene();
ui->graphicsView->setScene(scene);
item1 = scene->addPixmap(a1);
item3 = scene->addPixmap(a3);
item3->setPos(32,94);
item3->setTransformOriginPoint(223,222);
item2 = scene->addPixmap(a2);
item2->setPos(0,294);
}
Изображение амперметра состоит из трех частей, верхней части корпуса, нижней части корпуса и измерительной стрелки. Это сделано для того, чтобы стрелка при вращении не портила графическое отображение. В конструкторе также устанавливается точка трансформации стрелки для ее правильного вращения.
Функция senddata() отправляет необходимые прибору данные и изменяет положение стрелки:
float amper::senddata(float x){
A=x;
if(A<5){
item3->setRotation(-15);
}
if(A>30){
item3->setRotation(75);
}
if((A>=5)&&(A<=30)){
item3->setRotation((A-5)*3.48-12);