Руководство по
макропрограммированию
PowerMILL 2012
Руководство пользователя
Макропрограммирование
Выпуск 4
Важные замечания
PowerMILL
Copyright 1996 - 2011 Delcam plc. Все права защищены.
Delcam plc не имеет возможности контролировать использование
программного продукта, описанного в настоящем руководстве, и не
несет ответственности за любые потери или повреждения, вызванные
использованием данного программного продукта. Мы сообщаем
пользователям, что все результаты, полученные при использовании
данного программного продукта, должны быть проверены
компетентным специалистом в соответствии с процедурами контроля
качества.
Функциональные возможности и пользовательский интерфейс,
описанные в настоящем руководстве, могут быть изменены в
последующих версиях программного продукта без уведомления
пользователей.
Программный продукт, описываемый в настоящем руководстве,
поставляется в соответствии с лицензионным соглашением и может
использоваться или копироваться только в соответствии с условиями
этого соглашения.
Создание макросов
Вы можете создавать макросы следующими способами:
Записывая последовательность команд,
выполняемых в PowerMILL.
Создавая собственные макросы в текстовом редакторе.
Основные шаги:
1 Создание основного макроса.
2 Добавление переменных.
3 Добавление циклов.
4 Выполнение макроса с аргументами.
5 Выбор, производимый в макросе.
6 Более подробно о функциях в макросе.
7 Использование оператора SWITCH.
8 Вывод значений из макроса.
9 Использование цикла FOREACH в макросе.
10 Использование массивов в цикле FOREACH.
Добавление переменных
Первые две строки в макросе example.mac одинаковые. Чтобы
минимизировать повторения (и для более лёгкого управления)
хорошим способом будет записать строку один раз, а затем
повторно вызывать её когда она понадобится. Чтобы сделать
это, необходимо создать локальную переменную, содержащую
текстовую строку.
Можно создавать различные типы переменных в PowerMILL. Для
сохранения строки, содержащей текст, необходимо использовать
переменную STRING.
1 Откройте файл example.mac в текстовом редакторе и
измените его на:
// Создание переменной, содержащей текст первой строки
STRING bottles = "10 green bottles sitting on the wall"
PRINT $bottles
PRINT $bottles
PRINT "And if 1 green bottle should accidentally fall"
PRINT "There will be 9 green bottles sitting on the wall"
Добавление циклов
В нашем макросе имеются две строки с одинаковым содержимым:
PRINT $bottles. В данном случае это допустимо, потому что эти
строки спользуются только дважды, но если вы захотите
повторить их 5 или 20 раз, будет лучше использовать цикл.
PowerMILL имеет три оператора циклов:
WHILE
DO - WHILE
FOREACH
2 Сохраните макрос.
// Начнём с 10 бутылок
INT Bottles = 10
// Начнём с 10 бутылок
INT Bottles = 10
// Начинаем с 10 бутылок
INT Bottles = 10
Основная схема:
$<переменная> = QUERY <string-prompt>
Например:
string yesnoprompt = "Вы ввели 12. Желаете ввести ещё одно
число?"
bool carryon = 0
$carryon = query $yesnoprompt
выводит такой диалог:
Сравнение переменных
Сравнение переменных позволяет проверить информацию и
задать образ действий при использовании операторов IF и
WHILE.
Результат сравнения либо истина, либо ложь. Когда истина –
результат равен 1, когда ложь – результат равен 0.
Операторы = и == различны.
Одиночный оператор равно, =, присваивает значение с правой
стороны левой стороне.
Двойной оператор равно, ==, сравнивает два значения на
равнозначность.
Если вы сравниваете значения в двух строках, вы должны
использовать правильный регистр.
Например, если вы желаете проверить является ли инструмент
концевой фрезой, тогда вы должны использовать:
Tool.Type == 'end_mill'
но не:
Tool.Type == 'End_Mill
Если вы не уверены в регистре строки, тогда вы можете
использовать одну из встроенных функций lcase() или ucase()
чтобы проверить варианты строки в нижнем или верхнем регистре
lcase(Tool.Type) == 'end_mill'
ucase(Tool.Type) == 'END_MILL'
Логические операторы
Логические операторы позволяют сделать больше, чем одно
сравнение одновременно. Есть четыре логических оператора:
AND
OR
XOR
NOT
// Объявление переменной
REAL factor = 0.6
REAL value = Tolerance * factor
// Присваивание
$Stepover = Tool.Diameter * factor
$factor = 0.75
Или
IF active(Tool.TipRadiused) AND Tool.Diameter < 5 {
// Выполняется, если активен скруглённый инструмент и
// его диаметр меньше 5.
}
Например:
MESSAGE "Радиальный шаг: " + string(Stepover)
Приоритет операторов
Порядок, в котором различные части выражения вычисляются,
влияет на результат. Приоритет операторов однозначно
определяет порядок, в котором вычисляются подвыражения.
Умножение и деление выполняются перед сложением и
вычитанием.
Например, 3 * 4 +2 тоже самое что и 2 + 3 * 4 и даёт
результат 14.
Выражение Эквивалент
a*-2 a * (- 2)
!x == 0 (!x) == 0
$a = -b + c * d – e $a = ((-b) + (c * d)) – e
$a = b + c % d – e $a = (b + (c % d)) – e
$x = y == z $x = (y == z)
$x = -t + q * r / c $x = ((-t) + ((q * r) / c))
$x = a % b * c + d $x = (((a % b) * c) + d)
$a = b <= c | d != e $a = ((b <= c) | (d != e))
$a = !b | c & d $a = ((!b) | (c & d))
$a = b mm * c in + d $a = (((b mm) * (c in)) + d)
Функция Main
Например, макрос:
MACRO MyTool.mac 6 "ToolName"
выдаст ошибку, так как макрос ожидает строку и затем число, а
задаётся число и затем строка.
Если вы хотите повторить последовательность команд в
различных точках в пределах макроса, вы можете использовать
функции.
FUNCTION Main() {
REAL Par1 = 2
REAL Par2 = 1
CALL Test(Par1, Par2)
// Выводит 2 – значение не меняется
PRINT $Par1
// Выводит 0 – значение изменено
PRINT $Par2
}
INCLUDE common.inc
FUNCTION Main(input string bound) {
FOREACH bou IN folder(bound) {
CALL CleanBoundary(bou.Name)
}
}
Чтобы вызвать этот макрос из PowerMILL:
Оператор IF
Оператор IF выполняет серию команд, когда встречаются
определённые условия.
Основная управляющая структура:
IF <выражение> {
Команды A
}
Команды B
Оператор SWITCH
SWITCH variable {
CASE (постоянная_A)
Команды A
CASE (постоянная_B)
Команды B
DEFAULT
Команды C
}
Команды D
SWITCH ToolAxis.Type {
CASE 'direction'
EDIT TOOLPATH LEADS RETRACTDIST "200.0"
EDIT TOOLPATH LEADS APPROACHDIST "200.0"
// Приступаем к выполнению
CASE 'vertical'
// Размещение точек "По допуску, сохраняя дуги"
EDIT FILTER TYPE STRIP
BREAK
DEFAULT
// Размещение точек "Переразместить"
EDIT FILTER TYPE REDISTRIBUTE
BREAK
}
....................................................
Например,
FOREACH item IN folder("path") {
Команды A
}
Команды B
Где <path> это папка в Проводнике, такая как Toolpath
(Траектории), Tool (Инструменты), Toolpath\Finishing и тд.
Внутри цикла FOREACH вы можете:
Остановить цикл, используя оператор BREAK.
Перейти непосредственно к следующему повторению,
используя оператор CONTINUE.
Цикл WHILE
Цикл WHILE многократно выполняет блоки команд до тех пор,
пока условие не является истинным.
Основная управляющая структура:
WHILE условие {
Команды A
}
Команды B
Если условие истинно, тогда выполняются Команды A.
Пока условие остаётся истинным, то выполняются Команды A.
Цикл DO - WHILE
Цикл DO - WHILE выполняет блоки команд и затем выполняет
проверку условия на истинность, в то время как цикл WHILE
сначала выполняет проверку условия и только потом решает,
выполнять команды или нет.
Основная управляющая структура:
DO {
Команды A
} WHILE условие
Команды B
Выполняются Команды A.
Пока условие остаётся истинным, выполняются Команды A
Когда условие ложно, выполняются Команды B.
Оператор CONTINUE
Оператор CONTINUE вызывает переход к проверке условия
любой структуры цикла - WHILE, DO - WHILE, и FOREACH в
которых он встречается, и начинает следующее повторение, если
таковые имеются.
Следующий пример рассчитывает и смещает все
незаблокированные границы наружу и внутрь.
Оператор RETURN
Оператор RETURN немедленно прекращает выполнение
текущего макроса. Это полезно, если обнаружена ошибка, и вы
не хотите продолжать выполнять оставшиеся команды в
макросе.
IF NOT active(entity('toolpath',TpName).Tool.TipRadius) {
// Ошибка, если траектория не использует
// скруглённый инструмент
PRINT "Траектория не содержит скруглённый инстр."
RETURN
}
FUNCTION Main() {
FOREACH tp IN folder('Toolpath') {
ACTIVATE TOOLPATH $tp.Name
CALL Calculate(tp.Name)
}
}
Тригонометрические функции
Основная структура тригонометрических функций:
Описание возвращаемого Функция
значенияя
Тригонометрический синус real sin( angle )
Тригонометрический косинус real cos( angle )
Тригонометрический тангенс real tan( angle )
Другой пример:
STRING One = "One"
STRING Two = "Two"
STRING CountToTwo = One + ", " + Two
PRINT = length(CountToTwo)
Командное окно отобразит результат 8.
Подстроки
Функция подстроки возвращает часть строки. Вы можете
определить, где начинается подстрока, а её длину. Исходная
строка не изменяется.
Основная структура is:
string substring( string str, int start, int length)
Например:
Функции пути
Функция пути возвращает часть имени пути элемента.
Основная структура функций пути:
Описание возвращаемого Функция
значения
Имя папки
Функция имени папки возвращает полное имя папки элемента
или пустую строку, если элемент не существует.
Основная структура:
string pathname( entity ref )
Или:
string pathname( string type, string name)
Возвращает полное имя папки элемента.
Например, если у вас есть инструмент BN 16.0 diam в папке
Ballnosed tools, тогда:
STRING path = pathname('tool', 'BN 16.0 diam')
PRINT = path
выведет строку Tool\Ballnosed tools\BN 16.0 diam.
Базовое имя
Функция базового имени возвращает суффикс, не являющийся
директорией пути.
Основная структура:
string basename( string path)
Обычно basename(pathname('tool',tp.Name)) тоже самое что и
tp.Name, но эту функцию можно использовать совместно с
функцией имени каталога, чтобы разделить на части имена папок.
Предположим, что траектории расположены в папках:
Toolpath\Элемент1\Черновая
Toolpath\Элемент1\Доработка
Toolpath\Элемент1\Чистовая
Toolpath\Элемент2\Черновая
Toolpath\Элемент2\Доработка
Toolpath\Элемент2\Чистовая
Можно переименовать все траектории таким образом, чтобы они
содержали имя элемента и индикатор (черновая, доработка или
чистовая).
FOREACH tp in folder('Toolpath') {
// Получение имени папки
STRING path = pathname(tp)
// Получение нижнего имени папки
STRING type = basename(dirname(path))
// Получение след. нижнего имени папки
STRING feat = basename(dirname(dirname(path)))
// Получение имени траектории
STRING base = basename(path)
// Создание нового имени траектории
STRING NewNamePrefix = feat + "-" + type
// Проверка,чтобы траектория не была уже переименована
IF position(base,NewNamePrefix) < 0 {
RENAME TOOLPATH $base ${NewNamePrefix+" " + base}
}
}
Функции параметров
Основная структура:
IF active(….) {
…
}
DIALOGS MESSAGE ON
DIALOGS ERROR ON
Графика
После запуска макроса PowerMILL обновляет экран каждый раз,
как сделано изменение. Если PowerMILL обновляет экран очень
часто, такое количество обновлений выглядит довольно
неприятно. Чтобы PowerMILL не обновлял экран во время
выполнения макроса, добавьте команду в начало макроса:
GRAPHICS LOCK
и затем, чтобы обновить экран только один раз после
выполнения всех команд, добавьте в конце макроса:
GRAPHICS UNLOCK
Частые вопросы
Как создать цикл для всех траекторий ?
Функция папки folder() возвращает все элементы в папках
Проводника. Например Machine Tools, Toolpaths, Tools,
Boundaries и тд.. Самый простой способ перебора всех
элементов заключается в использовании оператора FOREACH:
FOREACH tp IN folder('Toolpath') {
PRINT = tp.name
}
Функция папки возвращает все элементы в заданной папке и
во всех подпапках. Можно ограничить количество выводимых
элементов, указав конкретную подпапку для цикла:
FOREACH tp IN folder('Toolpath\semi-finishing') {
PRINT = tp.name
}
© Copyright Delcam plc 2011. All other trademarks are the property of their respective owners.