Reset kflop board

Moderators: TomKerekes, dynomotion

Tarasevih
Posts: 101
Joined: Fri Jul 09, 2021 11:26 am

Re: Reset kflop board

Post by Tarasevih » Wed Mar 27, 2024 5:15 pm

Home by X and Z

Code: Select all

#include "KMotionDef.h"
#include "KflopToKMotionCNCFunctions.c"
#define TMP 10                     // which spare persist to use to transfer data
#define X_HOME_BIT 6               // Вход датчика оси X
#define Z_HOME_BIT 5               // Вход датчика оси Z
#define X_AXIS 0                   // Назначим на каих портах оси 
#define Z_AXIS 3
#define X_AXIS_POS_LIM 180800
#define X_AXIS_NEG_LIM -2000
#define Z_AXIS_POS_LIM 100
#define Z_AXIS_NEG_LIM -46000
int HomeSpeed = 1000;
main()
{
	        while (ReadBit(1027)) ;
			SetBit(1027);
            int SaveLimitY, SaveLimitZ;                     //сюда сохраним лимиты 
            ClearBit(1024);                                 //выключим светодиод оси Х 
			ClearBit(1025);                                 //выключим светодиод оси Z
            // поиск НОМЕ по Y      
            SaveLimitY = chan[X_AXIS].LimitSwitchOptions;   // сохраним состояние лимитов 
            chan[X_AXIS].LimitSwitchOptions = 0;            // отключим лимиты
            chan[X_AXIS].SoftLimitNeg = -4e+09;
            Jog(X_AXIS,-HomeSpeed);                         // перемещение оси X в отрицательном направлении 
            while (ReadBit(X_HOME_BIT));                    // ожидание срабатывания датчика по X
            Zero(X_AXIS);                                   // обнуление координаты оси X
            Jog(X_AXIS,0);                                  // остановка оси X
            MoveAtVel(X_AXIS,300, HomeSpeed);               // отезд оси X от датчика 
            while (!CheckDone(X_AXIS)) ;                    // ожидание окончания движения оси X
            Jog(X_AXIS,(-HomeSpeed/5));                     // повторное перемещение оси X в отрицательном направлении на скорости /5
            while (ReadBit(X_HOME_BIT)) ;                   // ожидание срабатывания датчика по X
            Zero(X_AXIS);                                   // обнуление координаты оси X
            Jog(X_AXIS,0);                                  // остановка оси X
            MoveAtVel(X_AXIS,1000, HomeSpeed);              // отезд оси X от датчика 
            while (!CheckDone(X_AXIS)) ;                    // ожидание окончания движения оси X
            Zero(X_AXIS);  
            chan[X_AXIS].LimitSwitchOptions = SaveLimitY;   // востановим лимиты 
            chan[X_AXIS].SoftLimitPos = X_AXIS_POS_LIM;
            chan[X_AXIS].SoftLimitNeg = X_AXIS_NEG_LIM;
            printf("X-Home Complete\n");
            SetBit(1024);                                   //включим индикатор оси X 
			 
            // поиск НОМЕ по Z      
            SaveLimitZ = chan[Z_AXIS].LimitSwitchOptions;   // сохраним состояние лимитов 
            chan[Z_AXIS].LimitSwitchOptions = 0;            // отключим лимиты
            chan[Z_AXIS].SoftLimitPos = 4e+09;            
            Jog(Z_AXIS,HomeSpeed);                          // перемещение оси Z в отрицательном направлении 
            while (ReadBit(Z_HOME_BIT));                    // ожидание срабатывания датчика по Z
            Zero(Z_AXIS);                                   // обнуление координаты оси Z
            Jog(Z_AXIS,0);                                  // остановка оси Z
            MoveAtVel(Z_AXIS,-300, HomeSpeed);              // отезд оси Z от датчика 
            while (!CheckDone(Z_AXIS)) ;                    // ожидание окончания движения оси Z
            Jog(Z_AXIS,(HomeSpeed/5));                      // повторное перемещение оси Z в отрицательном направлении на скорости /5
            while (ReadBit(Z_HOME_BIT)) ;                   // ожидание срабатывания датчика по Z
            Zero(Z_AXIS);                                   // обнуление координаты оси Z
            Jog(Z_AXIS,0);                                  // остановка оси Z
            MoveAtVel(Z_AXIS,-1000, HomeSpeed);             // отезд оси Z от датчика 
            while (!CheckDone(Z_AXIS)) ;                    // ожидание окончания движения оси Z
            Zero(Z_AXIS);  
            chan[Z_AXIS].LimitSwitchOptions = SaveLimitZ;   // востановим лимиты 
            chan[Z_AXIS].SoftLimitPos = Z_AXIS_POS_LIM; 
            chan[Z_AXIS].SoftLimitNeg = Z_AXIS_NEG_LIM;          
            printf("Z-Home Complete\n");
            SetBit(1025);                                   //включим индикатор оси Z 
			ClearBit(1027); 
            //Zero(Y_AXIS);              
            //Zero(Z_AXIS); 
            DoPCFloat(PC_COMM_SET_X, 0.0);
            DoPCFloat(PC_COMM_SET_Z, 0.0);
            
     
}

Tarasevih
Posts: 101
Joined: Fri Jul 09, 2021 11:26 am

Re: Reset kflop board

Post by Tarasevih » Wed Mar 27, 2024 5:17 pm

Home by Y

Code: Select all

	
#include "KMotionDef.h"
#include "ChangePortalDef.h"

#define TMP 10 // which spare persist to use to transfer data
#include "KflopToKMotionCNCFunctions.c"
// Поиск домашенй позиции (по оси Y0 и Y1 которая подчененная)

#define Y0_AXIS 1  // Назначим на каих портах оси 
#define Y1_AXIS 2
 
#define Y0_HOME_BIT 4
#define Y1_HOME_BIT 2

#define dir -1      			// направление движения к датчику (+1 или -1)

#define Y_AXIS_POS_LIM 277600
#define Y_AXIS_NEG_LIM -100


#define Y_SLOW_SPEED 500 // Скорость медленного хомленния
#define Y_FAST_SPEED 1500  // Скорость бытрого хомленния

#define GATH_OFF 0  // define the offset into the Gather buffer where strings are passed


void SquareY(int speed);

void main() 
{   
    while (ReadBit(1027)) ;
	SetBit(1027);
    ClearBit(1026);               
	int SaveLimitY0,SaveLimitY1,Count;                     // сюда сохраним лимиты 
    Count=0;
	SaveLimitY0 = chan[Y0_AXIS].LimitSwitchOptions;  // сохраним лимиты 
	SaveLimitY1 = chan[Y1_AXIS].LimitSwitchOptions;
	chan[Y0_AXIS].LimitSwitchOptions = 0;            // отключим лимиты
	chan[Y1_AXIS].LimitSwitchOptions = 0;
    chan[Y0_AXIS].SoftLimitNeg = -4e+09;
    chan[Y0_AXIS].SoftLimitPos = 4e+09;	
    chan[Y1_AXIS].SoftLimitNeg = -4e+09;
    chan[Y1_AXIS].SoftLimitPos = 4e+09;	   
	// Выравнивание оси X

	chan[Y0_AXIS].MasterAxis = -1;  //Отключим подченение оси 
	chan[Y1_AXIS].MasterAxis = -1;
 
	// Проверим не находимся ли мы напротив датчика
	// если да, то отедим
	if (!ReadBit(Y0_HOME_BIT) || !ReadBit(Y1_HOME_BIT))
	{   
 
		MoveRel(Y0_AXIS,Y_FAST_SPEED);  // двигаемся от датчиков
		MoveRel(Y1_AXIS,Y_FAST_SPEED);

		while (!CheckDone(Y0_AXIS) || !CheckDone(Y1_AXIS))  ;  // двигаемся пока не седем с датчиков 
	}

	SquareY(Y_FAST_SPEED); // Двигаемся к датчикам бысто 
	SquareY(Y_SLOW_SPEED);   // Двигаемся к датчикам медленно 

	chan[Y0_AXIS].LimitSwitchOptions = SaveLimitY0;  // Востановим лимиты 
	chan[Y1_AXIS].LimitSwitchOptions = SaveLimitY1;
    chan[Y0_AXIS].SoftLimitPos = Y_AXIS_POS_LIM; 
    chan[Y0_AXIS].SoftLimitNeg = Y_AXIS_NEG_LIM; 
    
	chan[Y1_AXIS].MasterAxis = Y0_AXIS;  // Сделаем ось Y1 подчененной оси Y0
	//chan[Y1_AXIS].SlaveGain = 1;
	chan[Y0_AXIS].MasterAxis = -1; // Ось Y0 не подчененная 
    SetBit(1026);                                   //включим индикатор оси Y
	ClearBit(1027); 
    DoPCFloat(PC_COMM_SET_Y, 0.0);
	printf("Y-Home Complete\n");
}



void SquareY(int speed)
{
	
	int found0,found1;  // флаги нахождения датчиков
	Jog(Y0_AXIS,speed*dir);  // начнем движение обеих осей к датчикам
	Jog(Y1_AXIS,speed*dir);

	found0 = found1 = 0;  // сбросим флаги

	while (!found0 || !found1)  // Находимся в цикле пока не достигнем обеих датчиков
	{
		if (!found0 && !ReadBit(Y0_HOME_BIT)) // проверяем флаг и датчик X0 
		{
			Jog(Y0_AXIS,0.0); // Остановим ось
			found0=1;
		}
		if (!found1 && !ReadBit(Y1_HOME_BIT))  // проверяем флаг и датчик X1
		{
			Jog(Y1_AXIS,0.0); // Остановим ось
			found1=1;
		}
	}

	while (!CheckDone(Y0_AXIS) || !CheckDone(Y1_AXIS))  ;  // Находимся в циле пока не отедим от датчиков
    
	Zero(Y0_AXIS); // сбросим оси 
	Zero(Y1_AXIS);
	
    //if (found0 || found1)SetBit(1026);
    //else ClearBit(1026);
    
	MoveAtVel(Y0_AXIS,Y0_DIST*-dir,speed);  // Выравниваем потал отхдом на разные расстояния
	MoveAtVel(Y1_AXIS,Y1_DIST*-dir,speed);  
  
	while (!CheckDone(Y0_AXIS) || !CheckDone(Y1_AXIS))  ;  // wait till done

	Zero(Y0_AXIS); // сбросим оси 
	Zero(Y1_AXIS);
	
	
     
	
}


Tarasevih
Posts: 101
Joined: Fri Jul 09, 2021 11:26 am

Re: Reset kflop board

Post by Tarasevih » Wed Mar 27, 2024 5:20 pm

These are all the C programs that I used.
I did not run the tool change programs, so I think that the problem was definitely not in them

User avatar
TomKerekes
Posts: 2546
Joined: Mon Dec 04, 2017 1:49 am

Re: Reset kflop board

Post by TomKerekes » Wed Mar 27, 2024 5:38 pm

Most likely noise on the EStop or MPG_Estop inputs were disabling all the Axes.
Regards,

Tom Kerekes
Dynomotion, Inc.

Tarasevih
Posts: 101
Joined: Fri Jul 09, 2021 11:26 am

Re: Reset kflop board

Post by Tarasevih » Wed Mar 27, 2024 6:57 pm

In this case, the bit (Estop_Bit) should have been triggered.

Code: Select all

if (!ReadBit(Estop) || !ReadBit(MPG_Estop))  //!chan[AXISX].Enable || !chan[AXISYA].Enable || !chan[AXISYB].Enable || !chan[AXISZ].Enable ||
		{
			SetBit(Estop_Bit);
			ClearBit(ENABLE_MPG);
			ClearBit(Spindle_CW);
			ClearBit(23);        //Поднимем датчик поиска меток
			ClearBit(1055);      //Отменим готовность датчика к поиску метки
			ClearBit(19);        //Поднимем щетку 
			ClearBit(1040);      //Выключим режим New Tool
			ClearBit(1041);      //Потушим бит освобождения шпинделя
			if (ch0->Enable)DisableAxis(0);
			if (ch1->Enable)DisableAxis(1);
			if (ch2->Enable)DisableAxis(2);
			if (ch3->Enable)DisableAxis(3);	
		}
With appropriate indication.
Бит.png
But this was not the case.

User avatar
TomKerekes
Posts: 2546
Joined: Mon Dec 04, 2017 1:49 am

Re: Reset kflop board

Post by TomKerekes » Wed Mar 27, 2024 7:49 pm

Hi Taras,

Is the ALARM Estop_Bit 1030 ?

If so, then I think when the noise glitch went away the bit would be cleared before you could ever see it on the screen.

Code: Select all

		if (!ReadBit(Estop) || !ReadBit(MPG_Estop))  //!chan[AXISX].Enable || !chan[AXISYA].Enable || !chan[AXISYB].Enable || !chan[AXISZ].Enable ||
		{
			SetBit(Estop_Bit);
			ClearBit(ENABLE_MPG);
			ClearBit(Spindle_CW);
			ClearBit(23);        //Поднимем датчик поиска меток
			ClearBit(1055);      //Отменим готовность датчика к поиску метки
			ClearBit(19);        //Поднимем щетку 
			ClearBit(1040);      //Выключим режим New Tool
			ClearBit(1041);      //Потушим бит освобождения шпинделя
			if (ch0->Enable)DisableAxis(0);
			if (ch1->Enable)DisableAxis(1);
			if (ch2->Enable)DisableAxis(2);
			if (ch3->Enable)DisableAxis(3);	
		}
		else ClearBit(Estop_Bit);   //<<<<<<<<<<<<<<<<<<<<<<=======================   
Regards,

Tom Kerekes
Dynomotion, Inc.

Tarasevih
Posts: 101
Joined: Fri Jul 09, 2021 11:26 am

Re: Reset kflop board

Post by Tarasevih » Thu Mar 28, 2024 5:43 am

Hi Tom.
Tom you're right.
In order to notice this it was necessary to remove it (else)

Code: Select all

else ClearBit(Estop_Bit);
Can you tell me how to programmatically filter out short pulses at the Estop and MPG_Estop input?
I will be very grateful.

Regards,
Taras.

User avatar
TomKerekes
Posts: 2546
Joined: Mon Dec 04, 2017 1:49 am

Re: Reset kflop board

Post by TomKerekes » Thu Mar 28, 2024 7:25 pm

Hi Taras,

Its better to eliminate noise in hardware. But you might look at the Debounce function in the ExternalButtons.c example. It samples a value each Time Slice and outputs +1 or -1 when the value has changed and been stable for N samples.
Regards,

Tom Kerekes
Dynomotion, Inc.

Post Reply