Я про эти нюансы работы консоли не знал. попробую использовать в C коде.
Вы про IIR фильтры? я вообще понятия не имею как их настраивать.
вот код:
Код: Выделить всё
#include "KMotionDef.h"
void main()
{
int BitA,Change1=0,Change2=0, DiffX2;
int PosNoWrap, NewPos, Pos=0, wraps;
double Factor=0;
ch0->InputMode=ENCODER_MODE;
ch0->OutputMode=DAC_SERVO_MODE;
ch0->Vel=99471.8394324346;
ch0->Accel=198943.6788648692;
ch0->Jerk=1e+09;
ch0->P=1.07;
ch0->I=0;
ch0->D=0;
ch0->FFAccel=0;
ch0->FFVel=0;
ch0->MaxI=2047;
ch0->MaxErr=10000;
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+09;
ch0->SoftLimitNeg=-1e+09;
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=100000;
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=99471.8394324346;
ch1->Accel=198943.6788648692;
ch1->Jerk=1e+09;
ch1->P=1.07;
ch1->I=0;
ch1->D=0;
ch1->FFAccel=0;
ch1->FFVel=0;
ch1->MaxI=2047;
ch1->MaxErr=10000;
ch1->MaxOutput=2047;
ch1->DeadBandGain=1;
ch1->DeadBandRange=0;
ch1->InputChan0=1;
ch1->InputChan1=1;
ch1->OutputChan0=1;
ch1->OutputChan1=1;
ch1->MasterAxis=0;
ch1->LimitSwitchOptions=0x100;
ch1->LimitSwitchNegBit=0;
ch1->LimitSwitchPosBit=0;
ch1->SoftLimitPos=1e+09;
ch1->SoftLimitNeg=-1e+09;
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=100000;
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=99471.8394324346;
ch2->Accel=198943.6788648692;
ch2->Jerk=1e+09;
ch2->P=1.2;
ch2->I=0.0031;
ch2->D=0.00047;
ch2->FFAccel=0;
ch2->FFVel=0;
ch2->MaxI=2047;
ch2->MaxErr=1e+09;
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=0x100;
ch2->LimitSwitchNegBit=0;
ch2->LimitSwitchPosBit=0;
ch2->SoftLimitPos=1e+09;
ch2->SoftLimitNeg=-1e+09;
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=100000;
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;
Zero(1);
Zero(0);
Zero(2);
EnableAxisDest(1,0);
EnableAxisDest(0,0);
EnableAxisDest(2,0);
DefineCoordSystem(0,2,-1,-1);
printf("Init complete\n");
/*for (;;) //loop forever
{
WaitNextTimeSlice();
if (CheckDone(0)==0 & CheckDone)
SetBit(144);
else
ClearBit(144);
}*/
return 0;
}
UPD: Попробовал использовать CheckDone.
Код: Выделить всё
for (;;) //loop forever
{
WaitNextTimeSlice();
if (BufDoneAxis0==0 & CheckDone(0)==1)
{ printf("Ostanov\n");
ClearBit(144);
ClearBit(145);
BufDoneAxis0=CheckDone(0);
}
else
{
BufDoneAxis0=CheckDone(0);
}
if (BufDoneAxis2==0 & CheckDone(2)==1)
{ printf("Zapusk(ostanov)\n");
SetBit(144);
SetBit(145);
BufDoneAxis2=CheckDone(2);
}
else
{
BufDoneAxis2=CheckDone(2);
}
}
События CheckDone(0) и CheckDone(2) наступают одновременно. Вне зависимости от того какой осью двигаешься. Нулевой или второй. Наступают только при перемещении по Jog. По G1 ничего нет.