Поиск угла заготовки под управлением KFLOP
Система управления станками с ЧПУ на основе контроллера KFLOP
- Jack
- Новичок
- Сообщения: 27
- Зарегистрирован: 25 окт 2015, 14:45
- Репутация: 37
- Страна:
- AlexNikov
- Вникающий
- Сообщения: 154
- Зарегистрирован: 23 окт 2015, 19:54
- Репутация: 316
- Страна:
22
Да чот малость заглохла тема...надо дописать скрипты. Все сложности решились и полное понимание процесса так сказать есть. Выбрать нужно время и остальные скрипты довести до ума.
Итогом планирую:
1. Поиск левого/правого угла.
2. Поиск центра отверстия
3. Поиск центра круглой заготовки
4. поиск центра прямоугольной заготовки
Этого функционала в принципе достаточно думаю.
Итогом планирую:
1. Поиск левого/правого угла.
2. Поиск центра отверстия
3. Поиск центра круглой заготовки
4. поиск центра прямоугольной заготовки
Этого функционала в принципе достаточно думаю.
- BenAflek
- 2-й разряд
- Сообщения: 2655
- Зарегистрирован: 29 окт 2014, 08:16
- Репутация: 1054
- Страна:
23
Особенно для хоббийных работAlexNikov писал(а):Источник цитаты Этого функционала в принципе достаточно думаю.
- AlexNikov
- Вникающий
- Сообщения: 154
- Зарегистрирован: 23 окт 2015, 19:54
- Репутация: 316
- Страна:
24
Этот скрипт тоже претерпел некоторые изменения для удобства пользования (так как первый пост править нельзя, пишу тело скрипта тут):
Код: Выделить всё
#include "KMotionDef.h"
int DoPC(int cmd);
int DoPCInt(int cmd, int i);
//------USER_DATE------------
#define GATH_OFF 0 // define the offset into the Gather buffer where strings are passed
#define SENS 4 //Номер бита центроискателя
#define IMP_INCH 32574 //Колличество импульсов на дюйм
#define DIAM_SENS 2.03 //Диаметр шарика стилуса центроискателя в мм
#define AXIS_JOG_SPEED 25000 //Скорость перемещения осей при холостых перебегах
#define AXIS_SENS_SPEED 800 //Скорость перемещения осей для касания стилуса
//------USER_DATE------------
//--------ОБЯЗАТЕЛЬНО К ПРОЧТЕНИЮ-----------
//Для верного выполнения скрипта необходимо:
//1. Расположить центроискатель на заготовкой
//2. Расстояние от краев заготовки до центра стилуса центроискателя не должно быть более 5мм
//3. Поиск осуществляется угла, ближнего к началу координат (машинных X0 и Y0)
//--------ОБЯЗАТЕЛЬНО К ПРОЧТЕНИЮ-----------
main()
{
int Answer;
double *pD = (double *)persist.UserData;
double PZ0,PZ1,PZ2,PX0,PX1,PX2,PX3,PY0,PY1,PY2,PY3,DIAM,IMP,SEN_D,Z_UP,AXIS_UP1,AXIS_UP2;
// Вопрос о правильности расположения сканера и выбора угла
Answer = MsgBox("Сканер установлен не дальше 5мм от краев заготовки?",MB_YESNO|MB_ICONEXCLAMATION);
if (Answer == IDYES)
//Рассчеты
DIAM = DIAM_SENS;
IMP = IMP_INCH;
SEN_D = (IMP*(DIAM/2))/25.4;
Z_UP = (IMP*2)/25.4;
AXIS_UP1 = (IMP*10)/25.4;
AXIS_UP2 = (IMP*5)/25.4;
//Опускаем сканер по оси Z до касания заготовки, поднимаем сканер на 2мм над заготовкой, записываем координаты начальной точки процедуры замера в переменные PX0, PY0
Jog(2,-AXIS_SENS_SPEED); // двигаем ось Z в отрецательном направлении (вниз)
while (ReadBit(SENS)); // ждем изменения стостяния бита №4 (касание сканера плоскости заготовки)
Jog(2,0); // останавливаем ось Z
Delay_sec(0.2); // ждем 0.2 сек
PZ0 = chan[2].Dest; // записываем координату оси Z в переменную PZ0
PZ1=PZ0+Z_UP; // переменной PZ1 присваиваем значение PZ0+2мм
MoveAtVel(2,PZ1,AXIS_JOG_SPEED); // поднимаем ось Z на 2мм над заготовкой (в координату PZ1)
while (!CheckDone(2)); // ждем окончания перемещения оси Z
PX0 = chan[0].Dest; // записываем координату оси X (начальная точка процедуры замера) в переменную PX0
PY0 = chan[1].Dest; // записываем координату оси Y (начальная точка процедуры замера) в переменную PY0
//Перемещаем ось X на 10мм в отицательном направлении, перемещаем ось Z в отрицательном направлении на 5мм, перемещаем ось X вположительном направлении до касания заготовки, записываем координаты точки касания
PX1=PX0-AXIS_UP1; // от переменной PX0 отнимаем 10мм и присваеваем новое значение переменной PX1
MoveAtVel(0,PX1,AXIS_JOG_SPEED); // ось X перемещаем в координату PX1 (на 10мм в отрицательном направлении)
while (!CheckDone(0)); // ждем окончания перемещения оси X
PZ2=PZ1-AXIS_UP2; // от переменной PZ1 отнимаем 5мм и присваиваем новое значение переменной PZ2
MoveAtVel(2,PZ2,AXIS_JOG_SPEED); // ось Z перемещаем в координату PZ2 (на 5мм ниже точки PZ1 и на 3мм ниже верхней плоскости заготовки)
while (!CheckDone(2)); // ждем окончания перемещения оси Z
Jog(0,AXIS_SENS_SPEED); // перемещаем ось X в положительном направлении
while (ReadBit(SENS)); // ждем изменения состояния бита №4 (касание сканера края заготовки по оси X)
Jog(0,0); // останавливаем ось X
Delay_sec(0.2); // ждем 0.2 сек
PX2 = chan[0].Dest; // записываем координату касания сканером заготовки в переменную PX2
//Перемещаем ось X назад от края заготовки, поднимаем ось Z на 2мм над верхней плоскостью заготовки и перемещаем ось X в начальную точку процедуры замера
MoveAtVel(0,PX1,AXIS_JOG_SPEED); // перемещаем ось X в координату PX1
while (!CheckDone(0)); // ждем окончания перемещения оси X
MoveAtVel(2,PZ1,AXIS_JOG_SPEED); // перемещаем ось Z в координату PZ1
while (!CheckDone(2)); // ждем окончания перемещения оси Z
MoveAtVel(0,PX0,AXIS_JOG_SPEED); // перемещаем ось X в координату PX0
while (!CheckDone(0)); // ждем окончания перемещения оси X
//Перемещаем ось Y на 10мм в отицательном направлении, перемещаем ось Z в отрицательном направлении на 5мм, перемещаем ось Y вположительном направлении до касания заготовки, записываем координаты точки касания
PY1=PY0-AXIS_UP1; // от переменной PY0 отнимаем 10мм и присваеваем новое значение переменной PY1
MoveAtVel(1,PY1,AXIS_JOG_SPEED); // ось Y перемещаем в координату PY1 (на 10мм в отрицательном направлении)
while (!CheckDone(1)); // ждем окончания перемещения оси Y
MoveAtVel(2,PZ2,AXIS_JOG_SPEED); // ось Z перемещаем в координату PZ2 (на 5мм ниже точки PZ1 и на 3мм ниже верхней плоскости заготовки)
while (!CheckDone(2)); // ждем окончания перемещения оси Z
Jog(1,AXIS_SENS_SPEED); // перемещаем ось Y в положительном направлении
while (ReadBit(SENS)); // ждем изменения состояния бита №4 (касание сканера края заготовки по оси X)
Jog(1,0); // останавливаем ось Y
Delay_sec(0.2); // ждем 0.2 сек
PY2 = chan[1].Dest; // записываем координату касания сканером заготовки в переменную PY2
//Перемещаем ось Y назад от края заготовки, поднимаем ось Z на 2мм над верхней плоскостью заготовки и перемещаем ось Y в начальную точку процедуры замера
MoveAtVel(1,PY1,AXIS_JOG_SPEED); // перемещаем ось Y в координату PY1
while (!CheckDone(1)); // ждем окончания перемещения оси Y
MoveAtVel(2,PZ1,AXIS_JOG_SPEED); // перемещаем ось Z в координату PZ1
while (!CheckDone(2)); // ждем окончания перемещения оси Z
MoveAtVel(1,PY0,AXIS_JOG_SPEED); // перемещаем ось X в координату PX0
while (!CheckDone(1)); // ждем окончания перемещения оси X
//Компенсируем диаметр шарика сканера
PX3=PX2+SEN_D; // к координате касания заготовки по оси X PX2 прибавляем и присваиваем новое значение переменной PX3
PY3=PY2+SEN_D; // к координате касания заготовки по оси Y PY2 прибавляем и присваиваем новое значение переменной PY3
//Перемещаем оси X и Y в координаты угла заготовки PX3 и PY3
MoveAtVel(0,PX3,AXIS_JOG_SPEED); // перемещаем ось X в координату PX3
while (!CheckDone(0)); // ждем окончания перемещения оси X
MoveAtVel(1,PY3,AXIS_JOG_SPEED); // перемещаем ось Y в координату PY3
while (!CheckDone(1)); // ждем окончания перемещения оси Y
//Присваиваем положению осей в углу заготовки 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); // перемещаем ось Z машинный ноль
while (!CheckDone(2)); // ждем окончания перемещения оси Z
Jog(2,0); // останавливаем ось Z
}
//Далее код для ввода данных от 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
- Ученик
- Сообщения: 799
- Зарегистрирован: 02 сен 2014, 02:30
- Репутация: 498
- Страна:
25
Хмм... странно, почему нельзя? Я вроде в своей теме правил
AlexNikov писал(а):Источник цитаты так как первый пост править нельзя, пишу тело скрипта тут
Хмм... странно, почему нельзя? Я вроде в своей теме правил
- Predator
- 5-й разряд
- Сообщения: 5933
- Зарегистрирован: 30 авг 2014, 19:14
- Репутация: 4135
- Страна:
- Predator
- 5-й разряд
- Сообщения: 5933
- Зарегистрирован: 30 авг 2014, 19:14
- Репутация: 4135
- Страна:
27
Лёша, этим кодом надо заменить тот, что в топике?AlexNikov писал(а):Источник цитаты Этот скрипт тоже претерпел некоторые изменения для удобства пользования
- AlexNikov
- Вникающий
- Сообщения: 154
- Зарегистрирован: 23 окт 2015, 19:54
- Репутация: 316
- Страна:
28
ага, сам я первый пост редактировать не могу...
Predator писал(а):Источник цитатыЛёша, этим кодом надо заменить тот, что в топике?AlexNikov писал(а):Источник цитаты Этот скрипт тоже претерпел некоторые изменения для удобства пользования
ага, сам я первый пост редактировать не могу...
- Predator
- 5-й разряд
- Сообщения: 5933
- Зарегистрирован: 30 авг 2014, 19:14
- Репутация: 4135
- Страна:
- AlexNikov
- Вникающий
- Сообщения: 154
- Зарегистрирован: 23 окт 2015, 19:54
- Репутация: 316
- Страна: