Определение структуры и формата кадра (формирование списка регистров)


Для определения структуры и формата кадра управляющей программы необходимо сформировать список регистров и определить их параметры.

Кадр управляющей программы состоит из слов, каждое слово содержит адрес и значение. <Адрес> – буква (иногда несколько букв), <Значение> – число представленное в определенном формате. С каждым адресом в постпроцессоре связан определенный <Регистр>.

Понятие <Регистра> в постпроцессоре объединяет следующие свойства:

идентификатор регистра (адрес в управляющей программе);

формат вывода значения этого адреса в кадр;

текущее значение, соответствующее адресу;

предыдущее значение, соответствующее адресу;

имя регистра (переменная постпроцессора, связанная с адресом, через которую производится доступ как к текущему, так и к предыдущему значению регистра).

Постпроцессор имеет средства автоматического формирования кадра управляющей программы. Происходит это так: перебираются регистры по порядку, начиная с первого; если старое и текущее значения регистра различаются, то регистр выводится в кадр, а его старое значение приравнивается текущему. Если старое и текущее значения регистра равны, то регистр в кадр не выводится.

При выводе регистра в кадр управляющей программы сначала записывается его идентификатор, а затем текущее значение регистра. Число выводится в кадр в соответствии с описанным в регистре форматом (количество знаков целой части числа, количество знаков дробной части числа, наличие десятичной точки, знака, лидирующих и незначащих нулей).

Таким образом, для того, чтобы определить структуру и формат кадра управляющей программы необходимо заполнить список регистров и задать их свойства. Регистры должны быть расположены в том же порядке, в котором их идентификаторы и значения должны появляться в кадре управляющей программы. Данное правило действительно для программ обработки технологических команд. При формировании кадра по шаблону порядок вывода значений соответствует порядку регистров в шаблоне.

Примечание: Разные регистры не должны иметь одинаковые имена, но у них могут быть одни и те же идентификаторы (адреса слов в кадре управляющей программе). Это позволяет создавать отдельный регистр для каждой группы функций одного типа.

Например, для подготовительной функции переключения абсолютной/относительной системы отсчета создается регистр с именем <ABSOLUTE> и идентификатором <G>. А для подготовительных функций позиционирования, линейной интерполяции и интерполяции по окружности создается регистр с именем <INTERP> и таким же идентификатором <G>. Это позволит, во-первых, при необходимости, вывести обе эти команды в один кадр управляющей программы (например, <N190 G91 G1 X50 Y30>). А, во-вторых, по текущим значениям регистров <ABSOLUTE> и <INTERP> отслеживать текущий режим перемещений (позиционирование, линейная или круговая интерполяция) и в какой системе отсчета (абсолютной или относительной) задаются координаты.

 

Список регистров отображается в левой части главного окна.

 

f_clip0461

 

Окно редактирования свойств регистра открывается двойным нажатием левой клавиши мыши на строке регистра, либо нажатием кнопки f_clip0434 на панели инструментов.

 

f_clip0462

 

В левой части окна отображается список регистров. Выше находятся кнопки редактирования списка регистров:

f_clip0463 – создать новый регистр, созданный регистр помещается после текущего;

f_clip0464 – удалить текущий регистр;

f_clip0465 – скопировать текущий регистр в буфер обмена;

f_clip0466 – вставить регистр из буфера обмена после текущего;

f_clip0467 – переместить текущий регистр вверх по списку;

f_clip0468 – переместить текущий регистр вниз по списку.

Поменять порядок расположения регистров можно, нажав левую клавишу мыши на номере регистра и, не отпуская левой клавиши, переместить его в нужную позицию.

 

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

<Идентификатор регистра> – символы, выводящиеся в кадр управляющей программы перед значением регистра (адрес слова в кадре управляющей программы).

<Десятичная точка> – может иметь несколько значений:

<Отсутствует>;

<Присутствует> – выбор этого варианта значит, что точка будет стоять только тогда, когда значение регистра будет иметь дробную часть;

<Присутствует всегда>.

<Знаков до десятичной точки> – максимальное количество знаков в целой части числа.

<Знаков после десятичной точки> – количество знаков в дробной части числа.

<Лидирующие нули> и <Незначащие нули> – управление выводом нулей перед и после значения регистра.

<Знак> – управление выводом знака значения регистра. Возможны:

<Без знака>;

<Только "-">;

<Всегда "-" и "+">.

<Имя регистра> – имя, с которым оперируют программы обработки команд.

<Комментарий> – комментарий к регистру.

 

Кнопка <Импорт> предназначена для импорта списка регистров из постпроцессоров форматов <SPPX>, <SPP>, <PPP> (формат старой версии), а так же из постпроцессоров SurfCAM.

Для формирования списка регистров на основе управляющей программы предназначена кнопка <Анализ>. При этом анализируется текст указанной управляющей программы и все найденные адреса добавляются в список регистров.

При закрытии окна кнопкой <ОК> все внесенные изменения сохраняются. Если окно закрыто нажатием кнопки <Отмена>, то изменения игнорируются. При нажатии на кнопку <Применить> все внесённые изменения сохраняются, окно редактирования регистров не закрывается.

 

Текущее значение регистра доступно в программном коде в виде обычной переменной с именем регистра. Чтобы получить предыдущее значение регистра можно использовать имя регистра со значком @. Например:

 

program AbsMov

  Len1: Real  

  Len1 = sqr((X-X@)^2 + (Y-Y@)^2 + (Z-Z@)^2) ! Here X, Y and Z are current values of registers, X@, Y@ and Z@ are previous values of registers   

end

 

Программный доступ к значению регистра может также быть получен при помощи оператора <RGS> в форме Rgs[<Индекс в списке>] или Rgs["Имя регистра"].  Например для конкретного списка регистров который изображен на рисунке выше:

 

program AbsMov

  Len1: Real  

  Len1 = sqr((Rgs[3]-Rgs[3]@)^2 + (Rgs[4]-Rgs[4]@)^2 + (Rgs[5]-Rgs[5]@)^2) ! Here Rgs[3] is the current value of the register X, Rgs[3]@ is the previous value of register X

end

 

Полный синтаксис, который может быть применен к оператору <RGS> описан ниже. Внутри квадратных скобок вы можете указывать либо индекс регистра в списке (целочисленная константа или переменная), либо имя регистра (строковая константа или переменная).

RGS.ItemCount - возвращает общее количество регистров в списке.

Rgs[<Index or Name>].STR - строковый идентификатор (ID) регистра который выводится в управляющую программу.

Rgs[<Index or Name>].NAME - строковое имя регистра используемое для доступа к нему из программного кода постпроцессора.

Rgs[<Index or Name>] или эквивалентно Rgs[<Index or Name>].DATA - текущее значение регистра.

Rgs[<Index or Name>]@ или эквивалентно Rgs[<Index or Name>].OLDDATA - предыдущее значение регистра.

Rgs[<Index or Name>].NUM - возвращает индекс регистра в списке регистров.

 

Пример, демонстрирующий преимущества использования оператора <RGS> в сравнении с использованием имени регистра, приведен ниже.

 

program AbsMov

  ToolAxisIndex: Integer  

  

  case PlaneGNumber of ! Запоминаем индекс регистра осевого перемещения инструмента в зависимости от текущей плоскости

    17: ToolAxisIndex = Rgs["Z"].Num 

    18: ToolAxisIndex = Rgs["Y"].Num

    19: ToolAxisIndex = Rgs["X"].Num

  end

 

  X = CLD.X ! Заполняем текущие значения регистров X, Y и Z из CLDATA

  Y = CLD.Y

  Z = CLD.Z

 

  if Interp=0 then begin                                    ! Если мы имеем случай ускоренного перемещения и допустим хотим реализовать безопасное опускание

    if Rgs[ToolAxisIndex] < Rgs[ToolAxisIndex]@ then begin  ! Если инструмент перемещается вниз

      Rgs[ToolAxisIndex]@ = Rgs[ToolAxisIndex]              ! То мы предотвращаем вывод перемещения вдоль оси инструмента

      OutBlock                                              ! Таким образом здесь мы выведем перемещение только в плоскости инструмента

      Rgs[ToolAxisIndex]@ = 999999                          ! Теперь мы должны присвоить любое несовпадающее число старому значению регистра

    end                                                     ! чтобы обеспечить гарантированный вывод перемещения вдоль оси инструмента при следующем OutBlock

  end

 

  OutBlock                                                  ! Вывод перемещения в УП

end

 

 

Сопутствующие ссылки:

Главное окно