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

Див. розділи G53, G0 та M2 для отримання додаткової інформації.

O- Повернення

Всередині підпрограми можна виконати o-return. Це негайно повертає викликаючу програму, так само, як якщо б було виявлено o-endsub.

Приклад повернення O-
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 аргументами:

Приклад виклику O
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
o1 (Назва)

Опціональний початковий блок основної програми присвоює основній програмі номер «1». Деякі контролери трактують опціональний коментар у дужках як назву програми, в даному прикладі «Приклад 1», але це не має особливого значення в інтерпретаторі rs274ngc.

M98 P- <L->

Викликати підпрограму з номером. Блок M98 P100 аналогічний традиційній синтаксичній конструкції o100 call, але може використовуватися тільки для виклику наступної підпрограми з номером, визначеної за допомогою o100M99. Опціональне слово L визначає кількість циклів.

M30

Головну програму необхідно завершити командою M02 або M30 (або M99; див. нижче).

Початок визначення підпрограми O-

Позначає початок нумерованого визначення підпрограми. Блок o100 подібний до o100 sub, за винятком того, що його потрібно розмістити у файлі пізніше, ніж блок виклику M98 P100.

Повернення M99 з нумерованої підпрограми

Блок 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 (завершити програму)
Приклад виконання While
#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». Коли умова оцінюється як істинна, інші умови в групі більше не оцінюються.

Приклад Endif
(якщо параметр №31 дорівнює 3, встановленим S2000)
o101 if [#31 EQ 3]
  S2000
o101 endif
Якщо ElseIf Else 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 нарешті не буде виконано, якщо всі попередні умови хибні:

Приклад If Elseif Else Endif
(якщо параметр № 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> call
Приклад нумерованого файлу
o123 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=.