Занятие 1. Создание моделей в среде Симулинк
Среда визуального моделирования Симулинк содержит большое количество блоков, которые представляют собой математические модели различных устройств, а также блоки, реализующие типовые звенья, применяемые в технических системах. Кроме того, в среде Симулинк содержатся блоки, которые позволяют визуализировать процессы моделирования и формировать различные сигналы задания.
Для запуска среды Симулинк необходимо запустить приложение Матлаб и нажать на панели инструментов кнопку «Simulink». В результате появляется окно Simulink Library Browser,в котором раскроется список групп компонентов библиотеки Симулинка.В данном окне выбрать иконку «Create a new model» (создать новую модель). В результате откроется окно редактирования модели (рис.1).
Рис.1
В окно редактирования моделей возможно помещать различные компоненты, предлагаемые библиотекой компонентов Симулинк. Для примера, перетащите из библиотеки компонентов (группа Simulink) осциллограф (Scope, подгруппа Sinks) и генератор синусоидальных сигналов (Sine Wave, подгруппа Sources) и соедините их между собой (см.рис.2.).
После двойного нажатия на компоненте Scope появится окно визуализации координат.
После двойного нажатия на компоненте Sine Wave появится окно параметров настройки выходного сигнала (амплитуда, частота и т.д.).
Нажмите кнопку запуска моделирования (см.рис.1). Симулинк смоделирует процессы в модели за время, задаваемое в окне «Задание времени моделирования» (рис.1).
Рис.2
Примечание. Если в параметр «Задание времени моделирования» задать значение «inf», то становится возможным наблюдать моделируемые процессы бесконечно долго (до нажатия кнопки останова моделирования, показанной на рис.1.)
Задания для самостоятельной работы
1. Выясните, какие еще компоненты задания сигналов предлагает Симулинк, приведите 5 примеров с осциллограммами. Каким образом можно визуализировать несколько процессов с помощью одного компонента Scope?
2. Каким образом можно отмасштабировать выводимый на экран компонента Scope сигнал по времени и по амплитуде (исследуйте данный компонент с помощью кнопки задания параметров визуализации, рис.2)?
Как правило, при моделировании берется исходный сигнал, пропускается через моделируемую систему, которая преобразует исходный сигнал, и после этого выходы моделируемой системы визуализируются для последующего анализа. В выполненной модели было показано задание исходного сигнала с последующей визуализацией. Выполним преобразование сигнала с одновременной визуализацией исходного и преобразованного сигнала. В качестве преобразователя сигнала используем интегратор, который находится в подгруппе Continuous. Моделируемая система и результаты показаны на рис.3.
Как можно видеть на полученных осциллограммах, сигналы удовлетворяют равенству
Задание для самостоятельной работы
1. Смоделируйте реакцию апериодического звена 1-ого порядка на синусоидальный входной сигнал частотой 3 Гц и установите влияние постоянной времени данного звена на выходной сигнал (используйте компонент задания передаточной функции).
В рассмотренных примерах действия производились с абстрактными математическими компонентами и компонентом визуализации Scope. Для моделирования работы электромеханических систем воспользуемся группой SimPowerSystems. В качестве примера рассмотрим моделирование процесса пуска асинхронного двигателя при подаче на его обмотки напряжения 380 В, 50 Гц.
Как правило, при моделировании электромеханических систем необходимо создать:
- модель источника электроэнергии
- модель электромеханического преобразователя (двигателя)
- модель механизма, который приводится в действие двигателем
- модель системы управления координатами двигателя.
Рис.3
Модель трехфазной электрической сети (источника электроэнергии) можно собрать следующим образом (используя группу SimPowerSystems/Electrical Sources, компонент AC Voltage Source):
Рис.4
В созданной модели необходимо назначить для каждого компонента напряжение 310 Вольт (амплитудное значение фазного напряжения) и частоту 50 Гц. Сдвиг по фазам – 0, 240, 120 градусов для каждого компонента соответственно.
Для того, чтобы модель с примененными компонентами заработала, необходимо (в обязательном порядке!) установить компонент измерения напряжения Voltage Measurement из группы SimPowerSystems/ Measurements (рис.5).
Рис.5
В качестве модели двигателя воспользуемся компонентом Asynchronous Machine SI Units, находящийся в подгруппе SimPowerSystems/Machines. В свойствах компонента необходимо установить тип ротора как короткозамкнутый (Rotor type - Squirrel Cage). Параметры схемы замещения, предлагаемые для редактирования, в рамках данной задачи моделирования изменению не подлежат.
Модель двигателя выдает вектор значений рассчитанных координат. Для визуализации конкретных координат модели двигателя необходимо применить блок Machines Measurement Demux из подгруппы SimPowerSystems/Machines. В свойствах компонента необходимо выбрать подключение к асинхронному двигателю, а также установить «галочки» напротив тех координат, которые подлежат визуализации: ток статора, электромагнитный момент, скорость ротора. К компоненту Machines Measurement Demux становится возможным подключать стандартные компоненты визуализации, например Scope. Полная модель двигателя и электрической сети, а также результаты моделирования процесса включения двигателя, представлены на рис.6.
Перед началом моделирования необходимо задать время моделирования 0,35 секунд, а также установить метод расчета ode23tb через меню окна редактирования Simulation\Configuration Parameters, строка Solver.
Рис.6
Для моделирования наличия механизма в системе нагрузим модель двигателя по входу Tm, для чего к данному входу подсоединим компонент задания константы Constant из подгруппы Simulink/Sources (рис.7). Значение константы будет устанавливать момент нагрузки на валу двигателя, в данном случае рекомендуется установить ее равным значению 40 Нм.
Смоделируйте процесс пуска двигателя при задании значительного момента нагрузки, например 100 Нм. Как будет видно из осциллограммы, двигателю не хватает электромагнитного момента для преодоления момента нагрузки и он не может запуститься. Более того, при таком моменте нагрузки скорость двигателя становится отрицательной, что свидетельствует об активном характере момента нагрузки, что характерно для таких механизмов как кран, лифт и пр.
Рис.7
Для конвейеров, задвижек и прочих механизмов характерен реактивный момент нагрузки, который всегда направлен против направления вращения двигателя, а при отсутствии момента двигателя момент нагрузки равен нулевому значению.
Для моделирования механизма с реактивным моментом сопротивления необходимо разработать специальный компонент, так как такой компонент в стандартной библиотеке Симулинка не предусмотрен.
Создание собственных компонентов в Симулинке возможно благодаря наличию стандартных компонентов S-функций. Данные компоненты позволяют пользователю определять самому количество входов/выходов компонентов, а также устанавливать соотношения между входными и выходными величинами посредством заданных пользователем формул и алгоритмов.
Перед тем, как работать с механизмом S-функций Симулинка, необходимо произвести настройку компилятора Матлаба, для чего в командной строке Матлаба (найти значок “>>” в главном окне Матлаба) ввести команду mex –setup(обязательно поставить пробел перед знаком «-»!!!) и ответить на заданные вопросы. Пример ответов показан ниже.
>> mex -setup
Please choose your compiler for building external interface (MEX) files:
Would you like mex to locate installed compilers [y]/n? y
Select a compiler:
[1] Lcc C version 2.4 in E:\MATLAB7\sys\lcc
[0] None
Compiler: 1
Please verify your choices:
Compiler: Lcc C 2.4
Location: E:\MATLAB7\sys\lcc
Are these correct?([y]/n): y
Try to update options file: D:\Documents and Settings\karakulov\Application Data\MathWorks\MATLAB\R14\mexopts.bat
From template: E:\MATLAB7\BIN\WIN32\mexopts\lccopts.bat
Done . . .
Примечание. Настройку компилятора в Матлабе достаточно проделать только 1 раз.
Прежде чем создать собственный компонент, разберем простейший пример с применением S-функций, в котором происходит домножение входной величины на коэффициент, равный «2».
Откройте новое окно редактирования модели и создайте связку компонентов, показанную на рис.8. Компонент S-Function Builder находится в подгруппе Simulink/User Defined Functions.
Рис.8
Двойным щелчком по компоненту S-Function Builder раскройте окно его свойств (рис.9). Задайте имя файла, в котором будет находится содержимое компонента, в строке S-function name. Откройте закладку Outputs, удалите предлагаемое текстовое содержание и введите строку
y0[0]=2*u0[0];
Здесь:
y0 - обозначает первый выход компонента (отсчет идет с нуля), y0[0] обозначает что выходной вектор имеет размерность 1 (то есть одно число, не массив!).
u0 обозначает первый вход компонента (отсчет идет с нуля), u0[0] обозначает что входной вектор имеет размерность 1 (то есть одно число, не массив).
Рис.9
Таким образом, в рассматриваемом примере входная переменная в компоненте помножается на 2 и произведение выдается на выход.
Для генерации компонента необходимо нажать кнопку Build (построить).
Запустите моделирование. В результате в показаниях компонента Display можно видеть удвоенное значение компонента Constant. Таким образом, S-функция позволяет генерировать компоненты, алгоритм функционирования которых определяет пользователь. При генерации алгоритмов необходимо использовать синтаксис языка С.
Усложним задачу. Допустим, что необходимо создать компонент, который перемножает 2 входных сигнала и на выход выдает их произведение. Для этого в компонент необходимо добавить 2-ой вход. Откройте окно свойств S-функции, закладку Data Properties и во внутренней закладке Inputs нажмите кнопку добавления 2-ого входа (рис.10) с именем u1.
Рис.10.
В закладке Outputs необходимо формулу заменить на
y0[0]=u1[0]*u0[0];
то есть использовать для перемножения оба входа.
После генерации новой S-функции у компонента автоматически появится второй вход, в который необходимо завести константу (рис.11).
Рис.11.
Задание для самостоятельной работы
1. На базе рассмотренного примера, сгенерируйте компонент S-функции с двумя выходами, второй выход должен показывать значение, обратное по знаку сигналу первого выхода.
Вернемся к созданию компонента, реализующего реактивный момент сопротивления. Алгоритм функционирования такого алгоритма будет следующий:
1. Если скорость положительная, то момент сопротивления равен заданному.
2. Если скорость отрицательная, то момент сопротивления равен заданному с обратным знаком.
3. Если скорость равна «0», то момент сопротивления равен 0.
Компонент должен иметь 2 входа:
1. Вход задания момента сопротивления u0[0].
2. Вход сигнала скорости u1[0].
Компонент должен иметь 1 выход: на выходе формируется момент нагрузки двигателя y0[0].
Реализация на языке С данного алгоритма будет следующая:
if (u1[0]>0) y0[0]=u0[0];
if (u1[0]<0) y0[0]= - u0[0];
if (u1[0]==0) y0[0]=0;
Создадим такой компонент, установим его в модель (рис.12) и промоделируем его работу, в том числе и при больших значениях момента (>100Нм).
Примечание. В связи с некоторыми особенностями работы Симулинка, при расчете S-функций для сложных нелинейных систем (в частности, моделей электромеханических преобразователей), необходимо установить строго периодичный вызов S-функций (в закладке Initialization выбрать Sample mode: Discrete, время дискретизации (параметр SampleTimeValue) 0.0001 секунда )
Рис.12
Задание для самостоятельной работы.
1. Проверьте корректность работы компонента, изменяя чередование фаз двигателя, нагрузку, в том числе и знак нагрузки.
2. Сохраните созданную модель под именем «metoda1»
В качестве модели системы управления применим модель простейшего способа управления асинхронным двигателем – посредством 3-фазного пускателя, выполненного на базе механической контактной группы. Библиотека Симулинк предлагает компонент Breaker (подгруппа SimPowerSystems/Elements), который моделирует работу механического контакта. Данный компонент имеет 2 входа и 1 выход.
Вход, который отвечает за управление контактором, обозначен как «>». При подаче на данный вход значения «0» контактор считается разомкнутым, в остальных случаях он замкнут. На рис.13 показано управление тремя контакторами посредством компонента константы. Вход (расположен слева от блока), обозначенный «ð», предназначен для подачи сигнала напряжения на контактор. Выход (расположен справа от блока), обозначенный «ð», предназначен для выдачи сигнала напряжения с контактора.
Рис.13
Применим схему, показанную на рис.13, для подачи сигнала напряжения на асинхронный двигатель. Для этого в разрыв между моделью источника электрической энергии и двигателя установим 3 компонента Вreaker с управлением от компонента задания константы (см.рис.14).
Для моделирования работы полученной схемы необходимо задать время моделирования как inf (бесконечность). Свойства компонента Breaker задать следующие:
Breaker resistance – 0.000001 Ом
Initial state – 0
Snubber resistance - 1e2 Ом
Snubber capcacitance - inf
Рис.14
Задание для самостоятельной работы
Запустите модель с обесточенным двигателем, подайте управляющий сигнал на контакторы при помощи компонента Constant и зафиксируйте переходный процесс возникающий при пуске двигателя. Не останавливая процесса моделирования, обесточьте двигатель и зафиксируйте переходный процесс, возникающий при этом.
Матлаб предлагает возможности по созданию приложения пользовательского интерфейса к разработанным моделям. Данные возможности осуществляются с помощью приложения Матлаба GUIDE. Суть такого интерфейса заключается в том, что изменение параметров и значений компонентов можно производить не непосредственно в редакторе модели, а с помощью внешнего окна, стандартного для приложений Windows. В рассматриваемом примере мы будем задавать момент нагрузки и включение/выключение двигателя из внешнего окна, посредством стандартной кнопки и слайдера (линейка «прокрутки») Windows.
Для использования возможностей создания пользовательского интерфейса запустите мастер создания приложений GUIDE (кнопка «GUIDE» на панели инструментов основного окна Матлаба). В результате запустится окно мастера приложений (рис.15).
Нажмите кнопку «ОК», после чего раскроется редактор пользовательского интерфейса (рис.16).
В редакторе создайте 1 слайдер и 2 кнопки, выбрав их на левой панели и растянув в поле редактора. Слайдер будет отвечать за задание момента нагрузки. Левая кнопка будет отвечать за старт двигателя, правая – за обесточивание (рис. 16).
Рис.15
Рис.16.
Вызовите окно свойств левой кнопки с помощью двойного клика по ней. В свойстве «String» впишите название кнопки исходя из ее назначения. Аналогично поступите с правой кнопкой.
Сохраните файл редактора интерфейса, при этом автоматически появится окно редактирования скриптов (кодов) Матлаба. Найдите в раскрывшемся скрипте Матлаба строку:
function pushbutton1_Callback(hObject, eventdata, handles)
Данная строка описывает наличие реакции на нажатие кнопки pushbutton1 (в данном случае это одна из кнопок интерфейса).
После данной строки можно написать желаемый код, который должен выполняться при нажатии левой кнопки. В данном случае необходимо с помощью данной кнопки подать напряжение на модель двигателя, то есть присвоить значению константы единицу.
Присвоение значения компоненту осуществляется с помощью команды Матлаб set_param и заданием соответствующих параметров команды. Например, если необходимо задать значение «1» для компонента константы Constant1, то необходимо подать команду
set_param('metoda1/Constant1','Value','0')
где:
metoda1 – имя файла, под которым Симулинк сохранил созданную модель в окне редактирования модели.
Constant1 – имя компонента задания константы (см.в редакторе модели).
Value – свойство, отвечающее за выходной сигнал компонента
0 – присваемое значение для свойства Value
Примечание. Получить имя файла и компонента можно следующим образом: выделите требуемый компонент в текущей модели и введите в командную строку Матлаба команду gcb.
Считывание значения с компонента осуществляется с помощью команды Матлаб get_param. Например, если необходимо вывести значение компонента Constant1 в элемент Static Text графического интерфейса, то необходимо сгенерировать в скрипте следующие команды:
text_val=get_param('metoda1/Constant1','value')
set(handles.text1, 'String', text_val);
В данном примере первая строка считывает значение константы и сохраняет его в переменной text_val, а вторая строка осуществляет вывод этого значения на экран в элемент Text1.
Компонент Constant1 отвечает за включение/выключение контакторов в рассматриваемой модели.
Таким образом, для подачи команд на движение необходимо наличие в текстовом редакторе следующих строк:
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
set_param('metoda1/Constant1','Value','1')
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
set_param('metoda1/Constant1','Value','0')
Данные строки позволяют присвоить значения 0 или 1 константе управления при нажатии соответствующей кнопки.
Примечание. Набор символов, начинающихся с % означает комментарий и не выполняется в скрипте.
Для задания момента сопротивления необходимо сначала считать значения со слайдера, а затем по известной технологии выставить значение константы, отвечающей за задание момента сопротивления. Считывание параметра слайдера осуществляется с помощью команды get. Пример задания момента сопротивления для рассматриваемой модели будет следующим:
function slider1_Callback(hObject, eventdata, handles)
slider_value = get(hObject,'Value')
set_param('metoda1/Constant','Value',num2str(slider_value*100))
Примечание.Первую строку текста необходимо отыскать в скрипте, остальные две ввести вручную. Функция num2str обеспечивает перевод числового типа данных в текстовый.
После окончания редактирования скрипта закройте окно редактора скриптов.
В окне редактирования интерфейсов на панели инструментов нажмите кнопку RUN (запустить). Расположите окна появившегося приложения пользовательского интерфейса и редактора модели таким же образом, как показано на рис.17. Нажимая кнопки и передвигая бегунок слайдера, убедитесь в изменении соответствующих значений констант. Запускать моделирование не обязательно.
Примечание. Если в компоненте задания константы показывается значок -С- , то необходимо увеличить размеры компонента на экране для обеспечения полного вывода значения константы.
Рис.17
Задание для самостоятельной работы
1. Запустите модель с бесконечным временем моделирования и убедитесь, что созданное приложение позволяет управлять процессом моделирования.
2. Разработайте модель, в которой будет осуществляться изменение чередование фаз двигателя (а соответственно направление скорости вращения) посредством дополнительных коммутаторов. Добавьте в приложение управления соответствующие компоненты, необходимые для включения реверса двигателя.
3. В редакторе интерфейса добавьте компонент Static Text и обеспечьте отображение значения задаваемого момента нагрузки.
Если вы выполнили задание, то результат моделирования и модель показаны на рис.18, а соответствующая часть скрипта будет выглядеть как (файл модели Симулинка в данном случае назван как «metoda4»):
% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
set_param('metoda4/Constant3','Value','1')
set_param('metoda4/Constant2','Value','0')
set_param('metoda4/Constant1','Value','1')
% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
set_param('metoda4/Constant1','Value','0')
set_param('metoda4/Constant2','Value','0')
set_param('metoda4/Constant3','Value','0')
% --- Executes on slider movement.
function slider1_Callback(hObject, eventdata, handles)
slider_value = get(hObject,'Value')
set_param('metoda4/Constant','Value',num2str(slider_value*100))
% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
set_param('metoda4/Constant1','Value','0')
set_param('metoda4/Constant2','Value','1')
set_param('metoda4/Constant3','Value','1')
Примечание. В данном примере необходимо применить раздельное управление для двух компонентов Breaker прямого включения, двух компонентов Breaker реверсивного включения, и одного компонента общей фазы (компоненты Constant1, Constant2, Constant3 на рис.18 соответственно).
Для того, чтобы выводить значение слайдера в элемент Static Text, необходимо в фунцию
function slider1_Callback(hObject, eventdata, handles)
вписать строку
set(handles.text1, 'String', get(hObject,'Value')*100);
В данном случае в элементе GUI Static Text будет показываться значение слайдера, домноженное на 100.
Более правильным решением будет прямой вывод в элемент Static Text значения из компонента модели. Пример задания значения компонента константы через слайдер и одновременное считывание значения константы с визуализацией посредством компонента GUI Static Text приведен ниже:
function slider1_Callback(hObject, eventdata, handles)
slider_val=get(hObject,'Value')
set_param('metoda4/Constant','value', num2str(slider_val*100));
text_val=get_param('metoda4/Constant','value')
set(handles.text1, 'String', text_val);
Полученная модель является визуально громоздкой ввиду наличия большого количества компонентов на экране. Для объединения компонентов в единый блок Симулинк предлагает возможность использовать компонент подсистемы с именем Subsystem (группа Simulink, подгруппа Ports & Subsystems).
Рис.18
Для изучения работы данного компонента откройте новое окно редактора модели и соберите систему, показанную на рис.19.
Рис.19
Сделайте двойной щелчок мыши по компоненту Subsystem, в результате откроется окно редактирования подсистемы (содержимое окна приведено на рис.20.).
Рис.20
Как можно видеть, данная подсистема передает входной сигнал с порта входа in1 без изменений на порт выхода out1. Разорвем линию, соединяющую порты in1 и out1 (выделите мышью линию и нажмите клавишу Delete). Установим в разрыв компонент Gain (домножение на коэффициент), который находится в группе Simulink, подгруппа Commonly Used Blocks, и соединим его вход и выход с портами (рис.21.). Задайте значение коэффициента равным «5» (окно свойств компонента откроется после двойного щелчка мышью по нему).
Рис.21
Вернемся к предыдущему окну редактирования модели с подсистемой. Для удобства понимания действия подсистемы присвоим ее имя, показывающее её суть. Для этого под компонентом на слове Subsystem щелкните мышью, удалите имеющееся название подсистемы и введите «multiplication 5» (домножение 5), после чего щелкните указателем мыши над компонентом. В результате компонент приобрел комментарий, способствующий лучшему пониманию работы всей модели.
Примечание. Аналогичные действия можно проводить с любым компонентом. Не рекомендуется печатать названия русскими буквами.
Запустите моделирование, в результате в компоненте Display появится значение, соответствующее перемножению исходной константы на коэффициент подсистемы.
Реализованная подсистема имеет 1 вход и один выход и относится к классу SISO (single input – single output). Обычно подсистемы имеют несколько входов и выходов (системы MIMO – multyinput - multyoutput). Технология установки дополнительного выхода выглядит следующим образом:
1. Откройте окно подсистемы.
2. Выделите мышью выход out1 .
3. скопируйте компонент out1 в буфер обмена (например, с помощью комбинации клавиш Ctrl-C).
4. Вставьте скопированный компонент из буфера обмена в окно редактирования подсистемы (например, с помощью клавиши Ctrl-V).
5. Расположите появившийся компонент Out2 рядом с компонентом Out1.
6. Убедитесь, что на компоненте исходной подсистемы появился дополнительный выход Out2.
Установка дополнительного порта входа происходит аналогично.
Для демонстрации действия созданной многовыходной подсистемы, выполните указанные действия, после чего соберите схему модели, показанную на рис. 22
Рис.22
Подсоедините к новому выходу компонент Display (рис.23) и запустите моделирование.
Рис.23
Таким образом, с помощью компонента подсистем Subsystem можно разгрузить окно редактирования от большого количества компонентов, объединив некоторые из них в функционально законченные блоки.
Задание для самостоятельной работы.
В разработанной модели создайте подсистемы, в которых объединены константы задания работы реверсивной и нереверсивной контакторных групп.
Варианты индивидуальных заданий (выполняются на основе модели рисунка 18)
1. Доработать модель таким образом, чтобы напряжение трехфазной сети менялось посредством слайдера интерфейса GUI.
2. Доработать модель таким образом, чтобы момент нагрузки изменялся в зависимости от скорости вращения двигателя (с увеличением скорости момент нагрузки возрастает).
3. Разработать S-функцию, позволяющую в данной модели определять наличие обрыва фазы двигателя.
4. Разработать S-функцию, позволяющую в данной модели реализовать времятоковую защиту.
5. Используя выход модели двигателя по углу поворота, разработать систему, обесточивающую двигатель при достижении заданного значения угла поворота.
6. Вывести текущий режим работы («останов», «движение вперед», «движение назад») на окно интерфейса GUI в текстовом формате.
7. Вывести значение действующего тока двигателя на окно интерфейса GUI.
8. Вывести значение действующего напряжения электрической сети на окно интерфейса GUI.