- •1. Синтез сау графическим методом используя лах. 4
- •2. Моделирование аналоговой сау. 5
- •3. Построение переходного процесса. 6
- •4. Моделирование сау с цифровым корректирующим устройством. 7
- •4.3. Аналоговая сау с цифровым корректирующим устройством, полученным стандартным z-преобразованием.
- •1. Синтез сау графическим методом используя лах.
- •2. Моделирование аналоговой сау.
- •2.1. Алгоритм составления модели инерционного звена.
- •3. Построение переходного процесса.
- •4. Исследование цифровой .Сау способом дискретизации непрерывного регулятора
- •4.1. Исследование сау с дискретизацией регулятора по способу Тастина.
- •4.2. . Исследование сау с дискретизацией регулятора методом прямоугольников.
- •4.3. Аналоговая сау с цифровым корректирующим устройством, полученным стандартным z-преобразованием.
- •2.2. Моделирование изодромного звена.
- •5 Выводы . Вывод: в результате нахождения максимального периода дискретизации получили следующие результаты:
- •6. Список использованной литературы.
- •Приложение Листинг программы.
5 Выводы . Вывод: в результате нахождения максимального периода дискретизации получили следующие результаты:
Для цифрового корректирующего устройства, полученного при помощи преобразования Тастина, максимальный период дискретизации T0 равен 0,0008 с.
Для цифрового корректирующего устройства, полученного при помощи преобразования прямоугольников, максимальный период дискретизации T0 равен 0,001 с.
Для цифрового корректирующего устройства, полученного с помощью стандартного z-преобразования, максимальный период дискретизации T0 равен 0,008 с.
Из полученных результатов работы можно сделать общий вывод
Наибольший период дискретизации, при сохранении заданных требований к переходному процессу в данной САУ наблюдался у корректирующего устройства, полученного с помощью преобразования прямоугольников. Поэтому корректирующее устройство, полученное с помощью преобразований прямоугольников является наиболее приемлемым для данной САУ, так как требует менее частой корректировки состояния объекта управления при соблюдения заданных требований к переходному процессу.
6. Список использованной литературы.
1. Основы теории многосвязных систем автоматического управления летательными аппаратами: Учеб. Пособие / С. Ф. Бабак, В.И. Васильев, Б.Г. Ильясов и др. ; Под ред. М.Н. Красильщикова. – М.: Изд-во МАИ, 1995. – 188 с.
2. Смит Дж. М. Математическое и цифровое моделирование для инженеров и исследователей. М., Машиностроение, 1980.
3. Изерман Р. Цифровые системы управления. Пер. с англ. М.: Мир, 1984. 541 с.
4. Многоуровневое управление динамическими объектами / В.И. Васильев, Ю.М. Гусев, В.Н. Ефанов и др. Под ред. В.Ю. Рутковского и С.Д. Землякова. – М.: Наука, 1987. 309 с.
5. Теория линейных систем автоматического регулирования и управления
Попов Е.П. М.: Наука 1989
Приложение Листинг программы.
Текст программы на языке Turbo Pascal для построения переходных процессов САУ.
UNIT MDrawFun;
INTERFACE
USES Graph;
TYPE
Float=Single;
PROCEDURE DrawFun(N:Integer;VAR x,y:ARRAY OF Float;
WMinX,WMinY,WMaxX,WMaxY:Integer;Text:STRING;Color:Integer);
IMPLEMENTATION
CONST
{Максимальные высота и ширина одной буквы шрифта графика}
CharMaxWidth=8;
CharMaxHeight=8;
MaxStringChars=5;
Delta:Float=0.000001;
VAR
xScale,yScale,xOrigin,yOrigin:Float;
WindowMinX,WindowMinY,WindowMaxX,WindowMaxY:Integer;
xMin,yMin,xMax,yMax:Extended;
{Специальное округление, для выбора шага масштабной сетки}
FUNCTION MyRound(x:Float):Float;
BEGIN
IF x>0.0
THEN MyRound:=Trunc(x+0.9)
ELSE MyRound:=Trunc(x-0.1)
END;
{Выбор масштаба графика,
Ввод:
координаты окна (WindowMinX,WindowMinY,WindowMaxX,WindowMaxY:Integer;)
минимумы и максимумы функции (xMin,yMin,xMax,yMax:Extended)
Вывод:
множители и смещения (xScale,yScale,xOrigin,yOrigin:Extended;)
}
PROCEDURE DrawFunZoom;
BEGIN
IF xMax-xMin>Delta THEN xScale:=(WindowMaxX-WindowMinX)/(xMax-xMin);
IF yMax-yMin>Delta THEN yScale:=(WindowMaxY-WindowMinY)/(yMax-yMin);
IF xScale<Delta THEN xScale:=yScale;
IF yScale<Delta THEN yScale:=xScale;
IF (yScale<Delta) AND (xScale<Delta)
THEN
BEGIN
xScale:=1.0;
yScale:=1.0
END;
{Закоментирован выбор одинакового масштаба по осям.}
{IF xScale<yScale
THEN yScale:=xScale
ELSE xScale:=yScale;}
xOrigin:=(WindowMinX+WindowMaxX-(xMax+xMin)*xScale)/2.0;
yOrigin:=(WindowMinY+WindowMaxY+(yMax+yMin)*yScale)/2.0
END;
{Расчёт экранной координаты точки по X,
ввод:
координата X точки (параметр x:Extended)
вывод:
экранная координата X точки
}
FUNCTION DrawFunX(x:Extended):Integer;
BEGIN
DrawFunX:=Round(xOrigin+x*xScale)
END;
{Расчёт экранной координаты точки по Y,
ввод:
координата Y точки (параметр y:Extended)
вывод:
экранная координата Y точки
}
FUNCTION DrawFunY(y:Extended):Integer;
BEGIN
DrawFunY:=Round(yOrigin-y*yScale)
END;
PROCEDURE DrawFun(N:Integer;VAR x,y:ARRAY OF Float;
WMinX,WMinY,WMaxX,WMaxY:Integer;Text:STRING;Color:Integer);
VAR
I:Integer;
yStep,yStepCur,yStepMin,yStepMax:Float;
xStep,xStepCur,xStepMin,xStepMax:Float;
xText,yText:Integer;
S:STRING;
BEGIN
xMin:=x[0];
xMax:=x[0];
yMin:=y[0];
yMax:=y[0];
FOR I:=1 TO N-1 DO
BEGIN
IF x[I]<xMin
THEN xMin:=x[I];
IF x[I]>xMax
THEN xMax:=x[I];
IF y[I]<yMin
THEN yMin:=y[I];
IF y[I]>yMax
THEN yMax:=y[I]
END;
{Теперь найдём область окна, где будет нарисован сам график.}
WindowMinX:=WMinX;
WindowMaxX:=WMaxX;
WindowMinY:=WMinY;
WindowMaxY:=WMaxY;
{Над графиком может быть надпись. Если она есть, отсекаем
верхнюю прямоугольную область окна на высоту шрифта.}
IF Text<>''
THEN WindowMinY:=WindowMinY+CharMaxHeight;
{Если ось X проходит в верхней части графика, значения X
будем проставлять наверху и т.д.}
IF (Abs(yMin)>Abs(yMax))
THEN WindowMinY:=WindowMinY+MaxStringChars*CharMaxHeight
ELSE WindowMaxY:=WindowMaxY-MaxStringChars*CharMaxHeight;
{Если ось Y проходит в правой части графика, значения Y
будем проставлять справа и т.д.}
IF (Abs(xMin)<Abs(xMax))
THEN WindowMinX:=WindowMinX+MaxStringChars*CharMaxWidth
ELSE WindowMaxX:=WindowMaxX-MaxStringChars*CharMaxWidth;
DrawFunZoom;
SetColor(White);
xStep:=CharMaxWidth/xScale;
xStep:=exp(MyRound(ln(xStep)/ln(10.0))*ln(10.0));
xStepMin:=Trunc(xMin/xStep)*xStep;
xStepMax:=Trunc(xMax/xStep+1.0-delta)*xStep;
xStepCur:=xStepMin;
SetTextStyle(0,1,1);
{Если ось Y проходит в правой части графика, значения Y
будем проставлять справа и т.д.}
IF (Abs(yMin)>Abs(yMax))
THEN
BEGIN
SetTextJustify(CenterText,BottomText);
yText:=DrawFunY(yMax)
END
ELSE
BEGIN
SetTextJustify(CenterText,TopText);
yText:=DrawFunY(yMin)
END;
WHILE (xStepCur<xStepMax) DO
BEGIN
IF (Abs(xStepCur)<Delta)
THEN SetLineStyle(SolidLn,0,NormWidth)
ELSE SetLineStyle(DottedLn,0,NormWidth);
Line(DrawFunX(xStepCur),DrawFunY(yMin),
DrawFunX(xStepCur),DrawFunY(yMax));
Str(xStepCur:0:2,S);
OutTextXY(DrawFunX(xStepCur),yText,S);
xStepCur:=xStepCur+xStep
END;
yStep:=CharMaxHeight/yScale;
yStep:=exp(MyRound(ln(yStep)/ln(10.0))*ln(10.0));
yStepMin:=Trunc(yMin/yStep)*yStep;
yStepMax:=Trunc(yMax/yStep+1.0-delta)*yStep;
yStepCur:=yStepMin;
SetTextStyle(0,0,1);
{Если ось X проходит в верхней части графика, значения X
будем проставлять наверху и т.д.}
IF (Abs(xMin)>Abs(xMax))
THEN
BEGIN
SetTextJustify(LeftText,CenterText);
xText:=DrawFunX(xMax)
END
ELSE
BEGIN
SetTextJustify(RightText,CenterText);
xText:=DrawFunX(xMin)
END;
WHILE (yStepCur<yStepMax) DO
BEGIN
IF (Abs(yStepCur)<Delta)
THEN SetLineStyle(SolidLn,0,NormWidth)
ELSE SetLineStyle(DottedLn,0,NormWidth);
Line(DrawFunX(xMin),DrawFunY(yStepCur),
DrawFunX(xMax),DrawFunY(yStepCur));
Str(yStepCur:0:2,S);
OutTextXY(xText,DrawFunY(yStepCur),S);
yStepCur:=yStepCur+yStep
END;
SetColor(Color);
SetTextStyle(0,0,1);
SetTextJustify(CenterText,TopText);
OutTextXY((WMaxX+WMinX) DIV 2,WMinY,Text);
SetLineStyle(SolidLn,0,ThickWidth);
MoveTo(DrawFunX(x[0]),DrawFunY(y[0]));
FOR I:=1 TO N-1 DO
LineTo(DrawFunX(x[I]),DrawFunY(y[I]))
END;
BEGIN
WriteLn('MDrawFun 19-05-2003 by Stupin W.A.');
END.
Исходный текст программы на языке Pascal для моделирования САУ.
PROGRAM TAUKurs;
USES CRT,Graph,MDrawFun;
CONST
TimeStep=0.001; {Шаг времени}
NumberPoints=3000; {Число шагов}
T0=0.01; {Период дискретизации для цифровых САУ}
VAR
GD,GM,Method,I:Integer;
time,g,e,v,u,x:Float;
KUX0,KUX1,KUTime,
IMX,IMXDot,
OUX,OUXDot:Float;
AnalogXVector,
TastinXVector,
RectangleXVector,
StandartZXVector,
TimeVector:ARRAY [0..NumberPoints-1] OF Float;
PROCEDURE TrapeziodalIntegral(VAR X,XDot:Float;NextXDot,step:Float);
BEGIN
X:=X+(XDot+NextXDot)*step/2.0;
XDot:=NextXDot
END;
{PROCEDURE RectangularIntegral(VAR X:Float;XDot,step:Float);
BEGIN
X:=X+XDot*step;
END;}
{Инерционное звено. (Апериодическое звено 1-го порядка.)
K
W(S)=-----
T*S+1
. K*Int-Out
Out=---------
T
=>
. K*Int-Out
X=---------
T
Out=X
K и T - параметры звена,
X, XDot - текущее состояние звена
(производная нужна для вычисления интеграла методом трапеций),
Int - значение входного сигнала.
Функция вычисляет новое внутреннее состояние звена
и сигнал на выходе.
Шаг интегрирования общий для всей программы - TimeStep.
}
FUNCTION Inertion(K,T:Float;
VAR X,XDot:Float;
Int:Float):Float;
BEGIN
TrapeziodalIntegral(X,XDot,(K*Int-X)/T,timeStep);
Inertion:=X
END;
{Изодромное звено.
T*S+1
W(S)=K*-----
S
.
Out=K*(T*IntDot+Int)
=>
.
X=Int
Out=K*(T*Int+X)
K и T - параметры звена,
X, XDot - текущее состояние звена
(производная нужна для вычисления интеграла методом трапеций),
Int - значение входного сигнала.
Функция вычисляет новое внутреннее состояние звена
и сигнал на выходе.
Шаг интегрирования общий для всей программы - TimeStep.
}
FUNCTION Isodrome(K,T:Float;
VAR X,XDot:Float;
Int:Float):Float;
BEGIN
TrapeziodalIntegral(X,XDot,Int,timeStep);
Isodrome:=K*(T*Int+X)
END;
{Цифровой аналог изодромного звена (преобразование Тастина).
T0 z+1
W(z)=K*T+K*--*---
2 z-1
Out=PrevOut+K*(T0/2+T)*Int+K*(T0/2-T)*PrevInt
K и T - параметры звена,
PrevInt, PrevOut - предыдущие значения входа и выхода,
PrevTime - время предыдущего срабатывания звена,
Int - текущее значение сигнала на входе.
Функция запоминает значения сигналов на входе и выходе
и вычисляет новое значение сигнала на выходе.
Текущее время общее для всей программы - time.
}
FUNCTION TastinIsodrome(K,T,T0:Float;
VAR PrevInt,PrevOut,PrevTime:Float;
Int:Float):Float;
VAR
Out:Float;
BEGIN
IF (time>=PrevTime+T0)
THEN
BEGIN
Out:=PrevOut+K*(T0/2.0+T)*Int+K*(T0/2.0-T)*PrevInt;
PrevInt:=Int;
PrevOut:=Out;
PrevTime:=PrevTime+T0;
TastinIsodrome:=PrevOut
END
ELSE
TastinIsodrome:=PrevOut
END;
{Цифровой аналог изодромного звена (преобразование прямоугольников).
Функция вычисляет новое внутреннее состояние звена
и сигнал на выходе.
z
W(z)=K*T+K*T0*---
z-1
Out=PrevOut+K*(T+T0)*Int-K*T*PrevInt
K и T - параметры звена,
PrevInt, PrevOut - предыдущие значения входа и выхода,
PrevTime - время предыдущего срабатывания звена,
Int - текущее значение сигнала на входе.
Функция запоминает значения сигналов на входе и выходе
и вычисляет новое значение сигнала на выходе.
Текущее время общее для всей программы - time.
}
FUNCTION RectangleIsodrome(K,T,T0:Float;
VAR PrevInt,PrevOut,PrevTime:Float;
Int:Float):Float;
VAR
Out:Float;
BEGIN
IF (time>=PrevTime+T0)
THEN
BEGIN
Out:=PrevOut+K*(T+T0)*Int-K*T*PrevInt;
PrevInt:=Int;
PrevOut:=Out;
PrevTime:=PrevTime+T0;
RectangleIsodrome:=PrevOut
END
ELSE
RectangleIsodrome:=PrevOut
END;
{Цифровой аналог изодромного звена (стандартное z-преобразование).
K*T0
W(z)=K*T+----
z-1
Out=PrevOut+K*T*Int+K*(T0-T)*PrevInt
K и T - параметры звена,
PrevInt, PrevOut - предыдущие значения входа и выхода,
PrevTime - время предыдущего срабатывания звена,
Int - текущее значение сигнала на входе.
Функция запоминает значения сигналов на входе и выходе
и вычисляет новое значение сигнала на выходе.
Текущее время общее для всей программы - time.
}
FUNCTION StandartZIsodrome(K,T,T0:Float;
VAR PrevInt,PrevOut,PrevTime:Float;
Int:Float):Float;
VAR
Out:Float;
BEGIN
IF (time>=PrevTime+T0)
THEN
BEGIN
Out:=PrevOut+K*T*Int+K*(T0-T)*PrevInt;
PrevInt:=Int;
PrevOut:=Out;
PrevTime:=PrevTime+T0;
StandartZIsodrome:=PrevOut
END
ELSE
StandartZIsodrome:=PrevOut
END;
{--------------Начало программы------------------}
BEGIN
WriteLn('TAUKurs 27,29,30-05-2003, 1-06-2003 by Stupin W.A.');
GD:=Detect;
InitGraph(GD,GM,'d:\bp\bgi');
IF GraphResult<>GrOk
THEN
BEGIN
WriteLn('Ошибка инициализации графики.');
Exit;
END;
FOR Method:=0 TO 3 DO
BEGIN
{Задаём начальное состояние "линий",
т.е. входов и выходов звеньев}
g:=0.0;
e:=0.0;
v:=0.0;
u:=0.0;
x:=0.0;
{Задаём начальное состояние звеньев}
KUX0:=0.0; KUX1:=0.0; {аналоговое или цифровое}
KUTime:=-T0; {корректирующее устройство}
IMX:=0.0; IMXDot:=0.0; {исполнительный механизм}
OUX:=0.0; OUXDot:=0.0; {объект управления}
FOR I:=0 TO NumberPoints-1 DO
BEGIN
time:=I*TimeStep;
TimeVector[I]:=time;
{Порядок вычисления соответствует "течению" сигнала по системе}
{Единичное ступенчатое воздействие}
g:=1.0;
{Сравнивающий элемент}
e:=g-x;
{Корректирующее устройство}
CASE Method OF
0: BEGIN
AnalogXVector[I]:=x;
v:=Isodrome(133.0,0.2,KUX0,KUX1,e)
END;
1: BEGIN
TastinXVector[I]:=x;
v:=TastinIsodrome(133.0,0.2,T0,KUX0,KUX1,KUTime,e)
END;
2: BEGIN
RectangleXVector[I]:=x;
v:=RectangleIsodrome(133.0,0.2,T0,KUX0,KUX1,KUTime,e)
END;
3: BEGIN
StandartZXVector[I]:=x;
v:=StandartZIsodrome(133.0,0.2,T0,KUX0,KUX1,KUTime,e)
END
END;
{Исполнительный механизм}
u:=Inertion(0.1,0.1,IMX,IMXDot,v);
{Объект управления}
x:=Inertion(0.5,0.2,OUX,OUXDot,u)
END
END;
DrawFun(NumberPoints,TimeVector,AnalogXVector,0,0,GetMaxX,GetMaxY DIV 4,
'Аналоговая система - x(t)',LightRed);
DrawFun(NumberPoints,TimeVector,TastinXVector,0,GetMaxY DIV 4,GetMaxX,GetMaxY DIV 2,
'Аналоговая система с цифровым КУ по преобразованию Тастина - x(t)',Yellow);
DrawFun(NumberPoints,TimeVector,RectangleXVector,0,GetMaxY DIV 2,GetMaxX,3*GetMaxY DIV 4,
'Аналоговая система с цифровым КУ по преобразованию прямоугольников - x(t)',LightGreen);
DrawFun(NumberPoints,TimeVector,StandartZXVector,0,3*GetMaxY DIV 4,GetMaxX,GetMaxY,
'Аналоговая система с цифровым КУ по стандартному z-преобразованию - x(t)',LightBlue);
ReadKey;
CloseGraph
END.
Скажите, большое спасибо Ступину В.
За проделанный столь героический труд.
