Автоматическое измерение длины инструмента.

KFlop, KStep, KAnalog, KMotion...
Аватара пользователя
ukr-sasha
Мастер
Сообщения: 3401
Зарегистрирован: 21 мар 2011, 07:47
Репутация: 2180
Настоящее имя: Украинец Александр Григорьевич
Откуда: Киев, Украина
Контактная информация:

Автоматическое измерение длины инструмента.

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

Хочу поделиться с уважаемыми форумчанами информацией, как у нас реализовано измерение длины инструмента и её компенсация в управляющей программе.
https://www.youtube.com/watch?v=A030B2BdblI
Аватара пользователя
AlexNikov
Мастер
Сообщения: 1212
Зарегистрирован: 05 янв 2014, 20:09
Репутация: 721
Настоящее имя: Алексей
Откуда: Томск
Контактная информация:

Re: Автоматическое измерение длины инструмента.

Сообщение AlexNikov »

Александр, доброго дня. Я по чуть чуть пытаюсь разбираться с программированием к-флопа. У меня вопрос по вашему скрипту:

Строки

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

#define ToolSensorX 992000
#define ToolSensorY 400000
Это позиция датчика? Я так понимаю это кол-во импульсов которые должны пройти оси дабы добраться до центра датчика? Отсчет импульсов ведется от машинного нуля или от текущего положения?

Далее есть строки

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

MoveAtVel(Xaxis,ToolSensorX-ToolOffsetX*XaxisCNTS_mm,40000);
	MoveAtVel(Yaxis,ToolSensorY,40000);
Можете пояснить что за переменная "XaxisCNTS_mm", никак не соображу...
Аватара пользователя
ukr-sasha
Мастер
Сообщения: 3401
Зарегистрирован: 21 мар 2011, 07:47
Репутация: 2180
Настоящее имя: Украинец Александр Григорьевич
Откуда: Киев, Украина
Контактная информация:

Re: Автоматическое измерение длины инструмента.

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

AlexNikov писал(а):У меня вопрос по вашему скрипту:
А где я его выкладывал? Не могу вспомнить. :) :thinking:
AlexNikov писал(а):Отсчет импульсов ведется от машинного нуля
Да.
AlexNikov писал(а):"XaxisCNTS_mm
Количество импульсов на мм - 4000. Так как ToolOffsetX в мм, а все остальные величины в скрипте в импульсах.
Аватара пользователя
AlexNikov
Мастер
Сообщения: 1212
Зарегистрирован: 05 янв 2014, 20:09
Репутация: 721
Настоящее имя: Алексей
Откуда: Томск
Контактная информация:

Re: Автоматическое измерение длины инструмента.

Сообщение AlexNikov »

ukr-sasha писал(а):
AlexNikov писал(а):У меня вопрос по вашему скрипту:
А где я его выкладывал? Не могу вспомнить. :) :thinking:
AlexNikov писал(а):Отсчет импульсов ведется от машинного нуля
Да.
AlexNikov писал(а):"XaxisCNTS_mm
Количество импульсов на мм - 4000. Так как ToolOffsetX в мм, а все остальные величины в скрипте в импульсах.
На cnczone вашу тему нашел :D

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

Re: Автоматическое измерение длины инструмента.

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

Ну раз пошла "такая пьянка".... :hehehe:
Может еще кому пригодиться.

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

#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: Автоматическое измерение длины инструмента.

Сообщение AlexNikov »

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

Re: Автоматическое измерение длины инструмента.

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

Да тут и так в каждой теме скрипты и целый раздел их. ;-)
П.С. При применении этого скрипта есть одна особенность. Интересно, как скоро ее кто то заметит? :hehehe:
Аватара пользователя
AlexNikov
Мастер
Сообщения: 1212
Зарегистрирован: 05 янв 2014, 20:09
Репутация: 721
Настоящее имя: Алексей
Откуда: Томск
Контактная информация:

Re: Автоматическое измерение длины инструмента.

Сообщение AlexNikov »

ukr-sasha писал(а):Да тут и так в каждой теме скрипты и целый раздел их. ;-)
П.С. При применении этого скрипта есть одна особенность. Интересно, как скоро ее кто то заметит? :hehehe:
Вот так всегда, ищите господа подвох :hehehe:

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

Re: Автоматическое измерение длины инструмента.

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

AlexNikov писал(а):Не с диаметром ли фрезы это связано? - зы - не, не то...
Косвенно. :tongue: :hehehe:
Своими предыдущими вопросами вы близко подобрались.
Если вдумаетесь в логику работы скрипта, то ответ будет на поверхности. Заодно и то, как им пользоваться. :hehehe:
vershininv
Опытный
Сообщения: 172
Зарегистрирован: 21 ноя 2017, 14:40
Репутация: 39
Настоящее имя: Василий
Контактная информация:

Re: Автоматическое измерение длины инструмента.

Сообщение vershininv »

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

В общем, может кому пригодится. Обратим внимание на следующие строки:

#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: Автоматическое измерение длины инструмента.

Сообщение akustov »

Доброго времени! А ещё кто-то встречал скрипты по теме?
Тот что опубликован не удалось настроить. Программа игнорирует тот блок, где происходит опускание фрезы и касание датчика.

По факту получается:
  • Подъём фрезы
  • Переезд на мест измерений
  • Сообщение о необходимости сменить фрезу
  • Подъём фрезы.
Хотя достаточно просто вниз --> измерить и записать.
Tarasevih
Новичок
Сообщения: 1
Зарегистрирован: 29 фев 2020, 15:49
Репутация: 1
Настоящее имя: Тарас
Контактная информация:

Re: Автоматическое измерение длины инструмента.

Сообщение Tarasevih »

ukr-sasha писал(а): 09 фев 2015, 19:52 П.С. При применении этого скрипта есть одна особенность. Интересно, как скоро ее кто то заметит? :hehehe:
Александр здравствуйте. Тема старенькая и из за специфики применения данного скрипта не получила развития.
Особенность данного скрипта насколько я понимаю в том что значением ToolOffsetX в таблице инструмента можно регулировать
положение центра инструмента относительно датчика а это помогает корректно померять специфические фрезы.
Но меня заинтересовал сам принцип расчета длины инструмента а именно формула
NewToolLength = RoundToReasonable(Machinez - OriginOffsetZ - AxisOffsetZ,Units);
из всего перечисленного я понял только Machinez - машинные координаты оси Z ну и Units единицы измерения.
OriginOffsetZ -?
AxisOffsetZ - ?
Александр помогите понять значение этих переменных .
Ответить

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