Автоматизация расчета передаточных функций АСУ методом
некасающихся контуров
Б. К. Набиулин, И.М. Сафаров, Г.М. Сафиуллина Казанский государственный энергетический университет
Аннотация: При представлении современных систем автоматического управления в виде структурных схем они становятся громоздкими и нечитаемыми, а их исследование требует большого количества сложных для человека расчетов. К тому же, многие студенты, обучающиеся по направлению «Автоматизация технологических процессов и производств» не понимают современных методов расчета передаточных функций систем управления. В данной статье рассмотрен способ представления структурных схем в виде ориентированных графов, что сильно упрощает читабельность схем, а также дает возможность написания алгоритмов обработки систем автоматического управления, представленных в виде графов. В статье предложены алгоритмы для нахождения передаточных функций, написанные на языке программирования С#, которые могут стать базой для собственной программы для исследования САУ, а также студентами для проверки корректности найденной передаточной функции.
Ключевые слова: граф, орграф, теория автоматического управления, система автоматического управления, передаточная функция.
Для исследования систем автоматического управления в ТАУ их принято схематично изображать в виде структурных схем, на которых располагают элементы, выполняющие функции, необходимые для осуществления процесса автоматического управления [1-2].
Однако, на практике схемы становятся слишком громоздкими и сложными для восприятия. К тому же, исследование САУ требует большого количества сложных для человека расчетов.
Использование вычислительных ресурсов компьютера упрощает задачу исследования систем автоматического управления [3]. Однако, структурное описание схемы, как типа данных для ЭВМ и алгоритмов работы с ними, является трудоемким процессом.
Й
Представление схем в виде ориентированных графов решает все вышепоставленные проблемы:
1) Делает схему проще и читабельнее;
2) Орграф легко представить как тип данных;
3) Существует множество алгоритмов для работы с графами [4].
Задачей текущей работы является автоматизирование расчета передаточных функций путем создания программы с использованием правила некасающихся контуров, которое выражается следующей формулой:
W(s) = У(Б)/Х(Б) =
(1)
Л5
где Wпрi - передаточная функция 1-го отдельного прямого пути от Х^) до У^), вычисленная как произведение передаточных функций дуг, входящих в этот путь;
Лs - определитель орграфа [5-6].
А5 = 1-1/^(5) + £/^(5)^00+ ... (2)
Wj(s) - передаточная функция |-го замкнутого контура, вычисленная как произведение передаточных функций дуг, входящих в этот контур;
Wj(s)Wk(s) - произведение передаточных функций пары (|-го и к-го) замкнутых контуров, не касающихся ни дугами, ни вершинами, суммирование осуществляется по всем парам некасающихся контуров;
Ai(s)- определитель орграфа, полученного при удалении дуг и вершин i-го отдельного прямого пути, определяется по формуле (2) [7].
Описанная далее программа может быть использована студентами, изучающими теорию автоматического управления, для глубокого понимания методов расчета передаточных функций АСУ, для проверки правильности решениях задач по курсу «Теория автоматического управления», а также может стать основой для полноценной программы расчета передаточных функций для использования на предприятиях.
Для достижения этой цели нужно выполнить следующие задачи:
1) Представим ориентированный граф в удобном для обработки компьютером виде
2) Опишем алгоритм поиска прямых путей графа
3) Опишем алгоритм поиска замкнутых контуров графа.
Для работы с графом представляем его в удобном для обработки виде и реализуем три класса:
1) Класс для хранения пройденных вершин
2) Класс для хранения стека пути
3) Класс для хранения вершин, которые мы можем посетить из текущей, но еще не посетили [8].
Реализация всех классов и методов представленных в статье осуществлялась на языке программирования c# в среде разработки Visual Studio.
Й Инженерный вестник Дона, №4 (2020) ivdon.ru/ru/magazine/arcliive/n4y2020/6435
Для работы с графом реализуем класс Edge, представляющий его вершину, а также класс Neighbor для хранения списка соседних вершин и значения передаточной функции между ними. Пример реализации метода Edge представлен на рисунке 5 [9].
class Edge {
List<Neighbor> AllNeaigbors List<Neighbor>{);
Guid Id { get\ set; >
EdgeU { Id Guid-NewGuidC); }
Li$t<Edge> GetNeighbors()
<
AllNeaigbors
.Select{neighbor neighbor.EdgeNeighbor).ToListt)\
}
void AddNeighborlfdfje link, string Function)
i
var neighbor AlUNeaigbors
.Wheretn n.EdgeNeighbor.Id link.Id),Select(n n);
( neighbor.Anyt))
AUNeaigbors, Add( Neighbori link, Function}); neighbor,First().Functions.Add{Function};
}
Listcstrimp GetFunctionsBetweenNeaighbor(Ec/ge neaighbor)
{
AUNeaigbors .Wheretn n.EdgeNeighbor.Id neaighbor.Id)
.SelectManyin n.Functions) .ToListO;
}
>
Рис 5. Реализация класса Edge
В текущей реализации класс Edge каждой вершине класс создается уникальный идентификатор, а также реализован метод для добавления соседних вершин графа и назначения им передаточной функции, метод для получения всех соседних вершин и метод для получения значений передаточных функций между текущей и переданной на вход вершиной.
Й Инженерный вестник Дона, №4 (2020) ivdon.ru/ru/magazine/arcliive/n4y2020/6435
Для представления соседей реализован класс Neighbor, который хранит в себе вершину соседа и значения передаточной функции между текущей вершиной и ее соседом. Пример его реализации представлен на рисунке 6.
class Neighbor {
List<strirtjgf> Functions { get; set; }
Edge EdgeNeighbor { get', : set; }
Neighbor(Edge Link, string function)
{
EdgeNeighbor Link;
Functions List<string> { function >;
}
m
Рис 6. Реализация класса Neighbor
Первый класс History, необходимый для работы с графом, имеет поле для хранения пройденных вершин графа и методов, с помощью которых можно проверять была ли посещена текущая вершина, а также менять состояние посещения на противоположное. Реализация данного класса может иметь вид изображенныйна рис. 7.
В текущей реализации класс History имеет публичное поле VisitedEdges, представляющее собой словарь, ключи которого - вершины графа, а значение является булевой величиной, показывающей, была ли посещена текущая вершина (true - посещена, false - не посещена).
Конструктор представленного класс принимает на вход сам граф, представленный перечислением вершин, преобразует его в словарь и запоминает в поле VisitedEdges, устанавливая всем вершинам значение false, так как ни одна вершина еще не была посещена.
Й Инженерный вестник Дона, №4 (2020) ivdon.ru/ru/magazine/arcliive/n4y2020/6435
class History {
Dictionary <Edge, bool> VisitedEdges Dictionary<Edge, booZ>(};
History (IEnumerable<Edge> Graph}
VisitedEdges Graph.ToDictionaryi
edge edge, ecf^e false );
bool IsVisited[Edge edge}
VisitedEdges[edge]; void SetVisitediEdge edge) VisitedEdges[edge] true;
void SetUrwisited{Edge edge) VisitedEdges [edge] false;
>
Рис 7. Реализация класса History
Внутри класса реализованы три вспомогательных метода IsVisited, VisitedEdges, SetUnvisited, каждый из которых принимает на вход вершину. Первый метод возвращает для текущей вершины булевое значение, которое показывает была ли она посещена, второй устанавливает вершине значение того, что она была посещена, а третий то, что вершина не была посещена.
Второй класс содержит поле для хранения стека пройденного пути, а также методы для получения текущего стека, добавления в него новой вершины, удаления из него вершины и тд. Пример реализация такого класса представлен на рисунке 8.
class StackWay {
Li$t<Edge> CurrentWaylnfo iist<£(ige>( void AddToWay[Edge edge>
{
CurrentWaylnfo.Add(edge);
}
Edge GetAndRemoveLastEdgeO
{
var last Edge CurrentWaylnfo [CurrentWaylnfo.Count 1]; CurrentWaylnfo.RemnveAt(CurrentWaylnfo.Count 1); lastEdge;
}
Edge GetLastEdgeC) { CurrentWaylnfo.Last(); } List<Ec(ge> GetWayO { CurrentWaylnfo; } int GetNumberByE lenient (ft/ge erfge) { CurrentWaylnfo,LastIndexOf{edge); }
Edge GetElementByNumberUnt Number) |{ CurrentWaylnfo [Number]; }
tool IsEnptyO { CurrentWaylnfo.Count B; }
}
Рис 8. Реализация класса StackWay
Класс StackWay в текущей реализации содержит список вершин CurrentWayInfo, который служит для хранения самого стека пути, а также несколько вспомогательных методов для добавления новой вершины в стек, для удаления вершины из стека, получения последней вершины, индекса вершины и получения вершины по индексу, проверки стека на пустоту.
Третий класс служит для того, чтобы на этапе обработки текущей вершины хранить информацию о том, из какой вершины мы попали в текущую, и какие можем посетить, но еще не посещали. Класс должен содержать словарь, ключами которого являются вершины, а значения -списка вершин, которые можно посетить из текущей.
class ChildDependecy {
Dictionary<Edge, hasbSet<Edge>> ctiildDependecy Di c ti on a ry <£dge F Ha e» () j
ChildDependecy (I£ni;jjierable<£dge> Grspij)
{
childDependecy Graph.ToD:ctionary(
edge edge, edge Wasb5et<Edge>0);
}
/.ist<Fdge> GetAUGrandchildren(Fdge edge] { childDependecy[edge].ToList<£rfpe>(]; }
void AddDependerice(Fi/ge floot, Edge grandchild) { childDependecy [Root].Add(grandCliild}; }
void SetGrandChildUrvisitedForEdge( Edge edge, History history)
{
GetAllGrandchildren[edge).ForEacMc/jiW history. SetUnvisited(child));
>
H
Рис 9. Реализация класса СЫЫБерепёесу
Представленный класс СЫМОерепёесу в текущей реализации имеет публичное поле сЫМОерепёесу, которое является словарем и в качестве ключа хранит вершину, а в качестве значения - список ее вершин-детей. Конструктор такого класса принимает на вход в качестве аргумента весь граф, предоставленный как перечисление вершин, превращает его в словарь, ключи которого вершины, а значения - пустые списки, и запоминает его в поле сЫМБерепёесу.
В текущем классе реализованы вспомогательные методы для получения всех зависимостей текущей вершины, для добавления к вершине новых зависимостей и для установки всем зависимостям вершины состояние «непосещенности».
Реализуем метод поиска всех простых путей графа между двумя заданными вершинами, который принимает на вход два параметра:
начальную и конечную вершины, а возвращает список путей. Реализация метода может иметь следующий вид:
List<List<Edge>> FindWay(Ftfge X, Edge
{
var result /_ist<i-ist<Edge» ();
var history HistoryiGraph);
ifar stack StackWayi);
var childDependecy ChildDependecy (Graph);
stack.AddToWay(X);
(stack.IsErnptyO true)
{
var Current stack.GetLastEdge (); SetGrandchildDependencyi
stack, childDependecy, Current); (Current Y}
{
result.Add{ List<Edge> (stack.GetWayf})}; history.SetVisited(Y); stack. GetAndRemoveLastEdgeO;
}
else {
childDependecy
■SetGrandChildUnvisitedForEdgetCurrent, history); var NeighborsNotVisited
FilterNeighbors (stack, history, Current); [NeighborsNotVisited.Count 6} stack.AddToWay(NeighborsNotVisited[0]};
else
stack.GetAndRemovel_astEdge(); history.SetVisited(Current);
}
}
result;
}
Рис 10. Реализация метода FindWay
Метод FindWay возвращает все наборы вершин от переданной ему вершины Х до вершины У. В его реализации был также использован
Й Инженерный вестник Дона, №4 (2020) ivdon.ru/ru/magazine/arcliive/n4y2020/6435
вспомогательный метод FilterNeighbors, который позволяет получить список непосещенных вершин-соседей переданной в него вершины.
List<Edge> FilterNeighbors( StackWay way, History history, Edge edge)
{
var Neighbors edge.GetNeighborsO; var NeighborsWithoutStack List<Edge>(}; (var t Neighbors}
{
(way.GetNumberByElement(t) 1) NeighborsWithoutStack.Add(t);
>
var NeighborsNotVisited Iist<£c/gre>(); (var t NeighborsWithoutStack)
{
(history.IsVisited(t) false) NeighborsNotVisited.Add(t);
>
NeighborsNotVisited;
}
Рис 11. Реализация метода FilterNeighbors
Замкнутые контуры являются также простыми путями, где начальная и конечная вершины совпадают, поэтому для их поиска можно также воспользоваться методом FindWay(Edge X, Edge Y). Однако его следует немного модифицировать, чтобы не вылетать из метода при первой итерации. Для этого достаточно добавить булевую переменную, благодаря которой будет определяться первая итерация для пропуска проверки if (Current == Y), а в конце ее значение будет меняться на противоположное. А если передавать в метод FindWay вместо самой вершины ее соседей и в получившиеся наборы вершин в начало вставить нужную нам вершину, то мы получим все замкнутые в нее пути, не модернизируя метод.
После нахождения всех простых путей и замкнутых контуров достаточно подставить получившиеся значения передаточных функций в формулу 1 для нахождения передаточной функции всей системы. Для ее вычисление следует реализовать отдельный метод.
Из полученного набора вершин методом FindWay можно найти передаточные функции, воспользовавшись методом
GetFunctionsBetweenNeaighbor, реализованном в классе Edge. Однако, учитывая то, что между двумя одинаковыми вершинами могут быть более одного пути, нужно посчитать декартово произведение списков передаточных функций между вершинами. Реализация такого участка кода представлен на рисунке 12, где метод CartesianProducts реализует декартово произведение.
{var way result)
var functionOfDirectWays
List<i.istc£trir?3»0; tint i 0; i way.CountO 1; i )
{
functionOfDirectWays
.Add(way[i].GetFunctionsBetweenNeaighbor(way[i 1]));
>
functions,Add( CartesianProducts(functionOfDirectWays)};
List<string> CartesianProductsi List<List<stTing» functionOfDirectWays)
var cartesianProducts functionOfDirectWays.First[>; (int i 1; i functionOfDirectWays.CountO; i )
{
cartesianProducts { pr cartesianProducts
fun functionOfDirectWays [i]l pr fun) .ToListO;
>
cartesianProducts;
»Инженерный вестник Дона, №4 (2020) ivdon.ru/ru/magazine/arcliive/n4y2020/6435
Рис 12. Поиск передаточных функций и реализация метода СаА^апРгоёи^
Рис 13. Пример структурной схемы САУ
уаг е = пек
уаг и = пек Е(1ее();
уаг I = пел Ес^еО;
е.АсШе1еИЬог(и, "иЗ");
е.АсШеабЬЬог(и,
и.А(Ше1еЬЬог(2,
г.АсШе1БНЬог(1ь
уаг йгарИ = пею { е., ил г };
Рис 14. Инициализация структурной схемы
На рисунке 14 представлена инициализация вершин и самого графа для структурной схемы САУ, изображенной выше. При использовании на них методов, представленных в текущей работе, были получены передаточные функции прямых путей в общем виде (рис 15). Для поиска замкнутых путей
Й Инженерный вестник Дона, №4 (2020) ivdon.ru/ru/magazine/arcliive/n4y2020/6435
использовался также метод FindWay, в который передавались по очереди вершины в качестве первого аргумента, а вторым аргументом ее соседи, после чего в каждый полученный список вершин добавлялась в начало вершина, переданная первым аргументом (рис 16).
Рис 15. Результат поиска передаточных функций прямых путей
var results =
(from edg in Graph
. ■ n edg .Oetritighbors()
- ways ■ FindWay(n, edg, Graph) - 5electMany(*i -■ rTulist() ¿elect nri-, { edg, ways }) T"oList(); foreach (war way in results.ToList(J) | (
.ar edg = way.edg; way.ways,Insert{0, edg}}
I )_
(n tvi SystenrvCollectio ns.G er emt.Msco rhb_C o lletti-or Debu gVi ew< stri n g > ((new SyiterrvC ollef tii | P ■ "w 1 5" (n ew Syste nv C cH e c li o ns.Geri enc ,Mk of lib_t&Nettiori Debu-gVi t ,v<siri ng > ((ntw Sy Jttm .C o I lett n | P -' w3w2w 5" (fiflw Systsn.Collectio ns.Girsk.Mscorlib_C o I littionDebugVi ew< stri ng > [[new Systtm.C ollectk | P *
Рис 16. Результат поиска передаточных функций замкнутых путей
Таким образом можно рассчитать передаточные функции для любой схемы АСУ, потратив при этом минимум времени и усилий, что позволяет студентам проверять свои расчеты. Программа может использоваться для упрощения расчетов в научных работах и стать основой полноценной программы для использования на предприятиях, что позволит разгрузить высококвалифицированных инженеров от расчетов и нагрузить менее квалифицированных, так как использование программы требует минимум знаний [10].
Литература
1. Лебедев С.К. Математические основы теории автоматического управления. Иваново: ИЭИ, 1989. 149с.
2. Целигорова E.H. Современные информационные технологии и их использование для исследования систем автоматического управления// Инженерный вестник Дона, 2010, №3 URL: ivdon.ru/magazine/archive/n3y2013/1907.
3. Гинис Л. А. Развитие инструментария когнитивного моделирования для исследования сложных систем// Инженерный вестник Дона, 2013, №3 URL: ivdon.ru/ru/magazine/archive/n3y2013/1806.
4. Бесекерский В.А., Попов Е.П. Теория систем автоматического регулирования. М.: Наука, 1972. 768 с.
5. Kuo, Benjamin C. Automatic Control Systems. 2nd Edition. New Jersey: Prentice-Hall, 1967. 653 p.
6. Bolton, W. Newnes. Control Engineering Pocketbook. Oxford: Newnes, 1998. 304 p.
7. Ерофеев А.А. Теория автоматического управления. СПБ.: Политехника, 2013. 302 с.
8. Седжвик Р. Алгоритмы на С++. Фундаментальные алгоритмы и структуры данных. Киев: ДиаСофт, 2001. 1001 с.
9. Скиена С. Алгоритмы. Руководство по разработке. 2-е изд. СПБ.: БХВ - Петербург, 2011. 720 c.
10. Сафаров И.М., Хаматханов Д.И., Калимуллин А. А. Автоматизированная система управления параметрами теплоносителя с удаленным доступом// Инженерный вестник Дона, 2018, №2 URL: ivdon.ru/ru/magazine/archive/n2y2018/4912.
N Инженерный вестник Дона, №4 (2020) ivdon.ru/ru/magazine/arcliive/n4y2020/6435
References
1. Lebedev S.K. Matematicheskie osnovy' teorii avtomaticheskogo upravleniya [Mathematical foundations of automatic control theory]. Ivanovo: IEI, 1989. 149p.
2. Celigorova E.H. Inzhenernyj vestnik Dona, 2010, №3 URL: ivdon.ru/magazine/archive/n3y2013/1907.
3. Ginis L.A. Inzhenernyj vestnik Dona, 2013, №3 URL: ivdon.ru/ru/magazine/archive/n3y2013/1806.
4. Besekerskij V.A., Popov E.P. Teoriya sistem avtomaticheskogo regulirovaniya [Theory of automatic control systems]. M.: Nauka, 1972. 768p.
5. Kuo, Benjamin C. Automatic Control Systems. 2nd Edition. New Jersey: Prentice-Hall, 1967. 653 p.
6. Bolton, W. Newnes. Control Engineering Pocketbook. Oxford: Newnes, 1998. 304 p.
7. Erofeev A.A. Teoriya avtomaticheskogo upravleniya. [Theory of Automatic Control]. SPB.: Politechnika, 2013. 302 p.
8. Sedzhvik R. Algoritmy' na S++. Fundamentalnye algoritmy' i struktury' dannyx [Algorithms in C++. Fundamental algorithms and data structures]. Kiev: Diasoft, 2001. 1001 p.
9. Skiena S. Algoritmy'. Rukovodstvo po razrabotke [Algorithms. Development guide]. vol 2. SPB.: BHV-Petersburg, 2011. 720 p.
10. Safarov I.M., Xamatxanov D.I., Kalimullin A.A. Inzhenernyj vestnik Dona, 2018, №2 URL: ivdon.ru/magazine/archive/n2y2018/4912.