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

Система управления станками с ЧПУ на основе контроллера KFLOP
Victor-80
Начинающий
Сообщения: 78
Зарегистрирован: 16 мар 2015, 12:56
Репутация: 14
Настоящее имя: Виктор

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

#1 

Сообщение Victor-80 » 24 апр 2015, 12:28

Коллеги, приветствую!
Подскажите, возможно ли как-то сделать автоматическое измерение длины инструмента на контроллере Kflop?
Если возможно, то может кто подскажет, как это сделать? Нужны ли какие-то дополнительные датчики или еще что-то :unknown:
Спасибо.

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

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

#2 

Сообщение Predator » 24 апр 2015, 14:43

Victor-80 писал(а):Нужны ли какие-то дополнительные датчики или еще что-то
Датчик в любом случае нужен! По остальному не подскажу ибо не имею Кфлопа и тренироваться негде :happens:
Появится ukr-sasha, думаю поможет, он в Кфлопе хорошо волокёт, давно с ним работает. Кстати, он по-моему делал автоматичиское измерение инструмента на своём КФПЭ250Н2-2 :hmm:
Великую цивилизацию не покорить извне — пока она не разрушит себя изнутри! © Уильям Дюрант

Аватара пользователя
ukr-sasha
Вникающий
Сообщения: 194
Зарегистрирован: 10 окт 2014, 12:08
Репутация: 399
Настоящее имя: Александр
Город: Киев
Страна: Украина

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

#3 

Сообщение ukr-sasha » 25 апр 2015, 00:45

Victor-80 писал(а):Подскажите, возможно ли как-то сделать автоматическое измерение длины инструмента на контроллере Kflop?
Лень писать, простите - устал.
Заходите в гости: YouTube-ukr-sasha

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

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

#4 

Сообщение Predator » 25 апр 2015, 08:47

ukr-sasha писал(а):Лень писать, простите - устал
С вашего позволения, напишу :)

Фрезерный станок КФПЭ 250 — автоматическое измерение длины инструмента
http://www.youtube.com/watch?v=A030B2BdblI

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

#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;
}
Великую цивилизацию не покорить извне — пока она не разрушит себя изнутри! © Уильям Дюрант

Victor-80
Начинающий
Сообщения: 78
Зарегистрирован: 16 мар 2015, 12:56
Репутация: 14
Настоящее имя: Виктор

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

#5 

Сообщение Victor-80 » 25 апр 2015, 10:44

Спасибо, буду пробовать разобраться :confirm:

Аватара пользователя
ukr-sasha
Вникающий
Сообщения: 194
Зарегистрирован: 10 окт 2014, 12:08
Репутация: 399
Настоящее имя: Александр
Город: Киев
Страна: Украина

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

#6 

Сообщение ukr-sasha » 08 май 2015, 23:14

Victor-80 писал(а):Спасибо, буду пробовать разобраться

Интересно, получилось?
Заходите в гости: YouTube-ukr-sasha

Victor-80
Начинающий
Сообщения: 78
Зарегистрирован: 16 мар 2015, 12:56
Репутация: 14
Настоящее имя: Виктор

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

#7 

Сообщение Victor-80 » 19 май 2015, 20:19

ukr-sasha писал(а):получилось?

Александр, спасибо за подсказку, но к сожалению пока еще не пробовал делать, занят другим делом.

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

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

#8 

Сообщение Predator » 25 мар 2016, 17:43

Victor-80 писал(а):Источник цитаты буду пробовать разобраться
Разобрался, работает? :hmm:
Великую цивилизацию не покорить извне — пока она не разрушит себя изнутри! © Уильям Дюрант


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

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

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