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

ukr-sasha
Понимающий
Сообщения: 205
Зарегистрирован: 10 окт 2014, 11:08
Репутация: 447
Страна: Украина
 

  »

Автор статьи:Украинец Александр Григорьевич

Сайт производителя: Dynomotion Motion Control Boards for CNC Manufacturing and Robotics Applications

Сначала несколько понятий и тезисов.
- Контроллер KFLOP или, как некоторые его называют Кфлоп, это полноценный внешний автономный контроллер управления серво / шаговыми двигателями. Он самостоятельно выполняет расчеты своим DSP процессором. Формирование импульсов управления двигателями у него так же происходит аппаратно, т.е. без участия компьютера. С компьютером контроллер связывается через интерфейс USB.


Из этого следует важный вывод: стабильность выходящего сигнала не зависит от вашего компьютера, т.е. это может быть современый или не очень стационарный компьютер, ноутбук, неттоп, нетбук и возможно планшет с Windows 8 (последний вариант не проверялся).

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

Вывод: все действия Кфлопа нужно прописывать в файлах конфигурации, которые должны быть в него загружены.
- Станок с Кфлопом может управляться через программу Mach3, но есть родная программа KmotionCNC, которая более стабильная. Её освоение я бы и рекомендовал.

KFLOP может выдавать управляющий сигнал по Step/Direction шаговыми и сервоприводами, по +/-10В сервоприводами, а так же ШИМ ТТЛ и напрямую силовыми ключами с коллекторными и бесколлекторными двигателями. Для 99% случаев нам интересны только первые два варианта.

Техническое задание:
Вариант №1 (Step/Dir) - подключение и настройка станка с приводами управляемыми по Step/Direction (шаговые или серво двигатели);
Вариант №2 (10В) - подключение и настройка станка с приводами управляемыми по +/-10В (серво двигатели);

Отличия в настройках и подключении несущественные, поэтому всё описание будет в одной теме.

Содержание:
1. Комплектация
2. Подключение
3. Настройка
4. Настройка сервоприводов
5. Подключение сигнала активации приводов S-On/Enable
6. Подключение концевых выключателей
7. Нахождение машинного нуля по датчику НОМE
8. Управление шпинделем
9. Обработка сигнала ошибки привода Alm

ukr-sasha
Понимающий
Сообщения: 205
Зарегистрирован: 10 окт 2014, 11:08
Репутация: 447
Страна: Украина
 

  »

1. Комплектация


Для Step/Direction варианта достаточно самого KFLOP. Но это не очень удобно и безопасно, так как на плате нет опторазвязанных входов/выходов и удобных клемм.
Лучше докупить такую терминальную плату: Konnect Optical I/O Expansion Board



Плата имеет 32 входа и 16 выходов, обычно этого количества достаточно для обычного станка. Сюда подсоединяются реле для включения приводов, шпинделя насоса, пылесоса и т.д. и т.п., заводятся датчики и концевики.
Кто умеет и хочет сэкономить можно не покупать, а самому паять платки с оптронами, реле и т.д. или покупать на иБей китайские терминалки и их приспосабливать. В общем вариантов много.

Для варианта +/-10В нужно дополнительно к Кфлопу докупить плату: Kanalog Expansion Board for KFLOP



На плате распаяны цифровые ЦАП, которые выдают сигнал управления +/-10В. Помимо этого в плату встроены оптоизолированные входы/выходы, выходы на реле, аналоговые входы и диф. входы для энкодеров или оптических линеек. Хотя в качестве датчиков ОС можно использовать и резольверы, если есть у кого.

ukr-sasha
Понимающий
Сообщения: 205
Зарегистрирован: 10 окт 2014, 11:08
Репутация: 447
Страна: Украина
 

  »

2. Подключение


Схемы подключений буду делать на примере всеми любимых сервоприводов Yaskawa SGDA. Для устройств других фирм производителей подключение будет аналогичным, разве что названия контактов будут отличаться.
Для запуска KFLOP необходимо напряжение питания +5В. Можно взять прямо от USB, но ток потребления с подключенными приводами и датчиками будет выше нагрузочной способности порта компьютера. Такой вариант только для «голого» подключения, чтобы отладить код.

Для полноценной работы рекомендуется использовать блок питания от компьютера, тем более, что на KFLOP распаян стандартный разъем MOLEX. Хотя можно использовать и другие имеющиеся блоки питания.

Минимально необходимое подключение одного привода для варианта Step/Dir выглядит так:


В данном случае привод подключен к каналу №0 платы KFLOP.
На входах привода, как правило, стоят оптроны. Поэтому для питания оптронов берем 3,3В (красный провод). Сигнал Step подсоединяем к 15-му контакту, а контакт Dir к 16-му.
В приводе нужно отключить (временно) сигнал S-On (Enable и т.д.). В шаговых приводах это сделано по-умолчанию.

Для варианта +/-10В схема немного другая:


Здесь подсоединяем к выходам канала №0 +/-10В (не путать с каналом №0 Step/Dir) и ко входам канал №0 сигналы А+/А- и В+/В- энкодера.

На этом отличия в подключении Step/Dir и +/-10В заканчиваются.

Будут небольшие отличия в настройках.

ukr-sasha
Понимающий
Сообщения: 205
Зарегистрирован: 10 окт 2014, 11:08
Репутация: 447
Страна: Украина
 

  »

3. Настройка


Настройка и использование контроллера KFLOP описана в разделе помощи на сайте производителя: On-Line Help

Первым делом нужно скачать пакет программ для KFLOP, это можно сделать на сайте производителя платы: KFLOP Software
Я сам пользуюсь альфа версиями, в которых реализовано больше функций и в них быстрее исправлются баги. Проблем со стабильностью у меня не было. Скачать можно отсюда.

Дальше будет описываться использование только родного ПО для управления станком. Для эстетов желающих управлять KFLOP'ом из под программы Mach3 есть тема в разделе помощь.
После того, как вы установите программное обеспечение и драйвер для KFLOP'а (устанавливается автоматически), можно подключать плату к компьютеру.

На этом этапе у вас приводы в комплекте с моторами должны быть уже отстроены и при включении питания становиться в режим удержания. А у сервопривода не должно быть дребезга и срыва мотора.

Нам нужны две программы: Kmotion для настройки контроллера и KmotionCNC для управления станком.
Сначала запускаем Kmotion, и в ней нажимаем на вкладку 1 (скриншот ниже)


Как уже было сказано ранее, в комплекте с программой есть шаблоны/примеры готовых файлов конфигурации для выполнения разных задач. Для первоначальных настроек контроллера, нам нужен файл конфигурации InitStepDir3Axis.c для варианта Step/Dir и файл Init3Analog.c соответственно для варианта +/-10В. Эти файлы нужно выбрать в окне C programs через стандартный диалог открытия файла в верхней части окна 2. Советую сразу пересохранить этот файл, с добавлением названия вашего станка в отдельный каталог, чтобы не портить стандартный шаблон и не путаться.

После выбора шаблона настроек осей, нужно изменить их для ваших условий.

Для варианта Step/Dir:
3 — выбор оси, которая настраивается: 0 - это ось Х, 1 - ось Y, и т.д.;

Тут следует сделать оговорку: в зависимости от номера порта, задается его режим работы.
Задавая номер порта 0-7, выход будет работать, как открытый коллектор (см. схему подключения), который можно использовать для подключения к оптовходам рассчитанным на 5 В.
Если к номеру выхода добавить 8 - он будет работать, как LVTTL 3,3 В (обычный выход на 3,3 В).
Например, введя в поле «output chanel» число «11» вы настроите выход сигнала Step/Dir с генератора номер 3 в режиме LVTTL 3,3 В.
Если же добавить 16 - генератор будет работать не в режиме Step/Dir, а в квадратурном режиме.
Режим открытый коллектор гарантированно будет работать с оптовходами рассчитанными на 5В.
Режим 3,3 В - менее подвержен влиянию помех и способен работать на более высоких частотах.


4 — прочитать из файла-шаблона настройки для выбранной оси;
5 — вид датчика обратной связи, выбрать No Input. Хотя никто нам не запрещает поставить энкодер или оптическую линейку и будет ОС с шаговиками. Но это я чуть вперед забегаю;
6 — вид исходящего сигнала для управления моторами. Нам нужен Step/Dir;
7 — оставить без изменений, т.к. датчика ОС нет;
8 — выбрать номер канала исходящих сигналов к которому подключен привод. В нашем случае это канал №0. Второе окошко - это усиление сигнала, оставляете равным 1. Если двигатель крутится не в ту сторону, которую нужно, то меняете знак и пишете -1. Оффсет не трогаете.
9 — произведенные изменения записываете/экспортируте в уже ваш файл настройки.

Для варианта +/-10В выполняются те же шаги, только следующие параметры отличаются:
5 — выбрать Encoder;
6 — выбрать DAC Servo;
7 — нужно выбрать номер канала входящих сигналов для датчика ОС, в нашем случае это канал №0. Параметр Gain отвечает за усиление входящего сигнала - оставьте 1. Если перепутаны фазы энкодера при подключении к плате, и серва при включении набирает обороты, а не становится в удержание, то поменяйте у этого параметра знак на противоположный.

После экспорта настроек в ваш файл, не забудте его сохранить, нажав кнопку в верхней части окна.

Примечание: Все произведенные в программе Kmotion настройки не применяются автоматически и должны быть сохранены и вновь инициализированы в контроллер. Запомните это — сэкономите много времени и нервов.

Далее, опять идем в окно C programs, где открыт файл настроек.

Небольшие пояснения к настройкам:

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

ch0->InputMode=ENCODER_MODE; // режим ОС по энкодеру
ch0->OutputMode=DAC_SERVO_MODE; // вывод сигнала задания в ЦАП, т.е. +/-10В
ch0->Vel=132000; // максимальная скорость двигателя в импульсах
ch0->Accel=300000; // максимальное ускорение 
ch0->Jerk=1e+006; /. максимальный толчок
ch0->P=0.01; // пропорциональная составляющая ПИД
ch0->I=0; // интегральная составляющая
ch0->D=0; // диф. составляющая
ch0->FFAccel=0; // ускорение предзадания, или добавка в сигнал
ch0->FFVel=0; // скорость предзадания
ch0->MaxI=2047; // максимальная величина обработки сигнала
ch0->MaxErr=3e+009; // максимальная ошибка рассогласования позиции 
ch0->MaxOutput=2047; // максимальный уровень сигнала
ch0->DeadBandGain=1; // усиление мертвой зоны
ch0->DeadBandRange=0; // величина мертвой зоны в импульсах
ch0->InputChan0=0; // канал №0 входящих сигналов от датчика ОС
ch0->InputChan1=1; // второй канал для датчика ОС, резольвера например
ch0->OutputChan0=0; // канал №0 для выходящих сигналов, в нашем случае +/-10В
ch0->OutputChan1=1; // канал для подчиненной оси
ch0->MasterAxis=-1; // включение/выкл. подчиненной оси
ch0->LimitSwitchOptions=0x88890003; // режим работы концевиков
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=10000000;
ch0->StepperAmplitude=250;

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=0.003522;
ch0->iir[1].B1=0.003522;
ch0->iir[1].B2=0;
ch0->iir[1].A1=0.992956;
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;
EnableAxisDest(0,ch0->Dest); // активация оси

DefineCoordSystem(0,-1,-1,-1); // конфигурирование системы координат - осей

Тут нужно поправить несколько параметров:
- нужно посчитать максимальное значение параметра ch0->Vel.
Например серводвигатель может вращаться с оборотами 3000 об/мин, а энкодер на нем 1024 имп/об, тогда:
ch0->Vel = 3000 об/мин * 1024 имп/об * 4 = 12288000 имп/мин = 204800 имп/сек
ch0->Vel = 204800
Если это шаговик с максимальными оборотами 1200 об/мин, 200 шаг/об и деление шага выставлено в 1/8, то значение параметра будет:
ch0->Vel = 1200 об/мин * 200 шаг/об * 8 = 192000 шаг/мин = 3200 шаг/сек.
- значения ch0->Accel и ch0->Jerk для начала можно поставить равными максимальной скорости двигателя, т.е. ch0->Vel. Скорее всего с таким значением двигатель будет набирать и сбрасывать скорость очень плавно. Но тут уже каждый должен подбирать значения под свои приводы и механику.
Эти три параметра действуют только для режима Jog, т.е. быстрых перемещений или по G0. И являются верхней ограничивающей планкой для перемещений по G1.
- параметр пропорциональной составляющей коэф. ПИД ch0->P для варианта Step/Dir нужно выставить равным 1, т.е. ch0->P=1, а для варианта +/-10В - для начала ch0->P=0,01. Причем если серво-двигатель будет дрожать при включении, его нужно уменьшать. После покажу, как более точно подобрать коэффициент ПИД.

Теперь можно запускать программу KmotionCNC.
В главном окне нужно нажать на кнопку Tool Setup, чтобы ее настроить.


Выбираем вкладку User Buttons, и в качестве события на нажатие пользовательской кнопки INIT пишем выполнение ранее отредактированного файла настройки осей InitStepDir3Axis.c для варианта Step/Dir и файл Init3Analog.c соответственно для варианта +/-10В. Параметры Thread=1 и VAR=0.


Далее на вкладке Trajectory Planner прописываем параметры движения осей станка:
- количество импульсов на дюйм Cnts/Inch. Пусть мотор соединен напрямую через муфту к винту с шагом 5 мм. Тогда значение параметра для выбранной оси будет равняться 25,4 мм/дюйм * 1024 имп/об * 4 / 5мм = 20807,68 имп/дюйм. Это для серводвигателя.
Или для шаговика: 25,4 мм/дюйм * 200 шаг/об * 8 / 5мм = 8128 имп/дюйм.
- максимальная скорость перемещения оси в режиме G1 это параметр Vel in/sec. Например, мы хотим, чтобы максимальная рабочая подача была в 2 раза ниже, чем скорость холостых перемещений, тогда этот параметр будет равняться: 204800 имп/сек / (20807,68 имп/дюйм *2) = 4,92 дюйм/сек.
Или для шаговика: 3200 шаг/сек / (8128 имп/дюйм *2) = 0,19 дюйм/сек.
- ускорение оси Accel in/sec2 поставьте для начала равным скорости, если будет мало - всегда сможете увеличить.
- скорость холостых перемещений по G0, то же самое, что и в файле инициализации осей, только тут в дймах в секунду. Для нашего случая: 204800 имп/сек / 20807,68 имп/дюйм = 9,84 дюйм/сек. Можно поставить меньше, если механика не выдерживает.


После всех этих манипуляций и настроек, можно подвигать осями.
В главном окне нажимаете кнопку INIT, файл конфигурации при этом загрузится в контроллер. И теперь, если всё сделано правильно и мы нигде не ошиблись, при нажатии стрелок в программе, оси должны двигаться.

ukr-sasha
Понимающий
Сообщения: 205
Зарегистрирован: 10 окт 2014, 11:08
Репутация: 447
Страна: Украина
 

  »

4. Настройка сервоприводов


Пока владельцы станков с приводами в варианте Step/Dir находятся в состоянии эйфории и уже во всю пилят деревяшки и пластик, менее многочисленная группа пользователей приводов варианта +/-10В нервно кусают ногти в ожидании...

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

К этому моменту, сами приводы должны уже быть настроены под ваши моторы и все предыдущие подключения и настройки KFLOP вы уже сделали. Моторы двигаются с команд программы KmotionCNC.
Должен упомянуть, что все настройки этого сообщения будут действительны для тех условий эксплуатации приводов в которых они настраивались, т.е. если вы их настраиваете на столе, то при монтаже на станок, всё нужно будет проделать сначала.

На этом этапе мы должны определить оптимальные значения ускорения, толчка, коэффициент ПИД, для того, чтобы передвижение оси было максимально близко к заданному значению позиции. Максимально близко - это с ошибкой, которая гарантированно не будет превышать требуемого значения. Честно сказать, для меня самого, этот этап, как магия, на уровне интуиции. Предупреждаю, образования по дисциплине АСУ у меня нет, и все, что я буду здесь писать, это обрывки знаний из интернета, прошедшие через кривую призму моего сознания. Так, что за последствия я не отвечаю и т.д. и т.п.

Для настройки приводов с обратной связью, а это могут быть и шаговики, в программе Kmotion есть специальный инструмент, который вызывается при нажатии кнопки Step Response.


Еще раз повторюсь: все значения настроек, которые здесь будут найдены/выставлены сами в файл конфигурации не попадают. Их нужно будет запомнить/выписать и вручную вставить в файл инициализации осей, и сохранить!
Откроется окно:


Нужно сделать следующее:
1. выбрать ось, которую требуется настроить;
2. output = 2047 - максимальный выходящий сигнал весь диапозон 10В;
3. integrator=2047 - максимальное значение интегральной составляющей тоже весь диапозон;
4. error= 10^9 или еще больше - это предел ошибки рассогласования позиции. На начальном этапе делать побольше, чтобы ось не отключалась. Когда всё будет настроено, то можно будет выставить какое то разумное значение, скажем 1мм только в импульсах, и тогда если вдруг по какой то причине, авария например, рассогласование будет больше, то ось выключится. Полезная вещь.
5. V оно же ch0->Vel с файла настроек. С примера предыдущих сообщений = 204 800;
6. ускорение A=ch0->Accel=2 048 000;
7. толчок J=ch0->Jerk=20 480 000;
Ускорение и толчок возможно придется корректировать. Это начальные значения.
8. ширина мертвой зоны ch0->DeadBandRange = 0. Если мотор в режиме удержания не удается стабилизировать в силу конструкции оси, то можно это параметр задать в 2-10 импульсов. Но увлекаться не стоит, так как этот параметр задает ГАРАНТИРОВАННУЮ ошибку позиционирования на величину мертвой зоны.;
9. усиление сигнала в пределах мертвой зоны ch0->DeadBandGain. Можно задавать от 0 до 1. Значение 0, это значит, что в пределах мертвой зоны корректировка сигнала не производится;
Далее страшные коеф. ПИД.
10. пропорциональная составляющая корректировки сигнала ch0->P=0,01 для начала уже выставляли;
11. интегральная составляющая корректировки сигнала ch0->I=0;
12. дифференциальная составляющая корректировки сигнала ch0->D=0;
На этом этапе обязательно прочитайте две страницы информации, что же такое ПИД и как его быстро и просто настроить.
 Прикреплённые файлы
 144.55 КБ  1492 скачивания
PID


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

13. время движения оси во время теста, для начала 3 сек;
14. количество импульсов, т.е. растояние, на которое должен провернуться двигатель. Пусть будет 1 оборот, т.е. 4096 импульсов;
15. запуск теста.

После вращения двигателя в одну сторону и обратно, строится график, который показывает заданную позицию, которую должен пройти двигатель - Command, синий график. И реальную, измеренную по энкодеру - Position, красный. На зеленый можно не обращать внимания - это корректировка исходящего сигнала +/-10В.


Нужно постараться совместить эти графики. Они, в данном случае, показывают, что реальное положение оси запаздывает от заданной.
Далее, нажимаете 17, чтобы сбросить ошибку позиционирования, изменяете коэффициент ПИД, как описано в приложенной статье, и снова запускаете тест. И так по кругу, пока результат не удовлетворит вашим требованиям к точности.
Если двигатель вошел в незатухающий колебательный процесс, то нужно отключить ось, нажав 16. А затем опять ее включить, нажав 18. Тут есть один неприятный момент, пока не отрисуется график, программа не реагирует на нажатие кнопок. Поэтому, если амплитуда колебаний становится опасной для станка, то выключайте ось физически!

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


По горизонтали координата времени теста, а по вертикали - ошибка в импульсах. В данном случае при движении вперед максимальная ошибка 50 импульсов, а при движении назад 70 импульсов.
Если никак не удается уменьшить ошибку позиционирования до приемлемых значений, и ось постоянно перелетает позицию, то скорее всего двигателю не хватает момента, чтобы её двигать с заданным ускорением и толчком! Значит нужно уменьшать их значения.

Если найденные значения «ускорения» и «толчка», не удовлетворяют требованиям, то можно попробовать их увеличить, а запаздывание оси компенсировать предварительной добавкой в сигнал - настроить коэффициент Feed Forvard 19. Это те же скорость и ускорение, только они добавляются в сигнал ДО появления ошибки позиционирования.

После многочасовых манипуляций, у вас должно получиться наподобие такого:


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

Всё, теперь можно быть уверенными, что оси вашего станка ГАРАНТИРОВАННО двигаются согласно программе.

Добавлю еще не совсем очевидную информацию:
- настройки моторов в файле инициализации (скорость, ускорение и толчок) действуют глобально, но при быстрых перемещениях Jog по G0 или стрелками добавляется ограничение скорости, обозначенное на картинке;
- далее при движении по программе по G1, G2, G3 действуют свои ограничения скорости и ускорения (на той же картинке Axis Parameters),которые накладываются на глобальные, и уже здесь толчок (Jerk) не учитывается.


ukr-sasha
Понимающий
Сообщения: 205
Зарегистрирован: 10 окт 2014, 11:08
Репутация: 447
Страна: Украина
 

  »

5. Подключение сигнала активации приводов S-On/Enable


Поздравляю, если вы добрались до подключения датчиков, кнопок, концевиков, то самый сложный этап пройден.

Задача: необходимо выполнить активацию приводов при инициализации осей.
Нужно подключить, как на схеме дополнительный блок питания на 24В. Для варианта Step/Dir все точно так же — нужно подключиться к любому свободному оптоизолированному выходу. В данном случае это выход OptoOUT 0 Pin 144. Эти выходы работают, как обычные тумблеры, т.е. просто замыкают контакты.
Вот здесь можно посмотреть: Digital I/O Screen и Kanalog - Connector Pinouts


Далее, в файл инициализации перед командой return 0, нужно добавить код:

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

SetBitDirection(144,1);
 for (;;) //loop forever
 {
 WaitNextTimeSlice();
 if (ch0->Enable && ch1->Enable && ch2->Enable) 
 SetBit(144); 
 else
 ClearBit(144);
 }

Который означает следующее:
- устанавливаем пин 144, как выход;
- постоянно, каждый сервоцикл;
- проверяем условие: если все оси активированы, то
- пин 144 включен
- иначе пин 144 выключен.
Таким образом если хоть одна ось отключится програмно, по разным причинам (тут вспоминаем предельную ошибку позиционирования или кнопка «Стоп» в программе), то сигнал активации приводов пропадает.

ukr-sasha
Понимающий
Сообщения: 205
Зарегистрирован: 10 окт 2014, 11:08
Репутация: 447
Страна: Украина
 

  »

6. Подключение концевых выключателей


Из моего небогатого опыта сделал один вывод: настройка и эксплуатация станка без концевых датчиков — это прямой путь к убыткам, а в худшем случае к увечьям.
Поэтому, крайне рекомендую их устанавливать на станок!

Тут я опишу, как подключить концевые выключатели к KFLOP и настроить его. Но такая схема должна быть одним из барьеров безопасности: в идеале, нужно концевики включить в схему работы аварийной кнопки-грибка и завести сигналы с концевиков на приводы!

В данном аспекте, концевик — это АВАРИЙНЫЙ ВЫКЛЮЧАТЕЛЬ. Если ось уже на него наехала, то все должно отключаться и останавливаться!
Подключение концевиков и их настройка довольно проста:


Здесь показано подключение одного концевика к оптоизолированному входу №0 пин 136. Остальные соответственно подключаются к следующим входам №1, №2 и т.д. Эти входы позволяют подавать на них сигналы с напряжением от 5В до 24В. Если датчик позволяет, то лучше использовать 24В - выше помехозащищенность.

Далее, в программе Kmotion, делаем следующее:
1. Галочка активации концевиков, для направления "-" и "+" соответственно;
2. Срабатывает, если пропал сигнал на концевике, это наш случай. Ставим галочку;
3. Номер пина, куда подключен концевик - 136 в примере.
4. Алгоритм отработки нажатия концевика: полная блокировка приводов, с возможностью отвода оси в противоположную сторону и просто остановка. Выберете, который вам больше понравиться.

Экспортируйте внесенные настройки в файл инициализации и сохраните его. Вот собственно и всё.

Примечание: Внимательный читатель может спросить про софт-лимиты — они сейчас не актуальны, т.к. станок еще не знает своих машинных координат, а это тема главы про датчики НОМЕ.


ukr-sasha
Понимающий
Сообщения: 205
Зарегистрирован: 10 окт 2014, 11:08
Репутация: 447
Страна: Украина
 

  »

7. Нахождение машинного нуля по датчику НОМE


Чем мне нравится KFLOP, так это тем, что при необходимости можно значительно нарастить его функциональность. У него практически неограниченные возможности, нужно только разобраться с логикой работы и научиться программировать на языке Си. Но и те примеры, что я здесь описываю, вполне работоспособны и для 90% применений достаточны.
Итак...

В самом простом случае, если концевые выключатели были подключены только к KFLOP, и в силовую схему не включены, то их можно использовать в качестве датчиков НОМЕ.
Пусть они подключены следующим образом:
- Х+ – оптовход №0 пин 136;
- Х- – пин 137;
- Y+ - пин 138;
- Y- – пин 139;
- Z+ – пин 140;
- Z- – пин 141;

Создаём Си-файл с произвольным названием, например Home-KMotionCNC.c, и пишем в него код. Комментарии, думаю, помогут разобраться с алгоритмом:

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

#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,-20480); // перемещение оси Z в отрицательном направлении на скорости 10% от максимальной 204800 имп/сек
 while (ReadBit(141)) ; // ожидание срабатывания датчика по Z- пин 141
 Zero(2); // обнуление координаты оси Z
 Jog(2,0); // остановка оси Z
 MoveAtVel(2,819, 20480); // перемещение оси Z с датчика в позицию 819 имп (это примерно 1мм для примера выше) на скорости 20480имп/сек
 while (!CheckDone(2)) ; // ожидание окончания движения оси Z
 Jog(2,-10240); // повторное перемещение оси Z в отрицательном направлении на скорости 5% от максимальной 204800 имп/сек
 while (ReadBit(141)) ; // ожидание срабатывания датчика по Z- пин 141
 Zero(2); // обнуление координаты оси Z
 Jog(2,0); // остановка оси Z
 MoveAtVel(2,819, 20480); // перемещение оси Z с датчика в позицию 819 имп (это примерно 1мм для примера выше) на скорости 20480имп/сек
 while (!CheckDone(2)) ; // ожидание окончания движения оси Z
 ch2->LimitSwitchOptions=0x103;// включение обработки концевого датчика на оси Z,
 
 
 
 // поиск НОМЕ по Х 
 ch0->LimitSwitchOptions=0x100; // отключение обработки концевого датчика на оси Х, чтобы не блокировалась ось
 Jog(0,-20480); // перемещение оси Х в отрицательном направлении на скорости 10% от максимальной 204800 имп/сек
 while (ReadBit(137)) ; // ожидание срабатывания датчика по Z- пин 137
 Zero(0); // обнуление координаты оси Х
 Jog(0,0); // остановка оси Х
 MoveAtVel(0,819, 20480); // перемещение оси Х с датчика в позицию 819 имп (это примерно 1мм для примера выше) на скорости 20480имп/сек
 while (!CheckDone(0)) ; // ожидание окончания движения оси Х
 Jog(0,-10240); // повторное перемещение оси Х в отрицательном направлении на скорости 5% от максимальной 204800 имп/сек
 while (ReadBit(137)) ; // ожидание срабатывания датчика по Z- пин 137
 Zero(0); // обнуление координаты оси Х
 Jog(0,0); // остановка оси Х
 MoveAtVel(0,819, 20480); // перемещение оси Х с датчика в позицию 819 имп (это примерно 1мм для примера выше) на скорости 20480имп/сек
 while (!CheckDone(0)) ; // ожидание окончания движения оси Х
 ch0->LimitSwitchOptions=0x103;// включение обработки концевого датчика на оси Х,
 
 
 // поиск НОМЕ по Y 
 ch1->LimitSwitchOptions=0x100; // отключение обработки концевого датчика на оси Y, чтобы не блокировалась ось
 Jog(1,-20480); // перемещение оси Y в отрицательном направлении на скорости 10% от максимальной 204800 имп/сек
 while (ReadBit(139)) ; // ожидание срабатывания датчика по Y- пин 139
 Zero(1); // обнуление координаты оси Y
 Jog(1,0); // остановка оси Y
 MoveAtVel(1,819, 20480); // перемещение оси Y с датчика в позицию 819 имп (это примерно 1мм для примера выше) на скорости 20480имп/сек
 while (!CheckDone(1)) ; // ожидание окончания движения оси Y
 Jog(1,-10240); // повторное перемещение оси Y в отрицательном направлении на скорости 5% от максимальной 204800 имп/сек
 while (ReadBit(139)) ; // ожидание срабатывания датчика по Y- пин 139
 Zero(1); // обнуление координаты оси Y
 Jog(1,0); // остановка оси Y
 MoveAtVel(1,819, 20480); // перемещение оси Y с датчика в позицию 819 имп (это примерно 1мм для примера выше) на скорости 20480имп/сек
 while (!CheckDone(1)) ; // ожидание окончания движения оси Y
 ch1->LimitSwitchOptions=0x103;// включение обработки концевого датчика на оси Y,

 

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

Далее, нужно в программе KmotionCNC создать кнопку, например НОМЕ, как ранее была создана INIT, и на нее назначить выполнение нашего файла Home-KMotionCNC.c.

Для более точного позиционирования, можно и нужно использовать индексные метки с энкодеров, они же сигналы РСО/*РСО.
Заведены на каналы:
- Xi - 36
- Yi - 37
- Zi - 38


В это случае код немного измениться:

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

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

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

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

 // поиск НОМЕ по Z
 ch2->LimitSwitchOptions=0x100; // отключение обработки концевого датчика на оси Z, чтобы не блокировалась ось
 Jog(2,-20480); // перемещение оси Z в отрицательном направлении на скорости 10% от максимальной 204800 имп/сек
 while (ReadBit(141)) ; // ожидание срабатывания датчика по Z- пин 141 - пропадание сигнала
 Zero(2); // обнуление координаты оси Z
 Jog(2,0); // остановка оси Z
 Jog(2,10240); // перемещение оси Z в положительном направлении на скорости 5% от максимальной 204800 имп/сек
 while (!ReadBit(38)) ; // ожидание срабатывания индексной метки по Z- пин 38 - появление сигнала
 Zero(2); // обнуление координаты оси Z
 Jog(2,0); // остановка оси Z
 ch2->LimitSwitchOptions=0x103;// включение обработки концевого датчика на оси Z,
 
 
 
 // поиск НОМЕ по Х 
 ch0->LimitSwitchOptions=0x100; // отключение обработки концевого датчика на оси Х, чтобы не блокировалась ось
 Jog(0,-20480); // перемещение оси Х в отрицательном направлении на скорости 10% от максимальной 204800 имп/сек
 while (ReadBit(137)) ; // ожидание срабатывания датчика по Z- пин 137 - пропадание сигнала
 Zero(0); // обнуление координаты оси Х
 Jog(0,0); // остановка оси Х
 Jog(0,10240); // перемещение оси Х в положительном направлении на скорости 5% от максимальной 204800 имп/сек
 while (!ReadBit(36)) ; // ожидание срабатывания индексной метки по Х- пин 36 - появление сигнала
 Zero(0); // обнуление координаты оси Х
 Jog(0,0); // остановка оси Х
 ch0->LimitSwitchOptions=0x103;// включение обработки концевого датчика на оси Х,
 
 
 // поиск НОМЕ по Y 
 ch1->LimitSwitchOptions=0x100; // отключение обработки концевого датчика на оси Y, чтобы не блокировалась ось
 Jog(1,-20480); // перемещение оси Y в отрицательном направлении на скорости 10% от максимальной 204800 имп/сек
 while (ReadBit(139)) ; // ожидание срабатывания датчика по Y- пин 139
 Zero(1); // обнуление координаты оси Y
 Jog(1,0); // остановка оси Y
 Jog(1,10240); // перемещение оси Y в положительном направлении на скорости 5% от максимальной 204800 имп/сек
 while (!ReadBit(37)) ; // ожидание срабатывания индексной метки по Y- пин 37 - появление сигнала
 Zero(1); // обнуление координаты оси Y
 Jog(1,0); // остановка оси Y
 ch1->LimitSwitchOptions=0x103;// включение обработки концевого датчика на оси Y,

 

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

Если концевики включены в силовую схему, то для НОМЕ нужно дополнительно ставить 3 датчика возле отрицательных лимитов. Но в таком случае, нужно будет сделать или купить платку с оптоизолированными входами, т.к. у Каналога их всего 8 штук. Думаю, что для того, кто сможет разобраться с подключением концевиков в силовой схеме, это не будет препятствием.

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

ukr-sasha
Понимающий
Сообщения: 205
Зарегистрирован: 10 окт 2014, 11:08
Репутация: 447
Страна: Украина
 

  »

8. Управление шпинделем


Станок уже двигает осями, знает свои координаты и более-менее безопасный. Осталось переложить на него еще одну свою работу — включение шпинделя и регулировку его оборотов.

На самом деле, для широко распространенных асинхронных мотор-шпинделей под управлением частотником, всё довольно просто.
Сразу оговорюсь, в примере частотник Текорп — для вашего случая могут быть отличия, но принцип тот же.
На частотник подаем аналоговый сигнал регулировки оборотов 10В, канал DAC7, и для его включения используем оптоизолированный выход №1 пин 145, который замыкает входы частотника «Старт» и «Вперед» на землю.


В программе KmotionCNC прописываем действия на коды М3 — включение шпинделя по часовой стрелке, М5 — отключение шпинделя и S — скорость вращения шпинделя:
1. включить шпиндель замкнув выход 145;
2. выключить шпиндель разомкнув выход 145;
3. диапозон регулировки оборотов от 0 до 2047, т.е. от 0 до 10В, с шагом 2047/24 000 = 0,085. Это если макс. обороты шпинделя 24 000 об/мин.


Всё, теперь шпиндель будет управляться по G-кодам и кнопками на панели программы.

Не помешает добавить код безопасности: в случае если хоть одна ось будет отключена, то и шпиндель выключиться. Для этого в файл инициализации добавляем пару строк в код отключения приводов:

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

SetBitDirection(144,1);
 for (;;) //loop forever
 {
 WaitNextTimeSlice();
 if (ch0->Enable && ch1->Enable && ch2->Enable) 
 SetBit(144); 
 else
 ClearBit(144);
 DAC(7,0); // остановить шпиндель, установив напряжение в 0
 ClearBit(145); // отключить шпиндель, разомкнув выход 145
 }

По такому же принципу делается включение СОЖ, пылесоса и т.д. Плюс к этому, можно создавать свои М-коды от М100 до М119, с разными способами их реализации.


ukr-sasha
Понимающий
Сообщения: 205
Зарегистрирован: 10 окт 2014, 11:08
Репутация: 447
Страна: Украина
 

  »

9. Обработка сигнала ошибки привода Alm


Если привод по каким-либо причинам уходит в ошибку, то правильно будет, чтобы контроллер её фиксировал и обрабатывал (как было замечено выше).
Всё довольно просто. Выход привода Alm действует, как переключатель. Т.е. в рабочем состоянии выводы Alm и Alm-Sg между собой замкнуты, а при ошибке привода разомкнуты.
Соединяется всё по такой схеме. Для нескольких приводов выводы Alm и Alm-Sg соединяются последовательно.


Далее, в файле инициализации в бесконечном цикле for (;;) нужно добавить код:

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

if (!ReadBit(137)) // если пропадет сигнал (знак!) на пине 137
 {
 StopCoordinatedMotion(); //встать на паузу
 }

При таком способе координаты не должны сбиваться.


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