38845

Экспертная система комплексного диагностирования линейной части магистрального газопровода ЭС «Диагностика ЛЧ МГ»

Дипломная

Информатика, кибернетика и программирование

В рамках проделанной работы проведено детальное обследование предметной области, составлен перечень функциональных задач, исследованы аналоги автоматизированных систем, спроектирована инфологическая модель предметной области, реализована ЭС «Диагностика ЛЧ МГ»

Русский

2014-12-26

3.02 MB

21 чел.

PAGE  4

ГОУ ВПО

«СУРГУТСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ

Ханты-Мансийского автономного округа – Югры»

                                                                              

Кафедра «Автоматизированных систем обработки информации и управления»

куклин антон анатольевич

экспертная система комплексного диагностирования линейной части магистрального газопровода

ЭС «Диагностика ЛЧ МГ»

ДИПЛОМНАЯ РАБОТА

По специальности 230102 - Автоматизированные системы обработки информации и управления

                               

                                   Научный руководитель:

к.ф.-м.н., доцент

_____________________К.И. Бушмелёва

Рецензент

к.т.н., директор ЦЛТ СурГУ

_______________________ И.И. Плюснин

Допущено к защите:

________________________________2014г.

зав. каф АСОИУ, к.т.н., доцент  

                                               Ф.Ф. Иванов

Сургут 2014

РЕФЕРАТ

181 стр., 32 рис., 3 прил., 10 табл.

ЭКСПЕРТНАЯ СИСТЕМА КОМПЛЕКСНОГО ДИАГНОСТИРОВАНИЯ ЛИНЕЙНОЙ ЧАСТИ МАГИСТРАЛЬНОГО ГАЗОПРОВОДА

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

Цель работы – проектирование и разработка экспертной системы диагностирования магистрального газопровода.

В рамках проделанной работы проведено детальное обследование предметной области, составлен перечень функциональных задач, исследованы аналоги автоматизированных систем, спроектирована  инфологическая модель предметной области, реализована ЭС «Диагностика ЛЧ МГ», проведена отладка и тестирование, разработана соответствующая документация.

ЭС разработана в среде программирования Microsoft Visual Studio на языке C# с использованием СУБД Microsoft SQL Server 2012.

СОДЕРЖАНИЕ

[1] СОДЕРЖАНИЕ

[2] ПЕРЕЧЕНЬ СОКРАЩЕНИЙ

[3] ВВЕДЕНИЕ

[4] 1. ПОСТАНОВКА ЗАДАЧИ

[4.1] 1.1. Краткие сведения об объекте автоматизации

[4.2] 1.2. Назначение системы

[4.3] 1.3. Цели создания системы

[4.4] 1.4. Постановка задачи

[5] 2. АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ

[5.1] 2.1. Линейная часть магистрального газопровода

[5.1.1] 2.1.1. Назначение и классификация магистральных газопроводов

[5.1.2] 2.1.2. Состав сооружений магистрального газопровода

[5.1.3] 2.1.3. Дефекты трубопроводных конструкций

[5.2] 2.2. Экспертные системы

[5.2.1] 2.2.1. Экспертная система и её структура

[5.2.2] 2.2.2. Классификация экспертных систем

[5.2.2.1] Классификация по решаемой задаче.

[5.2.2.2] Классификация по связи с реальным временем.

[5.2.2.3] Классификация по типу ЭВМ:

[5.2.2.4] Классификация по степени интеграции с другими программами.

[5.3] 2.3. Критерии и алгоритм оценки состояния ЛЧ МГ

[6] 3. ОБЗОР АНАЛОГОВ

[6.1] 3.1. Экспертная система диагностики “АРМИД-ЭКСПЕРТ”

[6.2] 3.2. Информационно-диагностическая система “ЭКСПЕРТ”

[6.3] 3.3. Экспертная  система “Аврора-2000”

[6.4] 3.4. ПО “Атлант”

[6.5] 3.5. Выводы

[7] 4. СОСТАВ ЭС «Диагностика ЛЧ МГ»

[8] 5. ВИДЫ ОБЕСПЕЧЕНИЯ

[8.1] 5.1. Информационное обеспечение

[8.1.1] 5.1.1. Инфологическая модель

[8.1.2] 5.1.2. СУБД SQL Server 2012

[8.1.3] 5.1.3. Входная информация

[8.1.4] 5.1.4. БД

[8.1.5] 5.1.5. БЗ

[8.1.6] 5.1.6. Перечень неисправностей газопровода  и методы их устранения

[8.1.6.1] Неисправность

[8.2] 5.2. Математическое обеспечение

[8.2.1] 5.2.1. Защищённость участка газопровода по времени

[8.2.2] 5.2.2. Критическое переходное сопротивление

[8.2.3] 5.2.3. Остаточная толщина стенки трубы

[8.2.4] 5.2.4. Предельное значение фактических кольцевых напряжений

[8.2.5] 5.2.5. Остаточный срок службы изоляции

[8.2.6] 5.2.6. Остаточный срок службы газопровода при общей коррозии

[8.2.7] 5.2.7. Остаточный срок службы газопровода при язвенной коррозии

[8.3] 5.3. Техническое обеспечение

[8.4] 5.4. Лингвистическое обеспечение

[8.5] 5.5. Программное обеспечение

[8.6] 5.6. Алгоритмическое обеспечение

[9] 6. ИНТЕРФЕЙС ЭС

[10] ЗАКЛЮЧЕНИЕ

[11] СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

[12] приложение 1.

[12.1] Исходные коды

[13] приложение 2.

[13.1] Руководство пользователя

[13.1.1] Диагностика

[13.1.2] Статистика

[13.1.3] Пополнение БЗ

[13.1.4] Справка

[13.1.5] Подсистема «Администратор»

[14] приложение 3.

[14.1] Техническое задание

ПЕРЕЧЕНЬ СОКРАЩЕНИЙ

ЭС  - экспертная система.

ЛЧ МГ – линейная часть магистрального газопровода.

БД – база данных.

БЗ – база знаний.

ПО – программное обеспечение.

СУБД – система управления базой данных.

УЗД – ультразвуковая диагностика.

СНиП – строительные нормы и правила.

КС – компрессорная станция.

ЛЭП – линии электропередач.

ГКС – газокомпрессорная станция.

ПХГ – подземное хранилище газа.

ГРС – газорегуляторная станция.

ЭХЗ – электрохимическая защита.

ГРП – газорегуляторные пункты.

ВВЕДЕНИЕ

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

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

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

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

В настоящее время уже имеются некоторые методы и средства, которые позволяют контролировать состояние трубопроводов, и появляется новое направление - «Техническая диагностика».

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

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

Задачами технической диагностики, которые необходимо решить для достижения поставленной цели, являются:

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

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

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

1. ПОСТАНОВКА ЗАДАЧИ

1.1. Краткие сведения об объекте автоматизации

Объектом автоматизации для создаваемой системы является определение технического состояния ЛЧ МГ.

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

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

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

При оценке технического состояния ЛЧ МГ решаются следующие задачи:

  •  определение возможности образования дефектов на участках газопроводов, эксплуатируемых в экстремальных условиях;
  •  установление динамики развития дефектов труб и защитных покрытий;
  •  установление динамики изменения физико-механических      характеристик материала газопровода;
  •  определение изменения технологических параметров в процессе эксплуатации трубопроводов;
  •  определение динамики развития условий взаимодействия трубопроводов с окружающей средой;
  •  расчет аварийно-опасных участков трубопроводов, оптимальных режимов их эксплуатации и разработки предложений по поддержанию их конструктивной надежности;
  •  определение оптимальной технологии и средств диагностирования и ремонта ЛЧ МГ.

Диагностическими методами контроля технического состояния ЛЧ МГ являются:

  •  контроль потенциала катодной защиты трубопроводных систем, осуществляемый при наземных обследованиях и с вертолетов;
  •  наземное обследование отдельных участков трубопроводов с использованием методов неразрушающего контроля (УЗД, толщинометрия, твердометрия, акусто-эмиссионная диагностика и др.);
  •  лабораторные исследования свойств материалов, сварных соединений, изоляционных покрытий и др., путем вырезки образцов при авариях и проведении ремонтных работ;
  •  наземные обследования с применением транспортных средств, пеших обходов, шурфования, специальных исследований;
  •  наземные исследования деформативности подземных, наземных и надземных участков трубопроводов с использованием геодезических и лазерных средств;
  •  визуальное обследование внутренней части трубопроводов и арматуры с помощью оптико-волоконных средств;
  •  рентгеновские, ультразвуковые и магнитографические методы контроля сварных швов при строительстве и ремонте трубопроводных систем;
  •  испытание и переиспытание участков трубопроводов гидравлическими или пневматическими методами внутренним давлением [3].

1.2. Назначение системы

              

Основное назначение разрабатываемой экспертной системы – повышение эффективности анализа и обработки данных по комплексному диагностированию объектов ЛЧ МГ для обеспечения длительной и безаварийной эксплуатации газопроводов в целях предотвращения аварий.

1.3. Цели создания системы

Целями создания системы, являются:

  •  повышение качества анализа данных о техническом состоянии объектов МГ, сокращение времени на анализ, своевременная частичная или полная замена оборудования или его ремонт;
  •  объединение разнородных данных, поступающих с объектов диагностирования;
  •  обеспечение экспертными знаниями пользователей системы;
  •  автоматизация формирования отчетов о техническом состоянии объектов ЛЧ МГ;
  •  разделение доступа к предоставляемой информации.

Создаваемое ПС обеспечивает достижение поставленных целей за счет:

  •  ввода, накопления, хранения и редактирования данных по комплексной диагностике магистральных газопроводов;
  •  анализа входных данных о работоспособности объектов ЛЧ МГ, на основе полученной информации и системы в целом;
  •  оценки состояния ЛЧ МГ, на основе анализа входных данных;
  •  вывода решений или рекомендаций на основе проведённой оценки состояния объектов ЛЧ МГ;
  •  вывода объяснений о ранее выданных решениях, или о том, почему она не выдала решения;
  •  пополнения базы знаний;
  •  поиска по базе данных результатов обследований за определённый период;
  •  вывода информации о результатах диагностирования объектов ЛЧ МГ в виде графиков, таблиц;
  •  формирования отчётов по результатам анализа.

1.4. Постановка задачи

Задачей дипломного проектирования является разработка ЭС «Диагностика ЛЧ МГ», которая будет способна проводить диагностику МГ по заданным критериям,  рассчитывать остаточный срок службы газопровода, помогать в принятии решения по устранению той или иной неисправности.

Для реализации поставленных целей система должна решать следующие задачи:

  •  анализ технического состояния объектов ЛЧ МГ и их функциональных характеристик;
  •  анализ входных и выходных данных по результатам диагностирования;
  •  анализ существующих методов диагностирования объектов ЛЧ МГ;
  •  анализ способов построения ЭС, логических правил вывода.

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

Целевая установка на разрабатываемую систему:

  1.  Провести обследование предметной области.
  2.  Определить перечень функциональных задач.
  3.  Изучить аналогичные ЭС диагностики.
  4.  Спроектировать и разработать программный комплекс, который позволит осуществлять:
  •  контроль доступа к программе и к БЗ;
  •  ввод данных;
  •  добавление, удаление и контроль данных БЗ;
  •  диагностирование состояния ЛЧ МГ;
  •  расчёт остаточных сроков службы изоляции и газопровода;
  •  формирование отчётов c результатами, объяснениями и рекомендациями;
  •  построение диаграмм;
  •  сохранение и вывод отчётов на печать.
  1.  Провести испытание ЭС.
  2.  Разработать руководство пользователя.

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

2. АНАЛИЗ ПРЕДМЕТНОЙ ОБЛАСТИ

2.1. Линейная часть магистрального газопровода

2.1.1. Назначение и классификация магистральных газопроводов

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

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

В соответствии со СНиП 2.05.06-85* в зависимости от рабочего давления в трубопроводе магистральные газопроводы подразделяются на два класса: класс I – рабочее давление от 2,5 до 10 МПа включительно; класс II – рабочее давление от 1,2 до 2,5 МПа включительно. Газопроводы, эксплуатируемые при давлениях ниже 1,2 МПа, не относятся к магистральным. Это внутрипромысловые, внутризаводские, подводящие газопроводы, газовые сети в городах и населенных пунктах и другие трубопроводы [2].

По характеру линейной части различают газопроводы:

  1.  Магистральные, которые могут быть однониточными простыми (с одинаковым диаметром от головных сооружений до конечной газораспределительной станции) и телескопическими (с различным диаметром труб по трассе), а также многониточными, когда параллельно основной нитке проложены вторая, третья и последующие нитки.
  2.  Кольцевые, сооружаемые вокруг крупных городов для увеличения надежности снабжения газом и равномерной подачи газа, а также для объединения магистральных газопроводов в Единую газотранспортную систему страны.

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

                                                                                                       Таблица 1

Категории магистральных трубопроводов и их участков

Категория

трубопровода и его участка

Коэффициент условий работы трубопровода при расчете его

на прочность,

устойчивость

и деформативность, m

Количество монтажных сварных соединений, подлежащих контролю физическими методами, % общего количества

Величина давления при испытании и

продолжительность испытания

трубопровода

В

0,60

I

0,75

II

0,75

Принимается

по СНиП III-42-80*

III

0,9

IV

0,9

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

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

К категориям магистральных газопроводов и их участкам в зависимости от коэффициента условий работы при расчете на прочность предъявляются определенные требования в части контроля сварных соединений физическими методами и предварительного испытания Рисп [2].

2.1.2. Состав сооружений магистрального газопровода

В соответствии со СНиП к магистральным газопроводам относят трубопроводы и ответвления (отводы) от них диаметром до 1420 мм с избыточным давлением транспортируемого продукта не более 10 МПа, предназначенные для транспортировки: природного или попутного нефтяного углеводородного газа из районов добычи (от головных компрессорных станций (КС) до газораспределительных станций (ГРС)) городов и населенных пунктов; сжиженных углеводородных газов с упругостью насыщенных паров не более 1,6 МПа при температуре 45 °С с мест производства (заводов) до мест потребления (перевалочные базы, пункты налива, промышленные и сельскохозяйственные предприятия, порты, ГРС, пусковые базы); товарной продукции в пределах головных и промежуточных КС, станций подземного хранения газа, ГРС, замерных пунктов.

Аналогично определяют магистральные водо-, конденсато- и аммиакопроводы [2].

В состав подземного магистрального газопровода входят линейная часть и наземные объекты. Схема МГ представлена на рисунке 1.

Рис. 1. Схема МГ:

1 - газовая скважина со «шлейфом»; 2 - газосборный пункт; 3 - газопромысловый коллектор; 4 - головные сооружения; 5 - ГКС; 6 - магистральный газопровод; 7 - запорная арматура; 8 - промежуточная КС; 9, 11, 13 - переходы соответственно через малую преграду, дорогу и крупную водную преграду; 10 - линия связи; 12 - аварийный запас труб; 14 - вдольтрассовая дорога с подъездами; 15, 26 - ГРС; 16 - отвод от газопровода; 17 - защитное сооружение; 18 - система ЭХЗ; 19 - ЛЭП; 20 - ПХГ; 21 - КС ПХГ; 22 - водосборник; 23 - дом линейного ремонтера-связиста; 24 - лупинг; 25 - вертолетная площадка; 27 - ГРП; 28 - городские газовые сети.

На промысле газ от скважин под действием пластового давления по сборным индивидуальным газопроводам («шлейфам») поступает на газосборные пункты, где осуществляют первичный замер его, а при необходимости и редуцирование. От газосборных пунктов газ поступает в промысловый газосборный коллектор и по нему на головные сооружения (установку комплексной подготовки газа - УКПГ), где проводят его очистку, осушку, вторичный замер и доведение до товарной кондиции.

На головной КС газ компримируется до номинального рабочего давления (как правило, до 7,5 МПа). Затем он поступает в линейную часть магистрального газопровода [2].

К линейной части магистрального газопровода относят собственно магистральный газопровод с линейной арматурой, переходами через естественные и искусственные преграды, линиями технологической связи и электропередачи, вдольтрассовыми и подъездными дорогами, защитными сооружениями, отводами к промежуточным потребителям, водо- и конденсатосборниками и другими узлами, системой электрохимической защиты; лупинги, аварийный запас труб, вертолетные площадки и дома линейных ремонтеров-связистов.

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

Газ, поступающий на ГРС, дополнительно обезвоживается, очищается, редуцируется (до 1,2 МПа), одоризуется, замеряется и распределяется по трубопроводам отдельных потребителей или групп их.

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

2.1.3. Дефекты трубопроводных конструкций

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

Дефекты трубопроводных конструкций подразделяются на:

  •  дефекты труб;
  •  дефекты сварных соединений;
  •  дефекты изоляции.

Различают следующие дефекты труб:

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

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

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

При изготовлении труб приходится подвергать металл нагрузкам, при которых он работает за пределом текучести. Это приводит к появлению наклепа, микрорасслоений, надрывов и других скрытых дефектов. Из-за кратковременности последующих заводских испытаний труб (20…30 с) многие скрытые дефекты не выявляются и «срабатывают» уже в процессе эксплуатации МТ [2].

В недостаточной степени контролируется заводами и геометрическая форма труб. Так, на трубах диаметром 500…800мм смещение кромок достигает 3мм (при норме для спирально-шовных труб 0,75…1,2мм), овальность – 2%.

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

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

Коррозионные повреждения труб (внешние - в местах нарушения сплошности изоляции, а внутренние - в местах скоплений воды).

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

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

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

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

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

Незаваренные кратеры – образуются при резком обрыве дуги в конце сварки. Они уменьшают сечение шва и могут явиться очагами образования трещин.

К дефектам макроструктуры относят дефекты: газовые поры, шлаковые включения, непровары, трещины, выявляемые с помощью средств оптики (увеличение не более чем в 10 раз) [2].

Газовые поры – образуются в сварных швах вследствие быстрого затвердевания газонасыщенного расплавленного металла, при котором выделяющиеся газы не успевают выйти в атмосферу (рис. 2).

Рис. 2. Газовые поры

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

Шлаковые включения – результат небрежной очистки кромок свариваемых деталей и сварочной проволоки от окалины, ржавчины и грязи, а также (при многослойной сварке) неполного удаления шлака с предыдущих слоев (рис. 3).

Они могут возникать при сварке длинной дугой, неправильном наклоне электрода, недостаточной силе сварочного тока, завышенной скорости сварки. Шлаковые включения различны по форме (от сферической до игольчатой) и размером (от микроскопической до нескольких миллиметров). Они могут быть расположены в корне шва, между отдельными слоями, а также внутри наплавленного металла. Шлаковые включения ослабляют сечение шва, уменьшают его прочность и являются зонами концентрации напряжений [2].

Рис. 3.  Шлаковые включения

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

Рис. 4. Непровары

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

Трещины – в зависимости от температуры образования подразделяют на горячие и холодные (рис. 5).

Рис. 5.  Трещины

Горячие трещины появляются в процессе кристаллизации металла шва при температуре 1100 – 1300 С. Их образование связано с наличием полужидких прослоек между кристаллами наплавленного металла шва в конце его затвердевания и действием в нем растягивающих усадочных напряжений. Повышенное содержание в металле шва углерода, кремния, водорода и никеля также способствует образованию горячих трещин, которые обычно располагаются внутри шва. Такие трещины выявить трудно [2].

Холодные трещины возникают при температурах 100 – 300 С в легированных сталях и при нормальных (менее 100 С) температурах в углеродистых сталях сразу после остывания шва или через длительный промежуток времени. Основная причина их образования – значительное напряжение, возникающее в зоне сварки при распаде твердого раствора и скопление под большим давлением молекулярного водорода в пустотах, имеющихся в металле шва. Холодные трещины выходят на поверхность шва и хорошо заметны.

К дефектам микроструктуры сварного соединения относят:

  •  микропоры;
  •  микротрещины;
  •  нитридные, кислородные и другие неметаллические включения;
  •  крупнозернистость;
  •  участки перегрева и пережога.

Дефекты изоляции - нарушение сплошности; адгезия; заниженная толщина; гофры; морщины; задиры; царапины; проколы.

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

  •  при хранении и подготовке материалов – засорение битума и обводнение готовой мастики и ее составляющих;
  •  при приготовлении грунтовки и мастики – небрежная дозировка составляющих; несоблюдение режима разогревания котла; недостаточное размешивание битума при приготовлении грунтовки;
  •  при нанесении грунтовки и битумной мастики – загустение грунтовки; образование пузырьков на поверхности трубопровода; оседание пыли на поверхность труб; пропуски грунтовки и мастики на поверхности трубопровода и особенно около сварных швов; неровное нанесение мастики; охлаждение мастики; конструктивные недостатки изоляционной машины;
  •  при нанесении армирующих и оберточных рулонных материалов – нарушение однородности покрытия; выдавливание слоя мастики; недостаточное погружение стеклохолста в мастику;
  •  при нанесении полимерных лент – сквозные отверстия в ленте; несплошной клеевой слой; неравномерность толщины ленты в рулоне; неправильная регулировка намоточной машины; нарушение температурного режима нанесения ленты; плохая очистка поверхности труб;
  •  при укладке трубопровода – нарушение технологии укладки, особенно при раздельном способе укладки; захват изолированных труб тросом; трение трубопровода о стенки траншеи при укладке; отсутствие подготовки дна траншеи; отсутствие подсыпки не менее 10см дна траншеи на участках с каменистыми и щебенистыми грунтами; плохое рыхление мерзлых грунтов и особенно отсутствие регулировки изоляционных машин;
  •  при эксплуатации трубопровода – действие грунта; вес трубопровода; почвенные воды; микроорганизмы; корни растений; температурные воздействия; агрессивность грунта [2].

2.2. Экспертные системы

2.2.1. Экспертная система и её структура

Экспертная система – это программа  для компьютера, которая оперирует со знаниями в определённой предметной области с целью выработки рекомендаций или решения проблем.

Экспертная система может полностью взять на себя функции, выполнение которых обычно требует привлечения опыта человека-специалиста, или играть роль ассистента для человека, принимающего решение. Другими словами, система (техническая или социальная), требующая принятия решения, может получить его непосредственно от программы или через промежуточное звено — человека, который общается с программой. Тот, кто принимает решение, может быть экспертом со своими собственными правами, и в этом случае программа может "оправдать" свое существование, повышая эффективность его работы. Альтернативный вариант — человек, работающий в сотрудничестве с такой программой, может добиться с ее помощью результатов более высокого качества. Вообще говоря, правильное распределение функций между человеком и машиной является одним из ключевых условий высокой эффективности внедрения экспертных систем.

 Структура ЭС:

  •  интерфейс пользователя;
  •  пользователь;
  •  интеллектуальный редактор базы знаний;
  •  эксперт;
  •  инженер по знаниям;
  •  рабочая (оперативная) память;
  •  база знаний;
  •  решатель (механизм вывода); 
  •  подсистема объяснений.

Эксперт (от лат. expertus - опытный) - квалифицированный специалист в определенной области, привлекаемый для исследования, консультирования, выработки суждений, заключений, предложений, проведения экспертизы [5].

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

  •  компетентность потенциального эксперта в исследуемой области;
  •  эрудированность в смежных областях;
  •  учёная степень;
  •  звание;
  •  стаж научной или практической работы в определённой сфере;
  •  должностное положение;
  •  принципиальность;
  •  объективность;
  •  способность творчески мыслить;
  •  интуиция.

Реестр качеств, которыми должен обладать «идеальный» эксперт, с которым предпочтительно работать:

  1.  Креативность, то есть способность творчески решать задачи, метод решения которых полностью или частично не известен.
  2.  Эвристичность, то есть способность видеть или создавать неочевидные проблемы.
  3.  Интуиция — способность делать заключения об исследуемом объекте без осознания пути движения мысли к этому заключению.
  4.  Предикаторность, то есть способность предсказывать, предчувствовать будущее состояние исследуемого объекта.
  5.  Независимость, то есть способность противопоставлять предубеждениям и массовому мнению свою точку зрения.
  6.  Всесторонность, то есть способность видеть проблему с различных точек зрения.

Подбор экспертов может быть:

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

Кроме указанных способов возможен расчёт достоверности и точности экспертных оценок, представленных каким-либо из потенциальных экспертов в прошлом.

База знаний состоит из правил анализа информации от пользователя по конкретной проблеме. ЭС анализирует ситуацию и, в зависимости от направленности ЭС, дает рекомендации по разрешению проблемы.

Как правило, база знаний ЭС содержит факты (статические сведения о предметной области) и правила - набор инструкций, применяя которые к известным фактам можно получать новые факты.

В рамках логической модели баз данных и базы знаний записываются на языке Пролог с помощью языка предикатов для описания фактов и правил логического вывода, выражающих правила определения понятий, для описания обобщенных и конкретных сведений, а также конкретных и обобщенных запросов к базам данных и базам знаний [4].

Обычно факты в базе знаний описывают те явления, которые являются постоянными для данной предметной области. Характеристики, значения которых зависят от условий конкретной задачи, ЭС получает от пользователя в процессе работы, и сохраняет их в рабочей памяти [5].

2.2.2. Классификация экспертных систем

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

Рис. 6. Классификация экспертных систем

Классификация по решаемой задаче.

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

Диагностика. Под диагностикой понимается обнаружение неисправности в некоторой системе. Неисправность — это отклонение от нормы. Такая трактовка позволяет с единых теоретических позиций рассматривать и неисправность оборудования в технических системах, и заболевания живых организмов, и всевозможные природные аномалии.

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

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

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

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

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

Классификация по связи с реальным временем.

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

Квазидинамические ЭС. Интерпретируют ситуацию, которая меняется с некоторым фиксированным интервалом времени .

Динамические ЭС.  Работают в сопряжении с датчиками объектов в режиме реального времени с непрерывной интерпретацией поступаемых данных [5].

Классификация по типу ЭВМ:

  •  ЭС для уникальных стратегически важных задач на суперЭВМ (Эльбрус, CRAY, CONVEX и др.);
  •  ЭС на ЭВМ средней производительности (типа ЕС ЭВМ, mainframe);
  •  ЭС на символьных процессорах и рабочих станциях (SUN, APOLLO);
  •  ЭС на мини- и супермини-ЭВМ (VAX, micro-VAX и др.);
  •  ЭС на персональных компьютерах (IBM PC, MAC II и подобные).

Классификация по степени интеграции с другими программами.

Автономные ЭС. Работают непосредственно в режиме консультаций с пользователем для специфически "экспертных" задач, для решения которых не требуется привлекать традиционные методы обработки данных (расчеты, моделирование.

Гибридные ЭС. Представляют программный комплекс, агрегирующий стандартные пакеты прикладных программ (например, математическую статистику, линейное программирование или системы управления базами данных) и средства манипулирования знаниями. Это может быть интеллектуальная надстройка над ППП или интегрированная среда для решения сложной задачи с элементами экспертных знаний [5].

2.3. Критерии и алгоритм оценки состояния ЛЧ МГ

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

 Основными критериями для оценки состояния линейной части магистрального газопровода служат:

1) Состояние изоляции. Предельное состояние изоляции имеет следующие критерии:

  •  сплошность;
  •  сквозные повреждения (наличие, расположение, площадь);
  •  адгезия;
  •  значение переходного сопротивления.

2) Степень коррозионных повреждений металла. Предельное состояние трубы имеет следующие критерии:

  •  сквозное коррозийное повреждение;
  •  остаточная толщина стенки трубы.

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

3) Качество сварных стыков.  Если сварной стык попал в зону шурфа и в процессе эксплуатации были выявлены повреждения в стыковом (строительном) или заводском (продольном или спиральном) сварном шве, а также выявлено, что их внешний вид не соответствует требованиям нормативных документов, сварное соединение подлежит проверке методами НК в соответствии с указанными нормами.

4) Физико-механические свойства труб. При длительной эксплуатации газопровода происходят деградационные изменения свойств труб, в том числе:

  •  снижение пластичности, выраженной в сближении величин предела текучести Qт  и временного сопротивления Rв;
  •  снижение ударной вязкости   aН (KCU).

При достижении любого из перечисленных критериев своего предельного значения участок газопровода назначается на перекладку [6].

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

3. ОБЗОР АНАЛОГОВ

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

3.1. Экспертная система диагностики “АРМИД-ЭКСПЕРТ”

Разработчик системы – инженерная фирма ООО “Инкотес”.

“АРМИД-ЭКСПЕРТ” предназначена для проведения автоматизированной диагностики конкретных типов оборудования по заложенным в ней методикам (рис. 7).

Рис. 7.  «АРМИД-ЭКСПЕРТ»

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

При проведении диагностики можно просмотреть сформированные редактором списки параметров:

  •  спектральные данные, установленные в методике диагностирования - имена параметров, их частоты, амплитуды, коэффициенты доверия, спектры, из которых они извлекаются;
  •  вибропараметры - размах, максимальный уровень в полосе, СКЗ в полосе и др.;
  •  параметрические данные - число оборотов ротора, температура и др.

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

3.2. Информационно-диагностическая система “ЭКСПЕРТ” 

Разработчик системы - ОАО «Научно-производственное объединение по исследованию и проектированию энергетического оборудования им. И.И. Ползунова».

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

Система может выдавать предупредительных и аварийных сигналов при превышении заданных пределов вибрации (в соответствии с ГОСТ 25364-97);  работать в исследовательском режиме, при котором специалист по вибрации может использовать систему в качестве многоканального измерительного комплекса для детального исследования (спектры, уровни, траектории и т.д.);  осуществлять архивацию полученных вибрационных и режимных параметров c возможностью из дальнейшего представления и анализа [8].

3.3. Экспертная  система “Аврора-2000” 

Разработчик системы - ООО Производственно-внедренческая фирма “Вибро-Центр”.

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

Рис. 8.  “Аврора-2000”

ЭС “Аврора-2000” выполняет следующие задачи:

  •  оценка текущего состояния агрегата;
  •  определение дефектов;
  •  определение состояния фундамента;
  •  определение остаточных ресурсов;
  •  планирование сроков ремонтов.

Программа Аврора работает в энергетике, в горной промышленности, нефтедобыче, химии и т. д. длительный срок, на некоторых предприятиях более 4 лет. В процессе эксплуатации неоднократно диагностировалось состояние более чем 10 тысяч различных агрегатов [9].

3.4. ПО “Атлант” 

Разработчик - ООО Производственно-внедренческая фирма “Вибро-Центр”.

Программное обеспечение Атлант - комплекс программ для проведения диагностики состояния оборудования.

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

В состав программного обеспечения Атлант входят следующие компоненты:

  •  Атлант - база данных по оборудованию, включающая в себя технологическую и организационную иерархию расположения оборудования на предприятии, диагностические паспорта на оборудование, базу данных по всем выполненным виброзамерам;
  •  Паллада+ - закрытая автоматизированная экспертная система разработки фирмы Вибро-Центр, предназначенная для вибродиагностики состояния оборудования по спектрам вибросигналов;
  •  Паллада - язык написания диагностических правил и методик. Позволяет пользователю самостоятельно создавать диагностические системы, учитывающие практические наработки;
  •  Ариана - программа диагностики состояния подшипников качения по спектрам огибающей вибросигнала;
  •  Диана - программа балансировки и "успокоения" роторов в собственных подшипниках;
  •  Комплекс программ для специализированной диагностики, включающий в себя одно и двухмерный графический анализ сигналов и вейвлет – преобразование;

Программное обеспечение Атлант может снимать сигналы с помощью синхронного регистратора-анализатора вибросигналов Атлант-8 или импортировать с приборов [10].

3.5. Выводы

Проведя поиск аналогичных систем, не было найдено точных или достаточно близких к разрабатываемой системе аналогов. Несмотря на то, что подобные системы существуют но информация о них скрыта, разработку ЭС «Диагностика ЛЧ МГ» можно считать целесообразной.

На основе  рассмотренных выше систем, принято решение диагностировать МГ по нескольким параметрам (критериям).  Прототипом разрабатываемого отчёта ЭС является отчёт системы “АРМИД-ЭКСПЕРТ”.  Кроме этого на вооружение взяты некоторые возможности рассмотренных аналогов, таких как просмотр истории дефектов, расчёт остаточного срока службы.

4. СОСТАВ ЭС «Диагностика ЛЧ МГ»

Разрабатываемая экспертная система включает в себя  следующие компоненты:

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

Организационно-функциональная структура ЭС представлена на рисунке 9.

Подсистема ввода данных предназначена для ввода исходных данных и запуска диагностики. В качестве исходных данных выступают фактические (измеренные) данные. Для удобства, все данные разбиты по критериям. Кроме этого исходные данные включают в себя ФИО пользователя и дату диагностики.

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

Полученный отчёт можно сохранить в Excel или как файл PDF. Кроме этого  отчёт можно распечатать, предварительно установив необходимые настройки печати. Так же есть возможность выбора масштаба отображения отчёта.

Рис. 9.  Организационно-функциональная структура

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

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

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

Кроме этого решатель производит все вычисления, заполняет отчёт по диагностике и сохраняет в БД результаты для статистики.

Рабочая память предназначена для хранения исходных и промежуточных фактов (в виде коллекций) решаемой в текущий момент задачи. Размещается в оперативной памяти ЭВМ.

База знаний предназначена для хранения долгосрочных фактов, описывающих предметную область, правил, описывающих отношения между этими фактами. БЗ представлена в виде таблиц, созданных с помощью СУБД SQL Server 2012. С БЗ могут работать только эксперт и инженер по знаниям.

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

Подсистема “Администратор” предназначена для контроля доступа к системе. Для этого программа ведёт список пользователей с указанным уровнем доступа. Полный уровень доступа позволяет получить доступ к БЗ, ограниченный уровень такого доступа не предоставляет. Новые пользователи добавляются в БД.

Подсистема доступа предназначена для контроля доступа пользователей к системе. Для этого она даёт запрос на ввод пароля. Если пароль верен, пользователю разрешается доступ (ограниченный или полный) к системе.

5. ВИДЫ ОБЕСПЕЧЕНИЯ

5.1. Информационное обеспечение

5.1.1. Инфологическая модель

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

С её помощью моделируется класс однотипных объектов. Сущность имеет имя, уникальное в пределах моделируемой системы. Так как сущность соответствует некоторому классу однотипных объектов, то предполагается, что в системе существует множество экземпляров данной сущности. Объект, которому соответствует понятие сущности, имеет свой набор атрибутов — характеристик, определяющих свойства данного представителя класса. При этом набор атрибутов должен быть таким, чтобы можно было различать конкретные экземпляры сущности [11].

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

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

Для хранения данных о пользователях используется стержневая сущность “Пользователи”. Её атрибутами являются: индекс, имя пользователя,  уровень доступа (полный или ограниченный).

Для хранения списка правил используется стержневая сущность “Правила”. Её атрибутами являются: индекс, критерий диагностирования, правило. Правило включает в себя: условие, результат, объяснение получения результата, рекомендацию.

Для хранения статистических данных используется таблица “Статистика”. Её атрибутами являются: индекс, значение критерия, дата проведения диагностики, критерий.

Для хранения некоторых дефектов используется стержневая сущность “Дефекты”. Её атрибутами являются: индекс, название параметра, дефект.

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

5.1.2. СУБД SQL Server 2012

В качестве СУБД была выбрана SQL Server 2012, так как она является одной из самых удобных СУБД.

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

  •  Mission Critical PlatformSQL Server 2012 позволяет организациям выполнять самые сложные приложения, попутно упрощая отделам ИТ работу с инфраструктурой управления данными. Это безопасная, надежная, масштабируемая платформа, защищающая информацию в приложениях и повышающая её доступность;
  •  Dynamic DevelopmentSQL Server 2012 в сочетании с .NET Framework упрощает разработку новых приложений. Среда ADO.NET Entity Framework повышает эффективность труда разработчиков, поскольку теперь они имеют дело не непосредственно с таблицами и полями, а с логическими информационными сущностями, согласованными с бизнес-требованиями;
  •  Beyond Relational DataSQL Server 2012 позволяет разработчикам управляться с данными любых типов;
  •  Pervasive Business Insight – инфраструктура SQL Server 2012 стала более масштабируемой. Она способна формировать отчеты и выполнять анализ любого объема и сложности, одновременно облегчая пользователям доступ к данным за счет более тесной интеграции с Microsoft Office.

Преимущества SQL Server 2012, связанные со значительными усовершенствованиями в поддержке функционирования критических приложений, динамической разработки, работы с нереляционными данными и принятия обоснованных решений, неоспоримы [12].

5.1.3. Входная информация

Входная информация представляет собой данные различного типа, поступающие как из диалогов общения с пользователем, так и из базы данных. В качестве основных типов данных используются следующие типы: int (целое со знаком), string (строка), bool (логический), double (число с плавающей точкой).

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

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

5.1.4. БД 

В  ЭС «Диагностика ЛЧ МГ» используется БД для хранения данных, необходимых для работы системы. Для создания БД была использована СУБД Microsoft SQL Server 2012.

Импорт данных в БД  осуществляется как автоматически, так и вручную. При импорте выполняется проверка корректности вводимых данных.

На рисунке 11 представлена схема БД.

Рис. 11. Схема БД

В БД входят 3 таблицы, список которых приведен в табл.2.

Таблица 2

Список таблиц используемых в БД  ЭС «Диагностика ЛЧ МГ»

Название таблицы в БД

Описание

Min число записей

Max число записей

Текущее число записей

LoginsTable

Таблица, содержащая данные о пользователях

1

3

DefectTable

Таблица, содержащая данные о дефектах

1

26

Statistica

Таблица, содержащая данные для построения статистических диаграмм

1

275

В табл.3. приведена структура таблицы LoginsTable (Таблица логинов), содержащей данные о пользователях.

Таблица 3

Структура таблицы LoginsTable

Имя поля

Тип данных

Описание

Ключи

Ограничение целостности

Id

Счетчик

Код

Первичный

Уникальное значение (ID<>null)

Name

Текст

Имя пользователя

-

<>null

Access

Текст

Уровень доступа

-

<>null

Мощность таблицы LoginsTable измеряется тысячами записей.

Для хранения статистических данных была создана таблица Statistica (Статистика).

Описание структуры таблицы Statistica приведено в табл.4.

 Таблица 4

Структура таблицы Statistica

Имя поля

Тип данных

Описание

Ключи

Ограничение целостности

Id

Счетчик

Код

Первичный

Уникальное значение (ID<>null)

Value

Текст

Значение критерия

-

<>null

Data

Текст

Дата диагностики

-

<>null

Kryteri

Текст

Критерий

-

<>null

Defective

Текст

Исправность или неисправность

-

<>null

Norm

Текст

Нормативное значение из БЗ

-

<>null

Мощность таблицы Statistica измеряется тысячами записей.

Для хранения данных о дефектах была создана таблица DefectTable (Дефекты). Описание структуры таблицы DefectTable приведено в табл.5.

Таблица 5

Структура таблицы DefectTable

Имя поля

Тип данных

Описание

Ключи

Ограничение целостности

Id

Счетчик

Код

Первичный

Уникальное значение (ID<>null)

Parametr

Текст

Параметр

-

<>null

Defect

Текст

Дефект

-

<>null

Мощность таблицы DefectTable измеряется тысячами записей.

5.1.5. БЗ 

В  ЭС «Диагностика ЛЧ МГ» используется БЗ для хранения знаний о предметной области. Для создания БД была использована СУБД Microsoft SQL Server 2012.

При импорте данных в БЗ выполняется проверка корректности вводимых данных. На рисунке 12 представлена схема БЗ.

Рис. 12. Схема БЗ

БЗ состоит из одной таблицы,  представленной в табл.6.

Таблица 6

Список таблиц используемых в БЗ  ЭС «Диагностика ЛЧ МГ»

Название таблицы в БЗ

Описание

Min число записей

Max число записей

Текущее число записей

Rules

Таблица, содержащая критерии и правила

1

31

В качестве модели представления знаний в БЗ была принята продукционная модель.

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

  •  PR1:= ЕСЛИ (ситуация), ТО (действие);
  •  PR2:= ЕСЛИ (условие применимости), ТО (действие);
  •  PR3:= ЕСЛИ (причина), ТО (следствие);
  •  PR4:= ЕСЛИ (посылка), ТО (заключение).

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

В левой части правила, возможно, определение нескольких наборов условий, соединенных знаком “И”:

ЕСЛИ (1 ЕСТЬ P) И (2 ЕСТЬ C) ТО (3 ЕСТЬ 1).

Одному параметру в левой части правила может соответствовать не одно значение, а несколько, соединенных знаком “ИЛИ”:

ЕСЛИ (1 ЕСТЬ М) И (2 ЕСТЬ с ИЛИ п) ТО (3 ЕСТЬ 0).

В правилах, где сравнивается параметр с константой или с текущим значением другого параметра используются следующие обозначения: ‘=’ (равно), ‘!=’ (не равно), ‘>’ (больше), ‘<’ (меньше), ‘>=’ (больше или равно), ‘<=’ (меньше или равно).

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

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

В формуле могут использоваться следующие знаки арифметических операций: ‘+’ (сложение), ‘-’ (вычитание), ‘*’ (умножение), ‘/’(деление).

Формулы могут быть какой угодно сложности [13].

Основные достоинства продукционных систем, определяющие новый стиль программирования:

  •  обеспечивается быстрый отклик на изменяющиеся в широких пределах и во многом непредсказуемые ситуации внешней среды;
  •  отдельные правила могут быть независимо добавлены в базу знаний, исключены или изменены, при этом не надо перепрограммировать всю систему;
  •  достигается единообразие представления знаний в базе знаний, что облегчает их понимание человеком или интерпретацию другой подсистемой;
  •  с помощью продукционных правил достигается естественность выражения;
  •  при наличии соответствующего программного обеспечения возможна реализация параллельных вычислений [13].

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

«IF |условие| результат; рекомендации; критерий; объяснение».

Условия имеют следующую структуру: |(знак)(_)(значение)(& или /)(знак)(_)(значение)|. В условиях могут содержаться только следующие знаки: '>', '<', '=', '>=', '<=', '&(и)', '$', '/(или)'. Между знаком сравнения и сравниваемым значением обязательно должен быть один знак '_'.

Символ «$» указывается если значение в условии заранее не известно, оно рассчитывается программой. Результат может быть как рассчитанным программой, так и заранее заданным экспертом. В случае если результат рассчитывается программой, то в правиле в качестве результата необходимо написать «****» Объяснение представляет собой объяснение получения результата. Возможно использование следующих критериев: металл, сварные стыки, изоляция, ЭХЗ, физико-механические свойства трубы.

Пример правила: «IF |<_95| Низкая защищённость по времени; Необходимо проверить работоспособность каждого преобразователя….; Электрохимическая защита; Рассчитанная защищённость по времени ниже предельного значения  (<95%)».

Если во время диагностики условие удовлетворяется, то результат, рекомендации, объяснения записываются в отчёт в соответствующие поля.

В табл.7. приведена структура таблицы Rules (Правила), хранящей правила.

Таблица 7

Структура таблицы Rules

Имя поля

Тип данных

Описание

Ключи

Ограничение целостности

Id

Счетчик

Код

Первичный

Уникальное значение (ID<>null)

Kryteri

Текст

Критерий

-

<>null

Rules

Текст

Правило

-

<>null

Мощность таблицы Rules измеряется сотнями записей.

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

5.1.6. Перечень неисправностей газопровода  и методы их устранения 

Перечень характерных неисправностей и методы их устранения приведены в таблице 8.

Таблица 8

Перечень неисправностей и методы их устранения

Критерий

Неисправность

Метод устранения

Изоляция

Сквозные повреждения изоляции, нарушение сплошности, задиры, морщины, гофры, проколы, царапины

Проверить эффективность ЭХЗ, при необходимости установить дополнительные средства защиты. Устранить повреждения путём частичной или полной замены изоляции, шурфованием или шлифованием

Низкая адгезия к металлу

Проверить эффективность ЭХЗ, при необходимости установить дополнительные средства защиты. При необходимости произвести частичную либо полную замену изоляции

Низкое или близкое к предельному значение переходного сопротивления

Необходимо скорректировать режимы работы действующих установок ЭХЗ. Установить дополнительные пассивные и активные средства ЭХЗ

Металл

Маленькая остаточная толщина стенки трубы

Проверить эффективность ЭХЗ. Определить влияние коррозионного износа на величину остаточного срока службы трубы газопровода и  возможность дальнейшей эксплуатации газопровода, как без проведения ремонта, так и при условии проведения ремонта методом абразивной зачистки (приложение И), или другими допустимыми методами ремонта, в том числе врезкой "катушки"

                                                                                 Продолжение табл.8

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

Восстановлению не подлежит

Одиночные язвы, точки, пятна, механические риски, царапины, задиры, забоины на поверхности трубы

Зачистка поверхности, шлифовка

Одиночные язвы сферической формы, одиночные язвы цилиндрической формы

Наплавка металла

Групповые язвы, сплошная коррозия по периметру трубы

Приварка муфты

ЭХЗ

Низкая защищённость по времени

Проверить работоспособность каждого преобразователя, анодного заземления, протекторов и других средств защиты. Ввести в действие дополнительные средства ЭХЗ

Защитный потенциал не соответствует норме

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

Сварные стыки

Непровары, шлаковые включения, прожоги, газовые поры

Вырубить пневматическим зубилом, заварить вновь

Наплывы

Вырубить пневматическим зубилом или удалить абразивным инструментом

                                                                                 Продолжение табл.8

Подрезы

Заварить тонкими валиковыми швами

Трещины

Разделать зубилом или резаком. Кромки разделки зачистить от шлака, окалины, брызг металла. Заварить. Если имеется сетка трещин, то дефектный участок следует сначала вырезать, а потом сваркой наложить заплату

Риски, задиры, царапины

Шлифовка

Физико-механические свойства трубы

Низкая ударная вязкость

Назначение участка газопровода  на перекладку

Низкая пластичность

Назначение участка газопровода  на перекладку

Высокие кольцевые напряжения

Назначение участка газопровода  на перекладку

5.2. Математическое обеспечение

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

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

5.2.1. Защищённость участка газопровода по времени

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

Показатель защищенности, являющийся критерием предельного состояния, должен быть не менее 95%.

Опасная коррозия, мм:

δк  = 0.3*δТ,                                                                         (1)

где δТ – сквозная коррозия.

Скорость коррозии фактическая, мм/г:

Кф = δк / T,                                                                          (2)

где Т – время эксплуатации газопровода.

Скорость коррозии допустимая по нормативному сроку службы газопровода, мм/г:

Кд  =   δк  / 40.                                                                     (3)

Степень защиты от коррозии фактическая , %:

Zк  =   (Кф - Кд) / Кф.                        (4)

Время простоя ЭЗУ, сут/г:

τnp = (96 - Zк) / 0.74.                                                            (5)

Защищенность по времени, %:

Кτ = (Т - τnp) / Т.                                                                 (6)

Осуществление ранней технической диагностики подземных газопроводов исходя из учета системных простоев УКЗ и критерия защищенности по времени по всей длине сооружения является актуальным [14].                                                              

5.2.2. Критическое переходное сопротивление

Состояние изоляционного покрытия оценивается по фактическому переходному сопротивлению Rф в сравнении с критическим (предельным) Rk значением конечного переходного сопротивления.

Критическое или предельное переходное сопротивление на диагностируемом участке газопровода вычисляется решением трансцендентного уравнения, Ом:

Rk = ρг /2 * ln[(πh(D - h) Rk) / (D2H*0.4*10-6)]                 (7)

где ρг - удельное электрическое сопротивление грунта, Ом*м;

D  - наружный диаметр трубопровода, м;

H - расстояние  от  поверхности  земли  до  верхней  образующей трубопровода, м;

h    - толщина стенки трубы, м.

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

Если фактическое значение переходного сопротивления меньше критического (Rф < Rk), делается вывод о полной деградации изоляционного покрытия на данном участка газопровода.

Если Rk >= Rф >= Rk, покрытие находится на пределе защитных свойств.

Если Rф > Rk и имеется только пассивная защита газопровода, рассчитывается остаточный срок службы изоляционного покрытия в соответствии [15].

5.2.3. Остаточная толщина стенки трубы

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

hост  = ((h - δ) / h) * 100, (м)   (8)

где δ – каррозия трубы, м;

h = толщина стенки трубы, м.

 

5.2.4. Предельное значение фактических кольцевых напряжений

Предельно допустимые значения фактических кольцевых напряжений (σкцф) в стенке газопровода должны быть не более 0,75*σтф, Дж/см2

где σтф – фактическое значение предела текучести, МПа [15].

5.2.5. Остаточный срок службы изоляции

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

tост = 1/α * ln[(Rф -  Rk) / Rk], г                                          (9)       

где α -  постоянная времени старения, рассчитываемая по формуле:

α = 1/ tф * ln[(R0 -  Rk) / (Rф - Rk], г                                   (10)       

где R0 - переходное сопротивление изоляционного покрытия на законченном строительством участке газопровода. Берется реально измеренное R0 значение для данного участка, либо принимается по таблице 9;

tф - фактическое время эксплуатации газопровода до начала диагностирования, год [15, 16].

Таблица 9

Переходное сопротивление изоляционного покрытия R0

Основа покрытия

Переходное сопротивление, Ом·м2

Битумные мастики

5·104

Полимерные рулонные материалы

105

Полиэтилен экструдированный

3·105

5.2.6. Остаточный срок службы газопровода при общей коррозии

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

σкц0 = P(D - 2t0) / 2t0, Дж/см2  (11)

где P – рабочее давление, МПа;

D - наружный диаметр трубопровода, м;

t0 – толщина стенки трубы, м.

Средняя скорость общей коррозии определяется по формуле:

Vк общ = (t0 tт) / Т, мм/г                                                    (12)

где  tт – остаточная толщина стенки трубы, м;

Т – время эксплуатации, г.

Максимальное время до разрушения ненапряжённого элемента (стенки) газопровода вычисляется по формуле:

Т0 max  = (t0 / Vк общ) * (1 - σкц0 / σкцр ),                                (13)

где  σкцр – допускаемые кольцевые рабочие напряжения, МПа.

σкцр  = 0.75 * σтф,                                                                (14)

где σтф – фактическое значение предела текучести, МПа.

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

Тост = Т0 max  * exp[-Kn * 0.5(σкцфкцр )* σкцр] – T,  г      (15)

где  Kn – константа рабочей среды, МПа-1;   

Kn = V / RT,                                                                        (16)

где V – мольный объём стали, равный 7 см2/моль;

R – универсальная газовая постоянная, равная 8.31 Дж/(моль*К);

T – рабочая температура трубопровода, К;

σкцф – фактическое значение кольцевых напряжений, Дж/см2.

Полученный ресурс, определённый исходя из имеющегося повреждения металла от общей коррозии, будет являться максимальным [16].

5.2.7. Остаточный срок службы газопровода при язвенной коррозии

Критическая глубина язвенного дефекта определяется по формуле:

dдеф = t0 di[0.19Рфmax]0.5,  м                                            (17)

где di – наибольший размер коррозионной язвы по верхней кромке, м;

σmax  = 0.75 * σтф.                                                                (18)

Скорость язвенной коррозии исходя из средней скорости общей коррозии (Vкобщ) и скорости роста дефекта в плоскости трубы (Vд) определяется по формуле:

Vk1 = (Vk + Vд) / 2, мм/г                                                     (19)

где Vk = Vк общ;

Vд = di / Тф.                                                                         (20)

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

Тост = (dдефdязв)/ Vk1, г                                                     (21)

где dязв – глубина язвенной коррозии в зоне действия общей коррозии.

Рассчитанный ресурс, определённый исходя из имеющегося повреждения металла от язвенной коррозии, будет являться минимальным [16].

5.3. Техническое обеспечение

Важнейшими факторами, влияющими на функциональные возможности и эффективную работу ЭС «Диагностика ЛЧ МГ» является состав используемых технических средств.

Технические средства предназначены для решения следующих задач:

  •  выполнение программного обеспечения системы;
  •  хранение на магнитных (оптических) носителях баз данных и программ;
  •  визуализация информации [2].

Для работы системы необходимы следующие технические средства:

  •  серверы БД и БЗ;
  •  ПК пользователей;
  •  ПК инженеров по знаниям;
  •  ПК администраторов.

Минимальный состав технических средств, необходимых для  функционирования ЭС «Диагностика ЛЧ МГ»:

  •  процессор – Intel Pentium 1.2 ГГц;
  •  объем оперативной памяти – 1 Гб;
  •  дисковая подсистема – 80 Гб;
  •  монитор с разрешением 1024x768 или более высоким;
  •  устройство чтения компакт-дисков (DVD-ROM);
  •  сетевой адаптер – 100 Мбит.
  •  клавиатура, мышь.

Оптимальный состав технических средств, необходимых для  функционирования ЭС «Диагностика ЛЧ МГ»:

  •  процессор – Intel Pentium 2.4 ГГц;
  •  объем оперативной памяти – 2 Гб;
  •  дисковая подсистема – 150 Гб;
  •  монитор с разрешением 1024x768 или более высоким;
  •  устройство чтения компакт-дисков (DVD-ROM);
  •  сетевой адаптер – 100 Мбит.
  •  клавиатура, мышь.

Для запуска программы необходимо, чтобы объем файла подкачки был не менее 2048Мб.

ЭС «Диагностика ЛЧ МГ» является автономной.

5.4. Лингвистическое обеспечение

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

Главной особенностью языка C# является его ориентированность на платформу Microsoft.NET - создатели C# ставили своей целью предоставление разработчикам естественных средств доступа ко всем возможностям платформы .NET.  Кроме того, создатели С# хотели скрыть от разработчика как можно больше незначительных технических деталей, включая операции по упаковке/распаковке типов, инициализации переменных и сборке мусора. Благодаря этому программист, пишущий на C#, может лучше сконцентрироваться на содержательной части задачи.

Таким образом C# представляет собой новый язык программирования, ориентированный на разработку для платформы .NET и пригодный как для быстрого прототипирования приложений, так и для разработки крупномасштабных приложений.

Многие существующие языки программирования обладают весьма запутанным синтаксисом и конструкциями с неочевидной. Все эти языковые особенности затрудняют написание компиляторов и служат источником трудно находимых ошибок при создании программ. На другом полюсе этой проблемы находится язык Паскаль, в котором в целях упрощения было решено пожертвовать даже очевидно удобными для программиста свойствами. C# занимает некоторую промежуточную позицию: из стандарта языка убраны наиболее неприятные и неоднозначные особенности С++, но в то же время язык сохранил мощные выразительные возможности, присущие для таких языков, как С++, Java или VB [17].

Для построения инфологической модели использовался язык ER-диаграмм.

5.5. Программное обеспечение

Данный программный комплекс разработан на языке программирования С#. В качестве СУБД использовалась Microsoft SQL Server 2012. Для доступа к БД и БЗ использовалась технология ADO. Программный продукт работает под управлением операционных систем Windows 98/2000/2003/XP.

При программировании использовались следующие библиотеки: Collections.Generic, ComponentModel, Data, Drawing, IO, Linq, Text, Windows.Forms, ZedGraph и другие.

ЭС «Диагностика ЛЧ МГ» включает в себя два загрузочных модуль (файл с расширением “exe”). Первый модуль “daig.exe” для запуска ЭС, второй модуль “Admin.exe” для запуска подсистемы “Администратор”.

Для работоспособности системы на ПК должны быть установлены следующие компоненты:

  1.  операционная система семейства Windows;
  2.  СУБД Microsoft SQL Server 2012;
  3.  драйвер подключения принтера;
  4.  MS Office 2000, или новее.

MS Office не является обязательным, но может использоваться программой для экспорта данных в MS Excel.

Разработанная ЭС «Диагностика ЛЧ МГ» состоит из модулей, приведенных в табл.10.

Таблица 10

Назначение модулей в ЭС «Диагностика ЛЧ МГ»

Название модуля

Назначение

Мощность класса

Main

Модуль главной формы.

629

AccessForm

Модуль предназначенный для получения доступа к БЗ.

48

                                                                               Продолжение табл.10

Calculation

Модуль, для математических расчётов (остаточные сроки службы, защищённость по времени и др).

117

CreateFactList

Модуль предназначенный для создания списка фактических (исходных) значений параметров.

140

Diagnostics

Модуль в котором реализован решатель и формируется отчёт.

274

GetAccessForm

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

54

NewRecordBZ

Модуль формы новой записи, предназначенный для добавления новой записи в БЗ.

49

Otchet

Модуль настройки полей отчёта.

52

WorkWithBZ

Модуль предназначенный для удаления, добавления и редактирования данных БЗ и БД.

223

Tables

Модуль, содержащий классы для хранения табличных данных.

105

QueryGetTables

Модуль, содержащий запросы на выборку данных из БД и БЗ.

135

Report2

Модуль настройки и формирования отчёта.

AddDefect

Модуль формы добавления нового дефекта

56

AboutAvtorForm

Модуль формы информации об авторе

28

VerificationData

Модуль, выполняющий проверку корректности входных данных

831

Statistics

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

234

Help

Модуль справки

                                                                               Продолжение табл.10

StatisticDataForm

Форма, содержащая данные для построения диаграмм

77

3052

Исходные коды классов представлены в приложении 1. Руководство пользователя для ЭС «Диагностика ЛЧ МГ» приведено в приложении 2.

5.6. Алгоритмическое обеспечение 

Главной задачей ЭС является получение информации о состоянии ЛЧ МГ по критериям, а также его остаточный срок службы.

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

Алгоритм работы  ЭС «Диагностика ЛЧ МГ» представлена на рисунке 12.

Рис.12. Блок-схема алгоритма работы системы

Алгоритм диагностирования представлен на рис. 13.

Рис.13. Блок-схема алгоритма диагностирования

Полученные результаты пользователь может вывести на печать или сохранить как PDF или Excel файл.

6. ИНТЕРФЕЙС ЭС 

Интерфейс ЭС «Диагностика ЛЧ МГ» включает в себя несколько окон.

Первоначально при запуске программы появляется окно получения доступа к ЭС (рис. 14).

Рис.14. Форма получения доступа к ЭС

Дальнейшую работу с программой могут выполнять только зарегистрированные пользователи. При правильном вводе своего логина открывается главное  окно, представленное на рис.15.

Рис.15. Главное окно ЭС и вкладка «Входные данные»

Главное окно включает в себя:

  •  главное меню;
  •  вкладка «Входные данные»;
  •  вкладка «Результаты диагностики»;
  •  вкладка «Пополнение базы знаний»;
  •  вкладка «Статистика».

В главном меню расположены четыре пункта.

Пункт меню «Файл» позволяет сохранить в файл все параметры, введённые на вкладке «Входные данные», а также загрузить их из файла если требуется повторно ввести параметры для диагностики. Подпункт «Выход» закрывает программу.

Пункт меню «Диагностика» позволяет запустить диагностику.

Пункт меню «Справка» позволяет вызвать руководство пользователя (рис. 16) и информацию об авторе (рис. 17).

Рис.16. Окно «Руководство пользователя»

       

Рис.17. Окно «Об авторе»

На вкладке «Входные данные» задаются параметры диагностики: ФИО инженера, который проводит диагностику, дата проведения диагностики и режим диагностики (рис. 15). Поле «Режим диагностики» позволяет выбрать режим: полная или по какому-либо отдельному параметру.

Кроме это для проведения диагностики, в зависимости от выбранного режима диагностики, необходимо ввести входные данные параметров: «Металл», «Изоляция», «Физико-механические свойства трубы», «ЭХЗ», «Сварные стыки».  При выборе любого режима, кроме режима полной диагностики, некоторые поля станут не доступны. На рисунке 18 представлен пример выбора режима «Диагностика металла и сварных стыков».

Рис.18. Диагностика металла и сварных стыков

Критерии «Металл», «Сварные стыки», «Изоляция» имеют списки дефектов, которые можно редактировать.

Для удаления дефекта используется кнопка «-». Для добавления нового дефекта необходимо нажать клавишу «+», желаемого критерия, в результате появится окно «Новый дефект», вид которого представлен на рисунке 19. После ввода названия, новый дефект добавится в список дефектов.

Рис.19. Окно «Новый дефект»

После ввода всех данных и установки параметров диагностики,  необходимо нажать на кнопку «Запустить диагностику».

Сформированный отчёт будет выведен на вкладке «Результаты диагностики», вид которой представлен на рисунке 20.

Отчёт имеет три поля: параметр, результат, объяснения, рекомендации. Кроме этого на нём отображаются ФИО инженера, проводившего диагностику и дата проведения диагностики.

Полученный отчёт можно сохранить в Excel или как PDF-файл. Отчёт также можно распечатать, для этого имеется окно «Параметры печати» для настройки печати.

После формирования отчёта в подсистеме «Входные данные и диагностика» будут подсвечены те поля, значение которых не соответствует нормам. (рис. 21)

Рис.20. Вкладка «Результаты диагностики»

Рис.21. После проведения диагностики

Вкладка «Пополнение базы знаний» предназначена для редактирования базы знаний экспертной системы, а именно она позволяет добавлять новые данные в БЗ, изменять данные и удалять данные.

Данная вкладка доступна только для пользователей с полным доступом. Для доступа потребуется ввести пароль,  (рис. 22).

Рис.22. Окно получения доступа к БЗ

После ввода правильного пароля, БЗ будет отображена на вкладке в виде таблицы, (рис. 23). Для закрытия доступа к БЗ предназначена кнопка «Закрыть доступ»

Рис.23. Вкладка «Редактирование базы знаний»

Для редактирования записей необходимо изменить желаемую запись в таблице и нажать клавишу «Enter». При редактировании записей осуществляется проверка на правильность изменения. Если в поле «Критерий» какая-либо запись была изменена и измененный критерий отсутствует в списке доступных  критериев, то будет выведено предупреждение. При редактировании записей в поле «Правила» также осуществляется проверка на правильность изменения записей, при каких-либо отклонениях выводится предупреждение, и изменения не сохраняются в БЗ.

Для добавления данных используется кнопка со знаком «+». По нажатию на данную кнопку будет выведено окно добавления новой записи, представленное на рисунке 24.

Рис.24. Окно добавления новой записи в БЗ

В открывшемся окне необходимо правильно заполнить все поля. Первое поле «Критерий» выбирается из списка доступных критериев. Все остальные поля заполняются вручную.

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

После заполнения всех полей и нажатия на кнопку «Добавить», новая запись будет добавлена в БЗ.

Для удаления данных из БЗ, необходимо выделить номер интересующей записи и нажать кнопку «-».

Вкладка «Статистика» предназначена для вывода статистики по какому-либо параметру (рис.25).

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

Рис.25. Вкладка «Статистика»

График представляет собой гистограмму. По оси абсцисс откладывается дата диагностики, по оси ординат выбранный параметр.

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

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

При включённой опции «По месяцам» результаты диагностики в каждом месяце усредняются, и за каждый месяц выводится один общий результат (рис.26).

Рис.26. Работа фильтра

Диаграмму можно распечатать, для этого предназначена кнопка «Печать»ю

Кнопка «Данные для диагностики» открывает окно с данными необходимыми для построения диаграмм (рис.27).

Рис.27. Окно «Данные для диагностики»

Данные для диагностики можно распечатать и сохранить в Excel файле или как PDF файл.

Подсистема «Администратор» предназначена для контроля доступа к ЭС. Для этого программа ведёт список пользователей с указанным уровнем доступа.

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

Рис. 28. Администрирование

Пользователь с ограниченным доступом не сможет получить доступ к БЗ.

ЗАКЛЮЧЕНИЕ

Данная дипломная работа посвящена разработке экспертной системы комплексного диагностирования ЛЧ МГ.

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

Результатом дипломного проектирования является экспертная система «Диагностика ЛЧ МГ», разработанная на основании технического задания.

ЭС «Диагностика ЛЧ МГ» позволяет проводить диагностику магистрального газопровода, и на её основании формировать отчёт о его состоянии, возникших неполадках с выдачей рекомендаций по их устранению, а также даёт возможность просматривать статистику параметров. Система позволяет объединять разнородные данные, поступающие с объектов диагностирования. Отчёт представляется в табличном виде, статистика в графическом и табличном виде.

ЭС «Диагностика ЛЧ МГ» находится в завершённом и готовом к использованию состоянии. Дальнейшие пути развития системы могут включать в себя пополнение БЗ, добавление новых критериев диагностики, улучшение алгоритма диагностирования.

Данная система в процессе диагностирования будет обеспечивать экспертными знаниями пользователей системы, кроме этого использование программы позволит повысить качество анализа данных о техническом состоянии объектов МГ, сократить время на анализ, помочь в принятии решения по своевременной частичной или полной замене оборудования или его ремонту.

Данная система является автономной, квазидинамической, так как БЗ можно обновлять. Система может использоваться на персональных, портативных компьютерах.

СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

1. Методы и алгоритмы обработки измерительной информации для количественной оценки дополнительного запаса газа в магистральном газопроводе/Уланова Н. И.  – Санкт-Петербург.; 2012г.

2. Магистральные газопроводы [Электронный ресурс]. – режим  доступа:  http://www.allbest.ru/.

3. ОАО «Газпром». Положение по организации и проведению комплексного диагностирования линейной части магистральных газопроводов ЕСГ, Москва, 1998г.

4.  Введение в экспертные системы / Питер Джексон: Изд-во Вильямс, 2013. – 624с.

5.  Средства защиты газопроводов от коррозии [Электронный ресурс]. – режим  доступа http://synopsis.kubsu.ru/informatic/master/lecture/ themes8_2_3.htm.

6. Инструкция по диагностированию технического состояния газопроводов [Электронный ресурс]. НТЦБПГР. – Москва. – 2002. – режим  доступа: http://www.complexdoc.ru/ntdtext/480879/4.

7. “АРМИД–ЭКСПЕРТ” – экспертная система автоматизированной диагностики [Электронный ресурс]. – ИНКОТЕС. – 2012.-  режим  доступа: http://www.encotes.ru/?q=node/26.

8. Информационно-диагностическая система “ЭКСПЕРТ” (ИДС “ЭКСПЕРТ”) [Электронный ресурс]. - режим  доступа: http://www.ckti.ru/expert.html.

9. “Аврора-2000” – обслуживание по состоянию [Электронный ресурс]. –  режим  доступа: http://www.vibrocenter.ru/aurora.htm.

10. Программное обеспечение Атлант - комплекс программ для проведения диагностики состояния оборудования [Электронный ресурс]. режим  доступа: http://www.vibrocenter.ru/atlantpo.htm.

11. Инфологическая модель [Электронный ресурс]  - режим  доступа: http://medlenic46.narod.ru/presenta/08infolog_mod.pps.

12. Microsoft SQL Server 2012. Общие сведения о продукте / Мишель Дамлер. - 2007. – 11с.

13. Экспертная система диагностики металлоконструкций [Электронный ресурс]. - режим  доступа: http://coolreferat.com/.

14. Компьютерная технология энергоснабжения с выходом на раннюю техническую диагностику коррозии город / Винокурцев А.Г., Винокурцев Г.Г., Иванов В.В., Крупин В.А.,   Первунин В.В., Шамшетдинов К.Л. – Москва. -  2005.

15. Инструкция по диагностированию технического состояния газопроводов [Электронный ресурс]. НТЦБПГР. – Москва. – 2002. – режим  доступа: http://www.complexdoc.ru/ntdtext/480879/4.

16. К комплексному расчёту остаточного срока службы металла и изоляционного покрытия магистральных газопроводов. / Митрофанов А.В., Киченко С.Б. – Светлогорск. – 2002. -  9с.

17. C# и платформа .NET. Библиотека программиста / Троелсен. Э.- СПб.: Питер, 2006. – 796 с.:ил.

18. Интеллектуальная система поддержки принятия решений при эксплуатации нефтепромысловых газопроводов / Генюш. А.О.- Сургут.

19. Эксплуатация и ремонт технологических трубопроводов под давлением до 10,0 МПа (100 кгс/см2): Нормат.-производ. изд./А. Е. Фолиянц, Н. В. Мартынов, В. Б. Серебряный и др. Под ред. А. Е. Фолиянца. - М.: Химия, 1988.

20. ГОСТ 9.602-89. Сооружения подземные. Общие требования к защите от коррозии [Электронный ресурс]. – Москва. – 1998.  – способ доступа: http://cert.obninsk.ru/gost/358/358.html.

21. Средства защиты газопроводов от коррозии [Электронный ресурс]. – режим  доступа:  file://localhost/C:/Documents%20and% 20Settings/Master%20of%20Puppets/Рабочий%20стол/5.8.%20Средства%20защиты%20газопроводов%20от%20коррозии.mht.

22. Эксплуатация газопроводов [Электронный ресурс]. – режим  доступа: file://localhost/C:/Documents%20and%20Settings/Master%20o f%20Puppets/Рабочий%20стол/ЭКСПЛУАТАЦИЯ%20ГАЗОПРОВОДОВ.%20Техническое%20обслуживание%20газопровода%20наружного%20и%20подземного.mht.

23. Мониторинг и диагностика технологического оборудования “РОС – Мониторинг” [Электронный ресурс]. – НПП “РОС”. - режим  доступа:  http://www.ros-diagnostics.ru/monitoring.htm.

приложение 1.

Исходные коды

Главная форма «Main»

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Data.SqlClient;

using System.Diagnostics;

using System.Drawing;

using System.IO;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using ZedGraph;

namespace daig

{

   public partial class Main : Form

   {

       public Main()

       {

           InitializeComponent();

       }

       //Provider=SQLNCLI.1;Data Source=sdb-SRV.stud.surgu.ru\dion;Initial Catalog=Diagnostics;Persist Security Info=True;User ID=student;password=123321123

       SqlConnection sqlConnect = new SqlConnection("Data Source=MASTER-CDECCD38;Integrated Security=SSPI;Initial Catalog=Diagnostics MG (ES)");

       VerificationData verif = new VerificationData();

       QueryGetTables query = new QueryGetTables();

       WorkWithBZ workWithBZ = new WorkWithBZ();

       List<Otchet> _otchet = new List<Otchet>();

       List<string > _factList = new List<string>();

       List<Tables> _rulesList = new List<Tables>();

       List<Defects> _defectTable = new List<Defects>();

       List<string> deffectMetall;

       List<string> deffectStiki;

       List<string> deffectIso;

       List<Statistica> _stat = new List<Statistica>();

       Statistics Stat = new Statistics();

       

       private void Form1_Load(object sender, EventArgs e)

       {

           button2.Enabled = false;

           button3.Enabled = false;

           buttonCloseDostupBZ.Enabled = false;

           panel1.Enabled = false;

           DefectsToCheckList();

       }

       public void DefectsToCheckList()

       {

           var QueryGet = new QueryGetTables();

           _defectTable = QueryGet.GetDefectTable(sqlConnect);

           checkedListBoxStiki.Items.Clear();

           checkedListBoxMettal.Items.Clear();

           checkedListBoxIso.Items.Clear();

           foreach (var defectse in _defectTable)

           {

               if (defectse.Parametr == "Дефекты изоляции")

               { checkedListBoxIso.Items.Add(defectse.Defect);}

               else if (defectse.Parametr == "Дефекты металла")

               { checkedListBoxMettal.Items.Add(defectse.Defect); }

               else if (defectse.Parametr == "Дефекты сварных стыков")

               { checkedListBoxStiki.Items.Add(defectse.Defect); }

           }

       }

       private void EditExpertTable(object sender, DataGridViewCellEventArgs e)

       {

           string _newValue = Convert.ToString(dataGridViewTables.Rows[e.RowIndex].Cells[e.ColumnIndex].Value);

           int _number = Convert.ToInt32(dataGridViewTables.Rows[e.RowIndex].Cells[0].Value);

           int _columnNumber = Convert.ToInt32(dataGridViewTables.Rows[e.ColumnIndex].Cells[0].Value);

           

           workWithBZ.EditRecord(_newValue, _number, _columnNumber);    

          

       }

       private void AddToBZbutton(object sender, EventArgs e)

       {var record = new NewRecordBZ(); record.Show();}

       private void DellRecordBZButton(object sender, EventArgs e)

       {workWithBZ.DellRecordBZButton();}

       private void AccessButton(object sender, EventArgs e)

       {

           var accessForm = new AccessForm();

           accessForm.Show();

       }

       private void RunDiagnosticButton(object sender, EventArgs e)

       {

           var diagn = new Diagnostics();

           var factRulesClass = new CreateFactList();

           deffectMetall = new List<string>();

           deffectStiki = new List<string>();

           deffectIso = new List<string>();

           _factList.Clear(); _rulesList.Clear(); _otchet.Clear();

           

               scvoznKorrosTubeTextBox.BackColor = Color.White;

               factSoprTextBox.BackColor = Color.White;

               AdgesionTextBox.BackColor = Color.White;

               isoscvoznKarrosiaTextBox.BackColor = Color.White;

               securityPotentialTextBox.BackColor = Color.White;

               kolcNaprTextBox.BackColor = Color.White;

               timeSoprotivlTextBox.BackColor = Color.White;

               predelTecuchTextBox.BackColor = Color.White;

               vyazkostTextBox.BackColor = Color.White;

               textBoxGlubYazvKor.BackColor = Color.White;

               textBoxRazmerYazvKor.BackColor = Color.White;

               glubinaTextBox.BackColor = Color.White;

               ehpSoprGruntTextBox.BackColor = Color.White;

               timeExpluatationTextBox.BackColor = Color.White;

               textBoxWorkPressure.BackColor = Color.White;

               textBoxVMol.BackColor = Color.White;

               textBoxWorkTemp.BackColor = Color.White;

               textBoxFIO.BackColor = Color.White;

               dateTimePicker1.BackColor = Color.White;

               comboBoxRegimOfDiag.BackColor = Color.White;

               tolchStenkiTubeComboBox.BackColor = Color.White;

               diametrTubeComboBox.BackColor = Color.White;

               isoMaterialComboBox.BackColor = Color.White;

               bool correct = verif.CorrectData();

               if (correct == false){return;}

               try

               {

                   for (int i = 0; i < checkedListBoxMettal.CheckedItems.Count; i++)

                   {

                       deffectMetall.Add(checkedListBoxMettal.CheckedItems[i].ToString());

                   }

                   for (int i = 0; i < checkedListBoxStiki.CheckedItems.Count; i++)

                   {

                       deffectStiki.Add(checkedListBoxStiki.CheckedItems[i].ToString());

                   }

                   for (int i = 0; i < checkedListBoxIso.CheckedItems.Count; i++)

                   {

                       deffectIso.Add(checkedListBoxIso.CheckedItems[i].ToString());

                   }

                   _factList = factRulesClass.FactList(Convert.ToDouble(scvoznKorrosTubeTextBox.Text),

                                                       Convert.ToDouble(tolchStenkiTubeComboBox.Text),

                                                       Convert.ToDouble(vyazkostTextBox.Text),

                                                       Convert.ToDouble(predelTecuchTextBox.Text),

                                                       Convert.ToDouble(timeSoprotivlTextBox.Text),

                                                       Convert.ToDouble(kolcNaprTextBox.Text),

                                                       Convert.ToDouble(securityPotentialTextBox.Text),

                                                       Convert.ToDouble(timeExpluatationTextBox.Text),

                                                       Convert.ToDouble(ehpSoprGruntTextBox.Text),

                                                       Convert.ToDouble(isoscvoznKarrosiaTextBox.Text),

                                                       isoMaterialComboBox.Text,

                                                       Convert.ToDouble(AdgesionTextBox.Text),

                                                       Convert.ToDouble(diametrTubeComboBox.Text),

                                                       Convert.ToDouble(tolchStenkiTubeComboBox.Text),

                                                       Convert.ToDouble(glubinaTextBox.Text),

                                                       Convert.ToDouble(factSoprTextBox.Text), deffectMetall,

                                                       deffectStiki, deffectIso,

                                                       Convert.ToDouble(textBoxWorkPressure.Text),

                                                       Convert.ToDouble(textBoxVMol.Text),

                                                       Convert.ToDouble(textBoxWorkTemp.Text),

                                                       Convert.ToDouble(textBoxGlubYazvKor.Text),

                                                       Convert.ToDouble(textBoxRazmerYazvKor.Text));

                   _rulesList = query.GetRulesTable(sqlConnect);

                   _otchet = diagn.Reshatel(_rulesList, _factList);

               }

               catch (Exception)

               { MessageBox.Show("Ошибка ввода данных"); }

           reportViewer1.ProcessingMode = Microsoft.Reporting.WinForms.ProcessingMode.Local;

           BindingSource.DataSource = _otchet;

           this.reportViewer1.RefreshReport();

       }

       private void сохранитьToolStripMenuItem_Click(object sender, EventArgs e)

       {

           try

           {

               saveFileDialog1.Filter = "Текстовые файлы (*.txt)|*.txt|Все файлы (*.*)|*.*";

               if (saveFileDialog1.ShowDialog() == DialogResult.OK)

               {

                   string fileName = saveFileDialog1.FileName;

                   StreamWriter sr = File.CreateText(fileName);

                   sr.WriteLine(scvoznKorrosTubeTextBox.Text);

                   sr.WriteLine(textBoxGlubYazvKor.Text);

                   sr.WriteLine(textBoxRazmerYazvKor.Text);

                   sr.WriteLine(glubinaTextBox.Text);

                   sr.WriteLine(ehpSoprGruntTextBox.Text);

                   sr.WriteLine(timeExpluatationTextBox.Text);

                   sr.WriteLine(securityPotentialTextBox.Text);

                   sr.WriteLine(isoscvoznKarrosiaTextBox.Text);

                   sr.WriteLine(factSoprTextBox.Text);

                   sr.WriteLine(AdgesionTextBox.Text);

                   sr.WriteLine(vyazkostTextBox.Text);

                   sr.WriteLine(predelTecuchTextBox.Text);

                   sr.WriteLine(timeSoprotivlTextBox.Text);

                   sr.WriteLine(kolcNaprTextBox.Text);

                   sr.WriteLine(textBoxWorkPressure.Text);

                   sr.WriteLine(textBoxVMol.Text);

                   sr.WriteLine(textBoxWorkTemp.Text);

                   sr.Close();

               }

           }

           catch (Exception)

           { MessageBox.Show("Ошибка записи в файл!"); }   

           

       }

       private void загрузитьToolStripMenuItem_Click(object sender, EventArgs e)

       {

           try

           {

               string st = "";

               List<string> stList = new List<string>();

               openFileDialog1.Filter = "Текстовые файлы (*.txt)|*.txt|Все файлы (*.*)|*.*";

               if (openFileDialog1.ShowDialog() == DialogResult.OK)

               {

                   string fileName = openFileDialog1.FileName;

                   StreamReader str = new StreamReader(fileName, Encoding.UTF8);

                   while (st != null)

                   {

                       st = str.ReadLine();

                       stList.Add(st);

                   }

                   str.Close();

               }

               scvoznKorrosTubeTextBox.Text = stList[0];

               textBoxGlubYazvKor.Text = stList[1];

               textBoxRazmerYazvKor.Text = stList[2];

               glubinaTextBox.Text = stList[3];

               ehpSoprGruntTextBox.Text = stList[4];

               timeExpluatationTextBox.Text = stList[5];

               securityPotentialTextBox.Text = stList[6];

               isoscvoznKarrosiaTextBox.Text = stList[7];

               factSoprTextBox.Text = stList[8];

               AdgesionTextBox.Text = stList[9];

               vyazkostTextBox.Text = stList[10];

               predelTecuchTextBox.Text = stList[11];

               timeSoprotivlTextBox.Text = stList[12];

               kolcNaprTextBox.Text = stList[13];

               textBoxWorkPressure.Text = stList[14];

               textBoxVMol.Text = stList[15];

               textBoxWorkTemp.Text = stList[16];

           }

           catch (Exception)

           {MessageBox.Show("Ошибка чтения файла!"); }

       }

       private void SelectRegimOfDiagn(object sender, EventArgs e)

       {

           tolchStenkiTubeComboBox.Enabled = false;

           ehpSoprGruntTextBox.Enabled = false;

           scvoznKorrosTubeTextBox.Enabled = false;

           textBoxGlubYazvKor.Enabled = false;

           textBoxRazmerYazvKor.Enabled = false;

           isoMaterialComboBox.Enabled = false;

           isoscvoznKarrosiaTextBox.Enabled = false;

           diametrTubeComboBox.Enabled = false;

           glubinaTextBox.Enabled = false;

           factSoprTextBox.Enabled = false;

           AdgesionTextBox.Enabled = false;

           securityPotentialTextBox.Enabled = false;

           timeExpluatationTextBox.Enabled = false;

           vyazkostTextBox.Enabled = false;

           predelTecuchTextBox.Enabled = false;

           timeSoprotivlTextBox.Enabled = false;

           kolcNaprTextBox.Enabled = false;

           textBoxWorkPressure.Enabled = false;

           textBoxVMol.Enabled = false;

           textBoxWorkTemp.Enabled = false;

           checkedListBoxStiki.Enabled = false;

           checkedListBoxMettal.Enabled = false;

           checkedListBoxIso.Enabled = false;

           buttonDellStikiDef.Enabled = false;

           buttonDellMetallDef.Enabled = false;

           buttonDellIsoDef.Enabled = false;

           buttonAddStikiDef.Enabled = false;

           buttonAddMetallDef.Enabled = false;

           buttonAddIsoDef.Enabled = false;

               

           if (comboBoxRegimOfDiag.Text == "Полная диагностика")

           {

               scvoznKorrosTubeTextBox.Enabled = true;

               textBoxGlubYazvKor.Enabled = true;

               textBoxRazmerYazvKor.Enabled = true;

               timeExpluatationTextBox.Enabled = true;

               tolchStenkiTubeComboBox.Enabled = true;

               ehpSoprGruntTextBox.Enabled = true;

               isoMaterialComboBox.Enabled = true;

               isoscvoznKarrosiaTextBox.Enabled = true;

               diametrTubeComboBox.Enabled = true;

               glubinaTextBox.Enabled = true;

               factSoprTextBox.Enabled = true;

               AdgesionTextBox.Enabled = true;

               securityPotentialTextBox.Enabled = true;

               vyazkostTextBox.Enabled = true;

               predelTecuchTextBox.Enabled = true;

               timeSoprotivlTextBox.Enabled = true;

               kolcNaprTextBox.Enabled = true;

               textBoxWorkPressure.Enabled = true;

               textBoxVMol.Enabled = true;

               textBoxWorkTemp.Enabled = true;

               checkedListBoxStiki.Enabled = true;

               checkedListBoxMettal.Enabled = true;

               checkedListBoxIso.Enabled = true;

               buttonDellStikiDef.Enabled = true;

               buttonDellMetallDef.Enabled = true;

               buttonDellIsoDef.Enabled = true;

               buttonAddStikiDef.Enabled = true;

               buttonAddMetallDef.Enabled = true;

               buttonAddIsoDef.Enabled = true;

           }

           if (comboBoxRegimOfDiag.Text == "Диагностика изоляции")

           {

               timeExpluatationTextBox.Enabled = true;

               tolchStenkiTubeComboBox.Enabled = true;

               ehpSoprGruntTextBox.Enabled = true;

               isoMaterialComboBox.Enabled = true;

               isoscvoznKarrosiaTextBox.Enabled = true;

               diametrTubeComboBox.Enabled = true;

               glubinaTextBox.Enabled = true;

               factSoprTextBox.Enabled = true;

               AdgesionTextBox.Enabled = true;

               checkedListBoxIso.Enabled = true;

               buttonDellIsoDef.Enabled = true;

               buttonAddIsoDef.Enabled = true;

           }

           if (comboBoxRegimOfDiag.Text == "Диагностика металла и сварных стыков")

           {

               scvoznKorrosTubeTextBox.Enabled = true;

               textBoxGlubYazvKor.Enabled = true;

               textBoxRazmerYazvKor.Enabled = true;

               timeExpluatationTextBox.Enabled = true;

               tolchStenkiTubeComboBox.Enabled = true;

               ehpSoprGruntTextBox.Enabled = true;

               diametrTubeComboBox.Enabled = true;

               glubinaTextBox.Enabled = true;

               

               textBoxWorkPressure.Enabled = true;

               textBoxVMol.Enabled = true;

               textBoxWorkTemp.Enabled = true;

               checkedListBoxStiki.Enabled = true;

               checkedListBoxMettal.Enabled = true;

               buttonDellStikiDef.Enabled = true;

               buttonDellMetallDef.Enabled = true;

               buttonAddStikiDef.Enabled = true;

               buttonAddMetallDef.Enabled = true;

           }

           if (comboBoxRegimOfDiag.Text == "Диагностика ЭХЗ")

           {

               scvoznKorrosTubeTextBox.Enabled = true;

               textBoxGlubYazvKor.Enabled = true;

               textBoxRazmerYazvKor.Enabled = true;

               timeExpluatationTextBox.Enabled = true;

               tolchStenkiTubeComboBox.Enabled = true;

               ehpSoprGruntTextBox.Enabled = true;

               securityPotentialTextBox.Enabled = true;

           }

           if (comboBoxRegimOfDiag.Text == "Диагностика Ф-М свойств трубы")

           {

               timeExpluatationTextBox.Enabled = true;

               tolchStenkiTubeComboBox.Enabled = true;

               ehpSoprGruntTextBox.Enabled = true;

               vyazkostTextBox.Enabled = true;

               predelTecuchTextBox.Enabled = true;

               timeSoprotivlTextBox.Enabled = true;

               kolcNaprTextBox.Enabled = true;

           }

       }

       private void запусткДиагностикиToolStripMenuItem_Click(object sender, EventArgs e)

       {RunDiagnosticButton(null,null);}

       private void выходToolStripMenuItem_Click(object sender, EventArgs e)

       {Close();}

       private void buttonStatistic_Click(object sender, EventArgs e)

       {

           try

           {

               zedGraphControl1.IsShowPointValues = true;

               zedGraphControl1.PointValueEvent += new ZedGraphControl.PointValueHandler(zedGraph_PointValueEvent);

               string kryt = "";

               GraphPane pane = zedGraphControl1.GraphPane;

               pane.CurveList.Clear();

               pane.GraphObjList.Clear();

               if (comboBoxStatKyteri.Text == "")

               {MessageBox.Show("Выберите критерий!");}

               switch (comboBoxStatKyteri.Text)

               {

                   case "Защитный потенциал":

                       kryt = "Защитный потенциал";

                       pane.YAxis.Title.Text = "Защитный потенциал, В";

                       pane.YAxis.Scale.Max = 0;

                       pane.YAxis.Scale.Min = -6;

                       break;

                   case "Защищённость по времени":

                       kryt = "Защищённость по времени";

                       pane.YAxis.Title.Text = "Защищённость по времени, %";

                       pane.YAxis.Scale.Max = 100;

                       pane.YAxis.Scale.Min = 0;

                       break;

                   case "Кольцевые напряжения":

                       kryt = "Кольцевые напряжения";

                       pane.YAxis.Title.Text = "Кольцевые напряжения, МПа";

                       pane.YAxis.Scale.Max = 200;

                       pane.YAxis.Scale.Min = 0;

                       break;

                   case "Остаточная толщина стенки трубы":

                       kryt = "Каррозия трубы";

                       pane.YAxis.Title.Text = "Остаточная толщина стенки трубы, %";

                       pane.YAxis.Scale.Max = 100;

                       pane.YAxis.Scale.Min = 0;

                       break;

                   case "Адгезия":

                       kryt = "Адгезия";

                       pane.YAxis.Title.Text = "Адгезия, кгс/см^2";

                       pane.YAxis.Scale.Max = 20;

                       pane.YAxis.Scale.Min = 0;

                       break;

                   case "Ударная вязкость":

                       kryt = "Ударная вязкость";

                       pane.YAxis.Title.Text = "Ударная вязкость, Дж/см^2";

                       pane.YAxis.Scale.Max = 200;

                       pane.YAxis.Scale.Min = 0;

                       break;

                   case "Пластичность":

                       kryt = "Пластичность";

                       pane.YAxis.Title.Text = "Пластичность, МПа";

                       pane.YAxis.Scale.Max = 20;

                       pane.YAxis.Scale.Min = 0;

                       break;

                   case "Переходное сопротивление":

                       kryt = "Переходное сопротивление";

                       pane.YAxis.Title.Text = "Переходное сопротивление, ОМ";

                       pane.YAxis.Scale.Max = 500;

                       pane.YAxis.Scale.Min = 0;

                       break;

                   case "Остаточный срок службы газопровода (язв.Коррозия)":

                       kryt = "Остаточный срок службы газопровода (язв.Коррозия)";

                       pane.YAxis.Title.Text = "Остаточный срок службы газопровода (язв.Коррозия), г.";

                       pane.YAxis.Scale.Max = 150;

                       pane.YAxis.Scale.Min = 0;

                       break;

                   case "Остаточный срок службы газопровода (общ.Коррозия)":

                       kryt = "Остаточный срок службы газопровода (общ.Коррозия)";

                       pane.YAxis.Title.Text = "Остаточный срок службы газопровода (общ.Коррозия), г.";

                       pane.YAxis.Scale.Max = 150;

                       pane.YAxis.Scale.Min = 0;

                       break;

                   case "Остаточный срок службы изоляции":

                       kryt = "Остаточный срок службы изоляции";

                       pane.YAxis.Title.Text = "Остаточный срок службы изоляции, г.";

                       pane.YAxis.Scale.Max = 100;

                       pane.YAxis.Scale.Min = 0;

                       break;

               }

               _stat = query.GetStatistica(sqlConnect, kryt);

               Stat.ZedGraphStat(_stat, pane, kryt);

           }

           catch (Exception)

           {MessageBox.Show("Ошибка вывода статистики!"); }

       }

       public void buttonAtoMashtab_Click(object sender, EventArgs e)

       {

           GraphPane pane = zedGraphControl1.GraphPane;

           pane.XAxis.Scale.MinAuto = true;

           pane.XAxis.Scale.MaxAuto = true;

           pane.YAxis.Scale.MinAuto = true;

           pane.YAxis.Scale.MaxAuto = true;

           zedGraphControl1.AxisChange();

           zedGraphControl1.Invalidate();

       }

       private void checkBoxFiltr_CheckedChanged(object sender, EventArgs e)

       {

           if (checkBoxFiltr.Checked == true) { panel1.Enabled = true; }

           else panel1.Enabled = false;

       }

       string zedGraph_PointValueEvent(ZedGraphControl sender,GraphPane pane, CurveItem curve,int iPt)

       {

           PointPair point = curve[iPt];

           string result = string.Format("{1:F3}",null ,point.Y);  return result;

       }

       private void buttonAddIsoDef_Click(object sender, EventArgs e)

       {

           AddDefect addDefect = new AddDefect();

           addDefect.Show();

           addDefect.Tag = "checkedListBoxIso";

       }

       private void buttonAddMetallDef_Click(object sender, EventArgs e)

       {

           AddDefect addDefect = new AddDefect();

           addDefect.Show();

           addDefect.Tag = "checkedListBoxMetall";

       }

       private void buttonAddStikiDef_Click(object sender, EventArgs e)

       {

           AddDefect addDefect = new AddDefect();

           addDefect.Show();

           addDefect.Tag = "checkedListBoxStiki";

       }

       private void buttonDellIsoDef_Click(object sender, EventArgs e)

       {

           if (checkedListBoxIso.CheckedItems.Count != 0)

           {

               for (int i = 0; i < checkedListBoxIso.CheckedItems.Count; i++)

               {workWithBZ.DeleteDefect(checkedListBoxIso.CheckedItems[i].ToString());}

               

               DefectsToCheckList();

           }

       }

       private void buttonDellMetallDef_Click(object sender, EventArgs e)

       {

           if (checkedListBoxMettal.CheckedItems.Count != 0)

           {

               for (int i = 0; i < checkedListBoxMettal.CheckedItems.Count; i++)

               { workWithBZ.DeleteDefect(checkedListBoxMettal.CheckedItems[i].ToString()); }

               DefectsToCheckList();

           }

       }

       private void buttonDellStikiDef_Click(object sender, EventArgs e)

       {

           if (checkedListBoxStiki.CheckedItems.Count != 0)

           {

               for (int i = 0; i < checkedListBoxStiki.CheckedItems.Count; i++)

               { workWithBZ.DeleteDefect(checkedListBoxStiki.CheckedItems[i].ToString()); }

               DefectsToCheckList();

           }

       }

       private void помощьToolStripMenuItem_Click(object sender, EventArgs e)

       {

       }

       private void обАвтореToolStripMenuItem1_Click(object sender, EventArgs e)

       {

           var avtorForm = new AboutAvtorForm();

           avtorForm.Show();

       }

       private void groupBox1_Enter(object sender, EventArgs e)

       {}

       private void button6_Click(object sender, EventArgs e)

       {

           var statisticDataForm = new StatisticDataForm();

           statisticDataForm.Show();

       }

       private void button5_Click(object sender, EventArgs e)

       {Close();}

       private void buttonCloseDostupBZ_Click(object sender, EventArgs e)

       {

           var closeBZ = new List<Tables>();

           dataGridViewTables.DataSource = closeBZ;

           button4.Enabled = true;

           button4.BackColor = Color.Tomato;

           button2.Enabled = false;

           button3.Enabled = false;

           buttonCloseDostupBZ.Enabled = false;

         

       }

       private void руководствоПользователяToolStripMenuItem_Click(object sender, EventArgs e)

       {

           Process r = new Process();

           r.StartInfo = new ProcessStartInfo("HELP.hlp");

           r.Start();

       }

   }

}

Модуль  «VerificationData»

using System;

using System.Collections.Generic;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace daig

{

   class VerificationData

   {

       private Main _main;

       public bool CorrectData()

       {

           foreach (Form f in Application.OpenForms)

           { if (f is Main) { _main = (Main)f; } }

           try

           {

               if (_main.comboBoxRegimOfDiag.Text == "")

               {

                   _main.comboBoxRegimOfDiag.BackColor = Color.DimGray;

                   MessageBox.Show(@"Вы не выбрали режим диагностики");

                   return false;

               }

               if (_main.comboBoxRegimOfDiag.Text == @"Полная диагностика")

               {

                   if (_main.textBoxFIO.Text == "")

                   {

                       _main.textBoxFIO.BackColor = Color.DimGray;

                       MessageBox.Show(@"Вы не заполнили поле 'ФИО'!");

                       return false;

                   }

                   if (_main.dateTimePicker1.Text == "")

                   {

                       _main.dateTimePicker1.BackColor = Color.DimGray;

                       MessageBox.Show(@"Вы не заполнили поле 'Дата диагностики'!");

                       return false;

                   }

                   if ((_main.scvoznKorrosTubeTextBox.Text.Contains('.')) || (_main.scvoznKorrosTubeTextBox.Text == ""))

                   {

                       _main.scvoznKorrosTubeTextBox.BackColor = Color.DimGray;

                       MessageBox.Show( @"Ошибка в поле глубина общ.Коррозии. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.scvoznKorrosTubeTextBox.Text) < 0)

                   {

                       _main.scvoznKorrosTubeTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле глубина общ.Коррозии. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.tolchStenkiTubeComboBox.Text.Contains('.')) || (_main.tolchStenkiTubeComboBox.Text == ""))

                   {

                       _main.tolchStenkiTubeComboBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле толщина стенки трубы. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.tolchStenkiTubeComboBox.Text) < 0)

                   {

                       _main.tolchStenkiTubeComboBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле толщина стенки трубы. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.ehpSoprGruntTextBox.Text.Contains('.')) || (_main.ehpSoprGruntTextBox.Text == ""))

                   {

                       _main.ehpSoprGruntTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле сопротивление грунта. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.ehpSoprGruntTextBox.Text) < 0)

                   {

                       _main.ehpSoprGruntTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле сопротивление грунта. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.timeExpluatationTextBox.Text.Contains('.')) || (_main.timeExpluatationTextBox.Text == ""))

                   {

                       _main.timeExpluatationTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле время эксплуатации. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.timeExpluatationTextBox.Text) < 0)

                   {

                       _main.timeExpluatationTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле время эксплуатации. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.diametrTubeComboBox.Text.Contains('.')) || (_main.diametrTubeComboBox.Text == ""))

                   {

                       _main.diametrTubeComboBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле диаметр трубы. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.diametrTubeComboBox.Text) < 0)

                   {

                       _main.diametrTubeComboBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле диаметр трубы. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.isoscvoznKarrosiaTextBox.Text.Contains('.')) ||

                       (_main.isoscvoznKarrosiaTextBox.Text == ""))

                   {

                       _main.isoscvoznKarrosiaTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле коррозия изоляции. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.isoscvoznKarrosiaTextBox.Text) < 0)

                   {

                       _main.isoscvoznKarrosiaTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле коррозия изоляции. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.glubinaTextBox.Text.Contains('.')) || (_main.glubinaTextBox.Text == ""))

                   {

                       _main.glubinaTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле глубина. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.glubinaTextBox.Text) < 0)

                   {

                       _main.glubinaTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле глубина. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.AdgesionTextBox.Text.Contains('.')) || (_main.AdgesionTextBox.Text == ""))

                   {

                       _main.AdgesionTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле адгезия. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.AdgesionTextBox.Text) < 0)

                   {

                       _main.AdgesionTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле адгезия. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.factSoprTextBox.Text.Contains('.')) || (_main.factSoprTextBox.Text == ""))

                   {

                       _main.factSoprTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле фактическое сопротивление. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.factSoprTextBox.Text) < 0)

                   {

                       _main.factSoprTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле фактическое сопротивление. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.vyazkostTextBox.Text.Contains('.')) || (_main.vyazkostTextBox.Text == ""))

                   {

                       _main.vyazkostTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле вязкость. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.vyazkostTextBox.Text) < 0)

                   {

                       _main.vyazkostTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле вязкость. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.predelTecuchTextBox.Text.Contains('.')) || (_main.predelTecuchTextBox.Text == ""))

                   {

                       _main.predelTecuchTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле предел текучести. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.predelTecuchTextBox.Text) < 0)

                   {

                       _main.predelTecuchTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле предел текучести. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.kolcNaprTextBox.Text.Contains('.')) || (_main.kolcNaprTextBox.Text == ""))

                   {

                       _main.kolcNaprTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле кольцевые напряжения. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.kolcNaprTextBox.Text) < 0)

                   {

                       _main.kolcNaprTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле кольцевые напряжения. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.timeSoprotivlTextBox.Text.Contains('.')) || (_main.timeSoprotivlTextBox.Text == ""))

                   {

                       _main.timeSoprotivlTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле временное сопротивление. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.timeSoprotivlTextBox.Text) < 0)

                   {

                       _main.timeSoprotivlTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле временное сопротивление. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.textBoxGlubYazvKor.Text.Contains('.')) || (_main.textBoxGlubYazvKor.Text == ""))

                   {

                       _main.textBoxGlubYazvKor.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле глубина язв.Коррозии. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.textBoxGlubYazvKor.Text) < 0)

                   {

                       _main.textBoxGlubYazvKor.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле глубина язв.Коррозии. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.textBoxRazmerYazvKor.Text.Contains('.')) || (_main.textBoxRazmerYazvKor.Text == ""))

                   {

                       _main.textBoxRazmerYazvKor.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле размер язв.Коррозии. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.textBoxRazmerYazvKor.Text) < 0)

                   {

                       _main.textBoxRazmerYazvKor.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле размер язв.Коррозии. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.securityPotentialTextBox.Text.Contains('.')) ||

                       (_main.securityPotentialTextBox.Text == ""))

                   {

                       _main.securityPotentialTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле защитный потенциал. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (_main.isoMaterialComboBox.Text == "")

                   {

                       _main.isoMaterialComboBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле материал изоляции. Возможно поле пустое!");

                       return false;

                   }

                   if ((_main.textBoxWorkPressure.Text.Contains('.')) || (_main.textBoxWorkPressure.Text == ""))

                   {

                       _main.textBoxWorkPressure.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле рабочее давление. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.textBoxWorkPressure.Text) < 0)

                   {

                       _main.textBoxWorkPressure.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле рабочее давление. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.textBoxVMol.Text.Contains('.')) || (_main.textBoxVMol.Text == ""))

                   {

                       _main.textBoxVMol.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле молярный объём стали. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.textBoxVMol.Text) < 0)

                   {

                       _main.textBoxVMol.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле молярный объём стали. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.textBoxWorkTemp.Text.Contains('.')) || (_main.textBoxWorkTemp.Text == ""))

                   {

                       _main.textBoxWorkTemp.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле рабочая температура. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.textBoxWorkTemp.Text) < 0)

                   {

                       _main.textBoxWorkTemp.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле рабочая температура. Введено отрицательное значение!");

                       return false;

                   }

               }

               else if (_main.comboBoxRegimOfDiag.Text == @"Диагностика изоляции")

               {

                   if (_main.textBoxFIO.Text == "")

                   {

                       _main.textBoxFIO.BackColor = Color.DimGray;

                       MessageBox.Show(@"Вы не заполнили поле ФИО!");

                       return false;

                   }

                   if (_main.dateTimePicker1.Text == "")

                   {

                       _main.dateTimePicker1.BackColor = Color.DimGray;

                       MessageBox.Show(@"Вы не заполнили поле Дата диагностики!");

                       return false;

                   }

                   if ((_main.tolchStenkiTubeComboBox.Text.Contains('.')) || (_main.tolchStenkiTubeComboBox.Text == ""))

                   {

                       _main.tolchStenkiTubeComboBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле толщина стенки трубы. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.tolchStenkiTubeComboBox.Text) < 0)

                   {

                       _main.tolchStenkiTubeComboBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле толщина стенки трубы. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.ehpSoprGruntTextBox.Text.Contains('.')) || (_main.ehpSoprGruntTextBox.Text == ""))

                   {

                       _main.ehpSoprGruntTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле сопротивление грунта. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.ehpSoprGruntTextBox.Text) < 0)

                   {

                       _main.ehpSoprGruntTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле сопротивление грунта. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.timeExpluatationTextBox.Text.Contains('.')) || (_main.timeExpluatationTextBox.Text == ""))

                   {

                       _main.timeExpluatationTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле время эксплуатации. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.timeExpluatationTextBox.Text) < 0)

                   {

                       _main.timeExpluatationTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле время эксплуатации. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.isoscvoznKarrosiaTextBox.Text.Contains('.')) ||

                       (_main.isoscvoznKarrosiaTextBox.Text == ""))

                   {

                       _main.isoscvoznKarrosiaTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле коррозия изоляции. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.isoscvoznKarrosiaTextBox.Text) < 0)

                   {

                       _main.isoscvoznKarrosiaTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле коррозия изоляции. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.diametrTubeComboBox.Text.Contains('.')) || (_main.diametrTubeComboBox.Text == ""))

                   {

                       _main.diametrTubeComboBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле диаметр трубы. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.diametrTubeComboBox.Text) < 0)

                   {

                       _main.diametrTubeComboBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле диаметр трубы. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.glubinaTextBox.Text.Contains('.')) || (_main.glubinaTextBox.Text == ""))

                   {

                       _main.glubinaTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле глубина. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.glubinaTextBox.Text) < 0)

                   {

                       _main.glubinaTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле глубина. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.AdgesionTextBox.Text.Contains('.')) || (_main.AdgesionTextBox.Text == ""))

                   {

                       _main.AdgesionTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле адгезия. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.AdgesionTextBox.Text) < 0)

                   {

                       _main.AdgesionTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле адгезия. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.factSoprTextBox.Text.Contains('.')) || (_main.factSoprTextBox.Text == ""))

                   {

                       _main.factSoprTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле фактическое сопротивление. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.factSoprTextBox.Text) < 0)

                   {

                       _main.factSoprTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле фактическое сопротивление. Введено отрицательное значение!");

                       return false;

                   }

                   if (_main.isoMaterialComboBox.Text == "")

                   {

                       _main.isoMaterialComboBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле материал изоляции. Возможно поле пустое!");

                       return false;

                   }

               }

               else if (_main.comboBoxRegimOfDiag.Text == @"Диагностика металла и сварных стыков!")

               {

                   if (_main.textBoxFIO.Text == "")

                   {

                       _main.textBoxFIO.BackColor = Color.DimGray;

                       MessageBox.Show(@"Вы не заполнили поле ФИО!");

                       return false;

                   }

                   if (_main.dateTimePicker1.Text == "")

                   {

                       _main.dateTimePicker1.BackColor = Color.DimGray;

                       MessageBox.Show(@"Вы не заполнили поле Дата диагностики!");

                       return false;

                   }

                   if ((_main.scvoznKorrosTubeTextBox.Text.Contains('.')) || (_main.scvoznKorrosTubeTextBox.Text == ""))

                   {

                       _main.scvoznKorrosTubeTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле глубина общ.Коррозии. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.scvoznKorrosTubeTextBox.Text) < 0)

                   {

                       _main.scvoznKorrosTubeTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле глубина общ.Коррозии. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.tolchStenkiTubeComboBox.Text.Contains('.')) || (_main.tolchStenkiTubeComboBox.Text == ""))

                   {

                       _main.tolchStenkiTubeComboBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле толщина стенки трубы. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.tolchStenkiTubeComboBox.Text) < 0)

                   {

                       _main.tolchStenkiTubeComboBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле толщина стенки трубы. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.ehpSoprGruntTextBox.Text.Contains('.')) || (_main.ehpSoprGruntTextBox.Text == ""))

                   {

                       _main.ehpSoprGruntTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле сопротивление грунта. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.ehpSoprGruntTextBox.Text) < 0)

                   {

                       _main.ehpSoprGruntTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле сопротивление грунта. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.timeExpluatationTextBox.Text.Contains('.')) || (_main.timeExpluatationTextBox.Text == ""))

                   {

                       _main.timeExpluatationTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле время эксплуатации. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.timeExpluatationTextBox.Text) < 0)

                   {

                       _main.timeExpluatationTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле время эксплуатации. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.diametrTubeComboBox.Text.Contains('.')) || (_main.diametrTubeComboBox.Text == ""))

                   {

                       _main.diametrTubeComboBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле диаметр трубы. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.diametrTubeComboBox.Text) < 0)

                   {

                       _main.diametrTubeComboBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле диаметр трубы. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.glubinaTextBox.Text.Contains('.')) || (_main.glubinaTextBox.Text == ""))

                   {

                       _main.glubinaTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле глубина. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.glubinaTextBox.Text) < 0)

                   {

                       _main.glubinaTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле глубина. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.textBoxWorkPressure.Text.Contains('.')) || (_main.textBoxWorkPressure.Text == ""))

                   {

                       _main.textBoxWorkPressure.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле рабочее давление. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.textBoxWorkPressure.Text) < 0)

                   {

                       _main.textBoxWorkPressure.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле рабочее давление. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.textBoxVMol.Text.Contains('.')) || (_main.textBoxVMol.Text == ""))

                   {

                       _main.textBoxVMol.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле молярный объём стали. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.textBoxVMol.Text) < 0)

                   {

                       _main.textBoxVMol.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле молярный объём стали. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.textBoxWorkTemp.Text.Contains('.')) || (_main.textBoxWorkTemp.Text == ""))

                   {

                       _main.textBoxWorkTemp.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле рабочая температура. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.textBoxWorkTemp.Text) < 0)

                   {

                       _main.textBoxWorkTemp.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле рабочая температура. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.textBoxGlubYazvKor.Text.Contains('.')) || (_main.textBoxGlubYazvKor.Text == ""))

                   {

                       _main.textBoxGlubYazvKor.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле глубина язв.Коррозии. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.textBoxGlubYazvKor.Text) < 0)

                   {

                       _main.textBoxGlubYazvKor.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле глубина язв.Коррозии. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.textBoxRazmerYazvKor.Text.Contains('.')) || (_main.textBoxRazmerYazvKor.Text == ""))

                   {

                       _main.textBoxRazmerYazvKor.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле размер язв.Коррозии. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.textBoxRazmerYazvKor.Text) < 0)

                   {

                       _main.textBoxRazmerYazvKor.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле размер язв.Коррозии. Введено отрицательное значение!");

                       return false;

                   }

               }

               else if (_main.comboBoxRegimOfDiag.Text == @"Диагностика ЭХЗ")

               {

                   if (_main.textBoxFIO.Text == "")

                   {

                       _main.textBoxFIO.BackColor = Color.DimGray;

                       MessageBox.Show(@"Вы не заполнили поле ФИО!");

                       return false;

                   }

                   if (_main.dateTimePicker1.Text == "")

                   {

                       _main.dateTimePicker1.BackColor = Color.DimGray;

                       MessageBox.Show(@"Вы не заполнили поле Дата диагностики!");

                       return false;

                   }

                   if ((_main.textBoxGlubYazvKor.Text.Contains('.')) || (_main.textBoxGlubYazvKor.Text == ""))

                   {

                       _main.textBoxGlubYazvKor.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле глубина язв.Коррозии. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.textBoxGlubYazvKor.Text) < 0)

                   {

                       _main.textBoxGlubYazvKor.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле глубина язв.Коррозии. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.textBoxRazmerYazvKor.Text.Contains('.')) || (_main.textBoxRazmerYazvKor.Text == ""))

                   {

                       _main.textBoxRazmerYazvKor.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле размер язв.Коррозии. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.textBoxRazmerYazvKor.Text) < 0)

                   {

                       _main.textBoxRazmerYazvKor.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле размер язв.Коррозии. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.timeExpluatationTextBox.Text.Contains('.')) || (_main.timeExpluatationTextBox.Text == ""))

                   {

                       _main.timeExpluatationTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле время эксплуатации. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.timeExpluatationTextBox.Text) < 0)

                   {

                       _main.timeExpluatationTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле время эксплуатации. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.scvoznKorrosTubeTextBox.Text.Contains('.')) || (_main.scvoznKorrosTubeTextBox.Text == ""))

                   {

                       _main.scvoznKorrosTubeTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле глубина общ.Коррозии. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.scvoznKorrosTubeTextBox.Text) < 0)

                   {

                       _main.scvoznKorrosTubeTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле глубина общ.Коррозии. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.tolchStenkiTubeComboBox.Text.Contains('.')) || (_main.tolchStenkiTubeComboBox.Text == ""))

                   {

                       _main.tolchStenkiTubeComboBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле толщина стенки трубы. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.tolchStenkiTubeComboBox.Text) < 0)

                   {

                       _main.tolchStenkiTubeComboBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле толщина стенки трубы. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.ehpSoprGruntTextBox.Text.Contains('.')) || (_main.ehpSoprGruntTextBox.Text == ""))

                   {

                       _main.ehpSoprGruntTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле сопротивление грунта. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.ehpSoprGruntTextBox.Text) < 0)

                   {

                       _main.ehpSoprGruntTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле сопротивление грунта. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.securityPotentialTextBox.Text.Contains('.')) ||

                       (_main.securityPotentialTextBox.Text == ""))

                   {

                       _main.securityPotentialTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле защитный потенциал. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

               }

               else if (_main.comboBoxRegimOfDiag.Text == @"Диагностика Ф-М свойств трубы")

               {

                   if (_main.textBoxFIO.Text == "")

                   {

                       _main.textBoxFIO.BackColor = Color.DimGray;

                       MessageBox.Show(@"Вы не заполнили поле ФИО!");

                       return false;

                   }

                   if (_main.dateTimePicker1.Text == "")

                   {

                       _main.dateTimePicker1.BackColor = Color.DimGray;

                       MessageBox.Show(@"Вы не заполнили поле Дата диагностики!");

                       return false;

                   }

                   if ((_main.tolchStenkiTubeComboBox.Text.Contains('.')) || (_main.tolchStenkiTubeComboBox.Text == ""))

                   {

                       _main.tolchStenkiTubeComboBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле толщина стенки трубы. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.tolchStenkiTubeComboBox.Text) < 0)

                   {

                       _main.tolchStenkiTubeComboBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле толщина стенки трубы. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.ehpSoprGruntTextBox.Text.Contains('.')) || (_main.ehpSoprGruntTextBox.Text == ""))

                   {

                       _main.ehpSoprGruntTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле сопротивление грунта. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.ehpSoprGruntTextBox.Text) < 0)

                   {

                       _main.ehpSoprGruntTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле сопротивление грунта. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.timeExpluatationTextBox.Text.Contains('.')) || (_main.timeExpluatationTextBox.Text == ""))

                   {

                       _main.timeExpluatationTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле время эксплуатации. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.timeExpluatationTextBox.Text) < 0)

                   {

                       _main.timeExpluatationTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле время эксплуатации. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.vyazkostTextBox.Text.Contains('.')) || (_main.vyazkostTextBox.Text == ""))

                   {

                       _main.vyazkostTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле вязкость. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.vyazkostTextBox.Text) < 0)

                   {

                       _main.vyazkostTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле вязкость. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.predelTecuchTextBox.Text.Contains('.')) || (_main.predelTecuchTextBox.Text == ""))

                   {

                       _main.predelTecuchTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле предел текучести. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.predelTecuchTextBox.Text) < 0)

                   {

                       _main.predelTecuchTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле предел текучести. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.kolcNaprTextBox.Text.Contains('.')) || (_main.kolcNaprTextBox.Text == ""))

                   {

                       _main.kolcNaprTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле кольцевые напряжения. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.kolcNaprTextBox.Text) < 0)

                   {

                       _main.kolcNaprTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле кольцевые напряжения. Введено отрицательное значение!");

                       return false;

                   }

                   if ((_main.timeSoprotivlTextBox.Text.Contains('.')) || (_main.timeSoprotivlTextBox.Text == ""))

                   {

                       _main.timeSoprotivlTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(

                           @"Ошибка в поле временное сопротивление. Возможно поле пустое или в поле имеется точка!");

                       return false;

                   }

                   if (Convert.ToDouble(_main.timeSoprotivlTextBox.Text) < 0)

                   {

                       _main.timeSoprotivlTextBox.BackColor = Color.DimGray;

                       MessageBox.Show(@"Ошибка в поле временное сопротивление. Введено отрицательное значение!");

                       return false;

                   }

               }

           }

           catch (Exception)

           {

               MessageBox.Show(@"Ошибка ввода данных, возможно вы ввели буквы!");

               return false;}

           return true;

       }

   }

}

Модуль  «Diagnostics»

using System;

using System.Collections.Generic;

using System.Globalization;

using System.Linq;

using System.Text;

using System.Drawing;

using System.Windows.Forms;

namespace daig

{

   class Diagnostics

   {

       private string[] _kryteri, _splitRule, znak, _resRecEx, _splitAndRule, _splitOrRule, _resRecomOr, _resRecExOr,instat;

       List<Otchet> _otchet = new List<Otchet>();

       List<Statistica> _stat = new List<Statistica>();

       List<bool> _def = new List<bool>();

       WorkWithBZ workWithBZ = new WorkWithBZ();

       private bool TrueFalse, _securP, _defect;

       private Main main;

       private string resultOr, _otchetOr;

       private string _valueBZ = "";

       /// <summary>

       /// Главный решатель

       public List<Otchet> Reshatel(List<Tables> _rulesList, List<string> _factList)

       {

            foreach (Form f in Application.OpenForms)

           { if (f is Main) { main = (Main)f; } }

           

           foreach (var _fact in _factList)

           {

               _securP = true;

               _kryteri = _fact.Split('=');

               _defect = false;

               _valueBZ = "";

               foreach (var _rules in _rulesList)

               {

                    resultOr = _otchetOr = "";

                   if (_kryteri[0] == _rules.Kryteri)

                   {

                       _splitRule = _rules.Rules.Split('|');

                       ////если есть OR или это дефекты////////

                       if ((_kryteri[0] == "Дефекты металла") || (_kryteri[0] == "Дефекты сварных стыков") || (_splitRule[1].Contains("/")))

                       {

                           ReshatelWithOr(_splitRule, _kryteri);

                           if (TrueFalse) { Otchet(_kryteri[0], _resRecExOr); _defect = true; _valueBZ = znak[1]; }

                           if (_valueBZ == "") { _valueBZ = znak[1]; }

                       }

                       ////если есть AND////////

                       else  if (_splitRule[1].Contains("&"))

                       {

                           ReshatelWithAnd(_splitRule, _kryteri);

                           _resRecEx = _splitRule[2].Split(';');

                           if (TrueFalse) { Otchet(_kryteri[0], _resRecEx); _defect = true; _valueBZ = znak[1]; }

                          //  _valueBZ = znak[1];

                       }

                       else

                       {

                           znak = _splitRule[1].Split('_');

                           TrueFalse = OpredelitelZnaka(znak, _kryteri[1], 0);

                           _resRecEx = _splitRule[2].Split(';');

                           if (TrueFalse) { Otchet(_kryteri[0], _resRecEx); _defect = true; _valueBZ = znak[1]; }

                           if (_valueBZ == "") { _valueBZ = znak[1]; }

                       }

                   }

               }

               ////Истёк ли остаточный срок службы////////

               try

               {if ((_kryteri[0] =="Остаточный срок службы изоляции")  || (_kryteri[0] =="Остаточный срок службы газопровода (общ.Коррозия)")

                   || (_kryteri[0] == "Остаточный срок службы газопровода (язв.Коррозия)"))

               {if ((Convert.ToDouble(_kryteri[1]) > 0))  {_defect = false;}}}

               catch (Exception)

               {_defect = true;}

               if (_kryteri[0] =="Переходное сопротивление")

               { _valueBZ = _kryteri[3]; }

               if (_kryteri[0] == "Кольцевые напряжения")

               {_valueBZ = _kryteri[2]; }

               InStatistic();

           }

           return _otchet;

       }

       /// <summary>

       /// AND-Помошник главного решателя

       private void ReshatelWithAnd(string[] splitAnd, string [] kryteri)

       {

     

           _splitAndRule = splitAnd[1].Split('&');

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

           {

               znak = _splitAndRule[i].Split('_');

               if (znak[1].Contains("$"))

               { TrueFalse = OpredelitelZnaka(znak, kryteri[1],i);}

               else

               {TrueFalse = OpredelitelZnaka(znak, kryteri[i+1],i);}

               instat = _splitAndRule[1].Split('_');

               if ((TrueFalse) & (_defect==false))

               { _valueBZ = _valueBZ + instat[1]+ " "; }

               if (TrueFalse == false)

               {return;}

           }

       }

        /// <summary>

       /// OR-Помошник главного решателя

       private void ReshatelWithOr(string[] splitOr, string[] kryteri)

       {

         

           _splitOrRule = splitOr[1].Split('/');

            _resRecomOr = splitOr[2].Split(';');

           for (int j = 1; j < kryteri.Count(); j++)

           {

               for (int k = 0; k < _splitOrRule.Count(); k++)

               {

                   znak = _splitOrRule[k].Split('_');

                   TrueFalse = OpredelitelZnaka(znak, kryteri[j], k);

                   

                   if (TrueFalse)

                   {resultOr = resultOr + kryteri[j] + ". "; }

               }

           }

           if (resultOr != "")

           {

               if (_resRecomOr.Count() == 4)

               { _otchetOr = _otchetOr + resultOr + ";" + _resRecomOr[1] + ";" + _resRecomOr[2] + ";" + _resRecomOr[3] + ";"; }

               else {_otchetOr = _otchetOr + resultOr + ";" + _resRecomOr[1] + ";"  + _resRecomOr[2] + ";" ;}

               _resRecExOr = _otchetOr.Split(';');

               TrueFalse = true;

           }

       }

       /// <summary>

       /// Определитель знака

       private bool OpredelitelZnaka(string[] _znak, string znachenie1, int i)

       {

           int chislo;

           if (_znak[0] == "<")

               {

                   if (_znak[1].Contains("$"))

                   {

                       if (Convert.ToDouble(znachenie1) < Convert.ToDouble(_kryteri[i+2])){return true; }

                   }

                   else if (Convert.ToDouble(znachenie1) < Convert.ToDouble(_znak[1])) { return true; }

               }

               ////////////>///////////

           else if (_znak[0] == ">")

               {

                   if (_znak[1].Contains("$"))

                   {

                       if (Convert.ToDouble(znachenie1) > Convert.ToDouble(_kryteri[i + 2])) { return true; }

                   }

                   else if (Convert.ToDouble(znachenie1) > Convert.ToDouble(_znak[1])) { return true; }

               }

               ////////////=///////////

           else if (_znak[0] == "=")

               {

                   if (Int32.TryParse(znachenie1, out chislo))

                   {

                       if (_znak[1].Contains("$"))

                       {

                           if (Convert.ToString(znachenie1) == Convert.ToString(_kryteri[i + 2]))

                           {return true;}

                       }

                       else if (Convert.ToString(znachenie1) == Convert.ToString(_znak[1]))

                       {return true;}

                   }

                   else if (znachenie1 == _znak[1]) { return true; }

               }

               ////////////=>///////////

           else if (_znak[0] == ">=")

               {

                   if (_znak[1].Contains("$"))

                   {

                       if (Convert.ToDouble(znachenie1) >= Convert.ToDouble(_kryteri[i + 2])) { return true; }

                   }

                   else if (Convert.ToDouble(znachenie1) >= Convert.ToDouble(_znak[1])) { return true; }

               }

               ////////////<=///////////

           else if (_znak[0] == "<=")

               {

                   if (_znak[1].Contains("$"))

                   {

                       if (Convert.ToDouble(znachenie1) <= Convert.ToDouble(_kryteri[i + 2])) { return true; }

                   }

                   else if (Convert.ToDouble(znachenie1) <= Convert.ToDouble(_znak[1])) { return true; }

               }

           return false;

       }

       /// <summary>

       /// формирователь отчёта

       private void Otchet(string _kryt, string[] _resRecEx)

       {

          foreach (Form f in Application.OpenForms)

           { if (f is Main) { main = (Main)f; } }

               if (_kryt == "Каррозия трубы") { main.scvoznKorrosTubeTextBox.BackColor = Color.DarkOrange; }

               if (_kryt == "Ударная вязкость") { main.vyazkostTextBox.BackColor = Color.DarkOrange; }

               if (_kryt == "Пластичность") { main.predelTecuchTextBox.BackColor = Color.DarkOrange; main.timeSoprotivlTextBox.BackColor = Color.DarkOrange; }

               if (_kryt == "Кольцевые напряжения") { main.kolcNaprTextBox.BackColor = Color.DarkOrange; }

               if (_kryt == "Защитный потенциал") { main.securityPotentialTextBox.BackColor = Color.DarkOrange; }

               if (_kryt == "Адгезия") { main.AdgesionTextBox.BackColor = Color.DarkOrange; }

               if (_kryt == "Переходное сопротивление") { main.factSoprTextBox.BackColor = Color.DarkOrange; }

               if (_kryt == "Сквозные повреждения") { main.isoscvoznKarrosiaTextBox.BackColor = Color.DarkOrange; }

           if (_resRecEx[0] == "****")

               {

                   var par = new Otchet()

                   {

                       Result = _kryteri[1],

                       Recomendation = _resRecEx[1],

                       Razdel = _resRecEx[2],

                       Explanations = _resRecEx[3],

                       FIO = main.textBoxFIO.Text,

                       Date = main.dateTimePicker1.Text

                   };

                   _otchet.Add(par);

               }

               else

               {

                   var par = new Otchet()

                                 {

                                     Result = _resRecEx[0],

                                     Recomendation = _resRecEx[1],

                                     Razdel = _resRecEx[2],

                                     Explanations = _resRecEx[3],

                                     FIO = main.textBoxFIO.Text,

                                     Date = main.dateTimePicker1.Text

                                 };

                   _otchet.Add(par);

               }

           

       }

       /// <summary>

       /// Запись в статистику

       private void InStatistic()

       {

           if (((_kryteri[0] == "Защитный потенциал") || (_kryteri[0] == "Адгезия")) & (_securP))

           {

               string _commandText = "INSERT Statistica (Value, Data, Kryteri, Defective, Norm) VALUES (@KryteriValye,@Data,@Kryteri,@Defect, @valueBZ)";

               workWithBZ.AddStaticRecord(_kryteri[2], main.dateTimePicker1.Text, _commandText, _kryteri[0], _defect, _valueBZ);

               _securP = false;

           }

           else if ((_securP)& ((_kryteri[0] == "Дефекты изоляции") || (_kryteri[0] == "Дефекты металла") || (_kryteri[0] == "Дефекты сварных стыков") || (_kryteri[0] == "Сквозные повреждения"))) {}

               else

               {

                   string _commandText = "INSERT Statistica (Value, Data, Kryteri, Defective, Norm) VALUES (@KryteriValye,@Data,@Kryteri,@Defect, @valueBZ)";

                   workWithBZ.AddStaticRecord(_kryteri[1], main.dateTimePicker1.Text, _commandText, _kryteri[0], _defect, _valueBZ);

                   _securP = false;

               }    

       }

   }

}

Форма «NewRecordBZ»

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Data.SqlClient;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace daig

{

   public partial class NewRecordBZ : Form

   {

       public NewRecordBZ()

       {

           InitializeComponent();

       }

   

       WorkWithBZ workWithBZ = new WorkWithBZ();

       private string[] _splitKryt;

       private string _pravilo;

       private void AddRecord(object sender, EventArgs e)

       {

           _pravilo = "";

           if (comboBoxKryteri.Text == "")

           {MessageBox.Show("Выберите критерий");return; }

           if (textBoxUslovie.Text == "")

           { MessageBox.Show("Введите условие"); return; }

           if (textBoxUslovie.Text.Contains("_")==false)

           {MessageBox.Show("Ошибка в условии, возможно отсутствуют пробелы!"); return;}

           _splitKryt = comboBoxKryteri.Text.Split(':');

           _pravilo = _pravilo + "IF |" + textBoxUslovie.Text.Trim() + "|" + textBoxResult.Text + ";" + textBoxRecomend.Text + ";" +

                     _splitKryt[0] + ";" + textBoxExpl.Text;

           string _commandText = "INSERT Rules (Kryteri, Rules) VALUES (@Kryteri,@Pravilo)";

           workWithBZ.AddRecord(_splitKryt[1].Trim(), _pravilo, _commandText);

           workWithBZ.DataToDataGrid();

       }}}}

Модуль «CreateFactList»

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace daig

{

   class CreateFactList

   {

       List<string> _factList = new List<string>();

       private double _ostTolchina, _criticalResistance, _ostIspWork, _ostGazoprovodWorkYazv, _ostGazoprovodWorkGen;

       private int _timeZachihennost;

       Calculation calc = new Calculation();

       private Main main;

       private string _metallDeffect, _stikiDeffect, _isoDeffect;

       public List<string> FactList(double karrosiaTube, double tolchStenki, double vyaskost,double tekuchest,

                                    double timeSoprot, double kolcNapr,double securitPotential, double timeExpluat,

                                    double soprGrunt, double scvoznIsoKarrosia, string material,

                                    double adgesion, double diametr, double tolshina, double glubina, double factSopr,

                                    List<string> checkedMetall, List<string> checkedStiki, List<string> checkedIso,

                                    double Pressure, double VMol, double Temp, double glubinaYazvKor, double razmerYazvKor)

       {

             foreach (Form f in Application.OpenForms)

           { if (f is Main) { main = (Main)f; } }

    

             if (main.comboBoxRegimOfDiag.Text == "Полная диагностика")

             {

                 MetallFact(tolchStenki, karrosiaTube, checkedMetall, checkedStiki);

                 IsolationFact( material, adgesion, soprGrunt, factSopr, tolshina, diametr,

                               glubina, scvoznIsoKarrosia, checkedIso);

                 PMPFact(vyaskost, tekuchest, timeSoprot, kolcNapr);

                 EHPFact(karrosiaTube, timeExpluat, soprGrunt, securitPotential);

                 _ostIspWork = calc.CalcOstIsoWork(timeExpluat, factSopr);

                 _ostGazoprovodWorkGen = calc.CalcOstGazprovodWorkYazv(timeExpluat, Pressure, diametr, kolcNapr, tolchStenki,

                                                                karrosiaTube, tekuchest, VMol, Temp, soprGrunt, glubina);

                 _ostGazoprovodWorkYazv = calc.CalcOstGazprovodWorkGen(razmerYazvKor, tekuchest, karrosiaTube, tolchStenki,

                                                                       glubinaYazvKor, Pressure, timeExpluat);

                 _factList.Add("Остаточный срок службы изоляции=" + _ostIspWork);

                 _factList.Add("Остаточный срок службы газопровода (общ.Коррозия)=" + _ostGazoprovodWorkGen);

                 _factList.Add("Остаточный срок службы газопровода (язв.Коррозия)=" + _ostGazoprovodWorkYazv);

             }

             else if (main.comboBoxRegimOfDiag.Text == "Диагностика изоляции")

             {

                 IsolationFact(material, adgesion, soprGrunt, factSopr, tolshina, diametr,

                               glubina, scvoznIsoKarrosia, checkedIso);

                 _ostIspWork = calc.CalcOstIsoWork(timeExpluat, factSopr);

                 _factList.Add("Остаточный срок службы изоляции=" + _ostIspWork);

             }

             else if (main.comboBoxRegimOfDiag.Text == "Диагностика металла и сварных стыков")

             {

                 MetallFact(tolchStenki, karrosiaTube, checkedMetall, checkedStiki);

                 _ostGazoprovodWorkGen = calc.CalcOstGazprovodWorkYazv(timeExpluat, Pressure, diametr, kolcNapr, tolchStenki,

                                                                karrosiaTube, tekuchest, VMol, Temp, soprGrunt, glubina);

                 _ostGazoprovodWorkYazv = calc.CalcOstGazprovodWorkGen(razmerYazvKor, tekuchest, karrosiaTube, tolchStenki,

                                                                       glubinaYazvKor, Pressure, timeExpluat);

                 _factList.Add("Остаточный срок службы газопровода (общ.Коррозия)=" + _ostGazoprovodWorkGen);

                 _factList.Add("Остаточный срок службы газопровода (язв.Коррозия)=" + _ostGazoprovodWorkYazv);

             }

             else if (main.comboBoxRegimOfDiag.Text == "Диагностика ЭХЗ")

             {EHPFact(karrosiaTube, timeExpluat, soprGrunt, securitPotential);}

             else if (main.comboBoxRegimOfDiag.Text == "Диагностика Ф-М свойств трубы")

             { PMPFact(vyaskost, tekuchest, timeSoprot, kolcNapr); }

                        

           return _factList;

       }

       private void MetallFact(double _tolchStenki, double _karrosiaTube, List<string> checkedMetall, List<string> checkedStiki)

       {

           _metallDeffect = _stikiDeffect = "";

           _ostTolchina = ((_tolchStenki - _karrosiaTube) / _tolchStenki) * 100;

           _factList.Add("Каррозия трубы=" + _ostTolchina);

           if (checkedMetall.Count != 0)

           {

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

               {_metallDeffect = _metallDeffect +"="+checkedMetall[i];}

               _factList.Add("Дефекты металла" + _metallDeffect);

           }

           if (checkedStiki.Count != 0)

           {

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

               { _stikiDeffect = _stikiDeffect + "=" + checkedStiki[i]; }

               _factList.Add("Дефекты сварных стыков" + _stikiDeffect);

           }

       }

       private void IsolationFact( string _material, double _adgesion, double _soprGrunt,double _factSopr, double _tolshina,

                                   double _diametr, double _glubina, double _scvoznIsoKarrosia, List<string> checkedIso)

       {

           if (checkedIso.Count != 0)

           {

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

               { _isoDeffect = _isoDeffect + "=" + checkedIso[i]; }

               _factList.Add("Дефекты изоляции" + _isoDeffect);

           }

           if (_scvoznIsoKarrosia > 0) { _factList.Add("Сквозные повреждения=" + 1); }

           else { _factList.Add("Сквозные повреждения=" + 0); }

           _factList.Add("Адгезия=" + _material + "=" + _adgesion);

           _criticalResistance = calc.CalcResistence(_soprGrunt, _tolshina, _diametr, _glubina);

           _factList.Add("Переходное сопротивление=" + _factSopr + "=" + _criticalResistance + "=" + 2 * _criticalResistance);

       }

       private void PMPFact(double _vyaskost, double _tekuchest, double _timeSoprot, double _kolcNapr)

       {

           _factList.Add("Ударная вязкость=" + _vyaskost);

           _factList.Add("Пластичность=" + _tekuchest / _timeSoprot);

           _factList.Add("Кольцевые напряжения=" + _kolcNapr + "=" + 0.75 * _tekuchest);

       }

       private void EHPFact(double _karrosiaTube, double _timeExpluat, double _soprGrunt, double _securitPotential)

       {

           _timeZachihennost = calc.CalcTimeProtect(_karrosiaTube, _timeExpluat);

           _factList.Add("Защищённость по времени=" + _timeZachihennost);

           _factList.Add("Защитный потенциал=" + _soprGrunt + "=" + _securitPotential);

       }}}

Модуль «Calculation»

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows.Forms;

namespace daig

{

   class Calculation

   {

       private double _kF, _kD, _oK, _zK, _tay, Rk, Rk1, _mnogOne, _mnogTwo, _chast, _h1, _D1, _R0, _alpha, _TostIso, _Vd,

                      _Tmax, _nachKolcNapr, _Vob, _Kn, _R=8.31, _dopuskKolcNapr, _TostGen, _TostYazv, _cryticalYazvCor, _Vk1;

       private int _Zt;

       private Main main;

       ///Защищённость по времени///

       public int CalcTimeProtect(double _karrosia, double _timeExpluatation)

       {

           try

           {

               if (_karrosia == 0) {_karrosia = 0.01; }

               _kF = _karrosia/_timeExpluatation;

               _oK = _karrosia * 0.3;

               _kD = _oK/40;

               _zK = ((_kF - _kD)/_kF) * 100;

               _tay = (96 - _zK)/0.74;

               _Zt = Convert.ToInt32(((365 - _tay)/365)*100);

           }

           catch (Exception)

           { MessageBox.Show("Ошибка в вычислениях"); return -1; }

           return _Zt;

       }

       ///Критическое сопротивление///

       public double CalcResistence(double _udResistGrunt, double _h, double _D, double _H)

       {

           try

           {

               Rk1 = 1;

               _h1 = _h / 1000;

               _D1 = _D;

               _mnogOne = (_udResistGrunt * _D1) / 2;

               _mnogTwo = Math.Log((3.14 * _h1 * (_D1 - _h1)) / (_D1 * _D1 * _H * 0.0000004));

               _chast = _mnogOne * _mnogTwo;

               Rk = _chast + _mnogOne * Math.Log(Rk1);

               while ((Rk - Rk1) > 0.5)

               {

                   Rk1 = Rk1 + 0.1;

                   Rk = _chast + _mnogOne * Math.Log(Rk1);

               }

               

           }

           catch (Exception)

           { MessageBox.Show("Ошибка в вычислениях"); return 0; }

           return Rk1;

       }

       ///Время изоляции///

       public double CalcOstIsoWork(double _timeExpluatation, double factSopr)

       {

            try

           {

           foreach (Form f in Application.OpenForms)

           { if (f is Main) { main = (Main)f; } }

           if (main.isoMaterialComboBox.Text == "Полиэтилен")

               {_R0 = 300000;}

           else

               if (main.isoMaterialComboBox.Text == "Мастика")

               { _R0 = 50000; }     

           else

               {_R0 = 100000;}

           _alpha = (1 /_timeExpluatation)*Math.Log((_R0 - Rk1)/(factSopr - Rk1));

           _TostIso = (1 / _alpha) * Math.Log((factSopr - Rk1) / Rk1);

           _TostIso = Math.Round(_TostIso, 1);

           }

            catch (Exception)

            { MessageBox.Show("Ошибка в вычислениях"); return 0; }

           return _TostIso;

       }

       ///Время газопровода по общей коррозии///

       public double CalcOstGazprovodWorkYazv(double _timeExpluatation, double _pressure, double _D, double _kolcNapr, double _tolchStenki,

                                          double _karrosiaTube, double _tekuchest, double _V, double _T, double _sopr, double _glubina)

       {

           try

           {

               _h1 = CalcResistence(_sopr, _tolchStenki, _D, _glubina);

               _nachKolcNapr = (_pressure*(_D - 2*_h1))/(2*_h1);

               _Vob = _karrosiaTube/_timeExpluatation;

               _Kn = _V/(_R*_T);

               _dopuskKolcNapr = 0.75*_tekuchest;

               _Tmax = (_tolchStenki/_Vob)*(1 - (_nachKolcNapr/_dopuskKolcNapr));

               _TostGen = _Tmax*Math.Exp(-_Kn*0.5*(_kolcNapr/_dopuskKolcNapr)*_dopuskKolcNapr) - _timeExpluatation;

               _TostGen = Math.Round(_TostGen, 1);

           }

           catch (Exception)

           { MessageBox.Show("Ошибка в вычислениях"); return 0; }

           return _TostGen;

       }

       ///Время газопровода по язвенной коррозии///

       public double CalcOstGazprovodWorkGen(double _razmerYazvKor, double _tekuchest, double _karrosiaTube,

                                             double _tolchStenki, double _glubinaYazvKor, double _pressure, double _timeExpluatation)

        {

            try

            {

                _Vob = _karrosiaTube/_timeExpluatation;

                _Vd = _razmerYazvKor/_timeExpluatation;

                _Vk1 = (_Vob + _Vd)/2;

                _dopuskKolcNapr = 0.75*_tekuchest;

                _cryticalYazvCor = _tolchStenki - _razmerYazvKor*Math.Pow(((0.19*_pressure)/_dopuskKolcNapr), 0.5);

                _TostYazv = (_cryticalYazvCor - _glubinaYazvKor)/_Vk1;

                _TostYazv = Math.Round(_TostYazv, 1);

            }

            catch (Exception)

            { MessageBox.Show("Ошибка в вычислениях"); return 0; }

           return _TostYazv;

        }

   }

}

Модуль «Statistics»

using System;

using System.Collections.Generic;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;

using ZedGraph;

namespace daig

{

   class Statistics

   {

       private Main _main;

       private DateTime _beginData, _endData, _diagData;

       double _mesto = 0, _count = -1, _vneNormi, s1,s2, summ, itogValue;

       private List<Statistica> filterstat;

       private string[] normSplit, data;

       int tru, fals, _yearCol, _year, _monthE, _monthB, _monthBegFil, _yearBegFil, _monthEndFil, _yearEndFil;

       bool def = false;

       public void ZedGraphStat(List<Statistica> stat, GraphPane pane, string _kryteri)

       {

           foreach (Form f in Application.OpenForms)

           {if (f is Main){ _main = (Main) f;}}

            filterstat = new List<Statistica>();

          bool fil = Filtr(stat);

           if (fil == false){return;}

           data = new string[Convert.ToInt32(_count) - Convert.ToInt32(_mesto)];

           List<double> defective = new List<double>();

           List<double> notDefective = new List<double>();

           int chetchik = 0;

           _vneNormi = 0;

           if (_main.checkBoxFiltr.Checked)

           {

                _count = filterstat.Count;

               data = new string[Convert.ToInt32(_count) - Convert.ToInt32(_mesto)];

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

               {

                   data[chetchik] = filterstat[i].Data;

                   if (filterstat[i].Defect)

                   {

                       defective.Add(Convert.ToDouble(filterstat[i].Value));

                       notDefective.Add(0);

                       _vneNormi++;

                   }

                   else

                   {

                       notDefective.Add(Convert.ToDouble(filterstat[i].Value));

                       defective.Add(0);

                   }

                   chetchik++;

               }

           }

           else

           {

               _count = stat.Count;

               data = new string[Convert.ToInt32(_count) - Convert.ToInt32(_mesto)];

               for (int i = Convert.ToInt32(_mesto); i < _count; i++)

               {

                   data[chetchik] = stat[i].Data;

                   if (stat[i].Defect)

                   {

                       defective.Add(Convert.ToDouble(stat[i].Value));

                       notDefective.Add(0);

                       _vneNormi++;

                   }

                   else

                   {

                       notDefective.Add(Convert.ToDouble(stat[i].Value));

                       defective.Add(0);

                   }

                   chetchik++;

               }

           }

           BarItem curveDef = pane.AddBar("Параметр в норме", null, notDefective.ToArray(), Color.ForestGreen);

           curveDef.Bar.Fill = new Fill(Color.DodgerBlue, Color.White, Color.ForestGreen, 90F);

           BarItem curveNotDef = pane.AddBar("Параметр не в норме", null, defective.ToArray(), Color.Red);

           curveNotDef.Bar.Fill = new Fill(Color.DarkOrange, Color.White, Color.Firebrick, 90F);

          

           ZedGInvalidate(pane, data);

           _main.textBoxVneNormi.Text = Convert.ToString(_vneNormi);

       }

       private bool Filtr(List<Statistica> Stat)

       {

           List<double> filteredValue = new List<double>();

           List<bool> filteredDefect = new List<bool>();

           string norm = "", data = "", kryteri = "";

          

           _beginData = Convert.ToDateTime(_main.dateTimePickerBeginD.Text);

           _endData = Convert.ToDateTime(_main.dateTimePickerEndD.Text);

            _monthBegFil = _beginData.Month;_yearBegFil = _beginData.Year;

            _monthEndFil = _endData.Month; _yearEndFil = _endData.Year;

           if (((_yearBegFil == _yearEndFil) & (_monthBegFil > _monthEndFil)) || (_yearBegFil > _yearEndFil))

           { MessageBox.Show("Ошибка дат"); return false; }

           if (_yearEndFil > _yearBegFil)

           {

               _yearCol = _yearEndFil - _yearBegFil;

               _year = _yearBegFil;

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

               {

                   if (i == _yearCol){_monthB = 1; _monthE = _monthEndFil;}

                   else if ((i < _yearCol)&(i > 0)) { _monthB = 1; _monthE = 12; }

                   else { _monthB = _monthBegFil; _monthE = 12; }

                   GeneralOfFiltr(filteredDefect, Stat, filteredValue, kryteri, data, norm);

                   _year++;

               }

           }

           else

           {

               _monthB = _monthBegFil;

               _monthE = _monthEndFil;

               _year = _yearBegFil;

               GeneralOfFiltr(filteredDefect, Stat, filteredValue, kryteri, data, norm);        

           }

               _count = filterstat.Count;

           return true;

       }

       private void GeneralOfFiltr(List<bool> filteredDefect, List<Statistica> Stat, List<double> filteredValue, string kryteri, string data, string norm)

       {

           for (int l = _monthB; l <= _monthE; l++)

           {

               filteredDefect.Clear();

               filteredValue.Clear();

               foreach (var _stat in Stat)

               {

                   _diagData = Convert.ToDateTime(_stat.Data);

                   int monthDiag = _diagData.Month;

                   int yearDiag = _diagData.Year;

                   if ((monthDiag > l) & (yearDiag == _year)) { break; }

                   if ((monthDiag == l) & (yearDiag == _year))

                   {

                       if (_main.checkBoxMonth.Checked == false) {filterstat.Add(_stat);}

                       else

                       {

                           filteredValue.Add(_stat.Value);

                           filteredDefect.Add(_stat.Defect);

                           data = _diagData.ToString("Y");

                           kryteri = _stat.Kryteri;

                           if (kryteri == "Защитный потенциал")

                           { if (_stat.Norm.Contains(" ")) { norm = _stat.Norm; } }

                           else { norm = _stat.Norm; }

                       }

                   }

               }

               if (_main.checkBoxMonth.Checked)

               { MonthYear(filteredValue, filteredDefect, data, kryteri, norm); }      

           }

       }

       private void MonthYear(List<double> _filteredValue, List<bool> _filteredDefect, string data, string kryteri, string norm)

       {

               tru = 0; fals = 0; summ = 0; itogValue = 0;

               def = false;

               foreach (var _fildef in _filteredDefect)

               { if (_fildef) { tru++; } else { fals++; } }

               for (int d = 0; d < _filteredValue.Count; d++) { summ = summ + _filteredValue[d]; }

               itogValue = Math.Round(summ / _filteredValue.Count, 2);

               if (fals == 0) { def = true; }

               else if (tru == 0) { def = false; }

               else

               {

                   if (kryteri == "Защитный потенциал")

                   {

                       normSplit = norm.Split(' ');

                       if (Convert.ToDouble(normSplit[0]) > Convert.ToDouble(normSplit[1]))

                       { s1 = Convert.ToDouble(normSplit[1]); s2 = Convert.ToDouble(normSplit[0]); }

                       else

                       { s1 = Convert.ToDouble(normSplit[0]); s2 = Convert.ToDouble(normSplit[1]); }

                       if ((itogValue < s1) || (itogValue > s2)) { def = true; }

                   }

                   else

                       if ((kryteri == "Остаточный срок службы изоляции") || (kryteri == "Остаточный срок службы газопровода (язв.Коррозия)")

                       || (kryteri == "Остаточный срок службы газопровода (общ.Коррозия)"))

                       { if (itogValue <= 0) { def = true; } }