Итак, по порядку.
Задача:
Поднять станок лазерной резки на трех осях с сервоприводами с аналоговым управлением. Рабочая область большая (честно, пока не знаю какая), по сему на одной оси установлено два сервопривода.
Что имеем:
1 Сервомоторы Estun EMJ-08APB22. Два на оси X. Один на оси Y. За ось Z пока не брался (Там датчик приближения, это отдельная тема.)
2. Серводрайверы к моторам
3. Плата KFlop и KAnalog
4. Программное обеспечение версии 4.33
По вопросу:
На данном этапе работы стоит задача двигать осью X. Чтобы два мотора двигались синхронно, не было перекосов, заклинивания и т.д.
написал код инициализации, как описано в теме.
Код: Выделить всё
#include "KMotionDef.h"
void main()
{
int BitA,Change1=0,Change2=0, DiffX2;
int PosNoWrap, NewPos, Pos=0, wraps;
double Factor=0;
SetBit(152);
SetBit(157);
SetBit(158);
ch0->InputMode=ENCODER_MODE;
ch0->OutputMode=DAC_SERVO_MODE;
ch0->Vel=166667;
ch0->Accel=333333;
ch0->Jerk=666667;
ch0->P=1.5;
ch0->I=0;
ch0->D=0;
ch0->FFAccel=0;
ch0->FFVel=0;
ch0->MaxI=2047;
ch0->MaxErr=1e+009;
ch0->MaxOutput=2047;
ch0->DeadBandGain=1;
ch0->DeadBandRange=0;
ch0->InputChan0=0;
ch0->InputChan1=0;
ch0->OutputChan0=0;
ch0->OutputChan1=2;
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=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;
ch2->InputMode=ENCODER_MODE;
ch2->OutputMode=DAC_SERVO_MODE;
ch2->Vel=166667;
ch2->Accel=333333;
ch2->Jerk=666667;
ch2->P=1.5;
ch2->I=0;
ch2->D=0;
ch2->FFAccel=0;
ch2->FFVel=0;
ch2->MaxI=2047;
ch2->MaxErr=1e+009;
ch2->MaxOutput=2047;
ch2->DeadBandGain=1;
ch2->DeadBandRange=0;
ch2->InputChan0=2;
ch2->InputChan1=2;
ch2->OutputChan0=2;
ch2->OutputChan1=2;
ch2->MasterAxis=0;
ch2->LimitSwitchOptions=0x100;
ch2->LimitSwitchNegBit=0;
ch2->LimitSwitchPosBit=0;
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=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;
EnableAxis(0);
EnableAxis(2);
DefineCoordSystem6(0,-1,-1,2,-1,-1);
printf("Init complete\n");
return 0;
}
Инициализирую его. В KmotionCNC задаю G0 X1000. Мотор оси 0 (ведущий) отрабатывает задачу, а мотор оси 2 (ведомый) "пытается следовать за нулевым, но что-то его удерживает в нуле". В консоли программы KMotion всё отрабатывает на ура, как и в утилите Step Response, моторы движутся синхронно и счастью моему нет предела.
Может кто настраивал ось в Slave режиме, в чем моя ошибка?
P.S. Во время работы c KFlop'ом обнаружилось много непонятных мне вещей. 1. Например, как видно в коде я использую 0 и 2 канал для подключения сервоприводов, всё по тому, что на входе первого канала значения постоянно инкриментируются. Это не зависит, подключен или нет драйвер, активирована ли ось. ПОСТОЯННО. 2. В KmotionCNC в оси Z значения машинных координат и энкодера различаются на один мм. в других осях всё норм. оффсеты по нулям. Приходится ставить оффсет Z на одну единицу меньше постоянно. Это немножко напрягает.
Надеюсь, этот пост оживит тему.