Мегаобучалка Главная | О нас | Обратная связь


Методические указания к решению задачи 3



2020-02-04 202 Обсуждений (0)
Методические указания к решению задачи 3 0.00 из 5.00 0 оценок




При круговой интерполяции следует использовать оценочную функцию вида:

Fi = xi2 + yi2 – R2.

При отработке траектории в 1 квадранте против часовой стрелки, если применяется обычный алгоритм интерполяции, то расчетные соотношения примут вид:

· если Fi ≥ 0 (нахождение за пределом радиуса окружности), то шаг делается вдоль отрицательного направления оси х, т. е. хi+1 = xi – 1

Fi+1 =(xi – 1)2 +yi2 – R2 = Fi – 2xi + 1,

· если Fi < 0, то шаг делается в положительном направлении оси у, т. е. yi+1 = yi + 1

Fi+1 =xi 2 + (yi +1)2  – R2 = Fi + 2yi + 1.

При применении усовершенствованного алгоритма рекомендуется разбить квадрант пополам (π/4). При изменении угла от φ = 0, до φ =π/4 и при Fi ≥ 0 выдача шагов осуществляется по обеим координатам:

Fi+1 =(xi – 1)2 +(yi +1)2  – R2 = Fi – 2(xi – yi) + 2,

а при Fi < 0 только по ведущей координате (уi)

Fi+1 = Fi + 2yi + 1.

При изменении угла от π/4 до π/2 и Fi < 0 выдача шагов производится по обеим координатам, а при Fi ≥ 0 только по ведущей координате (хi)

Fi+1 = Fi – 2xi + 1.

Следует отметить, что при усовершенствованном алгоритме интерполяции затрачивается меньшее число тактов, что приводит к увеличению контурной скорости отработки траектории.

Если перемещение должно осуществляться в других квадрантах в выбранном направлении (по часовой стрелке или против часовой стрелки), то аналогично рассмотренному выше можно получить необходимые расчетные соотношения для Fi+1.

Приведенный ниже алгоритм предназначен для реализации метода оценочной функции во всех 4 квадрантах при движении в любом направлении [5]:

Принятые обозначения: I, J – координаты центра дуги;

                                    r – радиус дуги;

                                    τ – такт;

                                    F – скорость подачи, мм/ мин;

                                   d = h – дискретность системы ЧПУ, мм;

                                    ун, хн – начальная точка;

                                    ук, хк – конечная точка.

CIR: if TAKT > 1 then go to CYCLE

read xн , ун , хкк , I, J, ±F

r = sqr((xн – I)2 + (ун  - J)2)

x = xн ; y = ун ; codx = x; cody = y; f = 0

U= int(F*τ/(60*d));

if xн = I and ун > J then αн = π/2

if xн = I and ун < J then αн = 3*π/2

if xн > I then αн = atn((ун – J)/( xн – I))

if xн < I then αн = π + atn((ун – J)/( xн – I))

if xк = I and ук > J then αк = π/2

if xк = I and ук < J then αк = 3*π/2

if xк > I then αк = atn((ук – J)/( xк – I))

if xк < I then αк = π + atn((ук – J)/( xк – I))

if sgn(αн - αк) = sgn(U) then ∆α = abs(αн - αк)

else ∆α = 2π - abs(αн - αк)

L = 4 * r * ∆α/π ; l = 0

 

CYCLE: X = x – I; Y = y – J;

if abs(X) >= abs(Y) and sgn(f*sgn(X)*sgn(Y)) = sgn(U)

then(y = y – U*sgn(X); f = f – 2*Y*sgn(X) + U; go to END);

if abs(X) < abs(Y) and sgn(f*sgn(X)*sgn(Y) < > sgn(U)

then (X = X + U*sgn(Y); f = f + 2*X*sgn(Y) + U; go to END);

x = x + U*sgn(Y); y = y – U*sgn(X);

f = + 2*(abs(X) – abs(Y))*sgn(Y) + 2*U;

END: l = l + abs(X – codx) + abs(y – cody);

codx = x; cody = y;

if l < L then TAKT = TAKT + 1

else TAKT = 1

RETURN

 

Ниже приводится листинг программы на языке Си, которая реализует алгоритм оценочной функции, приведенный выше, с небольшими модификациями. Скорость подачи принята 1 шаг за один цикл алгоритма, направление движения по окружности зависит от введенных координат центра, начальной и конечной точек.

 

# include < stdio . h > /* Подключение библиотеки стандартных функций ввода-вывода */

# include < math . h >  /* Подключение библиотеки математических функций */

#define PI 3.1415         /* Определение числа p */

#define SGN(a) (((a) >= 0) ? 1 : -1) /* Определение макроса для вычисления знака переменной; макрос возвращает 1, если значение переменной ≥0 и возвращает -1, если значение переменной <0 */

int x _ n , y _ n , x _ k , y _ k , I , J ; /* Объявление целочисленных входных переменных для алгоритма: x _ n – начальная точка по оси X , y _ n – начальная точка по оси Y , x _ k – конечная точка по оси X , y _ k – конечная точка по оси Y , I – координата центра по оси X , J – координата центра по оси Y */

int x , y , r , codx , cody , f , L , l , X , Y ;  /* Объявление целочисленных внутренних переменных алгоритма: x , y – текущие координаты, r – радиус дуги, codx , cody – переменные для передачи координат исполнительному устройству, f – значение оценочной функции, L – полная длина пути по дуге, l – текущая пройденная длина, X , Y – разница между текущими координатами и центром окружности */

float a _ n , a _ k , da ; /* Объявление вещественных внутренних переменных алгоритма: a _ n – начальный угол в радианах, a _ k – конечный угол в радианах, da – отрабатываемый по дуге угол ( a _ k – a _ n ) */

/* Определение функции инициализации алгоритма */

void init() {

printf ("Введите x _ n , y _ n , x _ k , y _ k , I , J : "); /* Вывод сообщения с просьбой ввести значения входных переменных */

scanf ("% d % d % d % d % d % d ", & x _ n , & y _ n , & x _ k , & y _ k , & I , & J ); /* Ввод входных переменных пользователем */

r = sqrt((x_n - I)*(x_n - I) + (y_n - J) * ( y_n - J)); /* Вычисление радиуса дуги */

x = x_n;

y = y_n;

codx = x;

cody = y;

f = 0; /* Установка начальных значений внутренних переменных */

/* Вычисление начального угла по значениям x _ n , y _ n , I , J */

if(x_n == I && y_n > J)

    a_n = PI / 2;

if(x_n == I && y_n < J)

    a_n = 3 * PI / 2;

if(x_n > I)

    a_n = atan((y_n - J) / (x_n - I));

if(x_n < I)

    a_n = PI + atan((y_n - J) / (x_n - I));

/* Вычисление конечного угла по значениям x _ k , y _ k , I , J */

if(x_k == I && y_k > J)

    a_k = PI / 2;

if(x_k == I && y_k < J)

    a_k = 3 * PI / 2;

if(x_k > I)

    a_k = atan((y_k - J) / (x_k - I));

if(x_k < I)

    a_k = PI + atan((y_k - J) / (x_k - I));

da = a _ n - a _ k ; /* Вычисление угла поворота */

L = floor (4 * r * fabs ( da ) / PI + 0.5); /* Вычисление длины пути по дуге */

l = 0; /* Установка текущей длины пути в 0 */

printf("init: r=%d, a_n=%f, a_k=%f, da=%f, L=%d\n", r, a_n, a_k, da, L); /* Вывод на экран результатов инициализации */

}

/* Функция расчета очередного шага алгоритма оценочной функции */

void circle() {

/* Вычисление разницы между текущими координатами и центром окружности */

X = x – I ;

Y = y - J;

/* Вычисление нового значения оценочной функции и перемещение по соответствующим осям в зависимости от текущих координат и текущего значения оценочной функции */

if(abs(X) >= abs(Y) && SGN(f) * SGN(X) * SGN(Y) == SGN(da)) {

    y = y - SGN ( X ) * SGN ( da ); /* Изменение координаты y */

    f = f - 2 * Y * SGN ( X ) * SGN ( da ) + 1; /* Изменение значения оценочной функции */

}

else

if(abs(X) < abs(Y) && SGN(f) * SGN(X) * SGN(Y) != SGN(da)) {

    x = x + SGN ( Y ) * SGN ( da ); /* Изменение координаты x */

    f = f + 2 * X * SGN ( Y ) * SGN ( da ) + 1; /* Изменение значения оценочной функции */

}

else {

    x = x + SGN ( Y ) * SGN ( da ); /* Изменение координаты x */

    y = y - SGN ( X ) * SGN ( da ); /* Изменение координаты y */

/* Изменение значения оценочной функции */

    f = f +2 * ( abs ( X ) - abs ( Y )) * SGN ( Y ) * SGN ( X ) * SGN ( da )+ 2 * 1;

}

l = l + abs ( x - codx ) + abs ( y - cody ); /* Изменение пройденного пути */

codx = x ; cody = y ; /* Установка переменных для передачи исполнительному устройству */

printf (" f =% d \ tcodx =% d \ tcody =% d \ tl =% d \ n ", f , codx , cody , l ); /* Вывод результатов очередного шага алгоритма на экран */

}

/* Главная функция программы, с нее начинается выполнение */

int main () {

/* Вызов функции инициализации алгоритма оценочной функции */

init();

/* В этом месте можно передать начальные координаты cod _ x и cod _ y (равные x _ n и y _ n ) на исполнительное устройство */

/* Организация циклического вызова функции расчета очередного шага оценочной функции до тех пор пока текущий пройденный путь меньше полной длины пути по дуге */

while(l < L) {

    circle();

    /* В этом месте можно передать рассчитанные координаты cod _ x и cod _ y на исполнительное устройство */

}

return 0; /* Завершение главной функции программы */

}

 




2020-02-04 202 Обсуждений (0)
Методические указания к решению задачи 3 0.00 из 5.00 0 оценок









Обсуждение в статье: Методические указания к решению задачи 3

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней...
Как распознать напряжение: Говоря о мышечном напряжении, мы в первую очередь имеем в виду мускулы, прикрепленные к костям ...
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (202)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.007 сек.)