MULTIARC - Многокоординатное перемещение по окружности
Отображение команды
Как команда отображается в списке команд CLData:
MULTIARC EPX ep.X, EPY ep.Y, EPZ ep.Z, EPRX ep.Rx, EPRY ep.Ry, EPRZ ep.Rz, EPRW ep.Rw,
MPX mp.X, MPY mp.Y, MPZ mp.Z, MPRX mp.Rx, MPRY mp.Ry, MPRZ mp.Rz, MPRW mp.Rw
Команда перемещения MULTIARC задаёт дугу окружности, проходящую через три точки, с заданной ориентацией инструмента в пространстве для каждой из этих точек. На рисунке ниже SP - начальное положение, в котором находился инструмент перед выполнением команды, MP - промежуточное положение инструмента на дуге, EP - конечное положение инструмента.
Доступ из sppx
Обработчик: program MultiArc
Массив cld читается по индексу или по имени - в sppx по типизированному короткому имени (например, cld.X), в .NET по тому же имени как строковому ключу (например, cld["X"]).
| Параметр | Массив CLD | Имя CLD | Описание |
|---|---|---|---|
| ep.X ep.Y ep.Z |
CLD[1] CLD[2] CLD[3] |
CLD.EPX CLD.EPY CLD.EPZ |
Декартовы координаты X, Y и Z конечной точки дуги |
| ep.Rx ep.Ry ep.Rz ep.Rw |
CLD[4] CLD[5] CLD[6] CLD[7] |
CLD.EPNX CLD.EPNY CLD.EPNZ CLD.EPNW |
Параметры, задающие ориентацию инструмента в конечной точке дуги относительно текущей системы координат (поля RX, RY, RZ и RW). В зависимости от конфигурации системы (заданной в схеме станка) ориентация инструмента может задаваться: вектором нормали n = (RX, RY, RZ), пространственными углами поворота вокруг осей координат - углами Эйлера (порядок поворотов также задаётся в настройках) A = RX, B = RY, C = RZ, кватернионом q = (RX, RY, RZ, RW). |
| mp.X mp.Y mp.Z |
CLD[8] CLD[9] CLD[10] |
CLD.MPX CLD.MPY CLD.MPZ |
Декартовы координаты X, Y и Z промежуточной точки дуги |
| mp.Rx mp.Ry mp.Rz mp.Rw |
CLD[11] CLD[12] CLD[13] CLD[14] |
CLD.MPNX CLD.MPNY CLD.MPNZ CLD.MPNW |
Параметры, задающие ориентацию инструмента в промежуточной точке дуги относительно текущей системы координат (поля RX, RY, RZ и RW). В зависимости от конфигурации системы (заданной в схеме станка) ориентация инструмента может задаваться: вектором нормали n = (RX, RY, RZ), пространственными углами поворота вокруг осей координат - углами Эйлера (порядок поворотов также задаётся в настройках) A = RX, B = RY, C = RZ, кватернионом q = (RX, RY, RZ, RW). |
Доступ по имени параметра (вспомогательные обёртки)
Параметры, доступные через оператор cmd (одинаковый в sppx и .NET):
| TCLDMultiArc: ComplexType | Команда перемещения по дуге окружности, заданной тремя точками в пространстве. |
|---|---|
| EndPos: ComplexType | cmd.Ptr["EndPos"] - структура, поля которой определяют положение инструмента в конечной точке дуги. |
| Axes: Array, Key="AxisID" | cmd.Ptr["EndPos.Axes"] - массив структур типа Axis. Одна команда может включать перемещение по нескольким осям, положение каждой из них хранится в этом массиве. |
| Axis: ComplexType | cmd.Ptr["EndPos.Axes"].Item[Index] или cmd.Ptr["EndPos.Axes(AxisName)"] - отдельный элемент массива Axes. Содержит информацию о перемещении по одной оси станка. Доступ к элементам массива возможен как по индексу, так и по ключевому полю. Здесь AxisName - значение ключевого поля, которое должно совпадать со значением поля AxisID. |
| AxisID: String | cmd.Str["EndPos.Axes(AxisName).AxisID"] - идентификатор оси станка, для которой задано новое положение. Определяется схемой станка. |
| Value: Double | cmd.Flt["EndPos.Axes(AxisName).Value"] - новое положение оси станка, в которое она перемещается. |
| Pos5D: ComplexType | cmd.Ptr["EndPos.Pos5D"] - структура, содержащая координаты, определяющие конечное положение инструмента в пространстве. Определяет не только положение точки настройки инструмента (поля X, Y и Z - декартовы координаты), но и ориентацию инструмента относительно текущей системы координат (поля NX, NY, NZ и NW). В зависимости от конфигурации системы (заданной в схеме станка) ориентация инструмента может задаваться: вектором нормали n = (NX, NY, NZ), пространственными углами поворота вокруг осей координат - углами Эйлера (порядок поворотов также задаётся в настройках) A = NX, B = NY, C = NZ, кватернионом q = (NX, NY, NZ, NW). |
| X: Double | cmd.Flt["EndPos.Pos5D.X"] - декартова координата X положения точки инструмента. |
| Y: Double | cmd.Flt["EndPos.Pos5D.Y"] - декартова координата Y положения точки инструмента. |
| Z: Double | cmd.Flt["EndPos.Pos5D.Z"] - декартова координата Z положения точки инструмента. |
| NX: Double | cmd.Flt["EndPos.Pos5D.NX"] - в зависимости от конфигурации системы может быть компонентом NX нормального вектора инструмента, углом поворота вокруг одной из осей координат либо коэффициентом кватерниона. |
| NY: Double | cmd.Flt["EndPos.Pos5D.NY"] - в зависимости от конфигурации системы может быть компонентом NY нормального вектора инструмента, углом поворота вокруг одной из осей координат либо коэффициентом кватерниона. |
| NZ: Double | cmd.Flt["EndPos.Pos5D.NZ"] - в зависимости от конфигурации системы может быть компонентом NZ нормального вектора инструмента, углом поворота вокруг одной из осей координат либо коэффициентом кватерниона. |
| NW: Double | cmd.Flt["EndPos.Pos5D.NW"] - если выбран способ ориентации инструмента в виде кватерниона, это четвёртый коэффициент кватерниона. |
| MachineStateFlags: Integer | cmd.Ptr["EndPos.MachineStateFlags"].Bit[i], i=(0..31). Целое число, являющееся битовым полем из 32 бит, от 0 до 31. Если существует несколько вариантов расположения осей станка, обеспечивающих заданное положение инструмента в пространстве, каждый бит этого поля определяет выбор одного из возможных решений. Например, у пятиосевого станка с осями A и C для большинства положений инструмента есть два возможных решения - с положительным значением оси A и с отрицательным. Нулевой бит этого поля выбирает одно из этих решений. Для стандартного шестиосевого шарнирного робота многие положения инструмента в пространстве могут обеспечиваться разными сочетаниями положений трёх его ключевых шарниров (основания, локтя и запястья), что даёт в сумме 8 возможных решений. В этом случае нулевой бит этого поля определит положение основания, первый бит - положение локтя, а третий бит - положение запястья робота. Таким образом, значение каждого из этих битов полностью определяется используемой схемой станка. При использовании станков, которым эти флаги не требуются, вывод этого параметра в CLData можно отключить в схеме станка. |
| MidPos: ComplexType | cmd.Ptr["MidPos"] - структура, поля которой определяют положение инструмента в промежуточной точке дуги. |
| Axes: Array, Key="AxisID" | cmd.Ptr["MidPos.Axes"] - массив структур типа Axis. Одна команда может включать перемещение по нескольким осям, положение каждой из них хранится в этом массиве. |
| Axis: ComplexType | cmd.Ptr["MidPos.Axes"].Item[Index] или cmd.Ptr["MidPos.Axes(AxisName)"] - отдельный элемент массива Axes. Содержит информацию о перемещении по одной оси станка. Доступ к элементам массива возможен как по индексу, так и по ключевому полю. Здесь AxisName - значение ключевого поля, которое должно совпадать со значением поля AxisID. |
| AxisID: String | cmd.Str["MidPos.Axes(AxisName).AxisID"] - идентификатор оси станка, для которой задано новое положение. Определяется схемой станка. |
| Value: Double | cmd.Flt["MidPos.Axes(AxisName).Value"] - новое положение оси станка, в которое она перемещается. |
| Pos5D: ComplexType | cmd.Ptr["MidPos.Pos5D"] - структура, содержащая координаты, определяющие конечное положение инструмента в пространстве. Определяет не только положение точки настройки инструмента (поля X, Y и Z - декартовы координаты), но и ориентацию инструмента относительно текущей системы координат (поля NX, NY, NZ и NW). В зависимости от конфигурации системы (заданной в схеме станка) ориентация инструмента может задаваться: вектором нормали n = (NX, NY, NZ), пространственными углами поворота вокруг осей координат - углами Эйлера (порядок поворотов также задаётся в настройках) A = NX, B = NY, C = NZ, кватернионом q = (NX, NY, NZ, NW). |
| X: Double | cmd.Flt["MidPos.Pos5D.X"] - декартова координата X положения точки инструмента. |
| Y: Double | cmd.Flt["MidPos.Pos5D.Y"] - декартова координата Y положения точки инструмента. |
| Z: Double | cmd.Flt["MidPos.Pos5D.Z"] - декартова координата Z положения точки инструмента. |
| NX: Double | cmd.Flt["MidPos.Pos5D.NX"] - в зависимости от конфигурации системы может быть компонентом NX нормального вектора инструмента, углом поворота вокруг одной из осей координат либо коэффициентом кватерниона. |
| NY: Double | cmd.Flt["MidPos.Pos5D.NY"] - в зависимости от конфигурации системы может быть компонентом NY нормального вектора инструмента, углом поворота вокруг одной из осей координат либо коэффициентом кватерниона. |
| NZ: Double | cmd.Flt["MidPos.Pos5D.NZ"] - в зависимости от конфигурации системы может быть компонентом NZ нормального вектора инструмента, углом поворота вокруг одной из осей координат либо коэффициентом кватерниона. |
| NW: Double | cmd.Flt["MidPos.Pos5D.NW"] - если выбран способ ориентации инструмента в виде кватерниона, это четвёртый коэффициент кватерниона. |
| MachineStateFlags: Integer | cmd.Ptr["MidPos.MachineStateFlags"].Bit[i], i=(0..31). Целое число, являющееся битовым полем из 32 бит, от 0 до 31. Если существует несколько вариантов расположения осей станка, обеспечивающих заданное положение инструмента в пространстве, каждый бит этого поля определяет выбор одного из возможных решений. Например, у пятиосевого станка с осями A и C для большинства положений инструмента есть два возможных решения - с положительным значением оси A и с отрицательным. Нулевой бит этого поля выбирает одно из этих решений. Для стандартного шестиосевого шарнирного робота многие положения инструмента в пространстве могут обеспечиваться разными сочетаниями положений трёх его ключевых шарниров (основания, локтя и запястья), что даёт в сумме 8 возможных решений. В этом случае нулевой бит этого поля определит положение основания, первый бит - положение локтя, а третий бит - положение запястья робота. Таким образом, значение каждого из этих битов полностью определяется используемой схемой станка. При использовании станков, которым эти флаги не требуются, вывод этого параметра в CLData можно отключить в схеме станка. |
| Time: Double | Время перемещения в минутах. |
Список координат, передаваемых через CLData, определяется схемой станка CAM-системы.
Пример (из постпроцессора робота Newker):
program MultiArc
!========================== MidPoint ==============================================================
I = CLD.MPX; J = CLD.MPY; K = CLD.MPZ
I@ = MaxReal; J@ = MaxReal; K@ = MaxReal
!========================== EndPoint ==============================================================
X = CLD.EPX; Y = CLD.EPY; Z = CLD.EPZ
A = CLD.EPNX; B = CLD.EPNY; C = CLD.EPNZ;
X@=MaxReal; Y@=MaxReal; Z@=MaxReal
A@=MaxReal; B@=MaxReal; C@=MaxReal;
!=====================================================================================
call A1_A6(19, CLD.EndAxesCount)
A1@=maxreal; A2@=maxreal; A3@=maxreal; A4@=maxreal; A5@=maxreal; A6@=maxreal;
Formblock
output "{"+outstr$+"}"
Speed@=Maxreal
Formblock
LineN = LineN + 1; LineN@ = LineN
output "N"+str(LineN)+" MOVC " + outstr$ + " PL=1.0" + ";Arc"
end
Доступ из .NET
Обработчики:
public override void OnBeforeMovement(ICLDMotionCommand cmd, CLDArray cld) // group handler - before any motion command
public override void OnMultiArc(ICLDMultiArcCommand cmd, CLDArray cld)
public override void OnAfterMovement(ICLDMotionCommand cmd, CLDArray cld) // group handler - after any motion command
Наследование: ICLDMultiArcCommand : ICLDMotionCommand : ICLDCommand.
Читайте параметры из строго типизированного объекта cmd (рекомендуется); доступны также «сырой» массив cld[i] (те же индексы, что и в sppx) и именованные обёртки cmd["..."]. В таблице перечислены члены команды, включая унаследованные от базовых интерфейсов; общие члены ICLDCommand (навигация, CLD, CLDFile, TechOperation, ...) описаны в разделе Модель доступа к CLData.
| Свойство | Тип | Описание |
|---|---|---|
cmd.EndP |
ICLDMultiArcPoint |
Конечная точка дуги. |
cmd.MidP |
ICLDMultiArcPoint |
Промежуточная точка дуги. |
cmd.Time |
double | Продолжительность перемещения в минутах. |
cmd.Center |
TInp5DPoint |
Центральная точка и ориентация (углы Эйлера или кватернион) дуги. |
cmd.R |
double | Радиус дуги; знак определяет направление (по часовой стрелке или против часовой стрелки относительно нормали плоскости дуги). |
cmd.Ang |
double | Угол дуги (всегда положительный). |
cmd.EP |
TInp3DPoint |
Конечная точка (X, Y, Z). (унаследовано от ICLDMotionCommand) |
Точка дуги (ICLDMultiArcPoint) имеет поля P (декартовы координаты X, Y, Z), N (ориентация инструмента: нормальный вектор, углы Эйлера или кватернион в зависимости от схемы станка), MSFlags (флаги состояния станка), AxesCount, Axis
(список значений физических осей станка в этой точке), Axes (перечислитель) и HasAxis(string ID).
Пример (из постпроцессора робота Fanuc - все команды перемещения используют общий метод Motion):
public override void OnMultiArc(ICLDMultiArcCommand cmd, CLDArray cld)
{
Motion(cmd);
}
/// <summary>All movement commands call this method (MultiGOTO, PhysicGoto, MultiArc, From)</summary>
void Motion(ICLDMotionCommand movement)
{
state.prevPos = state.Pos;
if (movement.CmdType==CLDCmdType.MultiArc) {
ICLDMultiArcCommand cmd = movement as ICLDMultiArcCommand;
state.Pos = new TInpLocation(cmd.MidP.P, cmd.MidP.N);
state.J.FillJoints(cmd.MidP.Axes);
state.Flips.Fill(cmd.Int["MidPos.MachineStateFlags"], state.J);
int midPointIndex = ls.AddPoint(false, state);
state.middlePos = state.Pos;
state.Pos = new TInpLocation(cmd.EndP.P, cmd.EndP.N);
state.J.FillJoints(cmd.EndP.Axes);
state.Flips.Fill(cmd.Int["EndPos.MachineStateFlags"], state.J);
int endPointIndex = ls.AddPoint(false, state);
CalculateCNT(movement);
AddMotionLine("C P[" + midPointIndex + "] P[" + endPointIndex + "] " + Round(state.velocity/60) +
" mm/sec " + FineOrCnt(state.cntValue) + " ACC" + state.accValue + " ;", false);
} else {
ICLDMultiMotionCommand cmd = movement as ICLDMultiMotionCommand;
state.Pos = new TInpLocation(cmd.EP, cmd.EN);
state.J.FillJoints(cmd.Axes);
state.Flips.Fill(cmd.Int["MachineStateFlags"], state.J);
if (movement.CmdType==CLDCmdType.From) {
// Output nothing, just remember
return;
} else if (movement.CmdType==CLDCmdType.MultiGoto) {
// Lines
CalculateCNT(movement);
int pointIndex = ls.AddPoint(false, state);
AddMotionLine("L P[" + pointIndex + "] " + Round(state.velocity/60) + " mm/sec " + FineOrCnt(state.cntValue) + " ACC" + state.accValue + " ;");
} else { //PhysicGoto or GoHome
// Joints
state.cntValue = smooth.cntValueRapid;
int pointIndex = ls.AddPoint(true, state);
if (!state.J.ThereAreE || (state.J.ExtAxesGroup==2)) {
AddMotionLine("J P[" + pointIndex + "] 10% " + FineOrCnt(state.cntValue) + " ;");
} else {
AddMotionLine("J P[" + pointIndex + "] 10% " + FineOrCnt(state.cntValue) + " ACC30;");
}
}
}
}