Железная дорога в России занимает, наверно, первое место по количеству перевозок, по протяженности электрифицированных путей, а также по наличию путей там, где обычную дорогу проложить либо нереально, либо очень сложно. Тем самым она обеспечивает доступ к труднодоступным местам нашей страны даже там, где другому транспорту не пробраться. Огромное количество грузов ежедневно перемещается по железной дороге из одной части России в другую, нередко через несколько часовых поясов. Компания ОАО «РЖД» должна всегда обеспечивать бесперебойную работу всей инфраструктуры. Для этого существует большое количество обслуживающих цехов. Работники пути обслуживают, как понятно из названия, сами пути, по которым движутся поезда. Вагонное хозяйство занимается тем, что поддерживает в исправном состоянии вагоны, пассажирские и грузовые. Локомотивное хозяйство работает над тем, чтобы подвижной состав двигался, когда необходимо, приводимый в движение локомотивом [1].
При этом нужно учитывать, что большинство главных магистралей электрифицированы, то есть состав двигается благодаря сложной контактной сети, по которой к локомотиву подводится электропитание. Для обслуживания контактной сети работает хозяйство электроснабжения. Правда, электроснабженцы занимаются не только контактной сетью. Само хозяйство делится еще на несколько цехов. Один из них — релейной защиты и автоматики (далее РЗА).
Работники РЗА занимаются тем, что поддерживают в исправном состоянии релейные защиты разных типов, а также автоматическое управление некоторыми устройствами, автоматическое включение резервов большого количества оборудования (так как на железной дороге почти все и всегда имеет вторую линию — резерв) и так далее. Научиться работать с релейными схемами не так-то просто и на обучение уходит длительное время, при этом даже самый опытный релейщик всегда может ошибиться, не говоря уже о новичках.
Релейная защита создана для того, чтобы обеспечить исправную работу контактной сети. Она должна отключить место повреждения от питания, иначе урон может быть большим — если сгорит контактный провод (напряжение на Северной железной дороге 27.5 киловольт), то поезда не будут ходить на поврежденном участке до тех пор, пока не будет восстановлена контактная сеть, а на это может уйти очень долгое время. Перебои же в работе железной дороги недопустимы. Поэтому очень важно, чтобы устройства РЗА всегда работали исправно и надежно. Для этого же нужно хорошо знать схемы релейных защит, как в Приложении. Даже в наш век высоких технологий используются обычные электромеханические реле, так как они надежны в работе, пусть даже и есть для некоторых устройств (например, фидеров контактной сети) цифровые защиты, но даже они интегрируются в релейные схемы для надежности, поэтому и здесь от реле полностью не уйти.
Способы прокладки тепловых сетей
... пересекаемых сооружений. При прокладке тепловых сетей в футлярах должна предусматриваться антикоррозионная защита труб тепловых сетей и футляров. В местах пересечения электрифицированных железных дорог и трамвайных путей ... совместно с другими инженерными сетями не допускается. Уклон тепловых сетей независимо от направления движения теплоносителя и способа прокладки должен быть не менее 0,002. ...
Целью ВКР является разработка программного комплекса, который был бы полезен и удобен для работы со схемами устройств релейной защиты и автоматики железнодорожного транспорта. Работа состоит из восьми разделов. В разделе «Анализ существующих разработок», как понятно из названия, говорится о том, какие на данный момент существуют разработки в сфере схемотехники. Во втором разделе «Разработка технических требований и постановка задач дипломной работы» устанавливаются требования к программе, а также ставятся цели разработки. В разделе «Архитектура программы» показано, что может программа и как взаимодействует с пользователем. В четвертом разделе, который называется «Структура данных программного комплекса», объясняется то, как обрабатываются данные в разработке. В разделе «Разработка алгоритмов и программного комплекса» представлен код программ и то, как он работает. В шестом разделе «Реализация программных модулей» описано общая работа каждого модуля.
В разделе «Отладка и экспериментальное тестирование» описаны существующие методы отладки и тестирования. В восьмом разделе «Разработка технической документации» описано то, как нужно работать в программном комплексе
1. АНАЛИЗ СУЩЕСТВУЮЩИХ РАЗРАБОТОК
алгоритм редактор релейный модульный
Сейчас создано не так много программного обеспечения для разработки и имитации работы электрических схем. Самые известные из них: Electronics Workbench и среда Multisim.
1.1 Electronics Workbench
Первая программа разработана компанией National Instruments Electronics Workbench Group в 1998 году. Хоть и кажется, что она устарела, но основные функции работают нормально и ей можно пользоваться.
Система схемотехнического моделирования Electronics Workbench предназначена для моделирования и анализа аналоговых, цифровых и цифро-аналоговых схем большой степени сложности. Имеющиеся в программе библиотеки включают в себя большой набор широко распространенных электронных компонентов. Есть возможность подключения и создания новых библиотек компонентов. Параметры компонентов можно изменять в широком диапазоне значений. Простые компоненты описываются набором параметров, значения которых можно изменять непосредственно с клавиатуры, активные элементы — моделью, представляющей собой совокупность параметров и описывающей конкретный элемент или его идеальное представление. Модель выбирается из списка библиотек компонентов, параметры модели также могут быть изменены пользователем. Широкий набор приборов позволяет производить измерения различных электрических величин, задавать входные воздействия, строить графики. Все приборы изображаются в виде, максимально приближенном к реальному, поэтому работать с ними просто и удобно. Electronics Workbench может проводить анализ схем на постоянном и переменном токах. При анализе на постоянном токе определяется рабочая точка схемы в установившемся режиме работы. Результаты этого анализа не отражаются на приборах, они используются для дальнейшего анализа схемы. Анализ на переменном токе использует результаты анализа на постоянном токе для получения линеаризованных моделей нелинейных компонентов. Анализ схем может проводиться как во временной, так и в частотной областях. Программа также позволяет производить анализ цифроаналоговых и цифровых схем. Результаты моделирования можно вывести на принтер или импортировать в текстовый или графический редактор для их дальнейшей обработки [2].
Электронная лаборатория electronics workbench
... Electronics Workbench содержит строку меню, линейку инструментов, линейку библиотеки компонентов. Все кнопки имеют подсвечиваемые подсказки. Рассмотрим команды меню программы Electronics Workbench ... 9. Fourier… - проведение Фурье-анализа (спектрального анализа): Output node – номер контрольной точки ... схемы; Model list - списка имеющихся в схеме компонентов; Subcircuits - подсхем (частей схемы, ...
Electronics Workbench является программой для разработки электронных схем, в ней есть база данных с большим количеством существующих элементов и их условными обозначениями. Содержатся, также, источники питания, формирователи импульсов и измерительные приборы. В ней можно быстро и просто создать необходимую схему, протестировать ее и распечатать. Со всеми размещенными на рабочей области элементами можно взаимодействовать и манипулировать ими — устанавливать положение, название, а также задавать характеристики (сопротивление, индуктивность, емкость и так далее).
При подключении амперметра будет возможно измерить ток на данном участке цепи, при подключения вольтметра — напряжение. Осциллограф выдаст информацию о переходных процессах. Остальные приборы предоставят ту информацию по электрическим параметрам, которую должны.
Все работает хорошо и стабильно, только в этой программе либо невозможно, либо очень сложно создать схемы релейных защит — нужно очень углубляться в особенности программы. Также будет невозможно выводить информацию о сработавших защитах и нереально смоделировать действие какой-либо защиты. Учитывая все эти особенности можно с уверенностью сказать, что Electronics Workbench не подходит для использования в нашей работе.
1.2 Micro-Cap
Профессиональная программа аналогового, цифрового и смешанного моделирования и анализа цепей электронных устройств средней степени сложности. Интуитивно понятный интерфейс, нетребовательность к вычислительным ресурсам персонального компьютера и большой спектр возможностей послужили основой популярности Micro-Cap среди радиолюбителей, студентов и преподавателей микроэлектроники. Алгоритм работы включает в себя создание электрической цепи в графическом редакторе, задание параметров анализа и изучение полученных данных. Программа самостоятельно составляет уравнения цепи и проводит моментальный расчёт. Любое изменение схемы или параметров элементов приводит к автоматическому обновлению результатов. Графический редактор опирается на библиотеки электронных компонентов, которые можно пополнять на основе экспериментальных или справочных данных с помощью встроенного модуля Shape Editor. Все номиналы и параметры элементов могут быть как неизменными, так и зависящими от температуры, времени, частоты, состояния схемы, параметров других компонентов. Анимированные детали (светодиоды, реле, семисегментные индикаторы и некоторые другие элементы) изменяют состояние в соответствии с поступающими на них сигналами. Моделирование включает в себя целый набор различных анализов: переходных процессов, передаточных характеристик по постоянному току, малосигнальных частотных характеристик, чувствительностей по постоянному току, нелинейных искажений, метода Монте-Карло и многих других. Опытные пользователи могут создавать свои макромодели, которые облегчают имитационное моделирование без потерь информации. Допускается одновременно использовать различные стандарты элементов схемы. Полная поддержка SPICE-моделей позволяет применять проекты из других программ (DesignLab, OrCAD, P-CAD).
Математическое моделирование: движения ракеты-носителя, движения ...
... 1 - Схема программы моделирования движения РН в плотных слоях атмосфере (mdl- file) Математическое моделирование движения ЛА ... элементов орбиты с начальными условиями - терминальными (конечными) параметрами выведения ракеты-носителя). В среде MatLab + Simulink разработана блок программы, ... модель атмосферы: = 0е-h, где - градиент изменения плотности по высоте полёта ЛА- h. Для заданной программы ...
Из недостатков можно отметить лишь необходимость установки дополнительных элементов, так как объем библиотек Micro-Cap (даже в полной версии) явно недостаточен [3].
Cap — англоязычный пакет, но желающие могут легко отыскать в сети русификатор программы от известных специалистов по работе с ним — Сергея и Марины Амелиных.
Программа была написана в 1982 году фирмой Spectrum Software, с тех пор она постоянно расширяется и совершенствуется. Фирма, в свою очередь, была основана Энди Томпсоном в феврале 1980 года, изначально позиционируясь на написании программ для Apple. Она расположена в одном из основных городов Силиконовой долины — Саннивейле (штат Калифорния, США).
Стоимость Micro-Cap составляет несколько тысяч долларов, однако на сайте разработчика можно скачать свободно распространяемую Evaluation Version, которая обладает многими возможностями полнофункциональной. Основные отличия — это не более 50 элементов в схеме, урезанная библиотека компонентов, ограничения на построение ряда графиков и медленная скорость работы.Cap работоспособен во всех операционных системах семейства Windows. Проблем при работе в Vista и 7 выявлено не было.
Данная программа не подходит для нашей работы, так как в ней, как и в предыдущей нереально создавать полноценные схемы релейной защиты и автоматики. Проблемы с руссификацией — малый недостаток, но для работника, плохо знающего английский, он будет значимым. И также то, что в бесплатной версии программы можно размещать на схеме всего 50 элементов играет большое значение, ведь в релейных схемах почти всегда элементов больше, чем такое количество.
1.3 LTspice/SwitcherCAD
симулятор для проведения компьютерного моделирования работы аналоговых и цифровых электрических цепей.(он же SwitcherCAD) представляет собой универсальную среду для проектирования и создания электрических схем с интегрированным симулятором смешанного моделирования. Программа позволяет быстро менять компоненты и параметры электронных схем, испытывать работоспособность новых вариантов, находить оптимальные решения. Возможна загрузка списка соединений, сгенерированного другими инструментами для рисования схем или созданного вручную (расширения *.sp, *.cir, *.net или *.but).
От аналогичных программ (Microcap, OrCAD) рассматриваемое ПО отличается малым объемом необходимого дискового пространства и более высокой скоростью моделирования процессов.содержит полную библиотеку компонентов компании Linear Technology Corporation (пассивные элементы и интегральные схемы, включая редкие модели импульсных контроллеров и регуляторов).
Поскольку программа использует стандартные SPICE-модели электронных деталей, к имеющейся базе можно добавлять библиотеки сторонних производителей, а также создавать свои собственные модели. Редактор имеет иерархическую структуру, рисование электронных цепей средней и большой сложности выполняется с помощью создания подсхем. Глубина иерархии и размер схемы ограничиваются только ресурсами компьютера.
Анализ и исследование схем преобразователей напряжение-частота
... цепи и микро-схемотехника. Рассмотрены основные схемы включения и приведены формулы для расчета элементов входящих в схему. 2. СРАВНИТЕЛЬНЫЙ АНАЛИЗ СХЕМ ПРЕОБРАЗОВАТЕЛЕЙ 1 Основные методы преобразования Простейшая схема преобразователя напряжения ... - 304 с. Представлены схемы преобразования и приведено их описание, помогающие представить работу преобразователей напряжение-частота 1. Интегратор 2. ...
Кроме этого в LTspice можно построить семейство амплитудно-частотных характеристик при пошаговом изменении номинала выбранного элемента. Результаты всех моделирований отображаются в графическом окне, при этом существует возможность их дальнейшего анализа [4].
В отличие от других программ LTspice способен записывать в wav-файл сигнал из любой точки цепи. Частота дискретизации и количество разрядов устанавливаются пользователем, а полученный файл может редактироваться в специализированной программе. Данные из файлов с расширением *.wav, помимо внутренних источников, генерируемых программой, могут являться входными сигналами рабочих схем.
Для проектирования печатных плат предусмотрено построение списка соединений с функцией упорядочивания следования имен выводов. Из недостатков LTspice необходимо отметить довольно неудобный интерфейс и ограниченное количество библиотек элементов.
Программный комплекс LTspice разработан в компании Linear Technology. Организация была основана в 1981 году и базируется в городе Милпитас (Калифорния, США).
Компания проектирует, производит и продает линейные интегральные микросхемы — источники и регуляторы напряжения, компараторы, усилители, линейные регуляторы, зарядные устройства батарей, монолитные фильтры, Ethernet-контроллеры, конвертеры DC-DC и данных. Ее продукция используются в мобильных телефонах, сетевых решениях, ноутбуках и настольных компьютерах, устройствах контроля безопасности, медицинских устройствах, автомобильной электронике, системах спутниковой навигации и управления производственными процессами.
Язык интерфейса LTspice — английский, однако в интернете можно найти самодельный русификатор. Рассматриваемое ПО регулярно обновляется и поддерживает все операционные системы семейства Microsoft Windows.
Данная программа является бесплатной — это большой плюс, но остаются те же проблемы, что и у двух предыдущих программ: английский интерфейс и, самое главное, невозможность моделирования поведения схем релейной защиты и автоматики не только в реальном времени, но и вообще моделировать поведение таких схем. Поэтому эта программа также не подходит для нашей работы.
1.4 Среда Multisim
— это единственный в мире эмулятор схем, который позволяет создавать лучшие продукты за минимальное время. Он включает в себя версию Multicap, что делает его универсальным средством для программного описания и немедленного последующего тестирования схем.Multisim 10.0 позволяет объединить процессы разработки электронных устройств и тестирования на основе технологии виртуальных приборов для учебных и производственных целей Подразделение Electronics Workbench Group компании National Instruments анонсировало выпуск Multisim 10.0 и Ultiboard 10.0, самых последних версий программного обеспечения для интерактивного SPICE-моделирования и анализа электрических цепей, используемых в схемотехнике, проектировании печатных плат и комплексном тестировании. Эта платформа связывает процессы тестирования и проектирования, предоставляя разработчику электронного оборудования гибкие возможности технологии виртуальных приборов. Совместное использование программного обеспечения для моделирования электрических цепей Multisim 10.0 компании National Instruments со средой разработки измерительных систем LabVIEW, позволяет сравнивать теоретические данные с реальными непосредственно в процессе создания схем обычных печатных плат, что снижает количество проектных итераций, число ошибок в прототипах и ускоряет выход продукции на рынок.
Проектирование и реализация хранилища данных для анализа бизнес ...
... решений, поэтому компаниям требуется организовать работу с информацией наилучшим образом. Поэтому возникла необходимость в создании специализированных систем хранения данных и дополнительных средств анализа поступающей информации. Система хранения данных состоит из набора программного ...
Можно использовать Multisim 10.0 для интерактивного создания принципиальных электрических схем и моделирования их режимов работы. «Multisim 10.0 составляет основу платформы для обучения электротехнике компании National Instruments, включающей в себя прототип рабочей станции NI ELVIS и NI LabVIEW. Он дает возможность студентам получить всесторонний практический опыт на всем протяжении полного цикла проектирования электронного оборудования», — заявил Рей Алмгрен, вице-президент компании National Instruments по академическим связям. «При помощи этой платформы студенты могут с легкостью перейти от теории к практике, создавая опытные образцы и углубляя свои знания в основах проектирования схем», — отметил он.
База данных компонентов включает более 1200 SPICE-моделей элементов от ведущих производителей, таких как Analog Devices, Linear Technology и Texas Instruments, а также более 100 новых моделей импульсных источников питания. Помимо этого, в новой версии программного обеспечения появился помощник Convergence Assistant, который автоматически корректирует параметры SPICE, исправляя ошибки моделирования. Добавлена поддержка моделей МОП-транзисторов стандарта BSIM4, а также расширены возможности отображения и анализа данных, включая новый пробник для значений тока и обновленные статические пробники для дифференциальных измерений.
В Multisim предусмотрено множество режимов анализа данных эмуляции, от простых до самых сложных, в том числе и вложенных. Основные виды анализа:
1. DC — анализ цепи на постоянном токе. Анализ цепей на постоянном токе осуществляется для резистивных схем. Это правило следует напрямую из теории электрических цепей; при анализе на постоянном токе конденсаторы заменяют разрывом, катушки индуктивности — коротким замыканием, нелинейные компоненты, такие как диоды и транзисторы, заменяют их сопротивлением постоянному току в рабочей точке. Анализ цепи на постоянном токе выявляет узловые потенциалы исследуемой схемы.
- АС — анализ цепи на переменном токе. Анализ цепей на переменном токе заключается в построении частотных характеристик.
- Transient — анализ переходных процессов. Анализ переходных процессов в цепях позволяет определить форму выходного сигнала, то есть построить график сигнала как функции времени.
Кроме встроенных функций анализа есть возможность определить свою функцию с помощью команд SPICE. При подготовке к анализу необходимо настроить его параметры, например, диапазон частот для анализатора переменного тока (AC analysis).
Необходимо также выбрать выходные каналы (traces).
Плоттер (Grapher) — основной инструмент просмотра результатов эмуляции. Он открывается из меню View/Grapher и автоматически при работе эмуляции. Множество настроек плоттера находятся в окне свойств. Например, можно изменять масштабы, диапазоны, заголовки, стили линий осей [5].
При моделировании схем необходимо соблюдать
- Любая схема должна обязательно содержать хотя бы один символ заземления.
— Любые два конца проводника либо контакта устройства, встречающихся в точке, всегда считаются соединенными. При соединении трех концов (Т-соединение) необходимо использовать символ соединения (узел).
Те же правила применяются при соединении четырех и более контактов.
- В схемах должны присутствовать источники сигнала (тока или напряжения), обеспечивающие входной сигнал, и не менее одной контрольной точки (за исключением анализа схем постоянного тока).
Данная среда полезна для создания и тестирования электронных схем, в отличии от которых, в релейных схемах не используется символ заземления, кроме схем токовых цепей, но это уже исключительный случай и только ради такого случая приобретать столь сложный комплекс программного обеспечения нецелесообразно. Если его (символ заземления) использовать в иных схемах РЗА, то смысл такой схемы изменится, так как даже технически это заземление невозможно куда-либо установить.
Это один из примеров, почему не стоит использовать данную среду в нашей работе. Другой пример состоит в том, что, как и в случае с Electronics Workbench, невозможно собрать такую схему, чтобы она имитировала действие всех защит из-за специфичного оборудования. Как упоминалось выше — есть случаи интеграции цифровых защит (которых, кстати, нет в базе данных Multisim) с релейными. Таков второй недостаток среды разработки и тестирования электронных схем Multisim. Третьим немаловажным недостатком ее является цена. За базовую версию, в которой не поддерживается большое количество функций, придется заплатить почти 2000 долларов, что является очень большой суммой. Pro-версия, со всеми функциями, стоит 5000 долларов. Она стоит своих денег, но не удовлетворяет потребности в моделировании схем релейных защит и автоматики железнодорожного транспорта. Также в Multisim есть функции, которые в принципе не требуются в РЗА (импульсные источники питания, мгновенное измерение параметров цепи, таких, как ток и напряжение и иные) и большое количество электронных элементов, которые также не используются в составлении наших схем (транзисторы, тиристоры и так далее).
Учитывая все эти недостатки можно с уверенностью сказать, что среда разработки и тестирования электронных схем Multisim для нашей работы не подходит.
Таким образом, можно с уверенностью сказать, что не существует программного обеспечения, которое соответствовало бы требованиям нашей работы. Ни в одной из перечисленных программ невозможно создать правильную схему релейной защиты и автоматики и невозможно имитировать действие защит. Не менее важным недостатком является цена некоторых программ, из-за чего их приобретение тоже является нецелесообразным на данный момент.
2. РАЗРАБОТКА ТЕХНИЧЕСКИХ ТРЕБОВАНИЙ И ПОСТАНОВКА ЗАДАЧ ДИПЛОМНОГО ПРОЕКТИРОВАНИЯ
Современный мир практически всегда требует, чтобы любая, даже самая сложная задача решалась как можно быстрее, при этом решаясь полностью. Для этого разрабатывается сложное программное обеспечение, которое требуется высоких вычислительных мощностей. Для этого, в свою очередь, компании-производители компьютерного железа создают все более и более мощные
В настоящее время на рабочих местах на железной дороге используются компьютеры, которые не обладают высокой мощностью, что, как понятно, заставляет задумываться о сложности программы, которая будет моделировать поведение схем релейных защит и автоматики. Оставаясь несложной и нетребовательной к вычислительным ресурсам программа должна соответствовать некоторым требованиям. Например, быстродействие на вычисление всех одновременных операций не должно уходить много времени. Также важна надежность, ведь зависания недопустимы. При этом недопустимы зависания как всей программы, так и отдельных элементов на рабочей области, потому что от зависания какого-либо элемента схемы зависит то, насколько правильно сработает схема РЗА.
Немаловажную роль играет размер программы. В этом отношении все понятно — чем компактнее программа, тем лучше. Требования к оперативной памяти особенно значимы. На всех рабочих компьютерах в сети железной дороги установлены антивирусы Касперского. При этом на этих же компьютерах, по современным меркам, установлено довольно мало RAM-памяти. Антивирус же, при работе, занимает ее почти всю и отключить его невозможно. Поэтому, разрабатываемая программа не должна быть слишком требовательна к оперативной памяти, иначе зависать будет уже компьютер. Все вышеперечисленные технические требования, несомненно, важны, но не стоит забывать и об интерфейсе.
Программа для управления схемами релейной защиты и автоматики в первую очередь разрабатывается для простых работников бригад РЗА. Таким образом, можно точно сказать, что интерфейс не должен быть слишком броским или вычурным, иначе он будет отвлекать от рабочей области, что может приводить к ошибкам в составлении схем. Также, не все работники, которые разбираются в релейных схемах, хорошо владеют компьютером (молодежи не так много, а старики не очень хорошо воспринимают компьютерную технику).
Поэтому интерфейс должен быть достаточно простым для быстрого понимания работы всех его элементов. Для этого не главную панель должны быть вынесены только те элементы схем (контакты, кнопки, катушки), которые нужны для составления схемы.
При моделировании работы схемы РЗА нельзя давать доступ к редактору схем, чтобы в процессе самого моделирования случайно или специально не разобрать схему и не допустить ошибок в ее работе. При этом, что касается редактора схем, здесь тоже есть определенные условия. Изменять схему релейной защиты и автоматики может только старший механик бригады РЗА и только по требованию «сверху». Это означает, что нельзя давать доступ к редактору каждому человеку. Должна проходить идентификация пользователя, для чего нужно использовать хотя бы доступ по правильному введению пароля. Это тоже метод защиты от составления неправильной схемы, либо от внесения в нее несогласованных изменений, потому что, как говорилось выше, релейные защиты и автоматика — главный и единственный способ защиты контактной сети от электрических повреждений. Интерфейс же симулятора должен быть таким, чтобы можно было проверить срабатывание любой защиты, любого контакта или кнопки, узнать, с чем они соединены (от какого реле и на какое срабатывают), выяснить, какая защита срабатывает. В то же время, он не должен быть сложным, учитывая вышесказанное. Поэтому необходимо, чтобы срабатывающие элементы схемы подсвечивались разными цветами и сбоку (по правилам написания схем РЗА) выводилось название защиты, которая в данный момент срабатывает.
Все перечисленные условия имеют главную роль, незначительные же могут дорабатываться во время эксплуатации. Таким образом, нужно, чтобы программа была достаточно быстродействующей, нетребовательной к ресурсам вычислительной техники, в то же время иметь простой и удобный интерфейс. Все эти цели относительно легко достижимы.
3. АРХИТЕКТУРА ПРОГРАММЫ
Информационная система (ИС) — система, предназначенная для хранения, поиска и обработки информациии соответствующие организационные ресурсы (человеческие, технические, финансовые и т. д.), которые обеспечивают и распространяют информацию (ISO/IEC 2382:2015).
Информационная система предназначена для своевременного обеспечения надлежащих людей надлежащей информацией, то есть для удовлетворения конкретных информационных потребностей в рамках определенной предметной области, при этом результатом функционирования информационных систем является информационная продукция — документы, информационные массивыбазы данныхи информационные услуги. Понятие информационной системы интерпретируют по-разному, в зависимости от контекста.
Достаточно широкое понимание информационной системы подразумевает, что её неотъемлемыми компонентами являются данные, техническое и программное обеспечениеа также персонал и организационные мероприятия.
Более узкое понимание информационной системы ограничивает её состав данными, программами и аппаратным обеспечением. Интеграция этих компонентов позволяет автоматизировать процессы управления информацией и целенаправленной деятельности конечных пользователей, направленной на получение, модификацию и хранение информации. Так, российский стандарт ГОСТ РВ 51987 подразумевает под ИС «автоматизированную систему, результатом функционирования которой является представление выходной информации для последующего использования». ГОСТ Р 53622-2009 использует термин информационно-вычислительная система для обозначения совокупности данных (или баз данных, систем управления базами данных и прикладных программ, функционирующих на вычислительных средствах как единое целое для решения определенных задач.
В деятельности организации информационная система рассматривается как программное обеспечение, реализующее деловую стратегию организации. При этом хорошей практикой является создание и развертывание единой корпоративной информационной системы, удовлетворяющей информационные потребности всех сотрудников, служб и подразделений организации. Однако на практике создание такой всеобъемлющей информационной системы слишком затруднено или даже невозможно, вследствие чего на предприятии обычно функционируют несколько различных систем, решающих отдельные группы задач: управление производством, финансово-хозяйственная деятельность, электронный документооборот и т. д. Часть задач бывает «покрыта» одновременно несколькими информационными системами, часть задач — вовсе не автоматизирована. Такая ситуация получила название «лоскутной автоматизации» и является довольно типичной для многих предприятий.
В моем случае разработанные мной два прикладных приложения относятся к общей информационной системе предприятия. Приложения разрабатываются итерационно и сейчас они обеспечивают функционал, необходимый только работникам бригады релейной защиты и автоматики, но в будущем будет участвовать и в документообороте.
Разрабатываются приложения в соответствии с моделью MVC — модель-представление-контроллер, рисунок 3.1. То есть схема использования нескольких шаблонов проектирования, с помощью которых модель приложения, пользовательский интерфей и взаимодействие с пользователем разделены на три отдельных компонента таким образом, чтобы модификация одного из компонентов оказывала минимальное воздействие на остальные. Данная схема проектирования часто используется для построения архитектурного каркаса, когда переходят от теории к реализации в конкретной предметной области.
Концепция MVC позволяет разделить данные (модель), представление и обработку действий (производимую контроллером) пользователя на три отдельных компонента:
- Модель. Предоставляет знания: данные и методы работы с этими данными;
- реагирует на запросы, изменяя своё состояние;
- не содержит информации, как эти знания можно визуализировать.
- Представление, вид — отвечает за отображение информации (визуализацию).
Часто в качестве представления выступает форма (окно) с графическими элементами.
- Контроллер — обеспечивает связь между пользователем и системой: контролирует ввод данных пользователем и использует модель и представление для реализации необходимой реакции.
- Важно отметить, что как представление, так и контроллер зависят от модели; однако модель (активная) не зависит ни от представления, ни от контроллера.
Тем самым достигается назначение такого разделения: оно позволяет строить модель независимо от визуального представления, а также создавать несколько различных представлений для одной модели.
Для реализации схемы «Model-View-Controller» используется достаточно большое число шаблонов редактирования (в зависимости от сложности архитектурного решения), основные из которых — «наблюдатель», «стратегия», «компоновщик.
Наиболее типичная реализация — в которой вид отделён от модели путём установления между ними протокола взаимодействия, использующего «аппарат событий» (обозначение «событиями» определённых ситуаций, возникающих в ходе выполнения программы, — и рассылка уведомлений о них всем тем, кто подписался на получение): при каждом особом изменении внутренних данных в модели (обозначенном как «событие»), она оповещает о нём те зависящие от неё представления, которые подписаны на получение такого оповещения — и представление обновляется. Так используется шаблон «наблюдатель».
При обработке реакции пользователя — представление выбирает, в зависимости от нужной реакции, нужный контроллер, который обеспечит ту или иную связь с моделью. Для этого используется шаблон «стратегия», или вместо этого может быть модификация с использованием шаблона «команда».
Для возможности однотипного обращения с подобъектами сложно-составного иерархического вида — может использоваться шаблон «компоновщик». Кроме того, могут использоваться и другие шаблоны проектирования — например, «фабричный метод <https://ru.wikipedia.org/wiki/%D0%A4%D0%B0%D0%B1%D1%80%D0%B8%D1%87%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B5%D1%82%D0%BE%D0%B4_%28%D1%88%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%29>», который позволит задать по умолчанию тип контроллера для соответствующего вида. Схема концепции показана на рисунке 3.1.
Пользователь видит представление (вид) модели, то есть схемы на экране монитора. Он может, используя мышь, перестраивать модель в редакторе, создавать новые схемы и так далее. В имитаторе работы схемы пользователь легко моделирует различные случаи работы схемы и проверяет правильность ее работы. Через контроллер можно внести изменения в схему и вывести ее на печать. Так же код интерфейса не связан напрямую с кодом логики обработки срабатывания элементов схемы, поэтому в любое время можно изменять или добавлять новые элементы интерфейса [7].
В случае моего программного комплекса, как показано на рисунке 3.2, пользователь только получает данные из реальной схемы никак ее не изменяя, то есть не изменяется источник. Далее через интерфейс редактора он создает виртуальную схему по образцу, которым является реальная. В данный момент времени виртуальная схема хранится в оперативной памяти компьютера. Если необходимо, то пользователь выводит эти данные в файл-сохранение. В редакторе же можно сохранение открыть. То есть здесь взаимодействие двухстороннее. Взаимодействие файла-сохранения и программы-имитатора одностороннее.
Рисунок 3.2 — Примерная модель программного комплекса
Сделано это для того, что эта программа необходима только для демонстрации работы схемы, без ее изменения, поэтому функция перезаписи сохранения здесь не требуется. Также взаимодействие пользователя и интерфейсов этих двух программ двустороннее — пользователь что-нибудь делает в программе, программа реагирует и выдает пользователю результаты или сообщения.
4. СТРУКТУРА ДАННЫХ ПРОГРАММНОГО КОМПЛЕКСА
Язык Lua, который используется для написания данной программы, имеет относительно долгую историю. Lua (от португальского “луна”) — облегченный скриптовый язык c расширяемой семантикой.был создан и поддерживается представителями Pontifical Catholic University Рио-де-Жанейро. У него нет официального стандарта, и стандартом считается описание в руководстве пользователя.
В настоящее время Lua является самым популярным скриптовым языком в индустрии игр и используется в ряде приложений в других предметных областях.является сравнительно новым языком и позаимствовал черты и идеи из ряда более старых языков:
- синтаксис структур управления логикой программы — из Modul;
- семантику более поздних версий — из Scheme;
- концепцию локальных переменных — из C++;
- концепцию наличия единственной встроенной структуры данных, используемой несколькими способами — из Lisp;
- использование ассоциативных массивов — из SNOBOL;
- множественные присвоения и возвраты из функций — из CLU etc.
Основополагающим принципом Lua является расширяемость семантики, т.е. предоставление мета-механизмов для реализации переменного набора инструментов вместо предоставления фиксированного набора инструментов. Это позволяет языку быть небольшим и простым, в то же время сохраняя мощность. Таким образом, Lua можно считать мультипарадигменным языком, поскольку он позволяет вести разработку в различных стилях. Lua поддерживает логические, числовые (по умолчанию — числа с плавающей точкой двойной точности) и строковые атомарные типы данных. Единственным “родным” сложным типом данных является таблица — гетерогенный ассоциативный массив, позволяющий использовать разные типы данных для разных пар ключей и значений. Функции являются объектами первого класса, то есть ими можно манипулировать точно так же, как переменными, передавать и получать как аргументы и так далее [8].
Вся структура данных моей программы строится на использовании таблиц, которые имеют наборы данных, необходимые для вычисления в разных местах кода. В данном типе данных можно хранить вообще все типы переменных, даже пользовательские функции и иные таблицы. Все строится на парах ключей и значений, то есть в любой таблице всегда есть такие пары.
Например, пустая таблица a={}. До того, как в нее что-либо не будет добавлено, это будет просто пустая таблица, то есть будет зарезервирована переменная с именем a. Если в нее добавить какие-нибудь значения, командой table.insert(a, [pos], data), то, соответственно, в таблице будут храниться уже эти значения на своих местах. В этой функции (table.insert()) a имя таблицы, в которую будет добавлено значение. Необязательный параметр [pos] — позиция в таблице, на которую будет добавлено значение. По умолчанию это значение начинается с первого и каждая последующая позиция увеличивается на единицу.
Допустим, в этой таблице хранятся числа: 1, 3, 5, 7, тогда она будет выглядеть следующим образом — a={1, 3, 5, 7}. Уже сейчас сформировались пары индекс-значение, как в таблице 4.1.
Таблица 4.1 — Графическое представление таблицы a={}
Индекс |
Значение |
1 |
1 |
2 |
3 |
3 |
5 |
4 |
7 |
Только в данном случае индекс не отображается в самой таблице.
Можно внести сразу переменные со значениями, даже если значение будет nil, то есть пустое. Тогда, a1={x=1, y=2, z=3}, пары индекс-значение теперь будут такими, как в таблице 4.2.
Таблица 4.2 — Графическое представление таблицы a1={}
Индекс (поле) |
Значение |
x |
1 |
y |
2 |
z |
3 |
Можно хранить таблицы в таблице вместе с другими типами данных: a2={{2, 4, 6, 8}, {1, 3, 5, 7}, number=12, name=”name”, 5}.
В данном случае пары индекс-значение будут, как в таблице 4.3.
Таблица 4.3 — Графическое представление таблицы a2={}
Индекс (поле)Значение |
|
1 |
{2, 4, 6, 8} |
2 |
{1, 3, 5, 7} |
number |
12 |
name |
“name” |
3 |
5 |
При этом таблицы по первому и второму индексам также имеют свои пары индекс-значение, как в таблицах 4.4 и 4.5. Для данного случая есть свое обозначение в коде: первая таблица, находящаяся в таблице a2, называется по первому индексу и носит название a2[1]={}, вторая, соответственно — a2[2]={}.
Таблица 4.4 — Графическое представление таблицы a2[1]={}
Индекс |
Значение |
1 |
2 |
2 |
4 |
3 |
6 |
4 |
8 |
Таблица 4.5 — Графическое представление таблицы a2[2]={}
Индекс |
Значение |
1 |
|
2 |
3 |
3 |
5 |
4 |
7 |
Все данные в таких таблицах доступны в любом месте кода, где происходит обращение к ним. Можно получить длину таблицы командой #a (a — имя таблицы) и использовать в цикле for i=1, #a do … end, только нужно учитывать, что длинной в данном случае будет являться номер индекса, поэтому длину таблицы, например b={val=1, val1=3, val2=”string”, val3=function()} получить не удастся, так как при таких обозначениях индексом будет являться имя переменной. То есть длину таблицы можно получить лишь в том случае, если есть значения без указанного индекса, например a={1, 3, 5, 7} — длина таблицы будет равна четырем.
Cуществует возможность получения значения прямо по индексу таблицы. То есть, если использовать такой способ, то не нужно использовать циклы или подобные конструкции, а можно просто использовать команду вывода (print()) по нужному индексу. Например, в таблице a2 по индексу number хранится число 12, чтобы вывести это число на экран, можно использовать функцию print() следующим образом: print(a2.number) — на экран выведется число 12. Чтобы вывести значение по неименованному индексу, нужно использовать конструкцию: print(a2[3]) — выведется 5. Могут быть последовательности индексов, например, чтобы получить значение из вложенной таблицы: print(a2[1][4]) — на экран выведется 8.
Все эти способы удобны для манипулирования данными в программе еще и потому, что можно изменять значения при вычислениях, при этом нужно просто переназначить нужное значение, обращаясь к нему одним из перечисленных выше способов. a2[1][4]=88 — тогда таблица a2 теперь будет выглядеть так: a2={{2, 4, 6, 88}, {1, 3, 5, 7}, number=12, name=”name”, 5}.
Данные способы удобны до того момента, когда нужно работать с многомерными таблицами, то есть когда в одну таблицу вложено еще несколько таблиц с именованными индексами (или полями).
В моей программе как раз используются именно такие таблицы. Например, таблица contacts={} — изначально она пустая, но когда происходит чтение из файла, то в нее заносится еще несколько таблиц. В итоге получается примерно так: contacts={{x=20, y=20, h=15, state=”open”, id=1, name=”РТО”, active=false, line=1}, {x=30, y=30, h=15, h1=17, state=”close”, id=2, name=”ПМВ1”, active=true, line=2}, {x=40, y=40, h=15, state=”open”, id=2, name=”ПМВ2”, active=false, line=2}}. x, y — координаты контакта, h — значение, необходимое для отрисовки контакта, h1 — дополнительное значение для отрисовки нормально закрытого контакта, id — значение, необходимое для ассоциации контакта с реле, на котором он находится, name — название контакта, state — состояние контакта (нормально открытый или закрытый), active — имитация проводимости контакта, line — параметр, необходимый для просчета срабатывания выбранной цепи.
Перечисленными способами работать с такой многомерной таблицей очень неудобно. Поэтому существует еще один способ — работа с парами значений. Описывается следующим образом:
for k, v in pairs(contacts) do … end. Здесь k, v — переменные, в которые циклически записываются пары индекс-значение.
Следующий код выведет значения первой таблицы в таблице contacts:
for k, v in pairs(contacts[1]) do print(k, v) end
На экране отобразится следующее:
x 20
y 2015“open”1“РТО”false1.
То есть все, что есть в таблице, только без знаков «равно». Можно вывести отдельно значения k или v, то есть просто в теле цикла написать print(k) или print(v).
При таком способе также можно назначать и переназначать значения полей (индексов) таблицы и сравнивать поля одной таблицы с полями другой. В моей программе есть еще несколько подобных таблиц, например relays={} — таблица со всеми реле схемы. После чтения из файла она становится примерно такой: relays={{x=110, y=110, idrelay=2, active=false, name=”ПМВ”, line=1}, {x=120, y=120, idrelay=3, active=false, name=”ПМО”, line=2}, {x=130, y=130, idrelay=4, active=false, name=”РПЗ”, line=3}}. x, y — координаты реле, idrelay — значение, необходимое для ассоциации реле с контактами, active — подано ли на реле напряжение или нет, name — название реле, line — значение, для выбора цепи, в которой находится реле.
Для того, чтобы сравнить, например, id и idrelay в этих двух таблицах (contacts и relays), необходимо использовать такой код:
for k,v in pairs(contacts) dor,f in pairs(relays) dov.id == f.idrelay then … end
end
Переменные k, v и r, f могут иметь любые имена, важно лишь, чтобы в этих циклах они были разными, иначе они переназначатся и возникнет путаница, в итоге схема не будет работать.
Таблица в языке Lua самый удобный способ для манипуляции большими количествами переменных, которые должны иметь одинаковые поля (индексы), поэтому в своей программе именно их я и использую, язык выбран по причине наличия такого мощного инструмента для работы с данными.
5. РАЗРАБОТКА АЛГОРИТМОВ И ПРОГРАММНОГО КОМПЛЕКСА
Так как программа имеет графический интерфейс, то в этой главе будут продемонстрированы код программы и связанные с ним функции программы.
Код интерфейса строится на использовании библиотеки Wx.lua, которая является портом wxWidgets. Все классы и методы даны на сайте, посвященном этим виджетам [10].
1 Программа-имитатор
В первую очередь объявляем некоторые переменные и создаем фрейм.
Рисунок 5.1 — Создание фрейма
Фрейм, в данном случае, как на рисунке 5.1, пустое окно без кнопок и остальных элементов. Так как сейчас демонстрируется программа-имитатор работы схем, то лишних кнопок здесь не установлено.
Необходима для отображения схемы и изменений в ней при работе функция painter(event).
Рисуются главные питающие шины и отображается строка срабатывания защиты. Код показан на рисунке 5.2, окно программы — рисунок 5.3.
Рисунок 5.2 — Код изначального окна программы
Рисунок 5.3 — Изначальное состояние окна программы
Так как таблицы контактов, реле и проводов не заполнены, то отображается только такое окно. Для этого в коде осуществляются проверки, как на рисунке 5.4.
Рисунок 5.4 — Проверки таблиц контактов и реле
Данная функция, onDown(event), необходима для обработки события нажатия правой кнопки мыши на одном из элементов. Код показан на рисунке 5.5, действие — рисунок 5.7.
Рисунок 5.5 — Код функции onDown(event)
В программе-имитаторе это выглядит так, как на рисунке 5.6.
Рисунок 5.6 — Изначальное состояние схемы
При нажатии на контакт «РТО» подаем на реле «РПЗ» напряжение. Контакт «РПЗ2» этого реле замыкается. Выводится сообщение о сработавшей защите и такое состояние поддерживается до тех пор, пока первый контакт не вернется в изначальное положение, то есть до тех пор, пока не будет отпущена правая кнопка мыши. За перерисовку схемы отвечает функция repaint().
Рисунок 5.7 — Сработавшая схема
Она необходима для перерисовки схемы. Вызывается из функции onDown (event).
В ней просчитываются все изменения в таблицах контактов и реле, как показано на рисунке 5.8.
Функция onUp(event) возвращает схему в исходное состояние. Аналогична функциям onDown(event) и repaint() вместе, то есть перерисовка схемы происходит внутри функции onUp(event) без вызова дополнительных функций, как на рисунке 5.9. Также, нужно пояснить, что слово event в функции обозначает событие, например нажатие кнопки мыши, нажатие клавиши, потеря фокуса указателя, фокус, при наведении указателя мыши и так далее. В программном коде всегда ставится ссылка на функцию, соответствующую необходимому событию. Это делает отдельно, что позволяет удобно и без путаницы в коде подключать события к функциям, а затем вызывать эти функции по какому-либо из указанных в программе событий. Выше говорилось, что для сохранения таблиц используется их сериализация. Для десериализации необходима функция, как показано на рисунке 5.10. Для того, чтобы занести данные в таблицы контактов, реле, проводов и линий используется функция setValues(newTable).
Она необходима потому, что в файле-сохранении в одной таблице хранится четыре. Поэтому нужно из одной сохраненной сделать четыре рабочие и код функции показан на рисунке 5.11.
Рисунок 5.8 — Функция repaint()
Рисунок 5.9 — Функция onUp(event)
На фрейм устанавливается панель меню и в нее вносятся файл-меню и меню помощи, как показано на рисунке 5.12.
Рисунок 5.10 — Функция десериализации таблиц
Рисунок 5.11 — Функция setValues(newTable)
5.2 Редактор схем
Программа для редактирования схем строится таким же образом. То есть изначально точно таким же способом, что и в программе-имитаторе работы схем создается фрейм, определяются некоторые необходимые переменные, а также функция painter(event) содержит точно такой же код, как и в первом случае, так как принципы рисования схемы одинаковы в обоих случаях. Таблицы те же самые, чтобы потом можно было легко их ассоциировать в программе-имитаторе. Редактор схем может и сохранять схемы, для последующего их открытия в программе-имитаторе, и открывать сохраненные схемы для их редактирования.
Рисунок 5.12 — Установка элементов интерфейса на фрейм
Так как на панели инструментов находятся незарезервированные инструменты, то для них нужны собственные id. Для этих целей используется соответствующая функция, соответствующие переменные для этих id и конструктор панели инструментов. Хотя в конструкторе нестандартны только названия id. Эта функция позволяет назначать новые инструменты не сбивая порядок между уже существующими и установленными на панель. Код функции и инструментов, а так же интерфейс показаны на рисунке 5.13 и рисунке 5.14.
При выборе инструмента в окне программы высвечивается название выбранного инструмента и по нажатию левой кнопки мыши из функции onLeft(event) вызывается функция данного инструмента, как показано на рисунке 5.15. Инструмент должен работать тогда, когда он выбран на панели инструментов, для того и делаются все проверки.
Рисунок 5.13 — Код функции NewID()
Рисунок 5.14 — Интерфейс с новыми инструментами
Рисунок 5.15 — Выбор необходимого инструмента
Так как инструментов предполагается большое количество и интерфейс будет перерабатываться, то сейчас в один блок сгруппированы только пять инструментов в коде. В интерфейсе сгруппированы в один блок инструменты выбора элемента. Для редактирования отдельного элемента сгруппированы еще два инструмента, а инструмент стирания схемы выделен отдельно, чтобы случайно его не нажать. Отображается это так, как на рисунке 5.16
Рисунок 5.16 — Демонстрация выбора инструмента
При выбранном инструменте «Провод» можно рисовать провода между шинами и контактами и реле, между контактами и между контактами и реле. Показано на рисунке 5.17. Необходимо, чтобы на схеме был хотя бы один контакт и одно реле. Чтобы избежать лишних ошибок при построении схемы сделана эта проверка.
Провода рисуются функциями rightDown(event) и rightUp(event), то есть происходит обработка события нажатия правой кнопки мыши, как показано на рисунке 5.18.
Рисунок 5.18 — Функции rightDown(event) и rightUp(event)
В программе отображение проводов при размещенных на схеме контакте и реле выглядит, как на рисунке 5.19. Геометрия провода просчитывается автоматически.
Рисунок 5.19 — Отображение проводов на схеме
Чтобы редактировать названия элементов используется инструмент «Редактировать». Он работает по двойному клику левой кнопки мыши на элементе. В программе открывается диалоговое окно, в котором вносятся значения этих элементов. Код показан на рисунке 5.20.
Рисунок 5.20 — Код инструмента редактирования элементов
В программе это отображается так, как показано на рисунке 5.21.
Рисунок 5.21 — Диалоговое окно инструмента редактирования элементов
При нажатии на кнопку «Подтвердить» происходит действие, как на рисунке 5.22. То есть изменяется название элемента, контакта, как в данном случае. Также в таблицу элементу вносится изменение переменной line, то есть теперь этот элемент находится в определенной цепи схемы.
Рисунок 5.22 — Результат редактирования элемента
Функция setValues(nameVal, lineVal) необходима для установления значения элемента. Вызывается из функции diaologOfSettings(count, name, line).
Код ее показан на рисунке 5.23.
Рисунок 5.23 — Функция установки значений элементов
6. РЕАЛИЗАЦИЯ ПРОГРАММНЫХ МОДУЛЕЙ
Преимущество языка Lua является возможность использования пользовательских функций. То есть выделения части кода конструкцией function name() … end и вызовом этой функций из любой другой. Такой способ позволяет быстро и удобно редактировать код, находить ошибки и исправлять их, изменять программные процессы и так далее. Переменные в этом языке можно объявлять где угодно, то есть либо заранее, до начала основного кода, либо в теле функций. Правда нужно учитывать, что, если переменная объявлена в теле функции и она является локальной (перед ней написано слово local), то она будет доступна только в этой функции. Глобальные же переменные (без слова local) доступны из любой части кода.
Моя разработка состоит из двух программ: имитатора работы схемы и редактора схем. Общее у этих двух программ — таблицы с одинаковыми полями. Такие, как contacts (хранит данные о контактах), relays (содержит данные о катушках реле), wires (хранит данные о координатах проводов), lines (эта таблица содержит данные о «линиях» для нахождения цепи срабатывания контактов и реле).
6.1 Алгоритмы программы-имитатора
Функция painter(event).
Работает следующим образом. В первую очередь происходит объявление переменной dc — теперь она будет давать доступ к отрисовке линий, фигур, текста и тому подобного из этой функции. Осуществляется с помощью библиотеки wxWidgets. Далее, если переменная textdef не является пустой (nil), а изначально она именно такой и является, так как нигде не объявлена, то программа выводит на экран по необходимым координатам сообщение «Сработала защита: Название защиты». Если же никакая защита не сработала, то есть переменная до сих пор пустая, то выводится лишь сообщение «Сработала защита:». Эта переменная переназначается в одной из последующих функций. Далее идут конструкторы линий dc:DrawLine(x, y, x1, y1) — рисуются две главные питающие шины схемы. Так как они необходимы всегда и находятся на одном и том же месте, то им можно задать точные координаты, как в моем примере.
Следующий блок кода отвечает за проверку катушек реле, то есть активированы они или нет. Сначала проверяется, не пуста ли таблица relays. Делается это для того, чтобы избежать ошибок в последующих вычислениях. Если таблица не пуста, то сравниваются id контактов и реле в своих таблицах. Если реле не активны, то и контакты находятся в нормальном состоянии. После этого отображаются сами реле на схеме с помощью нескольких конструкторов dc:DrawLine(x, y, x1, y1).
Изначальные координаты берутся из таблицы relays, остальные отсчитываются от них. Название реле также берется из таблицы и положение его отсчитывается от первоначальных координат. Для отображения названий контактов и реле используется конструктор dc:DrawText(“string”, x, y).
Подобные действия проделываются и для контактов. Сначала проверяется таблица contacts на то, что она не пустая. Затем в самой таблице проверяется каким является контакт: нормально открытым или закрытым (значение берется из таблицы).
Так же из таблицы берется значение проводит ли контакт ток в данный момент или не проводит и, в зависимости от этих состояний рисуется контакт тем же способом, что и реле, включая название контакта. Все координаты отсчитываются от изначальных, указанных в таблице. Такие же действия проводятся с таблицей wires. То есть, данная функция отвечает только за отрисовку элементов. При этом, она будет вызываться из других функций командой panel:Refresh() и перерисовывать схему в соответсвии с новыми данными в таблицах contacts и relays.
Следующая функция onDown(event) производит обработку события нажатия правой кнопки мыши. Сначала происходит проверка контакта на нормальное состояние, а затем сравниваются координаты указателя мыши и контакта. Если найденный контакт является нормально открытым, то теперь он может проводить ток (active=true в таблице этого контакта изменяется состояние active с false на true), для нормально закрытого контакта наоборот — active становится false, то есть он не проводит теперь ток. Назначается переменная line, значение которой берется из таблицы contacts для данного контакта. И переназначается переменная textdef, которая описывалась в предыдущей функции. После этого вызывается repaint() — функция, необходимая для переназначения данных в таблицах contacts и relays и вызова перерисовки самой схемы.
Функция repaint() работает следующим образом. Сначала объявляются таблицы lines и linescon, при этом в первую записываются значения из файла-сохранения, а во вторую — при дальнейших вычислениях.
Сравниваются значения состояний контактов (active), находящихся в одной «линии» и, если они все активны, то выполняется оставшийся код функции. При совпадении id контакта с id реле в своих таблица, состояние этого контакта инвертируется, так как на реле подано напряжение и сердечник притягивает движущуюся часть реле, которая перемещает группы контактов. Контакты, находящиеся на этом реле находятся в своих «линиях», поэтому в таблицу linescon записываются уже значения line этих инвертированных контактов. Необходимо это для того, чтобы активировать реле, находящиеся в «линиях» с этими контактами. За что и отвечает оставшийся код, в котором происходит все то же самое, что и для первых контактов-реле. Затем происходит перерисовка схемы командой panel:Refresh().
Функция onUp(event).
Как можно догадаться, эта функция обрабатывает событие «отпускания» правой кнопки мыши. Работает аналогично функциям onDown(event) и repaint() одновременно, только все значения инвертируются к исходному состоянию.
Функция table.load(filename) необходима для десериализации таблицы, находящейся в файле-сохранении. Необходимо уточнить, что в Lua невозможно выводить таблицы в файл напрямую, поэтому их нужно переводить в строки, то есть сериализовать. Соответственно обратное действие — десериализация, необходима для того, чтобы из строки получить таблицу в изначальном ее состоянии, которая назначается переменной tables[1].
Далее происходит вызов функции setValues(newTable) с передаваемым параметром tables[1].
Происходит это так: setValues(tables[1]).
Функция setValues(newTable) необходима для того, передать данные из таблицы tables[1] из файла-сохранения в рабочие таблицы contacts, relays, wires и lines. Не совсем правильно сохранять в файл каждую таблицу отдельно, так как это вызовет путаницу в сохранении и при загрузке может получиться не тот результат, который ожидался. Плюс, таким образом от сложного приходим к простому и порядок таблиц в файле-сохранении не меняется. Поэтому в редакторе эти четыре таблицы помещаются в одну общую. В имитаторе же эта таблица при загрузке схемы «распаковывается» и позволяет отрисовывать схему. Также строковые данные состояния active контактов переводятся в значения true или false. Сохраняется в стороковом формате из-за того, что переменные типа Boolean нельзя перевести в строку функцией сериализации. В итоге это поле просто пропадает и схема работает не правильно. Именно для этого и сделаны дополнительные переводы. Реле всегда находятся изначально в неактивированном состоянии, поэтому их значения active становятся false. Это назначение происходит только в программе-имитаторе, так как нет смысла производить дополнительные переводы в редакторе схем, потому что все реле всегда, до включения схемы находятся в нормально отключенном состоянии. Далее вызывается команда panel:Refresh() и схема обновляется, то есть перерисовывается. Работу этой программы можно изобразить блок-схемой, как на рисунке 6.1.
6.2 Алгоритмы редактора схем
Переменные таблиц имеют те же имена, что и в имитаторе. Также с ним совпадает функция painter(event), с единственным отличием — чтобы программа не выдавала ошибку, дополнительно проверяется, что переменная с именем контакта или реле не пустая в своей таблице.
На панели инструментов имеются кнопки, которые отвечают за свой элемент схемы: контакт, катушка, провод и так далее.
Рисунок 6.1 — Блок-схема работы программы-имитатора
Эта функция обрабатывает событие нажатия левой кнопки мыши. В зависимости от значения переменной tool вызывается одна из следующих функций: drawOpenCont() — рисуется нормально открытый контакт и в таблицу contacts заносятся его значения (координаты, состояние, «проводимость», название, линия); drawCloseCont() — то же самое для закрытого контакта; drawRelay() — то же самое для катушки реле; clearSingle() вместо того, чтобы очистить всю область схемы, благодаря этой функции можно стирать по одному элементу. Когда находится совпадение в таблицах contacts или relays, тогда по индексу этого элемента из нужной таблицы удаляется значение командой table.remove(name, pos) (name — имя таблицы, pos — позиция в таблице).
После выполнения действия функции происходит обновление схемы командой panel:Refresh().
Функции rightDown(event) и rightUp(event) работают совместно и необходимы для прокладки проводов на схеме, обрабатывают они события нажатия и отпускания правой кнопки мыши. Есть четыре шага: нажатие и отпускание правой кнопки мыши на первом из соединяемых элементов и нажатие и отпускание ее на втором из соединяемых элементов. Сначала переменная step = 1, когда происходит четвертое действие или шаг, то есть step = 4, то эта переменная вновь становится равна единице. Провод может быть нарисован от питающей шины до контакта, от одного контакта до другого, от контакта до реле, от реле или контакта до второй питающей шины. Если есть совпадение координат мыши с одним из элементов из таблиц contacts или relays, либо с координатами питающих шин, то провод отрисовывается. В ином случае — нет. Также, для того, чтобы проложить провод, необходимо, чтобы на схеме был хотя бы один контакт и одна катушка реле. В функции rightUp(event) при срабатывании события отпускания правой кнопки мыши, в зависимости от состояния переменной step, происходит следующее: переменная step изменяет свое значение на заданное и при значении ее, равном четырем, в таблицу wires заносятся координаты провода. После этого схема обновляется командой panel:Refresh().
Необходимо, также, добавить, что функции эти работают только тогда, когда на панели инструментов выбран инструмент «Провод», а значит установлено необходимое значение переменной tool.
Функция onDoubleClick(event) обрабатывает двойной клик левой кнопки мыши. Работает тогда, когда на панели инструментов выбран инструмент «Редактировать», а значит установлено необходимое значение переменной tool. При совпадении координат мыши с координатами контакта или реле в своих таблицах, вызывается функция dialogOfSettings(name, line), в которую передаются данные о названии элемента и его линии. Эти параметры берутся из таблицы элемента.
Функция dialogOfSettings(name, line) создает диалоговое окно с двумя полями для ввода текста «Название» и «Линия» и с кнопкой «Подтвердить». Изначально в этих полях указаны название редактируемого элемента и его линия. При изменении значений данных полей и нажатии кнопки «Подтвердить» происходит переназначение переменных name и line в таблице контакта или реле. Происходит это в функции setValues(nameVal, lineVal) (nameVal и lineVal — передаваемые значения).
Функция setValues(nameVal, lineVal) работает следующим образом. Из диалога в нее передаются значения названия и линии контакта или реле. Также в функции onDoubleClick(event) назначались переменные с координатами контакта или реле (для того и другого свои), а так как эти переменные являются глобальными, то они доступны из любой функции. В setValues(nameVal, lineVal) ищется совпадение координат, полученных в функции onDoubleClick(event) и координат в таблицах contacts и relays и если оно находится, то данному элементу устанавливаются значения переменных name и line, полученные из диалога редактирования, в своих таблицах. Необходимо, также, учитывать, что id контакта и id реле должны быть одинаковыми, когда контакт расположен на этом реле, при этом, если контакт находится на реле, то он всегда имеет в своем названии часть названия реле. Поэтому для контакта ищется совпадение названия с названием реле и уже из этого совпадения контакту назначается id его реле. После всех этих операций происходит обновление схемы командой panel:Refresh().
Функция saveSchema() необходима для сохранения схемы в файл. Чтобы сохранить схему в файл необходимо таблицу сериализовать, то есть перевести в строку. Данная функция для этого и используется. Она вызывается из меню сохранения. В нее вносится общая таблица с таблицами contacts, relays, wires, lines и путь к файлу-сохранению.
Функция кнопки «Очистить» на панели инструментов работает следующим образом: при нажатии на эту кнопку таблицы contacts, relays и wires обнуляются, то есть становятся пустыми и схема обновляется командой panel:Refresh().
Необходимо также сказать, что в библиотеке wxWidgets есть зарезервированные id для некоторых функций. Например, для кнопок меню, таких как «Сохранить», «Новый», «Открыть» и так далее. Но может возникнуть ситуация, когда этих id может быть недостаточно или для них нужны иные функции. В моем случае — это, например, выбор инструментов на панели инструментов. Для них нет зарезервированных значений этого парметра, поэтому их id назначается с помощью функции newID().
В этом случае каждому названию этого параметра инструмента устанавливается свое значение, отсчитываемое от максимального зарезервированного id, увеличиваемого с каждым новым на единицу. Это позволяет сделать каждый инструмент индивидуальным и не вносить путаницу в пункты меню и кнопки панели инструментов. Изобразить работу этой программы можно следующей блок-схемой, как на рисунке 6.2.
Рисунок 6.2 — Общая блок-схема редактора схем РЗА
7. ОТЛАДКА И ЭКСПЕРИМЕНТАЛЬНОЕ ТЕСТИРОВАНИЕ
7.1 Отладка
Отладка — этап разработки компьютерной программы, на котором обнаруживают, локализуют и устраняют ошибки. Чтобы понять, где возникла ошибка, приходится узнавать текущие значения переменных и выяснять, по какому пути выполнялась программа.
Существуют две взаимодополняющие технологии отладки: использование отладчиков и журналирование.
Использование отладчиков — программ, которые включают в себя пользовательский интерфейсдля пошагового выполнения программы: оператор за оператором, функция за функцией, с остановками на некоторых строках исходного кода или при достижении определённого условия.
Вывод текущего состояния программы с помощью расположенных в критических точках программы операторов вывода — на экран, принтер или в файл. Вывод отладочных сведений в файл называется журналированием.
Типичный цикл разработки, за время жизни программы многократно повторяющийся, состоит из нескольких пунктов.
- Программирование — внесение в программу новой функциональности, исправление ошибок в имеющейся.
- Тестирование (ручное или автоматизированное;
- программистом, тестером или пользователем;
- «дымовое», в режиме черного ящика или модульное) — обнаружение факта ошибки.
- Воспроизведение ошибки — выяснение условий, при которых ошибка случается. Это может оказаться непростой задачей при программировании параллельных процессов и при некоторых необычных ошибках, известных как гейзенбаги.
- Отладка — обнаружение причины ошибки.
Отладчик представляет из себя программный инструмент, позволяющий программисту наблюдать за выполнением исследуемой программы, останавливать и перезапускать её, прогонять в замедленном темпе, изменять значения в памяти и даже, в некоторых случаях, возвращать назад по времени.
Использование языка программирования высокого уровня обычно упрощает отладку, если такие языки содержат, например, средства обработки исключений, сильно облегчающие поиск источника проблемы. В низкоуровневых языках ошибки могут приводить к незаметным проблемам — например, повреждениям памяти и утечкам памяти. Тогда бывает довольно трудно определить, что стало первоначальной причиной ошибки. В этих случаях могут потребоваться сложные приёмы и средства отладки.
Другое направление — сделать, чтобы отладка нужна была как можно реже. Для этого применяются:
— Контрактное программирование — чтобы программист подтверждал другим путём, что ему на выходе нужно именно такое поведение программы. В языках, в которых контрактного программирования нет, используется самопроверка программы в ключевых точках.
- Модульное тестирование — проверка поведения программы по частям.
- Статический анализ кода — проверка кода на стандартные ошибки «по недосмотру».
В программном коде может быть так называемое недокументированное поведение — серьёзные ошибки, которые не проявляются при нормальном ходе выполнения программы, однако весьма опасны для безопасности всей системы в случае целенаправленной атаки. Чаще всего это результат ошибок программиста. Наиболее известные примеры — это SQL-инъекция и переполнение буфера.
Статический анализ кода. На этой фазе программа сканер ищет последовательности в исходном тексте, соответствующие небезопасным вызовам функций и т. д. Фактически идет сканирование исходного текста программы на основе специальной базы правил, которая содержит описание небезопасных образцов кода.
7.2 Ручное тестирование
Ручное тестирование (manual testing) — часть процесса тестирования на этапе контроля качества в процессе разработки программного обеспечения. Оно проводится тестировщиками или обычными пользователи путем моделирования возможных сценариев действия пользователя.
Задача тестировщика заключается в поиске наибольшего количества ошибок. Он должен хорошо знать наиболее часто допускаемые ошибки и уметь находить их за минимально короткий период времени. Остальные ошибки, которые не являются типовыми, обнаруживаются только тщательно созданными наборами тестов. Однако, из этого не следует, что для типовых ошибок не нужно составлять тесты.
Ручное тестирование заключается в выполнении задокументированной процедуры, где описана методика выполнения тестов. Методика задает порядок тестов и для каждого теста — список значений параметров, который подается на вход со списком результатов на выходе. Так как процедура предназначена для выполнения человеком, в ее описании для краткости могут использоваться некоторые значения по умолчанию, ориентированные на здравый смысл, или ссылки на информацию, хранящуюся в другом документе.
Методы ручного тестирования достаточно эффективны с точки зрения нахождения ошибок. Их обязательно следует использовать в каждом программном продукте. Описанные методы предназначены для периода разработки, когда программа закодирована, но активный этап тестирования еще не начался. Похожие методы могут применяться и на более ранних этапах процесса создания программ, в конце каждого этапа проектирования.
Данные методы способствуют существенному увеличению производительности и повышению надежности программы. Во-первых, они обычно позволяют раньше обнаружить ошибки, уменьшить стоимость исправления последних и увеличить вероятность того, что корректировка произведена правильно. Во-вторых, психология программистов, по-видимому, изменяется, когда начинается тестирование перед релизом. Возрастает внутреннее напряжение и появляется тенденция «исправлять ошибки так быстро, как только это возможно». В итоге программисты допускают больше промахов при корректировке ошибок, уже найденных во время тестирования, чем при корректировке ошибок, найденных на более ранних этапах. Кроме того, скептицизм связан с тем, что это «первобытный метод». Сейчас стоимость машинного времени очень низка, а стоимость труда тестировщиков высока и ряд руководителей пойдут на все, чтобы сократить расходы. Однако, есть другая сторона ручного тестирования — при тестировании за компьютером причины ошибок выявляются только в программе, а самая глубокая их причина — мышление программиста, как правило, не претерпевает изменений, при ручном же тестировании, программист глубоко анализирует свой код, попутно выявляя возможные пути его оптимизации, и изменяет собственный стиль мышления, повышая квалификацию [12].
7.3 Модульное тестирование
Модульное тестирование, или юнит-тестирование — процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы.
Идея состоит в том, чтобы писать тесты для каждой нетривиальной функции или метода. Это позволяет достаточно быстро проверить, не привело ли очередное изменение кода к регрессии, то есть к появлению ошибок в уже оттестированных местах программы, а также облегчает обнаружение и устранение таких ошибок.
Цель модульного тестирования — изолировать отдельные части программы и показать, что по отдельности эти части работоспособны.
Этот тип тестирования обычно выполняется программистами.
Модульное тестирование позже позволяет программистам проводить рефакторинг, будучи уверенными, что модуль по-прежнему работает корректно. Это поощряет программистов к изменениям кода, поскольку достаточно легко проверить, что код работает и после изменений.
Модульное тестирование помогает устранить сомнения по поводу отдельных модулей и может быть использовано для подхода к тестированию «снизу вверх»: сначала тестируя отдельные части программы, а затем программу в целом.
Модульные тесты можно рассматривать как «живой документ» для тестируемого класса. Клиенты, которые не знают, как использовать данный класс, могут использовать юнит-тест в качестве примера.
Поскольку некоторые классы могут использовать другие классы, тестирование отдельного класса часто распространяется на связанные с ним. Например, класс пользуется базой данных; в ходе написания теста программист обнаруживает, что тесту приходится взаимодействовать с базой. Это ошибка, поскольку тест не должен выходить за границу класса. В результате разработчик абстрагируется от соединения с базой данных и реализует этот интерфейс, используя свой собственный mock-объект. Это приводит к менее связанному коду, минимизируя зависимости в системе [13].
8. РАЗРАБОТКА ТЕХНИЧЕСКОЙ ДОКУМЕНТАЦИИ
Необходимо правильно использовать все функции любой программы, чтобы эффективно ее применять. Для правильного использования моего программного комплекса можно использовать это руководство пользователя.
Любая схема создается в программе-редакторе схем. Необходимо запустить файл с названием editor.lua. В открывшемся окне будет показана рабочая область, меню и панель инструментов. Рисунок 8.1.
Рисунок 8.1 — Изначальное состояние программы-имитатора
Необходимо выбрать один из инструментов, находящихся на панели. Тогда справа на рабочей области будет показано, какой инструмент сейчас выбран, как на рисунке 8.2.
Рисунок 8.2 — Отображение выбранного инструмента
Далее можно нажать левой кнопкой мыши на рабочей области, которая находится между основных питающих шин, как показано на рисунке 8.3.
Рисунок 8.3 — Рабочая область окна программы
При использовании одного инструмента «Открытый контакт» на рабочей области, при левом клике мыши, отобразится данный элемент. Он будет иметь название “contact” и находиться по координатам, на которых в этот момент находился указатель мыши. Рисунок 8.4.
Рисунок 8.4 — Демонстрация работы инструмента «ОТКР»
Точно так же работают: «Закрытый контакт», «Реле» и некоторые другие. Инструмент «Провод» работает только в том случае, если на схеме есть хотя бы один контакт и одно реле. Это заставляет задуматься и избежать лишних ошибок при построении схемы и «Провод» работает по правому клику мыши на двух соединяемых элементах или на соединяемых элементе и питающей шине, как на рисунке 8.5.
Рисунок 8.5 — Работа инструмента «ПРОВОД»
Инструмент «Редактировать» необходим для того, чтобы редактировать информацию элемента — изменить его название и цепь, в которой он находится. Для этого нужно выбрать этот инструмент и два раза кликнуть на редактируемом элементе. Появится окно диалога, в котором нужно ввести данные и нажать кнопку «Подтвердить», как показано на рисунке 8.6.
Рисунок 8.6 — Диалоговое окно инструмента редактирования
После редактирования схема станет, например, такой, как на рисунке 8.7.
Рисунок 8.7 — Отредактированные элементы схемы
Значение параметра «Линия» в окне редактирования должно быть одинаковым для элементов, находящихся в одной цепи. В данном случае это значение равняется 1, для элементов с названием «РТО» и «РПЗ» и 2 — для элементов «РПЗ1» и «ПМО».
Идентификатор реле (id) назначается автоматически, идентификатор реле — от его названия и id реле, на котором он находится, только контакт обязательно должен содержать в своем названии название реле, на котором он находится.
Два инструмента «Элемент» и «Очистить» нужны для того, чтобы стирать элементы со схемы: первый — для удаления одиночного элемента, второй — для полного стирания схемы и возвращения рабочей области в исходное состояние.
Чтобы сохранить полученную схему нужно в меню “File” выбрать пункт меню “Save File”, как на рисунке 8.8.
Рисунок 8.8 — Меню сохранения схемы в файл
Тогда откроется диалог сохранения схемы в файл своего формата, как показано на рисунке 8.9. Формат можно выбрать только заданный, то есть .sch, если же сохранить схему в любом другом формате, то программа-имитатор не сможет ее корректно открыть.
Рисунок 8.9 — Диалоговое окно сохранения схемы в файл
Этот файл можно открыть в программе-имитаторе работы схемы, либо в программе-редакторе, чтобы отредактировать при необходимости. Для этого нужно в меню “File” выбрать пункт меню “Open File”. Откроется такое же окно выбора файла и выбрать можно будет только файлы формата .sch.
Для того, чтобы продемонстрировать работу схемы РЗА необходимо запустить программу schema.wlua. Откроется такое окно, как на рисунке 8.10.
Чтобы открыть схему нужно в меню «Файл» выбрать пункт «Открыть», как показано на рисунке 8.11.
В этом случае откроется диалоговое окно, аналогичное окну загрузки в программе-редакторе. Рисунок 8.12.
Файлы в формате .sch являются файлами-сохранениями схем для данной программы. При открытии такого файла в программе-имитаторе отобразится схема, которая в этом файле сохранена. Рисунок 8.13.
Рисунок 8.10 — Изначальное состояние программы-имитатора
Рисунок 8.11 — Меню «Файл» программы-имитатора
Рисунок 8.12 — Диалоговое окно открытия файла с сохраненной схемой
Рисунок 8.13 — Схема, открытая в программе-имитаторе
При нажатии на контакт правой кнопкой мыши данный контакт замкнется, на реле будет подано напряжение, то есть оно станет активно и его контакты инвертируют свое нормальное состояние. Также будет выведено сообщение о сработавшей защите, как на рисунке 8.14. Если отпустить правую кнопку мыши, тогда контакты вернутся в исходное состояние.
Рисунок 8.14 — Демонстрация срабатывания схемы
Если же контакт будет нажат левой кнопкой мыши, тогда сработает только этот контакт и его состояние будет зафиксировано до следующего нажатия левой кнопкой мыши на этот же контакт.
При нажатии правой кнопкой мыши на реле подтянутся его контакты и схема сработает дальше. Рисунок 8.15.
Рисунок 8.15 — Срабатывание реле «РПЗ»
Здесь правой кнопкой мыши нажата реле «РПЗ» и сработал ее контакт «РПЗ1». Если бы было больше контактов, то сработали бы все контакты, которые на ней находились бы и так с каждым реле.
ЗАКЛЮЧЕНИЕ
Мною была поставлена задача создать программный комплекс, для имитации работы электрических релейных схем на железнодорожном транспорте. Для этого необходимо было решить вопросы с существующими программами, с выбором языка программирования, с реализацией программного комплекса на уровне кода и на уровне интерфейса. Язык выбран не случайно. Он легок в понимании, быстр в работе и не требователен к ресурсам вычислительной машины, а также, являясь интерпретируемо-компилируемым, позволяет переписывать и дополнять программу в процессе использования. Так как конкурентных программных комплексов или программ не нашлось, то моя разработка будет полезна в работе. При этом ее можно модифицировать и для работы со схемами, и для обучения студентов. На уровне кода мой программный комплекс работает без ошибок и позволяет проверять на некоторые ошибки созданную схему. В дальнейшем, так как разработка программы имеет итерационный характер, будут добавлены дополнительные проверки по просьбе пользователей. Также возможна переработка моего программного комплекса из локального приложения в сетевое, конечно по просьбам пользователей.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
[Электронный ресурс]//URL: https://drprom.ru/diplomnaya/releyno-kontaktnyie-shemyi/
1. Горбунов, В. А. Интерфейсы информационных систем: учеб. пособие/ В. А. Горбунов. — Вологда: ВоГТУ, 2004. — 119 с.
Приложение
Схема для задания