23.05.2014, 14:13 | #1 (permalink) |
Новичок
Регистрация: 02.03.2014
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Помогите с выводом графика в Паскале
Код:
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. |
23.05.2014, 14:13 | |
Helpmaster
Member
Регистрация: 08.03.2016
Сообщений: 0
|
Возможно ответы найденные в этих темах вам помогут Проблема с выводом приложений Задача в Паскале на построение графика функции Намотка вторичной обмотки ИТ со средним выводом Проблема с выводом изображения на дисплей Проблемы с выводом изображения на монитор |
23.05.2014, 14:44 | #2 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Посмотрю, но не сегодня. И ТОЛЬКО при условии, что будет выложена задача целиком, т.е. алгоритм нахождения всех этих токов да угловых скоростей.
|
23.05.2014, 16:21 | #3 (permalink) | |
Новичок
Регистрация: 02.03.2014
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Цитата:
Заранее спасибо. |
|
23.05.2014, 18:07 | #5 (permalink) | |
Новичок
Регистрация: 02.03.2014
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Цитата:
Счетчики(выходные величины) расположены в конце самой блок-схемы dI(ток), w1(угловая скорость), Fi(положение). И претензий вроде к этому всему не было. Проблема только с выводом графиков. Я понимаю, что так разобраться в этом всем не получится, но может быть допущена какая-то элементарная ошибка, в которой кроется вся суть проблемы. |
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
24.05.2014, 20:09 | #6 (permalink) |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Да-а... Друг мой, Вы что же, никогда не слышали о таком понятии, как цикл? Ладно, нарисовали координатную сетку, проведя каждую прямую индивидуально (хотя, конечно, следовало бы через циклы), разметили, а дальше? А дальше Вы сосчитали значение своих зависимостей в одной-единственной точке и эту точку вывели на экран оператором 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; Но хоть какой-то цикл, да нужен, а у Вас вовсе никакого нет. Так чего ж Вы ждёте от программы? |
24.05.2014, 21:15 | #7 (permalink) | |
Новичок
Регистрация: 02.03.2014
Сообщений: 8
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
|
Цитата:
Я с языками программирования можно сказать вообще не знаком, не моя это сфера, поэтому и такие ошибки. |
|
25.05.2014, 08:59 | #9 (permalink) | |
Специалист
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
|
Цитата:
Построение графика нелинейного уравнения, Turbo Pascal |
|
Ads | |
Member
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
|
|
|