- PVSM.RU - https://www.pvsm.ru -

ЧПУ в хоббийной мастерской (часть 3)

ЧПУ в хоббийной мастерской (часть 3) - 1
Изначально, планировал ограничиться двумя постами (раз [1], два [2]) про мои ЧПУшные эксперименты. Но, тема оказалась многим интересной, поэтому, немного ее еще пораскрываю. В этом посте пойдет речь про написание самодельного софта для управления любительским ЧПУ.

Предисловие

Не знаю, удалось ли кого-то мотивировать первыми постами, но некоторые комментарии мне самому дали хорошую пищу для размышлений. Отдельная благодарность @evilruff [3] за фото его лаборатории [4] и за видео с классным корейцем [5]. После просмотра того и другого мой бардачёк в подвале перестал казаться таким уж уютным. Собравшись с силами, на выходных навел что-то отдаленно напоминающее порядок и сделал, наконец, 2 вещи которые собирался сделать еще пол-года назад.

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

Может кому пригодится лайфхак: новый стол сделал из пластиковой террасной доски (продается в Кастораме):
ЧПУ в хоббийной мастерской (часть 3) - 2
Доски болтами прикрутил прямо к алюминиевому родному столу. Бонусом получились удобные пазы для фиксаторов заготовки и быстрого монтажа присадочного стола. На все про все ушло пара часов и ~1100р.

И во-вторых, наконец, написал более-менее юзабильный софт для управления нестандартными функциями ЧПУ. Про это и будет основной рассказ.

Постановка задачи

G-code для операций, которые описаны во второй части [2] простейший. Тем не менее, сам процесс наладки нельзя назвать быстрым.

Как это происходило

Например, для присадки нужно было: зная ширину панели посчитать сколько должно быть отверстий, рассчитать точное расстояние между ними, создать файл, написать 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, VS 2003 и Mach3 Version R3.043.062. Для тех кто считает, что лучше один раз увидеть ссылка на ролик в Youtube [6] по которому разбирался я. Ниже расшифровка основных моментов.

Подготовка

1. Чтобы Visual Studio нормально подхватила компонент Mach3 нужно чтобы он корректно был прописан в реестре. Для этого качаем файл Mach3Registry.reg [7]

2. Запускаем Mach3Registry.reg

3. Запускаем VS, создаем проект оконного приложения на C#

4. В блоке Solution Explorer правый клик по References, в меню выбираем Add Reference. В открывшимся окне нажимаем Browse и ищем Mach3.exe
ЧПУ в хоббийной мастерской (часть 3) - 3
Если все правильно, в списке 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 [8] и OEM_Buttons [9] (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 для каждой операции.

Раскрой

ЧПУ в хоббийной мастерской (часть 3) - 4
Тут все достаточно прозрачно. Параметр S нужен для компенсации размера L если заготовка закреплена не в нулевой точке по Х (или по Y при распиле вдоль).

Присадка

Для присадки возможны 2 конфигурации оснастки. Первая с болгаркой для сверления торцевых отверстий. И вторая с обычным шпинделем для сверления в плоскости щита (почему-то я назвал ее «Присадка фронтальная»).

Присадка торцевая

ЧПУ в хоббийной мастерской (часть 3) - 5
При торцевой присадке важно точно выставить ноль в правом нижнем углу заготовки (у меня там находится угол бокового упора и стола). Со сверлом по дереву это сделать не сложно — там есть острый наконечник которым и надо попасть в этот угол. Закрепляя заготовку на столе я просто упираю ее в сверло.

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

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

Присадка фронтальная

ЧПУ в хоббийной мастерской (часть 3) - 6
Оснастка для фронтальной — это обычный шпиндель. Этот вид присадки используется когда нужно насверлить отверстий в горизонтальной поверхности не только по краям но и где-то посередине. Например, если в шкафе несколько отделений и кроме боковых стенок есть внутренние. Если длина панели больше длины станка, присадку можно сделать в 2 подхода с разворотом детали на 180 градусов. В этом случае, так же пригодится параметр X.

Токарная обработка

ЧПУ в хоббийной мастерской (часть 3) - 7
Для меня основной сложностью при подготовке g-code с токарной траекторией было не переборщить с максимальной глубиной погружения диска. Дело в том, что на выходе из Inkscape получается одна линия и точение происходит в один проход. Из-за этого, мне приходилось делать отдельный код для цилиндрования заготовки и только после этого запускался основной проход создающий форму. И были некоторые ограничения на эту форму. В частности, нужно было следить, чтобы траектория не уходила слишком глубоко. Я старался не выходить за рамки 10 — 15мм от уровня первоначального цилиндра.

Все перечисленные проблемы удалось решить в новой программе. Работает это так: загружаем «сырой» g-code полученный из Inkscape, задаем размер стороны бруска заготовки и указываем максимальную глубину обработки за 1 проход (чем тверже деревяшка, тем меньше эта глубина). На базе исходного g-code и параметров программка посчитает безопасную траекторию и отправит ее в ЧПУ.

Планы на будущее

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

Ссылки

Mach3Registry.reg [7]
Mach3 SDK и другие программы [10]
Репозиторий проекта на Github [11] (заранее прошу прощения у шарповиков за архитектурные косяки — это моя первая программа на С#)

Автор: kolbaskinmax

Источник [12]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/diy-ili-sdelaj-sam/308033

Ссылки в тексте:

[1] раз: https://habr.com/ru/post/437890/

[2] два: https://habr.com/ru/post/438018/

[3] @evilruff: https://habr.com/ru/users/evilruff/

[4] лаборатории: https://habr.com/ru/post/437890/#comment_19684174

[5] классным корейцем: https://habr.com/ru/post/438018/#comment_19686128

[6] ссылка на ролик в Youtube: https://www.youtube.com/watch?v=-IviSnDKsAY

[7] Mach3Registry.reg: https://goo.gl/K2OAtk

[8] OEM_DROs: http://www.machsupport.com/Mach3Wiki/index.php?title=OEM_DROs

[9] OEM_Buttons: http://www.machsupport.com/Mach3Wiki/index.php?title=OEM_Buttons

[10] Mach3 SDK и другие программы: https://www.machsupport.com/downloads-updates/main-programs/

[11] Репозиторий проекта на Github: https://github.com/Kolbaskin/CNC

[12] Источник: https://habr.com/ru/post/439022/?utm_campaign=439022