1. Використання O-кодів
O-коди забезпечують контроль потоку в NC-програмах. Кожен блок має відповідний номер, який використовується після O. Необхідно ретельно підбирати O-номери. O-коди використовують букву «O», а не цифру нуль як перший символ у номері, наприклад O100 або o100. O-коди також іноді називають o-словами, і ці терміни є взаємозамінними.
|
Note
|
Використання малої літери «o» полегшує відмінність від 0, який, можливо, був надрукований з помилкою. Наприклад, «o100» легше побачити, ніж «O100», що це не «0». |
2. Нумерація
Нумеровані o-коди повинні мати унікальний номер для кожної підпрограми,
(початок o100) o100 sub (зверніть увагу, що блок if-endif використовує інший номер) (початок o110) o110 if [#2 GT 5] (тут якийсь код) (кінець o110) o110 endif (тут ще якийсь код) (кінець o100) o100 endsub
3. Коментарі
Коментарі в тому ж рядку, що й слово на літеру «о», не слід використовувати, оскільки така поведінка може змінитися в майбутньому.
Поведінка невизначена, якщо:
-
Один і той самий номер використовується для кількох блоків.
-
Інші слова використовуються в рядку зі словом на літеру «о».
-
Коментарі використовуються в рядку зі словом, що починається з літери «о».
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]
Тіла підпрограм не можуть бути вкладеними. Вони можуть бути викликані тільки після того, як вони визначені. Вони можуть бути викликані з інших функцій і можуть викликати себе рекурсивно, якщо це має сенс. Максимальний рівень вкладення підпрограм становить 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. Виклик файлів
Щоб викликати окремий файл з іменем підпрограми, файл повинен мати таку саму назву, як і ваш виклик, і містити sub та endsub у файлі. Файл повинен знаходитися в каталозі, на який вказує PROGRAM_PREFIX або SUBROUTINE_PATH в файлі INI. Ім’я файлу може містити тільки малі літери, цифри, тире та підкреслення. Файл підпрограми з іменем може містити тільки одне визначення підпрограми.
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
Щоб ці помилки не були фатальними попередженнями на stderr, встановіть біт 0x20 в ініціальній опції маски [RS274NGC]FEATURE=.