Методика работы с 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>