Смекни!
smekni.com

Разработка системы управления асинхронным двигателем с детальной разработкой программ при различных законах управления (стр. 18 из 20)

i:integer;

color:word;

begin

GraphDriver:=0;

DetectGraph(GraphDriver,GraphMode);

if GraphMode>1 then GraphMode:=1;

InitGraph(GraphDriver,GraphMode,'e:\tp\bgi');

color:=GetMaxColor;

TextMode(1);

Writeln;

Writeln(' Graph Initialisate And ',GraphErrorMsg(GraphResult));

Writeln;

Writeln(' Use: GraphMode - ',GetModeName(GraphMode));

Writeln(' GraphDriver - ',GetDriverName);

Writeln;

Writeln(' The Number Of Using Colors :',GetMaxColor);

for i:=1 to 4 do Writeln;

Writeln(' Параметры АД:');

Writeln;

Writeln(' As =',A1:6,' Ar =',A2:6);

Writeln(' Ks =',K1:6,' Kr =',K2:6);

Writeln(' Ls`=',L11:6,' Lr`=',L21:6);

for i:=1 to 7 do Writeln;

Writeln(' Press Any Key To Continue');

pausa;

SetGraphMode(GraphMode);

end;

{ Процедура подготовки к цифровому моделированию

по паспортным данным двигателя }

procedure Prepeare;

var HelpVariable:integer;

begin

W1:=2*Pi*Fs;W0:=W1/p;

L0:=1.5*X0t/W1;L1:=X1t/W1;L2:=X2t/W1;

L1:=L1+L0;L2:=L2+L0;

K2:=L0/L2;K1:=L0/L1;

L11:=L1-sqr(L0)/L2;L21:=L2-sqr(L0)/L1;

A1:=R1t/L11;A2:=R2t/L21;

for HelpVariable:=1 to 5 do

begin

f[HelpVariable]:=0;

x[HelpVariable]:=0;

end;

end;

{ Процедура расчета угов векторов }

procedure AngleDefinition;

begin

UssAbsoluteAngle:=AbsoluteAngle(U1a,U1b);

PsisRAngle:=AbsoluteAngle(x[1],x[2])-UssAbsoluteAngle;

if PsisRAngle<0 then PsisRAngle:=360+PsisRAngle;

PsirRAngle:=AbsoluteAngle(x[3],x[4])-UssAbsoluteAngle;

if PsirRAngle<0 then PsirRAngle:=360+PsirRAngle;

IsRAngle:=AbsoluteAngle(I1a,I1b)-UssAbsoluteAngle;

if IsRAngle<0 then IsRAngle:=360+IsRAngle;

IrsRAngle:=AbsoluteAngle(I21a,I21b)-UssAbsoluteAngle;

if IrsRAngle<0 then IrsRAngle:=360+IrsRAngle;

PsioRAngle:=AbsoluteAngle(I0a,I0b)-UssAbsoluteAngle;

if PsioRAngle<0 then PsioRAngle:=360+PsioRAngle;

end;

procedure OutStringSum;

begin

VectorString:=VectorString+VectorString0+'¦';

end;

{ Функция, выдающая строку таблицы out - данных }

function GetVectorString(Number:StringSwitche):string;

begin

Case Number of

ST11 :GetVectorString:='+----------------------------------------------------------------------------+';

ST12 :GetVectorString:='¦ ¦ ¦ ¦ ¦ ¦ ¦ Uss ¦ Psis ¦';

ST13 :GetVectorString:='¦ ¦ ¦ ¦ ¦ ¦ +--------------------+-------------¦';

ST14 :GetVectorString:='¦ Fs ¦ Ms ¦ Wv ¦ S ¦ Effi-¦cos(F)¦ ¦ Angle ¦ ¦ ¦';

ST15 :GetVectorString:='¦ ¦ ¦ ¦ ¦ciency¦ ¦Module+-------------¦Module¦RAngle¦';

ST16 :GetVectorString:='¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦absol.¦relat.¦ ¦ ¦';

ST17 :GetVectorString:='+------+------+------+------+------+------+------+------+------+------+------¦';

DATA1:begin

VectorString:='¦';Str(Fs:6,VectorString0);OutStringSum;

Str(Ms:6,VectorString0);OutStringSum;

Str(x[5]/p:6:2,VectorString0);OutStringSum;

Str(s:6:3,VectorString0);OutStringSum;

Str(KPD:6:3,VectorString0);OutStringSum;

Str(CosF:6:3,VectorString0);OutStringSum;

Str(Uss:6,VectorString0);OutStringSum;

Str(UssAbsoluteAngle:6,VectorString0);OutStringSum;

VectorString0:=' 0 ';OutStringSum;

Psi1:=sqrt(sqr(x[1])+sqr(x[2]));

Str(Psi1:6:4,VectorString0);OutStringSum;

Str(PsisRAngle:6,VectorString0);OutStringSum;

GetVectorString:=VectorString;

end;

ENDT1:GetVectorString:='+----------------------------------------------------------------------------+';

ST21 :GetVectorString:='+----------------------------------------------------------------------------+';

ST22 :GetVectorString:='¦ Psir ¦ Is ¦ Irs ¦ Psio ¦ Power ¦ ¦';

ST23 :GetVectorString:='+-------------+-------------+-------------+-------------+-------------¦ M ¦';

ST24 :GetVectorString:='¦Module¦RAngle¦Module¦RAngle¦Module¦RAngle¦Module¦RAngle¦ Full ¦Utilit¦ ¦';

ST25 :GetVectorString:='+------+------+------+------+------+------+------+------+------+------+------¦';

DATA2:begin

Psi2:=sqrt(sqr(x[3])+sqr(x[4]));Psi0:=I0*L0;

Str(Psi2:6:4,VectorString0);VectorString:='¦';OutStringSum;

Str(PsirRAngle:6,VectorString0);OutStringSum;

Str(I1:6:2,VectorString0);OutStringSum;

Str(IsRAngle:6,VectorString0);OutStringSum;

Str(I21:6:2,VectorString0);OutStringSum;

Str(IrsRAngle:6,VectorString0);OutStringSum;

Str(Psi0:6:4,VectorString0);OutStringSum;

Str(PsioRAngle:6,VectorString0);OutStringSum;

Str(0.003*Uss/sqrt(2)*I1:6:2,VectorString0);OutStringSum;

Str(0.003*Uss/sqrt(2)*I1*CosF:6:2,VectorString0);OutStringSum;

Str(M:6:2,VectorString0);OutStringSum;

GetVectorString:=VectorString;

end;

ENDT2:GetVectorString:='+----------------------------------------------------------------------------+'

end

end;

{ Процедура, рисующая векторную диаграмму }

procedure DrawVectorDiagram;

var CenterX,CenterY,Max,Kx:real;

Xk,Yk:word;

begin

GetAspectRatio(Xk,Yk);Kx:=Yk/Xk;

CenterY:=GetMaxY/2;Max:=(GetMaxY-150)/2;CenterX:=2/3*GetMaxX-10;

PutVector(CenterX,CenterY,Max,90,GetMaxColor,'Uss');

PutVector(CenterX,CenterY,Max,90+IsRAngle,GetMaxColor*0.9,'Is');

PutVector(CenterX,CenterY,Max*I21/I1,90+IrsRAngle,GetMaxColor*0.88,'Irs');

PutVector(CenterX,CenterY,Max,90+PsisRAngle,GetMaxColor*0.8,'Psis');

PutVector(CenterX,CenterY,Max*Psi2/Psi1,90+PsirRAngle,GetMaxColor*0.75,'Psir');

PutVector(CenterX,CenterY,Max*Psi0/Psi1,90+PsioRAngle,GetMaxColor*0.65,'Psio');

end;

procedure SolveDiagram;Forward;

{ Процедура выхода из программы }

procedure quit;

begin

Write(Result,GetVectorString(ENDT1));Writeln(Result,GetVectorString(ENDT2));

Close(Result);GraphDefaults;CloseGraph;Halt;

end;

{ Процедура анализа скэн - кода }

procedure PressKeyAnalysis;

var p:char;

begin

p:=chr(0);

if KeyPressed=True then

Case ReadKey of

'V','v':SolveDiagram;

'M','m':begin

Ms:=NumberInput('Момент');

SolveDiagram;

end;

'U','u':begin

Uss:=round(NumberInput('Напряжение')*sqrt(2));

SolveDiagram;

end;

'W','w':begin

Write(Result,GetVectorString(DATA1));

Writeln(Result,GetVectorString(DATA2));

SolveDiagram;

end;

'P','p':begin

SetActivePage(1);SetVisualPage(0);

SetViewPort(0,100,300,204,True);ClearViewPort;

SetViewPort(0,0,GetMaxX,GetMaxY,True);

TextOut(80,148,0.9,'Печать:');

TextOut(0,164,0.75,'1 - печать графика скорости');

TextOut(0,180,0.87,'2 - печать векторной диаграммы');

SetVisualPage(1);

Repeat p:=ReadKey;

Until (p='1') or (p='2');

Case p of

'1':begin

SetActivePage(0);SetVisualPage(0);

CopyToPRN;

end;

'2':begin

SetActivePage(1);SetVisualPage(1);

CopyToPRN;

end

end;

SolveDiagram;

end;

'Q','q':quit

else

SetColor(GetMaxColor);

SetVisualPage(0);

end

end;

{ Процедура расчета векторной диаграммы }

procedure SolveDiagram;

begin

SetVisualPage(0);SetActivePage(1);

SetViewPort(0,0,GetMaxX,GetMaxY,True);SetBkColor(Black);ClearViewPort;SetColor(GetMaxColor);

AngleDefinition;

{формирование} OutTextXY(0,0,GetVectorString(ST11));OutTextXY(0,8,GetVectorString(ST12));

{ заголовка } OutTextXY(0,16,GetVectorString(ST13));OutTextXY(0,24,GetVectorString(ST14));

{ первой } OutTextXY(0,32,GetVectorString(ST15));OutTextXY(0,40,GetVectorString(ST16));

{ таблицы } OutTextXY(0,48,GetVectorString(ST17));

{вывод данных} OutTextXY(0,56,GetVectorString(DATA1));

{конец табл.1} OutTextXY(0,64,GetVectorString(ENDT1));

{конец табл.2} OutTextXY(0,GetMaxY-8,GetVectorString(ENDT2));

{вывод данных} OutTextXY(0,GetMaxY-16,GetVectorString(DATA2));

{формирование} OutTextXY(0,GetMaxY-24,GetVectorString(ST25));OutTextXY(0,GetMaxY-32,GetVectorString(ST24));

{ заголовка } OutTextXY(0,GetMaxY-40,GetVectorString(ST23));OutTextXY(0,GetMaxY-48,GetVectorString(ST22));

{ таблицы2 } OutTextXY(0,GetMaxY-56,GetVectorString(ST21));

DrawVectorDiagram;

TextOut(56,100,0.9,'КЛАВИАТУРА:');TextOut(0,116,0.75,'V - векторная диаграмма');

TextOut(0,132,0.87,'W - запись результатов в файл');TextOut(0,148,0.65,'M - изменить момент на валу');

TextOut(0,164,0.6,'U - изменить напряжение');TextOut(0,180,0.4,'P - печать результатов моделирования');

TextOut(0,196,0.8,'Q - выход в систему');

SetVisualPage(1);SetActivePage(0);

end;

{Процедура моделирования пуска асинхронного двигателя}

procedure Model;

begin

RepeatNumber:=round(EndT/(dt*640));

SpeedScale:=GetMaxY/(3*W0);

for CurrentNumber:=0 to 640 do

begin

for CurrentRepeat:=1 to RepeatNumber do

begin

Runge;

I1a:=x[1]/L11-K2/L11*x[3];

I1b:=x[2]/L11-K2/L11*x[4];

I1:=sqrt(sqr(I1a)+sqr(I1b));

I21a:=x[3]/L21-K1/L21*x[1];

I21b:=x[4]/L21-K1/L21*x[2];

I21:=Sqrt(sqr(I21a)+sqr(I21b));

I0a:=I1a+I21a;I0b:=I1b+I21b;

I0:=sqrt(sqr(I0a)+sqr(I0b));

t:=t+dt;

PutPixel(CurrentNumber,round(GetMaxY/2-SpeedScale*x[5]/p),color);

end;

PutPixel(CurrentNumber,round(GetMaxY/2-SpeedScale*x[5]/p),color);

SetActivePage(0);

PsiAlpha:=AbsoluteAngle(I0a,I0b)-AbsoluteAngle(x[3],x[4]);

IsPsirAlpha:=AbsoluteAngle(I1a,I1b)-AbsoluteAngle(x[3],x[4]);

IsAlpha:=AbsoluteAngle(U1a,U1b)-AbsoluteAngle(I1a,I1b);

CosF:=cos(IsAlpha*Pi/180);

if (Uss*I1)<>0 then KPD:=abs(M*Fs*4*Pi/(3*p*Uss*I1));

Str(Uss:5,StringPsiAlpha);Str(IsAlpha,StringIsAlpha);

Str(KPD:5:3,StringKPD);Str(IsPsirAlpha,StringIsPsirAlpha);

Str(s:6:4,StringAlphaRasch);Str(x[5]/p:5:1,StringCurrW);

Str(I1:6:2,StringIs);Str(CosF:4:2,StringCosF);

SetViewPort(184,20,240,30,False);ClearViewPort;SetViewPort(304,20,368,30,False);ClearViewPort;

SetViewPort(400,20,472,30,False);ClearViewPort;SetViewPort(576,20,638,30,False);ClearViewPort;

SetViewPort(184,40,248,50,False);ClearViewPort;SetViewPort(296,40,368,50,False);ClearViewPort;

SetViewPort(400,40,472,50,False);ClearViewPort;SetViewPort(576,40,638,50,False);ClearViewPort;

SetViewPort(0,0,GetMaxX,GetMaxY,True);

OutTextXY(192,20,StringPsiAlpha);OutTextXY(312,20,StringIsAlpha);

OutTextXY(408,20,StringKPD);OutTextXY(584,20,StringIsPsirAlpha);

OutTextXY(192,40,StringAlphaRasch);OutTextXY(312,40,StringCurrW);

OutTextXY(408,40,StringIs);OutTextXY(584,40,StringCosF);

PressKeyAnalysis;

end;

end;

{ Процедура формирования заголовка файла }

procedure FileHead;

begin

Assign(Result,'lw.res');

Rewrite(Result);

Writeln(Result,GetVectorString(ST11));Writeln(Result,GetVectorString(ST12));

Write(Result,GetVectorString(ST13));Writeln(Result,GetVectorString(ST21));

Write(Result,GetVectorString(ST14));Writeln(Result,GetVectorString(ST22));

Write(Result,GetVectorString(ST15));Writeln(Result,GetVectorString(ST23));

Write(Result,GetVectorString(ST16));Writeln(Result,GetVectorString(ST24));

Write(Result,GetVectorString(ST17));Writeln(Result,GetVectorString(ST25));

end;

{ Основная программа }

begin

ReCalculation;

ClrScr;Writeln;

TextColor(10);WriteLn(' Программа расчета и вывода векторной диаграммы А.Д.');

TextColor(12);Writeln(' Для IBM PC/XT/AT/PS-2 с ОЗУ экрана 256/512 Кб');

for i:=0 to 4 do Writeln;TextColor(15);

Write('Введите время окончания работы двигателя: ');Readln(EndT);

Write('Введите частоту питающей сети (Гц): ');Readln(Fs);

t:=0;dt:=1e-4;Ms:=0;Uss:=round(310*Fs/50);

FileHead;Prepeare;Init_Graph;TextMode(2);

SetActivePage(0);SetVisualPage(0);

Scale(1.5*W0,-1.5*W0,EndT,'t,c','W,рад/с');

SetColor(round(GetMaxColor*0.7));

OutTextXY(66,8,'Программа расчета векторной диаграммы и некоторых параметров А.Д.');

SetColor(round(GetMaxColor*0.9));

OutTextXY(112,20,'PsiAlpha:');OutTextXY(240,20,'IsAlpha:');

OutTextXY(368,20,'KPD:');OutTextXY(496,20,'IsPrAlpha:');

OutTextXY(96,40,'RelSkRasch:');OutTextXY(256,40,'CurrW:');

OutTextXY(376,40,'Is:');OutTextXY(536,40,'CosF:');

SetViewPort(0,0,GetMaxX,GetMaxY,True);

color:=GetMaxColor;SetColor(color);

Model;

Quit;

end.


{ ИСХОДНЫЙ ТЕКСТ МОДУЛЯ СЕРВИСНЫХ ПРОЦЕДУР И ФУНКЦИЙ }

Unit Im_tpu;

Interface

uses graph,dos,crt,printer;

type string4=string[4];

procedure pausa;

procedure Scale(Ymax,Ymin,Tmax:real;XText,YText:string);

function AbsoluteAngle(AComponent,BComponent:real):integer;

procedure PutVector(Xb,Yb,MVector,AVector,Col:real;Name:string4);

function NumberInput(What:string):integer;

procedure TextOut(X,Y:integer;Col:real;TextString:string);

procedure CopyToPRN;

function Sgn(v:real):integer;

function DefTime:string;

procedure TimeOut;

procedure PrintPausa;

Implementation

{ Пауза до первой нажатой клавиши }

procedure pausa;

begin

Repeat Until ReadKey<>#0

end;

{ Вывод на экран системы координат }

procedure Scale(Ymax,Ymin,Tmax:real;XText,YText:string);

var Ybeg,Ystep,Tstep,t1:real;

ScaleGrad:string;

Col:word;

SDrawX,SDrawY,HelpVar,GDriver,GMode:integer;

begin

DetectGraph(GDriver,GMode);GMode:=1;

InitGraph(Gdriver,GMode,'');

SetBkColor(0);SetColor(GetMaxColor);

Col:=GetMaxColor;PutPixel(0,0,Col);

LineTo(GetMaxX,0);LineTo(GetMaxX,GetMaxY);

LineTo(0,GetMaxY);LineTo(0,0);

for SDrawX:=1 to 19 do

for SdrawY:=1 to 19 do

PutPixel(SdrawX*GetMaxX div 20,SdrawY*GetMaxY div 20,col);

SetTextStyle(0,0,1);

if Ymin<0 then Ystep:=(Ymax-Ymin)/10

else

Ystep:=Ymax/10;

for HelpVar:=0 to 10 do

begin

Str(Ymax:9,ScaleGrad);

OutTextXY(0,HelpVar*GetMaxY div 10,ScaleGrad);

Ymax:=Ymax-Ystep;

end;

Tstep:=Tmax/5;t1:=0;

for HelpVar:=0 to 4 do

begin

Str(t1:9,ScaleGrad);

OutTextXY(HelpVar*GetMaxX div 5,GetMaxY-10,ScaleGrad);

t1:=t1+Tstep;

end;

SetColor(round(GetMaxColor/1.25));

OutTextXY(GetMaxX-48,GetMaxY-11,XText);OutTextXY(8,20,YText);

SetColor(GetMaxColor);

end;

{ Функция геометрического анализа и расчета абсолютного угла вектора }

function AbsoluteAngle(AComponent,BComponent:real):integer;

var IntAngle:integer;

begin

if AComponent<>0 then IntAngle:=round(180/Pi*ArcTan(BComponent/AComponent));

if AComponent=0 then

begin

if BComponent>0 then IntAngle:=90

else IntAngle:=-90;

end

else

if BComponent=0 then

begin

if AComponent>0 then IntAngle:=0

else IntAngle:=180;

end

else

if ((AComponent>0) and (BComponent>0)) or (AComponent>0) and (BComponent<0) then

{первый и второй квадранты}

IntAngle:=IntAngle

else

IntAngle:=180+IntAngle;{второй и третий квадранты};