Moderators: TomKerekes, dynomotion
-
Tarasevih
- Posts: 101
- Joined: Fri Jul 09, 2021 11:26 am
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
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
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
-
TomKerekes
- Posts: 2676
- Joined: Mon Dec 04, 2017 1:49 am
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
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.
But this was not the case.
-
TomKerekes
- Posts: 2676
- Joined: Mon Dec 04, 2017 1:49 am
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
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)
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.
-
TomKerekes
- Posts: 2676
- Joined: Mon Dec 04, 2017 1:49 am
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.