Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

СПО_курсовой

.doc
Скачиваний:
5
Добавлен:
26.05.2014
Размер:
267.26 Кб
Скачать

Рахмуков В.В. ВСС-1-97 МИРЭА

ГОСУДАРСТВЕННЫЙ КОМИТЕТ РОССИЙСКОЙ

ФЕДЕРАЦИИ

ПО ВЫСШЕМУ ОБРАЗОВАНИЮ

МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНСТИТУТ РАДИОТЕХНИКИ, ЭЛЕКТРОНИКИ И АВТОМАТИКИ

(ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)

КАФЕДРА МАТЕМАТИЧЕСКОГО ОБЕСПЕЧЕНИЯ ВЫЧИСЛИТЕЛЬНЫХ СИСТЕМ

КУРСОВАЯ РАБОТА ПО ДИСЦИПЛИНЕ «Системное программное обеспечение»

тема: " Повышение точности и надёжности системы перемещения рабочей части робота путём установки обратной связи на оси перемещения."

Студент:

Рахмуков В.В.

Руководитель:

Гулиева Д.М.

Москва, 1999 г.

В современной промышленности широко используются робототехнические устройства которые позволяют выполнять некоторые операции технологического процесса при минимальном контроле со стороны рабочего. При хорошей точности и стабильной работе робототехнического устройства это позволяет получить более стабильные показатели качества, чем при ручном выполнении операции. Также возможно повышение производительности труда так как один рабочий может обслуживать несколько таких устройств.

Для обеспечения ритмичной и стабильной работы системы необходимо иметь робототехнические устройства с высокими показателями надёжности.

Одним из видов робототехнических устройств являются координатные столы которые обеспечивают перемещение рабочей части по заданным пользователем координатам. Примером использования таких устройств может служить операции «Заливка чипа гелем», «Приклейка рамки» , «Приклейка крышки» выполняемые при изготовлении коммутаторов. При операции «Заливка чипа гелем» - в качестве рабочей части используется дозирующая головка которая и обеспечивает процесс заливки, а координатный стол перемещается от коммутатора к коммутатору. В операциях «Приклейка рамки» , «Приклейка крышки» в качестве рабочей части используется шприц который обеспечивает подачу клея , а координатный стол перемещает этот шприц по заданному контуру.

Достоинствами этих устройств является :

  • переход от ручного нанесения клея или геля к автоматизированной операции

  • повышение качества

  • повышение производительности

  • отсутствие необходимости в квалифицированных рабочих

Однако есть некоторые недостатки, такие как:

  • необходимость переоборудования производства

  • случайные погрешности перемещения рабочей части приводящие к неправильному нанесению клея или геля

Темой курсового проекта является повышение точности и надёжности системы перемещения рабочей части робота путём установки обратной связи на оси перемещения.

Ф ункциональная схема системы до модернизации

Назначение основных устройств.

  • Резидентная программа - обеспечивает расчет координат перемещения, количества шагов по всем осям и передачу этих данных на контроллер шаговых двигателей. Также обеспечивается прием и обработка информации с контроллера датчиков.

  • Контроллер шаговых двигателей - преобразует цифровые данные полученные от резидентной программы в управляющие сигналы поступающие на блок управления шаговыми двигателями.

  • Блок управления шаговыми двигателями - получает сигнал с контроллера шаговых двигателей и управляет питанием шаговых двигателей.

  • Контроллер датчиков - обеспечивает передачу сигнала от сработавшего датчика в резидентную программу.

  • Блок питания - обеспечивает энергоснабжение всей системы.

  • Датчики нижнего и верхнего пределов - вырабатывают сигнал при выходе рабочей части за установленные координаты.

  • Шаговые двигатели - обеспечивают перемещение рабочей части.

Описание работы системы.

В резидентной программе "Gel.exe" под управлением операционной системы MS-DOS заданы координаты перемещения рабочей части. Через порты ввода-вывода на контроллер шаговых двигателей выдаётся сигнал который преобразуется в управляющие сигналы блока управления шаговыми двигателями в результате чего на шаговые двигатели подается напряжение и они совершают необходимое количество шагов по своим осям. Прежде чем двигатся по указаным координатам система должна найти начало координат, для чего шаговые двигатели работают в одну сторону до срабатывания датчика нижнего или верхнего предела. После определения начала координат начинается движение по заданным координатам. Далее цикл повторяется.

Функциональная схема системы после модернизации

Назначение основных устройств.

  • Резидентная программа - обеспечивает расчет координат перемещения, количества шагов по всем осям и передачу этих данных на контроллер шаговых двигателей. В резидентной программе производится сравнение данных полученных с датчика движения с заданными перемещениями и выработка управляющего воздействия. Также обеспечивается обработка информации с датчиков нижнего и верхнего пределов.

  • Контроллер шаговых двигателей - преобразует цифровые данные полученные от резидентной программы в управляющие сигналы поступающие на блок управления шаговыми двигателями.

  • Блок управления шаговыми двигателями - получает сигнал с контроллера шаговых двигателей и управляет питанием шаговых двигателей.

  • Контроллер датчиков - обеспечивает преобразование импульсов полученных с датчика движения в цифровой сигнал, приём сигналов с датчиков верхнего и нижнего пределов и передачу этой информации в резидентную программу.

  • Блок питания - обеспечивает энергоснабжение всей системы.

  • Датчики нижнего и верхнего пределов - вырабатывают сигнал при выходе рабочей части за установленные координаты.

  • Датчики движения - вырабатывают импульсы при перемещении рабочей части.

  • Шаговые двигатели - обеспечивают перемещение рабочей части.

Описание работы модернизированной системы.

В резидентной программе "gelm.exe" под управлением операционной системы MS-DOS заданы координаты перемещения рабочей части. Через порты ввода-вывода на контроллер шаговых двигателей выдаётся сигнал который преобразуется в управляющие сигналы блока управления шаговыми двигателями в результате чего на шаговые двигатели подается напряжение и они совершают необходимое количество шагов по своим осям. Датчики движения отслеживают перемещение и выдают импульсы на контроллер датчиков который преобразует полученные импульсы в координаты перемещения. В резидентной программе координаты перемещения сравниваются с заданными координатами и если они не совпадают на шаговые двигатели подаются необходимые для исправления расхождения сигналы. Далее цикл повторяется.

Приложения

Программа "gel.pas"

program gel; { программа заливки геля }

uses

crt,dos;

label ss;

const

Shag=0.0124;

Shag1=0.0062;

type

Koord=record

Xbeg, zasl, Xend, Ybeg, Yend : real;

end;

var

c,d,e:word;

a,b,u, f,l,Place , Lim,R00,R01,R08:byte ;

smeX, smeY:real;

k:byte;

FlPr,number,r,Mash,Mash1:integer;

Sp,Sp1, { NumberKomm, } Sp0:byte;

ttime:byte; { время с момента размешивания геля }

Time_Zal:integer; { рассчитанное время одного прохода заливки }

Temp:byte; { температура окружающего воздуха }

Start_Step: integer; { сколько шагов разгона осталось }

Start_Time:integer ; { переменная для разгона }

NumberPoddon:byte; { номер поддона, на который заливаем }

NumberMax:integer; { количество коммутаторов на поддоне }

oll_full:byte; { количество полностью залитых коммутаторов на поддоне }

Time_Gel : word; { количество проходов заливки геля }

KoordYPlace, KoordXPlace : real; { смещение поддона относительно начала координат }

massiv1:file of integer; { файл с количеством координат }

massiv:file of real; { файл с координатами }

KoordX,KoordY:real; { координаты в настоящее время }

Mass1 : Array [1..1000] of Koord; { массив координат }

err:byte; { признак нажатия кнопки ОСТ во время движения }

Speed: Array [0..9] of byte; { скорость заливки коммутатора }

flag_stop:byte; { признак нажатия кнопки стоп }

flag_ost:byte; { признак нажатия кнопки остановка }

flag_pusk:byte; { признак нажатия кнопки пуск }

flag_prod:byte; { признак нажатия кнопки продолжение }

avt:byte; { бит светодиода автоматической работы }

man:byte; { бит светодиода ручной работы }

poddon:byte; { номер поддона }

podd:byte; { бит светодиода поддон }

litr:byte; { бит светодиода литр }

litr_bottl:byte; { объём бутылки }

OutLitr:byte; { переменная для вывода объёма бутылки }

new_bottl:word; { максимальное количество заливаемых коммутаторов }

ostatok: word; { количество геля в бутылке }

Led_ostatok:byte; { бит светодиода сколько осталось }

Led_ready: byte; { бит светодиода готов }

h, min , s , ms , time: word; { переменные времени }

Led_time:byte; { бит светодиода время }

{************************************************************************}

{ чтение файла с диска }

procedure Read_File;

begin

{ обнуление массива координат }

for r:=1 to 1000 do

begin

Mass1[r].Xbeg:=0;

Mass1[r].Ybeg:=0;

Mass1[r].Xend:=0;

Mass1[r].Yend:=0;

Mass1[r].zasl:=0;

end;

number:=1;

assign (Massiv1, 'a:\tp\1gel.jkl' );

reset(massiv1);

read(massiv1,numberMax);

close(massiv1);

assign (Massiv,'a:\TP\gel.jkl');

reset(massiv);

read(massiv,smeX);

read(massiv,smeY);

for r:=1 to numberMax do

begin

read(massiv,Mass1[r].Xbeg);

read(massiv,Mass1[r].Ybeg);

read(massiv,Mass1[r].Xend);

read(massiv,Mass1[r].Yend);

read(massiv,Mass1[r].zasl);

end;

close(massiv);

{здесь считываются данные с диска}

end;

{***********************************************************************}

{***********************************************************************}

procedure tormoz;

begin

{ прибыли на точку , тормозим двигателями }

{ включение двигателей }

Port[$301]:=19+128;

Port[$300]:=a;

Port[$301]:=3+128; { вывод управления на двигатель X }

Port[$301]:=19+128;

Port[$301]:=20+128;

Port[$300]:=b;

Port[$301]:=4+128; { вывод управления на двигатель Y }

Port[$301]:=20+128;

{ задержка на торможение двигателем }

Delay(25);

{ выключение двигателей }

Port[$301]:=19+128;

Port[$300]:=0;

Port[$301]:=3+128; { вывод управления на двигатель X }

Port[$301]:=19+128;

Port[$301]:=20+128;

Port[$300]:=0;

Port[$301]:=4+128; { вывод управления на двигатель Y }

Port[$301]:=20+128;

{ остановились на точке }

{ выключение высокого напряжения на двигатели }

Port[$301]:=153;

Port[$300]:=1;

Port[$301]:=137;

Port[$301]:=153;

{ удержание на точке с помощью двигателей }

{ включение двигателей }

Port[$301]:=19+128;

Port[$300]:=a;

Port[$301]:=3+128; { вывод управления на двигатель X }

Port[$301]:=19+128;

Port[$301]:=20+128;

Port[$300]:=b;

Port[$301]:=4+128; { вывод управления на двигатель Y }

Port[$301]:=20+128;

delay(100);

end;

{*********************************************************************}

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

procedure V_UP;

begin

if b=1 then b:=3

else if b=3 then b:=2

else if b=2 then b:=6

else if b=6 then b:=4

else if b=4 then b:=12

else if b=12 then b:=8

else if b=8 then b:=24

else if b=24 then b:=16

else if b=16 then b:=48

else if b=48 then b:=32

else if b=32 then b:=33

else if b=33 then b:=1;

end;

procedure V_DOWN;

begin

if b=1 then b:=33

else if b=33 then b:=32

else if b=32 then b:=48

else if b=48 then b:=16

else if b=16 then b:=24

else if b=24 then b:=8

else if b=8 then b:=12

else if b=12 then b:=4

else if b=4 then b:=6

else if b=6 then b:=2

else if b=2 then b:=3

else if b=3 then b:=1;

end;

procedure Rig_ht;

begin

if a=1 then a:=3

else if a=3 then a:=2

else if a=2 then a:=6

else if a=6 then a:=4

else if a=4 then a:=12

else if a=12 then a:=8

else if a=8 then a:=9

else if a=9 then a:=1;

end;

procedure Le_ft;

begin

if a=1 then a:=9

else if a=9 then a:=8

else if a=8 then a:=12

else if a=12 then a:=4

else if a=4 then a:=6

else if a=6 then a:=2

else if a=2 then a:=3

else if a=3 then a:=1;

end;

{***************************************************************************}

{***************************************************************************}

{ движение на один шаг }

procedure Step;

begin

case k of

8: begin

V_UP;

KoordY:=KoordY+Shag;

end;

2: begin

V_DOWN;

KoordY:=KoordY-Shag;

end;

4: begin

Le_ft;

KoordX:=KoordX-Shag;

end;

1: begin

Rig_ht;

KoordX:=KoordX+Shag;

end;

128: begin

V_UP;

Rig_ht;

KoordY:=KoordY+Shag;

KoordX:=KoordX+Shag;

end;

32: begin

V_DOWN;

Le_ft;

KoordY:=KoordY-Shag;

KoordX:=Koordx-Shag;

end;

64: begin

V_UP;

Le_ft;

KoordY:=KoordY+Shag;

KoordX:=KoordX-Shag;

end;

16: begin

V_DOWN;

Rig_ht;

KoordY:=KoordY-Shag;

KoordX:=KoordX+Shag;

end;

end;

{ включение двигателей }

Port[$301]:=19+128;

Port[$300]:=a;

Port[$301]:=3+128; { вывод управления на двигатель X }

port[$301]:=19+128;

Port[$301]:=20+128;

Port[$300]:=b;

Port[$301]:=4+128; { вывод управления на двигатель Y }

port[$301]:=20+128;

{ задержка на вращение двигателя }

{ разгон двигателя в начале движения }

if Start_Step<>1 then

begin

Start_Step:=Start_Step - 1;

delay(Start_Step);

end;

Delay(1);

{ выключение двигателей }

Port[$301]:=19+128;

Port[$300]:=0;

Port[$301]:=3+128; { вывод управления на двигатель X }

port[$301]:=19+128;

Port[$301]:=20+128;

Port[$300]:=0;

Port[$301]:=4+128; { вывод управления на двигатель Y }

port[$301]:=20+128;

{ проверка нажатия кнопоки ОСТ }

Port[$301]:=152;

Port[$301]:=136; { считываем кнопки управления }

R08:=Port[$300];

Port[$301]:=152;

if (( R08 and 4 ) = 4 ) then

begin

err:=4;

exit;

end;

end;

{***************************************************************************}

{************************************************************************}

{ подпрограмма возвращения в точку 0,0 }

procedure GOTO_00;

begin

Start_Step:=Start_Time; { установка шагов для разона }

{ возврат в точку 0,0 }

writeln('goto00');

Port[$301]:=144;

Port[$301]:=128; { считываем датчики Xmin и Ymin }

R00:=Port[$300];

Port[$301]:=144;

Repeat

case ( R00 and 3 ) of

1: begin

k:=2;

Step; { замнкнут только датчик X }

end;

2: begin

k:=4;

Step; { замнкнут только датчик Y }

end;

0: begin

k:=32;

Step; { ни один датчик не замнкнут }

end;

end;

Port[$301]:=16+128;

Port[$301]:=128; { считываем датчики Xmin и Ymin }

R00:=Port[$300];

Port[$301]:=16+128;

until ( R00 and 3 ) =3;

KoordX:=0; { обнуление координат }

KoordY:=0;

Port[$301]:=19+128;

Port[$300]:=0;

Port[$301]:=3+128; { вывод управления на двигатель X }

Port[$301]:=19+128;

Port[$301]:=20+128;

Port[$300]:=0;

Port[$301]:=4+128; { вывод управления на двигатель Y }

Port[$301]:=20+128;

end;

{*********************************************************************}

procedure CUT(Xn,Yn,Xk,Yk:real);

var

Napr:byte;

Ugol:real;

tt:word;

Nstep:LongInt;

begin

Start_Step:=Start_Time; { установка шагов для разона }

{ определение основного направления движения }

if abs(Xk-Xn) >= abs(Yk-Yn) then

{ основное движение по оси X }

if Xk >= Xn then Napr:=1 else Napr:=4

else { основное направление движения по оси Y }

if Yk >= Yn then Napr:=8 else Napr:=2;

case Napr of

1: begin { направление движения по оси +X }

if Yk >= Yn then { направление по оси +X +Y }

begin

Ugol:=(Yk-Yn)/(Xk-Xn);

Nstep:= Trunc((Xk-Xn)/ Shag );

for tt:=1 to Nstep do

begin

if ((KoordY+Shag)-(Yn+(KoordX-Xn+Shag)*Ugol))<= Shag1 then

begin

k:=128;

Step;

if err=4 then exit;

end

else

begin

k:=1;

Step;

if err=4 then exit;

end;

end ; { For tt }

end

else { направление по оси +X -Y }

begin

Ugol:=(Yk-Yn)/(Xk-Xn);

Nstep:= trunc((Xk-Xn)/ Shag);

for tt:=1 to Nstep do

begin

if ((Yn+(KoordX-Xn+Shag)*Ugol) - (KoordY-Shag))<= Shag1 then

begin

k:=16;

Step;

if err=4 then exit;

end

else

begin

k:=1;

Step;

if err=4 then exit;

end ; { if }

end ; { for tt }

end ; { else }

end; { case 1 }

4: begin { направление движения по оси -X }

if Yk >= Yn then { направление по оси -X +Y }

begin

Ugol:=(Yk-Yn)/(Xn-Xk);

Nstep:= Trunc((Xn-Xk)/ Shag );

for tt:=1 to Nstep do

begin

if ((KoordY+Shag)-(Yn+(Xn-KoordX-Shag)*Ugol))<= Shag1

then

begin

k:=64;

Step;

if err=4 then exit;

end

else

begin

k:=4;

Step;

if err=4 then exit;

end ;

end ; { for tt }

end

else { направление по оси -X -Y }

begin

Ugol:=(Yn-Yk)/(Xn-Xk);

Nstep:= trunc((Xn-Xk)/ Shag);

for tt:=1 to Nstep do

begin

if ((Yn-(Xn-KoordX+Shag)*Ugol) - (KoordY-Shag))<= Shag1

then

begin

k:=32;

Step;

if err=4 then exit;

end

else

begin

k:=4;

Step;

if err=4 then exit;

end; { if }

end ; { for tt }

end; { else }

end; { case 4 }

8: begin { направление движения по оси +Y }

if Xk >= Xn then { направление по оси +X +Y }

begin

Ugol:=(Xk-Xn)/(Yk-Yn);

Nstep:= Trunc((Yk-Yn)/ Shag );

for tt:=1 to Nstep do

begin

if ((KoordX+Shag)-(Xn+(KoordY-Yn+Shag)*Ugol))<= Shag1

then

begin

k:=128;

Step;

if err=4 then exit;

end

else

begin

k:=8;

Step;

if err=4 then exit;

end;

end;

end

else { направление по оси +Y - X }

begin

Ugol:=(Xn-Xk)/(Yk-Yn);

Nstep:= trunc((Yk-Yn)/ Shag);

for tt:=1 to Nstep do

begin

if ((Xn-(KoordY-Yn+Shag)*Ugol) - (KoordX-Shag))<= Shag1

then

begin

k:=64;

Step;

if err=4 then exit;

end

else

begin

k:=8;

Step;

if err=4 then exit;

end ;

end;

end ;

end;

2: begin { направление движения по оси -Y }

if Xk >= Xn then { направление по оси -Y +X }

begin

Ugol:=(Xk-Xn)/(Yn-Yk);

Nstep:= Trunc((Yn-Yk)/ Shag );

for tt:=1 to Nstep do

begin

if ((KoordX+Shag)-(Xn+(Yn-KoordY+Shag)*Ugol)) <= Shag1

then

begin

k:=16;

Step;

if err=4 then exit;

end

else

begin

k:=2;

Step;

if err=4 then exit;

end ; { if }

end; { for tt }

end

else { направление по оси -Y -X }

begin

Ugol:=(Xn-Xk)/(Yn-Yk);

Nstep:= trunc((Yn-Yk)/ Shag);

for tt:=1 to Nstep do

begin

if ((Xn-(Yn-KoordY+Shag)*Ugol) - (KoordX-Shag))<= Shag1

then

begin

k:=32;

Step;

if err=4 then exit;

end

else

begin

k:=2;

Step;

if err=4 then exit;

end;

end;

end ;

end;

end;

end; { конец подпрограммы }

{***********************************************************************}

{***********************************************************************}

{ вывод на индикатор количества или номера коммутатора }

procedure OutNumber(NumberKomm:Word);

var

M2,M1,M0,M21:byte;

begin

M2:=NumberKomm div 100;

M1:=(NumberKomm - M2*100) div 10;

M0:=NumberKomm - M2*100 -M1*10;

M21:=(M1 shl 4 ) + M0;

Port[$300]:= M21;

Port[$301]:=150;

Port[$301]:=134;

Port[$301]:=150;

Port[$300]:=M2;

Port[$301]:=151;

Port[$301]:=135;

Port[$301]:=151;

end;

{**************************************************************************}

{***********************************************************************}

{ вывод на индикатор текущего времени заливки геля }

procedure OutSpeed(ps:byte);

begin

Port[$301]:=149;

Port[$300]:=ps;

delay(1);

Port[$301]:=133;

Port[$301]:=149;

end;

{***********************************************18**************************}

{ Їа®Ја ¬¬  § ¦ЁЈ ­Ёп ᢥ⮤Ё®¤®ў }

procedure Led;

begin

Port[$301]:=146;

Port[$300]:=avt+man+podd+litr+Led_ready+Led_ostatok+Led_time;

delay(1);

Port[$301]:=130;

Port[$301]:=146;

if Led_ready =128 then

begin

Port[$301]:=28+128;

Port[$300]:=14;

Port[$301]:=12+128;

Port[$301]:=28+128;

end;

end;

{*************************************************************************}

procedure Zalivka;

{ расчет времени на заливку коммутатора }

begin

Gettime(h,min,s,ms);

ttime:=(h*60+min)+15;

{ коррекция времени заливки по времени }

case ttime of

0..5: Time_Zal:=50;

6..8: Time_Zal:=51;

9..12: Time_Zal:=52;

13..14: Time_Zal:=53;

15..16: Time_Zal:=54;

17..18: Time_Zal:=55;

19..20: Time_Zal:=56;

21..22: Time_Zal:=57;

23..24: Time_Zal:=58;

Соседние файлы в предмете Системное программное обеспечение