Алгоритм такой:
- Щуп расположить нужно над заготовкой в примерном её центре, но не далее чем в 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;
}