ЧПУ в хоббийной мастерской (часть 3)
Изначально, планировал ограничиться двумя постами (раз, два) про мои ЧПУшные эксперименты. Но, тема оказалась многим интересной, поэтому немного ее еще пораскрываю. В этом посте пойдет речь про написание самодельного софта для управления любительским ЧПУ.
Предисловие
Не знаю, удалось ли кого-то мотивировать первыми постами, но некоторые комментарии мне самому дали хорошую пищу для размышлений. Отдельная благодарность @evilruff за фото его лаборатории и за видео с классным корейцем. После просмотра того и другого мой бардачёк в подвале перестал казаться таким уж уютным. Собравшись с силами, на выходных навел что-то отдаленно напоминающее порядок и сделал, наконец, 2 вещи которые собирался сделать еще пол-года назад.
Во-первых, заменил кусок фанеры который выполнял роль жертвенного стола. Этой фанерой я пользовался с момента покупки станка, прикручивая саморезами к ней заготовки и сооружая всякие безумные конструкции из палок и клиньев. Все для того, чтобы деталь не отправилась в непредсказуемый полет при фрезеровке.
Может кому пригодится лайфхак: новый стол сделал из пластиковой террасной доски (продается в Кастораме):
Доски болтами прикрутил прямо к алюминиевому родному столу. Бонусом получились удобные пазы для фиксаторов заготовки и быстрого монтажа присадочного стола. На все про все ушло пара часов и ~1100р.
И во-вторых, наконец, написал более-менее юзабильный софт для управления нестандартными функциями ЧПУ. Про это и будет основной рассказ.
Постановка задачи
G-code для операций, которые описаны во второй части простейший. Тем не менее, сам процесс наладки нельзя назвать быстрым.
Как это происходило
Например, для присадки нужно было: зная ширину панели посчитать сколько должно быть отверстий, рассчитать точное расстояние между ними, создать файл, написать g-code, загрузить его в Mach3. Все это занимает, в лучшем случае, минут 15 — 20. В этом свете, преимущества цифрового станка значительно меркнут по сравнению с ручным инструментом, которым за это же время можно навертеть целую кучу дырок.
Что хотелось получить
В случае той-же присадки, хотелось получить программу, где в очень простом интерфейсе я бы вводил ширину и толщину панели и нажав кнопку запускал процесс сверления нужного количества присадочных отверстий на одинаковом расстоянии друг от друга.
Поиск решения
Первое что пришло в голову было написание автономной программы, которая напрямую бы взаимодействовала с параллельным портом. Беглый гуглинг показал, что задача записи в lpt вполне решаемая, но черт, как известно, прячется в деталях. При дальнейшем изучении вопроса я понял, что застрять тут можно всерьез и надолго. К тому же, такое решение было бы не гибким: для другого станка, например с USB, оно не работало бы.
Оставался вариант разобраться с SDK Mach3. В процессе сбора информации про создание mach-плагинов я натолкнулся на интересное решение. В нем описывалось как используя OLE-механизмы можно дергать Mach3 из стороннего приложения. Я не эксперт в технологиях Microsoft, но после просмотра по диагонали мануала по SDK Mach3, если я правильно уловил основную идею, никакой серебренной пули не существует, плагины используют те же публичные методы COM-объектов Mach3. Перекраивать интерфейс Mach3 я не собирался, таким образом, разница для пользователя между плагином и standalon приложением получалась только в том, что плагин доступен из меню Mach3, а приложение — через иконку на рабочем столе XP.
Отдельное приложение мне показалось предпочтительней. В этом случае, теоретически, я мог сразу после загрузки компьютера запускать свою программу, которая паровозом загружала бы Mach3 (вместо того, чтобы сначала грузить Mach3 и потом копаться в его меню для запуска плагина).
Берем в руки шашку
Последний раз нативное десктопное приложение для Windows мне приходилось писать году, эдак, в 2006 и было оно на Delphi. С тех пор веб-технологии с их Линуксом окончательно поглотили. Поэтому, особых предпочтений на каком языке ваять программу у меня не было. Найденный простенький пример был написан на C#, этот язык и был выбран в качестве подопытного кролика.
Я не буду здесь выкладывать весь код получившегося приложения (при желании можете его найти на github по ссылке внизу поста). Поясню основные вещи. Все эксперименты я проделывал на виртуалке с WinXP SP3 и Mach3 Version R3.043.062. Для тех кто считает, что лучше один раз увидеть ссылка на ролик в Youtube по которому разбирался я. Ниже расшифровка основных моментов.
Подготовка
1. Чтобы Visual Studio нормально подхватила компонент Mach3 нужно чтобы он корректно был прописан в реестре. Для этого качаем файл Mach3Registry.reg
2. Запускаем Mach3Registry.reg
3. Запускаем VS, создаем проект оконного приложения на C#
4. В блоке Solution Explorer правый клик по References, в меню выбираем Add Reference. В открывшимся окне нажимаем Browse и ищем Mach3.exe
Если все правильно, в списке References должна появиться строка, кто бы мог подумать, Mach4…
5. Далее рисуем UI, вешаем обработчики, реализуем алгоритмы…
Взаимодействие с Mach3
Подключаем нужные библиотеки, объявляем переменные (Form1.cs)
...
using System.Runtime.InteropServices;
using Mach4; // Подключаем компонент Mach
namespace Cnc
{
public class Form1 : System.Windows.Forms.Form
{
private IMach4 _mach;
private IMyScriptObject _mInst;
...
// получение ссылки на запущенный экземпляр Mach3
private void GetMachInstance()
{
try
{
_mach = (IMach4) Marshal.GetActiveObject("Mach4.Document");
_mInst = (IMyScriptObject) _mach.GetScriptDispatch();
}
catch
{
_mach = null;
_mInst = null;
}
}
...
Использование:
GetMachInstance(); //
if(_mInst != null)
{
_mInst.DoOEMButton(1003); // Нажатие на кнопку Stop в Mach3
_mInst.Code("G00 X100"); // Выполнение G-code
_mInst.GetOEMDRO(800); // Получить текущее значение координаты X
}
Коды кнопок и значений параметров можно посмотреть в вики: OEM_DROs и OEM_Buttons (Wiki у них подглючивает, значения параметров в таблице не выводится, я смотрел на вкладке «View source»).
Первая версия программы работала так: по установленным параметрам генерировался g-code который покадрово (т.е. построчно) выполнялся методом _mInst.Code. И это было моей ошибкой. В отладочной среде на виртуалке все прекрасно работало. В Mach3 бежали правильные цифры в координатах. Но при переносе на станочный компьютер возникли проблемы. Каретка перемещалась правильно, но шпиндель не включался.
Похоже, что управление роутером и шпинделем в Mach работает в разных потоках. Получалась ситуация, что команды перемещений (G…) выполнялись последовательно как они поступали в метод _mInst.Code в одном потоке, а команды управления шпинделем (M3, M5), не зависимо от первых, выполнялись в другом потоке. В результате, шпиндель включался (M3) и тут же выключался (M5), при этом перемещение каретки шло своим чередом.
Я пробовал разные варианты, подключал задержки, пробовал загнать весь управляющий g-code в одну строку и отправлять одним куском в _mInst.Code. В результате, остановился на решении «в лоб»: просто загоняю сгенерированный код в файл, этот файл программно открываю в Mach3 и там же программно нажимаю кнопку «Старт». Фрагмент работающего кода:
_mInst.LoadFile("C:\\tmp\\gcode.txt");
System.Threading.Thread.Sleep(2000);
_mInst.DoOEMButton(1000);
Пауза между загрузкой файла и нажатием кнопки нужна для того, что бы Mach успел открыть файл. Возможно, есть какой-то более изящный способ. Если кто знает, напишите в комментариях.
Дополнительным бонусом такого решения получилось то, что теперь можно в интерфейсе Mach наблюдать визуализацию процесса обработки.
Что в итоге получилось
Далее, в двух словах о получившемся приложении. Отдельно расскажу о UI для каждой операции.
Раскрой
Тут все достаточно прозрачно. Параметр S нужен для компенсации размера L если заготовка закреплена не в нулевой точке по Х (или по Y при распиле вдоль).
Присадка
Для присадки возможны 2 конфигурации оснастки. Первая с болгаркой для сверления торцевых отверстий. И вторая с обычным шпинделем для сверления в плоскости щита (почему-то я назвал ее «Присадка фронтальная»).
Присадка торцевая
При торцевой присадке важно точно выставить ноль в правом нижнем углу заготовки (у меня там находится угол бокового упора и стола). Со сверлом по дереву это сделать не сложно — там есть острый наконечник которым и надо попасть в этот угол. Закрепляя заготовку на столе я просто упираю ее в сверло.
Не меняя оснастку тем же способом я делаю ответные отверстия закрепляя заготовку вертикально:
Параметр X нужен для того, чтобы соединять панели разной ширины (например, когда нижняя и верхняя панели шкафа шире боковых на толщину дверей).
Присадка фронтальная
Оснастка для фронтальной — это обычный шпиндель. Этот вид присадки используется когда нужно насверлить отверстий в горизонтальной поверхности не только по краям, но и где-то посередине. Например, если в шкафе несколько отделений и кроме боковых стенок есть внутренние. Если длина панели больше длины станка, присадку можно сделать в 2 подхода с разворотом детали на 180 градусов. В этом случае, так же пригодится параметр X.
Токарная обработка
Для меня основной сложностью при подготовке g-code с токарной траекторией было не переборщить с максимальной глубиной погружения диска. Дело в том, что на выходе из Inkscape получается одна линия и точение происходит в один проход. Из-за этого, мне приходилось делать отдельный код для цилиндрования заготовки и только после этого запускался основной проход создающий форму. И были некоторые ограничения на эту форму. В частности, нужно было следить, чтобы траектория не уходила слишком глубоко. Я старался не выходить за рамки 10 — 15 мм от уровня первоначального цилиндра.
Все перечисленные проблемы удалось решить в новой программе. Работает это так: загружаем «сырой» g-code полученный из Inkscape, задаем размер стороны бруска заготовки и указываем максимальную глубину обработки за 1 проход (чем тверже деревяшка, тем меньше эта глубина). На базе исходного g-code и параметров программка посчитает безопасную траекторию и отправит ее в ЧПУ.
Планы на будущее
Программа здорово упростила рутину, но до совершенства еще далеко. Во-первых, нужно будет оптимизировать алгоритм сверления глубоких отверстий (сверло забивается стружкой и перегревается, нужно сделать качание вперед-назад). В-вторых, появилась идея сделать библиотеку токарных форм. Т.е. несколько типовых форм (типа цилиндра, конуса, скалки и т.п.) с возможностью настройки размеров без необходимости создавать траектории в сторонних программах.
Ссылки
Mach3Registry.reg
Mach3 SDK и другие программы
Репозиторий проекта на Github (заранее прошу прощения у шарповиков за архитектурные косяки — это моя первая программа на С#)