Программирование Macro B

Ссылка на источник

В этой статье мы поговорим о параметрических программах и языке программирования Macro B (который присутствует в системах Fanuc, а также в немного изменёном виде в некоторых других системах) . Во многих отношениях макропрограммирование это высший уровень программирования в G-кодах. Оно предлагает большую гибкость в составлении программ. Без него G-код не полноценная программа, а лишь вручную заданная серия шагов. 

Если , например, в станке нет стандартоного цикла сверления (такого как G83), то приходится писать код ввода-вывода сверла вручную – долго, муторно, а если ещё опечататься, то можно на ускоренном одводе и в заготовку врезаться.

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

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

В обычной управляющей программе вы указываете различные G-коды, а также направления и величины перемещений при помощи числовых значений. Например, G10 или Х100.

Однако СЧПУ станка может делать то же самое при помощи переменных.

Символом переменной в Macro В является знак #. Например, в программе
можно указать следующие выражения:

#1=100

#2=200

#3=#1+#2


Это означает, что переменной #1 присваивается значение 100, а переменной

2 – значение 200.

Переменная #3 будет являться результатом суммы переменной 1 и переменной #2.

С таким же успехом можно записать и G-код:

#25=1

G#25

Переменной #25 присвоено значение 1. Тогда вторая строка по своей сути будет
обозначать код линейной интерполяции G1.

Переменные.

Переменная представляет собой имя области памяти, где хранятся данные. Переменным присваиваются значения и при обращении к ним возвращают эти самые значения. Переменные в macro B записываются в виде цифры, перед которой идёт решётка.

Например:

 #1 (переменная 1), #123 и т.д.

Чтобы сделать программу интеллектуальной, вам нужно уметь заменять значения переменными.
Переменная – это часть информации, которой может быть присвоено значение.
Синтаксис переменной определяется символом “#” и ее идентификационным номером.
Пример переменной: #153
Пример присвоения значения переменной: #153 = 12.4 (таким образом, переменная #153 содержит значение 12.4)
Как только ваши переменные содержат значение, их можно, например, добавлять, умножать, использовать как позицию, как скорость, как подачу или даже использовать в условном выражении.
Вот переменные, которые вы можете использовать.

Локальные переменные это переменные от #1 до #33, значения из этих переменных будут доступны только в текущей программе и не передаются в подпрограммы, при выключениее питания стойки эти переменные обнуляются.

Общие переменные хранятся в области памяти, доступной всем программам. Значения этих переменных можно передавать в другие подпрограммы. Переменные в диапазоне #100 – #199

обнуляются при выключении питания, в диапазоне #500-#999 сохраняют свои значения даже при выключенном питании.

Системные переменные. Это переменные, начинающиеся с #1000 и дальше. В этих переменных хранятся значения параметров, если вы не знаете значения этих переменных то их не стоит трогать.

Также сущесвует переменная #0, которая не хранит никаких значений и всегда равна нулю.

В Mach3 10.320 переменных от #0 до #10320. Значения переменных не сбрасываются при отключении питания.

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

Пример:

#101 = 10 // мы присвоили значение переменной #1

G0 X0Z#101; // револьвер или шпиндель или что там ещё на станке катается переедет в координаты X0Z10

С переменными можно производить различные арифметические и геометрические операции, такие как сложение(+), вычитание(-), умножение(*), деление(/), возведение в степень (**), извлечение квадратного корня (SQRT), вычисление косинуса (cos) и подобные.

Более подробно мы их рассмотрим позже.

Пример:

#101 = 8;

#102 = 2;

G0X#101Z#101;

#101 = #101 + #102; // мы прибавили к значению переменной #101 значение переменной #102, таким образом #101 теперь у нас равняется 10.

G0X#101;

Также для переменных доступны операторы сравнения, такие как EQ (равно), LE (меньше или равно) и т.д.

См. таблицу операторов сравнения macroB.

Оператор сравнения
Операторы сравнения позволяют сравнивать две переменные в условном выражении. Операторами сравнения являются:
Равно “EQ
Не равно “NE
Больше, чем “GT
Больше или равно “GE
Меньше, чем “LT
Меньше или равно “LE

Комментарий

Комментарии — поясняющие строки в программном коде, которые позволяют понять смысл написанного. Они пишутся для людей, но игнорируются компиляторами и интерпретаторами.

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

Логические операторы

Логические операции позволяют проверить несколько условий в одном условном выражении.

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

Логическая “И AND” -“AND
Логическая “ИЛИ OR”- “OR

Где нельзя применять переменные?

– в номерах программ (т.е запись O#101 недопустима);

– в номерах кадров (N#110 – недопустимо);

– в адресе block skip (/120 – допустимо, /#120 – недопустимо);

– в цикле WHILE…DO…END (DO#1 – недопутимо);

Зачем нужны переменные?

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

Арифметические операции
Наиболее часто используемыми арифметическими операциями являются:

Сложение “+”

Вычитание “-“

Умножение “*”

Деление “/”

Вложенная команда

Вложенная команда (функция) выполняется внутри прямоугольных скобок [ ]

Пример:

#603 = [#601 + #602] / 4

Функции

Наиболее часто используемыми функциями являются:

Синус “SIN[#…]”
Косинус “COS[#…]”
Тангенс “TAN[#…]”
Квадратный корень “SQRT[#…]”
Абсолютное значение “ABS[#…]”
Power “POW[#…, #…]”
Округляется в меньшую сторону до следующего целого числа “FIX[#…]”
Округлить значение “ROUND[#…]”

Связи и повторения

Условная инструкция “GOTO”:
Инструкция “Nn” в начале строки позволяет указать номер блока.

Команда безусловного перехода GOTO предназначена для передачи управления определенному кадру программы. Формат команды следующий:

GOTO N – безусловный переход к кадру N;

GOTO #A – безусловный переход к кадру, установленному переменной #A.

Пример:

N10 G01 X100
N20 G01 X-100
N30 GOTO 10


После выполнения кадра N30 система ЧПУ переходит к кадру N10. Затем снова работает с кадрами N20 и N30 – получается бесконечный цикл.


Инструкция “GOTO” очень проста для понимания, GOTO 5 означает: перейти к блоку N5.

Команда условия IF

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

Если выражение оказывается несправедливым,
то команда, находящаяся в кадре с IF, не выполняется, а управление передается следующему кадру.

После IF указывается некоторое выражение. Если это вы-
ражение оказывается справедливым, то выполняется команда (например, команда безусловного перехода), находящаяся в кадре с IF. Если выражение оказывается несправедливо, то команда, находящаяся в кадре с IF, не выполняется, а управление передается следующему кадру.

Формат команды следующий:
IF [#a GT #b] GOTO N


Пример:

#1=100

#2=80

N10 G01 X200
N20 IF [#1 GT #2] GOTO 40
N30 G01 X300
N40 M30


В начале программного примера переменным #1 и #2 присваиваются значения 100 и 80 соответственно. В кадре N20 происходит проверка условия. Если значение переменной #1 больше значения переменной #2, то выполняется команда перехода GOTO к кадру окончания программы N40. В нашем случае выра-
жение считается справедливым, так как 100 больше, чем 80. В результате после
выполнения кадра N10 происходит переход к кадру N40, то есть кадр N30 не выполняется.

В этой же программе можно изменить значения переменных:

#1=100

#2=120

N10 G01 Х200
N20 IF [#1 GT #2] GOTO 40
N30 G01 Х300
N40M30


Во втором случае условие в кадре N20 не будет справедливым, так как 100 не больше, чем 120.

В результате после выполнения кадра N10 не происходит переход к кадру N40, то есть кадр N30 выполняется как обычно.

В выражении [#1 GT #2] используются операторы сравнения GT.

Команда WHILE

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

Если выражение не справедливо, то управление передается кадру, следующему за END.

%
О1000

#1=0

#2=1

WHILE [#2 LE 10] DO 1;

#1=#1+#2

#2=#2+1

END 1
M30
%

Кадр программы

Текст программы состоит из множества кадров. Кадр может (опционально) начинаться с символа пропуска кадра — «/» косой черты. За символом пропус-ка кадра (или в первой позиции, если он отсутствует) может следовать номер кадра (также опционально).
За номером кадра следуют специальные инструкции — слова1 (произволь-ное количество) или комментарии. Завершает кадр символ окончания строки2. Длина кадра ограничена 256 символами по стандарту ISO (примерно 4 строки на листе A4), чего обычно вполне достаточно. Отдельные системы ЧПУ могут иметь другие ограничения, поэтому в документации приводится формат кадра — условная запись кадра с максимальным объемом информации.
Пример кадра управляющей программы: /N0001 G0 X123.05

Примечание

% Символ начала и конца программы

О1000 Номер программы (1000)

По принятым соглашениям: в программе допускаются пустые строки (они игнорируются), допускаются пробелы и символы табуляции или их отсут-ствие (например, x 100 эквивалентно x100).

Регистр символов не учитывается (g и G эквивалентны).

Обычно система ЧПУ ограничивает количество знаков в дробной части чисел в тексте программы, например, ограничение может быть равно 0.0001. Помимо максимальной точности дроби в тексте программы необходимо также учитывать дискретность привода — минимальную величину перемещения рабочего органа при подаче одного управляющего импульса. Если дискретность привода по данной оси 0.01, то размеры необходимо задавать кратными дис-крете, т. е. 0.01
Незначащие нули в начале и конце числа допускается не указывать.

Таким образом, например,
G = G0 = G00, а G1=G01
Заметим также, что в одном кадре:

  • может находиться от 0 до 4-х слов, начинающихся с буквы G;
  • слова G, входящие в одну модальную группу, не могут встречаться в одном кадре (подробнее см. далее);
  • может находиться от 0 до 4-х M слов, но два слова из одной модальной группы не могут встречаться в одном кадре;
  • остальные символы могут быть в кадре в единственном числе.

Макрокоманда

Макропрограммой называется программа, которая находится в памяти СЧПУ и содержит различные макрокоманды. Макропрограмму можно вызывать из обычной программы с помощью G-кода аналогично постоянным циклам. При вызове макропрограммы существует возможность прямой передачи значений для переменных макропрограммы.
Команда G65 предназначена для немодального вызова макропрограммы.

Формат для этой команды следующий:
G65 P_ L_ A_ B_;
G65 – команда вызова макропрограммы;
P_ – номер вызываемой макропрограммы;
L_ – число повторений макропрограммы;
A_B_ – адреса и значения локальных переменных.

Пример:
G65 P2015 L2 A130 B400;

Макропрограмма вызывается два раза, соответствующим локальным переменным присваиваются значения 130 и 400.
Необходимо знать, какой локальной переменной присваивается значение с помощью того или иного адреса. Например, для СЧПУ Fanuc 0-MD будут справедливы следующие зависимости:

Адрес Переменная Адрес Переменная
A #1 Q #17
B #2 R #18
C #3 S #19
D #7 T #20
E #8 U #21
F #9 V #22
H #11 W #23
I #4 X #24
J #5 Y #25
K #6 Z #26
M #13

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

Внешние подпрограммы вызываются кодом М98 и не содержатся в теле главной программы.

В этом случае главная
программа и подпрограмма находятся в разных файлах.

Внутренняя подпрограмма выполняется, когда СЧПУ встречает код М97.
При этом адрес Р указывает на номер кадра, к которому нужно перейти, то есть
туда, где начинается внутренняя подпрограмма. Когда СЧПУ находит кадр с кодом окончания подпрограммы М99, то выполнение внутренней подпрограммы

завершается и управление передается кадру главной программы, следующему за
кадром, вызвавшим завершенную подпрограмму.
Внешние подпрограммы работают похожим образом. Когда в главной программе встречается кадр с кодом М98, то вызывается подпрограмма с номером,
установленным при помощи Р-адреса. При нахождении кода М99 управление
возвращается главной программе, то есть выполняется кадр главной программы,
следующий за кадром с М98. Учтите, что внешняя подпрограмма находится в отдельном файле. По сути, внешняя подпрограмма – это отдельная программа с индивидуальным номером, которая при желании может быть выполнена независимо
от главной программы. Для вызова подпрограммы необходимо, чтобы она находилась в памяти СЧПУ.
Пример УП с внутренней подпрограммой:


%
O1023 Программа № 1023
N10 G21 G40 G49 G54 G80 G90 Строка безопасности
N20 Т3 М06 Вызов инструмента № 3
N30 G43 H3 Компенсация длины инструмента
N40 M03 S1000 Включение оборотов шпинделя
N50 G00 X0 Y0 Позиционирование в X0 Y0
N60 Z0.5 Позиционирование в Z0.5
N70 M97 P200 Вызов внутренней подпрограммы
N80 M05 Выключение оборотов шпинделя
N90 M02 Окончание программы
N200 G01 X-0.5 F50 Начало внутренней подпрограммы
N210 X10 Y10 …
N220 Z0.5 …
M230 M99 Конец внутренней подпрограммы
%

При помощи L-адреса определяется, сколько раз нужно вызвать ту или иную подпрограмму.

Если подпрограмму нужно вызвать всего один раз, то L в кадре можно не указывать.
М98 Р1000 L4 – подпрограмма будет вызвана 4 раза.