13 Приложение А (Программное средство исследования динамики движения автомобиля)

2018-02-16СтудИзба

Описание файла

Файл "13 Приложение А" внутри архива находится в следующих папках: Программное средство исследования динамики движения автомобиля, Приложения. Документ из архива "Программное средство исследования динамики движения автомобиля", который расположен в категории "". Всё это находится в предмете "дипломы и вкр" из 12 семестр (4 семестр магистратуры), которые можно найти в файловом архиве МПУ. Не смотря на прямую связь этого архива с МПУ, его также можно найти и в других разделах. Архив можно найти в разделе "остальное", в предмете "дипломы" в общих файлах.

Онлайн просмотр документа "13 Приложение А"

Текст из документа "13 Приложение А"

ПРИЛОЖЕНИЕ А

(обязательное)

Программные средства исследования динамики движения автомобиля

Текст программы

Всего листов – 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

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5224
Авторов
на СтудИзбе
427
Средний доход
с одного платного файла
Обучение Подробнее