FAQ по Gcode, примеры

Обсуждение установки, настройки и использования LinuxCNC. Вопросы по Gкоду.
Аватара пользователя
Nick
Мастер
Сообщения: 22735
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1693
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

FAQ по Gcode, примеры

Сообщение Nick »

G61 и G64

Коды G61 и G64 используются для переключения режимов обработки углов.
G61 - exact path mode означает что EMC2 будет стараться следовать заданной траектории вне зависимости от скорости прохождения <=> будет тормозить вплоть до полной остановки на каждом угле, чтобы станок мог пройти по траектории с заданными ускорениями по осям.
G61.1 - exact stop mode, гарантирует правильность траектории, останавливается на конце каждого сегмента.
G64 P(допуск скругления) Q(допуск упрощения) - мода при которой EMC2 будет стараться поддержать наибольшую скорость для прохождения траектории с заданными допусками на скругление углов и упрощение траектории. Параметр Р задает максимальное расстояние до траектории при скруглении углов. Параметр Q задает допуск при котором два практически параллельных прямолинейных сегмента будут заменяться одним.

Пример Gcode

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

%
G61 (exact path mode)
G01 X0 Y0 f3000
G01 X100
G64 P10 (скругление с допуском 10мм)
G01 Y100
G64 P30 (скругление с допуском 30мм)
G01 X0
G01 X0 Y0
%
Пример Gкода со скруглением углов
Пример Gкода со скруглением углов
emc lookahead blending.png (10.49 КБ) 55513 просмотров
Что интересно, если использовать скругление меньше радиуса инструмента, то это никак не скажется на внешних углах, они останутся острыми, скруглятся только внутренние углы, которые и так будут скруглены радиусом инструмента.
emc lookahead blending tolerance.png (55513 просмотров) <a class='original' href='./download/file.php?id=778&sid=20a246a38f486e685f070d5262ea9d04&mode=view' target=_blank>Загрузить оригинал (95.07 КБ)</a>
Аватара пользователя
Nick
Мастер
Сообщения: 22735
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1693
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: FAQ по Gcode, примеры

Сообщение Nick »

G53, G54-59, G92

Эти Gкоды используются для задания отступов по осям обработки.

G53 - абсолютные координаты

Вне зависимости от любых установленных отступов по осям, добавление G53 к блоку кода говорит EMC2 использовать реальные координаты станка для этого кода. Например, g53 g0 x0 y0 z0 переместит станок в нули по всем трем осям. Эта команда может использоваться, для смены инструмента и других операций происходящих в определенном месте станка. Или например, если вам нужно убрать режущий инструмент в сторону для удобной смены детали.

G53 это не модальная команда. Вы должны ставить G53 в каждую строку, где необходимо перемещение в абсолютных координатах станка.

G54-G59.3

Рабочие или фиксированные отступы используются для установки начальной точки детали, которая отличается от реальных абсолютных координат. Эти отступы часто используются для создания нескольких копий одной детали.
Значения офсетов хранятся в файле VAR который запрашивается в INI файле при запуске ЕМС2. Например для G55 значения отступа по осям хранятся в переменных
5241 0.000000
5242 0.000000
5243 0.000000
5244 0.000000
5245 0.000000
5246 0.000000
Первая переменная для отступа по оси Х, вторая по Y и так далее. Такие же наборы переменных есть для всех других заданных офсетов.
В каждом графическом интерфейсе есть способ задать эти отступы. Также для этого может быть использован код G10.

Как только заданы значения отступа, вызов любой из систем координат сместит нули осей на указанные значения. В отличие от G53, G54-G59.3 это модальные коды. Они влияют на все код, который находится под ними.

Обычно система G54 оставляется без изменений, т.е. с нулевым отступом. Вы можете спросить: "зачем, ведь есть G53 для перемещения в абсолютных координатах". Это делается потому, что G53 не модальный код, а G54 модальный и такой переход G54 G0 X0 Y0 Z0 переведет станок в абсолютный ноль по всем координатам и установит абсолютную систему координат.

G54-G59.3 = G54, G55, G56, G57, G58, G59, G59.1, G59.2, G59.3 - девять различных координатных систем.

G92 временный отступ

Этот отступ применяется поверх всех остальных заданных отступов.

Набор команд G92:

G92 X- Y- Z- A- B- C- U- V- W-

Эта команда устанавливает текущие значения положения по осям в указанные значения. Пример: G92 X10 Y5.

G92.1

Эта команда сбрасывает значения временного отступа на 0.

G92.2

Эта команда временно приостанавливает действие G92, не сбрасывая значения отступов.

G92.3

Эта команда восстанавливает приостановленное действие G92.

Вы должны понимать, что команда G92 устанавливает не значения отступов, а значения для текущего положения. Т.е. Если вы хотите установить точку (0,0,0) в положение (10,5,2), выполните следующее:
G0 X10 Y5 Z2
G92 X0 Y0 Z0
Тандем
Новичок
Сообщения: 22
Зарегистрирован: 16 мар 2011, 18:26
Репутация: 2
Контактная информация:

Re: FAQ по Gcode, примеры

Сообщение Тандем »

Не нашел подходящей ветки/темы, поэтому спрошу тут, в теме про сглаживание углов.

Допустим, нам необходимо проехаться по параболе.
Преобразуем нашу параболу в G-коды из InkScape GTools-ами, получаем некий набор отрезков и дуг, теряем точность.
Затем выставляем в EMC2 некий допуск упрощения, в MACH3 (насколько я понял) ставим что-то потипу постоянной скорости обработки, и в результате на выходе получаем кривую, в некой определённой мере соответствующей нашей исходной параболе. При сглаживании мы также теряем точность, так как получаем уже не набор отрезков.

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

Рассмотрим проблему инерционности шпинделя.
Вроде как максимальная допустимая скорость хода шпинделя конкретного станка по некоторой кривой зависит только от радиуса поворота кривой в текущей точке движения! Так почему бы не дать управляющей программе кривую в, к примеру, svg, а не ломаную в G-кодах? Или почему бы не задать кривую (полилайн, или Безье) в каких-то новых продвинутых G-кодах? Есть программы управления станком, которые умеют такое делать? Или нет? Ведь мы можем получить максимальную допустимую скорость для кривой, и минимальную ошибку точности.
А станку ведь абсолютно без разницы, что там за коды в УП, главное step/dir чтоб давали, и всё.

Прошу прощения за некий сумбур =) Надеюсь найдутся люди, которые прояснят ситуацию.
Аватара пользователя
Nick
Мастер
Сообщения: 22735
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1693
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: FAQ по Gcode, примеры

Сообщение Nick »

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

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

Для кривых Безье, в которых работает inkscape, оно не вычисляется аналитически, только численными методами с заданной точностью (опять допуски).
(вот тут попробовал решить уравнение длины дуги при помощи wlfram solwer результат меня удивил :) : http://cnc-club.ru/forum/viewtopic.php? ... t=100#p246).

В EMC2 есть поддержка кривых Безье, но фактически она работеат также как и Gcodetools - аппроксимирует эти кривые арками. Причем, на сколько я понял апроксимирутся они всегда 4 арками без разбиения кривой.

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

Алгоритм скругления углов от EMC2 мне нравится больше, т.к. в нем напрямую задаются максимально возможные допуски, а не косвенная величина скорости. При этом если поставить его не нулевым, а просто очень маленьким, то на гладких кривых замедления на углах происходить не будет, а может замедления не будет и при нулевом допуске, т.к. на гладких кривых, при аппроксимациях биарками углов не создается. Все арки смыкаются без углов, а у EMC2 наверняка есть встроенный очень маленький допуск типа 0,00000001мм.

Постарался описать как есть надеюсь получилось не очень сумбурно :).

ЗЫ А ты пробовал прогонять параболу через gcodetools и EMC2 в режиме exact path G61?
Тандем
Новичок
Сообщения: 22
Зарегистрирован: 16 мар 2011, 18:26
Репутация: 2
Контактная информация:

Re: FAQ по Gcode, примеры

Сообщение Тандем »

А допустим у нас есть круг и прямая, по касательной выходящая из узла круга. Соответственно направление вектора скорости при выходе из круга совпадает с направление вектора в начале отрезка. Будут ли Mach и EMC2 снижать скорость в этом узле в режиме G61? Если да, то что делать? Таки устанавливать скругление и терять точность, где, очевидно, можно было обойтись и без потерь точности?

То есть полноценная нормальная поддержка кривых упирается только в сложность их расчёта?

>> В EMC2 есть поддержка кривых Безье
Так имеется некий G-код для кривых, который EMC2 понимает?

В Mach вроде как со скруглениями вообще плохо, там ещё есть параметр look ahead как минимум.

Ещё нигде ничего не пробовал на практике, пока зондирую только теоретическую базу, присматриваюсь к матчам/емс2/турбо и всяко разно.

Вот ещё натыкался на какие-то variable radius arcs на форуме Mach'a, правда упоминались лишь вскользь.
Аватара пользователя
Nick
Мастер
Сообщения: 22735
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1693
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: FAQ по Gcode, примеры

Сообщение Nick »

В режиме G61 - exact path пройдет без остановок и скруглений, а какое скругление, если там и так все кругло :). Если траектория хорошая и ее можно пройти на максимальной скорости, то скруглений не будет вообще.
В режиме G61.1 - exact stop mode, наверняка, будет останавливаться.

Все это можно проверить в режиме симулятора. В нем будет отображаться реальная траектория инструмента в реальном времени.

>>То есть полноценная нормальная поддержка кривых упирается только в сложность их расчёта?
В основном да, только сложность расчета не самих кривых, а их производных параметров. В том числе длинна, изгиб, offset - отступ от кривой Безье вообще не является кривой Безье (кроме кривой 2-го порядка). А кривая Безье второго порядка это кривая составленная из окружностей и прямых, т.е. тот самый Gкод.

По поддержке кривые в EMC2:

Кривые Безье и NURBS в EMC2

(Это примерный перевод документации с сайта LinuxCNC http://linuxcnc.org/docs/html/gcode_mai ... G5.3-NURBs )

Кривые Безье это частный случай NURBS (англ. Non-uniform rational B-spline - Неоднородный рациональный B-сплайн). EMC2 умеет работать именно с NURBS.

Для работы с NURBs в EMC2 есть два специальных Gкода G5.2 G5.3.
Внимание: G5.2, G5.3 являются экспериментальными и пока не окончательно протестированы.
G5.2 открывает блок данных задающий NURBs а G5.3 закрывает. В строках между этими кодами задаются контрольные точки кривых с соответствующими весами "P" и их параметрами "L", которые определяют порядок кривой "k" и ее степень.

Таким образом кривая задается не координатами ее точек, а набором контрольных точек, на основе которых вычисляется траектория (кривая, за редким исключением, не проходит через контрольные точки, кроме первой и последней).

Пример Gкода с использованием NURBs

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

G0 X0 Y0
F10 
G5.2 X0 Y1 P1 L3
     X2 Y2 P1
     X2 Y0 P1
     X0 Y0 P2
G5.3
(Быстрый проход по контрольным точкам, чтобы они отобразились в Liveplot)
G0 X0 Y1
   X2 Y2
   X2 Y0
   X0 Y0
M2
Скриншот Gкода из AXIS:
emc2 nurbs.png
emc2 nurbs.png (4.26 КБ) 55188 просмотров
Milk
Мастер
Сообщения: 206
Зарегистрирован: 05 июл 2011, 15:09
Репутация: 2
Контактная информация:

Re: FAQ по Gcode, примеры

Сообщение Milk »

Начал пробовать писать программы. Использую SolidWorks2010+Mastercam X5. Вроде разобрался, сгенерировал nc-файл, но EMC его выполнять не хочет :cry: Думаю что-то ей не нравится в коде. Может кто-нибудь генерировал код на таком же софте? Подскажите где я ошибся.
Вложения
Файл.rar
Вот nc-файл, который не выполняется
(3.63 КБ) 1177 скачиваний
aftaev
Зачётный участник
Зачётный участник
Сообщения: 32532
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 5824
Откуда: Казахстан. Шымкент
Контактная информация:

Re: FAQ по Gcode, примеры

Сообщение aftaev »

С Х4 Gcode работает нормально. Загрузил твой код в Мач он матюкается. Видать неправльно выбрал постпроцессор.

Здесь описывал работу с Х4 http://www.chipmaker.ru/topic/24326/
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
Nick
Мастер
Сообщения: 22735
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1693
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: FAQ по Gcode, примеры

Сообщение Nick »

Milk писал(а):EMC его выполнять не хочет
А что говорит? Какая ошибка?
Milk
Мастер
Сообщения: 206
Зарегистрирован: 05 июл 2011, 15:09
Репутация: 2
Контактная информация:

Re: FAQ по Gcode, примеры

Сообщение Milk »

Nick писал(а): А что говорит? Какая ошибка?
Пишет что-то типа "не читается строка 0"
Кстати, при открытии правильного кода в графическом окне должна отображаться модель и траектории?
aftaev писал(а):Видать неправльно выбрал постпроцессор.
А Вы какой постпроцессор выбираете? Я ставил Fanuc. Не знаю как в Х4, в Х5 сгенерированный код открывается в Mastercam X editor. Там тоже параметров тьма, сейчас разбираюсь...Строки перед номером должны букву N иметь?
Тему Вашу на chipmaker читал несколько раз - много полезного, но у меня mastercam for solidworks - интегрированый то есть... Перелопатил вчера несколько CAM программ, дошел до инвентора и инвенторкама, кстати там удачно настраивается, довольно просто все, но коды генерировать он отказался наотрез...

Еще, хотел попросить, скиньте пожалуйста код, желательно из Х4-Х5, который выполняется на EMC. Поковыряюсь, посравниваю...
Аватара пользователя
Nick
Мастер
Сообщения: 22735
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1693
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: FAQ по Gcode, примеры

Сообщение Nick »

Кажись понятно. EMC2 наверное не нравится вот эта строка:

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

O0000(ЦИЛИНДРПОДОШВА~ПО УМОЛЧАНИЮ)
Вообще, странно, зачем она нужна :eh:? O - это специальный код, который либо делает вызов подпрограммы, либо задает ее начало или конец, либо задает начало/конец цикла или условия...
Milk писал(а):Строки перед номером должны букву N иметь?
Вроде да, но только не знаю, используются ли эти номера. И что будет, если эти номера не по порядку написать :).
Последний раз редактировалось Nick 08 июл 2011, 17:05, всего редактировалось 1 раз.
Причина: ...
Milk
Мастер
Сообщения: 206
Зарегистрирован: 05 июл 2011, 15:09
Репутация: 2
Контактная информация:

Re: FAQ по Gcode, примеры

Сообщение Milk »

Вроде начало что-то получаться. Убрал все номера строк (emc нумерует их сам), избавился от о0000 и всех комментариев в скобках (чтоб уж наверняка), прописал инструмент в таблице инструментов. Застопорилось на ошибке "встречен плохой символ \a' ". Посмотрел код - нету там такого символа \а... Пока уперся в это...

Все, проблема с \а решена. Это в строках было А0 в начале и в конце кода. Не знаю почему Mastercam их прописал, ну да ладно, удалить четыре буквы кода - ерунда. Все едет и крутится...Завтра буду пускать первую стружку! Щас накрапаю простейшие простейшие детали (квадраты, треугольники, круги...) и завтра буду их катать из дюраля. Потом проверю точность изготовления.
aftaev
Зачётный участник
Зачётный участник
Сообщения: 32532
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 5824
Откуда: Казахстан. Шымкент
Контактная информация:

Re: FAQ по Gcode, примеры

Сообщение aftaev »

Milk писал(а):в строках было А0 в начале и в конце кода. Не знаю почему Mastercam их прописал, ну да ладно,
Видно потому как выбрана 4х осевая стойка Фанук.
Milk писал(а):Потом проверю точность изготовления.
Чтоб получить что либо точное нужно знать точно диаметр фрезы + биение. Диаметр фрезы обмеряют Ренишоу (видео как делают это Ренишоу здесь: http://www.cnc-club.ru/forum/viewtopic. ... =972#p4744)

В хобячных условиях можно фрезернуть материал и обмерить точно рез под микроскопом + ЕМС типо так: http://www.chipmaker.ru/topic/62291/pag ... _p__881289
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Milk
Мастер
Сообщения: 206
Зарегистрирован: 05 июл 2011, 15:09
Репутация: 2
Контактная информация:

Re: FAQ по Gcode, примеры

Сообщение Milk »

aftaev писал(а):Диаметр фрезы обмеряют Ренишоу (видео как делают это Ренишоу здесь: viewtopic.php?f=15&t=972#p4744)

В хобячных условиях можно фрезернуть материал и обмерить точно рез под микроскопом + ЕМС типо так: http://www.chipmaker.ru/topic/62291/pag ... _p__881289
Мне пока не до микронной точности, пока восторг вызывает простое движение осей! Но это, конечно, пока...Потом буду шукать чего-нибудь. В принципе, для моих целей точности в 0,05 достаточно. Но стремление к лучшему неискоренимо.
Кстати, на скрине emc (в теме по микроскопу) есть вкладки камеры. Как их сделать? Как подключить саму камеру?
Аватара пользователя
Nick
Мастер
Сообщения: 22735
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1693
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: FAQ по Gcode, примеры

Сообщение Nick »

Комментарии можно не тереть, номера строк тоже. Все это ECM2 жрет нормально.

Про камеру в emc2 смотри здесь: http://cnc-club.ru/forum/viewtopic.php? ... 5116#p5110
aftaev
Зачётный участник
Зачётный участник
Сообщения: 32532
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 5824
Откуда: Казахстан. Шымкент
Контактная информация:

Re: FAQ по Gcode, примеры

Сообщение aftaev »

Milk писал(а):Мне пока не до микронной точности, пока восторг вызывает простое движение осей!
тогда как можно будет судить о:
Milk писал(а):Потом проверю точность изготовления.
Milk писал(а):Как подключить саму камеру?
Воткнуть камеру в USB :)
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Milk
Мастер
Сообщения: 206
Зарегистрирован: 05 июл 2011, 15:09
Репутация: 2
Контактная информация:

Re: FAQ по Gcode, примеры

Сообщение Milk »

aftaev писал(а):тогда как можно будет судить о:
Старым колхозным способом - сделать например паз, а потом его обмерить и посмотреть расхождения с моделью...
aftaev писал(а):Воткнуть камеру в USB :)
:-) это-то понятно. EMC сама её видит и делает для неё графическую вкладку, или надо прописывать где-то?
aftaev
Зачётный участник
Зачётный участник
Сообщения: 32532
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 5824
Откуда: Казахстан. Шымкент
Контактная информация:

Re: FAQ по Gcode, примеры

Сообщение aftaev »

Milk писал(а):Старым колхозным способом - сделать например паз, а потом его обмерить и посмотреть расхождения с моделью...
И как потом понять кто виноват станок или кривая фреза.
Milk писал(а):это-то понятно. EMC сама её видит и делает для неё графическую вкладку, или надо прописывать где-то?
Nick ссылку выкладывал где описано что нужно сделать чтоб добавилась вкладка с камерой.
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
mycnc
Мастер
Сообщения: 867
Зарегистрирован: 03 июл 2011, 02:01
Репутация: 589
Контактная информация:

Gcode, примеры. G65 вызов подпрограммы

Сообщение mycnc »

Макропрограмма - Простой вызов (G65)
Если задан G65, то вызывается макропрограмма пользователя, заданная в адресе Р. Данные (аргумент) могут передаваться в макропрограмму пользователя.
G65 P L <аргументы> ;
P : Номер вызываемой программы
L : Количество повторов (по умолчанию 1)
Аргумент : Данные, передаваемые в макропрограмму

Пример вызова-
G65 P9010 L2 A1.0 B2.0 ;
Вызывает подпрограмму O9010, с числом повторений 2 и передает в подпрограмму параметры A(#1) B(#2)

При определении аргумента значения присваиваются соответствующим локальным переменным.
Указание аргумента-
В указании аргумента используются буквы, кроме G, L, O, N и P, каждая один раз.
Соответствие передаваемого параметра и локальной переменной-
A(#1) B(#2) C(#3)
D(#7) E(#8) F(#9)
H(#11) I(#4) J(#5) K(#6)
M(#13) Q(#17) R(#18) S(#19)
T(#20) U(#21) V(#22) W(#23) X(#24) Y(#25) Z(#26)

Взято (с сокращениями) из описания Fanuc (B-63604)
fanuc-g65.pdf
(109.31 КБ) 1929 скачиваний
Аватара пользователя
Nick
Мастер
Сообщения: 22735
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1693
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

Re: FAQ по Gcode, примеры

Сообщение Nick »

В emc2 вместо G65 используются О-коды, в частности, для вызова подпрограммы используется команда Onnn call.

O коды

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

Подпрограммы: sub, endsub, return, call

Подпрограмма заключена между кодами O- sub и O- endsub. Строки внутри подпрограммы не выполняются в обычном порядке, они выполняются только когда подпрограмма вызвана при помощи O- call.
Пример:

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

O100 sub (подпрограмма для перемещения в ноль станка)
G53 G0 X0 Y0 Z0
O100 endsub
(...)
(много любых строчек)
(...)
O100 call
Внутри подпрограммы может быть использован код, O- return. Это приведет к немедленному возвращению к строчке вызывавшей подпрограмму, точно так же как если бы был встречен код O- endsub.

O- call принимает до 30 опциональных параметров, которые передаются вподпрограмму как #1, #2 ... #N, параметры #N+1, ..., #30 будут иметь значения параметров с тем же именем в контексте вызывающем подпрограмму. После возвращения из подпрограммы параметры #1, ..., #30 (вне зависимости от количества аргументов) будут возвращены к тем значениям, которые они имели до вызова подпрограммы. Параметры #1, ..., #30 локальны в подпрограмме.
Т.к. "1 2 3" будет распознаваться как число 123, параметры должны быть заключены в квадратные скобки. Следующая строчка вызовет подпрограмму с 3 параметрами:

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

O200 call [1] [2] [3]
Тела подпрограмм не могут быть вложенными. Подпрограммы могут быть вызваны только после того, как они определены при помощи O- sub. Они могут вызываться из других подпрограмм, и могут вызывать самих себя рекурсивно, если это имеет смысл. Максимальный уровень вложенности 10.

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

Циклы: do, while, endwhile, break, continue

У цикла "while loop" есть две структуры: while/endwhile и do/while. В каждом случае цикл заканчивается когда условие "while" равняется false.

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

(Отрисовка контура пилы)
F100
#1 = 0
O101 while [#1 lt 10]
G1 X0
G1 Y[#1/10] X1
#1 = [#1+1]
O101 endwhile
Внутри цикла while, O- break немедленно завершит цикл, а O- continue немедленно перейдет к следующему вычислению значения условия while, если оно все еще true, переходим к следующей итерации, если false цикл завершается.

Условия: if, else, endif

"if" выполняет одну группу выражений, если условие равно true и другую группу выражений если условие равно false.
(Установка подачи в зависимости от значения переменной)

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

O102 if [#2 GT 5]
F100
O102 else
F200
O102 endif

Повторения Repeat

"repeat" будет выполнять выражения внутри repeat/endrepeat указанное количество раз. Пример показывает как вы можете обработать серию контуров по расположенных диагонали, начиная с текущего положения.

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

(Обработать 5 контуров по диагонали)
G91 (Режим приращений)
O103 repeat [5]
(...)
(Вставьте сюда код для обработки.)
(...)
G0 X1 Y1 (перемещение к следующей позиции)
O103 endrepeat
G90 (Абсолютный режим)

Indirection

Коду O может быть дан параметр или вычисление. Например, следующий код вызовет подпрограмму с номером на 2 больше, чем значение параметра #101.

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

O[#101+2] call
The O-number may be given by a parameter or calculation.
O[#101+2] call

Вычисления значений внутри О-кодов

В О-кодах могут использоваться параметры, выражения, бинарные операторы и функции.
Бинарные операторы: +, -, *, /, **, MOD, EQ, NE, GT, GE, LT, LE, AND, OR, XOR.
Функции: ATAN[Y]/[X], ABS[arg], ACOS[arg], ASIN[arg], COS[arg], EXP[arg], FIX[arg], FUP[arg], ROUND[arg], LN[arg], SIN[arg], SQRT[arg], TAN[arg].

Вызов файлов

Чтобы вызвать подпрограмму из файла создайте файл с таким же названием, как имя вызова, и включите в него sub и endsub. Файл должен быть в директории указанной в PROGRAM_PREFIX. Имя файла может включать только маленькие буквы, числа, тире и подчеркивание.

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

o<myfile> call (вызов именного файла)
(или)
o123 call (вызов файла с числовым именем)
В файл должны быть включены oxxx sub и oxxx endsub и файл должен быть валидным файлом.

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

(myfile.ngc)
o<myfile> sub
...
o<myfile> endsub
M2
Ответить

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