Автоматическое измерение длины инструмента.
- ukr-sasha
- Мастер
- Сообщения: 3401
- Зарегистрирован: 21 мар 2011, 07:47
- Репутация: 2180
- Настоящее имя: Украинец Александр Григорьевич
- Откуда: Киев, Украина
- Контактная информация:
Автоматическое измерение длины инструмента.
Хочу поделиться с уважаемыми форумчанами информацией, как у нас реализовано измерение длины инструмента и её компенсация в управляющей программе.
https://www.youtube.com/watch?v=A030B2BdblI
https://www.youtube.com/watch?v=A030B2BdblI
- AlexNikov
- Мастер
- Сообщения: 1212
- Зарегистрирован: 05 янв 2014, 20:09
- Репутация: 721
- Настоящее имя: Алексей
- Откуда: Томск
- Контактная информация:
Re: Автоматическое измерение длины инструмента.
Александр, доброго дня. Я по чуть чуть пытаюсь разбираться с программированием к-флопа. У меня вопрос по вашему скрипту:
Строки
Это позиция датчика? Я так понимаю это кол-во импульсов которые должны пройти оси дабы добраться до центра датчика? Отсчет импульсов ведется от машинного нуля или от текущего положения?
Далее есть строки
Можете пояснить что за переменная "XaxisCNTS_mm", никак не соображу...
Строки
Код: Выделить всё
#define ToolSensorX 992000
#define ToolSensorY 400000
Далее есть строки
Код: Выделить всё
MoveAtVel(Xaxis,ToolSensorX-ToolOffsetX*XaxisCNTS_mm,40000);
MoveAtVel(Yaxis,ToolSensorY,40000);
- ukr-sasha
- Мастер
- Сообщения: 3401
- Зарегистрирован: 21 мар 2011, 07:47
- Репутация: 2180
- Настоящее имя: Украинец Александр Григорьевич
- Откуда: Киев, Украина
- Контактная информация:
Re: Автоматическое измерение длины инструмента.
А где я его выкладывал? Не могу вспомнить.AlexNikov писал(а):У меня вопрос по вашему скрипту:
Да.AlexNikov писал(а):Отсчет импульсов ведется от машинного нуля
Количество импульсов на мм - 4000. Так как ToolOffsetX в мм, а все остальные величины в скрипте в импульсах.AlexNikov писал(а):"XaxisCNTS_mm
- AlexNikov
- Мастер
- Сообщения: 1212
- Зарегистрирован: 05 янв 2014, 20:09
- Репутация: 721
- Настоящее имя: Алексей
- Откуда: Томск
- Контактная информация:
Re: Автоматическое измерение длины инструмента.
На cnczone вашу тему нашелukr-sasha писал(а):А где я его выкладывал? Не могу вспомнить.AlexNikov писал(а):У меня вопрос по вашему скрипту:Да.AlexNikov писал(а):Отсчет импульсов ведется от машинного нуляКоличество импульсов на мм - 4000. Так как ToolOffsetX в мм, а все остальные величины в скрипте в импульсах.AlexNikov писал(а):"XaxisCNTS_mm
За разъяснение спасибо большое, буду дальше пытаться под себя приспособить
- ukr-sasha
- Мастер
- Сообщения: 3401
- Зарегистрирован: 21 мар 2011, 07:47
- Репутация: 2180
- Настоящее имя: Украинец Александр Григорьевич
- Откуда: Киев, Украина
- Контактная информация:
Re: Автоматическое измерение длины инструмента.
Ну раз пошла "такая пьянка"....
Может еще кому пригодиться.
Может еще кому пригодиться.
Код: Выделить всё
#include "KMotionDef.h"
#define TMP 10 // which spare persist to use to transfer data
#include "KflopToKMotionCNCFunctions.c"
#define Zaxis 2
#define Xaxis 0
#define Yaxis 1
#define XaxisCNTS_mm 4000
#define ToolSensorPin 143
#define ToolSensorX 996000
#define ToolSensorY 104300
int DoPC(int cmd);
int DoPCFloat(int cmd, float f);
int DoPCInt(int cmd, int i);
int MsgBox(char *s, int Flags);
int SetVars(int poff, int varoff, int n);
int GetVars(int varoff, int n, int poff);
main()
{
int FixtureIndex,Units, TWORD, HWORD, DWORD;
double NewToolLength,Length,OriginOffsetZ,AxisOffsetZ,ToolOffsetX,ToolDiameter;
double Machinex,Machiney,Machinez,Machinea,Machineb,Machinec;
double P0,P1,A0,A1;
int GetToolOffsetX(int index, double *OffsetX);
int GetToolDiameter(int index, double *Diameter);
GetMiscSettings(&Units, &TWORD, &HWORD, &DWORD);
SetBitDirection(ToolSensorPin,0); // sensor input - вход датчика
// Stop the spindle and lift tool - Останавливаем шпиндель и поднимаем инструмент
ClearBit(153); // Stop spindle
ClearBit(154); // Stop spindle
Delay_sec(0.5);
MoveAtVel(Zaxis,1300000, 40000); //40000
while (ch2->Dest != 1300000) ;
//Ansver "ToolChange"
GetToolDiameter(TWORD,&ToolDiameter);
printf("Original Tool #%d Diameter=%.17g\n",
TWORD,ToolDiameter);
int Answer;
//int tool = persist.UserData[9]; // value stored is actually a float
char s[100];
sprintf(s,"Change to Tool diameter D=%.17g\n",ToolDiameter); //sprintf(s,"Change to Tool diameter D=%d",ToolDiameter);
Answer = MsgBox(s,MB_ICONEXCLAMATION);
//if (Answer != IDOK)
//{
DoPC(PC_COMM_HALT);
//}
// Offset X - перемещаем инструмент к датчику и делаем смещение по Х
GetToolOffsetX(TWORD,&ToolOffsetX);
printf("Original Tool #%d OffsetX=%.17g\n",
TWORD,ToolOffsetX);
MoveAtVel(Xaxis,ToolSensorX-ToolOffsetX*XaxisCNTS_mm,30000); //30000
MoveAtVel(Yaxis,ToolSensorY,12000); //12000
while (ch0->Dest != ToolSensorX-ToolOffsetX*XaxisCNTS_mm) ; // ПРОВЕРИТЬ УСЛОВИЕ!!!!
while (ch1->Dest != ToolSensorY) ; // ПРОВЕРИТЬ УСЛОВИЕ!!!!
//omit the Z-axis of sensor - опускаем инструмент на датчик
Jog(Zaxis,-20000);
while (ReadBit(ToolSensorPin)) ;
Jog(Zaxis,0);
P0 = chan[Zaxis].Dest;
P1=P0+2500; //+0.5mm
MoveAtVel(Zaxis,P1,20000);
while (ch2->Dest < P1) ;
Jog(Zaxis,-2000);
while (ReadBit(ToolSensorPin)) ;
Jog(Zaxis,0);
// calculate the length of the instrument and record in the table
// вычисляем длину инструмента и записываем в таблицу
GetFixtureIndex(&FixtureIndex);
GetOriginOffset(&OriginOffsetZ, FixtureIndex, Zaxis);
GetAxisOffset(&AxisOffsetZ, Zaxis);
GetMachine(&Machinex,&Machiney,&Machinez,&Machinea,&Machineb,&Machinec);
// Compute Tool Offset to make DRO zero when Tool Length selected and enabled
//
// Since Machine = DRO + OriginOffset + AxisOffset + ToolOffset
//
// Set DRO = 0 and solve for ToolOffset
//
NewToolLength = RoundToReasonable(Machinez - OriginOffsetZ - AxisOffsetZ,Units);
// Change Currently Selected Tool Length
SetToolLength(TWORD,NewToolLength);
// Lift tool - Останавливаем шпиндель и поднимаем инструмент
MoveAtVel(Zaxis,1300000, 40000); //40000
while (ch2->Dest != 1300000) ;
printf("Units=%d T=%d H=%d D=%d\n",Units, TWORD, HWORD, DWORD);
printf("Current Tool Length is %g\n",Length);
printf("Fixture Index = %d\n",FixtureIndex);
printf("Origin Offset Z = %g\n",OriginOffsetZ);
printf("Axis Offset Z = %g\n",AxisOffsetZ);
printf("Machine Coordinates %.17g %.17g %.17g %.17g %.17g %.17g\n",Machinex,Machiney,Machinez,Machinea,Machineb,Machinec);
}
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: Автоматическое измерение длины инструмента.
Можно уже тему по моему отдельную открывать, что-то типа скрипты для к-флоп
- ukr-sasha
- Мастер
- Сообщения: 3401
- Зарегистрирован: 21 мар 2011, 07:47
- Репутация: 2180
- Настоящее имя: Украинец Александр Григорьевич
- Откуда: Киев, Украина
- Контактная информация:
Re: Автоматическое измерение длины инструмента.
Да тут и так в каждой теме скрипты и целый раздел их.
П.С. При применении этого скрипта есть одна особенность. Интересно, как скоро ее кто то заметит?
П.С. При применении этого скрипта есть одна особенность. Интересно, как скоро ее кто то заметит?
- AlexNikov
- Мастер
- Сообщения: 1212
- Зарегистрирован: 05 янв 2014, 20:09
- Репутация: 721
- Настоящее имя: Алексей
- Откуда: Томск
- Контактная информация:
Re: Автоматическое измерение длины инструмента.
Вот так всегда, ищите господа подвохukr-sasha писал(а):Да тут и так в каждой теме скрипты и целый раздел их.
П.С. При применении этого скрипта есть одна особенность. Интересно, как скоро ее кто то заметит?
Не с диаметром ли фрезы это связано? - зы - не, не то...
- ukr-sasha
- Мастер
- Сообщения: 3401
- Зарегистрирован: 21 мар 2011, 07:47
- Репутация: 2180
- Настоящее имя: Украинец Александр Григорьевич
- Откуда: Киев, Украина
- Контактная информация:
Re: Автоматическое измерение длины инструмента.
Косвенно.AlexNikov писал(а):Не с диаметром ли фрезы это связано? - зы - не, не то...
Своими предыдущими вопросами вы близко подобрались.
Если вдумаетесь в логику работы скрипта, то ответ будет на поверхности. Заодно и то, как им пользоваться.
-
- Опытный
- Сообщения: 172
- Зарегистрирован: 21 ноя 2017, 14:40
- Репутация: 39
- Настоящее имя: Василий
- Контактная информация:
Re: Автоматическое измерение длины инструмента.
Два дня потратил на то чтобы разобраться, почему не получается получить корректные значения офсетов для оси Z...
В общем, может кому пригодится. Обратим внимание на следующие строки:
#define Zaxis 2
...
MoveAtVel(Zaxis,1300000, 40000); И подобные ей
GetAxisOffset(&AxisOffsetZ, Zaxis);
С виду все норм, но на самом деле, Zaxis 2 под один дефайн запихивать нельзя. В случае команд на движение - это номер канала, на котором висит мотор, а в случае когда нужно обратиться к переменным программы управления - это порядковый номер оси (X0, Y1, Z2). Из приведённого кода, да и из различных примеров это не очевидно. У меня оси висят на 4,5 и 6 каналах, соответственно запись #define Zaxis 6 обеспечила мне чувственный секс.
В общем, может кому пригодится. Обратим внимание на следующие строки:
#define Zaxis 2
...
MoveAtVel(Zaxis,1300000, 40000); И подобные ей
GetAxisOffset(&AxisOffsetZ, Zaxis);
С виду все норм, но на самом деле, Zaxis 2 под один дефайн запихивать нельзя. В случае команд на движение - это номер канала, на котором висит мотор, а в случае когда нужно обратиться к переменным программы управления - это порядковый номер оси (X0, Y1, Z2). Из приведённого кода, да и из различных примеров это не очевидно. У меня оси висят на 4,5 и 6 каналах, соответственно запись #define Zaxis 6 обеспечила мне чувственный секс.
- akustov
- Новичок
- Сообщения: 12
- Зарегистрирован: 22 янв 2013, 21:17
- Репутация: 0
- Откуда: Краснодар
- Контактная информация:
Re: Автоматическое измерение длины инструмента.
Доброго времени! А ещё кто-то встречал скрипты по теме?
Тот что опубликован не удалось настроить. Программа игнорирует тот блок, где происходит опускание фрезы и касание датчика.
По факту получается:
Тот что опубликован не удалось настроить. Программа игнорирует тот блок, где происходит опускание фрезы и касание датчика.
По факту получается:
- Подъём фрезы
- Переезд на мест измерений
- Сообщение о необходимости сменить фрезу
- Подъём фрезы.
-
- Новичок
- Сообщения: 1
- Зарегистрирован: 29 фев 2020, 15:49
- Репутация: 1
- Настоящее имя: Тарас
- Контактная информация:
Re: Автоматическое измерение длины инструмента.
Александр здравствуйте. Тема старенькая и из за специфики применения данного скрипта не получила развития.
Особенность данного скрипта насколько я понимаю в том что значением ToolOffsetX в таблице инструмента можно регулировать
положение центра инструмента относительно датчика а это помогает корректно померять специфические фрезы.
Но меня заинтересовал сам принцип расчета длины инструмента а именно формула
NewToolLength = RoundToReasonable(Machinez - OriginOffsetZ - AxisOffsetZ,Units);
из всего перечисленного я понял только Machinez - машинные координаты оси Z ну и Units единицы измерения.
OriginOffsetZ -?
AxisOffsetZ - ?
Александр помогите понять значение этих переменных .