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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

images/download/attachments/124267497/regs.jpg

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

images/download/attachments/124267497/image2023-4-28_9-38-15.png

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

  • images/download/thumbnails/124267497/btn-new.jpg – создать новый регистр, созданный регистр помещается после текущего;

  • images/download/thumbnails/124267497/btn-reg-del.jpg – удалить текущий регистр;

  • images/download/thumbnails/124267497/btn-reg-copy.jpg – скопировать текущий регистр в буфер обмена;

  • images/download/thumbnails/124267497/btn-reg-insert.jpg – вставить регистр из буфера обмена после текущего;

  • images/download/thumbnails/124267497/btn-reg-up.jpg – переместить текущий регистр вверх по списку;

  • images/download/thumbnails/124267497/btn-reg-down.jpg – переместить текущий регистр вниз по списку.

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

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

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

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

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

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

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

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

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

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

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

  • <Без знака>;

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

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

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

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

Кнопка <Импорт> предназначена для импорта списка регистров из постпроцессоров форматов <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

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

Главное окно