Методика работы с NC-подпрограммами
В существующих системах ЧПУ приняты различные способы оформления подпрограмм в управляющей программе (УП), однако по критерию расположения текста подпрограмм относительно строк основной программы можно выделить несколько типичных случаев:
Подпрограммы выводятся в УП до вывода основной программы;
Подпрограммы выводятся в УП после вывода основной программы;
Подпрограммы выводятся в УП в месте первого вызова;
Подпрограммы не поддерживаются, и текст подпрограммы выводится при каждом вызове.
Рассмотрим, каким образом можно реализовать каждый из указанных случаев.
Подпрограммы выводятся в УП до вывода основной программы
Данный формат вывода предполагает, что в управляющую программу в самом начале выводятся все имеющиеся подпрограммы, затем вставляется основная программа, содержащая строки вызова подпрограмм.
Для вывода подпрограмм в самом начале, следует вставить соответствующий код в процедуру обработки технологической команды <PARTNO>, которая выполняется первой. Вид процедуры показан ниже.
PROGRAM PARTNO
! Инициализация переменных
! Вывод строк, идентифицирующих начало секции подпрограмм
NCSub.Output ! Вывод всех имеющихся подпрограмм
! Вывод строк, идентифицирующих конец секции подпрограмм и
! начало секции основной программы
! Инициализация переменных
END
С целью формирования строк управляющей программы, идентифицирующих начало, конец и вызов NC-подпрограммы, следует написать процедуру – обработчик технологических команд <PPFUN STARTSUB(50)>, <PPFUN ENDSUB(51)> и <PPFUN CALLSUB(52)> как показано ниже.
program PPFun
if CLD[1]=50 then begin ! Команда StartSub
! Вывод строки, идентифицирующей начало
! подпрограммы (здесь "oИмяПодпрограммы"):
Output "o"+NCSub.Name(CLD[2])
! Присвоение начальной метке текущего
! значения из регистра номера кадра:
NCSub.StartLabel(CLD[2]) = Str(BlockN)
end
else if CLD[1]=51 then begin ! Команда EndSub
! Вывод строки, идентифицирующей конец подпрограммы (здесь
! "Nxx M99", где Nxx - номер кадра):
FormBlock
Output OutStr$ + " M99"
! Присвоение конечной метке значения из регистра номера кадра:
NCSub.EndLabel(CLD[2]) = Str(BlockN)
end
else if CLD[1]=52 then begin ! Команда CallSub
! Вывод строки вызова подпрограммы вида "Nxx M98 Nbb,Nee", где
! Nxx - текущий кадр,
! Nbb - кадр начала подпр.,
! Nee - кадр конца подпрограммы:
FormBlock
Output OutStr$+" M98 "+
NCSub.StartLabel(CLD[2])+","+
NCSub.EndLabel(CLD[2])
NCSub.Output(CLD[2],0) ! Холостой прогон подпрограммы
end
end
В данном примере в качестве начальной и конечной меток присваиваются текущие значения из регистра номера кадра, однако при включенной автоматической нумерации подобные действия производятся автоматически и указанный код необязателен. Он приведен только для примера.
В операторе вывода NC-подпрограммы <NCSUB.OUTPUT> указан режим 0, однако, т.к. все подпрограммы уже выведены в управляющую программу ранее, можно не указывать данный параметр, что будет означать вывод в режиме 1 ("только в первый раз").
Подпрограммы выводятся в УП после вывода основной программы
Предполагается, что текст основной УП вместе со строками вызова NC-подпрограмм располагается перед кодом самих подпрограмм. В этом случае оператор вывода NC-подпрограмм помещается в процедуру обработки технологической команды, которая обрабатывается последней – <FINI>. Общий вид процедуры представлен ниже:
program Fini
! Вывод строк, идентифицирующих конец секции основной программы и
! начало секции подпрограмм
! Инициализация переменных
NCSub.Output ! Вывод всех имеющихся подпрограмм
! Вывод строк, идентифицирующих конец секции подпрограмм
end
Пример обработчика для технологических команд начала, конца и вызова подпрограмм (<PPFUN STARTSUB(50)>, <PPFUN ENDSUB(51)> и <PPFUN CALLSUB(52)>) в сравнении с предыдущим случаем не изменяется. Величины, возвращаемые функциями работы с метками (<NCSUB.STARTLABEL> и <NCSUB.ENDLABEL>), до момента окончания трансляции имеют значения по умолчанию вида <SLabelNxxx> и <ELabelNxxx>, где <xxx> – номер NC-подпрограммы, т.к. реальные значения меток на момент запроса еще не определены. Реальные значения меток подставляются лишь после окончания трансляции управляющей программы в целом.
Подпрограммы выводятся в УП в месте первого вызова
В данном случае подпрограмма является частью основной программы, обращение к которой может быть произведено повторно, указанием, например, начального и конечного кадров. Таким образом, подпрограмма выводится при первом вызове как часть основного кода, а при последующих – как вызов существующего кода. Весь код, отвечающий за NC-подпрограммы, помещается в процедуру обработки технологических команд начала, конца и вызова подпрограмм (<PPFUN STARTSUB(50)>, <PPFUN ENDSUB(51)> и <PPFUN CALLSUB(52)>).
program PPFun
if CLD[1]=50 then begin ! Команда StartSub
! Присвоение начальной метке текущего значения из регистра
! номера кадра:
NCSub.StartLabel(CLD[2]) = Str(BlockN)
end
else if CLD[1]=51 then begin ! Команда EndSub
! Присвоение конечной метке значения из регистра номера кадра
NCSub.EndLabel(CLD[2]) = Str(BlockN)
end
else if CLD[1]=52 then begin ! Команда CallSub
if NCSub.Output(CLD[2])=0 then begin ! Если вывод подпрограммы был
! Вывод строки вызова подпрограммы вида "Nxx M98 Nbb,Nee", где
! Nxx - текущий кадр,
! Nbb - кадр начала подпрограммы,
! Nee - кадр конца подпрограммы
FormBlock
Output OutStr$+" M98 "+
NCSub.StartLabel(CLD[2])+","+
NCSub.EndLabel(CLD[2])
end
end
end
В приведенном примере первый вызов оператора <NCSUB.OUTPUT(CLD[2])> для каждой подпрограммы осуществит вывод NC-подпрограммы в управляющую программу и вернет значение 1. При каждом последующем вызове, будет осуществлен "холостой прогон" и будет возвращено значение 0, а в управляющую программу будет добавлена строка вызова соответствующей подпрограммы.
В данном примере в качестве начальной и конечной меток присваиваются текущие значения из регистра номера кадра. При включенной автоматической нумерации эти действия производятся автоматически, и в случае если нумерация начальных и конечный кадров подпрограммы будет совпадать с автоматически присваиваемыми значениями, указанный код необязателен.
Подпрограммы не поддерживаются
В тех случаях, когда система ЧПУ не поддерживает использование подпрограмм, а последовательность технологических команд содержит NC-подпрограммы и их вызов, то можно осуществить своеобразное "развертывание" NC-подпрограмм, т.е. во всех местах вызова подпрограммы следует вставить вместо строки вызова саму подпрограмму. Для этого в процедуру обработки команды вызова подпрограммы <PPFUN CALLSUB(52)> следует вставить код следующего вида:
program PPFun
if CLD[1]=52 then begin ! Команда CallSub
NCSub.Output(CLD[2], 2) ! Вывод подпрограммы в любом случае
end ! (режим 2)
end
Обработка команд начала и конца подпрограмм в данном случае не требуется.
Сопутствующие ссылки:
Операторы работы с NC-подпрограммами
Оператор вывода NC-подпрограммы <NCSUB.OUTPUT>
Оператор определения имени NC-подпрограммы <NCSUB.NAME>
Оператор определения начальной метки NC-подпрограммы <NCSUB.STARTLABEL>
Оператор определения конечной метки NC-подпрограммы <NCSUB.ENDLABEL>