13 Приложение А (1094759)
Текст из файла
ПРИЛОЖЕНИЕ А
(обязательное)
Программные средства исследования динамики движения автомобиля
Текст программы
Всего листов – 15
2011
procedure ProcBO();
var i: integer;
zny,af,ar,vf,vr,ur,uf,ub,bsi,rf,rr,ff,fr,alc,dyf,dyr,dy,dfi,om,
sifi,cofi,fivn,sifin,cofin,dx,yot,xot,vauf,yi,xi: real;
begin
ur:=0;uf:=0;
for i:=1 to 3 do begin
//проверка знаков переднего и заднего углов скоростей
//если zny=-1 , то правый поворот (в противоположную сторону оси - Y)
if (alf>alr) then zny:=1
else zny:=-1;
//если zny=1 , то левый поворот (в направлении оси - Y)
//модули углов увода определяют вид треугольника на плане скоростей
af:=abs(alf);
ar:=abs(alr);
if abs(alf-alr)<=0.0000001
then begin
alf:=auf;
alr:=0;
vf:=v/cos(alf);
vr:=v/cos(alr);
break;
end
else begin
if (alf*alr)<0
then begin
//треугольник остроугольный
ur:=pi2-af;
uf:=pi2-ar;
end
else begin
//треугольник тупоугольный
if af>=ar
then begin
//передний угол UR - острый, задний UF - тупой
ur:=pi2-af;
uf:=pi2+ar;
end
else begin
//передний угол UR - тупой, задний UF - острый
ur:=pi2+af;
uf:=pi2-ar;
end;
end;
end;
ub:=pi-uf-ur;
//конец расчета треугольника
//расчет переднего и заднего радиусов поворота по теореме синусов
bsi:=baz/sin(ub);
rf:=bsi*sin(uf);
rr:=bsi*sin(ur);
//вектор скорости передний и задний
vf:=v/cos(alf);
vr:=v/cos(alr);
//центростремительные силы передняя и задняя
ff:=(amf*vf*vf)/rf;
fr:=(amr*vr*vr)/rr;
//корректировка переднего и заднего углов скоростей
alf:=auf-(ff/cf)*zny;
alr:=-(fr/cr)*zny;
end;
alc:=(alf+alr)/2;
//боковое смещение точек передней задней и центральной на данном шаге
dyf:=vf*sin(alf)*dt;
dyr:=vr*sin(alr)*dt;
dy:=v*sin(alc)*dt;
//изменение продольного угла на данном шаге
dfi:=ArcTan((dyf-dyr)/baz);
om:=dfi/dt;
//угол автомобиля относительно неподвижной системы координат
fia:=fia+dfi;
sifi:=sin(fia);
cofi:=cos(fia);
fivn:=fia+alc;
sifin:=sin(fivn);
cofin:=cos(fivn);
//продольное смещение на данном шаге
dx:=v*cos(alc)*dt;
//суммарный траекторный путь
s:=s+dx;
sp:=sp+dx;
//расчет центральной точки в неподвижной системе координат
xn:=xn+dx*cofin-dy*sifin;
yn:=yn+dx*sifin+dy*cofin;
t:=t+dt;
yot:=yn-yz;
xot:=xn-xz;
xo:=xot*cos(fia)+yot*sin(fia);
yo:=-xot*sin(fia)+yot*cos(fia);
ruf:=-(kboksm*yo)+kfit*(fit-fia);
auf:=ruf/ri;
vauf:=(auf-aufs)/dt;
if auf>0.5 then auf:=0.5;
if auf<-0.5 then auf:=-0.5;
ui:=ui+abs(auf);
yi:=yn/dsm+0.5;
xi:=xn/dsm+0.5;
FResult.SerTrack.AddXY(yi,xi);
if sp>8 then ProcAvto();
aufs:=auf;
end;
procedure ProcMain();
var nsc,ns,i,si,ifi,id: integer;
xzn,yzn,sns,xi,yi,xli,yli,xri,yri,fi,r,dif,xcn,ycn,fivn,vxv: real;
begin
pi:=3.14159;
pi2:=pi/2;
xi:=0;yi:=0;
//считывание параметров из главного меню
with Fmain.SGmain do begin
//shp - ширина проезжей части, м
shp:=strtofloat(cells[2,2]);
//v - скорость продольного движения, м/с
v:=strtofloat(cells[2,3])/3.6;
//sck - коэф-т сцепления с дорогой
sck:=strtofloat(cells[2,4]);
//kboksm - коэф-т чувств-ти водителя к боковому смещению
kboksm:=strtofloat(cells[2,5]);
//kfit - коэф-т чувств-ти водителя к отклонению угла курса
kfit:=strtofloat(cells[2,6]);
end;
//считывание параметров из конструктивного меню
with Fmain.SGkonstr do begin
//am - масса автомобиля, кг
am:=strtofloat(cells[2,1]);
//baz - база автомобиля, м
baz:=strtofloat(cells[2,2])/1000;
//amf - масса на переднюю ось, кг
amf:=strtofloat(cells[2,3]);
//cf - коэф-т сопротивления уводу передней оси
cf:=strtofloat(cells[2,4]);
//cr - коэф-т сопротивления уводу задней оси
cr:=strtofloat(cells[2,5]);
//ri - передаточное отношение рулевого механизма
ri:=strtofloat(cells[2,6]);
//ds - масштаб детализации
ds:=strtofloat(cells[2,7]);
end;
//считывание параметров из участков цикла
with Fmain.SGroad do begin
//определение кол-ва участков цикла
nsc:=Fmain.SGroad.Rowcount - 1;
//ns - номер цикла
for ns:=1 to nsc do begin
sc[ns]:=strtofloat(cells[1,ns]);
fic[ns]:=strtofloat(cells[2,ns]);
fic[ns]:=fic[ns]*pi/180;
end;
end;
amr:=am-amf;
bf:=baz*amr/am;
br:=baz-bf;
rj:=amf*bf*bf+amr*br*br;
dsm:=0.02;
//начальные условия для дороги
xzn:=0;
yzn:=2.5;
//половина ширины полосы движения
shp:=shp/2;
for ns:=1 to (nsc-1) do begin
sns:=sc[ns+1]-sc[ns];
//начальное значение угла курса, его синус и косинус
fit:=fic[ns];
sifi:=sin(fit);
cofi:=cos(fit);
//проверка кривизны участка
if (fic[ns+1]=fic[ns])
then begin
//движение по прямой
//вычисляем кол-во точек
si:=trunc(sns/dsm);
for i:=1 to si do begin
//координаты текущей точки заданной траектории
xi:=xzn+si*dsm*cofi;
yi:=yzn+si*dsm*sifi;
//координаты левой границы
xli:=((xi-shp*sifi)/dsm)+0.5;
yli:=((yi+shp*cofi)/dsm)+0.5;
//координаты правой границы
xri:=((xi+shp*sifi)/dsm)+0.5;
yri:=((yi-shp*cofi)/dsm)+0.5;
end;
xzn:=xi;
yzn:=yi;
end
else begin
//движение по криволинейному участку
fi:=fic[ns+1]-fic[ns];
r:=sns/fi;
dif:=sns/dsm;
ifi:=trunc(dif);
//координаты центра поворота
xcn:=xzn-r*sin(fit);
ycn:=yzn+r*cos(fit);
xi:=(xcn/dsm)+0.5;
yi:=(ycn/dsm)+0.5;
for i:=1 to ifi do begin
//текущее значение угла курса, его синус и косинус
sifi:=sin(fit);
cofi:=cos(fit);
//координаты текущей точки заданной траектории
xli:=((xcn+(r-shp)*sifi)/dsm)+0.5;
yli:=((ycn-(r-shp)*cofi)/dsm)+0.5;
FResult.SerRoadLeft.AddXY(yli,xli);
xri:=((xcn+(r+shp)*sifi)/dsm)+0.5;
yri:=((ycn-(r+shp)*cofi)/dsm)+0.5;
FResult.SerRoadRight.AddXY(yri,xri);
fit:=fit+(fi/dif);
end;
//начало отсчета следующего участка
xzn:=xcn+r*sifi;
yzn:=ycn-r*cofi;
end;
end;
//решение
//начальные условия
t:=0;auf:=0;aufs:=0;ui:=0;alf:=0;alr:=0;fia:=0;fivn:=0;fiv:=0;xs:=0;
yn:=2.5;xn:=0;vxv:=0;ks:=0;igrt:=0;
//масштаб решения - ds
//координаты начала первого участка траектории
xzn:=0;
yzn:=2.5;
//начало интервала для прорисовки автомобиля
sp:=0;
dt:=ds/v;
//определение заданных координат
//обработка очередного участка ns
for ns:=1 to (nsc-1) do begin
sns:=sc[ns+1]-sc[ns];
//начальное значение угла курса, его синус и косинус
fit:=fic[ns];
sifi:=sin(fit);
cofi:=cos(fit);
//проверка кривизны участка
if (fic[ns+1]=fic[ns])
then begin
si:=trunc(sns/ds);
id:=1;
repeat
xz:=xzn+id*ds*cofi;
yz:=yzn+id*ds*sifi;
repeat
ProcBO();
if (yo>80) then exit;
until (xo>=0);
if (xo<ds) then dt:=ds/v
else dt:=ds/(2*v);
id:=id+1;
until (id>si);
xzn:=xz;
yzn:=yz;
end
else begin
//движение по криволинейному участку
fi:=fic[ns+1]-fic[ns];
r:=sns/fi;
dif:=sns/ds;
ifi:=trunc(dif);
//координаты центра поворота
xcn:=xzn-r*sin(fit);
ycn:=yzn+r*cos(fit);
id:=1;
repeat
//текущее значение угла курса, его синус и косинус
sifi:=sin(fit);
cofi:=cos(fit);
//координаты текущей точки заданной траектории
xz:=xcn+r*sifi;
yz:=ycn-r*cofi;
repeat
ProcBO;
if (yo>80) then exit;
until (xo>=0);
fit:=fit+(fi/dif);
if (xo<ds) then dt:=ds/v
else dt:=ds/(2*v);
id:=id+1;
until (id>ifi);
//начало отсчета следующего участка
xzn:=xcn+r*sifi;
yzn:=ycn-r*cofi;
end;
end;
end;
printstring('Цикл движения состоит из '+floattostr(nstc-1)+' участков');
tct:=0;
tpe:=-0.00001;
repeat begin
nc:=nc+1;
rjv:=rjk;
oms:=0;
i:=ipc[nc]; //определяем текущую передачу
t:=tc[nc];
printstring('Начало '+floattostr(nc)+'-го участка'+'. Передача: ' +floattostr(i));
delt:=tc[nc+1]-tc[nc]; //длительность участка
az:=(vc[nc+1]-vc[nc])/delt; //ускорение, заданное по условию
printstring('Длительность участка: '+floattostr(delt));
printstring('Заданное ускорение : '+Floattostr(az));
//Вывод шапки конечной таблицы
strtoadd:='t bet vzkm vkm vp om1 g';
if fmain.CBDebug.Checked = true
then add(strtoadd);
if FMain.CBSaveTable.Checked = true
then begin
strtoadd:='<td>Время</td><td>Обороты</td><td>V заданное</td><td>v реаль-ное</td><td>Vp</td><td>om1</td><td>Расход топлива</td><td></td>';
addlinetohtml(strtoadd);
strtoadd:='';
end;
tct:=0; //начальное время участка цикла. Обнуляем его
rit:=rio*rikp[i+1]; //вычисляем передаточное число главной передачи
rjv:=rjk;
rjp:=((rit*rjd)+2*rjk)/2; //приведенный момент инерции
om1:=(v/rks)*rit;
//если текущая передача (i) равна нулю, то уходим на блок холостого хода, ина-че на блок движения с ускорением
if i = 0 then begin
bet:=0.08;
printstring('Двигатель работает без нагрузки');
am1:=0; //момент диска сцепления
repeat begin //блок холостого хода
procdmge();
procavto();
vz:=vc[nc]+az*(t-tc[nc]);
vzkm:=vz*3.6;
torm:=torm-ata*(az-vp)-atv*(vz-v);
//ncvr:=nc
procpecht();
end until delt-tct<0.009 ;
end
else if az < 0 then begin
printstring('Тормозим, сцепление включено');
bet:=0.08;
repeat begin //блок торможения
omd:=om1;
procdmge();
am1:=dme;
omd:=om1;
vz:=vc[nc]+az*(t-tc[nc]);
vzkm:=vz*3.6;
bet:=bet+aka*(az-vp)+akv*(vz-v);
if (bet > 1) then bet:=1;
if (bet < 0.08)
then begin
bet:=0.08;
torm:=torm-ata*(az-vp)-atv*(vz-v);
end;
procavto();
procpecht();
end until delt-tct<0.009
end
else begin
torm:=0;
if ipc[nc] = ipc[nc-1]
then My7 //если передача не изменилась, то блок движения без пробуксовки дисков сцепления
//если передача изменилась, то проверяем не изменилась ли она с нейтраль-ной на первую передачу
else if (ipc[nc] = 1) and (ipc[nc-1] = 0)
then My8 //если изменилась с 0 на 1 то блок разгона
else if abs(omd-om1)<5 then My7
else my4; //если изменилась не с 0 на 1 то блок движения с пробуксов-кой дисков сцепления
end;
end until nstc <= nc+1;
printstring('Суммарный расход топлива в цикле g:='+ floattostr(g)+'. Длина прой-денного пути: '+floattostr(x));
7.3 Процедуры, используемые в программе математической модели про-дольного движения автомобиля
procedure My4();
//блок движения с пробуксовкой дисков сцепления
begin
tsct:=0;
t:=t+0.1;
tct:=tct+0.1;
printstring('Начало пробуксовки дисков сцепления...t:= '+floattostr(t));
repeat begin
if (abs(omd-om1) < 5)
then begin
printstring('Пробуксовка дисков сцепления закончена...t:='+floattostr(t));
my7;
exit;
end
else begin
am1:=amsc*(1-exp(-tsct/tsc));
if om1 > omd
then am1:=-am1;
procdmge;
procavto;
vz:=vc[nc]+az*(t-tc[nc]);
vzkm:=vz*3.6;
bet:=bet + aka*(az-vp) + akv*(vz-v);
if bet>1 then bet:=1;
if bet<0.08 then bet:=0.08;
tsct:=tsct+dt;
procpecht;
end;
end until delt-tct<=0.009;
end;
procedure My7();
//блок движения без пробуксовки дисков сцепления
begin
rjv:=rjp;
dt:=0.1;
repeat begin
omd:= om1; // приравниваем угловые скорости дисков, т.к. нет пробуксовки (нет скольжения)
am1:=dme; //моменты эффективный приравнивается к моменту на ведомом дис-ке
procdmge;
vz:= vc[nc] + az*(t-tc[nc]);
vzkm:=vz*3.6;
bet:=bet + aka*(az-vp)+akv*(vz-v);
if bet>1 then bet:=1;
if bet<0.08 then bet:=0.08;
procavto;
if om1 < 580
then begin
procpecht;
end
else begin
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.