В g code: Инструкция по использованию G-code для 3D-печати: создание, редактирование, конвертация
Содержание
G-code, потерявшийся брат Assembler-а / Хабр
Про язык управления промышленными CNC-станками и всевозможными любительскими устройствами вроде 3D-принтеров написано очень много статей, но почитать о том, какова идеология этого языка и как она связана с аппаратной реализацией — почти негде. Поскольку моя работа связана непосредственно с программированием станков и автоматизацией производства, я попробую заполнить этот пробел, а также объяснить, почему выбрал такой странный заголовок.
Пару слов о себе, и почему я вообще решил написать об этом. Мои рабочие обязанности заключаются, в том числе, в том, чтобы заставить любой имеющийся в компании станок с ЧПУ делать всё, что он вообще может физически. Компания — небольшая (единицы сотен сотрудников), но в арсенале — вертикальные фрезерные автоматы Haas трех разных поколений, горизонтальные фрезерные автоматы DMG Mori нескольких типов, лазерный резак Mitsubishi, токарные автоматы Citizen Cincom и куча всего еще. И весь этот зоопарк управляется программами на G-code. Изучая разные реализации этого языка, я понял, что то, что пишут в учебниках и книгах по нему — не всегда является правдой. В то же время, мне стали понятны многие аналогии между этим языком и Assembler-ом, который я изучал когда-то в институте, и на котором практически ничего серьезного никогда не написал.
Предупреждая возможные возражения, сразу скажу, что статья не предполагается как руководство по программированию, это обзор особенностей и странностей языка, а также среды в которой он выполняется.
Для человека, привыкшего писать на языках высокого уровня, G-code, на первый взгляд, кажется ущербным. Он выглядит, как древний Basic с его goto
, отсутствием явного определения переменных и прочими архаизмами. Но стоит посмотреть на него внимательнее, и становится понятно, что эта «ущербность» и «архаизм» — результат нескольких практических факторов: это язык довольно старый, он придуман для выполнения в строгих рамках доступных ресурсов, он решает одну и довольно простую задачу. Так что это вовсе не «ущербность», а рациональный минимализм, роднящий его с Assembler-ом.
Базовый синтаксис
Если вы хоть раз видели программу на G-code, то знаете, что это последовательность строк, которые состоят из буквенных кодов, за которыми следуют некие числа. Эти буквенные коды называются «адрес». Причина такого термина очень проста: в первых контроллерах станков программа выполнялась путем записи значений в ячейки памяти, которым были даны буквенные имена. Исполнительные устройства, в свою очередь, читали значения по этим адресам и делали то, что от них требуется. Когда мне приходится обучать операторов, я объясняю им, что контроллер, на самом деле, можно условно поделить на две части: ту, что отвечает за интерфейс с пользователем, и ту, что отвечает за работу механизмов. Они часто и физически разнесены по разным платам. А общение между ними происходит все еще через ограниченный набор этих самых ячеек памяти. Другой вопрос, что со временем, к именованным адресам, которые обозначаются буквами латинского алфавита, добавились еще численные адреса (начинающиеся с символа #), через которые осуществляется доступ к портам ввода-вывода, настройкам, специальным возможностям, и так далее.
Традиционно, когда описывают синтаксис G-code, говорят, что любая команда в программе начинается с буквы G для «подготовительных» кодов и M — для дополнительных, что номер строки начинается с буквы N, а номер программы или подпрограммы — с буквы O. Это, в принципе, правда, но не вся и не всегда.
Во-первых, деление на G- и M-коды — условно. Раньше, во времена первых станков с ЧПУ, это имело практическое значение, потому что связь синтаксиса с аппаратной реализацией была жестче. Сейчас же, это деление практически потеряло свое значение. Однако, правило о том, что M-код может быть только один на строке, все же стоит выполнять, как в старые времена, потому что никогда не знаешь точно, на сколько вольно производитель контроллера станка обошелся с реализацией языка. Например, на станках DMG Mori, автоматическое измерение длины инструмента, установленного в шпинделе, выполняется кодом G324
, но если вы просто хотите активировать измерительный сенсор для того, чтобы почистить его (при этом крышка, под которой он скрыт во время обычной работы, открывается, и он выдвигается, но измерение не происходит), вам нужно выполнить код M44
. По классической логике языка, использование G-кода для измерения длины — нестандартное решение, потому что вы явно не хотите, чтобы одновременно с этим (одной строкой кода) выполнялись какие-то еще действия. Но в современных реалиях это не имеет значения. На станках Haas та же операция измерения делается вообще запуском специальной подпрограммы с параметрами (тип и номер инструмента), а не одним кодом. Плюс, практически любой контроллер позволяет определять пользовательские G- или M-коды, полностью стирая различие между ними.
Ветвление и циклы
В G-code есть условный и безусловный переход по команде GOTO
. Синтаксис адреса (аргумента) этой команды может различаться. Чаще всего, это число, соответствующее номеру строки, заданному на самой строке, как Nчисло
. Но некоторые реализации языка, например — синтаксис контроллеров Okuma, позволяют давать строкам буквенные метки. С одной стороны, это хорошо, а с другой — нетипично, что смущает некоторых программистов и операторов.
Условный переход выполняется традиционным IF [выражение] THEN команда
. Конструкция ELSE
в языке не нужна, потому что если условие — ложно, команда на этой строке не будет выполнена, а будет выполнен переход на следующую строку. Это важно понимать, потому что ошибка с тем, чтобы поместить команду, которая должна быть выполнена только если условие истинно, на следующую строку — одна из самых распространенных в «ручном» программировании. Вероятно, это случается с неопытными программистами, которые до этого привыкли к синтаксису языков высокого уровня. В некоторых реализациях не обязательно и THEN
, что добавляет краткости, но не добавляет читаемости. Сравните (даже не имея представления о смысле):
IF [#1 NE 10] THEN #2=20
и
IF [#1 NE 10] #2=20
Циклы в явном виде реализованы конструкцией WHILE [выражение] DOметка .. . ENDметка
, но, конечно, могут быть реализованы и через условный переход. Синтаксис позволяет также «выпрыгивать» изнутри цикла, используя GOTO
. Но «запрыгнуть» внутрь цикла, используя размещенную внутри него метку — нельзя. Возможно, в каких-то контроллерах это и разрешено, но в тех, на которых я это проверял, это вызывает ошибку.
Подпрограммы
История использования подпрограмм в G-code тянется еще со времен перфолент. Существует несколько способов их вызывать, и это достаточно избыточно. Каждая программа или подпрограмма на G-code имеет свой идентификатор — цифровой код. Положение (под)программы определяет, должен ли этот идентификатор начинаться с латинской O или латинской N. По этому коду их можно вызывать разными способами. Эти способы (используемые для этого коды) различаются, например, тем, где контроллер будет искать эту подпрограмму — внутри файла (на станках Haas это код M97
) программы или во всех файлах (а это уже M98
). Если подпрограмма содержится в файле программы и имеет идентификатор номера строки (N), ее следует вызывать, как «внутреннюю подпрограмму». В этом случае, совершенно не нужно беспокоиться об уникальности идентификатора. Если же подпрограмма имеет идентификатор, начинающийся с буквы O, она может содержаться и внутри файла основной программы, и в отдельном файле. В этом случае, следует заботиться о том, чтобы номер был уникален среди всех программ в памяти контроллера, потому что иначе, контроллер либо выдаст ошибку при попытке записать такую подпрограмму в его память, либо, что хуже, может выполнить первую попавшуюся подпрограмму из нескольких с одинаковыми номерами. На большинстве контроллеров это, к счастью, невозможно. В общем, любую программу можно вызвать, как подпрограмму, только из-за отсутствия кода возврата M99
, аналога return, и присутствия кода остановки M30
, аналога halt, контроллер просто остановит выполнение. Но в некоторых случаях (когда это действительно конец процесса обработки детали) это может быть совершенно нормальным решением, пусть оно и выглядит некрасиво с точки зрения классического программирования. Это различие, на самом деле, восходит к временам, когда носителем для программ были перфокарты и перфолента, которые нужно было менять вручную, если подпрограмма находилась на другой ленте или в другой пачке перфокарт.
Еще одна существенная разница между тем, как работают вызовы подпрограмм, состоит в том, что при этом происходит со стеком локальных переменных, и как при этом передаются параметры, и передаются ли они вообще. Например, вызывая подпрограмму кодом M98
, вы не можете передать подпрограмме параметры в этой же строке. Вам придется положить их в переменные заранее. А вызов через код G65
как раз предполагает передачу параметров, однако стек локальных переменных программы при этом создается новый.
Указатели, переменные, регистры
Хотя G- и M-коды контроллеров — довольно большая тема, переменные — еще более обширная и сложная история. Дело в том, что «железо» станков управляется огромным количеством переменных, напоминающих по принципу их работы регистры процессоров. Доступ к этим регистрам в каких-то случаях возможен по предопределенным буквенным именам, в каких-то — по номерам, в каких-то — по назначенным буквенно-цифровым именам. При этом, свойства, назначение и поведение этих переменных могут быть совершенно разными.
Если вы хоть раз видели программу на G-code для промышленного станка, вы, возможно, заметили, что в начале самой программы, а иногда — в начале каждого фрагмента или подпрограммы, отвечающей за один инструмент или один элемент детали, есть длинная строка кодов, которые вроде бы ничего не делают. Это так называемая safe line. Она нужна, потому что станок помнит свое состояние. Например, содержимое какого-то регистра может сохраняться даже после выключения и включения станка, потому абсолютно всегда имеет смысл в явном виде устанавливать желаемое состояние перед совершением каких-то операций. Это напоминает то, как в web-разработке используются Reset.css и Normalize.css. Иначе, это правило для программистов звучит как «никогда не предполагай, что станок находится в определенном состоянии, если ты его в это состояние не привел». Пренебрежение этим может стоить дорого, включая капитальный ремонт станка. При этом, наиболее надежной практикой считается именно приведение станка в искомое состояние, а не проверка, находится ли он в нем. Почему? Потому что приведение, как правило, делается одной безусловной командой, а проверка требует условного ветвления.
Практический пример. При использовании контроллера Haas, некоторые адреса доступны для чтения только по номеру ячейки памяти, тогда как для записи — по буквенному псевдониму и по номеру. Скажем, чтобы установить скорость вращения шпинделя, достаточно выполнить код S<целое число>
, запись IF [S EQ 200]
(проверка если скорость шпинделя равна 200) работать не будет, нужно писать IF [#цифровой номер ячейки EQ 200]
. Очевидно, что установить нужную скорость — куда проще, чем проверить ее. Более того, я с большим трудом могу себе представить ситуацию, когда проверка была бы действительно нужна, за исключением всего одного случая, с которым мне пришлось столкнуться. Некоторые станки имеют в своем наборе инструментов вентилятор, который устанавливается в шпиндель, как обычный держатель фрез. Это нужно, чтобы сдувать охлаждающую жидкость и стружку с детали после окончания ее обработки. Работа вентилятора зависит от скорости вращения — он складной, ему нужна определенная скорость, чтобы раскрыться от центробежной силы. Но станок имеет функцию изменения скорости вращения шпинделя, чтобы при отладке программы оператор мог на ходу переопределить скорость, заданную программой. Однако, если забыть отключить это изменение, вентилятор может или не раскрыться, или разлететься от слишком быстрого вращения. До того, как я начал работать в компании, этот вопрос никак не решался, считалось, что это ответственность оператора. Я же обратил на это внимание после первого происшествия и написал дополнение к программе для вентилятора, которое запускает вентилятор сразу после его установки в шпиндель, затем читает по нумерованному адресу (на счастье, документированному) значение реальной скорости вращения, делит его на устанавливаемую программой скорость и определяет, не различаются ли они больше чем на 1% (легкие вариации допускаются, хотя 1% — это порог с запасом), и если различаются — останавливает программу, включая индикатор ошибки и выдавая сообщение о том, что переопределение скорости следует отключить. Иронично, что тот же самый контроллер позволяет запретить переопределение некоторых параметров из программы (скорости движения стола, например), но не скорости вращения шпинделя. Почему? Так решил производитель. А моя задача — сделать так, как нужно производству, несмотря на то, что думает производитель, не нарушая гарантию. Для типичного производственного программиста, который не связан с автоматизацией, подобное решение выходит за рамки его деятельности.
Причина, почему я упомянул переменные и регистры вместе — то, что многие контроллеры станков имеют одно общее «пространство адресации» ячеек памяти, которые не только выполняют разную функцию, но и «живут» в совершенно разных аппаратных частях контроллера. В одно и то же пространство отображаются такие разные группы ячеек, как действующая страница стека локальных переменных, глобальные общедоступные переменные, глобальные общедоступные энергонезависимые переменные, выделенные регистры хранения координат перемещения, значения датчиков, порты управления состоянием реле внешнего оборудования, порты ввода состояния внешнего оборудования, состояние аварийной остановки, порты выделенного назначения для устройства смены оснастки, переменные калибровочных данных устройств автоматического измерения длины инструмента и положения/размера деталей, положение рабочих систем координат относительно глобальной системы координат станка, типы, геометрия и время жизни (в секундах или циклах) инструмента. Соответственно, множество разных действий могут выполняться простой записью в ту или иную переменную.
Приведение типов
Это одна из неприятных особенностей многих реализаций G-code и контроллеров. Глядя на параметр X10
, логично предположить, что это целое число. Но, в зависимости от того, как контроллер работает и как настроен, машина может интерпретировать и как X10.0
и как X0.0010
— в втором случае, это будет «десять минимальных единиц инкремента для данного контроллера». (Что, в свою очередь, может быть и десять микрон и десять десятитысячных долей дюйма.) Чудовищно, правда? Студенты и начинающие операторы постоянно делают эту ошибку. При этом, это можно настроить в контроллере. Потому, для полной переносимости и независимости от настроек, десятичная точка должна быть в цифровых значениях координат абсолютно всегда.
Хуже становится, когда речь о параметрах, передаваемых вызываемой подпрограмме. Практический пример. Автоматический измеритель длины инструмента Renishaw, установленный на станке Haas, требует для запуска измерения одного инструмента код G65 P9023 A12. T1
, где T1
— номер инструмента (1, в данном случае). Но если вы хотите измерить сразу несколько инструментов, код будет G65 P9023 A22. I1. J2. K3.
Тут уже параметры должны быть с точкой. Почему? Потому что когда вы пишете в T, этот адрес предназначен для хранения номера инструмента, потому на станке Haas он автоматически интерпретируется как целое число (мне неизвестны реализации, где это может быть дробное число, но я не могу этого исключить, например — у одного инструмента могут быть разные режущие кромки, нумеруемые, как дробная часть его номера). А вот когда параметры передаются через регистры, хранящие локальный стек переменных общего назначения, точка нужа, потому что там может храниться что угодно. При этом, у тех же станков Haas есть две настройки, которые отвечают за изменение этого поведения. Одна касается ввода параметров в контроллер, а другая — интерпретации некоторых именованных регистров использующихся для хранения координат.
Об обучении
Программированию станков с ЧПУ учат очень разными путями и с разными задачами. В одном случае, речь просто о том, чтобы научить пользоваться CAD/CAM, чтобы программист был в состоянии превратить модель (чертёж) в код, исполняемый на том или ином станке, изготавливающий деталь по модели. Это напоминает процесс обучения программированию «общего назначения» в ВУЗе, где вопросы исполнения кода, аппаратной архитектуры и написания кода на Ассемблере рассматриваются очень поверхностно. В других, заметно более редких случаях, процесс более всего напоминает обучение системному программированию, а примеры исполнения кода на конкретной архитектуре входят в него, как неотъемлемая часть. Поскольку я когда-то учился цифровой электронике, и программирование железа на низком уровне было частью этого, пусть и в довольно скромном объеме, второй вариант лично мне как-то ближе, и именно так я старался преподавать это сам, когда у меня была такая возможность.
Я вполне допускаю, что некоторые аналогии в статье могут показаться кому-то натянутыми, но я и не претендую на их точность. Речь, скорее, о сходстве «духа» упомянутых выше языков, о том, что опыт «ассемблерного мышления» может довольно сильно способствовать глубокому пониманию G-code, тогда как опыт программирования только на языках высокого уровня, отделенных от аппаратной реализации, может вызвать недоумение и даже некоторую неприязнь у того, у кого вдруг возникнет необходимость писать вручную для станков с ЧПУ.
Основы G-кода для 3D печати: список и руководство
3DPrintStory
  
Процесс 3D печати
  
Основы G-кода для 3D печати: список и руководство
G-код — это язык программирования для числового программного управления (ЧПУ). Другими словами, это язык, на котором говорит компьютер, управляющий машиной, и он передает все команды, необходимые для движения и других действий.
Хотя G-код является стандартным языком для различного настольного и промышленного оборудования, с ним можно отлично познакомиться с помощью 3D принтера. Возможно, вы до сих пор не разбирались с этим, и это нормально, поскольку 3D-слайсеры генерируют G-код «автоматически».
Тем не менее, если вы хотите глубже понять 3D-печать, важно изучить основы G-кода. Эти знания позволят вам лучше диагностировать и контролировать процессы 3D печати, а также настроить прошивку 3D принтера, такую как RepRap или Marlin.
В этой статье мы расскажем об основах G-кода, в том числе о том, как читать, понимать и писать команды, даже если вы новичок в программировании!
Что такое G-код?
Для тех, кто не знаком с программированием в целом, можете рассмотреть G-код как последовательные строки инструкций, каждая из которых сообщает 3D-принтеру о выполнении определенной задачи. Эти строки называются командами, и принтер выполняет их одну за другой, пока не дойдет до конца кода.
Хотя термин «G-код» используется для обозначения языка программирования в целом, это также один из двух типов команд, используемых в 3D-печати: «основные» и «вспомогательные» команды.
Основные командные строки отвечают за типы движения в 3D-принтере. Такие команды обозначаются буквой «G». Помимо управления движением по трем положительным осям, выполняемым печатающей головкой, они также отвечают за экструзию нити.
С другой стороны, разные команды заставляют машину выполнять не геометрические задачи. В 3D-печати такие задачи включают команды нагрева сопла и станины, а также управление вентилятором и т.п. Вспомогательные команды обозначаются буквой «M».
Синтаксис G-кода
Каждая строка с G-код командами имеет определенный синтаксис. Каждая строка соответствует только одной команде, что может привести к очень длинным кодам.
Первым аргументом любой строки является сам код команды. Как вы видели, это может быть код типа «G» или «M», за которым следует номер, идентифицирующий команду. Например, «G0» соответствует команде линейного перемещения.
Далее идут параметры, которые более точно определяют команду. Например, для команды линейного перемещения G0 можно добавить конечное положение и скорость перемещения, также обозначаемую заглавными буквами. У каждой команды есть свой набор параметров, которые мы рассмотрим ниже.
Комментарии в G-коде
Когда вы будете читать G-код команды, вы увидите точки с запятой после букв и чисел, которые объясняют, что делает код. Вот пример строки с комментарием к коду:
G1 X25 Y5; Я комментирую код!
Программистам часто необходимо включать объяснения на понятном языке, чтобы другие программисты могли понять определенные строки или участки кода. Также может случиться так, что вы забудете, почему вы написали что-то определенным образом, в результате чего вам будет трудно снова разобраться. Для решения этой проблемы используются комментарии к коду. Комментарии включают все (в той же строке) после точки с запятой и полностью игнорируются машиной при выполнении G-кода. Таким образом, они предназначены исключительно для глаз программистов.
Важные команды для 3D печати
Хотя существуют буквально сотни команд G-кода, в следующих нескольких разделах мы рассмотрим самые основные и важные из них. Как только вы освоитесь, вы сможете самостоятельно изучить и другие команды.
G0 и G1: линейное движение
Команды G0 и G1 выполняют линейные перемещения. По соглашению, G0 используется для движений без экструзии, таких как начальные и холостые перемещения, в то время как G1 охватывает все линейные движения с экструзией материала.
Однако обе команды работают одинаково. Параметры для G0 или G1 включают конечные положения для всех осей X, Y и Z, степень экструзии, выполняемую во время перемещения, и скорость, определяемую скоростью подачи в заданных единицах.
Пример
G1 X90 Y50 Z0.5 F3000 E1 сообщает 3D принтеру двигаться по прямой линии (G1) к конечным координатам X = 90 мм, Y = 50 мм, Z = 0,5 мм при скорости подачи (F) 3000 мм / мин. и выдавливании (E) 1 мм материала в экструдере.
Большинство линейных перемещений выполняются в пределах одного слоя, а это означает, что координата Z обычно не указывается в командной строке.
G90 и G91: абсолютное и относительное позиционирование
Команды G90 и G91 сообщают машине, как интерпретировать координаты, используемые для движения. G90 устанавливает «абсолютное позиционирование», которое обычно используется по умолчанию, а G91 — «относительное позиционирование».
Ни одна из команд не требует каких-либо параметров, и установка одного автоматически отменяет другой. Позиционирование работает довольно просто, так что давайте сразу перейдем к делу.
Пример
Допустим, мы хотим переместить печатающую головку на X = 30 в строке. В режиме абсолютного позиционирования это будет выглядеть так:
G90; устанавливает абсолютное позиционирование G0 X30; перемещается в координату X = 30
Этот простой ход скажет принтеру переместить печатающую головку так, чтобы она располагалась на X = 30. Теперь, для перемещения относительного позиционирования, нам нужно знать, где печатающая головка находится в данный момент. Предположим, что это X = 10:
G90; устанавливает относительное позиционирование G0 X20; перемещается на +20 мм по оси X
G91 сначала указывает 3D принтеру интерпретировать координаты относительно текущего положения (X = 10). Зная это, достаточно просто нужно переместиться на 20 мм в положительном направлении оси X, таким образом достигнув X = 30, как нам хотелось бы.
G28 и G29: автоматическое возвращение «в нуль» и калибровка стола
«Возвращение в исходное положение» — это процесс перемещения вплоть до физических ограничений для всех осей движения. Команда G28 выполнит эту задачу, перемещая печатающую головку до тех пор, пока не сработают концевики по всем осям.
Перемещение «в нуль» важно не только для ориентации устройства, но и для предотвращения выхода печатающей головки за границы. Команда G28 обычно выполняется перед каждым началом 3D печати.
Конкретная ось может быть индивидуально перемещена в исходное положение путем включения X, Y или Z в качестве параметров. В противном случае только G28 обеспечит перемещение в нуль по всем осям.
Пример
G28 X Y; только оси X и Y G28; в нуль по всем осям
Другая команда, G29, запускает последовательность автоматической калибровки стола. Существует множество различных методов выравнивания стола перед 3D печатью. Обычно эта операция обеспечивается прошивкой, а не конечными пользователями. По этой причине мы не будем вдаваться в подробности, касающиеся методов и параметров команд. Просто знайте, что G29 обычно отправляется после автоматического возврата в исходное положение (G28). В результате должна выполняться автоматическая калибровка стола, которая определяется прошивкой.
G29; выполнить последовательность автоматического выравнивания станины
M104, M109, M140 и M190: установка температуры
Это важные команды, которые, опять же, не связаны с движением.
Для запуска команда M104 устанавливает целевую температуру, которую должен достичь хот-энд, и удерживает ее до тех пор, пока не будет указано иное.
Некоторые из параметров включают фактическое значение температуры (S) и печатающую головку (T) для нагрева.
Пример
M104 S210; установить целевую температуру для хот-энда на 210 градусов
Эта командная строка указывает 3D принтеру нагреть хот-энд до 210 ° C. После установки целевой температуры принтер продолжит выполнение следующей командной строки, нагревая хотэнд.
В качестве альтернативы, если мы хотим подождать, пока эта цель не будет достигнута, прежде чем перейти к следующей строке, мы можем использовать команду M109.
M109 S210; установить целевую температуру горячего конца 210 градусов и ничего не делать, пока она не будет достигнута
Установка температуры стола очень похожа, но вместо этого утсанавливается с помощью команд M140 и M190:
M140 S110; установить целевую температуру стола на 110 градусов M190 S110; установить целевую температуру кровати на 110 градусов и ничего не делать, пока она не будет достигнута
M106 и M107: Управление вентилятором
Еще одна важная команда для 3D принтеров: команды M106 и M107 обеспечивают управление вентилятором.
M106 включает вентилятор и устанавливает его скорость. Это особенно полезно для вентилятора охлаждения детали, так как во время процесса 3D печати во время печати первого слоя и перемычки требуются разные скорости.
Параметр скорости должен иметь значение от 0 до 255. Значение 255 обеспечивает 100% мощности, и любое число в этом диапазоне будет указывать соответствующий процент в процентах.
Пример
M106; включить вентилятор на максимальной (100%) скорости M106 S128; включите вентилятор и установите его на 50% мощности
Несколько вентиляторов с регулируемой скоростью можно определить с помощью параметров индекса (P), поскольку каждому вентилятору присваивается индекс встроенным ПО.
Наконец, команда M107 отключит указанный вентилятор. Если индексный параметр не указан, обычно отключается частичный охлаждающий вентилятор.
Структура программы
Теперь у нас есть хорошая возможность взглянуть на реальный фрагмент кода, который используется для 3D печати. Как мы увидим далее, программы G-кода можно разделить на три отдельных раздела.
Стоит отметить, что если вы используете текстовый редактор для открытия файла G-кода, созданного с помощью 3D-слайсера, возможно, он не сразу запустится с G- или M-командами. Например, такой слайсер, как Cura или Simplify3D, запускает код, включая некоторые параметры процесса печати, определенные ранее в комментариях. Эти линии не влияют на печать, а вместо этого представляют собой краткий справочник по таким параметрам, как, например, высота слоя.
Этап 1: Инициализация
Первый раздел любой программы включает в себя подготовительные задачи, необходимые для начала печати 3D модели. Ниже приведены первые шесть строк команд инициализации G-кода из фактического задания на 3D-печать.
G90 M82 M140 S80 M104 S200 G28 G29
Как мы уже теперь знаем, первая строка говорит, что при движении необходимо использовать абсолютное позиционирование, а вторая строка говорит экструдеру также интерпретировать экструзию в абсолютных единицах.
Третья и четвертая линии начинают нагревать слой и сопло до заданных температур. Обратите внимание, что он не будет ждать достижения целевой температуры, а это означает, что принтер автоматически вернется в исходное положение и выровняет стол при нагревании.
Некоторые процедуры инициализации (например, тот, который используется PrusaSlicer) включают в себя процесс очистки сопла или печать одной прямой линии перед переходом к процессу 3D печати.
Этап 2: 3D печать
Вот где начинается волшебство. Если вы посмотрите на нарезанный на слои файл G-кода, вы осознаете, что на самом деле невозможно понять, что на самом деле делает сопло.
3D печать — это послойный процесс, поэтому вы обнаружите, что этот этап включает в себя множество движений в плоскости XY при печати одного слоя. Как только это будет сделано, одно крошечное движение в направлении Z определит начало следующего слоя.
Вот пример того, как команды G-кода могут выглядеть на этапе 3D печати:
G1 X103. 505 Y153.291 E4.5648; движение и выдавливание в плоскости XY G1 X103.291 Y153.505 E4.5804; движение и выдавливание в плоскости XY G1 Z0.600 F3000; сменить слой G1 X104.025 Y154.025 F9000; движение в плоскости XY G1 X95.975 Y154.025 E0.4133 F1397; движение и выдавливание в плоскости XY
Этап 3: перезагрузка 3D принтера
Наконец, когда 3D печать завершена, некоторые последние строки команд G-кода переводят принтер в состояние по умолчанию.
Например, сопло может перейти в заранее определенное положение, нагреватели хот энда и стола выключены, а двигатели отключены.
M107; выключить вентилятор G1 Z10; отодвиньте сопло от печати M104 S0; выключить обогрев горячего конца M140 S0; выключить обогрев кровати M84; выключить моторы
Ввод и вывод данных через терминал
До сих пор мы говорили только о том, что компьютер отправляет на 3D принтер команды G-кода (обычно передаются через SD-карту). Однако это не единственный способ коммуникации.
Некоторые программные продукты для управления 3D принтером, такие как Pronterface и OctoPrint, позволяет напрямую взаимодействовать с 3D-принтером, и в этом случае вы можете вводить команды вручную.
По понятным причинам было бы непрактично печатать что-либо, отправляя строки кодов по отдельности. Но иногда этот метод коммуникации требуется для других целей, например, для получения ценной информации для калибровки или когда в 3D принтере отсутствует дисплей.
Например, команда M105 «сообщить о температурах» извлечет текущие температуры сопла и слоя (которые затем могут отображаться чем-то вроде OctoPrint).
Эта связь также очень полезна для просмотра и изменения настроек EEPROM, которые жестко запрограммированы на уровне прошивки. Такие параметры, как шаги двигателя / мм, максимальная скорость подачи или ПИД-регулятор, можно визуализировать с помощью M503 («настройки отчета»), изменить вручную, а затем сохранить с помощью M500 («сохранить настройки»).
Написание G-кода
К настоящему времени вы должны быть в состоянии читать и понимать G-код намного лучше. Рекомендуем посмотреть в сторону следующих вариантов для углубления своих знаний:
- онлайн-визуализация G-кода — отличный инструмент для проверки ваших навыков, поскольку вы можете писать команды G-кода и соответственно имитировать их. На самом деле это очень весело!
- просмотр экспортированных файлов G-кода из слайсеров также должен дать вам некоторое представление о том, как G-код работает для 3D печати.
- в качестве справочника по командам можно использовать информацию с официального сайта Marlin.
Совместимость
Мы надеемся, что с пониманием команд G-кода вы станете более продвинутым пользователем 3D принтера. Хотя G-код — не самый сложный компьютерный язык, он все же требует практики и изучения.
Прежде чем завершить эту статью, возможно, стоит немного поговорить о совместимости G-кода.
Существует много типов прошивок для 3D печати, и каждый может иметь разные «разновидности» G-кода. Это может привести к серьезным проблемам совместимости, поскольку команды, работающие на одной машине, могут не работать на другой.
Слайсеры обрабатывают это, передавая код через машинно-зависимые драйверы постобработки. Постпроцессор обнаруживает разновидность входящего кода и преобразует его во что-то понятное для микропрограммы.
Надеемся, что вам понравилось это краткое руководство. Удачного кодинга и 3D печати!
CNC Datums — G10, G53 и G54
Вышеупомянутый видеоурок является частью моих руководств по G-коду, которые я записал с помощью Practical Machinist. Дополнительную информацию можно найти здесь
Перед тем, как мы начнем работу с нашей программой, мы должны сообщить машине, где находится материал и где мы хотим получить исходный материал.
размеры быть. Базовые точки можно установить с помощью элементов управления станка или установить с помощью командной строки в нашей программе с помощью
Команда G10. Как только эта позиция установлена, мы можем сместить наши точки отсчета, используя G54 на G59.G-коды. Ниже приведено объяснение
как работают эти коды.
G10 P X Y Z;
Пример:
G10 P1 X100.0 Y200.0 Z50.0;
Команда G10 используется для указания станку расстояния до положения нулевой точки заготовки от нулевой точки станка.
Слово «P» определяет рабочую точку отсчета, к которой относится это положение, и указано ниже.
Подробнее о G54, G55 и т. д. см. ниже.
Позиции X, Y и Z задают расстояние от нулевой точки станка (нулевой точки станка) до рабочей нулевой точки, определяемой словом «P». Это позволяет нам установить несколько датумов в программе. Типичным использованием для этого будет установка операции тисков в качестве одной базы и второй операции, которая использует приспособление в качестве отдельной базы. На токарном станке это можно использовать для установки точек привязки как для основного шпинделя, так и для вспомогательного шпинделя.
G53 X Y Z;
Команда G53 переключает начало нулевой точки на точку привязки станка. Это положение редко изменяется (см. G92 ниже) и часто совпадает с положением смены инструмента, но не всегда.
Типичным использованием является отправка шпинделя в исходное положение. Линия G53 X0.0
Y0.0 Z0.0; сделал бы именно это.
G54, G55, G56, G57, G58 и G59
G54, G55, G56, G57, G58 и G59 являются G-кодами смещения нулевой точки. Эта последовательность команд сообщает системе ЧПУ, какую точку отсчета мы используем. Как только машина считывает один из этих кодов, она продолжает работать с этой позиции до тех пор, пока не будет вызвана новая.
Если мы установим G10 на P1, станок будет использовать положение, установленное командой G10, в качестве нулевого положения, используемого точкой отсчета G54. (P1 = G54).
Из строки программы, в которой указано «G54», все размеры будут иметь новую точку отсчета. Это также можно установить с помощью органов управления станка вместо использования линии G10. Это позволяет нам касаться или исследовать положение рабочей базы, если база меняется каждый раз, когда деталь устанавливается. Например, если мы загружаем тиски в станок каждый раз, когда он устанавливается, точка отсчета будет находиться в другом положении, как и тиски в другом положении.
G-коды G55, G56, G57, G58 и G59 используются в качестве дополнительных исходных положений и задаются отдельно.
Если этого недостаточно, мы можем расширить это, используя G55.1, G55.2 и т. д., чтобы дать нам более чем достаточно вариантов даже для самых сложных деталей.
Это редко используется и почти никогда не требуется или не рекомендуется
G-код G92 опасен. Он используется для переопределения исходного положения машины и присвоения ему новой исходной точки в 3D-среде внутри машины.
Гораздо лучше, если это положение необходимо изменить в промышленных условиях, — это выполнить сдвиг сетки с использованием настроек параметров, и обычно это выполняется квалифицированным персоналом по техническому обслуживанию или производителями оборудования.
Некоторые станки с ЧПУ любительского уровня могут не иметь доступных смещений нулевой точки, и владельцы и операторы этих настольных станков
может потребоваться использовать G92 для перемещения их точки отсчета. Необходимо соблюдать абсолютную осторожность при изменении исходной точки машины и хорошего
понимание того, как это работает и как сбросить его обратно к исходным настройкам, имеет важное значение.
G-код G28 — команда возврата в исходное положение для G-кода
Приведенный выше видеоурок является частью курса программирования фрезерных станков с ЧПУ, доступного здесь
G-код G28 используется для возврата инструмента в нулевое положение через ориентир на быстрой скорости.
Базовый пример этой строки будет выглядеть примерно так:
G28 G91 X0 Y0 Z0;
Просто указание G28; без оси или оси, установленной на ноль, поскольку приведенная выше линия вернет все оси в исходное положение при быстром линейном перемещении.
G-код возврата в ноль G28 может использоваться для возврата одной или нескольких осей.
Блок G28 G91 Z0.0; вернет ось Z в исходное положение, в то время как G28 G91 X0.0 Y0.0 Z0.0; вернет 3 оси X, Y и Z.
Если мы добавим значение к одной или нескольким осям следующим образом:
G28 G91 X0 Y0 Z20.0;
Станок воспримет это как переход в промежуточное положение на 20 мм выше инструмента по оси Z перед переходом в исходное положение.
Мы можем использовать это, чтобы избежать препятствий внутри станка при перемещении инструмента обратно в исходное исходное положение, как показано на изображении выше.
Посмотрим на строку
G28 G91 X100.0 Y50.0 Z20.0;
В этом примере инструмент сначала переместится на X100. 0 Y50.0 и Z20.0, а затем переместится в исходное положение.
Для машин потребуется команда G91 в строке G28. G91 переключает станок на инкрементальное позиционирование
Если этот код опущен, станок сначала переместится в нулевую позицию, определенную вашей точкой отсчета.
Другими словами, он вонзит фрезу в деталь, прежде чем вернуться в контрольную точку.
Необходимо соблюдать осторожность, чтобы избежать сбоя, как всегда, при запуске нового блока кода используйте один блок со скоростью подачи и быстрой коррекцией на нуле, затем контролируйте скорость резца/инструмента с помощью управления коррекцией, чтобы убедиться, что все движется в ожидаемом направлении.
Следя за показаниями оставшегося пути, вы узнаете, сколько вам осталось пройти в течение этого блока кода.
Имея это в виду, безопаснее сначала перемещать ось Z.
В зависимости от версии вашей системы управления FANUC мы также можем программировать с помощью U, V и W.
Всего комментариев: 0