Поиск угла заготовки под управлением K-FLOP

KFlop, KStep, KAnalog, KMotion...
Аватара пользователя
AlexNikov
Мастер
Сообщения: 1212
Зарегистрирован: 05 янв 2014, 20:09
Репутация: 721
Настоящее имя: Алексей
Откуда: Томск
Контактная информация:

Поиск угла заготовки под управлением K-FLOP

Сообщение AlexNikov »

Доброго здравия всем.

Еще одна задачка, которую я осилил в K-FLOP это поиск угла заготовки по средствам проводного сканера (не сочтите за рекламу, сканер покупал тут - Проводной ЧПУ сканер). Нужно еще допилить код для поиска внутреннего угла и центра отверстия, но по сути алгоритмы очень схожи.

Полезная штука для поиска нуля (угол по идее чаще всего и есть ноль заготовки, или же точка привязки) при первоначальной установке, но для меня это стало спасением при повторной установке деталей с поворотом/переворотом. Можно конечно воспользоваться упорами и не мучиться с этим сканером, но так интереснее :D

Алгоритм выполнения в общих чертах такой:
1. Опускаемся по Z до касания заготовки,
2. Поднимаемся над заготовкой, отъезжаем назад на 10мм по X и опускаемся на 5мм.,
3. Касаемся края заготовки,
4. Уезжаем начальную точку измерения,
5. То же самое проделываем по оси Y,
6. Делаем компенсацию диаметра шарика сенсора и едем точно в угол заготовки.

Вот видео самого процесса:
http://www.youtube.com/watch?v=W5GEOwiUeR0

А вот код, под управлением которого работает данный алгоритм (прошу прощения за коменты в коде на транслите, но компилятор k-flop не умеет печатать русские буквы, а писать коменты в отдельном редакторе не очень удобно), есть несколько идей по исключению некоторых лишних перемещений, но пока так:

Код: Выделить всё

#include "KMotionDef.h"

int DoPC(int cmd);
int DoPCInt(int cmd, int i);
#define GATH_OFF 0  // define the offset into the Gather buffer where strings are passed

main()
{     	
	int Answer;
	double *pD = (double *)persist.UserData;
	double PZ0,PZ1,PZ2,PX0,PX1,PX2,PX3,PY0,PY1,PY2,PY3;

// PZ0 - tochka kasania skanerom zagotovki po osi Z
// PZ1 - tochka na 2mm nad zagotovkoy
// PZ2 - tochka na 5mm nizhe tochki PZ1 (na 3mm nizhe zagotovki)
// PX0 - tochka na osi X nachala izmerenia
// PX1 - tochka na 10mm nazad ot nachal'noy tochki X PX0
// PX2 - tochka kraiya zagotovki po osi X bez kompensacii diametra sharika sensora
// PX3 - tochka kraiya zagotovki po osi X s kompensaciey diametra sharika sensora
// PY0 - tochka na osi Y nachala izmerenia
// PY1 - tochka na 10mm nazad ot nachal'noy tochki Y PY0
// PY2 - tochka kraiya zagotovki po osi Y bez kompensacii diametra sharika sensora
// PY3 - tochka kraiya zagotovki po osi Y s kompensaciey diametra sharika sensora

		
//Opuskaemsia skanerom do kasania zagotovki, podnimaem os' Z na 2mm nad zagotovkoy i zapominaem polozhenie po osiam X,Y,Z

		Jog(2,-800); 			 	// opuskaem os' Z vniz do kasania zagotovki
		while (ReadBit(4));		 	// zhdem kasania i srabativania sensora s bit-4
		Jog(2,0);				 	// ostanavlivaem os' Z
		PZ0 = chan[2].Dest;      	// zapisivaem polozhenie osi Z v peremennuyu PZ0
		Delay_sec(0.3);			 	// zhdem 0.3 sec
		PZ1=PZ0+2564.8818;       	// peremennoy PZ0 dobavlayem 2mm (2564.8818 impulsov) i prisvevaem peremennoy PZ1
		MoveAtVel(2,PZ1,25000);  	// peremeshaem os' Z na polozhenie PZ1
		while (!CheckDone(2));   	// zhdem okonchania dvizhenia osi Z
		Delay_sec(0.3);			 	// zhdem 0.3 sec
		PX0 = chan[0].Dest;			// zapisivaem polozhenie osi X v peremennuyu PX0 - tochka nachala izmerenia X
		PY0 = chan[1].Dest;			// zapisivaem polozhenie osi Y v peremennuyu PY0 - tochka nachala izmerenia Y
		
		
//Ot'ezhaem na 10mm nazad po osi X, opuskaem os' Z na 5mm vniz, edem po X vpered dokasaia sensorom zagotovki i zapominaem tochku osi X - kray zagotovki
		
		PX1=PX0-12824.4094;			// peremennoy PX0 otnimaem 10mm (12824.4094 inpulsov) i prisvevaem peremennoy PX1
		MoveAtVel(0,PX1,25000);		// os' X peremeshaem v polozhenie PX1
		while (!CheckDone(0));   	// zhdem okonchania dvizhenia osi X
		Delay_sec(0.3);			 	// zhdem 0.3 sec
		PZ2=PZ1-6412.2047;			// ot peremennoy PZ1 otnimaem 5mm (6412.2047 impulsov) i prisvaevaem peremennoy PZ2
		MoveAtVel(2,PZ2,25000);  	// peremeshaem os' Z v polozhenie PZ2
		while (!CheckDone(2));   	// zhdem okonchania dvizhenia osi Z
		Jog(0,800);					// peremeshaem os' X vpered do kasania zagotovki
		while (ReadBit(4));		 	// zhdem kasania i srabativania sensora s bit-4
		Jog(0,0);				 	// ostanavlivaem os' X
		Delay_sec(0.3);				// zhdem 0.3 sec
		PX2 = chan[0].Dest;			// zapisivaem polozhenie osi X na krayu zagotovki
		
		
//Ot'ezhaem nazad po X ot zagotovki na 10mm, podnimaem os' Z na 2mm nad zagotovkoy i edem po osi X d tochku nachala izmerenia X

		MoveAtVel(0,PX1,25000);		// os' X peremeshaem v polozhenie PX1
		while (!CheckDone(0));   	// zhdem okonchania dvizhenia osi X
		MoveAtVel(2,PZ1,25000);  	// peremeshaem os' Z v polozhenie PZ1
		while (!CheckDone(2));   	// zhdem okonchania dvizhenia osi Z
		Delay_sec(0.3);			 	// zhdem 0.3 sec
		MoveAtVel(0,PX0,25000);  	// peremeshaem os' X v polozhenie PX0
		while (!CheckDone(0));   	// zhdem okonchania dvizhenia osi X
		Delay_sec(0.3);			 	// zhdem 0.3 sec
		
		
//Ot'ezhaem na 10mm nazad po osi Y, opuskaem os' Z na 5mm vniz, edem po Y vpered dokasaia sensorom zagotovki i zapominaem tochku osi Y - kray zagotovki
		
		PY1=PY0-12824.4094;			// peremennoy PY0 otnimaem 10mm (12824.4094 inpulsov) i prisvevaem peremennoy PY1
		MoveAtVel(1,PY1,25000);		// os' Y peremeshaem v polozhenie PY1
		while (!CheckDone(1));   	// zhdem okonchania dvizhenia osi Y
		Delay_sec(0.3);			 	// zhdem 0.3 sec
		MoveAtVel(2,PZ2,25000);  	// peremeshaem os' Z v polozhenie PZ2
		while (!CheckDone(2));   	// zhdem okonchania dvizhenia osi Z
		Jog(1,800);					// peremeshaem os' X vpered do kasania zagotovki
		while (ReadBit(4));		 	// zhdem kasania i srabativania sensora s bit-4
		Jog(1,0);				 	// ostanavlivaem os' X
		Delay_sec(0.3);				// zhdem 0.3 sec
		PY2 = chan[1].Dest;			// zapisivaem polozhenie osi X na krayu zagotovki
		
		
//Ot'ezhaem nazad po Y ot zagotovki na 10mm, podnimaem os' Z na 2mm nad zagotovkoy i edem po osi X d tochku nachala izmerenia X

		MoveAtVel(1,PY1,25000);		// os' X peremeshaem v polozhenie PX1
		while (!CheckDone(1));   	// zhdem okonchania dvizhenia osi X
		MoveAtVel(2,PZ1,25000);  	// peremeshaem os' Z v polozhenie PZ1
		while (!CheckDone(2));   	// zhdem okonchania dvizhenia osi Z
		Delay_sec(0.3);			 	// zhdem 0.3 sec
		MoveAtVel(1,PY0,25000);  	// peremeshaem os' X v polozhenie PX0
		while (!CheckDone(1));   	// zhdem okonchania dvizhenia osi X
		Delay_sec(0.3);			 	// zhdem 0.3 sec
		
		
//Raschitivaem tochki kraev zagotovki s kompensiciey diametra sharika sensora

		PX3=PX2+1025.9527;			// k tochke kasania sensora po X pribavliaem 0.8mm (diametr sharika sensora 1.6mm)
		PY3=PY2+1025.9527;			// k tochke kasania sensora po Y pribavliaem 0.8mm (diametr sharika sensora 1.6mm)
		
		
//Edem v ugol zagotovi
		
		MoveAtVel(0,PX3,25000);		// os' X peremeshaem v polozhenie PX3
		while (!CheckDone(0));   	// zhdem okonchania dvizhenia osi X
		MoveAtVel(1,PY3,25000);		// os' Y peremeshaem v polozhenie PY3
		while (!CheckDone(1));   	// zhdem okonchania dvizhenia osi Y
		
//Prisvaivaem uglu polozhenie X=0, Y=0

		DoPCFloat(PC_COMM_SET_X,0);
		DoPCFloat(PC_COMM_SET_Y,0);
		Delay_sec(0.1);
	
}

//Kod vvoda dannih ot DoPCFloat

int SetVars(int varoff, int n, int poff)
{
   persist.UserData[PC_COMM_PERSIST+2] = n;       // number of elements
   persist.UserData[PC_COMM_PERSIST+3] = poff;    // persist offset (doubles)
   return DoPCInt(PC_COMM_SET_VARS,varoff);       // Var index and Cmd
}
int GetVars(int varoff, int n, int poff)
{
   persist.UserData[PC_COMM_PERSIST+2] = n;       // number of elements
   persist.UserData[PC_COMM_PERSIST+3] = poff;    // persist offset (doubles)
   return DoPCInt(PC_COMM_GET_VARS,varoff);       // Var index and Cmd
}

#define GATH_OFF 0  // define the offset into the Gather buffer where strings are passed
// Trigger a message box on the PC to be displayed
// defines for MS Windows message box styles and Operator
// response IDs are defined in the KMotionDef.h file 
int MsgBox(char *s, int Flags)
{
   char *p=(char *)gather_buffer+GATH_OFF*sizeof(int);
   int i;
   
   do // copy to gather buffer w offset 0
   {
      *p++ = *s++;
   }while (s[-1]);
   
   persist.UserData[PC_COMM_PERSIST+2] = Flags;  // set options
   DoPCInt(PC_COMM_MSG,GATH_OFF);
   return persist.UserData[PC_COMM_PERSIST+3];
}
// put the MDI string (Manual Data Input - GCode) in the 
// gather buffer and tell the App where it is
int MDI(char *s)
{
   char *p=(char *)gather_buffer+GATH_OFF*sizeof(int);
   int i;
   
   do // copy to gather buffer w offset 0
   {
      *p++ = *s++;
   }while (s[-1]);
   
   // issue the command an wait till it is complete
   // (or an error - such as busy)
   return DoPCInt(PC_COMM_MDI,GATH_OFF);
}
// Put a Float as a parameter and pass the command to the App
int DoPCFloat(int cmd, float f)
{
   int result;
   persist.UserData[PC_COMM_PERSIST+1] = *(int*)&f;
   return DoPC(cmd);
}
// Put an integer as a parameter and pass the command to the App
int DoPCInt(int cmd, int i)
{
   int result;
   persist.UserData[PC_COMM_PERSIST+1] = i;
   return DoPC(cmd);
}
// Pass a command to the PC and wait for it to handshake
// that it was received by either clearing the command
// or changing it to a negative error code
int DoPC(int cmd)
{
   int result;
   
   persist.UserData[PC_COMM_PERSIST]=cmd;
   
   do
   {
      WaitNextTimeSlice();   
   }while (result=persist.UserData[PC_COMM_PERSIST]>0);
   
   //printf("Result = %d\n",result);
   return result;
}
Аватара пользователя
AlexNikov
Мастер
Сообщения: 1212
Зарегистрирован: 05 янв 2014, 20:09
Репутация: 721
Настоящее имя: Алексей
Откуда: Томск
Контактная информация:

Re: Поиск угла заготовки под управлением K-FLOP

Сообщение AlexNikov »

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

В качестве пробы простейший скрипт:

Код: Выделить всё

#include "KMotionDef.h"
#include "math.h"

int main(void)
{
printf("%1.1f %1.1", fabs(1.0), fabs(-1.0));
return 0;
}


Библиотеку math.h положил в папку с файлом скрипта.

При компиляции выпадает ошибка "неопределенный символ "fabs":
eror.jpg (7449 просмотров) <a class='original' href='./download/file.php?id=68103&sid=b397cbd7af218f2c56896bbb11857dd0&mode=view' target=_blank>Загрузить оригинал (75.11 КБ)</a>
Прогаммист из меня как из коровы балерина и получается сделать больше по примеру да по памяти с универа по синтаксису дельфи.

Куда чего копать мб знает кто?
Аватара пользователя
selenur
Почётный участник
Почётный участник
Сообщения: 4604
Зарегистрирован: 21 авг 2013, 19:44
Репутация: 1621
Настоящее имя: Сергей
Откуда: Новый Уренгой
Контактная информация:

Re: Поиск угла заготовки под управлением K-FLOP

Сообщение selenur »

А в файле math.h есть такая функция fabs?
Что твоему должна была сделать эта функция с числами? или что нужно получить?
Мой сайт: http://selenur.ru
Исходники моих программ: https://github.com/selenur
Instagram https://www.instagram.com/zheigurov/
Аватара пользователя
AlexNikov
Мастер
Сообщения: 1212
Зарегистрирован: 05 янв 2014, 20:09
Репутация: 721
Настоящее имя: Алексей
Откуда: Томск
Контактная информация:

Re: Поиск угла заготовки под управлением K-FLOP

Сообщение AlexNikov »

selenur писал(а):А в файле math.h есть такая функция fabs?
Что твоему должна была сделать эта функция с числами? или что нужно получить?
Файлик math.h прикладываю. fabs в нем упоминается, но понять синтаксис сложновато мне.

Этот скрипт просто пример, который я взял из интернета. У меня в скрипте в ходе замеров переменным (PZ1 и PZ2) присваиваются определенные значения положения оси, которые могут быть как положительные так и отрицательные. Во всяком случае я так предполагаю. Значения берем следующим образом PZ1 = chan[2].Dest; PX2 = chan[2].Dest; в определенные моменты времени. В каком виде получаем эти PZ1 и PZ2 если честно еще не глядел (в импульсах относительно машинного нуля - тогда эти значения всегда положительные, или же это положение оси и тогда это может быть как положительное положение так и отрицательное относительно нуля координаты), нужно будет подразобраться тут :thinking: .
math.h
(8.23 КБ) 1158 скачиваний
Аватара пользователя
Predator
Мастер
Сообщения: 9583
Зарегистрирован: 18 июл 2013, 18:26
Репутация: 2531
Контактная информация:

Re: Поиск угла заготовки под управлением K-FLOP

Сообщение Predator »

AlexNikov, Есть одно подозрение, почему ругается, но утверждать не стану. Отписал в твоей теме, проверь, может в этом причина. :wik:
Аватара пользователя
AlexNikov
Мастер
Сообщения: 1212
Зарегистрирован: 05 янв 2014, 20:09
Репутация: 721
Настоящее имя: Алексей
Откуда: Томск
Контактная информация:

Re: Поиск угла заготовки под управлением K-FLOP

Сообщение AlexNikov »

Predator писал(а):AlexNikov, Есть одно подозрение, почему ругается, но утверждать не стану. Отписал в твоей теме, проверь, может в этом причина. :wik:

Саш не это не при делах.

Актуальность проблемы перешла на второй план, данные получаемые по chan[0].Dest в импульсах относительно машинного нуля:

PX0 в машинном нуле
X0.jpg (7414 просмотров) <a class='original' href='./download/file.php?id=68111&sid=b397cbd7af218f2c56896bbb11857dd0&mode=view' target=_blank>Загрузить оригинал (139.73 КБ)</a>
PX0 в координате 25,4мм (в настройках KmotionCNC 32754 импульса на дюйм)
X25.4.jpg (7414 просмотров) <a class='original' href='./download/file.php?id=68112&sid=b397cbd7af218f2c56896bbb11857dd0&mode=view' target=_blank>Загрузить оригинал (140.08 КБ)</a>
Если обнулить текущую координату и снова уехать на 25,4мм то PX0 больше в два раза соответственно.

Так что проблемы с расчетами в моей задумке больше нет, но на досуге надо будет повозиться с функцией модуля числа...да и кроме модуля можно много чего интересного сделать с math.h :thinking:
Аватара пользователя
Predator
Мастер
Сообщения: 9583
Зарегистрирован: 18 июл 2013, 18:26
Репутация: 2531
Контактная информация:

Re: Поиск угла заготовки под управлением K-FLOP

Сообщение Predator »

AlexNikov писал(а):Саш не это не при делах.
Уже понял ;)
Аватара пользователя
ukr-sasha
Мастер
Сообщения: 3401
Зарегистрирован: 21 мар 2011, 07:47
Репутация: 2180
Настоящее имя: Украинец Александр Григорьевич
Откуда: Киев, Украина
Контактная информация:

Re: Поиск угла заготовки под управлением K-FLOP

Сообщение ukr-sasha »

AlexNikov писал(а):но на досуге надо будет повозиться с функцией модуля числа...да и кроме модуля можно много чего интересного сделать с math.h
не все математические функции поддерживаются кфлопом. связано, с тем, что он сам считает выражения в си файлах, а не комп. всё таки производительность ограничена.
Ответить

Вернуться в «KFlop»