Поиск центра заготовки

Система управления станками с ЧПУ на основе контроллера KFLOP
Аватара пользователя
AlexNikov
Вникающий
Сообщения: 153
Зарегистрирован: 23 окт 2015, 21:54
Репутация: 309
Настоящее имя: Алексей
Город: Томск
Страна: Россия
Контактная информация:

Поиск центра заготовки

#1 

Сообщение AlexNikov » 09 апр 2016, 13:39

Доделал наконец-то еще один скрипт - поиск центра заготовки (круглая, квадратная, прямоугольная).
Алгоритм такой:
- Щуп расположить нужно над заготовкой в примерном её центре, но не далее чем в 5мм от центра (замеряю штангелем с ставлю риску)
- Указываем размеры заготовки по X в мм.
- Указываем размеры заготовки по Y в мм.
- Щуп ищет центр заготовки

Если закрыть окна запроса, выполнение скрипта прекратиться.

Так выглядит запрос размеров:
https://youtu.be/i7a9MBsp_dU

После ввода данных начинается выполнение скрипта:
https://youtu.be/xAArqZVRcAk

Сам скрипт:

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

#include "KMotionDef.h"

int DoPC(int cmd);
int DoPCInt(int cmd, int i);
//------USER_DATE------------
#define TMP 10 // which spare persist to use to transfer data
#define GATH_OFF 0  			// define the offset into the Gather buffer where strings are passed
#define SENS 4 				//Номер бита центроискателя
#define IMP_INCH 32574 			//Колличество импульсов на дюйм
#define AXIS_JOG_SPEED 25000		//Скорость перемещения осей при холостых перебегах
#define AXIS_SENS_SPEED 400		//Скорость перемещения осей для касания стилуса
//------USER_DATE------------

#include "KflopToKMotionCNCFunctions.c"

//--------ОБЯЗАТЕЛЬНО К ПРОЧТЕНИЮ-----------
//Для верного выполнения скрипта необходимо:
//1. Расположить центроискатель над загтовкой в примерном её центре (отступ от центра не далее 5мм)
//--------ОБЯЗАТЕЛЬНО К ПРОЧТЕНИЮ-----------

main()
{     	
	
int Answer;
	float dist1,dist2,DIST_1_I,DIST_2_I;
	double IMP,MV,DIST_MX_1,DIST_MX_2,DIST_MY_1,DIST_MY_2,PX0,PX1,PX2,PX3,PX4,PX5,PX6,PX7,PX8,PX9,PY0,PY1,PY2,PY3,PY4,PY5,PY6,PY7,PY8,PY9,PZ0,PZ1,PZ2,Z_UP,Z_DN,AXIS_SENS_2_SPEED,AXIS_UP;
	

	Answer = InputBox("Размер по X",&dist1);
		if (Answer)
			{
			Answer = MsgBox("Работа остановлена!",MB_OK|MB_ICONEXCLAMATION);
			}
		else
			{
			Answer = InputBox("Размер по Y",&dist2);
					if (Answer)
						{
						Answer = MsgBox("Работа остановлена!",MB_OK|MB_ICONEXCLAMATION);
						}
					else
						{

//Рассчеты
	IMP = IMP_INCH;
	AXIS_SENS_2_SPEED = AXIS_SENS_SPEED*4;
	DIST_1_I = (IMP*dist1)/25.4;
	DIST_2_I = (IMP*dist2)/25.4;
	MV = (IMP*5)/25.4;
	Z_UP = (IMP*3)/25.4;
	Z_DN = (IMP*6)/25.4;
	AXIS_UP = (IMP*0.5)/25.4;
	
	
//Zapominaem nachalnoe polozhenie
	PX0 = chan[0].Dest;
	PY0 = chan[1].Dest;
	
	DIST_MX_1 = PX0-(DIST_1_I/2+MV);
	DIST_MX_2 = PX0+(DIST_1_I/2+MV);
	DIST_MY_1 = PY0-(DIST_2_I/2+MV);
	DIST_MY_2 = PY0+(DIST_2_I/2+MV);
	
	
//Опускаем сканер по оси Z до касания заготовки, поднимаем сканер на 2мм над заготовкой
	Jog(2,-AXIS_SENS_2_SPEED); 		
	while (ReadBit(SENS));		 	
	Jog(2,0);				
	Delay_sec(0.2);			 	
	PZ0 = chan[2].Dest;      		
	PZ1=PZ0+Z_UP;       			
	MoveAtVel(2,PZ1,AXIS_JOG_SPEED); 
	while (!CheckDone(2)); 

//Замер заготовки по X
	MoveAtVel(0,DIST_MX_1,AXIS_JOG_SPEED);
	while (!CheckDone(0));
	PZ2 = PZ1-Z_DN;
	MoveAtVel(2,PZ2,AXIS_JOG_SPEED);
	while (!CheckDone(2));
	PX1 = chan[0].Dest;
	Jog(0,AXIS_SENS_2_SPEED); 		
	while (ReadBit(SENS));		 	
	Jog(0,0);
	PX2 = chan[0].Dest;
	PX3 = PX2-AXIS_UP;
	Delay_sec(0.2);
	MoveAtVel(0,PX3,AXIS_JOG_SPEED);
	while (!CheckDone(0));
	Jog(0,AXIS_SENS_SPEED); 		
	while (ReadBit(SENS));		 	
	Jog(0,0);
	PX4 = chan[0].Dest;	//итоговая координата касания X1
	Delay_sec(0.2);
	MoveAtVel(0,PX1,AXIS_JOG_SPEED);
	while (!CheckDone(0));
	MoveAtVel(2,PZ1,AXIS_JOG_SPEED);
	while (!CheckDone(2));
	MoveAtVel(0,DIST_MX_2,AXIS_JOG_SPEED);
	while (!CheckDone(0));
	MoveAtVel(2,PZ2,AXIS_JOG_SPEED);
	while (!CheckDone(2));
	PX5 = chan[0].Dest;
	Jog(0,-AXIS_SENS_2_SPEED); 		
	while (ReadBit(SENS));		 	
	Jog(0,0);
	PX6 = chan[0].Dest;
	PX7 = PX6+AXIS_UP;
	Delay_sec(0.2);
	MoveAtVel(0,PX7,AXIS_JOG_SPEED);
	while (!CheckDone(0));
	Jog(0,-AXIS_SENS_SPEED); 		
	while (ReadBit(SENS));		 	
	Jog(0,0);
	PX8 = chan[0].Dest;	//итоговая координата касания X2
	Delay_sec(0.2);
	MoveAtVel(0,PX5,AXIS_JOG_SPEED);
	while (!CheckDone(0));
	MoveAtVel(2,PZ1,AXIS_JOG_SPEED);
	while (!CheckDone(2));
	PX9 = (PX4+PX8)/2;
	MoveAtVel(0,PX9,AXIS_JOG_SPEED);
	while (!CheckDone(0));
	
//Замер заготовки по Y
	MoveAtVel(1,DIST_MY_1,AXIS_JOG_SPEED);
	while (!CheckDone(1));
	MoveAtVel(2,PZ2,AXIS_JOG_SPEED);
	while (!CheckDone(2));
	PY1 = chan[1].Dest;
	Jog(1,AXIS_SENS_2_SPEED); 		
	while (ReadBit(SENS));		 	
	Jog(1,0);
	PY2 = chan[1].Dest;
	PY3 = PY2-AXIS_UP;
	Delay_sec(0.2);
	MoveAtVel(1,PY3,AXIS_JOG_SPEED);
	while (!CheckDone(1));
	Jog(1,AXIS_SENS_SPEED); 		
	while (ReadBit(SENS));		 	
	Jog(1,0);
	PY4 = chan[1].Dest;	//итоговая координата касания Y1
	Delay_sec(0.2);
	MoveAtVel(1,PY1,AXIS_JOG_SPEED);
	while (!CheckDone(1));
	MoveAtVel(2,PZ1,AXIS_JOG_SPEED);
	while (!CheckDone(2));
	MoveAtVel(1,DIST_MY_2,AXIS_JOG_SPEED);
	while (!CheckDone(1));
	MoveAtVel(2,PZ2,AXIS_JOG_SPEED);
	while (!CheckDone(2));
	PY5 = chan[1].Dest;
	Jog(1,-AXIS_SENS_2_SPEED); 		
	while (ReadBit(SENS));		 	
	Jog(1,0);
	PY6 = chan[1].Dest;
	PY7 = PY6+AXIS_UP;
	Delay_sec(0.2);
	MoveAtVel(1,PY7,AXIS_JOG_SPEED);
	while (!CheckDone(1));
	Jog(1,-AXIS_SENS_SPEED); 		
	while (ReadBit(SENS));		 	
	Jog(1,0);
	PY8 = chan[1].Dest;	//итоговая координата касания Y2
	Delay_sec(0.2);
	MoveAtVel(1,PY5,AXIS_JOG_SPEED);
	while (!CheckDone(1));
	MoveAtVel(2,PZ1,AXIS_JOG_SPEED);
	while (!CheckDone(2));
	PY9 = (PY4+PY8)/2;
	MoveAtVel(1,PY9,AXIS_JOG_SPEED);
	while (!CheckDone(1));
			
//Присваиваем положению осей в углу заготовки X=0 и Y=0
	DoPCFloat(PC_COMM_SET_X,0);
	DoPCFloat(PC_COMM_SET_Y,0);
			
//Перемещем ось Z в положительном направлении в координату Z=0 (в машинный ноль)	
	MoveAtVel(2,0,AXIS_JOG_SPEED);		
	while (!CheckDone(2));			
	Jog(2,0);				
						}
				}	
}

//Далее код для ввода данных от 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;
}

Аватара пользователя
Electric
Ученик
Сообщения: 742
Зарегистрирован: 02 сен 2014, 03:30
Репутация: 385
Настоящее имя: Андрей
Страна: Россия

Re: Поиск центра заготовки

#2 

Сообщение Electric » 12 апр 2016, 16:59

Ну, Лёша - молодец! Долго не появлялся, а как появился, сразу столько нового принёс с собой :D :excellent:
Что такое шаговое напряжение? Это напряжение, которое возникает между ногами при приближении к оголенному концу...

Аватара пользователя
BenAflek
Мастер
Сообщения: 882
Зарегистрирован: 29 окт 2014, 10:16
Репутация: 342
Настоящее имя: Владислав
Страна: Россия

Re: Поиск центра заготовки

#3 

Сообщение BenAflek » 28 апр 2016, 20:06

AlexNikov, Был у нас по Кфлопам один мастер - ukr-sasha, а теперь еще и ты без устали что-то делаешь, скрипты пишешь. :) Молодец! :excellent:
Здесь должно что-то быть?...

Аватара пользователя
Predator
Мастер
Сообщения: 2891
Зарегистрирован: 30 авг 2014, 20:14
Репутация: 1611
Настоящее имя: Александр
Страна: Россия

Re: Поиск центра заготовки

#4 

Сообщение Predator » 28 апр 2016, 21:32

Лёха, у нас молодец! Купил контроллер и начал с нуля изучать, как видим успешно и с хорошими результатами. Собственно говоря, Саша, начинал точно также, BenAflek, ты ведь не думаешь, что он с этими знаниями родился?! :D
Великую цивилизацию не покорить извне — пока она не разрушит себя изнутри! © Уильям Дюрант

Аватара пользователя
Electric
Ученик
Сообщения: 742
Зарегистрирован: 02 сен 2014, 03:30
Репутация: 385
Настоящее имя: Андрей
Страна: Россия

Re: Поиск центра заготовки

#5 

Сообщение Electric » 29 апр 2016, 15:29

BenAflek писал(а):Источник цитаты Был у нас по Кфлопам один мастер

Что значит "был"? Он и сейчас есть! А, чем больше мастеров, тем лучше! :yoyo:
Что такое шаговое напряжение? Это напряжение, которое возникает между ногами при приближении к оголенному концу...

Аватара пользователя
BenAflek
Мастер
Сообщения: 882
Зарегистрирован: 29 окт 2014, 10:16
Репутация: 342
Настоящее имя: Владислав
Страна: Россия

Re: Поиск центра заготовки

#6 

Сообщение BenAflek » 26 май 2016, 12:53

Пардон, немного не так выразился :confused:
Здесь должно что-то быть?...

Аватара пользователя
Predator
Мастер
Сообщения: 2891
Зарегистрирован: 30 авг 2014, 20:14
Репутация: 1611
Настоящее имя: Александр
Страна: Россия

Re: Поиск центра заготовки

#7 

Сообщение Predator » 26 май 2016, 19:23

BenAflek, В следующий раз, аккуратней с выражениями! ;)
Великую цивилизацию не покорить извне — пока она не разрушит себя изнутри! © Уильям Дюрант

Аватара пользователя
Wako
Вникающий
Сообщения: 188
Зарегистрирован: 23 май 2016, 17:56
Репутация: 78
Настоящее имя: Вако
Город: Гелион-Прайм
Страна: Россия

Re: Поиск центра заготовки

#8 

Сообщение Wako » 30 май 2016, 14:09

Алексей, молодец! Столько всяких датчиков наделал :excellent:

Аватара пользователя
AlexNikov
Вникающий
Сообщения: 153
Зарегистрирован: 23 окт 2015, 21:54
Репутация: 309
Настоящее имя: Алексей
Город: Томск
Страна: Россия
Контактная информация:

Re: Поиск центра заготовки

#9 

Сообщение AlexNikov » 30 май 2016, 15:07

Wako писал(а):Источник цитаты Алексей, молодец! Столько всяких датчиков наделал :excellent:


Собственно датчиков то я не одного еще не сделал :D А скрипты кой какие навоял ага :D

Аватара пользователя
Predator
Мастер
Сообщения: 2891
Зарегистрирован: 30 авг 2014, 20:14
Репутация: 1611
Настоящее имя: Александр
Страна: Россия

Re: Поиск центра заготовки

#10 

Сообщение Predator » 30 май 2016, 15:16

AlexNikov писал(а):Источник цитаты Собственно датчиков то я не одного еще не сделал
Ну, Реник подшаманил, который уже успешно трудится на станке! ;)
Великую цивилизацию не покорить извне — пока она не разрушит себя изнутри! © Уильям Дюрант

Аватара пользователя
Electric
Ученик
Сообщения: 742
Зарегистрирован: 02 сен 2014, 03:30
Репутация: 385
Настоящее имя: Андрей
Страна: Россия

Re: Поиск центра заготовки

#11 

Сообщение Electric » 09 июн 2016, 13:56

AlexNikov писал(а):Источник цитаты Собственно датчиков то я не одного еще не сделал

Так, а когда уже опытные образцы обкатывать начнешь? :where:
Что такое шаговое напряжение? Это напряжение, которое возникает между ногами при приближении к оголенному концу...


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

Сейчас на форумах

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей