000121.

## 7.7.2. Выполнение подпрограммы и возврат из неё.

Если в подпрограмме не запрограммированы операторы передачи управления, то логическая последовательность выполнения кадров подпрограммы соответствует их физической последовательности. Возврат из подпрограммы при этом произойдёт по первой встретившейся функции М99.

Внимание! Возврат из подпрограммы происходит только по функции М99.

Поэтому при использовании операторов передачи управления следует так организовать управление программой, чтобы в любом случае кадр с М99 не был пропущен!

Если кадр с М99 не будет выполнен, то тем самым нарушится вся логическая последовательность выполнения основной программы. Что в конечном итоге приведёт к сбою.

Недопустимо также передавать управление кадрам подпрограммы без её вызова, то есть минуя технологический кадр с адресом Р.

В общем случае, программируя операторы передачи управления, можно выполнить фрагменты программы, физически не входящие в подпрограмму. Однако, правильно организованное управление позволяет выполнить нужный фрагмент логически в подпрограмме.

Пример:
NP01A10B100C5.5
N0101X#24
.
.
.
.
NM02:01
#A==11(150)
#X=#B-#A#(151)
N0150#X=#C
N0151M99
Правильное программирование.

После выполнения подпрограммы Р01 должен выполняться кадр N0101.

В подпрограмме Р01 произойдёт проверка на равенство параметра #A числу 11. При выполнении этого равенства управление будет передано кадру N0150, после которого выполнится функция М99. При невыполнении условия (как в нашем случае) после выполнения выражения #X=#B-#A управление безусловно передаётся кадру N0151, то есть М99 будет выполнена.

Таким образом, хотя в подпрограмме вычисляются различные задания на перемещения по оси Х, кадр N101, где это перемещение запрограммировано, всегда выполняется.

Пример:
NP01A10B100C5.5
N101X#24
.
.
.
M02
:01
#A==11(152)
#X=#B-#A
N0151M99
N0152#X=#C#(-151)
Программирование правильное.

Хотя кадр N0152 физически не включён в подпрограмму, безусловный оператор передачи управления (-151) передаёт управление кадру с М99, таким образом обеспечивая логическое выполнение кадра N0152 в подпрограмме.

Пример:
NP01A10B100C5.5
N101X#24
.
.
.
.
NM02
:01
#A==11(152)
#X=#B-#A
N0151M99
N0152#X=#C
Программирование неправильное.
После выполнения кадра N0152 не произойдёт возврат из подпрограммы, будет отрабатываться следующий за N0152 кадр, а не N101.
NP01A10B100C5.5
N0101X#24
.
.
.
.
NM02
:01
#A==11(152)
#X=#B-#A
Т0151Ь99
Т0152№Ч=№С№(-101)
Программирование неправильное.

Хотя управление в любом случае передаётся кадру N0101, но после кадра N0152 это производится безусловный оператором передачи управления, что неверно, потому что управление на N0152 было передано в подпрограмме, следовательно, возврат должен программироваться только по М99.

Конструкции, подобные последней, в конце концов, приводят к сбою.
Пример:
#(120)
NP01A10B100C5.5
N101X#24
.
.
.
.
:01
N0120#A==11(150)
#X=#B-#A#(151)
N0150#X=#C
N0151M99
Программирование неправильное.

Безусловный оператор передачи управления #(120) передаёт управление кадру подпрограмм помимо обращения к ней.

Это вызовет сообщение об ошибке.

Примечание:

Нельзя программировать М99 в вычислительном кадре. Контроль правильности логического выполнения вызовов и возвратов из подпрограмм не производится.