Разработка автоматизированной системы управления оценки качества полиграфической продукции

Создание автоматизированной системы, включающей системы видеоконтроля качества полиграфической продукции и ее учета. Разработка программной системы. Модули обработки информации и изображения. Общий алгоритм распознавания. Интерфейс системы управления.

Рубрика Программирование, компьютеры и кибернетика
Вид дипломная работа
Язык русский
Дата добавления 22.11.2015
Размер файла 3,0 M

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Комбинированные сканеры имеют более узкую рабочую зону по сравнению с классическими стационарными сканерами. Поэтому они не рекомендуются для использования в больших супермаркетах и гипермаркетах. Однако они идеально подходят для магазинов при автозаправках, магазинов одежды, обуви, магазинов хозяйственных товаров и строительных материалов, а также для аптек.

1.5 Патентный поиск

В соответствии с темой дипломного проекта был проведен патентный поиск в области проектирования и разработки баз данных. В ходе патентного поиска была изучена научно-техническая и патентная информация:

описание изобретений к патентам;

заявки на изобретения;

рефераты иностранных изобретений.

Результаты поиска сведены в таблицу 1.1.

Таблица 1.1 - Результаты патентного поиска

Страна

Номер патента

Название патента

Российская Федерация

2260208/12

Способ факсимильного распознавания печатной продукции

Российская Федерация

2150748/12

Устройство для контроля качества отпечатанных листов, в частности, ценных бумаг

1.6 Вывод

Использование сформулированных выше принципов при создании автоматизированной системы управления качества печатной продукции, позволяют повысить эффективность производства печатной продукции. Эти принципы можно рассматривать как неотъемлемую часть общей технологии создания автоматизированной системы.

2. Разработка программной системы

2.1 Общая схема работы

Автоматизированная система состоит из 3 модулей:

модуль работы с базой данных;

модуль обработки изображения;

модуль обработки пришедшей информации с терминала сбора данных.

Все модули реализованы на языке C# c применением.netFramework 4.5, однако очевидно, что можно реализовать данную систему схожим образом используя другой язык программирования.

Работа автоматизированной системы начинается с того что подключается дополнительное оборудование.

В данной дипломной работе использовалось следующее вспомогательное оборудование:

web-камера (1.3MHDWebCam);

терминал сбора данных (CipherLAb 8371).

На следующем этапе задаются основные настройки работы программы. Настраивается сетевое подключение, устанавливаются настройки камеры, подключается база данных.

Оператор может управлять системой, используя клавиатуру и мышь. Вся информация, полученная в ходе выполнения программы, может быть сохранена в виде файла на жестком диске либо занесена в базу данных. Результатом выполнения данного программного продукта будет формирования таблиц баз данных с занесением в них соответствующей информации.

2.2 Краткий обзор технических характеристик терминала Cipher 8371

Сканер штриховых кодов - это устройство, которое позволяет считывать информацию с маркировки товара в виде штрих-кода и передавать ее в компьютер, POS-терминал или ККМ.

Терминал CipherLab 8371 способен работать с большими и сверхбольшими базами данных (расширенная память) в режиме реального времени. Радиочастотный интерфейс терминала соответствует стандарту 802.11b/g. В качестве радиочастотного приемо-передатчика можно использовать любую доступную точку доступа 802.11b/g (AccessPoint).

Скорость обмена, по радиоинтерфейсу, выбирается устройством автоматически от 1 до 54 Мбит/сек, в зависимости от условий связи.

В таблице 2.1 приведены основные технические характеристики терминала сбора данных.

Таблица 2.1 - Технические характеристики сканера сбора данных

Характеристика

Описание

Процессор

16-битный CMOS процессор, пониженное энергопотребление

Память

10 Мб SRAM; 2 Мб Flash

Считывающее устройство

Лазерный сканер; Светодиодный сканер (CCD)

Расстояние считывания

Лазерный - до 95 см; светодиодный - до 20 см

Скорость сканирования

Лазерный - 36 скан/сек; светодиодный - 100 скан/сек

Операционная система

DOS-подобная

Дисплей

128Ч64 точек, ЖК индикатор (FSTN) со светодиодной подсветкой

Клавиатура

24 цифровые или 39 алфавитно-цифровые резиновые кнопки

Интерфейс подключения

RS-232, IrDA, USB, IEEE 802.11b/g Wi-Fi

Время работы без подзарядки

более 100 часов

Рабочая температура

от - 20°С до +60°С

Средства программирования

C, BASIC, "Генератор приложений",1С-компонента, OLE-компонента

Габаритные размеры

170 x 77 x 37 мм

Вес

250 г (с батареей)

2.3 Модуль обработки информации пришедшей с терминал сбора данных

В первую очередь, перед созданием каких-либо элементов взаимодействия с пользователем, необходимо создать программное обеспечение для связи с терминалом сбора данных. Используемый терминал сбора данных работает на стандартных протоколах обмена данных в сети, поэтому сервер, который отвечает за установку связи и обмен данным построен на архитектуре клиент-сервер с использованием механизма сокетов.

Созданный сервер обеспечивает подключение клиентов по сети wi-fi, на основе протокола TCP. Выбор именно это протокола обусловлен тем, что данных механизм, с предварительной установкой соединения, гарантирует уверенность того что информация доставлена. Такая уверенность еще обусловлена тем, что существует возможность создания повторного запроса при потере или дублировании полученной информации. Поскольку данный сервер постоянно находиться в состоянии прослушивания, то чтобы не нарушать работы всего комплекса, он реализован в виде отдельного потока. Данный модуль реализован при помощи следующего программного кода:

LocalPort = port;

ServThread = newThread (newThreadStart (ServStart));

ServThread. IsBackground = true;

ServThread. Start (); // запустили поток. Стартовая функция

Listener = newTcpListener (IPAddress. Any, LocalPort);

Listener. Start (); // начали слушать

try

{

ClientSock = Listener. AcceptTcpClient (); // пробуем принять

// клиента

}

catch

{

ServThread. Abort (); // уничтожить поток

return;

}

if (ClientSock. Connected)

{

while (true)

{

stream = ClientSock. GetStream (); // чтение сообщения

int i = stream. Read (bytes, 0, bytes. Length);

data = System. Text. Encoding. UTF8. GetString (bytes, 0, i);

Листинг 2.1 - Создание потока сервера

Поскольку информация, пришедшая от терминала, передается в виде строки с параметрами, то перед отправкой ответной информации на терминал или на форму, данную информацию необходимо разобрать на составляющие и обработать. Каждое сообщение от терминала, пришедшее на сервер, начинается с ключевого слова "STAT" с номером, которой идентифицирует выбор состояния на терминале (приложение Ж).

На следующем этапе часть сообщения отправляется на главную форму (рисунок 2.1) и отображается в виде соответствующих значений полей или значений переменных, после чего обрабатывается и отправляется в виде строки такого же формата.

Рисунок 2.1 - Отображение пришедшей информации от терминала

На серверной части приложения реализованы функции проверки повторяющейся информации. Данные функции реализованы при помощи следующего программного кода:

if (temp_scan == scan)

{

send = "STAT201Ошибка;; 1Этот лист уже +считан;;; 1 (предыдущий);;; \r";

shtrih_kod = "12";

}

if (scan == "1011999900099995")

{

send = "STAT20; 2Принудильное;; 2Завершение;; 2Партии;;; \r";

}

if (scan == "1012999900099994")

{

send = "STAT20; 2Выполнен;; 2Снимок;; 2Экрана;;;; \r";

if (npart! = number_partii&& scan! = "1011999900099995"&& scan! = "1012999900099994")

{ send = "STAT20; 2Ошибка;;; 2Не совпадает;; 2Номер партии;; \r";

shtrih_kod = "13";

}

else { shtrih_kod = scan; }

i++;

}

}

elsesend = "STAT20; 1Ошибка;; 1Партия; 1сформирована;;;; \r";

temp_scan = scan;

Листинг 2.2 - Функция проверки повторяющейся информации

При помощи данного кода реализованы и обработаны такие исключительные ситуации как считывание повторяющейся информации или считывание информации не соответствующей установленным настройкам.

После формирования сообщения и обработки исключительных ситуаций, информация отправляется на основную форму, где будет анализироваться и обрабатываться для формирования результирующих данных. Отправка и приём информации реализованы при помощи следующего программного кода:

staticstringin_m,out_m;

publicstringmessage_out ()

{

returnout_m;

}

publicstringmessage_in ()

{

returnin_m;

}

privatevoid timer1_Tick (object sender, EventArgs e)

{

stringsh = "", pr = "";

out_message = serv. message_out ();

in_message = serv. message_in ();

shtrih_kod = serv. message_shtrih_kod ();

Листинг 2.3 - Отправка и приём информации

Запуск и остановка сервера осуществляется нажатием кнопок "Старт" и "Стоп” на главной форме данного приложения. При нажатии кнопки "Старт" создается объект класса серверной части приложения и запускается функция создания соединения с клиентом. Функция создания реализована следующим образом:

publicvoidCreate_serv (intport)

{

LocalPort = port;

ServThread = newThread (newThreadStart (ServStart));

ServThread. IsBackground = true;

ServThread. Start (); // запустили поток.

}

Листинг 2.4 - Создание соединения с клиентом

В качестве параметра в функцию Create_serv передается значение номера порта по которому будет осуществляется прослушивание с целью подключения клиента. На стороне главной формы вызов этой функции выглядит следующим образом:

privatevoidbutton_start (object sender, EventArgs e)

{

flag_serv = 1;

intportx = Convert. ToInt32 (textBox_port. Text);

textBox_port. Enabled = false;

serv. Create_serv (portx);

}

Листинг 2.5 - Вызов функции Create_serv

При завершении подключения или при нажатии кнопки завершения выполняется функция закрытия соединения и уничтожения потока серверной части приложения.

Данный функционал реализован при помощи следующего программного кода:

privatevoidbutton_stop (object sender, EventArgs e)

{

if (textBox_n_list_max. Text == "Неопределено")

{

serv. abort ();

}

else

{

if (flag_serv == 1) { serv. server_stop (); serv. serv_close (); };

flag_serv = 0;

} }

Листинг 2.6 - Функция закрытия соединения

На стороне серверной части приложения выполняется следующий код:

Public voidserv_close ()

{

ServThread. Abort ();

Listener. Stop ();

ClientSock. Close ();

}

Листинг 2.7 - Функция уничтожения потока сервера

2.4 Модуль обработки изображения

Основной задачей данного модуля является обработка изображения, обнаружение и выделение обнаруженных контуров. Данный модуль реализован с использованием библиотек OpenCv, OpenCvEmgu. Данные библиотеки включают в себя алгоритмы компьютерного зрения, обработки изображений и численных алгоритмов общего назначения с открытым кодом. Библиотека OpenCv свободно использоваться в академических и коммерческих целях - распространяется в условиях лицензии BSD.

Основные функции модуля обработки изображения:

обработка изображения;

выделение контуров;

поиск контуров по шаблону.

Предполагается, что контур содержит необходимую информацию об объекте формы. Внутренние точки объекта не принимаются к вниманию. Это ограничивает область применения алгоритмов данного модуля, но рассмотрение только контуров позволяет перейти от двумерного пространства изображения - к пространству контуров, и тем самым снизить вычислительную и алгоритмическую сложность.

Контур - это граница объекта, совокупность точек (пикселов), отделяющих объект от фона. В системах компьютерного зрения используется несколько способов кодирования контура - наиболее известны код Фримена, двумерное кодирование, полигональное кодирование. В данном разрабатываемом модуле контур кодируется последовательностью, состоящей из комплексных чисел. На контуре фиксируется точка, которая называется начальной точкой. Затем, контур обходится, к примеру, по часовой стрелке, и каждый вектор смещения записывается комплексным числом a+ib. Где a - смещение точки по оси X, а b - смещение по оси Y. Смещение берется относительно предыдущей точки.

В силу физической природы трехмерных объектов, их контуры всегда замкнуты и не могут иметь самопересечения. Это позволяет однозначно определить путь обхода контура (с точностью до направления - по или против часовой стрелки). Последний вектор контура всегда приводит к начальной точке. Каждый вектор контура будем называть элементарным вектором (ЭВ). А саму последовательность комплекснозначных чисел - вектор-контуром (ВК). Вектор-контур Г длины k можно обозначить как:

(2.1)

Скалярным произведением контуров Г и N называется такое комплексное число:

(2.2)

где k - размерность ВК,

гn - n-й элементарный вектор контура Г,

нn - n-й ЭВ контура N. (гn, нn) - скалярное произведение комплексных чисел, вычисляемое как:

(2.3)

В линейной алгебре скалярное произведение равно произведению длин векторов на косинус угла между ними. Это значит, что два перпендикулярных вектора всегда будут иметь нулевое скалярное произведение, коллинеарные же вектора - напротив, будут давать максимальное значение скалярного произведения. Эти свойства произведения позволяют использовать его как определенную меру близости векторов. Чем оно больше - тем меньше угол между векторами, тем "ближе" они друг к другу.

Для перпендикулярных векторов - оно опускается до нуля, и далее становится отрицательным для векторов, направленных в разные стороны.

Оказывается, скалярное произведение также обладает похожими свойствами. Введем еще одно понятие - нормированное скалярное произведение (НСП):

(2.4)

где |Г| и |N| - нормы (длины) контуров, вычисляемые как:

(2.5)

НСП в пространстве комплексных чисел, также является комплексным числом.

При этом единица - это максимально возможное значение модуля НСП и она достигается только если:

(2.6)

Вспомним физический смысл умножения комплексных чисел. При умножении комплексных чисел, их модули (длины) перемножаются, а аргументы (углы) - складываются. Значит контур мN это тот же контур N, но повернутый и промасштабированный. Масштаб и поворот определяется комплексным числом м.

Итак, модуль НСП достигает максимального значение - единицы, только если контур Г является тем же контуром N, но повернутым на некоторый угол и промасштабированный на определенный коэффициент.

Аналогично, если мы умножим ВК на некоторый действительный коэффициент (промасштабируем), то мы также получим НСП=1. Модуль нормированного скалярного произведения контуров даст единицу только в том случае, если эти два контура равны с точностью до поворота и масштаба. В противном случае, модуль НСП будет строго меньше единицы.

Фактически, модуль НСП является инвариантом по переносу, вращению и масштабированию контуров. Если есть два одинаковых контура, то их НСП всегда даст единицу, не зависимо от того, где контуры находятся, каков их угол поворота и масштаб. Аналогично, если контуры различны, то их НСП будет строго меньше единицы, и также независимо от места, вращения и масштаба.

НСП является важной функцией для поиска похожих между собой контуров. К сожалению, есть одно обстоятельство не позволяющее использовать его напрямую, а именно: выбор начальной точки. Дело том, что равенство достигается, только если начальные точки контуров - совпадают. Если же контуры одинаковы, но отсчет ЭВ начинается с другой начальной точки, то модуль НСП таких контуров не будет равен единице.

Введем понятие взаимокорреляционной функции (ВКФ) двух контуров:

(2.7)

где N (m) - контур, полученный из N путем циклического сдвига ЭВ на m элементов.

Значения этой функции показывают насколько похожи контуры Г и N, если сдвинуть начальную точку N на m позиций. ВКФ определена на всем множестве целых чисел, но поскольку циклический сдвиг на k приводит нас к исходному контуру, то ВКФ является периодической, с периодом k. Поэтому нас будет интересовать значения этой функции только в пределах от 0 до k-1.

Найдем величину, имеющую максимальный модуль среди значений ВКФ:

. (2.8)

Из определений НСП и ВКФ, понятно, что фmax является мерой похожести двух контуров, инвариантной переносу, масштабированию, вращению и сдвигу начальной точки. При этом модуль |фmax| показывает степень похожести контуров, и достигает единицы для одинаковых контуров, а аргумент arg (фmax) дает угол поворота одного контура, относительно другого. Введем еще одно понятие - автокорреляционной функции (АКФ). Автокорреляционная функция является ВКФ для которой N=Г. По сути - это скалярное произведение контура самого на себя при различных сдвигах начальной точки:

(2.9)

2.5 Общий алгоритм распознавания

Общая последовательность действия при распознавании выглядит так:

предварительная обработка изображения - сглаживание, фильтрация помех, повышение контраста;

бинаризация изображения и выделение контуров объектов;

начальная фильтрация контуров по периметру, площади, коэффициенту формы, фрактальности и так далее;

приведение контуров к единой длине, сглаживание;

перебор всех найденных контуров, поиск шаблона, максимально похожего на данный контур.

Как уже было отмечено, контурный анализ подразумевает одинаковую длину контуров. В реальном же изображении контуры имеют произвольную длину. Поэтому, для поиска и сравнения контуров, все они должны быть приведены к единой длине. Этот процесс называется эквализацией. Итак, сначала мы фиксируем длину ВК, которую мы будем использовать в нашей системе распознавания. Обозначим ее k. Затем, для каждого исходного контура Г создаем вектор-контур N длиной k. Далее возможно два варианта - либо исходный контур имеет большее число ЭВ чем k, либо меньшее число чем k. Если исходный контур больше необходимого, то перебираем все его ЭВ, и считаем элементы N как сумму всех ЭВ, следующим образом Complex []

Complex [] newPoint = new Complex [newCount];

for (int i = 0; i < Count; i++)

newPoint [i * newCount / Count] += this [i];

Этот алгоритм достаточно грубый, особенно для длин немногим больших k, однако он вполне применим на практике.

С одной стороны, большая длина k означает большие затраты на вычисления. С другой стороны - малые значения k несут меньше информации, и точность распознавания снижается, а распознавание шума - увеличивается. При больших значениях (от 80 и выше) длины контура, параметры системы стабилизируются и мало меняются (кроме времени обработки, которое, естественно, увеличивается).

При малых значениях k (менее 30) - резко повышается число шумовых распознаваний распознавание как символов шума или других не символьных элементов изображения, снижается число верных, и увеличивается число ложных распознаваний.

Библиотека ContourAnalysis реализует основные функции контурного анализа - создание контуров, скалярного произведения контуров, выравнивание, оценки МВФ и АКФ, сравнение и поиск шаблонов.

Класс Contour создает и сохраняет контуры. Он содержит основные операции для контуров - скалярное произведение, масштабирование, выравнивание, нормализация, спектр оценки, оценки АКФ и МВФ.

Вычисление автокорреляционной функции:

publicunsafeContourAutoCorrelation (bool normalize)

{

int count = Count/2;

Contour result = newContour (count);

fixed (Complex* ptr = &result. array [0])

{

Complex* p = ptr;

doublemaxNormaSq = 0;

for (int i = 0; i < count; i++)

{

*p = Dot (this, i);

doublenormaSq = (*p). NormaSquare;

if (normaSq>maxNormaSq)

maxNormaSq = normaSq;

p++;

}

if (normalize)

{

maxNormaSq = Math. Sqrt (maxNormaSq);

p = ptr;

for (int i = 0; i < count; i++)

{

*p = newComplex ( (*p). a / maxNormaSq, (*p). b / maxNormaSq);

returnresult;

}

Листинг 2.9 - Вычисление автокорреляционной функции

Приведение контуров к единому размеру реализовано при помощи следующего кода:

publicComplexNormDot (Contour c)

{

var count = this. Count;

doublesumA = 0;

doublesumB = 0;

double norm1 = 0;

double norm2 = 0;

for (int i = 0; i < count; i++)

{

var x1 = this [i];

var x2 = c [i];

sumA += x1. a * x2. a + x1. b * x2. b;

sumB += x1. b * x2. a - x1. a * x2. b;

norm1 += x1. NormaSquare;

norm2 += x2. NormaSquare;

}

double k = 1d / Math. Sqrt (norm1*norm2);

returnnewComplex (sumA * k, sumB * k);

}

Листинг 2.10 - Приведение контуров к единому размеру

Вычисление взаимокорреляционной функции, реализовано при помощи следующего программного кода:

publicContourInterCorrelation (Contour c, intmaxShift)

{

Contour result = newContour (maxShift);

int i = 0;

int count = Count;

while (i <maxShift/2)

{

result. array [i] = Dot (c, i);

result. array [maxShift - i - 1] = Dot (c, c. Count - i - 1);

i++;

}

returnresult;

Листинг 2.11 - Вычисление взаимокорреляционной функции

Класса Template используется для создания базовых шаблонов. Этот класс хранит контур и линейные параметры исходного контура. Кроме того, шаблон имеет name, которое используется в качестве основной идентификации контура.

Конструктор класса Template, в котором задаются первичные параметры необходимые для обнаружения контуров в изображении:

public Template (Point [] points, doublesourceArea, inttemplateSize)

{

this. sourceArea = sourceArea;

startPoint = points [0];

contour = newContour (points);

contour. Equalization (templateSize);

contourNorma = contour. Norma;

autoCorr = contour. AutoCorrelation (true);

CalcAutoCorrDescriptions ();

Листинг 2.12 - Вычисление взаимокорреляционной функции при помощи

Класс TemplateFinder реализует поиск шаблона для данного контура. Результатом работы этого класса является поиск заданного контура. Поиск заданного контура реализован следующим кодом:

publicFoundTemplateDescFindTemplate (Templates templates, Template sample)

{

double rate = 0;

double angle = 0;

ComplexinterCorr = default (Complex);

TemplatefoundTemplate = null;

foreach (var template in templates) { //

if (Math. Abs (sample. autoCorrDescriptor1 - template. autoCorrDescriptor1) >maxACFDescriptorDeviation) continue;

if (Math. Abs (sample. autoCorrDescriptor2 - template. autoCorrDescriptor2) >maxACFDescriptorDeviation) continue;

if (Math. Abs (sample. autoCorrDescriptor3 - template. autoCorrDescriptor3) >maxACFDescriptorDeviation) continue;

if (Math. Abs (sample. autoCorrDescriptor4 - template. autoCorrDescriptor4) >maxACFDescriptorDeviation) continue; //

double r = 0;

if (checkACF)

r = template. autoCorr. NormDot (sample. autoCorr). Norma;

if (r <minACF)

continue;

if (checkICF)

interCorr = template. contour. InterCorrelation (sample. contour). FindMaxNorma ();

r = interCorr. Norma / (template. contourNorma * sample. contourNorma);

if (r <minICF)

continue;

if (Math. Abs (interCorr. Angle) >maxRotateAngle)

continue;

if (template. preferredAngleNoMore90 &&Math. Abs (interCorr. Angle) >= Math. PI / 2)

if (r >= rate)

rate = r;

foundTemplate = template;

angle = interCorr. Angle;

// ignore antipatterns

if (foundTemplate! = null&& foundTemplate. name == antiPatternName)

foundTemplate = null;

Листинг 2.13 - Класс TemplateFinder

Также FoundTemplateDesc содержит коэффициенты сходства, угол поворота и масштаба контура, по отношению к шаблону.

ContourAnalysisProcessing содержит методы предварительной обработки изображения, выбора контуров и фильтрации класс ImageProcessor используется для обработки изображений и, кроме того, хранит базу шаблонов.

Метод ImageProcessor. ProcessImage () принимает изображение на входе. Итоги операции обнаружены списки контуров (ImageProcessor. samples) и список найденных контуров (ImageProcessor. foundTemplates). Также класс ImageProcessor содержит параметров поиска контуров.

// findcontours

varsourceContours = grayFrame. FindContours (Emgu. CV. CvEnum. CHAIN_APPROX_METHOD. CV_CHAIN_APPROX_NONE, Emgu. CV. CvEnum. RETR_TYPE. CV_RETR_LIST);

// filter contours

contours = FilterContours (sourceContours, cannyFrame, grayFrame. Width, grayFrame. Height);

// find templates

lock (foundTemplates)

foundTemplates. Clear ();

samples. Clear ();

// filter

Image<Gray, byte>smoothedGrayFrame = grayFrame. PyrDown ();

smoothedGrayFrame = smoothedGrayFrame. PyrUp ();

// canny

Image<Gray, byte>cannyFrame = null;

if (noiseFilter)

cannyFrame = smoothedGrayFrame. Canny (newGray (cannyThreshold), newGray (cannyThreshold));

// smoothing

if (blur) grayFrame = smoothedGrayFrame;

Листинг 2.14 - Класс TemplateFinder

2.6 Модуль работы с базой данных

Данный модуль используется для хранения и получения информации используемой для учета и анализа информации о продукции, которая прошла графический анализ. Также в данном модуле реализованы классы и методы для работы с базой данных. При разработке дипломного проекта использовалась система управлением баз данных Microsoft SQL Server 2012. Microsoft SQL Server ? одна из наиболее мощных систем работы с базами данных в архитектуре "клиент-сервер". Особенность системы работа сервера только в операционных системах ряда MicrosoftWindows NT ? NT Server 4.0, 2000 Server, Server 2003\2008, при этом клиентская часть может взаимо-действовать с сервером из других операционных систем.

В своем составе система имеет средства создания баз данных, работы с информацией баз данных, перенесения данных из других систем и в другие системы, резервного копирования и восстановления данных, развитую систему транзакций, систему репликации данных, реляционную подсистему для анализа, оптимизации и выполнения запросов клиентов, систему безопасности для управления правами доступа к объектам базы данных. Модуль работы с базой данный содержит в себе методы для создания подключения с базой данных, добавления и удаления записей, выполнения процедур и функции расположенных в базе данных. Прежде тем использовать весь обширный функционал данного модуля необходимо создать несколько таблиц. Таблица dbo. Part_list (рисунок 2.2) будет содержать в себе информацию о партии, в состав которой будет входить продукции. В данной таблице есть такие поля как номер партии (n_part), количество листов хранящиеся в данной партии (kol_list), признак завершения формирования партии (priz_zaversh), дата формирования партии (date_zaversh), отметка качества продукции (metka_kachestva).

Рисунок 2.2 - Таблица dbo. Part_list

Так же используется таблица dbo. Putev_list (рисунок 2.3), которая содержит в себе обработанную графическую информацию и информацию, полученную от терминалов сбора данных. Данная таблица содержит в себе информацию о номере партии (n_partii), о количестве обработанных листах (n_list), о номер штрих-кода (shtrih_kod), о количестве обнаруженных контуров (kol_obraz). Также в этой таблице хранятся изображения, которые не соответствуют критериям проверки качества, фамилия оператора и дата со временем.

Рисунок 2.3 - Таблица dbo. Putev_list

В ходе выполнения программы необходимо получать информации о составе партии и метках формирования. Функции получения количества листов в партии реализовано при помощи следующего кода:

publicstringpar_kol (stringn_part)

{

stringconnStr = @"Data Source=NOUT\SQLEXPRESS; Initial Catalog=vova_db; Integrated Security=True";

/*Здесь указал имя БД

Создаем экземпляр класса SqlConnection по имени conn

и передаем конструктору этого класса, строку подключения

*/

SqlConnection conn = newSqlConnection (connStr);

conn. Open ();

SqlCommandcmd = newSqlCommand ("SELECT [kol_list] FROM [dbo]. [Part_list] where n_part=@n_part", conn);

cmd. Parameters. Add ("@n_part", n_part);

stringout_m = "Не определено";

SqlDataReaderdataReader = cmd. ExecuteReader ();

while (dataReader. Read ())

{

for (int i = 0; i <dataReader. FieldCount; i++)

{

out_m = dataReader. GetValue (i). ToString ();

}

Листинг 2.15 - Функции получения количества листов в партии

В ходе выполнения функции par_kol выполняется sql запрос в результате которого формируется значения количества листов в ходящих в состав партии.

Для отображения информации хранящейся в таблице базы данных используется функция show_table. В ходе выполнения данной функции создается подключения к базе данных, формируется запрос и формируется результат, который передается на один из компонентов хранящихся на главной форме приложения. Данная функция реализована при помощи следующего программного кода:

privatevoidShow_table ()

{

stringconnStr = @"Data Source=NOUT\SQLEXPRESS; Initial Catalog=vova_db; Integrated Security=True";

/*Здесь указал имя БД (хотя для создания БД его указывать не нужно)

SqlConnection conn = newSqlConnection (connStr);

conn. Open ();

SqlCommandcmd = newSqlCommand ("Select * from Putev_list order by id", сonn)

SqlDataReaderdataReader = cmd. ExecuteReader ();

stringst;

intItemIndex = 0;

listView1. Items. Clear ();

while (dataReader. Read ())

for (int i = 0; i <dataReader. FieldCount; i++)

st = dataReader. GetValue (i). ToString ();

switch (i)

{

case 0: // ID

listView1. Items. Add (st);

break;

case 1: // n-парти

listView1. Items [ItemIndex]. SubItems. Add (st);

break;

case 2: // номерлиста

listView1. Items [ItemIndex]. SubItems. Add (st);

break;

case 3: // штрих-код

listView1. Items [ItemIndex]. SubItems. Add (st);

};

}

ItemIndex++;

}

conn. Close ();

}

Листинг 2.16 - Отображения информации хранящейся в таблице БД

Для выполнения вставки записи в таблицу используется функция insert. Данная функция вызывается на главной форме приложения по таймеру. Перед вызовом проверяется обновилась ли информация и установлены ли определенные отметки указывающие о том что информация может быть передана базе данных.

Данные операции реализованы при помощи следующего программного кода:

if (flag_ustanovki_n_partii == false&& pr! = "0")

{

N_partii = pr; flag_ustanovki_n_partii = true;

}

if (sh. Length> 3 && (sh! = "13"&&sh! = "12"&&sh! = "1012999900099994"&&sh! = "1011999900099995") &&sh! = temp_sh)

{

if (flag_part_finish==false)

insert (Convert. ToInt32 (sh. Substring (11,4)), false, sh, textbox_id_person. Text);

}

if (sh == "1012999900099994"&&sh! = temp_sh)

{

if (flag_part_finish == false)

insert (0, true, "n", textbox_id_person. Text);

}

if (sh == "1011999900099995"&&sh! = temp_sh)

{

if (flag_part_finish ==false)

// insert (0, true, "n", textbox_id_person. Text);

set_status1 (serv. message_number_partii ());

flag_prin_zaversh = true;

Show_table2 ();

}

Листинг 2.17 - Выполнения вставки записи в таблицу

В ходе выполнения программы может понадобиться удалить все записи из таблицы или изменить какие либо значения полей таблицы, данные функции реализованы при помощи следующего кода:

publicvoid TRUNCATE ()

{

stringconnStr = @"Data Source=NOUT\SQLEXPRESS; Initial Catalog=vova_db; Integrated Security=True";

SqlConnection conn = newSqlConnection (connStr);

conn. Open ();

SqlCommandcmd = newSqlCommand ("TRUNCATE table putev_list", conn);

SqlDataReaderdataReader = cmd. ExecuteReader ();

conn. Close ();

}

publicvoidreset_status (string n_part1)

{

stringconnStr = @"Data Source=NOUT\SQLEXPRESS; Initial Catalog=vova_db; Integrated Security=True";

SqlConnection conn = newSqlConnection (connStr);

conn. Open ();

string text = "UPDATE [dbo]. [Part_list] SET [priz_zaversh] =0, date_zaversh= Null, [metka_kachestva] = null WHERE n_part=@n_part";

SqlCommand command = newSqlCommand (text, conn);

command. Parameters. Add ("@n_part", n_part1);

command. ExecuteScalar ();

conn. Close ();

}

Листинг 2.18 - Удаление записей

2.7 Интерфейс системы управления

При разработке интерфейса необходимо было решить задачу размещения элементов управления графическими объектами и элементов работы с базой данных. В ходе разработки дипломного проекта были использованы элементы, входящие в состав VisualStudio 2012 и компонент отображения графических изображений входящий в состав библиотеки Emgu. Util. Компонент PictureBox позволяет отображать картинку. Основное свойство компонента - image.

Если вызвать редактор свойства, то появится окно работы с изображением. Вы можете указать положение картинки на диске или в Интернете.

В этом случае картинка не попадет в файл ресурсов, а останется на том месте, где и была.

В компоненте будет только ссылка на файл, которую вы должны указать в свойстве imageLocation. В данной дипломной работе в качестве изображения в компонент передается поток изображения с web-камеры.

Загрузка изображения реализована при помощи следующего кода:

privatevoidbtLoadImage_Click (object sender, EventArgs e)

{

OpenFileDialogofd = newOpenFileDialog ();

ofd. Filter = "Image|*. bmp; *. png; *. jpg; *. jpeg";

if (ofd. ShowDialog (this) == System. Windows. Forms. DialogResult. OK)

try

{

frame = newImage<Bgr, byte> ( (Bitmap) Bitmap. FromFile (ofd. FileName));

}

catch (Exception ex)

{MessageBox. Show (ex. Message); }

Листинг 2.19 - Загрузка изображения

Для отображения информации из базы данных в данном дипломном проекте использовался компонент ListView (рисунок 2.5). Элемент управления ListView используется для отображения значений из источника данных. Он сходен с элементом управления GridView, только он отображает данные с использованием пользовательских шаблонов, а не полей строк. Создание собственных шаблонов обеспечивает большую гибкость управления отображением данных.

Рисунок 2.5 - Компонент ListView

В процессе выполнения программы существует возможность просмотра "некачественного" изображения. Это изображения хранится в базе данных и для того чтобы его загрузить необходимо выбрать строку из ListView. Процесс выбора строки из таблицы описывается следующим программным кодом:

privatevoid listView1_ItemSelectionChanged (object sender, ListViewItemSelectionChangedEventArgs e)

{ button5. Enabled = true;

button6. Enabled = true;

if (e. IsSelected)

{

// фокус

for (int i = 0; i < listView1. Items [e. ItemIndex]. SubItems. Count; i++)

{ switch (i)

{

case 0:

e_select_id = listView1. Items [e. ItemIndex]. SubItems [i]. Text;

break;

case 1:

Листинг 2.20 - Выбор строки из таблицы

Для отображения состояния процесса и хода выполнения программы используется компоненты отображения информации Label и TextBox. Элементы управления Labelо обычно используются для отображения описательного текста для элемента управления. Например, элемент управления Label служит для добавления описательного текста для элемента управления TextBox, информирующего о типе данных, ожидаемых в элементе управления. Элементы управления Label могут также использоваться для добавления описательного текста Form, чтобы предоставить пользователю полезные сведения. Например, можно добавить класс Labelв начало Form, предоставляющей инструкции по вводу данных в элементы управления формы. Элементы управления Label могут использоваться также для отображения сведений о времени выполнения и состоянии приложения. Например, можно добавить в форму элемент управления Label для отображения состояния каждого файла как списка обрабатываемых файлов. TextBox используется для ввода/вывода текста, который в последующем используется в программе, или для вывода результатов расчетов программы.

В процессе выполнения программы в компонентах отображения текста можно видеть данные о номере партии, количестве листов, количестве обнаруженных образов, рисунок 2.6.

Рисунок 2.6 - отображения состояния процесса

Для удобства перехода между формами в приложения реализовано меню Toolstrip (рисунок 2.7). Панели Toolstrip чаще всего дублируют функции, которые уже есть, предоставляя пользователю возможность быстро вызвать команду. Для удобного создания меню лучше всего использовать компонент класса Toolstrip.

Рисунок 2.7 - Меню Toolstrip

2.8 Вывод

В данной главе рассмотрены основные методы и функции, с помощью которых возможна реализация данного дипломного проекта. На основании изложенного материала разработаны основные модули системы.

3. Экономический раздел

3.1 Общая характеристика программного средства

Главной целью экономического раздела является экономическое обоснование целесообразности разработки программного средства (ПС), представленного в дипломном проекте. В данном разделе пояснительной записки проводится расчет затрат на всех стадиях разработки и расчет экономии основных видов ресурсов в связи с использованием данного программного средства.

Особенностью современных бизнес процессов в любой отрасли общественной деятельности является автоматизация сбора и обработки информации для принятия управленческих решений. Вместе с тем, автоматизация невозможна без использования различных программных продуктов. Решение любой информационной задачи связано с применением не только системных программ, но и разнообразных программных средств-приложений.

В современных рыночных экономических условиях ПС выступает преимущественно в виде продукции организаций, представляющей собой функционально завершенные и имеющие товарный вид ПС ВТ, реализуемые покупателям по рыночным отпускным ценам. Все завершенные разработки ПС ВТ являются научно-технической продукцией.

Разработка проектов программных средств требует затрат разнообразных и, не редко значительных объемов ресурсов (трудовых, материальных, финансовых). В связи с этим, разработка и реализация каждого проекта должна быть обоснована, как технически, так и экономически.

3.2 Исходные данные

Созданное программное средство принадлежит ко второй группе программ по степени сложности и по степени новизны относится к группе B.

Общий объем программных средств рассчитывается по формуле:

(5.1)

где VO - общий объем программного средства, условных машино-команд;

Vi - объем i-ой функции ПС, условных машино-команд;

n - общее число функций.

На основании имеющейся информации о функциях разрабатываемого ПС определяется его общий объем в условных машинных командах.

Исходные данные для расчета стоимости программного продукта представлены в таблице 3.1.

Таблица 3.1 - Исходные данные для расчетов

Наименование показателя

Единица измерения

Условные обозначения

Норматив

Коэффициент изменения скорости обработки информации

ед.

Кск

0,5

Численность разработчиков

чел.

Чр

1

Тарифная ставка 1-го разряда в организации

руб.

Сзм1

435 000

Тарифный коэффициент

ед.

Кт

2,65

Фонд рабочего времени

дн

ФРВ

247

Коэффициент естественных потерь рабочего времени

ед.

Кп

1,3

Коэффициент премирования

ед.

Кпр

1,3

Норматив дополнительной заработной платы

%

Ндз

10

Ставка отчислений в Фонд социальной защиты населения

%

Нфсзн

34

Ставка отчислений по обязательному страхованию от несчастных случаев на производстве и профессиональных заболеваний

%

Нбгс

0,5

Цена одного машино-часа

руб.

Цм

506,42

Норматив прочих затрат

%

Нпз

13

Норматив накладных расходов

%

Ннр

110

Норматив расходов на сопровождение и адаптацию

%

Нрса

10

Уровень рентабельности

%

Урн

30

Ставка НДС

%

Нндс

20

3.3 Определение объема программного средства

Объем ПС определяется путем подбора аналогов на основании классификации типов ПС, каталога функций ПС и аналогов ПС в разрезе функций, которые постоянно обновляются и утверждаются в установленном порядке. На основании информации о функциях разрабатываемого ПС по каталогу функций определяется объем функций. Общий объем ПС рассчитывается по формуле:

(3.1)

гдеVo - общий объем ПС, условных машино-команд;

Vi - объем i-ой функции ПС, условных машино-команд;

n - общее число функцией.

Содержание и объем функций на разрабатываемое программное средство приведены в таблице 3.2.

Таблица 3.2 - Содержание и объем функций на разрабатываемое программное средство

№ функции

Содержание функции

Объем, условных машино-команд

101

Организация ввода информации

150

203

Формирование баз данных

2180

205

Обслуживание базы данных в пакетном режиме

1260

208

Организация поиска и поиск в базе данных

5480

507

Обеспечение интерфейса между компонентами

970

601

Отладка прикладных программ в интерактивном режиме

4300

ИТОГО:

14340

Vo = 150 + 2180 + 1260 + 5480 + 970 + 4300 = 14340 (условных машино-команд).

В связи с достаточно быстрым изменением ВТ рекомендуется определить скорректированный объем функций по формуле:

Vo/ = Vo· Кск, (3.2)

гдеVo/ - скорректированный объем ПС, условных машино-команд;

Vo - общий объем ПС, условных машино-команд;

Кск - коэффициент изменения скорости обработки информации.

Кск = 0,5 - по исходным данным, приведенным в таблице 3.1, Vo = 14340 условных машино-команд - подсчитано по формуле (3.1).

Vo/ = 14340 · 0,5 = 7170 (условных машино-команд).

3.4 Расчет трудоемкости выполняемой работы

Определение трудоемкости необходимо для дальнейшего расчета суммы основной заработной платы.

Сумма основной заработной платы рассчитывается на основе численности специалистов, соответствующих тарифных ставок и фонда рабочего времени. Причем численность специалистов, календарные сроки разработки программы и фонд рабочего времени определяются по укрупненным нормам времени на разработку, сопровождение и адаптацию ПС или экспертным путем. Расчет трудоемкости ПС с использованием укрупненных норм времени осуществляется в основном в крупных научно-технических организациях для решения сложных задач программного обеспечения ВТ. В мелких и средних научно-технических организациях трудоемкость, численность исполнителей и сроки разработки ПС определяются экспертным путем с использованием данных по базовым моделям.

При определении трудоемкости ПС учитываются объем ПС (в тысячах строк условного кода), объем документации (тыс. строк), новизна и сложность ПС, язык программирования, степень использования типовых (стандартных программ).

На основании общего объема ПС определяется нормативная трудоемкость (Тн). Нормативная трудоемкость устанавливается с учетом сложности ПС. Выделяется три группы сложности, в которых учтены следующие составляющие ПС; языковой интерфейса, ввод-вывод, организация данных, режим работы, операционная и техническая среда. Кроме того, устанавливаются дополнительные коэффициенты сложности ПС).

С учетом дополнительного коэффициента сложности Ксл рассчитывается общая трудоемкость ПС:

(3.3)

гдеТо - общая трудоемкость ПС, человеко-дней;

Тн - нормативная трудоемкость ПС, человеко-дней;

Ксл - дополнительный коэффициент сложности ПС, ед.

Тн = 184 человеко-дня - по данным, приведенным в приложении 3 методического пособия [5]; Ксл = 0,06 - по данным, приведенным в методическом пособии приложении 4 таблице 4.2.

То = 184 · (1 + 0,06) = 195,04 человеко-дней.

3.5 Расчет основной заработной платы

В соответствии с "Рекомендациями по применению "Единой тарифной сетки" рабочих и служащих народного хозяйства" и тарифными разрядами и коэффициентами должностей каждому исполнителю устанавливается разряд и тарифный коэффициент.

Месячная тарифная ставка каждого исполнителя определяется путем умножения действующей месячной тарифной ставки 1-го разряда на тарифный коэффициент, соответствующий установленному тарифному разряду.

Сзм= Сзм1. Кт, (3.4)

гдеСзм - тарифная ставка за месяц, руб.;

Сзм1 - тарифная ставка 1-го разряда за месяц, руб.;

Кт - тарифный коэффициент, ед.

Сзм1 = 435 000 - по исходным данным; Кт = 2,65 - по исходным данным, приведенным в таблице 3.1.

Сзм = 435 000 · 2,65 = 1 152 750 руб.

Основная заработная плата исполнителей на конкретное ПС рассчитывается по формуле:

, (3.5)

гдеСоз - основная заработная плата, руб.;

Сзд - тарифная ставка за день, руб.;

То - общая трудоемкость ПС, человеко-дней;

Кп - коэффициент естественных потерь рабочего времени, ед.;

Кпр - коэффициент премирования, ед.

То = 195,04 человеко-дней - подсчитано по формуле (8.3); Кп = 1,3 - по исходным данным, приведенным в таблице 3.1; Кпр = 1,3 - по исходным данным, приведенным в таблице 3.1.

Соз = 1 152 750/21,5·195,04 · 1,3 · 1,3 = 17 672 869 руб.

3.6 Расчет дополнительной заработной платы

Дополнительная заработная плата на конкретное ПС включает выплаты, предусмотренные законодательством о труде (оплата отпусков, льготных часов, времени выполнения государственных обязанностей и других выплат, не связанных с основной деятельностью исполнителей), и определяется по нормативу в процентах к основной заработной плате:

, (3.6)

гдеСдз - дополнительная заработная плата на конкретное ПС, руб.;

Соз - основная заработная плата, руб.;

Ндз - норматив дополнительной заработной платы, %.

Соз = 17 672 869 руб. - подсчитано по формуле (3.5); Ндз = 10% - по исходным данным, приведенным в таблице 3.1.

Сдз = (17 672 869 · 10) / 100 = 1 767 287 руб.

3.7 Расчет отчислений в Фонд социальной защиты населения

Отчисления в Фонд социальной защиты населения (ФСЗН) определяются в соответствии с действующими законодательными актами по нормативу в процентном отношении к фонду основной и дополнительной зарплаты исполнителей.

(3.7)

Где Сфсзн - сумма отчислений в Фонд социальной защиты населения, руб.;

Нфсзн - норматив отчислений в Фонд социальной защиты населения, %.

Соз - основная заработная плата, руб.;

Сдз - дополнительная заработная плата на конкретное ПС, руб.

Соз = 17 672 869 руб. - подсчитано по формуле (3.5); Сдз = 1 767 287 руб. - подсчитано по формуле (3.6); Нфсзн = 34% - по исходным данным, приведенным в таблице 3.1.

Сфсзн = ( (17 672 869 + 1 767 287) · 34) / 100 = 6 609 653 руб.

3.8 Расчет отчислений по обязательному страхованию от несчастных случаев на производстве и профессиональных заболеваний

Расчет отчислений по обязательному страхованию от несчастных случаев на производстве и профессиональных заболеваний выполняется в соответствии с действующими законодательными правовыми актами нашего государства в зависимости от уровня риска отрасли, к которой относится данная организация-разработчик.

(3.8)

гдеСбгс - сумма отчислений по страхованию от несчастных случаев;

Нбгс - норматив отчислений по страхованию от несчастных случаев, %;

Соз - основная заработная плата, руб.;

Сдз - дополнительная заработная плата на конкретное ПС, руб.

Соз = 17 672 869 руб. - подсчитано по формуле (3.5); Сдз = 1 767 287 руб. - подсчитано по формуле (3.6); Нбгс = 0,5% - по исходным данным, приведенным в таблице 3.1.

Сбгс = ( (17 672 869 + 1 767 287) · 0,5) / 100 = 97 201 руб.

3.9 Расчет расходов на спецоборудование

Расходы включают затраты средств на приобретение вспомогательных специального назначения технических и программных средств, необходимых для разработки конкретного программного средства, включая расходы на их проектирование, изготовление, отладку, установку и эксплуатацию. Затраты по этой статье определяются в соответствии со сметой расходов, которая составляется перед разработкой программного средства. Данная статья включается в смету расходов на разработку ПС только в том случае, когда приобретаются специальное оборудование или специальные программы, предназначенные для разработки и создания только данного программного средства. Затраты на спецоборудование не предвидятся.

3.10 Расчет расходов на материалы

Расходы на материалы определяются с учетом действующих нормативов. По данной статье отражаются расходы на магнитную носители, перфокарты, бумагу, красящие ленты и другие материалы, необходимые для разработки ПС. Нормы расхода материалов в суммарном выражении определяются в расчете на 100 строк исходного кода. Общая сумма затрат на используемые материалы рассчитывается по формуле:

(3.9)

Где См - сумма расходов на материалы, руб.;

Нм - норма расхода материалов в расчете на 100 строк исходного кода программного средства, руб.;

Vo/ - скорректированный объем ПС, условных машино-команд.

Vo/ = 7170 условных машино-команд - подсчитано по формуле (3.2); Нм = 380 руб. - по исходным данным, приведенным в приложении 5 методического пособия.

См = 380 · 7170/100 = 27 246 руб.

3.11 Расчет расходов на оплату машинного времени

Расходы включают оплату машинного времени, необходимого для разработки и отладки ПС, которое определяется по нормативам (в машино-часах) на 100 строк исходного кода машинного времени в зависимости от характера решаемых задач и типа ПЭВМ.

(3.10)

Где Смв - сумма расходов на оплату машинного времени, руб.;

Цм - цена одного машино-часа, руб.;

Нмв - норматив расхода машинного времени на отладку 100 строк программного кода;


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.