4. Структура базы данных ас
Структурная схема базы данных автоматизированной системы диагностики дефектов конструкций электронных средств с помощью акустических сигналов представлена на рисунке 4.
Рис. 4. Структурная схема базы данных
База данных автоматизированной системы реализована с помощью СУБД MicrosoftAccessи содержит четыре таблицы:
Defect
В ней содержится 6 полей:
equipment_id– идентификационный номер электронного устройства;
environment_id- идентификационный номер среды;
defect_type_id- идентификационный номер типа дефекта;
average_data– усредненная матрица дефекта;
dx– матрица допустимых отклонений от среднего значения;
kol-vo– вес выборки по которым сформировалась усредненная матрица
Ключом таблицы Defectявляется составным и содержит поля идентификационных номеров типов дефектов, среды и электронных устройств.
Equipment
equipment_id– идентификационный номер электронного устройства;
equipment_name– название электронного устройства;
Ключом таблицы Equipmentявляется полеequipment_id.
Environment
environment_id- идентификационный номер среды;
environment_name– название среды;
Ключом таблицы Environmentявляется полеenvironment_id.
Defect_type
defect_type_id- идентификационный номер типа дефекта;
defect_type_name– название типа дефекта.
Ключом таблицы Defect_typeявляется полеdefect_type_id.
Главное таблицей является таблица Defect. Она связана с остальными таблицами связью «один-ко-многим» с каскадным обновлением связанных полей и каскадным удалением связанных записей.
Модуль наполнения базы дефектов
Модуль автоматизированной системы диагностики дефектов конструкций электронных средств с помощью акустических сигналов реализован в VisualStudio2008 с помощью технологииADO.NET
ADO.NET — это набор классов, предоставляющих службы доступа к данным программисту, работающему на платформе .NET Framework.ADO.NET имеет богатый набор компонентов для создания распределенных приложений, совместно использующих данные. Это неотъемлемая часть платформы .NET Framework, которая предоставляет доступ к реляционным данным, XML-данным и данным приложений. ADO.NET удовлетворяет различные потребности разработчиков, включая создание клиентских приложений баз данных, а также бизнес-объектов среднего уровня, используемых приложениями, средствами, языками и веб-обозревателями[5].
На рисунке 5 представлен компонент DataSetADO.NETиспользованный для реализации модуля наполнения базы дефектов.
Рис. 5. Компонент ADO.NET
Объект DataSetпредставляет источник данных, к которым обращается автоматизированная система, в данном случае это созданная база данных вMicrosoftAccess. DataSet состоит из объектов типа DataTable. Объекты DataTable используются для представления одной из таблиц базы данных в DataSet. В свою очередь, DataTable составляется из объектов DataColumn. DataColumn – это блок для создания схемы DataTable. Каждый объект DataColumn имеет свойство DataType, которое определяет тип данных, содержащихся в каждом объекте DataColumn. Например, можно ограничить тип данных до целых, строковых и десятичных чисел. Поскольку данные, содержащиеся в DataTable, обычно переносятся обратно в исходный источник данных, необходимо согласовывать тип данных с источником.
Коллекция Rows объекта DataTable возвращает набор строк (записей) заданной таблицы. Эта коллекция используется для изучения результатов запроса к базе данных. Мы можем обращаться к записям таблицы как к элементам простого массива.
DataSet – это специализированный объект, содержащий образ базы данных. Для осуществления взаимодействия между DataSet и собственно источником данных используется объект типа DataAdapter. Само название этого объекта – адаптер, преобразователь, – указывает на его природу. DataAdapter содержит метод Fill() для обновления данных из базы и заполнения DataSet[1]. Так же в каждом DataAdapterможно создатьsql-запрос на запись, какое-то единичное значение, добавление, обновление и удаление.
В автоматизированной системе диагностики дефектов конструкций электронных средств с помощью акустических сигналов применяются такие запросы как: вывод отдельно усредненной матрицы, матрицы допустимых отклонений, количество образцов, добавление новой записи в таблицу Defect,Defect_type,EquipmentиEnvironment, удаление записи из таблицыDefect,Defect_type,EquipmentиEnvironment.
Так же есть объекты отображения данных на подобии DataGridViewдля целых таблиц и массивов записей иComboBoxдля отдельных полей/столбцов таблицы. В автоматизированной системе диагностики дефектов конструкций электронных средств с помощью акустических сигналов используетсяComboBoxдля представления выбора параметров во вкладке «Диагностика» и «Обучение».
Для наполнения базы данных во вкладке «Обучение» рядом с каждым ComboBoxнаходиться кнопки для удаления выбранного типа дефекта/среды/устройства и добавления новых.ComboBoxтак же служат для формирования новой записи в таблицеDefect. Это происходит при нажатии кнопки «Загрузить образец» во вкладке «Обучение». После того как параметры определены иwave-файл соответствующего формата выбран, программа анализирует входной сигнал, получает из него матрицу. После этого проводится пересчет имеющейся матрицы соответствующего типа дефекта, устройства и среды с учетом полученной и размером выборки (если матрица уже есть) или создает новую запись в которую вносит выбранные параметры и полученную в ходе анализа входного сигнала матрицу.
При процедуре диагностике проводиться запрос усредненной матрицы и матрицы допустимых отклонений каждого типа дефекта указанного устройства и среды.
Листинг модуля находиться в приложении 1.
ЗАКЛЮЧЕНИЕ
За период производственной практики с 25.06.2012 по 15.07.2012 были выполнены следующие задания:
изучена структура предприятия ООО «РН-Информ»;
сформирован набор требований предъявляемых к входным данным АС диагностики дефектов;
разработана структура базы данных АС диагностики дефектов;
разработан модуль наполнения базы данных дефектов;
подготовлен и оформлен отчёт.
Также были изучены основы технологии ADO.Net, с помощью которого был разработан модуль наполнения базы данных дефектов.
Автоматизированная система диагностики дефектов конструкций электронных средств с помощью акустических сигналов приобрела функцию пополнения базы данных дефектов.
Список использованных источников
Евсеева О.Н., Шамшев А.Б. Работа с базами данных на языке C#. Технология АDO .NET: Учебное пособие.
Поисковая система Google [Электронный ресурс]. URL: http://www.google.ru.
Поисковая система Yandex [Электронный ресурс]. URL: http://www.yandex.ru.
Электронная энциклопедия Wikipedia [Электронный ресурс]. URL: http://ru.wikipedia.org.
Электронная библиотека MSDN [Электронный ресурс]. URL: http://msdn.microsoft.com
ПРИЛОЖЕНИЕ 1
Листинг приложения Diagnostic
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using MathWorks.MATLAB.NET.Utility;
using MathWorks.MATLAB.NET.Arrays;
using MatLab;
using System.IO;
namespace Diagnostic
{
public partial class Form1 : Form
{
string FileName = "";
Class1 matLabObj = new Class1();
MWNumericArray MW=new MWNumericArray();
public Form1()
{
InitializeComponent();
}
private const int ColumnLength = 39;
private const int RowLength = 17;
private const string ValueColumnPrefix = "Value_";
private const string MatrixDataTableName = "MatrixTable";
double[,] wave = new double[900, ColumnLength];
public DataTable CreateValueMatrix()
{
var dataTable = new DataTable(MatrixDataTableName);
for (int i = 1; i <= ColumnLength; i++)
{
var dataColumn = new DataColumn(ValueColumnPrefix + i, typeof(double)) { Caption = "Значение " + i };
dataTable.Columns.Add(dataColumn);
}
return dataTable;
}
public void FillDataTableFromArray(double[,] inputValues, DataTable dataTable)
{
for (int i = 1; i <= RowLength; i++)
{
DataRow currentRow = dataTable.NewRow();
for (int j = 1; j <= ColumnLength; j++)
{
string currentColumnName = ValueColumnPrefix + j;
currentRow[currentColumnName] = inputValues[i - 1, j - 1];
}
dataTable.Rows.Add(currentRow);
}
}
public string GetXmlMatrix(double[,] inputMatrix)
{
var newDataTable = CreateValueMatrix();
FillDataTableFromArray(inputMatrix, newDataTable);
var valuesDataSet = new DataSet("MatrixValues");
valuesDataSet.Tables.Add(newDataTable);
var stringWriter = new StringWriter();
valuesDataSet.WriteXml(stringWriter, XmlWriteMode.WriteSchema);
return stringWriter.ToString();
}
public DataTable GetDataTableFromXml(string xml)
{
var decomrpessedDataSet = new DataSet("MatrixValues");
var stringReader = new StringReader(xml);
decomrpessedDataSet.ReadXml(stringReader, XmlReadMode.ReadSchema);
return decomrpessedDataSet.Tables[MatrixDataTableName];
}
public double[,] FillArrayFormTable(DataTable DT)
{
double[,] mas = new double[RowLength, ColumnLength];
for (int i = 0; i < RowLength; i++)
for (int j = 0; j < ColumnLength; j++) mas[i, j] = (double)DT.Rows[i].ItemArray[j];
return mas;
}
public double[,] Average(double[,] ave, double[,] samp, int kol)
{
double[,] res=new double[RowLength,ColumnLength];
for (int i = 0; i < RowLength; i++)
for (int j = 0; j < ColumnLength; j++)
res[i,j] = (ave[i, j] * (kol - 1)+samp[i,j])/kol;
return res;
}
public double[,] doverInter(double[,] ave, double[,] dx, double[,] samp)
{
double[,] res = new double[RowLength, ColumnLength];
for (int i = 0; i < RowLength; i++)
for (int j = 0; j < ColumnLength; j++)
res[i,j]=Math.Max(ave[i, j] - samp[i, j], dx[i, j]);
return res;
}
private void Form1_Load(object sender, EventArgs e)
{
// TODO: данная строка кода позволяет загрузить данные в таблицу "defectBaseDataSet.Environment". При необходимости она может быть перемещена или удалена.
this.environmentTableAdapter.Fill(this.defectBaseDataSet.Environment);
// TODO: данная строка кода позволяет загрузить данные в таблицу "defectBaseDataSet.Defect_type". При необходимости она может быть перемещена или удалена.
this.defect_typeTableAdapter.Fill(this.defectBaseDataSet.Defect_type);
// TODO: данная строка кода позволяет загрузить данные в таблицу "defectBaseDataSet.Equipment". При необходимости она может быть перемещена или удалена.
this.equipmentTableAdapter.Fill(this.defectBaseDataSet.Equipment);
// TODO: данная строка кода позволяет загрузить данные в таблицу "defectBaseDataSet.Environment". При необходимости она может быть перемещена или удалена.
this.environmentTableAdapter.Fill(this.defectBaseDataSet.Environment);
// TODO: данная строка кода позволяет загрузить данные в таблицу "defectBaseDataSet.Defect". При необходимости она может быть перемещена или удалена.
this.defectTableAdapter.Fill(this.defectBaseDataSet.Main_Table);
}
private void LoadFile_Click(object sender, EventArgs e)
{
try
{
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK &&
openFileDialog1.FileName.Length > 0)
{
FileName = openFileDialog1.FileName;
Random ran = new Random();
for (int i = 0; i < 900; i++)
for (int j = 0; j < ColumnLength; j++)
wave[i, j] = ran.Next(0, 20);
listBox1.Items.Add("=================");
listBox1.Items.Add("Образец из файла:");
listBox1.Items.Add(FileName);
listBox1.Items.Add("загружен!");
GrafButton.Enabled = true;
DiagnosticButton.Enabled = true;
* }
else MessageBox.Show("Файл не загружен");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void LoadFileSemple_Click(object sender, EventArgs e)
{
try
{
if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK &&
openFileDialog1.FileName.Length > 0)
{
FileName = openFileDialog1.FileName;
double[,] matrix = new double[RowLength, ColumnLength];
Random ran = new Random(21);
MW = (MWNumericArray)matLabObj.Diag(FileName);
for (int i = 0; i < RowLength; i++)
for (int j = 0; j < ColumnLength; j++)
matrix[i, j] = ran.Next(0, 22);
DefectBaseDataSetTableAdapters.Main_TableTableAdapter mainTA = new Diagnostic.DefectBaseDataSetTableAdapters.Main_TableTableAdapter();
try
{
DefectBaseDataSet.Main_TableDataTable mainRow = defectBaseDataSet.Main_Table as DefectBaseDataSet.Main_TableDataTable;
DataTable DT = new DataTable();
DT = GetDataTableFromXml(mainTA.ScalarQueryAve(Convert.ToInt16(equipmentFilterBox.SelectedValue.ToString()),
Convert.ToInt16(environmentFilterBox.SelectedValue.ToString()),
Convert.ToInt16(DefectTypeFilterBox.SelectedValue.ToString())).ToString());
double[,] avergeMat = FillArrayFormTable(DT);
DT = GetDataTableFromXml(mainTA.ScalarQueryDX(Convert.ToInt16(equipmentFilterBox.SelectedValue.ToString()),
Convert.ToInt16(environmentFilterBox.SelectedValue.ToString()),
Convert.ToInt16(DefectTypeFilterBox.SelectedValue.ToString())).ToString());
double[,] dxMat = FillArrayFormTable(DT);
int kol = Convert.ToInt16(mainTA.ScalarQueryKol(Convert.ToInt16(equipmentFilterBox.SelectedValue.ToString()),
Convert.ToInt16(environmentFilterBox.SelectedValue.ToString()),
Convert.ToInt16(DefectTypeFilterBox.SelectedValue.ToString())).ToString());
mainTA.UpdateQueryMainTable(GetXmlMatrix(Average(avergeMat, matrix, kol)),
GetXmlMatrix(doverInter(avergeMat, dxMat, matrix)), kol + 1,
Convert.ToInt16(equipmentFilterBox.SelectedValue.ToString()),
Convert.ToInt16(environmentFilterBox.SelectedValue.ToString()),
Convert.ToInt16(DefectTypeFilterBox.SelectedValue.ToString()));
}
catch (Exception ex)
{
mainTA.InsertQueryMainTable(Convert.ToInt16(equipmentFilterBox.SelectedValue.ToString()),
Convert.ToInt16(environmentFilterBox.SelectedValue.ToString()),
Convert.ToInt16(DefectTypeFilterBox.SelectedValue.ToString()), GetXmlMatrix(matrix), GetXmlMatrix(matrix), 1);
}
MessageBox.Show("Образец загружен.");
listBox1.Items.Add("=================");
listBox1.Items.Add("Образец из файла:");
listBox1.Items.Add(FileName);
listBox1.Items.Add("загружен!");
GrafSample.Enabled = true;
}
else MessageBox.Show("Файл не загружен");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
private void EquipmentAddButton_Click(object sender, EventArgs e)
{
EquipmentAddForm eAddForm=new EquipmentAddForm();
DialogResult result= eAddForm.ShowDialog();
switch (result)
{
case DialogResult.OK:
{
equipmentTableAdapter.Fill(defectBaseDataSet.Equipment);
equipmentBindingSource.ResetCurrentItem();
equipmentBindingSource1.ResetCurrentItem();
break;
}
case DialogResult.Cancel:
{
return;
}
}
}
private void EnvironmentAddButton_Click(object sender, EventArgs e)
{
EnvironmentAddForm eAddForm = new EnvironmentAddForm();
DialogResult resulr= eAddForm.ShowDialog();
switch (resulr)
{
case DialogResult.OK:
{
environmentTableAdapter.Fill(defectBaseDataSet.Environment);
environmentBindingSource.ResetCurrentItem();
environmentBindingSource1.ResetCurrentItem();
break;
}
case DialogResult.Cancel:
{
return;
}
}
}
private void DefectTypeAddButton_Click(object sender, EventArgs e)
{
DefectTypeAddForm dAdd = new DefectTypeAddForm();
DialogResult resultat = dAdd.ShowDialog();
switch (resultat)
{
case DialogResult.OK:
{
defect_typeTableAdapter.Fill(defectBaseDataSet.Defect_type);
defecttypeBindingSource.ResetCurrentItem();
break;
}
case DialogResult.Cancel:
{
return;
}
}
}
private void GrafSample_Click(object sender, EventArgs e)
{
matLabObj.Graf(FileName);
}
private void exitToolStripMenuItem_Click(object sender, EventArgs e)
{
Close();
}
private void GrafButton_Click(object sender, EventArgs e)
{
matLabObj.Graf(FileName);
}
private void EquipmentDelButton_Click(object sender, EventArgs e)
{
DialogResult result = MessageBox.Show("Уверены, что хотите удалить запись?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
switch (result)
{
case DialogResult.Yes:
{
DataRowView rowView = equipmentBindingSource.Current as DataRowView;
if (rowView != null)
{
DefectBaseDataSet.EquipmentRow row = rowView.Row as DefectBaseDataSet.EquipmentRow;
if (row != null) row.Delete();
defectTableAdapter.Update(defectBaseDataSet.Main_Table);
equipmentTableAdapter.Update(defectBaseDataSet.Equipment);
return;
}
break;
}
case DialogResult.No:
{
return;
}
}
}
private void EnvironmentDelButton_Click(object sender, EventArgs e)
{
DialogResult result = MessageBox.Show("Уверены, что хотите удалить запись?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
switch (result)
{
case DialogResult.Yes:
{
DataRowView rowView = environmentBindingSource.Current as DataRowView;
if (rowView != null)
{
DefectBaseDataSet.EnvironmentRow row = rowView.Row as DefectBaseDataSet.EnvironmentRow;
if (row != null) row.Delete();
defectTableAdapter.Update(defectBaseDataSet.Main_Table);
environmentTableAdapter.Update(defectBaseDataSet.Environment);
return;
}
break;
}
case DialogResult.No:
{
return;
}
}
}
private void DefectTypeDelButton_Click(object sender, EventArgs e)
{
DialogResult result = MessageBox.Show("Уверены, что хотите удалить запись?", "Удаление", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button1);
switch (result)
{
case DialogResult.Yes:
{
DataRowView rowView = defecttypeBindingSource.Current as DataRowView;
if (rowView != null)
{
DefectBaseDataSet.Defect_typeRow row = rowView.Row as DefectBaseDataSet.Defect_typeRow;
if (row != null) row.Delete();
defectTableAdapter.Update(defectBaseDataSet.Main_Table);
defect_typeTableAdapter.Update(defectBaseDataSet.Defect_type);
defecttypeBindingSource.ResetCurrentItem();
return;
}
break;
}
case DialogResult.No:
{
return;
}
}
}
private void оПрограммеToolStripMenuItem_Click(object sender, EventArgs e)
{
AboutBox1 about = new AboutBox1();
about.Show();
}
private void DiagnosticButton_Click(object sender, EventArgs e)
{
}
}
}