​ ​

Форум клана ЧПУшников

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Форум клана ЧПУшников » Программы для ЧПУ-фрезеров. » dynomotion управление 8 осей


dynomotion управление 8 осей

Сообщений 101 страница 125 из 125

101

Abarmot, большое спасибо. Мне все это пригодится, когда приду на работу настраивать станок.
С импульсами на дюйм и т.п. все понятно - там единицы подписаны. А вот в файле конфигурации не хотел подбирать, хотел убедиться, что это импульсы.

Помимо скоростей и ускорений планировшика, и команды G0, еще есть скорости ускорения и jerk ручных перемещений. И везде разные настройки и к тому же они пересекаются еще.

Не могу пока до конца представить, как это работает. Видимо, сначала есть планировщик траектории, который не учитывает jerk, а потом еще есть обработка фильтром сервопетли. И еще где-то учитываются настройки из файла инициализации.
Потом, думаю, разберусь, когда будет опыт работы с контроллером.

Отредактировано michael-yurov (03-03-2013 14:32:47)

0

102

michael-yurov , скорости ручных перемещений ставите которые Вам удобны для работы , а ускорение и jerk уже сами из файла инициализации беруться , насколько я знаю . К сожалению планировщик вообще Jerk не учитывает и в скором времене не будет , это Том так сказал (( Я например файл инициализаци настраивал согласно графиков в Step response , там кручу сорость и ускорение до максимума , а в файл уже пишу процентов 70 от полученых данных , да и влияние jerk там очень хорошо видно .

0

103

Михаил, вот код, который у меня обрабатывает сигнал Энейбл:

Код:
SetBitDirection(0,1);
    	
	for (;;)  //loop forever
	{
    
    if (ch0->Enable ||  ch1->Enable  || ch2->Enable)
    
    	ClearBit(0);     	 
    	else
    	SetBit(0);
    	

    
    	
	}

У меня приводы включаются при подачи логического 0 (нуля).
В Кмоушн срабатывает при нажатии кнопки INIT (т.е. вставлен в файл инициализации), и отключаются приводы при нажатии кнопки STOP.

И файл обработки баз:

Код:
#include "KMotionDef.h"

//Plugin calls for Mach3 NotifyPlugins Commands

main()
{
	//int msg = persist.UserData[6];  // Mach3 notify Message 10000-10999

	//printf("Mach3 Notify Call, Message = %d\n",msg); 
	
	//if (msg==10100)
    //{
    	
	
    ch2->LimitSwitchOptions=0x16140010; // disable limits
        Jog(2,-10000);          // start moving
        while (!ReadBit(20)) ; // wait for switch (input #8) to change
        Zero(2); 
        Jog(2,0);          // stop
        Move(2,102857.14285714285714285714285714); 
        while (ch2->Position < 102857.14285714285714285714285714);
        
    	
        
    ch0->LimitSwitchOptions=0x18150010; // disable limits    	
        Jog(0,-10000);          // start moving    	
        while (!ReadBit(21)) ; // wait for switch (input #8) to change
        Zero(0);   
        Jog(0,0);          // stop
        Move(0,342000);
        
        
    ch1->LimitSwitchOptions=00x19170010; // disable limits
        Jog(1,-10000);          // start moving
        while (!ReadBit(23)) ; // wait for switch (input #8) to change
        Zero(1);   
        Jog(1,0);          // stop    	
        Move(1,340000);
        ch1->LimitSwitchOptions=0x19170013;
        ch2->LimitSwitchOptions=0x16140013;
        ch0->LimitSwitchOptions=0x18150013;
        
    	//};
	
	Delay_sec(2.0);
	
	//printf("Done\n"); 
}

Может не совсем правильная логика его работы, но мне пока достаточно: ось едет к концевику, при его срабатывании обнуляются показания и затем едет в заданную позицию.

Отредактировано ukr-sasha (03-03-2013 21:23:38)

0

104

Спасибо.
А то что алгоритм все время в действии - это не плохо?
Может быть стоило бы туда вставить паузу, чтобы он повторялся, например, через секунду?

0

105

Нив коем случае, если аварийная ситуация? Так нажали кнопку стоп и все стало моментально, а за секунду паузы станок может натворить дел...

0

106

ukr-sasha написал(а):

Нив коем случае, если аварийная ситуация? Так нажали кнопку стоп и все стало моментально, а за секунду паузы станок может натворить дел...

Ну, тогда, хотя бы паузу в 0.1 секунду.
А то этот контроллер прокручивает этот цикл тысячи, если не сотни тысяч раз в секунду.
Это точно не скажется на его быстродействии и стабильности?

0

107

В примерах похожий код есть. Думаю разработчик не стал его выкладывать, если бы были какие то проблемы. Да и я не заметил ничего криминального.

0

108

Что-то не получается у меня с сигналом Enable.

Я когда Stop нажимаю - у меня все работавшие потоки контроллера останавливаются.
Соответственно, останавливается и тот поток, который отвечал за активацию сигнала Enable.
И ничего не происходит.

С поиском баз и калибровкой по Z - почти разобрался.
Пока не могу найти функцию, чтобы не обнулить значение координат оси, а присвоить им значение толщины калибратора.
...
Уже нашел - EnableAxisDest(номер канала, позиция в импульсах).

Отредактировано michael-yurov (04-03-2013 05:08:22)

0

109

michael-yurov написал(а):

Я когда Stop нажимаю - у меня все работавшие потоки контроллера останавливаются.
Соответственно, останавливается и тот поток, который отвечал за активацию сигнала Enable.
И ничего не происходит.

Немного не понял.
При нажатии кнопки INIT сигнал Энейбл подается, как положено, а при нажатии Стоп - нет?
Заметил особенность, и alexandr_st тоже на это указывал, что если в память-флеш контроллера залит файл конфигурации и делать в процессе отладки его изменения, то случаются "глюки". Чтобы не было конфликтов, лучше во флеш ничего не заливать - т.е. только при нажатии  INIT должен он инициализирваться.

0

110

Оказалось, я неправильно понимаю работу контроллера.
Если дописать процедуру в конце файла инициализации, и убрать от туда оператор return 0, то цикл работает и инициализация и стоп работают правильно.
Тоже замечал глюки, но потом где-то что-то поправил и эти глюки при повторной инициализации исчезли.

Еще с лимитами, поиском базы, машинными и рабочими координатами запутался.
Пока что написал простейшую последовательность поочередного движения осей до срабатывания датчика, и отъезд обратно на 1 мм. Без обнуления координат. И без отключения/включения лимитов.
Лимиты не использую пока, нет нужды.
В будущем хочу сделать, как в NCStudio - корректировку координат по лимитам, если, вдруг, оси были сдвинуты.

В общем - пока я в восторге от качества работы контроллера, и, как оказалось, не так уж много времени нужно на изучение основ языка Си.

0

111

Все еще бьюсь об стену - не могу написать процедуру поиска Z=0 с помощью касания датчика
Проблема в том, что я не понимаю, как изменить текущее значение рабочих координат.
Вот у меня пластина толщиной 1,5 мм... Я опустился, коснулся, остановился... Как мне теперь внести это значение в поле координаты Z?

Может быть у разработчика можно спросить, но я не знаю, где и как.

0

112

Попробуйте так, только русские комментарии уберите:

Код:
#include "KMotionDef.h"


main()
{
    
        Jog(2,-10000);          // ехать вниз на скорости 10000 имп/сек
        while (!ReadBit(20)) ; // пока не не изменится состояние пин 20
        Jog(2,0);          // остановиться
        DisableAxis(2);	// отключить ось Z
        EnableAxisDest(2,400); /включить ось Z с начальным значением 400 имп
        Move(2,40000); //поднять ось на высоту 40000 имп
        
        
    	
        
    
        
	
}

Мне тоже предстоит настраивать датчик, интересно, будет ли работать.

Отредактировано ukr-sasha (06-03-2013 09:43:57)

0

113

Я так и сделал, но у меня эта команда EnableAxisDest - изменяет позицию в машинных координатах, а не в рабочих.

0

114

Действительн...Нужно подумать.

0

115

Я даже думал - изменить количество шагов на миллиметр (например - уменьшить в два раза), обнулить и поднять на двойную высоту, а потом установить опять родное количество шагов на миллиметр. Получится "обмануть" систему.
Но, оказалось, что я вообще не могу сбросить рабочие координаты даже командой Zero - все равно сбрасываются машинные.

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

0

116

michael-yurov , вот кусок моего кода (после  Jog(2,0); ) который отвечает за калибратор , может пригодиться

Код:
    DisableAxis(2);         // disable the axis
    Zero(2);        // Zero the position
    EnableAxisDest(2,0);           // re-enable the ServoTick
    Move(2,39168); 	                //  move on position
    while (!CheckDone(2)) ;    // loop until motion completes 
    Delay_sec(0.25);
    
    DisableAxis(2);
    Zero(2);
    EnableAxisDest(2,(38400) ); // Set real position Z-axis
    while (!CheckDone(2)) ;

В принципе код работает уже давно , правда сбивает машинние координаты по Z , если и их нужно оставить , то есть другой вариант по сложнее , думаю этого пока хватит )

0

117

Попробую. Правда пока не пойму, в чем хитрость.

0

118

Получилось!!!!!
Использовал часть кода, которым ранее со мной поделился Abarmot.
Теперь рабочие координаты соответствуют установленным.

Код:
#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,-100);          // ехать вниз на скорости 10000 имп/сек
        while (!ReadBit(20)) ; // пока не не изменится состояние пин 20
        Jog(2,0);          // остановиться
        Zero(2);
        DisableAxis(2);	// отключить ось Z
        ch2->Position=40;
        EnableAxisDest(2,40); //включить ось Z с начальным значением 40 имп
        //Move(2,40); //поднять ось на высоту 40000 имп
       
        MDI("G92.1");  // clear offsets
        
 }
 
 // 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;
}

+1

119

О!, спасибо, круто!
С командой MDI решается много проблем.  :cool:

Большущее спасибо. Дальше, думаю, разберусь.

0

120

По строчке врятли, имеется буфер обмена, и в настройках есть параметр Look Ahead(отработка кадров вперед)
Эта настройка позволяет масн просчитать траекторию на несколько строк вперёд, а например PLCM  контроллерах есть свой буфер в который загружается часть уп

0

121

stasblak написал(а):

По строчке врятли, имеется буфер обмена, и в настройках есть параметр Look Ahead(отработка кадров вперед)
Эта настройка позволяет масн просчитать траекторию на несколько строк вперёд, а например PLCM  контроллерах есть свой буфер в который загружается часть уп

stasblak, не понял о чем речь (может быть сообщение случайно в эту тему попало).
Но все же: LookAhead - это не буфер, это лишь параметр, определяющий, на сколько строк вперед будет заглядывать планировщик траектории, рассчитывая допустимую скорость движения в текущей точке.
А с запасом Mach рассчитывает по просьбе плагина PLCM (сколько плагин попросит (по времени) - столько Mach3  ему и рассчитает, настройки размеров буферов задаются в параметрах плагина).
А в буфер PLCM загружается не УП, а уже рассчитанная траектория, разбитая на интервалы по 2 миллисекунды (т.к. время интервала постоянно, то в данных косвенно записана и скорость движения).

А если речь о работе с строкой MDI в KMotionCNC - то вопрос уже решен (см. следующее сообщение).

Отредактировано michael-yurov (26-03-2013 19:40:43)

0

122

Разобрался, как из пользовательского скрипта выполнить какую-нибудь из основных команд (пуск / стоп / пауза / изменить подачу / изменить значение в окошках рабочих координат / или выполнить функцию пользовательской кнопки).
Так же можно выполнить любую команду G-кода, как в строке MDI

Например, написал сейчас скрипт, который вызывает паузу, выключает шпиндель, и поднимает фрезу на 20 мм

Подробнее вот здесь: http://dynomotion.com/Help/KMotionCNC/K … rKFLOP.htm

Работает это примерно так - требуемое действие сохраняется в переменную Persist Var.
Эта переменная предается в KMotionCNC
KMotionCNC видит, что в этой переменной что-то есть, и в зависимости от содержимого выполняет требуемые действия,
Затем KMotionCNC обнулят эту переменную, чтобы дать понять контроллеру, что все сделано
Если не ошибаюсь - все это происходит примерно 10 раз в секунду.

В общем - все, что нужно уже написано в файле "KFLOPtoPCCmdExamples.c"

В начале файла осуществляются различные действия для примера, а во второй половине файла определены функции для удобства вызова команд.

Тестовые действия я закрыл, как ремарки "//"
И еще отключил вывод ответов в консоль

Вот, что получилось (этот скрипт ничего не делает, но в нем определены все необходимые функции):

Код:
#include "KMotionDef.h"

int DoPC(int cmd);
int DoPCFloat(int cmd, float f);
int DoPCInt(int cmd, int i);
int MsgBox(char *s, int Flags);
int SetVars(int poff, int varoff, int n);
int GetVars(int varoff, int n, int poff);


main()
{
   int Answer;
   double *pD = (double *)persist.UserData;

//   DoPC(PC_COMM_ESTOP);
//   DoPC(PC_COMM_HALT);
//   DoPC(PC_COMM_EXECUTE);
//   DoPC(PC_COMM_SINGLE_STEP);
//   DoPCFloat(PC_COMM_SET_FRO,0.25f);
//   DoPCFloat(PC_COMM_SET_FRO_INC,1.1f);
//   DoPCFloat(PC_COMM_SET_X,0.0);
//   DoPCFloat(PC_COMM_SET_Y,0.0);
//   DoPCFloat(PC_COMM_SET_Z,2.25);
//   DoPCInt(PC_COMM_USER_BUTTON,3);
//   DoPCInt(PC_COMM_MCODE,3);

//   Answer = MsgBox("Hello World",MB_YESNO|MB_ICONEXCLAMATION);
//   if (Answer == IDYES)
//      printf("Answer is Yes\n");
//   else
//      printf("Answer is No\n");
   

//   MDI("G0 X1.2 Y2.2 Z3.3");
//   MDI("M5");
//   MoveRel(2,28800);         // Move to Z=20 mm (1440 steps/mm)


   // put 3 double values in the persist vars 
   
//   pD[10] = 123.456;
//   pD[11] = 1000.0;
//   pD[12] = 999.9;
   
   // transfer up to the GCode Vars
//   SetVars(100,3,10);  // Upload 3 to GCode 100 from persist 10   
   
//   MDI("#100 = [#100 + 1]");
      
   // read them back into different persist Vars
//   GetVars(100,3,13);  // Download 3 from GCode 100 to persist 13 

//   printf("%f %f %f\n",pD[13],pD[14],pD[15]);
}

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;
}

Если в этом файл добавить команды (перечислил возможные варианты ниже), они будут выполняться на стороне KMotionCNC.

DoPC(PC_COMM_ESTOP); // E-Стоп (не проверял)
DoPC(PC_COMM_HALT); // Пауза
DoPC(PC_COMM_EXECUTE); // Запуск выполнения УП (не проверял)
DoPC(PC_COMM_SINGLE_STEP); // выполнить одну строку УП (не проверял)
DoPCFloat(PC_COMM_SET_FRO,0.25f); // задает скорость подачи (не проверял)
DoPCFloat(PC_COMM_SET_FRO_INC,1.1f); // вероятно - увеличивает скорость подачи (не проверял)
DoPCFloat(PC_COMM_SET_X,0.0);
DoPCFloat(PC_COMM_SET_Y,0.0);
DoPCFloat(PC_COMM_SET_Z,2.25); // установить значение в окошке координаты Z равным 2,25 мм
DoPCInt(PC_COMM_USER_BUTTON,3); // вызов пользовательской кнопки (не проверял)
DoPCInt(PC_COMM_MCODE,3); // вероятно - выполняет M-код (не проверял)

Answer = MsgBox("Hello World",MB_YESNO|MB_ICONEXCLAMATION); // выводит диалоговое окно (не проверял)
if (Answer == IDYES)
printf("Answer is Yes\n");
else
printf("Answer is No\n");

MDI("G0 X1.2 Y2.2 Z3.3"); // Выполнить в окне MDI команду G0 X1.2 Y2.2 Z3.3

MDI("M5"); // остановить шпиндель (запустится программа, привязанная к этой функции)

MoveRel(2,5000); // поднять ось Z на 5000 импульсов
--------------------------------------------------------------------------------------------------------------------------------------------------------------
Но есть сложности.
Во первых - нужно быть внимательным и следить за тем в какой ветке выполняется подпрограмма, чтобы не возникло проблем при вызове новой программы в ветке выполняющейся.
Во вторых - если повесить подпрограмму на пользовательскую кнопку - Kmotion CNC может зависнуть, если для запуска выбрать параметр "выполнить и ждать завершения"
В третьих - между действиями, связанными с движением станка и действиями связанными с обращением к интерфейсу иногда стоит добавить паузу, иначе скрипт не дождется плавного снижения скорости.
В четвертых - если в скрипте использовать команду MDI("M5"), то после нажатия "продолжить" программа не предложит запустить шпиндель, т.к. помнит, что до этого была команда M5. Я заменил ее на выключение пина, управляющего шпинделем.

0

123

Все привет.
Не стал сюда постить, дабы не засорят ветку

Друзья помогите пожалуйста :confused:

Проблемы с Kflop

0

124

Здравствуйте. Приобрел недавно для 5-ти осевика контроллер KFlop. Никак не могу разобраться с файлом конфигурации осей, на 3 оси нормально работает, на 4 тоже без проблем, а вот пятую ось никак не получается активировать, при компиляции выскакивает ошибка. Подскажите пожалуйста в чем проблема.
Вот код

код
Код:
#include "KMotionDef.h"

// Defines axis 0, 1, 2, 3, 4 as simple step dir outputs
// enables them
// sets them as an xyzab coordinate system for GCode

int main() 
{
	ch0->InputMode=NO_INPUT_MODE;
	ch0->OutputMode=STEP_DIR_MODE;
	ch0->Vel=32000;
	ch0->Accel=400000;
	ch0->Jerk=400000;
	ch0->P=1;
	ch0->I=0.01;
	ch0->D=0;
	ch0->FFAccel=0;
	ch0->FFVel=0;
	ch0->MaxI=200;
	ch0->MaxErr=1e+006;
	ch0->MaxOutput=200;
	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=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=0.000769;
	ch0->iir[2].B1=0.001538;
	ch0->iir[2].B2=0.000769;
	ch0->iir[2].A1=1.92081;
	ch0->iir[2].A2=-0.923885;
    EnableAxisDest(0,0);

	ch1->InputMode=NO_INPUT_MODE;
	ch1->OutputMode=STEP_DIR_MODE;
	ch1->Vel=40000;
	ch1->Accel=400000;
	ch1->Jerk=4e+006;
	ch1->P=1;
	ch1->I=0.01;
	ch1->D=0;
	ch1->FFAccel=0;
	ch1->FFVel=0;
	ch1->MaxI=200;
	ch1->MaxErr=1e+006;
	ch1->MaxOutput=200;
	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=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=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=0.000769;
	ch1->iir[2].B1=0.001538;
	ch1->iir[2].B2=0.000769;
	ch1->iir[2].A1=1.92081;
	ch1->iir[2].A2=-0.923885;
    EnableAxisDest(1,0);
    
    ch2->InputMode=NO_INPUT_MODE;
	ch2->OutputMode=STEP_DIR_MODE;
	ch2->Vel=40000;
	ch2->Accel=400000;
	ch2->Jerk=4e+006;
	ch2->P=1;
	ch2->I=0.01;
	ch2->D=0;
	ch2->FFAccel=0;
	ch2->FFVel=0;
	ch2->MaxI=200;
	ch2->MaxErr=1e+006;
	ch2->MaxOutput=200;
	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=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=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=0.000769;
	ch2->iir[2].B1=0.001538;
	ch2->iir[2].B2=0.000769;
	ch2->iir[2].A1=1.92081;
	ch2->iir[2].A2=-0.923885;
	EnableAxisDest(2,0);
    
    

	ch3->InputMode=NO_INPUT_MODE;
	ch3->OutputMode=STEP_DIR_MODE;
	ch3->Vel=40000;
	ch3->Accel=400000;
	ch3->Jerk=4e+006;
	ch3->P=1;
	ch3->I=0.01;
	ch3->D=0;
	ch3->FFAccel=0;
	ch3->FFVel=0;
	ch3->MaxI=200;
	ch3->MaxErr=1e+006;
	ch3->MaxOutput=200;
	ch3->DeadBandGain=1;
	ch3->DeadBandRange=0;
	ch3->InputChan0=3;
	ch3->InputChan1=0;
	ch3->OutputChan0=3;
	ch3->OutputChan1=0;
	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=20;

	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=0.000769;
	ch3->iir[2].B1=0.001538;
	ch3->iir[2].B2=0.000769;
	ch3->iir[2].A1=1.92081;
	ch3->iir[2].A2=-0.923885;
	EnableAxisDest(3,0);
	
	ch4->InputMode=NO_INPUT_MODE;
	ch4->OutputMode=STEP_DIR_MODE;
	ch4->Vel=40000;
	ch4->Accel=400000;
	ch4->Jerk=4e+006;
	ch4->P=1;
	ch4->I=0.01;
	ch4->D=0;
	ch4->FFAccel=0;
	ch4->FFVel=0;
	ch4->MaxI=200;
	ch4->MaxErr=1e+006;
	ch4->MaxOutput=200;
	ch4->DeadBandGain=1;
	ch4->DeadBandRange=0;
	ch4->InputChan0=4;
	ch4->InputChan1=0;
	ch4->OutputChan0=4;
	ch4->OutputChan1=0;
	ch4->MasterAxis=-1;
	ch4->LimitSwitchOptions=0x100;
	ch4->LimitSwitchNegBit=0;
	ch4->LimitSwitchPosBit=0;
	ch4->SoftLimitPos=1e+009;
	ch4->SoftLimitNeg=-1e+009;
	ch4->InputGain0=1;
	ch4->InputGain1=1;
	ch4->InputOffset0=0;
	ch4->InputOffset1=0;
	ch4->OutputGain=1;
	ch4->OutputOffset=0;
	ch4->SlaveGain=1;
	ch4->BacklashMode=BACKLASH_OFF;
	ch4->BacklashAmount=0;
	ch4->BacklashRate=0;
	ch4->invDistPerCycle=1;
	ch4->Lead=0;
	ch4->MaxFollowingError=1000000000;
	ch4->StepperAmplitude=20;

	ch4->iir[0].B0=1;
	ch4->iir[0].B1=0;
	ch4->iir[0].B2=0;
	ch4->iir[0].A1=0;
	ch4->iir[0].A2=0;

	ch4->iir[1].B0=1;
	ch4->iir[1].B1=0;
	ch4->iir[1].B2=0;
	ch4->iir[1].A1=0;
	ch4->iir[1].A2=0;

	ch4->iir[2].B0=0.000769;
	ch4->iir[2].B1=0.001538;
	ch4->iir[2].B2=0.000769;
	ch4->iir[2].A1=1.92081;
	ch4->iir[2].A2=-0.923885;
	EnableAxisDest(4,0);

	DefineCoordSystem(0,1,2,3,4);

    return 0;
}

0

125

Vektor_Z написал(а):

Здравствуйте. Приобрел недавно для 5-ти осевика контроллер KFlop. Никак не могу разобраться с файлом конфигурации осей, на 3 оси нормально работает, на 4 тоже без проблем, а вот пятую ось никак не получается активировать, при компиляции выскакивает ошибка. Подскажите пожалуйста в чем проблема.
Вот код

Отвечаю на свой вопрос. Для того чтоб активировать 5 осей нужно строку конфигурирования осей написать подобным образом  DefineCoordSystem6(0,1,2,3,4,-1);

И еще один вопрос. В KFlop я нашел только 4 входа под датчики HOME, можно как то подключить 5 датчиков HOME для пяти осей?

0

Быстрый ответ

Напишите ваше сообщение и нажмите «Отправить»



Вы здесь » Форум клана ЧПУшников » Программы для ЧПУ-фрезеров. » dynomotion управление 8 осей