Технический форум

Технический форум (http://www.tehnari.ru/)
-   Delphi, Kylix and Pascal (http://www.tehnari.ru/f43/)
-   -   Помогите с выводом графика в Паскале (http://www.tehnari.ru/f43/t96519/)

Agnophobia 23.05.2014 14:13

Помогите с выводом графика в Паскале
 
Ребят, очень нужна помощь по программе. Нужно, чтобы она рисовала графики зависимостей тока от времени и угловой скорости от времени. По каким-то причинам, она не хочет этого делать, выдает пустые оси с сеткой и все. tehno035

Код:

program fili;
uses crt, Graph;
var dv,Udp,Uds,Udt,kdp,kds,kdt,krp,krs,krt,tpp,Uz,
Fi,w,Uship,kship,tship,Ic,Ia,Mn,Mdob,Mmax,Ia_max,
Ra,Trs,Trp,Trt,Fi_max,dUp1,dUw1,dUt1,Tac,c,
Jc,dt,w_max,t,Uz1,n,Urs,Urt,dUt,dUp,dUp0,dUw,Urp1,Urp,
Uacp,Urs1,dUs,dUw0,Urt1,dUt0,Uship1,Ia1,dI,w1,Tm,Fi1,k,x,t1,Udp1:real;
RAZ,NEL,m:integer;
q: String;

GrDriver,GrMode,Color: Integer;

begin
clrscr;

Ra:=0.93;              {Активное сопротивление якоря цепи}
Tac:=0.0045;            {Постоянная времени якорной цепи}
Uz:=10;                {Максимальное напряжение задания}
m:=12;                  {Разрядность АЦП}
krs:=4.31;              {Коэффициент усиления регулятора скорости}
Trs:=0.036;            {Постоянная времени регулятора скорости}
krt:=7.24;            {Коэффициент усиления регулятора тока*}
Trt:=0.0045;            {Постоянная времени регулятора тока*}
kship:=10.33;            {Коэффициент тиристорного преобразователя}
Tship:=0.0002;
krp:=2.19;
Trp:=0.09;
c:=0.822;              {Конструктивная постоянная двигателя}
Jc:=0.036;            {Момент инерции системы}
tpp:=0.24;              {Время переходного процесса}
dt:=0.0001;            {Шаг по времени}
w_max:=125.65;          {Максимальная скорость на выходе системы}
Mn:=7.4;                {Номинальный момент на выходе системы}
Ia_max:=71;              {Максимальный ток на выходе электрической части двигателя}
t:=0;                  {Время начала переходного процесса}
n:=0;                  {Начало нумерации}
w:=0;                  {Начальная угловая скорость}
Fi:=0;
Urs:=0;                {Начальное напряжение на выходе регулятора скорости}
Urt:=0;                {Начальное напряжение на выходе регулятора тока}
Ia:=0;                  {Начальный ток на выходе электической части двигателя}
dUw:=0;                {Начальное напряжение на входе АЦП}
dUt:=0;                {Начальное напряжение на входе регулятора тока}
dUp:=0;
kdp:=0.95;
Tm:=0.0045;
dv:=0.462748;

writeln('Введите напряжение задания, U');
readln(Uz);
if Uz=0 then
Uz1:=0.9
else
Uz1:=Uz;
Udp:=Fi*kdp;
writeln('Исследовать разомкнутую систему? [1-да*/2-*нет]');
readln(RAZ);

if RAZ=2 then begin
writeln('Включить нелинейность? [1-да*/2-*нет]');
k:=2*(Uz1/Uz);
x:=6*(Uz1/Uz);
readln(NEL);
clrscr;
end;

Color:=15;
GrDriver:=VGA;GrMode:=VGAHi;InitGraph(GrDriver,GrMode,'d:\downloads\BP70\BGI');

if RAZ=1 then begin
kdp:=0;
tpp:=10*dt;
NEL:=2;
tpp:=10*dt;
dt:=tpp/500;
k:=0.025*(Uz1/Uz);
x:=6*(Uz1/Uz);
end;

if RAZ=2 then begin
if abs(Udp)>=Uz then Udp:=Uz*abs(Udp)/Udp;
end;
dUp1:=Uz-Udp;

if RAZ=2 then begin
if abs(dUp1)>=Uz then dUp1:=Uz*abs(dUt)/dUp1;
end;
Urp1:=Urp+Krp*(dUp-dUp0)+(Krp*dUp*dt)/Trp;

if RAZ=2 then begin
if abs(Urp1)>=Uz then Urp1:=Uz*abs(Urp1)/Urp1;
end;
Uds:=w*kds;

if RAZ=2 then begin
if abs(Uds)>=Uz then Uds:=Uz*abs(Uds)/Uds;
end;
dUw1:=Urp1-Uds;

if RAZ=2 then begin
if abs(dUw1)>=Uz then dUw1:=Uz*abs(dUw1)/dUw1;
end;
dv:=10/((exp(m*ln(2)))-1);
Uacp:=dv*trunc(dUw1/dv);

Urs1:=Urs+Krs*(dUw-dUw0)+(Krs*dUs*dt)/Trs;

if RAZ=2 then begin
if abs(Urs1)>=Uz then Urs1:=Uz*abs(Urs1)/Urs1;
end;
Udt:=Ia*kdt;

if RAZ=2 then begin
if abs(Udt)>=Uz then Udt:=Uz*abs(Udt)/Udt;
end;
dUt1:=Urs1*Udt;

if RAZ=2 then begin
if abs(dUt1)>=Uz then dUt1:=Uz*abs(dUt1)/dUt1;
end;
Urt1:=Urt+Krt*(dUt-dUt0)+(Krt*dUt*dt)/Trt;

if RAZ=2 then begin
if abs(Urt1)>=Uz then Urt1:=Uz*abs(Urt1)/Urt1;
end;
Uship1:=Uship+(kship*Urt1-Uship)*(dt/Tship);
Ia1:=Ia+((1/Ra)*Uship1-Ia)*(dt/Tac);

if NEL=1 then Ic:=0;
if NEL=2 then begin
if abs(w)<=0.5*w_max then Mdob:=(Mn/(0.5*w_max))*w
else Mdob:=Mn;
end;
dI:=Ia1-Ic;
w1:=w*(Ra*dI*dt)/(c*Tm);
Fi1:=(w*(Ra*dI*dt)/(c*Tm))*t;
t1:=t+dt;

PutPixel
(Round(50+t*500/tpp),Round(350-w*450/(k*w_max)),15);
PutPixel
(Round(50+t*500/tpp),Round(350-Ia*450/(x*Ia_max)),15);


Line(50,350,630,350);
Line(630,350,620,347);
Line(630,350,620,353);
Line(50,10,50,450);
Line(50,10,47,20);
Line(50,10,53,20);

OutTextXY(60,25,'w, rad/s');
OutTextXY(0,25,'I, A');
OutTextXY(605,358,'t, s');

Str(Uz:3:1,q);
OutTextXY(270,20,'Uz = '+q+' V');
Str(w1:7:4,q);
OutTextXY(480,10,'w = '+q+' rad/s');
Str(Ia1:7:4,q);
OutTextXY(480,20,'I = '+q+' A');
Str(Fi:7:4,q);
OutTextXY(480,30,'Fi = '+q+' rad');

Line(150,50,150,350);
Line(150,368,150,450);
Line(250,50,250,350);
Line(250,368,250,450);
Line(350,50,350,350);
Line(350,368,350,450);
Line(450,50,450,350);
Line(450,368,450,450);
Line(550,50,550,350);
Line(550,368,550,450);

Line(50,50,54,50);
Line(104,50,550,50);
Line(50,100,54,100);
Line(104,100,550,100);
Line(50,150,54,150);
Line(104,150,550,150);
Line(50,200,54,200);
Line(104,200,550,200);
Line(50,250,54,250);
Line(104,250,550,250);
Line(50,300,54,300);
Line(104,300,550,300);
Line(50,400,54,400);
Line(104,400,550,400);
Line(50,450,54,450);
Line(104,450,550,450);

Str(0:1,q);
OutTextXY(30,356,q);

Str((100*tpp/500):5:4,q);
OutTextXY(125,356,q);
Str((200*tpp/500):5:4,q);
OutTextXY(225,356,q);
Str((300*tpp/500):5:4,q);
OutTextXY(325,356,q);
Str((400*tpp/500):5:4,q);
OutTextXY(425,356,q);
Str((500*tpp/500):5:4,q);
OutTextXY(525,356,q);

Str((x*Ia_max*(50/450)):5:1,q);
OutTextXY(0,300,q);
Str((x*Ia_max*(100/450)):5:1,q);
OutTextXY(0,250,q);
Str((x*Ia_max*(150/450)):5:1,q);
OutTextXY(0,200,q);
Str((x*Ia_max*(200/450)):5:1,q);
OutTextXY(0,150,q);
Str((x*Ia_max*(250/450)):5:1,q);
OutTextXY(0,100,q);
Str((x*Ia_max*(300/450)):5:1,q);
OutTextXY(0,50,q);
Str((x*(-Ia_max)*(50/450)):5:1,q);
OutTextXY(0,400,q);
Str((x*(-Ia_max)*(100/450)):5:1,q);
OutTextXY(0,450,q);

Str((k*(-w_max)*(100/450)):5:1,q);
OutTextXY(60,450,q);
Str((k*(-w_max)*(50/450)):5:1,q);
OutTextXY(60,400,q);
Str((k*w_max*(50/450)):5:1,q);
OutTextXY(60,300,q);
Str((k*w_max*(100/450)):5:1,q);
OutTextXY(60,250,q);
Str((k*w_max*(150/450)):5:1,q);
OutTextXY(60,200,q);
Str((k*w_max*(200/450)):5:1,q);
OutTextXY(60,150,q);
Str((k*w_max*(250/450)):5:1,q);
OutTextXY(60,100,q);
Str((k*w_max*(300/450)):5:1,q);
OutTextXY(60,50,q);
if t1<tpp then
begin
t:=t1;
w:=w1;
Urs:=Urs1;
Urt:=Urt1;
Ia:=Ia1;
dUw:=dUw1;
dUt:=dUt1;
end;
readln;
end.


Vladimir_S 23.05.2014 14:44

Посмотрю, но не сегодня. И ТОЛЬКО при условии, что будет выложена задача целиком, т.е. алгоритм нахождения всех этих токов да угловых скоростей.

Agnophobia 23.05.2014 16:21

Вложений: 1
Цитата:

Сообщение от Vladimir_S (Сообщение 1034454)
Посмотрю, но не сегодня. И ТОЛЬКО при условии, что будет выложена задача целиком, т.е. алгоритм нахождения всех этих токов да угловых скоростей.

Алгоритм выполнен в Visio, но думаю, что это не проблема.
Заранее спасибо.

Vladimir_S 23.05.2014 16:46

Цитата:

Сообщение от Agnophobia (Сообщение 1034476)
Алгоритм выполнен в Visio, но думаю, что это не проблема. Заранее спасибо.

Посмотрел - нет, это не то. Мне не нужна блок-схема, мне бы желательны формулы, по которым решается задача. Или никак?

Agnophobia 23.05.2014 18:07

Цитата:

Сообщение от Vladimir_S (Сообщение 1034481)
Посмотрел - нет, это не то. Мне не нужна блок-схема, мне бы желательны формулы, по которым решается задача. Или никак?

У меня есть только расчеты самих регуляторов и величин, которые используются для моделирования электропривода. У нас стоит задача по схеме построить алгоритм (блок-схему) и написать по ней программу, которая выдает характеристики и значения тока и угловой скорости. Все расчеты этих токов, скоростей и положений ведутся непосредственно в программе.
Счетчики(выходные величины) расположены в конце самой блок-схемы dI(ток), w1(угловая скорость), Fi(положение). И претензий вроде к этому всему не было. Проблема только с выводом графиков.
Я понимаю, что так разобраться в этом всем не получится, но может быть допущена какая-то элементарная ошибка, в которой кроется вся суть проблемы.

Vladimir_S 24.05.2014 20:09

Да-а... Друг мой, Вы что же, никогда не слышали о таком понятии, как цикл? Ладно, нарисовали координатную сетку, проведя каждую прямую индивидуально (хотя, конечно, следовало бы через циклы), разметили, а дальше? А дальше Вы сосчитали значение своих зависимостей в одной-единственной точке и эту точку вывели на экран оператором PutPixel. А надо для каждой из выводимых функций задать циклы! Например, если Вы наперед знаете количество точек N=T/dt, где T - полный интервал времени, то цикл можно задать в виде
for i:=0 to N do
begin
{здесь дается приращение t в виде t:=t+dt; либо t:=dt*i; дальше для этого t вычисляются значения обеих функций, дальше и t, и полученные значения пересчитываются в графические переменные и выводятся на экран либо оператором PutPixel (если Вы хотите рисовать точками), либо LineTo (если непрерывной кривой; в этом случае нужно, правда, перед запуском цикла загнать графический маркер в исходную позицию оператором MoveTo) }
end;
Можно также воспользоваться циклами с предусловием
While t<=T do
begin
{содержимое цикла то же, что и в предыдущем случае}
end;
либо с постусловием
Repeat
{содержимое цикла}
Until t>T;
Но хоть какой-то цикл, да нужен, а у Вас вовсе никакого нет. Так чего ж Вы ждёте от программы? :)

Agnophobia 24.05.2014 21:15

Цитата:

Сообщение от Vladimir_S (Сообщение 1034728)
Да-а... Друг мой, Вы что же, никогда не слышали о таком понятии, как цикл? Ладно, нарисовали координатную сетку, проведя каждую прямую индивидуально (хотя, конечно, следовало бы через циклы), разметили, а дальше? А дальше Вы сосчитали значение своих зависимостей в одной-единственной точке и эту точку вывели на экран оператором PutPixel. А надо для каждой из выводимых функций задать циклы! Например, если Вы наперед знаете количество точек N=T/dt, где T - полный интервал времени, то цикл можно задать в виде
for i:=0 to N do
begin
{здесь дается приращение t в виде t:=t+dt; либо t:=dt*i; дальше для этого t вычисляются значения обеих функций, дальше и t, и полученные значения пересчитываются в графические переменные и выводятся на экран либо оператором PutPixel (если Вы хотите рисовать точками), либо LineTo (если непрерывной кривой; в этом случае нужно, правда, перед запуском цикла загнать графический маркер в исходную позицию оператором MoveTo) }
end;
Можно также воспользоваться циклами с предусловием
While t<=T do
begin
{содержимое цикла то же, что и в предыдущем случае}
end;
либо с постусловием
Repeat
{содержимое цикла}
Until t>T;
Но хоть какой-то цикл, да нужен, а у Вас вовсе никакого нет. Так чего ж Вы ждёте от программы? :)

Спасибо, буду пробовать :)
Я с языками программирования можно сказать вообще не знаком, не моя это сфера, поэтому и такие ошибки.

Agnophobia 24.05.2014 22:33

В общем, попробовал я ввести эти циклы, но ничего не изменилось, графики так и не рисуются. :(
Прям беда какая-то.

Vladimir_S 25.05.2014 08:59

Цитата:

Сообщение от Agnophobia (Сообщение 1034751)
В общем, попробовал я ввести эти циклы, но ничего не изменилось, графики так и не рисуются. :(
Прям беда какая-то.

Естественно, не видя Ваших проб, ничего сказать не могу. Единственное, чем могу пока помочь - это в качестве образца дать ссылку на тему, где осуществляется построение графика простой функции. Посмотрите, может быть понятнее станет:
http://www.tehnari.ru/f41/t87760/


Часовой пояс GMT +4, время: 03:49.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.