Разработка постпроцессоров
  • Разработка постпроцессоров
v20.0.1
Search Results for

    Show / Hide Table of Contents

    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;");
                }
            }
        }
    }
    

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

    • Модель доступа к CLData
    In this article