Ввод в эксплуатацию ЧПУ системы на основе контроллера Kflop.

KFlop, KStep, KAnalog, KMotion...

Имеете ли вы контроллер Kflop? :-)

Можно выбрать до 1 варианта ответа

 
 
Результаты голосования

robinnn
Кандидат
Сообщения: 46
Зарегистрирован: 02 фев 2014, 01:44
Репутация: 0
Контактная информация:

Re: Ввод в эксплуатацию ЧПУ системы на основе контроллера Kf

Сообщение robinnn »

Smouk писал(а): По этому коду трудно сделать вывод. Есть код вызывающийся дополнительно при активации СТОП(либо переключение пинов и т.д.)?
Может не правильно понял. Но другой код не вызывается у меня (по крайней мере специально). При нажатии на стоп у меня должны выключиться усилители двигателей. При обычных действиях это происходит всегда, а после обнуления нет.
Код для реле, которое включает питание усилителей, может в ньом проблема? Или его нуж продублироваьт в коде для обнулени?
(для просмотра содержимого нажмите на ссылку)
SetBitDirection(144,1);
for(;;) //loop forever
{
WaitNextTimeSlice();
if (ch0->Enable && ch1->Enable && ch2->Enable)
SetBit(144);
else
{
ClearBit(144);
ClearBit(145); // отключить шпиндель, разомкнув выход 145
}
}
return 0;
}
Smouk
Кандидат
Сообщения: 76
Зарегистрирован: 08 ноя 2016, 16:36
Репутация: 32
Настоящее имя: Алексей
Контактная информация:

Re: Ввод в эксплуатацию ЧПУ системы на основе контроллера Kf

Сообщение Smouk »

robinnn писал(а):При нажатии на стоп у меня должны выключиться усилители двигателей. При обычных действиях это происходит всегда, а после обнуления нет.
Код для реле, которое включает питание усилителей, может в ньом проблема? Или его нуж продублироваьт в коде для обнулени?
А покажите код "обнуления".
Так же можно скопировать часть кода в программу и в настройках KMotionCNC указать ее выполнение при команде "стоп", это решит проблему, но не покажет причину.
robinnn
Кандидат
Сообщения: 46
Зарегистрирован: 02 фев 2014, 01:44
Репутация: 0
Контактная информация:

Re: Ввод в эксплуатацию ЧПУ системы на основе контроллера Kf

Сообщение robinnn »

Smouk писал(а):А покажите код "обнуления".
Так же можно скопировать часть кода в программу и в настройках KMotionCNC указать ее выполнение при команде "стоп", это решит проблему, но не покажет причину.
(для просмотра содержимого нажмите на ссылку)
#include "KMotionDef.h"


//simple routine to:
//
// #1 disable limits
// #2 jog to a limit at speed
// #3 Reverse till index pulse
// #4 stop
// #5 zero the axis
// #6 move back inside
// #7 enable limits

int SimpleHomeIndexFunction(int axis, // axis number to home
float speed, // speed to move toward home
int dir, // direction to move toward home (+1 or -1)
int limitbit, // limit bit number to watch for
int limitpolarity, // limit polarity to wait for (1 or 0)
float indexspeed, // speed to move while searching for index
int indexbit, // index bit number to watch for (use -1 for none)
int indexpolarity, // index polarity to wait for (1 or 0)
float offset) // amount to move inside limits
{
int SaveLimits; //place to save limit switch settings

//DisableAxis(axis); -------------------

// disable the limits (first save how they were set)
SaveLimits = chan[axis].LimitSwitchOptions;
chan[axis].LimitSwitchOptions = 0;

//EnableAxis(axis); // enable axis and begin servoing where we are ---------------------

// Home - jog until it sees the limit

Jog(axis,speed*dir); // jog slowly
while (ReadBit(limitbit)!=limitpolarity) // loop until Limit bit goes to specified polarity
if (!chan[axis].Enable) return 1; // abort/exit if disabled

chan[axis].set = 20

if (indexbit!=-1) // index bit specified?
{
Jog(axis,-indexspeed*dir); // reverse and jog slowly
while (ReadBit(indexbit)!=indexpolarity) // loop until index bit goes to specified polarity
if (!chan[axis].Enable) return 1; // abort/exit if disabled
}

Jog(axis,0); // stop
while (!CheckDone(axis)) // loop until motion completes
if (!chan[axis].Enable) return 1; // abort/exit if disabled

//DisableAxis(axis); // disable the axis-------------------
Zero(axis); // Zero the position
//EnableAxis(axis); // re-enable---------------------------

Move(axis,-dir * offset); // move some amount inside the limits
while (!CheckDone(axis)) ; // loop until motion completes
if (!chan[axis].Enable) return 1; // abort/exit if disabled

chan[axis].LimitSwitchOptions = SaveLimits; // restore limit settings
return 0;
}




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()
{

//определяем пины для индексных меток, как ВХОД

SetBitDirection(36,0); // для оси Х
SetBitDirection(37,0); // для оси Y
SetBitDirection(38,0); // для оси Z



// поиск НОМЕ по Z
SimpleHomeIndexFunction(
2, // axis number to home
2500, // speed to move toward home
1, // direction to move toward home (+1 or -1)
138, // limit bit number to watch for
1, // limit polarity to wait for (1 or 0)
2000, // speed to move while searching for index
38, // index bit number to watch for (use -1 for none)
1, // index polarity to wait for (1 or 0)
400); // amount to move inside limits
// поиск НОМЕ по X
SimpleHomeIndexFunction(
0, // axis number to home
2330, // speed to move toward home
-1, // direction to move toward home (+1 or -1)
136, // limit bit number to watch for
1, // limit polarity to wait for (1 or 0)
2000, // speed to move while searching for index
36, // index bit number to watch for (use -1 for none)
1, // index polarity to wait for (1 or 0)
390.625); // amount to move inside limits


// поиск НОМЕ по y
SimpleHomeIndexFunction(
1, // axis number to home
2330, // speed to move toward home
-1, // direction to move toward home (+1 or -1)
137, // limit bit number to watch for
1, // limit polarity to wait for (1 or 0)
2000, // speed to move while searching for index
37, // index bit number to watch for (use -1 for none)
1, // index polarity to wait for (1 or 0)
400); // amount to move inside limits






MDI("G92.1"); // очистка всех действующих оффсетов
}

//далее код обеспечивающий ввод команды в MDI

// put the MDI string (Manual Data Input - GCode) in the
// gather buffer and tell the App where it is
int MDI(char *s)
{
char *p=(char *)gather_buffer+GATH_OFF*sizeof(int);
int i;

do // copy to gather buffer w offset 0
{
*p++ = *s++;
}while (s[-1]);

// issue the command an wait till it is complete
// (or an error - such as busy)
return DoPCInt(PC_COMM_MDI,GATH_OFF);
}


// Put an integer as a parameter and pass the command to the App
int DoPCInt(int cmd, int i)
{
int result;
persist.UserData[PC_COMM_PERSIST+1] = i;
return DoPC(cmd);
}

// Pass a command to the PC and wait for it to handshake
// that it was received by either clearing the command
// or changing it to a negative error code
int DoPC(int cmd)
{
int result;

persist.UserData[PC_COMM_PERSIST]=cmd;

do
{
WaitNextTimeSlice();
}while (result=persist.UserData[PC_COMM_PERSIST]>0);

return result;
}
Решил проблему добавив в код обнуления
вот такой код
SetBitDirection(144,1);

for(;;) //loop forever
{
WaitNextTimeSlice();
if (ch0->Enable && ch1->Enable && ch2->Enable)
SetBit(144);
else
{
ClearBit(144);
ClearBit(145); // отключить шпиндель, разомкнув выход 145
}
}
Bes
Новичок
Сообщения: 21
Зарегистрирован: 19 июн 2017, 15:27
Репутация: 0
Настоящее имя: Андрей
Контактная информация:

Re: Ввод в эксплуатацию ЧПУ системы на основе контроллера Kf

Сообщение Bes »

У меня как я понимаю похожая проблема. Решил объединить две кнопки: zero и resolver, что бы при включении нажимать одну, вместо двух. Все получилось, включается, НО.
Если нажать на стоп, а посте вновь init и двинуть ось - то она неконтролируемой начинает ехать! Причем со скоростью бол ще чем выставлен максимальный холостой ход! Решение пробьемы пока не найденно
Цель оправдывает средства.
Smouk
Кандидат
Сообщения: 76
Зарегистрирован: 08 ноя 2016, 16:36
Репутация: 32
Настоящее имя: Алексей
Контактная информация:

Re: Ввод в эксплуатацию ЧПУ системы на основе контроллера Kf

Сообщение Smouk »

Bes писал(а):У меня как я понимаю похожая проблема. Решил объединить две кнопки: zero и resolver, что бы при включении нажимать одну, вместо двух. Все получилось, включается, НО.
Если нажать на стоп, а посте вновь init и двинуть ось - то она неконтролируемой начинает ехать! Причем со скоростью бол ще чем выставлен максимальный холостой ход! Решение пробьемы пока не найденно
Так Вы код то хотя бы покажите сразу - обоих функций и скриншот окна настройки.
Bes
Новичок
Сообщения: 21
Зарегистрирован: 19 июн 2017, 15:27
Репутация: 0
Настоящее имя: Андрей
Контактная информация:

Re: Ввод в эксплуатацию ЧПУ системы на основе контроллера Kf

Сообщение Bes »

Smouk писал(а):Так Вы код то хотя бы покажите сразу - обоих функций
Код кнопки Zero

#include "KMotionDef.h"

main()
{
Zero(0);
Zero(1);
Zero(2);
Zero(3);

InitAux();
AddKonnect_Aux0(0,&VirtualBits,VirtualBitsEx);

Delay_sec(2);
SetBit(149);
Delay_sec(2);
SetBit(57);
}

Код кнопки Resolver

#include "KMotionDef.h"


// Two Axis Resolver Program 1/6/08
//
// outputs square wave to both resolvers using Aux Switch Output
//
// then samples output coils near positive and negative peaks
// takes the difference to compute magnitudes
//

// these ratios are used to match the amplitudes of sine:cosine


#define RATIO0 (985.0f/936.0f) // size j/size k
#define RATIO1 (1060.0f/1056.0f) // size n/size m
#define RATIO2 (1046.0f/1065.0f) // size p/size q



main()

{
int i=0;
int k0,j0,k1,j1;
int m0,n0,m1,n1;
int q0,p0,q1,p1;


SetBit(167); //+/-15V on
SetBitDirection(152,1); // configure AUX switch as output
SetBitDirection(144,1);
SetBitDirection(145,1);
SetBitDirection(146,1);
SetBitDirection(148,1);
DefineCoordSystem(0,1,2,-1); // Define 2 axis system


Delay_sec(0.1); // wait for +/- 15V to be stable

for (;;) // repeat forever
{
WaitNextTimeSlice(); // wait a few servo cycles
WaitNextTimeSlice();
WaitNextTimeSlice();
Delay_sec(10e-6); // wait for ADC conversion to complete
k0=ADC(0); // Sample all the ADCs
j0=ADC(1);
m0=ADC(2);
n0=ADC(3);
q0=ADC(4);
p0=ADC(5);
SetBit(152); // Switch the resolver excitation


//compute & track position based on measured magnitudes
DoResolverInput2(ch0,(k1-k0)*RATIO0,j1-j0);
DoResolverInput2(ch1,(m1-m0)*RATIO1,n1-n0);
DoResolverInput2(ch2,(q1-q0)*RATIO2,p1-p0);


WaitNextTimeSlice();// wait a few servo cycles
WaitNextTimeSlice();
WaitNextTimeSlice();
Delay_sec(10e-6); // wait for ADC conversion to complete
k1=ADC(0); // Sample all the ADCs
j1=ADC(1);
m1=ADC(2);
n1=ADC(3);
q1=ADC(4);
p1=ADC(5);
ClearBit(152); // Switch the resolver excitation


//compute & track position based on measured magnitudes
DoResolverInput2(ch0,(k1-k0)*RATIO0,j1-j0);
DoResolverInput2(ch1,(m1-m0)*RATIO1,n1-n0);
DoResolverInput2(ch2,(q1-q0)*RATIO2,p1-p0);



if (ch0->Enable && ch1->Enable && ch2->Enable)
SetBit(144);
else
ClearBit(144);


if (ch0->Enable && ch1->Enable && ch2->Enable)
SetBit(145);
else
ClearBit(145);


if (ch0->Enable && ch1->Enable && ch2->Enable)
SetBit(146);
else
ClearBit(146);






if (!ReadBit(1054)) // если пропадет сигнал (знак !) на пине 137

{
StopCoordinatedMotion(); //встать на паузуDisableAxis(0);
DisableAxis(0);
DisableAxis(1);
DisableAxis(2);
DisableAxis(3);
ClearBit(148);

}
#if 0 // enable this to print the magnitudes occasionally
if (++i==1000)
{
i=0;
printf("%5d% 5d\n",p1-p0,q1-q0);

}
#endif
}
}


Объединил их скопировав в одну. Между ними Delay на 2 секунды.

Код всех файлов брал из этого же форума)) и init тоже
Цель оправдывает средства.
Smouk
Кандидат
Сообщения: 76
Зарегистрирован: 08 ноя 2016, 16:36
Репутация: 32
Настоящее имя: Алексей
Контактная информация:

Re: Ввод в эксплуатацию ЧПУ системы на основе контроллера Kf

Сообщение Smouk »

Весь код нужно убирать внутрь тэгом: [/code]

Было бы логичнее показать готовый файл целиком с паузами и всем остальным.
Если нажать на стоп, а посте вновь init и двинуть ось - то она неконтролируемой начинает ехать! Причем со скоростью бол ще чем выставлен максимальный холостой ход! Решение пробьемы пока не найденно
Если Вы нажимаете "стоп", а потом инит и передвигаетесь, оси логично сходят с ума, так как в файле resolver бесконечный цикл, который и опрашивает АЦП. Стоп останавливает все каналы кроме 7.
Поэтому обработку резольвера надо перенести в бесконечный цикл файла инит.

Далее есть странности в коде не влияющие на работу, например:

Код: Выделить всё

if (ch0->Enable && ch1->Enable && ch2->Enable) 
SetBit(144); 
else
ClearBit(144); 


if (ch0->Enable && ch1->Enable && ch2->Enable) 
SetBit(145); 
else
ClearBit(145); 


if (ch0->Enable && ch1->Enable && ch2->Enable) 
SetBit(146); 
else
ClearBit(146);
В чем смысл делать 2 лишних проверки, а не записать примерно так:

Код: Выделить всё

if (ch0->Enable && ch1->Enable && ch2->Enable) 
{
SetBit(144); 
SetBit(145); 
SetBit(146); 
} else {
ClearBit(144); 
ClearBit(145); 
ClearBit(146); 
}
Bes
Новичок
Сообщения: 21
Зарегистрирован: 19 июн 2017, 15:27
Репутация: 0
Настоящее имя: Андрей
Контактная информация:

Re: Ввод в эксплуатацию ЧПУ системы на основе контроллера Kf

Сообщение Bes »

Smouk писал(а):Если Вы нажимаете "стоп", а потом инит и передвигаетесь, оси логично сходят с ума
тогда не понимаю почему такого не происходило до объединения кнопок Zero и Resolver при выполнении тех же действий.

За оптимизацию кода понял, спасибо.
Цель оправдывает средства.
Smouk
Кандидат
Сообщения: 76
Зарегистрирован: 08 ноя 2016, 16:36
Репутация: 32
Настоящее имя: Алексей
Контактная информация:

Re: Ввод в эксплуатацию ЧПУ системы на основе контроллера Kf

Сообщение Smouk »

Bes писал(а):тогда не понимаю почему такого не происходило до объединения кнопок Zero и Resolver при выполнении тех же действий.
Не могла кнопка запуска резольвера быть повешена на 7 канал?

Не хватает файла инит для полной картины и скриншота в каком канале что запускается.
Bes
Новичок
Сообщения: 21
Зарегистрирован: 19 июн 2017, 15:27
Репутация: 0
Настоящее имя: Андрей
Контактная информация:

Re: Ввод в эксплуатацию ЧПУ системы на основе контроллера Kf

Сообщение Bes »

Init

Код: Выделить всё


#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(153);
	SetBit(166);
	
	
	
	ch0->InputMode=USER_INPUT_MODE;
	ch0->OutputMode=DAC_SERVO_MODE;
	ch0->Vel=40000;
	ch0->Accel=80000;
	ch0->Jerk=400000;
	ch0->P=0.3872;
	ch0->I=0,0002;
	ch0->D=0,432;
	ch0->FFAccel=0;
	ch0->FFVel=0.015576;
	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=1000000;
	//ch0->SoftLimitNeg=-407500;
	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=1;
	ch0->Lead=0;
	ch0->MaxFollowingError=1000000000;
	ch0->StepperAmplitude=20;

	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=USER_INPUT_MODE;
	ch1->OutputMode=DAC_SERVO_MODE;
	ch1->Vel=40000;
	ch1->Accel=80000;
	ch1->Jerk=400000;
	ch1->P=0.3;
	ch1->I=0;
	ch1->D=0;
	ch1->FFAccel=0;
	ch1->FFVel=0.01518;
	ch1->MaxI=2047;
	ch1->MaxErr=1e+006;
	ch1->MaxOutput=2047;
	ch1->DeadBandGain=1;
	ch1->DeadBandRange=0;
	ch1->InputChan0=1;
	ch1->InputChan1=0;
	ch1->OutputChan0=1;
	ch1->OutputChan1=0;
	ch1->MasterAxis=-1;
	ch1->LimitSwitchOptions=0x100;
	ch1->LimitSwitchNegBit=0;
	ch1->LimitSwitchPosBit=0;
//	ch1->SoftLimitPos=1000000;
	//ch1->SoftLimitNeg=-252500;
	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=1;
	ch1->Lead=0;
	ch1->MaxFollowingError=1000000000;
	ch1->StepperAmplitude=20;

	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=USER_INPUT_MODE;
	ch2->OutputMode=DAC_SERVO_MODE;
	ch2->Vel=40000;
	ch2->Accel=80000;
	ch2->Jerk=400000;
	ch2->P=0.95;
	ch2->I=0.0003;
	ch2->D=0.4;
	ch2->FFAccel=0;
	ch2->FFVel=0.01684;
	ch2->MaxI=2047;
	ch2->MaxErr=1e+006;
	ch2->MaxOutput=2047;
	ch2->DeadBandGain=1;
	ch2->DeadBandRange=0;
	ch2->InputChan0=2;
	ch2->InputChan1=0;
	ch2->OutputChan0=2;
	ch2->OutputChan1=0;
	ch2->MasterAxis=-1;
	ch2->LimitSwitchOptions=0x100;
	ch2->LimitSwitchNegBit=0;
	ch2->LimitSwitchPosBit=0;
	//ch2->SoftLimitPos=1000000;
	//ch2->SoftLimitNeg=-377500;
	ch2->InputGain0=1;
	ch2->InputGain1=1;
	ch2->InputOffset0=0;
	ch2->InputOffset1=0;
	ch2->OutputGain=1;
	ch2->OutputOffset=0;
	ch2->SlaveGain=1;
	ch2->BacklashMode=BACKLASH_LINEAR;
	ch2->BacklashAmount=110;
	ch2->BacklashRate=200;

   // ch2->BacklashMode=BACKLASH_LINEAR;
//	ch2->BacklashAmount=70;
//	ch2->BacklashRate=200;
	ch2->invDistPerCycle=1;
	ch2->Lead=0;
	ch2->MaxFollowingError=1000000000;
	ch2->StepperAmplitude=20;

	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=2000;
	ch3->Accel=20000;
	ch3->Jerk=200000;
	ch3->P=0.15;
	ch3->I=0.000017;
	ch3->D=1.5;
	ch3->FFAccel=0;
	ch3->FFVel=0.015;
	ch3->MaxI=2047;
	ch3->MaxErr=100000;
	ch3->MaxOutput=2047;
	ch3->DeadBandGain=0.1;
	ch3->DeadBandRange=5;
	ch3->InputChan0=0;
	ch3->InputChan1=4;
	ch3->OutputChan0=7;
	ch3->OutputChan1=6;
	ch3->MasterAxis=-1;
	ch3->LimitSwitchOptions=0x100;
	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=1;
	ch3->Lead=0;
	ch3->MaxFollowingError=1000000000;
	ch3->StepperAmplitude=250;

	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,-1);

    
	
  
       
}

Smouk писал(а):Не могла кнопка запуска резольвера быть повешена на 7 канал?
Подскажите новичку, где именно это можно посмотреть и сделать скриншот?
Цель оправдывает средства.
Smouk
Кандидат
Сообщения: 76
Зарегистрирован: 08 ноя 2016, 16:36
Репутация: 32
Настоящее имя: Алексей
Контактная информация:

Re: Ввод в эксплуатацию ЧПУ системы на основе контроллера Kf

Сообщение Smouk »

Справа, сверху -> Tool setup.
Откроются настройки, перейдите на вкладку "User Button".
Тут указываются все пользовательские кнопки, номер канала (до 7) выполнения и путь к исполняемой программе. Если путь к программе не указан будет выполнена программа предварительно записанная к KFLOP для этого потока.

Еще по файлу инит видно, что Вы не используете фильтры. Можно добавить к выходу(это крайний фильтр #2 справа в окне настроек) хотя бы фильтр второго порядка - ПИД надо будет проверить еще раз, но обычно это значительно улучшает поведение привода. Попробуйте, если будет время хотя бы на одной оси.
Bes
Новичок
Сообщения: 21
Зарегистрирован: 19 июн 2017, 15:27
Репутация: 0
Настоящее имя: Андрей
Контактная информация:

Re: Ввод в эксплуатацию ЧПУ системы на основе контроллера Kf

Сообщение Bes »

Скриншот окна, на сколько понимаю, 7 канал не используется нашими кнопками включения


Smouk писал(а):еще по файлу инит видно, что Вы не используете фильтры. Можно добавить к выходу(это крайний фильтр #2 справа в окне настроек) хотя бы фильтр второго порядка - ПИД надо будет проверить еще раз, но обычно это значительно улучшает поведение привода. Попробуйте, если будет время хотя бы на одной оси.
С фильтрами пока вообще не сталкивался, не знаю что такое и с чем едят, пока что хочу разобраться с включением, что бы рабочий не умер от страха, когда оси с ума сойдут :hehehe: :hehehe:
Вложения
Скрин.JPG (5496 просмотров) <a class='original' href='./download/file.php?id=114501&mode=view' target=_blank>Загрузить оригинал (127.03 КБ)</a>
Цель оправдывает средства.
Bes
Новичок
Сообщения: 21
Зарегистрирован: 19 июн 2017, 15:27
Репутация: 0
Настоящее имя: Андрей
Контактная информация:

Re: Ввод в эксплуатацию ЧПУ системы на основе контроллера Kf

Сообщение Bes »

Прошу прощения Smouk, не могу ответить в лику, т.к такая возможность открывается только после 10 сообщений на форуме.
Еще раз:
- Если в конфигурации, как сейчас нажать инит-зеро-резольвер-стоп-инит и поехать, то оси не слетают?
- Инит-зеро+резольвер в одной программе - стоп - инит и поехать, то срыв слежения?
Сейчас запускается так:
Zero
Resolver
Init
И всё работает на отлично, нажимаю стоп, Init полёт нормальный.

Как попытался:
Zero+Delaysec(2)+Resolver
Init
Запускается работает
НО если жмём стоп и снова инит, вот тогда срыв и неконтролируемое перемещение.
На первой странице настроек есть ли какая ни будь команда при запуск Stop?
Где это можно посмотреть? Но вроде всё стандартно, тот же аварийный грибок только программный так сказать.

Город Орск
Цель оправдывает средства.
Smouk
Кандидат
Сообщения: 76
Зарегистрирован: 08 ноя 2016, 16:36
Репутация: 32
Настоящее имя: Алексей
Контактная информация:

Re: Ввод в эксплуатацию ЧПУ системы на основе контроллера Kf

Сообщение Smouk »

Я поэтому емейл добавил на всякий случай :) Ну ок.
Где это можно посмотреть? Но вроде всё стандартно, тот же аварийный грибок только программный так сказать.
Вложения
2017-06-22_10-08-04.png (5475 просмотров) <a class='original' href='./download/file.php?id=114506&mode=view' target=_blank>Загрузить оригинал (143.95 КБ)</a>
Bes
Новичок
Сообщения: 21
Зарегистрирован: 19 июн 2017, 15:27
Репутация: 0
Настоящее имя: Андрей
Контактная информация:

Re: Ввод в эксплуатацию ЧПУ системы на основе контроллера Kf

Сообщение Bes »

Переделал скрипт поиска центра отверстия на поиск центра по наружнему диаметру заготовки. Вдруг кому понадобится. Если уже что то подобное выкладывали, то прошу прощения.

Код: Выделить всё


#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()
{        
   int Answer;
   double *pD = (double *)persist.UserData;
   double PZ0,PZ1,PZ2,PX0,PX1,PX2,PX3,PY0,PY1,PY2,PY3;


      
//Kasanie zagotovki sprava	
Jog(0,800);               // peremeshaem os' X vpered do kasania zagotovki
      while (!ReadBit(1029));          // zhdem kasania i srabativania sensora s bit-4
      Jog(0,0);                // ostanavlivaem os' X
      Delay_sec(0.3);            // zhdem 0.3 sec
      PX1 = chan[0].Dest;         // zapisivaem polozhenie osi X na krayu zagotovki
      PX3=PX1-1000;
MoveAtVel(0,PX3,1000);         // otezhaem
      while (!CheckDone(0)) ;  
Delay_sec(1); 

//peremeshenie nad zagotovkoy po osi X
MoveRelAtVel(2,25000,9000); //podnimaim os' Z
while (!CheckDone(2));

 Jog(0,6000);               // peremeshaem os' X vpered do kasania
    while (!ReadBit(1029));   
 Jog(0,0);                // ostanavlivaem os' X
     Delay_sec(0.3);    
     
MoveRelAtVel(2,-25000,9000); //opuskaem os' Z
while (!CheckDone(2))
      
//Kasanie zagotovki sleva      
	
Jog(0,-800);               // peremeshaem os' X vpered do kasania zagotovki
      while (!ReadBit(1029));          // zhdem kasania i srabativania sensora s bit-4
      Jog(0,0);                // ostanavlivaem os' X
      Delay_sec(0.3);            // zhdem 0.3 sec
      PX2 = chan[0].Dest;         // zapisivaem polozhenie osi X na krayu zagotovki   
      PX3=PX2+1000;
      MoveAtVel(0,PX3,1000);         // otezhaem
      while (!CheckDone(0)) ;  
Delay_sec(1); 

PX0=(PX1-PX2)/2;  //Vichislyem centr po osi X

//Peremeshenie k centru po osi X

MoveRelAtVel(2,25000,9000); //podnimaim os' Z
while (!CheckDone(2));
MoveRelAtVel(0,PX0-1000,9000);
while (!CheckDone(0)); 
      
//Totze ahalay mahalay tolko po osi Y
//peremeshenie nad zagotovkoy po osi Y 

MoveRelAtVel(1,-PX0+25000,9000); //Peremeshaem os' Y na rasstoynie radiusa po osi X s pripuskom
while (!CheckDone(1));
Delay_sec(0.3); 

MoveRelAtVel(2,-25000,9000); //opuskaem os' Z
while (!CheckDone(2))
   
//Kasanie zagotovki snizu
     
   Jog(1,-800);               // peremeshaem os' Y vpered do kasania zagotovki
      while (!ReadBit(1029));          // zhdem kasania i srabativania sensora s bit-4
      Jog(1,0);                // ostanavlivaem os' Y
      Delay_sec(0.3);            // zhdem 0.3 sec
      PY2 = chan[1].Dest;         // zapisivaem polozhenie osi Y na krayu zagotovki   
      PY3=PY2+1000;
MoveAtVel(1,PY3,1000);         // otezhaem
      while (!CheckDone(1)) ;  
Delay_sec(1); 

MoveRelAtVel(2,25000,9000); //podnimaim os' Z
while (!CheckDone(2));



//peremeshenie nad zagotovkoy po osi Y 

MoveRelAtVel(1,PX0+PX0-25000,9000); //Peremeshaem os' Y na rasstoynie radiusa po osi X s pripuskom
while (!CheckDone(1));
Delay_sec(0.3); 
MoveRelAtVel(2,-25000,9000); //opuskaem os' Z
while (!CheckDone(2))

//Kasanie zagotovki sverhu 
   
Jog(1,800);               // peremeshaem os' Y vpered do kasania zagotovki
      while (!ReadBit(1029));          // zhdem kasania i srabativania sensora s bit-4
      Jog(1,0);                // ostanavlivaem os' Y
      Delay_sec(0.3);            // zhdem 0.3 sec
      PY1 = chan[1].Dest;         // zapisivaem polozhenie osi Y na krayu zagotovki
            PY3=PY1-1000;
MoveAtVel(1,PY3,1000); 
  while (!CheckDone(1)) ;   
	      
PY0=(PY1-PY2)/2;

MoveRelAtVel(2,25000,9000); //podnimaim os' Z
while (!CheckDone(2));

MoveRelAtVel(1,-PY0+1000,6000);
while (!CheckDone(1)) ;        

//Prisvaivaem uglu polozhenie X=0, Y=0

      DoPCFloat(PC_COMM_SET_X,0);
      DoPCFloat(PC_COMM_SET_Y,0);
      Delay_sec(0.1);
   
}

//Kod vvoda dannih ot DoPCFloat

int SetVars(int varoff, int n, int poff)
{
   persist.UserData[PC_COMM_PERSIST+2] = n;       // number of elements
   persist.UserData[PC_COMM_PERSIST+3] = poff;    // persist offset (doubles)
   return DoPCInt(PC_COMM_SET_VARS,varoff);       // Var index and Cmd
}
int GetVars(int varoff, int n, int poff)
{
   persist.UserData[PC_COMM_PERSIST+2] = n;       // number of elements
   persist.UserData[PC_COMM_PERSIST+3] = poff;    // persist offset (doubles)
   return DoPCInt(PC_COMM_GET_VARS,varoff);       // Var index and Cmd
}

#define GATH_OFF 0  // define the offset into the Gather buffer where strings are passed
// Trigger a message box on the PC to be displayed
// defines for MS Windows message box styles and Operator
// response IDs are defined in the KMotionDef.h file 
int MsgBox(char *s, int Flags)
{
   char *p=(char *)gather_buffer+GATH_OFF*sizeof(int);
   int i;
   
   do // copy to gather buffer w offset 0
   {
      *p++ = *s++;
   }while (s[-1]);
   
   persist.UserData[PC_COMM_PERSIST+2] = Flags;  // set options
   DoPCInt(PC_COMM_MSG,GATH_OFF);
   return persist.UserData[PC_COMM_PERSIST+3];
}
// put the MDI string (Manual Data Input - GCode) in the 
// gather buffer and tell the App where it is
int MDI(char *s)
{
   char *p=(char *)gather_buffer+GATH_OFF*sizeof(int);
   int i;
   
   do // copy to gather buffer w offset 0
   {
      *p++ = *s++;
   }while (s[-1]);
   
   // issue the command an wait till it is complete
   // (or an error - such as busy)
   return DoPCInt(PC_COMM_MDI,GATH_OFF);
}
// Put a Float as a parameter and pass the command to the App
int DoPCFloat(int cmd, float f)
{
   int result;
   persist.UserData[PC_COMM_PERSIST+1] = *(int*)&f;
   return DoPC(cmd);
}
// Put an integer as a parameter and pass the command to the App
int DoPCInt(int cmd, int i)
{
   int result;
   persist.UserData[PC_COMM_PERSIST+1] = i;
   return DoPC(cmd);
}
// Pass a command to the PC and wait for it to handshake
// that it was received by either clearing the command
// or changing it to a negative error code
int DoPC(int cmd)
{
   int result;
   
   persist.UserData[PC_COMM_PERSIST]=cmd;
   
   do
   {
      WaitNextTimeSlice();   
   }while (result=persist.UserData[PC_COMM_PERSIST]>0);
   
   //printf("Result = %d\n",result);
   return result;
}
Работает следующим образом:
Касаемся заготовки справа, отъезжаем чуть чуть, поднимаемся по Z, перемещаемся влево, пока сами не замкнём контур чем либо потому что скрип не знает заранее диаметр заготовки.
Далее опускаемся, касаемся слева, отъезжаем, поднимаемся, едем к центру по X и едем вниз по Y на расстояние равное радиусу по X+небольшой припуск. И тоже самое вверху.
Цель оправдывает средства.
Аватара пользователя
uralpt
Мастер
Сообщения: 651
Зарегистрирован: 23 ноя 2015, 14:31
Репутация: 104
Настоящее имя: евгений
Откуда: Миасс
Контактная информация:

Re: Ввод в эксплуатацию ЧПУ системы на основе контроллера Kf

Сообщение uralpt »

в общем, бяда.
Пытаюсь запустить Каналог. 3 оси, аналоговые Яскавы Сигма1, 2048 энкодеры.
Бед сразу несколько:
- Не получается вывести сигнал управления более чем на 1 ось. Т.е. смотрю "Analog Status" - в окошке сигнал есть. Реально - нет. Иногда, через 2-3 отключения питания, сигнал появляется... но только на какой-то одной оси, вторую вижу только в "Аналог Статусе", вживую ее нет. Самое смешное - что сигнал может быть вовсе не на той оси, которую показывает "Аналог Статус"...

- Пробую вывести на 7 DAC сигнал - вольтметр видит помехи, сигнала нет. Как только вешаю на этот 7 DAC сигнал управления шпинделем через частотник - сигнал есть. В переводе - DAC работает.

Пробовал разные версии KMotion, перепрошивался разными DSPKFLOP.out - бяда одинакова.

Сейчас прицеплю к каждому DAC по вольтметру, снова поставлю последнюю KMotion, прошьюсь.... и если кто-то кинет свой Init3Analog (в идеале - на Сигмы1) и хоть как-то поможет - буду щастлифф :))
Duhas
Мастер
Сообщения: 1961
Зарегистрирован: 10 окт 2015, 23:25
Репутация: 285
Настоящее имя: Андрей
Откуда: Красноярск
Контактная информация:

Re: Ввод в эксплуатацию ЧПУ системы на основе контроллера Kf

Сообщение Duhas »

не важно что там у вас подключено на выходе, если оси включены - все должно быть ок.
что у вас с максимальной ошибкой ? может у вас полярность не та выбрана и по макс ошибке тут же отрубаются оси..

вот конфиг от моей токарки, 0 и 1 - оси, 6 шпиндель.
Вложения
Init3Analog_my_first_try.c
первая попытка так и осталась рабочей версией, но эт потому что я работаю мало со станком.
(5.85 КБ) 891 скачивание
Аватара пользователя
uralpt
Мастер
Сообщения: 651
Зарегистрирован: 23 ноя 2015, 14:31
Репутация: 104
Настоящее имя: евгений
Откуда: Миасс
Контактная информация:

Re: Ввод в эксплуатацию ЧПУ системы на основе контроллера Kf

Сообщение uralpt »

Duhas,
ругается при компиляции. Требует
#include "CSS\MySpindleDefs.h"
#include "CSS\CSSJog.c"

И еще вопрос. Когда настроил выходной DAC на частотник, даже щелкая выходами CV и CVV, нажимая "off" или "СТОП", напряжение на канале оставалось. Но канал был повешен на "user button".
В случае, когда мы управляя сервой, нажмем STOP, на выводе должен быть 0?

Вроде все подключил, выглядит как-то так. Поставил Кмотион 4.33, прошился. Готов к приключениям :)) Если сразу не отвечу - до инета пока бегать из гаража нужно :))
Вложения
IMG_20170820_164835.jpg (4951 просмотр) <a class='original' href='./download/file.php?id=118614&mode=view' target=_blank>Загрузить оригинал (1006.58 КБ)</a>
Duhas
Мастер
Сообщения: 1961
Зарегистрирован: 10 окт 2015, 23:25
Репутация: 285
Настоящее имя: Андрей
Откуда: Красноярск
Контактная информация:

Re: Ввод в эксплуатацию ЧПУ системы на основе контроллера Kf

Сообщение Duhas »

в общем, тут неоднократно было описано как настраивать кфлоп, начните потихоньку с чего то одного, возьмите одну ось и попробуйте ее настроить по описанию, за вас этим удаленно заниматься смысла мало даже за деньги.
Аватара пользователя
uralpt
Мастер
Сообщения: 651
Зарегистрирован: 23 ноя 2015, 14:31
Репутация: 104
Настоящее имя: евгений
Откуда: Миасс
Контактная информация:

Re: Ввод в эксплуатацию ЧПУ системы на основе контроллера Kf

Сообщение uralpt »

полгода этим занимаюсь. Проблем с самом Кфлопом у меня нет - все работает так, как нужно. Они начинаются, как только подключаешь Каналог.
Ощущение, что нелады с прошивкой или дохлый Каналог. Проверить могу, только слизав работающую версию. Или имея второй Каналог.
Ответить

Вернуться в «KFlop»