• Механическая обработка и изготовление деталей из металла
  • Комплектация производства промышленным оборудованием
  • Комплексная поставка микроэлектронных компонентов
+7(342)203-78-58
Тех.отд: +7-922-308-78-81

В g code: Описание G и M кодов для программирования ЧПУ (CNC) станков

Опубликовано: 07.09.2022 в 12:45

Автор:

Категории: Популярное

Содержание

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, тогда как опыт программирования только на языках высокого уровня, отделенных от аппаратной реализации, может вызвать недоумение и даже некоторую неприязнь у того, у кого вдруг возникнет необходимость писать вручную для станков с ЧПУ.

code | это… Что такое G-code?

G-код — условное именование языка программирования устройств с числовым программным управлением (ЧПУ). Был создан компанией Electronic Industries Alliance в начале 1960-х. Финальная доработка была одобрена в феврале 1980 года как стандарт RS274D. Комитет ISO утвердил G-код, как стандарт ISO 6983-1:1982, Госкомитет по стандартам СССР — как ГОСТ 20999-83. В советской технической литературе G-код обозначается, как код ИСО 7-бит (ISO 7-bit), так как G-код для представления на перфоленте её кодировали на 8-ми дорожечную перфоленту в коде ISO 7-bit(разработан для представления информации УЧПУ в виде машинного кода также как и коды AEG и PC8C),восьмая дорожка использовалась для контроля чётности.

Производители систем УЧПУ(CNC)как правило используют софт управления станком,для которого написанная(оператором) программа обработки в качестве осмысленных команд управления используется G-код в качестве базового подмножества языка программирования, расширяя его по своему усмотрению.[1]

Содержание

  • 1 Структура программы
  • 2 Сводная таблица кодов
  • 3 Таблица основных команд
  • 4 Таблица технологических кодов
  • 5 Параметры команд
  • 6 См. также
  • 7 Пример
  • 8 Примечания
  • 9 Ссылки

Структура программы

Программа, написанная с использованием G-кода, имеет жесткую структуру. Все команды управления объединяются в кадры — группы, состоящие из одной или более команд. Кадр завершается символом перевода строки (CR/LF) и имеет номер, за исключением первого кадра программы и комментариев. Первый (а в некоторых случаях ещё и последний) кадр содержит только один символ «%». Завершается программа командой M02 или M30. Комментарии к программе размещаются в круглых скобках, как после программных кодов, так и в отдельном кадре.

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

Подпрограммы могут быть описаны после команды M02, но до M30. Начинается подпрограмма с кадра вида Lxx, где xx — номер подпрограммы, заканчивается командой M17.

Сводная таблица кодов

Основные (называемые в стандарте подготовительными) команды языка начинаются с буквы G:

  • Перемещение рабочих органов оборудования с заданной скоростью (линейное и круговое)
  • Выполнение типовых последовательностей (таких, как обработка отверстий и резьба)
  • Управление параметрами инструмента, системами координат, и рабочих плоскостей
Подготовительные (основные) команды
КодыОписание
G00-G03Позиционирование инструмента
G17-G19Переключение рабочих плоскостей (XY, ZX, YZ)
G20-G21Не стандартизовано
G40-G44Компенсация размера различных частей инструмента (длина, диаметр)
G53-G59Переключение систем координат
G80-G85Циклы сверления, растачивания, нарезания резьбы
G90-G91Переключение систем координат (абсолютная, относительная)

Таблица основных команд

КомандаОписаниеПример
G00Ускоренное перемещение инструмента (холостой ход)G0 X0 Y0 Z100
G01Линейная интерполяцияG01 X0 Y0 Z100 F200
G02Круговая интерполяция по часовой стрелкеG02 X15 Y15 R5 F200
G03Круговая интерполяция против часовой стрелкиG03 X15 Y15 R5 F200
G04Задержка выполнения программы, способ задания величины задержки зависит от реализации системы управленияG04
G15Отмена полярной системы координатG15 X15 Y22. 5; G15;
G16Полярная система координат (X радиус Y угол)G16 X15 Y22.5
G17Выбор рабочей плоскости X-Y
G18Выбор рабочей плоскости Z-X
G19Выбор рабочей плоскости Y-Z
G40Отмена компенсации радиуса инструментаG1 G40 X0 Y0 F200
G41Компенсировать радиус инструмента слева от траекторииG41 X15 Y15 D1 F100
G42Компенсировать радиус инструмента справа от траекторииG42 X15 Y15 D1 F100
G43Компенсировать длину инструмента положительноG43 X15 Y15 Z100 h2 S1000 M3
G44Компенсировать длину инструмента отрицательноG44 X15 Y15 Z4 h2 S1000 M3
G49Отмена компенсации длины инструментаG49 Z100
G53Отключить смещение начала системы координат станкаG53 G0 X0 Y0 Z0
G54-G59Переключиться на заданную оператором систему координатG54 G0 X0 Y0 Z100
G70Программировать в дюймахG70
G71Программировать в ммG71
G80Отмена циклов сверления, растачивания, нарезания резьбы метчиком и т. д.G80
G81Цикл сверленияG81 X0 Y0 Z-10 R3 F100
G82Цикл сверления с задержкойG82 X0 Y0 Z-10 R3 P100 F100
G83Цикл прерывистого сверления (с полным выводом сверла)G83 X0 Y0 Z-10 R3 Q8 F100
G84Цикл нарезания резьбыG95 G84 M29 X0 Y0 Z-10 R3 F1.411
G90Задание абсолютных координат опорных точек траекторииG90 G1 X0.5 Y0.5 F10
G91Задание координат инкрементально последней введённой опорной точкиG91 G1 X4 Y5 F100
G94F (подача) — в формате мм/мин.G94 G80 Z100
G95F (подача) — в формате мм/об.G95 G84 X0 Y0 Z-10 R3 F1.411

максимум 4 команды в кадре

Таблица технологических кодов

Технологические команды языка начинаются с буквы М. Включают такие действия, как:

  • Сменить инструмент
  • Включить/выключить шпиндель
  • Включить/выключить охлаждение
  • Работа с подпрограммами
Вспомогательные (технологические) команды
КодОписаниеПример
M00Приостановить работу станка до нажатия кнопки «старт» на пульте управления, так называемый «безусловный технологический останов»G0 X0 Y0 Z100 M0
M01Приостановить работу станка до нажатия кнопки «старт», если включён режим подтверждения остановаG0 X0 Y0 Z100 M1
M02Конец программы, без сброса модальных функцийM02
M03Начать вращение шпинделя по часовой стрелкеM3 S2000
M04Начать вращение шпинделя против часовой стрелкиM4 S2000
M05Остановить вращение шпинделяM5
M06Сменить инструментT15 M6
M07Включить дополнительное охлаждениеM3 S2000 M7
M08Включить основное охлаждение. Иногда использование более одного M-кода в одной строке (как в примере) недопустимо, для этого используются M13 и M14M3 S2000 M8
M09Выключить охлаждениеG0 X0 Y0 Z100 M5 M9
M13Включить охлаждение и вращение шпинделя по часовой стрелкеS2000 M13
M14Включить охлаждение и вращение шпинделя против часовой стрелкиS2000 M14
M17Конец подпрограммыM17
M25Замена инструмента вручнуюM25
M97Запуск подпрограммы, находящейся в той же программе (где P — номер кадра, в случае примера переход осуществится к строке N25), действует не везде, предположительно — только на станках HAASM97 P25
M98Запуск подпрограммы, находящейся отдельно от основной программы (где P — номер подпрограммы, в случае примера переход осуществится к программе O1015)M98 P1015
M99Конец подпрограммыM99
M30Конец программы, со сбросом модальных функцийM30

не больше одного кода в кадре

Параметры команд

Параметры команд задаются буквами латинского алфавита

КодОписаниеПример
XКоордината точки траектории по оси XG0 X100 Y0 Z0
YКоордината точки траектории по оси YG0 X0 Y100 Z0
ZКоордината точки траектории по оси ZG0 X0 Y0 Z100
PПараметр командыG04 P101
FСкорость рабочей подачиG1 G91 X10 F100
SСкорость вращения шпинделяS3000 M3
RПараметр стандартного цикла или радиус дуги (расширение стандарта)G81 R1 0 R2 −10 F50 или G1 G91 X12. 5 R12.5
HПараметр коррекции выбранного инструментаG1 G41 D1 X10. F150.
PЧисло вызовов подпрограммыL82 P10
I,J,KПараметры дуги при круговой интерполяцииG03 X10 Y10 I0 J0 F10
LВызов подпрограммы с данной меткойL12

См. также

  • Языки программирования
  • Металлорежущий станок
  • Числовое программное управление
  • Параметрическое программирование

Пример

Обработка буквы W (вписанной в прямоугольник 34х27 мм, см рис.) на условном вертикально-фрезерном станке с ЧПУ, фрезой диаметром 4 мм, в заготовке из органического стекла:

Красным цветом выделен результат обработки.

КадрСодержаниеКомментарий
 %Начало программы
N1G90 G40 G17Система координат абсолютная, компенсация на радиус инструмента выключена, плоскость интерполяции XoY
N2S500 M3Задать скорость вращения шпинделя и включить шпиндель
N3G0 X2. 54 Y26.15Переход в точку начала обработки на холостом ходу
N4Z1.0Подход к заготовке по Z, недоходя 1 мм, на холостом ходу
N4G1 Z-1.0 F100Врезание в заготовку на подаче 100 мм/мин
N5X5.19 Y 2.0Первый штрих буквы W
N6X7.76Продолжение движения
N7X16.93 Y26.15Второй штрих буквы W
N8X18.06Продолжение движения
N9X25.4 Y2.0Третий штрих буквы W
N10X25.96Продолжение движения
N11X32.17 Y 26.15Четвертый штрих буквы W
N12G0 Z12Отвод инструмента от заготовки на холостом ходу
N13M5Выключить шпиндель
N14M30Конец программы

Примечания

  1. CNC G Codes Definitions Examples Programs Programming Learning Training

Ссылки

  • CAM расширение Inkscape для экспорта в G-code
  • Симуляция работы программ на G-коде в реальном времени
  • Real-Time 3D Graphics Simulation for G-code  (англ. )
  • Overview of canonical machining functions  (англ.)
  • SIMUL CNC  (англ.)
  • Руководство программиста ЧПУ Mazatrol с перечнем G-кодов
  • Подборка ссылок на сайты редакторов визуализаторов G-кода
  • Образовательный сайт по ЧПУ (CNC) программированию

Объяснение G-кода | Список наиболее важных команд G-кода

Если ваша работа или хобби связаны со станками с ЧПУ или 3D-принтерами, то понимание того, что такое G-код и как он работает, имеет для вас важное значение. Итак, в этом уроке мы изучим основы языка G-кода, какие самые важные или распространенные команды G-кода и объясним, как они работают.

Что такое G-код?

G-код — это язык программирования для станков с числовым программным управлением (ЧПУ). G-код означает «геометрический код». Мы используем этот язык, чтобы сказать машине, что делать или как что-то делать. Команды G-кода указывают машине, куда двигаться, как быстро двигаться и по какому пути следовать.

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

Аналогично, в случае аддитивного производства или 3D-принтеров команды G-кода предписывают машине наносить материал слой за слоем, формируя точную геометрическую форму.

Как читать команды G-кода?

На первый взгляд, когда вы видите файл G-кода, он может показаться довольно сложным, но на самом деле его не так уж сложно понять.

Если внимательно посмотреть на код, то можно заметить, что большинство строк имеют одинаковую структуру. Кажется, что «сложная» часть G-кода — это все те числа, которые мы видим, которые являются просто декартовыми координатами.

Давайте рассмотрим одну строку и объясним, как она работает.

G01 X247.951560 Y11.817060 Z-1.000000 F400.000000

Эта строка имеет следующую структуру:0008, а в данном случае это G01 , что означает «движение по прямой линии в определенное положение».

  • Мы объявляем позицию или координаты со значениями X , Y и Z .
  • Наконец, со значением F мы устанавливаем скорость подачи , или скорость, с которой будет выполняться перемещение.
  • В завершение строка G01 X247.951560 Y11.817060 Z-1.000000 F400 указывает станку с ЧПУ двигаться по прямой линии от текущего положения к координатам X247.9.51560, Y11.817060 и Z-1.000000 со скоростью 400 мм/мин. Единицей является мм/мин, потому что, если мы вернемся к примеру изображения G-кода, мы увидим, что мы использовали команду G21, которая устанавливает единицы измерения в миллиметры. Если нам нужны единицы измерения в дюймах, вместо этого мы используем команду G20.

    Наиболее важные/общие команды G-кода

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

    G00 – Быстрое позиционирование

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

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

    G01 – Линейная интерполяция

    Команда G-кода G01 дает указание станку двигаться по прямой линии с заданной подачей или скоростью. Мы указываем конечное положение со значениями X , Y и Z , а скорость со значением F . Контроллер машины вычисляет (интерполирует) промежуточные точки, через которые нужно пройти, чтобы получить эту прямую линию. Хотя эти команды G-кода просты и интуитивно понятны, за ними контроллер станка выполняет тысячи вычислений в секунду, чтобы выполнять эти движения.

    В отличие от команды G00, которая используется только для позиционирования, команда G01 используется, когда станок выполняет свою основную работу. В случае токарного станка или фрезерного станка резка материала по прямой линии, а в случае 3D-принтера — экструдирование материала по прямой линии.

    G02 – Круговая интерполяция по часовой стрелке

    Команда G02 указывает машине двигаться по часовой стрелке по круговой схеме. Это та же концепция, что и у команды G01, и она используется при выполнении соответствующего процесса обработки. В дополнение к параметрам конечной точки здесь также необходимо определить центр вращения или расстояние начальной точки дуги от центральной точки дуги. Начальная точка на самом деле является конечной точкой предыдущей команды или текущей точкой.

    Для лучшего понимания мы добавим команду G02 после команды G01 из предыдущего примера.

    Итак, в примере сначала у нас есть команда G01, которая перемещает станок в точку X5, Y12. Теперь это будет отправной точкой для команды G02. С помощью параметров X и Y команды G02 мы устанавливаем конечную точку. Теперь, чтобы добраться до этой конечной точки, используя круговое движение или дугу, нам нужно определить ее центральную точку. Мы делаем это, используя параметры I и J. Значения I и J относятся к начальной или конечной точке предыдущей команды. Итак, чтобы получить центральную точку на X5 и Y7, нам нужно сделать смещение на 0 по оси X и смещение -5 по оси Y.

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

    Итак, здесь у нас по-прежнему та же конечная точка, что и в предыдущем примере (X10, Y7), но центральная точка теперь находится в другом положении (X0, Y2). Благодаря этому мы получили более широкую дугу по сравнению с предыдущей.

    См. также: Как настроить GRBL и управлять станком с ЧПУ с помощью Arduino

    G00, G01, G02 Пример – Программирование G-кода вручную

    Давайте рассмотрим простой пример фрезерной обработки с ЧПУ, используя эти три основные команды G-кода, G00, G01 и G02.

    Чтобы получить траекторию для формы, показанной на изображении выше, нам нужно выполнить следующие команды G-кода:

      G00 X5 Y5              ; точка Б
    G01 X0 Y20 F200         ; точка С
    G01 X20 Y0             ; точка Д
    G02 X10 Y-10 I0 J-10     ; точка Е
    G02 X-4 Y-8 I-10 J0    ; точка F
    G01 X-26 Y-2             ; точка Б   Кодовый язык: Arduino (arduino)  

    Первой командой G00 мы быстро переводим машину из исходного или исходного положения в точку B(5,5). Отсюда мы начинаем с «резки» со скоростью подачи 200, используя команду G01 . Здесь мы можем отметить, что для перехода из точки B(5,5) в точку C(5,25) мы используем значения для X и Y относительно начальной точки B. Таким образом, +20 единиц в направлении Y приведут нас к точке C(5,25). На самом деле это зависит от того, выбрали ли мы машину для интерпретации координат как абсолютных или относительных. Мы объясним это в следующем разделе.

    Как только мы достигнем точки C(5,25), у нас есть еще одна команда G01 для достижения точки D(25,25). Затем мы используем команду G02, круговое движение, чтобы добраться до точки E(35,15) с центральной точкой (25,15). На самом деле у нас есть та же самая центральная точка (25,15) для следующей команды G02, чтобы добраться до точки F(31,7). Тем не менее, мы должны отметить, что параметры I и J отличаются от предыдущей команды, потому что мы смещаем центр от последней конечной точки или точки E. Мы завершаем траекторию с помощью другой команды G01, которая доставит нас из точки F (31, 7) вернуться к точке B(5,5).

    Итак, вот как мы можем вручную запрограммировать G-код для создания этой формы. Однако мы должны отметить, что это не полный G-код, потому что нам не хватает еще нескольких основных команд. Мы создадим полный G-код в следующем примере, так как сначала нам нужно объяснить эти команды G-кода.

    G03 – круговая интерполяция против часовой стрелки

    Так же, как и G02, команда G-кода G03 определяет движение машины по круговой схеме. Единственная разница здесь в том, что движение происходит против часовой стрелки. Все остальные функции и правила аналогичны команде G02.

    Таким образом, с помощью этих трех основных команд G-кода, G01 , G02 и G03 , мы можем создать траекторию буквально для любой формы, которую захотим. Вам может быть интересно, как это возможно, но на самом деле это простая задача для компьютера и программного обеспечения CAM. Да, иногда мы можем вручную создать программу G-кода, но в большинстве случаев мы делаем это с помощью соответствующего программного обеспечения, которое намного проще и безопаснее.

    Тем не менее, теперь объясните еще несколько важных и часто используемых команд и в конце приведите реальный пример G-кода.

    G20/G21 – выбор единиц измерения

    Команды G20 и G21 определяют единицы G-кода, дюймы или миллиметры.

    • G20 = дюймы
    • G21 = миллиметры

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

    G17/ G18/ G18 – Выбор плоскости G-кода

    С помощью этих команд G-кода мы выбираем рабочую плоскость станка.

    • G17 — плоскость XY
    • G18 — плоскость XZ
    • G19 — плоскость YZ

    G17 используется по умолчанию для большинства станков с ЧПУ, но два других также можно использовать для выполнения определенных перемещений.

    G28 – Возврат домой

    Команда G28 указывает станку переместить инструмент в исходную точку или исходное положение. Чтобы избежать столкновения, мы можем включить промежуточную точку с параметрами X, Y и Z. Инструмент пройдет через эту точку, прежде чем перейти к контрольной точке. G28 X## Y## Z## 

    Исходное положение можно определить с помощью команды G28.1 X## Y## Z## .

    G90/G91 – Команды G-кода позиционирования

    С помощью команд G90 и G91 мы сообщаем машине, как интерпретировать координаты. G90 для абсолютного режима и G91 для относительного режима .

    В абсолютном режиме позиционирование инструмента всегда происходит от абсолютной точки или нуля. Итак, команда G01 X10 Y5 приведет инструмент точно в эту точку (10,5), независимо от предыдущей позиции.

    С другой стороны, в относительном режиме инструмент позиционируется относительно последней точки. Таким образом, если станок в данный момент находится в точке (10,10), команда G01 X10 Y5 переместит инструмент в точку (20,15). Этот режим также называют «инкрементным режимом».

    Другие команды и правила

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

    В дополнение к G-коду существуют также команды М-кода, которые используются при создании реальной полноценной программы G-кода. Вот несколько распространенных команд M-кода:

    • M00 – Останов программы
    • M02 – Конец программы
    • M03 – Включение шпинделя – по часовой стрелке
    • M04 – Включение шпинделя – против часовой стрелки
    • M05 – Остановка шпинделя
    • M06 – Инструмент изменить

    • M08 – Подача охлаждающей жидкости ВКЛ.
    • M09 – Подача охлаждающей жидкости ВЫКЛ.
    • M30 – Конец программы

    В случае 3D-принтера:

    • M104 — Запустить нагрев экструдера
    • M109 — Подождать, пока экструдер достигнет T0
    • M140 — Запустить нагрев платформы
    • M190 — Подождать, пока платформа достигнет T4 9003 9003

    Некоторым из этих команд требуются соответствующие параметры. Например, при включении шпинделя с помощью M03 мы можем установить скорость шпинделя с помощью параметра S. Итак, строка M30 S1000 включит шпиндель на скорость 1000 об/мин.

    Мы также можем отметить, что многие коды являются модальными , что означает, что они остаются в силе до тех пор, пока не будут отменены или заменены другим кодом. Например, скажем, у нас есть код линейного резания G01 X5 Y7 F200 . Если следующим движением снова будет линейная резка, мы можем просто ввести координаты X и Y без надписи G01 впереди.

     G01 X5 Y7 F200
    Х10 У15
    Х12 У20
    G02 X5 Y5 I0 J-5
    X3 Y6 I-2 J0  Язык кода: Arduino (arduino)  

    То же самое относится к параметру скорости подачи F. Нам не нужно включать его в каждую строку, если только мы не хотим изменить его значение.

    В некоторых файлах G-кода вы также можете увидеть « N## » перед командами. Слово N просто для нумерации строки или блока кода. Это может быть полезно для определения конкретной строки в случае ошибки в огромной программе.

    Пример программы простого G-кода

    Тем не менее, после прочтения всего этого, теперь мы можем вручную сделать настоящий, актуальный код. Вот пример:

     %
    G21 G17 G90 F100
    М03 С1000
    G00 X5 Y5                 ; точка Б
    G01 X5 Y5 Z-1             ; точка Б
    G01 X5 Y15 Z-1            ; точка С
    G02 X9 Y19 Z-1 I4 J0    ; точка Д
    G01 X23 Y19 Z-1          ; точка Е
    G01 X32 Y5 Z-1            ; точка F
    G01 X21 Y5 Z-1            ; точка G
    G01 X21 Y8 Z-1            ; точка Н
    G03 X19 Y10 Z-1 I-2 J0    ; пункт я
    G01 X13 Y10 Z-1           ; точка J
    G03 X11 Y8 Z-1 I0 J-2     ; точка К
    G01 X11 Y5 Z-1            ; точка L
    G01 X5 Y5 Z-1             ; точка Б
    G01 X5 Y5 Z0
    G28  X0 Y0
    М05
    М30
    %  Язык кода: Arduino (arduino)  

    Описание программы G-code:

    1. Инициализация кода. Этот символ (%) всегда присутствует в начале и в конце программы.
    2. Линия безопасности: Задайте программирование в метрической системе (все размеры в мм), плоскость XY, абсолютное позиционирование и скорость подачи 100 дюймов/мин.
    3. Шпиндель по часовой стрелке со скоростью 1000 об/мин.
    4. Быстрое позиционирование на B(5,5).
    5. Управляемое движение в том же положении, но с опусканием инструмента на -1.
    6. Линейное режущее движение в положение C(5,15).
    7. Круговое движение по часовой стрелке к точке D(9,19) с центром в точке (9,15).
    8. Линейная резка до точки E(23,19).
    9. Линейная резка до точки F(32,5).
    10. Тот же прямой рез до точки G(21,5).
    11. Еще один прямой рез до точки H(21,8).
    12. Круговая интерполяция против часовой стрелки в позицию I(19,10) с центром в точке (19,8).
    13. Линейная резка до точки J(13,10).
    14. Круговая резка против часовой стрелки до позиции K(11,8) с центром в (13,8).
    15. Линейная резка в положение L(11,5).
    16. Окончательное линейное движение резки в положение B(5,5).
    17. Поднимите инструмент.
    18. Перейти в исходное положение.
    19. Шпиндель выключен.
    20. Конец основной программы.

    Вот как выглядит этот код, готовый к отправке на наш станок с ЧПУ через программное обеспечение Universal G-code Sender:

    Итак, используя эти основные команды G-кода, описанные выше, нам удалось написать собственный полноценный G-код. код. Конечно, этот пример довольно прост, и для более сложных форм нам определенно нужно использовать программное обеспечение CAM. Вот пример сложного G-кода формы Лошади:

    Для сравнения, в этом коде около 700 строк, но все они сгенерированы автоматически. G-код был создан с использованием Inkscape в качестве примера для моего самодельного станка для резки пенопласта Arduino с ЧПУ. Вот как получилась форма:

    Более подробную информацию об этой машине вы можете найти в моем конкретном руководстве.

    Заключение

    Итак, мы рассмотрели основы G-кода, объяснили наиболее важные и распространенные команды G-кода и вручную создали собственный настоящий G-код. В конце концов, я думаю, что понять G-код не так уж сложно. Конечно, существует так много других команд и функций, используемых в обработке с ЧПУ или 3D-печати, о которых мы должны знать, но подробнее об этом в некоторых других руководствах.

    Если эта статья оказалась вам полезной, поделитесь ею с другими любителями ЧПУ и 3D-печати. Также не стесняйтесь задавать любые вопросы в разделе комментариев ниже.

    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

    Оставить комментарий

    Ваш email не будет опубликован.

    Вы можете использовать следующие HTML тэги: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>