Определение структуры и формата кадра (формирование списка регистров)
Для определения структуры и формата кадра управляющей программы необходимо сформировать список регистров и определить их параметры.
Кадр управляющей программы состоит из слов, каждое слово содержит адрес и значение. <Адрес> – буква (иногда несколько букв), <Значение> – число представленное в определенном формате. С каждым адресом в постпроцессоре связан определенный <Регистр>.
Понятие <Регистра> в постпроцессоре объединяет следующие свойства:
идентификатор регистра (адрес в управляющей программе);
формат вывода значения этого адреса в кадр;
текущее значение, соответствующее адресу;
предыдущее значение, соответствующее адресу;
имя регистра (переменная постпроцессора, связанная с адресом, через которую производится доступ как к текущему, так и к предыдущему значению регистра).
Постпроцессор имеет средства автоматического формирования кадра управляющей программы. Происходит это так: перебираются регистры по порядку, начиная с первого; если старое и текущее значения регистра различаются, то регистр выводится в кадр, а его старое значение приравнивается текущему. Если старое и текущее значения регистра равны, то регистр в кадр не выводится.
При выводе регистра в кадр управляющей программы сначала записывается его идентификатор, а затем текущее значение регистра. Число выводится в кадр в соответствии с описанным в регистре форматом (количество знаков целой части числа, количество знаков дробной части числа, наличие десятичной точки, знака, лидирующих и незначащих нулей).
Таким образом, для того, чтобы определить структуру и формат кадра управляющей программы необходимо заполнить список регистров и задать их свойства. Регистры должны быть расположены в том же порядке, в котором их идентификаторы и значения должны появляться в кадре управляющей программы. Данное правило действительно для программ обработки технологических команд. При формировании кадра по шаблону порядок вывода значений соответствует порядку регистров в шаблоне.
Примечание: Разные регистры не должны иметь одинаковые имена, но у них могут быть одни и те же идентификаторы (адреса слов в кадре управляющей программе). Это позволяет создавать отдельный регистр для каждой группы функций одного типа.
Например, для подготовительной функции переключения абсолютной/относительной системы отсчета создается регистр с именем <ABSOLUTE> и идентификатором <G>. А для подготовительных функций позиционирования, линейной интерполяции и интерполяции по окружности создается регистр с именем <INTERP> и таким же идентификатором <G>. Это позволит, во-первых, при необходимости, вывести обе эти команды в один кадр управляющей программы (например, <N190 G91 G1 X50 Y30>). А, во-вторых, по текущим значениям регистров <ABSOLUTE> и <INTERP> отслеживать текущий режим перемещений (позиционирование, линейная или круговая интерполяция) и в какой системе отсчета (абсолютной или относительной) задаются координаты.
Список регистров отображается в левой части главного окна.
Окно редактирования свойств регистра открывается двойным нажатием левой клавиши мыши на строке регистра.
В левой части окна отображается список регистров. Выше находятся кнопки редактирования списка регистров:
– создать новый регистр, созданный регистр помещается после текущего;
– удалить текущий регистр;
– скопировать текущий регистр в буфер обмена;
– вставить регистр из буфера обмена после текущего;
– переместить текущий регистр вверх по списку;
– переместить текущий регистр вниз по списку.
Поменять порядок расположения регистров можно, нажав левую клавишу мыши на номере регистра и, не отпуская левой клавиши, переместить его в нужную позицию.
В правой части окна отображаются и могут быть отредактированы свойства регистров, которые выделены в списке слева.
<Идентификатор регистра> – символы, выводящиеся в кадр управляющей программы перед значением регистра (адрес слова в кадре управляющей программы).
<Десятичная точка> – может иметь несколько значений:
<Отсутствует>;
<Присутствует> – выбор этого варианта значит, что точка будет стоять только тогда, когда значение регистра будет иметь дробную часть ;
<Присутствует всегда> .
<Знаков до десятичной точки> – максимальное количество знаков в целой части числа.
<Знаков после десятичной точки> – количество знаков в дробной части числа.
<Лидирующие нули> и <Незначащие нули> – управление выводом нулей перед и после значения регистра.
<Знак> – управление выводом знака значения регистра. Возможны:
<Без знака>;
<Только "-">;
<Всегда "-" и "+">.
<Имя регистра> – имя, с которым оперируют программы обработки команд.
<Комментарий> – комментарий к регистру.
Кнопка <Импорт> предназначена для импорта списка регистров из постпроцессоров форматов <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
Сопутствующие ссылки: