Задание для самостоятельной работы. 1. Разработайте конечный автомат согласно рис.2
1. Разработайте конечный автомат согласно рис.2. Для активации автомата примените синусоидальный генератор. В результате конечный автомат должен иметь 2 выхода (управление прямым и реверсивным контакторами), 1 событийный вход (для генератора синусоидальных сигналов), 3 входа данных для управления (команды «Вперед», «Назад», «Стоп») и 3 состояния. . В качестве кнопок управления для подачи команд и индикаторов состояний используйте элементы группы Dials&Gauges Blockset, библиотека Global Majic ActiveX library (Buttons – кнопку, LEDs - светоиндикаторы).
2. На базе предыдущей реализации конечного автомата, разработайте конечный автомат для управления электроприводом задвижки согласно представленному ранее техническому заданию. В качестве сигнала датчика положения используйте выход модели двигателя по повороту вала двигателя
3. Изменение момента нагрузки в задвижке происходит согласно нагрузочной диаграмме в функции от положения клина задвижки. Модифицируйте S-функцию, отвечающую за механизм таким образом, чтобы она отражала реальную работу задвижки.
В реальных системах управления применяется программный код. Данный код может быть реализован различными методами:
1. Метод логической функции
2. Табличный метод
3. Алгоритмический метод.
Рассмотрим создание программы логического управления алгоритмическим методом.
В качестве языка программирования будем использовать язык С, краткие сведения о котором приведены ниже (этих сведений достаточно для написания S-функций в среде Симулинк)
Основными средствами языка С, которые будут использоваться в данном практикуму, являются следующие:
- Операторы +, -, *, /, <, >, <=, >=, = =,!=,
- Комментарии вида / * ... * /; //
- Набор встроенных функций;
- Оператор if , if … else ….
В рассматриваемом языке существует ключевые слова, которые нельзя использовать для названий переменных и функций. Эти слова следующие: var, void, main, while, return, if, else.
В языке определены комментарии одного вида: такой комментарий начинается с символа /* и заканчивается символами */. Между звездочкой и слешем не должно быть никаких пробелов. Любой текст, расположенный между начальными и конечными символами комментария, программой игнорируется.
Комментарии могут находиться в любом месте программы и могут быть многострочными (начинаться в одном месте, а заканчиваться в другом). Комментарии не могут быть вложенными. То есть в одном комментарии не может находиться другой.
Если необходимо закомментировать одну строчку программы, можно использовать сочетание //.
При объявлении перменных необходимо руководствоваться следующим: первый символ должен быть обязательно буквенным, или символом подчеркивания, последующие символы должны быть буквами, цифрами или символами подчеркивания.
Например: temp, count_ , set523 - это правильная запись, а 5count, t!set, r...temp – неправильная
Общая форма объявления переменной имеет такой вид:
float static x = 0; - для задания переменной «x» в формате плавающей запятой и начальной инициализацией «0»
int static y; для задания переменной «y» в формате целого числа.
В языке предусмотрены основные математические операции:
- - Вычитание, также унарный минус ( умножает операнд на -1)
+ - Сложение
* - Умножение
/ - Деление
Приоритет выполнения арифметических операций следующий:
Высокий: - (унарный минус)
Средний: * /
Низкий: + -
Операции с одинаковым приоритетом выполняются слева направо. Используя круглые скобки можно изменить порядок вычислений, они придают операции (или последовательности операции) наивысший приоритет.
Пример:
int x = -30, y = 0;
x = x * 5 - 7 / (35 + 6); /* Здесь переменная примет значение -150.017 */
y = x - 10 * 20; /* Здесь переменная примет значение -350.017 */
В языке предусмотрены следующие операции сравнения:
> - Больше чем
>= - Больше или равно
< - Меньше чем
<= - Меньше или равно
!= - Не равно
== - Равно
Как и в арифметических выражениях, для изменения порядка выполнения операций сравнения можно использовать круглые скобки.
Общая форма оператора if следующая:
if (выражение) { оператор; }
else { оператор; }
Здесь оператор может быть одним оператором или блоком операторов. Фраза else может отсутствовать.
Если выражение истинно, то выполняется оператор, следующий за if. В противном случае выполняется оператор, следующий за else.
Пример реализации оператора if:
int x = 30, y1 = 0, y2 = 0;
if (x > 0) y1 = 10; /* Переменная примет значение 10 */
if (x == 20) y2 = 5;} /* Переменная примет значение 20 */
else y2 = 20;
Разработка программы управления может быть сведена к следующему:
1. Выбираются логические режимы работы электропривода, характерные и необходимые для достижения цели функционирования электропривода.
2. На основе выделенных логических режимов работы формируются компоненты, позволяющие достичь цели каждого из режимов.
3. В каждом компоненте количественно определяется условие достижения цели работы компонента.
4. Для каждого компонента разрабатывается процедура управления, которая позволяет достигать требуемую область цели.
5. Для ключевых событий компонента (достижения цели, выход за рабочую область наблюдения координат и т.д.) формируется номер того компонента, который позволяет наиболее эффективно решать задачи управления при текущем состоянии координат и событиях системы.
Разработанное по данной методике управление может быть представлено графически. На основании выделенных компонентов и условий переходов рисуется граф системы. В узлах графа показываются функции управления и восстановления координат, на ребрах – условия формирования событий переходов между узлами. Каждое ребро является однонаправленной стрелой, указывающее направление перехода для данного события. Предлагаемый алгоритм образует каркас управления системы, позволяющий выделить все логические состояния системы управления и соблюсти ограничения на работоспособность процедур. Каркас задает иерархию выполнения алгоритмов для последовательного достижения целей управления, и таким образом формирует последовательно-иерархическое управление электроприводом.
Реализация логического управления по приведенному техническому заданию, будет выглядеть следующим образом:
float static out_o=0;
float static out_z=0;
float static out_oing=0;
float static out_zing=0;
float static command_=0;
float static speed=0;
float static position=50;
float static mode=1;
float static a=0;
void main()
{while(1)
{ if (mode==0)
{ speed=0; out_oing=0;out_zing=0;
if (position==0) {out_z=1;out_o=0;}
if (position==100) {out_z=0;out_o=1;}
if (command_==1) {mode=1;}
if (command_==2) {mode=2;}
}
if (mode==1)
{ speed=50; out_z=0;
out_o=0; out_oing=1;
if (command_==0) {mode=0;}
position=position+1;
if (position>100) position=100;
if (position==100) { mode=0; }
}
if (mode==2)
{ speed=-50;
out_zing=1;
out_z=0;out_o=0;
if (command_==0) {mode=0;}
position=position-1;
if (position<0) position=0;
if (position==0) { mode=0;}
} command_=55; a=0; while(a<55555) { a=a+1; }
}
}