Именованные параметры CLData

Из CAM системы в постпроцессор приходит набор данных, называемых CLData, на основании котороой постпроцессор генерирует управляющую программу. Данные внутри CLData могут описывать очень много различных параметров, которые относятся к совершенно разным сложным объектам: технологической операции, траектории, инструменту, проекту, заготовке и т.д. Поэтому внутри CLData они определенным образом структурированы и фактически представляют собой не простой список, дерево параметров. Доступ к этим параметрам из кода постпроцессора производится по строковому имени. Т.к. имеем дерево параметров, то обычно полное имя параметра - это сложная строка, состоящая из нескольких идентификаторов, разделенных точками и иногда скобками, т.е.

ИмяГруппы.ИмяПодгруппы.ИмяПараметра.ИмяВложенногоПараметра и т.д. Уровень вложенности параметров может быть разным - от одного до нескольких идентификаторов разделенных точками. Пример реального названия параметра, отвечающего за радиус сглаживания траектории внутри операции: "Operation.Smoothing.Radius". Синтаксис для доступа к параметру из кода программы постпроцессора следующий.

ObjectKeyWord.TypeKeyWord["ИмяПараметра"]

Здесь ObjectKeyWord - ключевое слово, которое говорит у какого объекта из CLData мы запрашиваем параметры. Сейчас в качестве ObjectKeyWord могут быть такие:

  • Cmd - текущая (обрабатываемая в данный момент) команда CLData.

  • CLDFile[index1].Cmd[index2]. Команда с индексом index2, взятая из cld-файла с индексом index1. Здесь index1 и index2 - любые целые числа.

  • Project - проект CAM системы, в котором сгруппированы параметры относящиеся ко всем операциям, а не к отдельно взятой, например заготовка техпроцесса.

TypeKeyWord - ключевое слово, определяющее в каком виде (сторка, число и т.п.) необходимо получить значение параметра. Параметры могут быть разных типов: строковые, целочисленные, числовые с плавающей точкой, комплексные (параметры данного типа не имеют собственного значения, но они могут иметь дочерние свойства любого из описанных здесь типов; необходим для объединения нескольких параметров в группу), массивы (как и комплексные не обладают собственными значениями и могут иметь дочерние свойства, однако дочерние свойства массивов, как правило, имеют общий тип и, следовательно, одинаковое имя, поэтому доступ к дочерним свойствам массивов осуществляется не по имени, а по индексу). Имеются следующие ключевые слова.

  • Str["ИмяПараметра"] - вернет значение параметра в виде строки (тип данных string).

  • Int["ИмяПараметра"] - вернет значение параметра в виде целого числа (тип данных integer).

  • Flt["ИмяПараметра"] - вернет значение параметра в виде числа с плавающей точкой (тип данных Float или Real).

  • Ptr["ИмяПараметра"] - вернет не значение параметра, а ссылку на сам параметр. Удобно использовать для доступа к параметрам имеющим тип комплексный и массив. Если параметра с таким именем в данной команде не существует, то оператор вернет значение 0, а иначе число отличное от нуля. Таким образом, проверку на равенство нулю можно использовать для проверки существования параметра.


   if cmd.Ptr["Axes(AxisCPos)"]<>0 then begin
     C = cmd.Flt["Axes(AxisCPos).Value"]
   end


По полученной ссылке через точку может быть получен доступ либо к значению данного параметра, либо к одному из дочерних параметров. Для этого нужно после точки снова указать одну из описанных здесь команд: Str, Int, Flt, Ptr, Item, ItemCount, Name. Если при этом после инструкции не указывается имя параметра, то значит, что она относится к самому параметру. Например, инструкция Cmd.Ptr["Parameter1"].Int означает взять значение самого параметра с именем <Parameter1> в виде целого числа. А запись Cmd.Ptr["Parameter1"].Int["SubParameter1"] означает взять в виде целого числа значение дочернего параметра <SubParameter1> внутри параметра <Parameter1>.

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

ObjectKeyWord.Ptr["ИмяПараметраТипаМассив"].Item[Index] - возвращает ссылку на дочерний параметр по индексу. Индексация параметров начинается с 1.

ObjectKeyWord.Ptr["ИмяПараметраТипаМассив"].ItemCount - возвращает количество дочерних параметров в массиве.

Кроме индексного, доступ к дочернему параметру массива в некоторых случаях может быть осуществлен по ключу. Если у массива определен параметр Key, который задает имя поля-ключа в дочерних параметрах, то для получения доступа к конкретному элементу массива необходимо после имени массива в круглых скобках указать значение ключа. Например, инструкцияCmd.Ptr["ArrayName(KeyValue)"]означает взять у текущей команды параметр <ArrayName>, в котором найти дочернее свойство с ключевым полем равным <KeyValue>

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

Существует удобный способ сформировать строку для доступа к нужному параметру. Все параметры для объектов CLData показываются в отдельном дереве на закладке CLData в правой ее части. Нужно выделить нужную команду в списке, либо проект в списке операций. При этом в дереве справа покажутся параметры выделенного объекта. Затем нужно найти нужный параметр в этом дереве и сделать двойной щелчек по нему. В текущую позицию курсора в окне редактирования кода будет вставлена строка доступа к указанному параметру.

Рассмотрим несколько примеров использования параметров команд CLData.

images/download/attachments/95447212/image2023-4-19_9-35-10.png

Пример 1. Внутри обработчика команды загрузки инструмента LoadTl в управляющую программу выводится строка с указанием адреса T, номера инструмента и именем револьверной головки в скобках.

program LoadTl
  Output "T" + Cmd.Int["ToolID"] + " (" + Cmd.Str["RevolverID"] + ")"
end

Возможный результат вывода в УП: T3 (TopTurret)

Пример 2. Пример обработки команды MultiGoto с использованием различных способов доступа к элементам параметра-массива Axes.

program MultiGoto
  i: Integer
  AxisName: String
  
  for i = 1 to Cmd.Ptr["Axes"].ItemCount do begin
    AxisName = cmd.Ptr["Axes"].Item[i].Str["AxisID"]
    if AxisName="AxisXPos" then begin
      X = cmd.Ptr["Axes"].Item[i].Flt["Value"]
    end else
    if AxisName="AxisYPos" then begin
      Y = cmd.Ptr["Axes("+Str(i)+")"].Flt["Value"]
    end else
    if AxisName="AxisZPos" then begin
      Z = cmd.Flt["Axes("+Str(i)+").Value"]
    end else
    if cmd.Ptr["Axes(AxisCPos)"]<>0 then begin
      C = cmd.Flt["Axes(AxisCPos).Value"]
    end
  end
  OutBlock
end

Пример 3. Пример обработки команды установки системы координат Origin. Здесь производится анализ значения свойства <OriginType> команды. Если оно равно нулю, то выводится команда выбора стандартной системы координат заготовки G54-G59. Номер системы координат берется из параметра <CSNumber>. В противном случае формируется команда переноса локальной системы координат G92 X Y Z. Величины смещений вдоль осей системы координат берутся из соответствующих дочерних свойств параметра <MCS.OriginPoint> различными способами.

program Origin
  if Cmd.Int["OriginType"]=0 then begin !G54-G59
    Output "G" + Cmd.Str["CSNumber"]
  end else begin                        !G92 X Y Z
    X = Cmd.Flt["MCS.OriginPoint.X"]
    Y = Cmd.Ptr["MCS.OriginPoint.Y"].Flt
    Z = Cmd.Ptr["MCS.OriginPoint"].Flt["Z"]
    Output "G92 X" + Str(X) + " Y" + Str(Y) + " Z" + Str(Z)
  end
end

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

Функции и операторы работы с CLData