Что то у меня не так с файлом инициализации.
Сразу после инициализации работает и Естоп и останов в результате отключения осей. Но после какого то времени контролер перестает реагировать на кнопки стопа.
Файл инициализации :
(для просмотра содержимого нажмите на ссылку)#include "KMotionDef.h"
#define QA 26 // define to which IO bits the AB signals are connected
#define QB 27
main()
{
int BitA,Change1=0,Change2=0, DiffX2;
int PosNoWrap, NewPos, Pos=0, wraps;
double Factor=0;
SetBit(152);
SetBit(157);
SetBit(158);
SetBit(159);
ch0->InputMode=ENCODER_MODE;
ch0->OutputMode=DAC_SERVO_MODE;
ch0->Vel=309600;
ch0->Accel=5e+006;
ch0->Jerk=3e+006;
ch0->P=2.2;
ch0->I=0.006;
ch0->D=10;
ch0->FFAccel=0;
ch0->FFVel=0;
ch0->MaxI=2047;
ch0->MaxErr=1e+006;
ch0->MaxOutput=2047;
ch0->DeadBandGain=1;
ch0->DeadBandRange=0;
ch0->InputChan0=0;
ch0->InputChan1=0;
ch0->OutputChan0=0;
ch0->OutputChan1=0;
ch0->MasterAxis=-1;
ch0->LimitSwitchOptions=0x100;
ch0->LimitSwitchNegBit=0;
ch0->LimitSwitchPosBit=0;
ch0->SoftLimitPos=1e+009;
ch0->SoftLimitNeg=-1e+009;
ch0->InputGain0=-1;
ch0->InputGain1=1;
ch0->InputOffset0=0;
ch0->InputOffset1=0;
ch0->OutputGain=1;
ch0->OutputOffset=0;
ch0->SlaveGain=1;
ch0->BacklashMode=BACKLASH_OFF;
ch0->BacklashAmount=0;
ch0->BacklashRate=0;
ch0->invDistPerCycle=0.00025;
ch0->Lead=0;
ch0->MaxFollowingError=1000;
ch0->StepperAmplitude=100;
ch0->iir[0].B0=1;
ch0->iir[0].B1=0;
ch0->iir[0].B2=0;
ch0->iir[0].A1=0;
ch0->iir[0].A2=0;
ch0->iir[1].B0=1;
ch0->iir[1].B1=0;
ch0->iir[1].B2=0;
ch0->iir[1].A1=0;
ch0->iir[1].A2=0;
ch0->iir[2].B0=1;
ch0->iir[2].B1=0;
ch0->iir[2].B2=0;
ch0->iir[2].A1=0;
ch0->iir[2].A2=0;
ch1->InputMode=ENCODER_MODE;
ch1->OutputMode=DAC_SERVO_MODE;
ch1->Vel=309600;
ch1->Accel=1e+006;
ch1->Jerk=2e+006;
ch1->P=2.65;
ch1->I=0.003;
ch1->D=10;
ch1->FFAccel=0;
ch1->FFVel=0;
ch1->MaxI=2047;
ch1->MaxErr=1e+006;
ch1->MaxOutput=2047;
ch1->DeadBandGain=1;
ch1->DeadBandRange=0;
ch1->InputChan0=1;
ch1->InputChan1=1;
ch1->OutputChan0=1;
ch1->OutputChan1=1;
ch1->MasterAxis=-1;
ch1->LimitSwitchOptions=0x110;
ch1->LimitSwitchNegBit=0;
ch1->LimitSwitchPosBit=0;
ch1->SoftLimitPos=1e+009;
ch1->SoftLimitNeg=-1e+009;
ch1->InputGain0=1;
ch1->InputGain1=1;
ch1->InputOffset0=0;
ch1->InputOffset1=0;
ch1->OutputGain=1;
ch1->OutputOffset=0;
ch1->SlaveGain=1;
ch1->BacklashMode=BACKLASH_OFF;
ch1->BacklashAmount=0;
ch1->BacklashRate=0;
ch1->invDistPerCycle=0.00025;
ch1->Lead=0;
ch1->MaxFollowingError=1000;
ch1->StepperAmplitude=100;
ch1->iir[0].B0=1;
ch1->iir[0].B1=0;
ch1->iir[0].B2=0;
ch1->iir[0].A1=0;
ch1->iir[0].A2=0;
ch1->iir[1].B0=1;
ch1->iir[1].B1=0;
ch1->iir[1].B2=0;
ch1->iir[1].A1=0;
ch1->iir[1].A2=0;
ch1->iir[2].B0=1;
ch1->iir[2].B1=0;
ch1->iir[2].B2=0;
ch1->iir[2].A1=0;
ch1->iir[2].A2=0;
ch2->InputMode=ENCODER_MODE;
ch2->OutputMode=DAC_SERVO_MODE;
ch2->Vel=409600;
ch2->Accel=1e+006;
ch2->Jerk=1e+007;
ch2->P=1.1;
ch2->I=0.004;
ch2->D=0;
ch2->FFAccel=0;
ch2->FFVel=0;
ch2->MaxI=2047;
ch2->MaxErr=1e+006;
ch2->MaxOutput=2047;
ch2->DeadBandGain=1;
ch2->DeadBandRange=0;
ch2->InputChan0=2;
ch2->InputChan1=2;
ch2->OutputChan0=2;
ch2->OutputChan1=2;
ch2->MasterAxis=-1;
ch2->LimitSwitchOptions=0x112;
ch2->LimitSwitchNegBit=0;
ch2->LimitSwitchPosBit=138;
ch2->SoftLimitPos=1e+009;
ch2->SoftLimitNeg=-1e+009;
ch2->InputGain0=1;
ch2->InputGain1=1;
ch2->InputOffset0=0;
ch2->InputOffset1=0;
ch2->OutputGain=1;
ch2->OutputOffset=0;
ch2->SlaveGain=1;
ch2->BacklashMode=BACKLASH_OFF;
ch2->BacklashAmount=0;
ch2->BacklashRate=0;
ch2->invDistPerCycle=0.00025;
ch2->Lead=0;
ch2->MaxFollowingError=1000;
ch2->StepperAmplitude=100;
ch2->iir[0].B0=1;
ch2->iir[0].B1=0;
ch2->iir[0].B2=0;
ch2->iir[0].A1=0;
ch2->iir[0].A2=0;
ch2->iir[1].B0=1;
ch2->iir[1].B1=0;
ch2->iir[1].B2=0;
ch2->iir[1].A1=0;
ch2->iir[1].A2=0;
ch2->iir[2].B0=1;
ch2->iir[2].B1=0;
ch2->iir[2].B2=0;
ch2->iir[2].A1=0;
ch2->iir[2].A2=0;
ch3->InputMode=ENCODER_MODE;
ch3->OutputMode=DAC_SERVO_MODE;
ch3->Vel=209600;
ch3->Accel=1e+007;
ch3->Jerk=1e+007;
ch3->P=4.1;
ch3->I=0.0006;
ch3->D=10;
ch3->FFAccel=0;
ch3->FFVel=0;
ch3->MaxI=2047;
ch3->MaxErr=1e+006;
ch3->MaxOutput=2047;
ch3->DeadBandGain=1;
ch3->DeadBandRange=0;
ch3->InputChan0=3;
ch3->InputChan1=3;
ch3->OutputChan0=3;
ch3->OutputChan1=3;
ch3->MasterAxis=-1;
ch3->LimitSwitchOptions=0x110;
ch3->LimitSwitchNegBit=0;
ch3->LimitSwitchPosBit=0;
ch3->SoftLimitPos=1e+009;
ch3->SoftLimitNeg=-1e+009;
ch3->InputGain0=1;
ch3->InputGain1=1;
ch3->InputOffset0=0;
ch3->InputOffset1=0;
ch3->OutputGain=1;
ch3->OutputOffset=0;
ch3->SlaveGain=1;
ch3->BacklashMode=BACKLASH_OFF;
ch3->BacklashAmount=0;
ch3->BacklashRate=0;
ch3->invDistPerCycle=0.00025;
ch3->Lead=0;
ch3->MaxFollowingError=1000;
ch3->StepperAmplitude=100;
ch3->iir[0].B0=1;
ch3->iir[0].B1=0;
ch3->iir[0].B2=0;
ch3->iir[0].A1=0;
ch3->iir[0].A2=0;
ch3->iir[1].B0=1;
ch3->iir[1].B1=0;
ch3->iir[1].B2=0;
ch3->iir[1].A1=0;
ch3->iir[1].A2=0;
ch3->iir[2].B0=1;
ch3->iir[2].B1=0;
ch3->iir[2].B2=0;
ch3->iir[2].A1=0;
ch3->iir[2].A2=0;
EnableAxis(0);
EnableAxis(1);
EnableAxis(2);
EnableAxis(3);
DefineCoordSystem(0,1,2,3);
SetBitDirection(144,1);
for (;;) //loop forever
{
WaitNextTimeSlice();
if (ch0->Enable && ch1->Enable && ch2->Enable && ch3->Enable)
SetBit(144);
else
{
ClearBit(144);
DAC(7,0); // остановить шпиндель, установив напряжение в 0
ClearBit(145); // отключить шпиндель, разомкнув выход 145
}
// Handle ESTOP
if (!ReadBit(141)); // ожидание срабатывания датчика по Z- пин 139 - пропадание сигнала \
else
{
DAC(7,0); // остановить шпиндель, установив напряжение в 0
ClearBit(145); // отключить шпиндель, разомкнув выход 145
ClearBit(144);
}
}
return 0;
}
Еще использую файл коррекции длины инструмента:
#include "KMotionDef.h"
int DoPC(int cmd);
int DoPCInt(int cmd, int i);
#define GATH_OFF 0 // define the offset into the Gather buffer where strings are passed
main()
{
Jog(2,-10403); // перемещение оси Z в отрицательном направлении на скорости 10% от максимальной 10403имп/сек
while (!ReadBit(139)) ; // ожидание срабатывания датчика по Z- пин 139 - пропадание сигнала
Jog(2,0); // остановка оси Z
Jog(2,800); // перемещение оси Z в положительном направлении на скорости 5% от максимальной 204800 имп/сек
while (!ReadBit(38)) ; // ожидание срабатывания индексной метки по Z- пин 38 - появление сигнала
Jog(2,0); // остановка оси Z
Jog(2,-800); // ехать вниз на скорости 400 имп/сек
while (!ReadBit(139)) ; // пока не не изменится состояние пин 20
Zero(2); // обнуление координаты оси Z
Jog(2,0);
DisableAxis(2); // отключить ось Z
ch2->Position=81920;
EnableAxisDest(2,81920); //включить ось Z с начальным значением 81920 имп
И поиск нуля оси А:
#include "KMotionDef.h"
int DoPC(int cmd);
int DoPCInt(int cmd, int i);
#define GATH_OFF 0 // define the offset into the Gather buffer where strings are passed
main()
{
Jog(2,-10403); // перемещение оси Z в отрицательном направлении на скорости 10% от максимальной 10403имп/сек
while (!ReadBit(139)) ; // ожидание срабатывания датчика по Z- пин 139 - пропадание сигнала
Jog(2,0); // остановка оси Z
Jog(2,800); // перемещение оси Z в положительном направлении на скорости 5% от максимальной 204800 имп/сек
while (!ReadBit(38)) ; // ожидание срабатывания индексной метки по Z- пин 38 - появление сигнала
Jog(2,0); // остановка оси Z
Jog(2,-800); // ехать вниз на скорости 400 имп/сек
while (!ReadBit(139)) ; // пока не не изменится состояние пин 20
Zero(2); // обнуление координаты оси Z
Jog(2,0);
DisableAxis(2); // отключить ось Z
ch2->Position=81920;
EnableAxisDest(2,81920); //включить ось Z с начальным значением 81920 имп
Может где то эти программы зацыкливаюся. Потому что при остановке программы на паузу и отводе осей в сторону и потом продолжении программы она выполняется с прерываниями. Ось разгоняется тормозит и снова разгоняется на прямых участках.
Не знаю как спрятать текст под прокрутку поэтому получилось так много и текст сделал больше чтобы разграничить.