1. Використання O-кодів
O-коди забезпечують контроль потоку в NC-програмах. Кожен блок має відповідний номер, який використовується після O. Необхідно ретельно підбирати O-номери. O-коди використовують букву «O», а не цифру нуль як перший символ у номері, наприклад O100 або o100. O-коди також іноді називають o-словами, і ці терміни є взаємозамінними.
|
Note
|
Використання малої літери «o» полегшує відмінність від 0, який, можливо, був надрукований з помилкою. Наприклад, «o100» легше побачити, ніж «O100», що це не «0». |
2. Нумерація
There are two categories of o-codes with different scoping rules:
Subroutine definitions (sub/endsub, call) are global. Each subroutine must have a unique number or name across the entire program and all called files.
Control flow (if/endif, while/endwhile, do/while, repeat/endrepeat, break, continue) are local to the subroutine or main program where they appear. The interpreter automatically scopes them, so o100 if inside o<helper> does not conflict with o100 if in the main program or in any other subroutine. You can safely reuse the same o-numbers for control flow in different subroutines.
Within a single subroutine body (or the main program), each o-number should still be used for only one control flow block.
(the start of o100) o100 sub (notice that the if-endif block uses a different number within this sub) (the start of o110) o110 if [#2 GT 5] (some code here) (the end of o110) o110 endif (some more code here) (the end of o100) o100 endsub
(o100 if in helper.ngc does not conflict with o100 if in another.ngc) (file: helper.ngc) o<helper> sub o100 if [#1 GT 5] (do something) o100 endif o<helper> endsub (file: another.ngc) o<another> sub o100 if [#1 LT 0] (do something else) o100 endif o<another> endsub
3. Коментарі
Коментарі в тому ж рядку, що й слово на літеру «о», не слід використовувати, оскільки така поведінка може змінитися в майбутньому.
Поведінка невизначена, якщо:
-
The same number is used for more than one block within the same scope (see [Numbering] for scoping rules).
-
Інші слова використовуються в рядку зі словом на літеру «о».
-
Коментарі використовуються в рядку зі словом, що починається з літери «о».
4. Підпрограми
Підпрограми починаються з oNNN sub і закінчуються oNNN endsub. Рядки між oNNN sub і oNNN endsub не виконуються, поки підпрограма не буде викликана за допомогою oNNN call. Кожна підпрограма повинна використовувати унікальний номер.
o100 sub G53 G0 X0 Y0 Z0 (швидкий перехід до машинного дому) o100 endsub (викликається підпрограма) o100 call M2
Всередині підпрограми можна виконати o-return. Це негайно повертає викликаючу програму, так само, як якщо б було виявлено o-endsub.
o100 sub (перевірити, чи параметр №2 більший за 5) o110 якщо [#2 GT 5] (повернутися до початку підпрограми, якщо перевірка є істинною) o100 повернути o110 endif (це виконується тільки якщо параметр #2 не більший за 5) (DEBUG, параметр 1 є [#1]) o100 endsub
Див. розділи Бінарні оператори та Параметри для отримання додаткової інформації.
o- Call приймає до 30 необов’язкових аргументів, які передаються до підпрограми як #1, #2 , …, #N. Параметри від #N+1 до #30 мають те саме значення, що і в контексті виклику. Після повернення з підпрограми значення параметрів від #1 до #30 (незалежно від кількості аргументів) будуть відновлені до значень, які вони мали до виклику. Параметри #1 - #30 є локальними для підпрограми.
Оскільки 1 2 3 розбирається як число 123, параметри мають бути взяті в квадратні дужки. Наступна команда викликає підпрограму з 3 аргументами:
o100 sub (перевірити, чи параметр №2 більший за 5) o110 if [#2 GT 5] (повернутися до початку підпрограми, якщо перевірка справжня) o100 повернення o110 endif (це виконується тільки якщо параметр №2 не більший за 5) (DEBUG, параметр 1 є [№1]) (DEBUG, параметр 3 є [№3]) o100 endsub o100 call [100] [2] [325]
Subroutine definitions may not be nested. Defining a subroutine inside another subroutine is not allowed and will produce an error. For example, the following is invalid:
o<outer> sub o100 sub (INVALID: nested subroutine definition) (code here) o100 endsub o<outer> endsub
However, calling a subroutine from within another subroutine is perfectly valid. It is the sub/endsub definition that cannot be nested, not the call:
o<outer> sub (code here) o<helper> call [1] [2] (OK: calling another sub) o<outer> endsub
Other O-code control flow such as if/endif, while/endwhile, do/while, and repeat/endrepeat may be used freely inside subroutines.
Subroutines may only be called after they are defined. They may be called from other functions, and may call themselves recursively if it makes sense to do so. The maximum subroutine nesting level is 10.
Підпрограми можуть змінювати значення параметрів вище #30, і ці зміни будуть видимі для викличного коду. Підпрограми також можуть змінювати значення global named parameters (тобто параметрів, імена яких починаються з символу підкреслення "_").
4.1. Нумеровані програми в стилі Fanuc
Пронумеровані програми (як основні, так і підпрограми), виклик «M98» і повернення «M99» M-кодів, а також їх відповідні семантичні відмінності є альтернативою описаним вище підпрограмам rs274ngc, що забезпечують сумісність з Fanuc та іншими контролерами верстатів.
Нумеровані програми ввімкнено за замовчуванням, і їх можна вимкнути, додавши DISABLE_FANUC_STYLE_SUB = 1 до розділу [RS274NGC] файлу .ini.
|
Note
|
Пронумеровані визначення та виклики основних і підпрограм відрізняються від традиційних rs274ngc як за синтаксисом, так і за виконанням. Щоб зменшити ймовірність плутанини, інтерпретатор видасть помилку, якщо визначення одного стилю будуть змішані з викликами іншого. |
o1 (Приклад 1) ; Основна програма 1, «Приклад 1» M98 P100 ; Виклик підпрограми 100 M30 ; Кінець основної програми o100 ; Початок підпрограми 100 G53 G0 X0 Y0 Z0 ; Швидкий перехід до вихідної позиції верстата M99 ; Повернення з підпрограми 100
Опціональний початковий блок основної програми присвоює основній програмі номер «1». Деякі контролери трактують опціональний коментар у дужках як назву програми, в даному прикладі «Приклад 1», але це не має особливого значення в інтерпретаторі rs274ngc.
Викликати підпрограму з номером. Блок M98 P100 аналогічний традиційній синтаксичній конструкції o100 call, але може використовуватися тільки для виклику наступної підпрограми з номером, визначеної за допомогою o100…M99. Опціональне слово L визначає кількість циклів.
Головну програму необхідно завершити командою M02 або M30 (або M99; див. нижче).
Позначає початок нумерованого визначення підпрограми. Блок o100 подібний до o100 sub, за винятком того, що його потрібно розмістити у файлі пізніше, ніж блок виклику M98 P100.
Блок M99 аналогічний традиційному синтаксису o100 endsub, але може завершувати тільки пронумеровану програму (o100 у цьому прикладі) і не може завершувати підпрограму, що починається з синтаксису o100 sub.
Виклик підпрограми M98 відрізняється від виклику o rs274ngc наступним чином:
-
Пронумерована підпрограма повинна йти після виклику
M98у файлі програми. Інтерпретатор викличе помилку, якщо підпрограма передує блоку виклику. -
Параметри
#1,#2, …,#30є глобальними і доступними в пронумерованих підпрограмах, подібно до параметрів з вищими номерами в традиційних викликах. Зміни цих параметрів у підпрограмі є глобальними і зберігаються після повернення підпрограми. -
M98Виклики підпрограм не мають повертаного значення. -
Блоки виклику підпрограми
M98можуть містити опціональне L-слово, що визначає кількість повторень циклу. Без L-слова підпрограма буде виконана тільки один раз (еквівалентноM98 L1). БлокM98 L0не буде виконувати підпрограму.
У рідкісних випадках M-код M99 може використовуватися для завершення основної програми, де він позначає «нескінченну програму». Коли інтерпретатор досягає M99 в основній програмі, він повертається до початку файлу і продовжує виконання з першого рядка. Прикладом використання нескінченної програми є цикл розігріву машини; блок видалення програми end /M30 може бути використаний для зупинки циклу в зручний момент, коли оператор готовий.
o1 ; Основна програма 1 #1 = 0 (PRINT,X MAIN BEGIN: 1=#1) M98 P100 L5 ; Виклик підпрограми 100 (PRINT,X MAIN END: 1=#1) M30 ; Завершити основну програму o100 ; Підпрограма 100 #1 = [#1 + 1] M98 P200 L5 ; Виклик підпрограми 200 (PRINT,>> o100: #1) M99 ; Повернення з підпрограми 100 o200 ; Підпрограма 200 #1 = [#1 + 0.01] (PRINT,>>>> o200: #1) M99 ; Повернення з підпрограми 200
У цьому прикладі параметр #1 ініціалізується значенням 0. Підпрограма o100 викликається п’ять разів у циклі. Вбудована в кожен виклик o100, підпрограма o200 викликається п’ять разів у циклі, загалом 25 разів.
Зверніть увагу, що параметр #1 є глобальним. В кінці основної програми, після оновлень у межах o100 та o200, його значення дорівнюватиме 5.25.
5. Цикл
Цикл «while» має дві структури: «while/endwhile» і «do/while». У кожному випадку цикл завершується, коли умова «while» оцінюється як хибна. Різниця полягає в тому, коли виконується умова перевірки. Цикл «do/while» виконує код у циклі, а потім перевіряє умову перевірки. Цикл «while/endwhile» спочатку виконує перевірку.
(намалюйте фігуру у вигляді пилки) G0 X1 Y0 (перемістіться у вихідне положення) #1 = 0 (присвойте параметру #1 значення 0) F25 (встановіть швидкість подачі) o101 while [#1 LT 10] G1 X0 G1 Y[#1/10] X1 #1 = [#1+1] (збільшити лічильник тестів) o101 endwhile M2 (завершити програму)
#1 = 0 (присвоїти параметру #1 значення 0) o100 do (debug, параметр 1 = #1) o110 if [#1 EQ 2] #1 = 3 (присвоїти параметру #1 значення 3) (msg, #1 присвоєно значення 3) o100 continue (перейти до початку циклу) o110 endif (тут якийсь код) #1 = [#1 + 1] (збільшити лічильник тесту) o100 while [#1 LT 3] (msg, Цикл завершено!) M2
У циклі while оператор «o-break» негайно виходить із циклу, а оператор «o-continue» негайно переходить до наступної оцінки умови «while». Якщо вона все ще є істинною, цикл починається знову з початку. Якщо вона є хибною, цикл завершується.
6. Умовний
Умова «if» складається з групи операторів з однаковим номером «o», які починаються з «if» і закінчуються «endif». Опціональні умови «elseif» і «else» можуть бути між початковим «if» і кінцевим «endif».
Якщо умова «if» має значення true, то виконується група операторів, що йдуть після «if» до наступного рядка умови.
Якщо умова «if» оцінюється як хибна, то умови «elseif» оцінюються по порядку, поки одна з них не буде оцінена як істинна. Якщо умова «elseif» є істинною, то виконуються оператори, що йдуть за «elseif» аж до наступного умовного рядка. Якщо жодна з умов «if» або «elseif» не оцінюється як істинна, то виконуються оператори, що йдуть за «else». Коли умова оцінюється як істинна, інші умови в групі більше не оцінюються.
(якщо параметр №31 дорівнює 3, встановленим S2000) o101 if [#31 EQ 3] S2000 o101 endif
(якщо параметр № 2 більший за 5, встановити F100) o102 якщо [№ 2 GT 5] F100 o102 інакше якщо [№ 2 LT 2] (інакше, якщо параметр № 2 менший за 2, встановити F200) F200 (інакше, якщо параметр № 2 становить від 2 до 5, встановити F150) o102 else F150 o102 endif
Кілька умов можна перевірити за допомогою операторів elseif, доки шлях else нарешті не буде виконано, якщо всі попередні умови хибні:
(якщо параметр № 2 більший за 5, встановити F100) o102 якщо [№ 2 GT 5] F100 (інакше, якщо параметр № 2 менше 2, встановити F200) o102 elseif [№ 2 LT 2] F20 (параметр № 2 знаходиться в діапазоні від 2 до 5) o102 else F200 o102 endif
7. Повторити
Команда «repeat» виконає оператори всередині repeat/endrepeat задану кількість разів. У цьому прикладі показано, як можна фрезерувати діагональний ряд фігур, починаючи з поточної позиції.
(Фрезерування 5 діагональних форм) G91 (Інкрементальний режим) o103 повторення [5] ... (вставити код фрезерування тут) G0 X1 Y1 (діагональне переміщення до наступної позиції) o103 кінцеве повторення G90 (Абсолютний режим)
8. Непрямий
o-число може бути задане параметром та/або розрахунком.
o[#101+2] call
Щоб отримати додаткові відомості про обчислення значень, див. наступні розділи:
9. Виклик файлів
To call a separate file with a subroutine name the file the same as your call and include a sub and endsub in the file. The file must be in the directory pointed to by PROGRAM_PREFIX or SUBROUTINE_PATH in the INI file. The file name can include lowercase letters, numbers, dash, and underscore only. A named subroutine file can contain only a single subroutine definition. Do not place additional numbered subroutine definitions (e.g. o100 sub) in the same file as a named subroutine. Numbered subroutines share a global namespace and can silently conflict across files. If you need helper subroutines, place each one in its own file.
o<myfile> callo123 callУ викликаному файлі необхідно включити oxxx sub та endsub, а сам файл має бути коректним.
(ім'я файлу myfile.ngc) o<myfile> sub (code here) o<myfile> endsub M2
|
Note
|
Імена файлів складаються тільки з малих літер, тому o<MyFile> інтерпретатор перетворює на o<myfile>. Більше інформації про шлях пошуку та параметри шляху пошуку наведено в розділі конфігурації INI. |
10. Значення, що повертаються підпрограмою
Підпрограми можуть необов’язково повертати значення за допомогою необов’язкового виразу в операторі endsub або return.
o123 return [#2 *5] ... o123 endsub [3 * 4]
Значення, яке повертає підпрограма, зберігається в <_value> predefined named parameter , а попередньо визначений параметр <_value_returned> встановлюється на 1, щоб вказати, що значення було повернуто. Обидва параметри є глобальними і очищаються безпосередньо перед наступним викликом підпрограми.
11. Помилки
Наступні оператори викликають повідомлення про помилку та переривають роботу інтерпретатора:
-
returnабоendsubпоза межами визначення підрядка -
мітка для
repeat, яка визначена в іншому місці -
мітка на
while, яка визначена в іншому місці та не посилається наdo -
мітка для
if, визначена в іншому місці -
невизначена мітка для
elseабоelseif -
мітка для
else,elseifабоendifне вказує на відповіднийif -
мітка на
breakабоcontinue, яка не вказує на відповіднийwhileабоdo -
мітка на
endrepeatабоendwhileбез посилання на відповіднийwhileабоrepeat -
a subroutine definition (
sub) inside another subroutine body (nested definitions) -
a numbered subroutine called from within a named subroutine file but not found in the offset table or as a separate file
Щоб ці помилки не були фатальними попередженнями на stderr, встановіть біт 0x20 в ініціальній опції маски [RS274NGC]FEATURE=.