Re: Ввод в эксплуатацию ЧПУ системы на основе контроллера Kf
Добавлено: 19 мар 2017, 01:15
Статьи, обзоры, цены на станки и комплектующие.
https://cnc-club.ru/forum/
Спасибо! Но не поможет.
С шаговиками там тоже можно, если что. Но для макрос и PLC ориентированы под контроллер и c kflop не помогут.Robston писал(а):Спасибо! Но не поможет.
Это сервы. А у меня шаговики.
В этом листинге каждая команда имеет комментарий о ее назначении.Robston писал(а):Лимиты и хоумы на Z и Y настроил. Взял данные из листинга - Пост №10. Но там по одному мотору на ось. У меня 2 на ось. Есть специалисты по Хоуму подчиненных осей????
Александр, Добрый день!ukr-sasha писал(а):В этом листинге каждая команда имеет комментарий о ее назначении.Robston писал(а):Лимиты и хоумы на Z и Y настроил. Взял данные из листинга - Пост №10. Но там по одному мотору на ось. У меня 2 на ось. Есть специалисты по Хоуму подчиненных осей????
По аналогии разве тяжело сделать?
Код: Выделить всё
// поиск НОМЕ по X0 - X1 (подчиненные)
ch0->LimitSwitchOptions=0x100; // отключение обработки концевого датчика на оси X, чтобы не блокировалась ось
ch4->LimitSwitchOptions=0x100; // отключение обработки концевого датчика на оси B, чтобы не блокировалась ось
ch0->MasterAxis = -1; // Расподчинить обе оси
ch4->MasterAxis = -1;
Jog(0,-12000); // перемещение оси X в отрицательном направлении
Jog(4,-12000); // перемещение оси B в отрицательном направлении
//ЗДЕСЬ НЕ ЗНАЮ КАК создать конструкцию, что бы останавливалась та ось к у которой сработал датчик
//а вторая продолжала ехать до сработки ее датчика
while (ReadBit(38)) ; // ожидание срабатывания датчика по X- пин 38
Jog(0,0); // остановка оси X
Zero(0); // обнуление координаты оси X
MoveAtVel(0,819, 3000); // перемещение оси X с датчика в позицию 819 имп
while (!CheckDone(0)) ; // ожидание окончания движения оси X
Zero(0); // обнуление координаты оси X
while (ReadBit(41)) ; // ожидание срабатывания датчика по B- пин 41
Jog(4,0); // остановка оси B
Zero(4); // обнуление координаты оси B
MoveAtVel(4,819, 3000); // перемещение оси B с датчика в позицию 819 имп
while (!CheckDone(4)) ; // ожидание окончания движения оси B
Zero(4); // обнуление координаты оси B
ch0->MasterAxis = 0; // Активировать обе оси
ch4->MasterAxis = 0;
ch0->LimitSwitchOptions=0x103; // включение обработки концевого датчика на оси X, блокировать ось
ch4->LimitSwitchOptions=0x103; // включение обработки концевого датчика на оси B, блокировать осьДа. Именно это.ukr-sasha писал(а):Роберт. Опишите словами что вы хотите получить?
Чтобы по двум датчиками портал выравнивался?
У меня было так, но знающие люди сказали, что так плохо, крутя долго одним мотором можно попортить механику. А надо как-бы "проще".ukr-sasha писал(а):Я реализовывал такой алгоритм:
- ось едет до первого датчика, обнуляется
- снимается подчинение второго мотора
- второй мотор вращается до сработки второго датчика
- второй мотор вращается на величину смещения, которая состоит из двух слагаемых - расстояние между датчиками и величина деформации портала
- восстанавливается подчинение мотора
При таком алгоритме не нужно точно выставлять датчики.
Код: Выделить всё
#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()
{
// поиск НОМЕ по Z
ch2->LimitSwitchOptions=0x100; // отключение обработки концевого датчика на оси Z, чтобы не блокировалась ось
Jog(2,6000); // перемещение оси Z в отрицательном направлении
while (ReadBit(40)) ; // ожидание срабатывания датчика по Z- пин 40
Zero(2); // обнуление координаты оси Z
Jog(2,0); // остановка оси Z
MoveAtVel(2,-819,6000); // перемещение оси Z с датчика в позицию 819 имп
while (!CheckDone(2)) ; // ожидание окончания движения оси Z
Jog(2,3000); // повторное перемещение оси Z в отрицательном направлении
while (ReadBit(40)) ; // ожидание срабатывания датчика по Z- пин 40
Zero(2); // обнуление координаты оси Z
Jog(2,0); // остановка оси Z
MoveAtVel(2,-819,3000); // перемещение оси Z с датчика в позицию 819 имп
while (!CheckDone(2)) ; // ожидание окончания движения оси Z
Zero(2); // обнуление координаты оси Z
ch2->LimitSwitchOptions=0x103;// включение обработки концевого датчика на оси Z,
// поиск НОМЕ по Y
ch1->LimitSwitchOptions=0x100; // отключение обработки концевого датчика на оси Y, чтобы не блокировалась ось
Jog(1,-12000); // перемещение оси Y в отрицательном направлении
while (ReadBit(39)) ; // ожидание срабатывания датчика по Y- пин 139
Zero(1); // обнуление координаты оси Y
Jog(1,0); // остановка оси Y
MoveAtVel(1,819, 12000); // перемещение оси Y с датчика в позицию 819 имп
while (!CheckDone(1)) ; // ожидание окончания движения оси Y
Jog(1,-3000); // повторное перемещение оси Y в отрицательном направлении
while (ReadBit(39)) ; // ожидание срабатывания датчика по Y- пин 139
Zero(1); // обнуление координаты оси Y
Jog(1,0); // остановка оси Y
MoveAtVel(1,819, 3000); // перемещение оси Y с датчика в позицию 819 имп
while (!CheckDone(1)) ; // ожидание окончания движения оси Y
Zero(1); // обнуление координаты оси Y
ch1->LimitSwitchOptions=0x103; // включение обработки концевого датчика на оси Y,
// поиск НОМЕ по X0 - X1 (подчиненные)
int axis_x, axis_b; // Флаг остановки оси.
axis_x = 0;
axis_b = 0;
ch0->LimitSwitchOptions=0x100; // отключение обработки концевого датчика на оси X, чтобы не блокировалась ось
ch4->LimitSwitchOptions=0x100; // отключение обработки концевого датчика на оси B, чтобы не блокировалась ось
ch0->MasterAxis = -1; // Расподчинить обе оси
ch4->MasterAxis = -1;
// ReadBit(38) или ReadBit(38) == 1 --- Концевик не замкнут
// ReadBit(38) == 0 --- Концевик замкнут, конечное положение
if (ReadBit(38)) { // если концевик не замкнут, то
Jog(0,-1000); // перемещение оси X в отрицательном направлении
}
if (ReadBit(41)) { // если концевик не замкнут, то
Jog(4,-1000); // перемещение оси B в отрицательном направлениик
}
// Проверка цикла постусловием обязательна, т.к. необходимо один раз войти в цикл, чтобы остановить двигатели.
do {
if ((ReadBit(38)==0) && (axis_x == 0)){ /// 1 или 0
Jog(0,0.0); // остановка оси X
Zero(0); // обнуление координаты оси X
axis_x = 1; // Признак концевика
}
if ((ReadBit(41)==0) && (axis_b == 0)){
Jog(4,0.0); // остановка оси B
Zero(4); // обнуление координаты оси B
axis_b = 1; // Признак концевика
}
}
while ((ReadBit(38)) || (ReadBit(41)));
// Отъедут оба по очереди на 819 тактов = 1мм
MoveAtVel(0,819, 3000); // перемещение оси X с датчика в позицию 819 имп
while (!CheckDone(0)) ; // ожидание окончания движения оси X
Zero(0); // обнуление координаты оси X
// Второй
MoveAtVel(4,819, 3000); // перемещение оси B с датчика в позицию 819 имп
while (!CheckDone(4)) ; // ожидание окончания движения оси B
Zero(4);
ch0->LimitSwitchOptions=0x103; // включение обработки концевого датчика на оси X, блокировать ось
ch4->LimitSwitchOptions=0x103; // включение обработки концевого датчика на оси B, блокировать ось
ch0->MasterAxis = 0; // Активировать обе оси
ch4->MasterAxis = 0;
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;
}Станочек у меня маленький на 4 оси. X*2 Y Z и Aukr-sasha писал(а):Вижу в вашем алгоритме потенциальную сложность. Надо будет очень точно выставлять датчики.
Поделитесь, как вы планируете это сделать.
Благодарю Вас! Учту. Так и поступлю.ukr-sasha писал(а):Эти датчики очень неточные, и значительно зависят как от температуры, так и от скорости движения оси.
Делайте обнуление координаты не при наезде, а при последующем съезде с датчика на очень маленькой скорости, порядка 1-5 мм/мин.
Учитывая, что дистанция съезда небольшая, то времени это много не займет.
Сейчас включение шпинделя идет одним битом? Простой вариант - создайте программу, примерно такую:Александр_ писал(а):Кто-нибудь знает как поставить в кмоушн задержку отработки программы чтобы шпиндель успел раскрутиться? хорошо что тестовый проход делал - мог бы лучиться неприятный конфуз.
Код: Выделить всё
main ()
{
SetBit(ХХХ);
Delay_sec(N);
}Скопируйте настройки осей, скорей всего по Z сильно зарезано ускорение и толчок - отсюда остальные оси обязаны ждать ее.Александр_ писал(а):И вторая большая проблема - тормоза при одновременных перемещениях по программе в координатах XYZ. В плоскости XY прямые и кривые отрабатывает на ура - аж станок качает. Если кто делал клише для тиснения в арткаме и знает что такое процедура "подрезка углов" - то вот такого типа траектории. капец - скорость падает раз в 10-20. то есть выходит что планировщик вроде настроен а все равно какие-то запинки при перемещениях