GTS 插补运动的使用方法

GTS 插补运动的使用方法

        在切割、点胶、焊接等需要跑轨迹的场合,插补运动是必不可少的运动模式。固高GTS插补运动的使用流程包括建立坐标系、(初始化前瞻)、压插补数据、启动插补几个步骤。

1. 建立插补坐标系(并初始化前瞻)

short fifo = 0;
/// <summary>
/// 
/// </summary>
/// <param name="AxisX"></param>
/// <param name="AxisY"></param>
/// <param name="originPosX"></param>
/// <param name="originPosY"></param>
public void CreateCoordinate(short crdNum,short dimension, short AxisX, short AxisY,short AxisZ, int originPosX, int originPosY, int originPosZ)
{
    short sRtn = 0;
    

    // 建立号坐标系,设置坐标系参数
    gts.mc.TCrdPrm crdPrm = new gts.mc.TCrdPrm();
    //memset(&crdPrm, 0, sizeof(crdPrm));
    sRtn = gts.mc.GT_GetCrdPrm(cardNum, crdNum, out crdPrm);
    commandhandler("GTN_GetCrdPrm", sRtn);
    crdPrm.dimension = dimension; // 坐标系为二维坐标系
    crdPrm.synVelMax = velMax*axisScale/1000; // 最大合成速度: pulse/ms
    crdPrm.synAccMax = accMax* axisScale / 1000000; // 最大加速度: pulse/ms^2
    crdPrm.evenTime = 50; // 最小匀速时间: ms
   
    switch (AxisX)
    {
        case 1:
            crdPrm.profile1 = 1; break;
        case 2:
            crdPrm.profile2 = 1; break;
        case 3:
            crdPrm.profile3 = 1; break;
        case 4:
            crdPrm.profile4 = 1; break;
        case 5:
            crdPrm.profile5 = 1; break;
        case 6:
            crdPrm.profile6 = 1; break;
        case 7:
            crdPrm.profile7 = 1; break;
        case 8:
            crdPrm.profile8 = 1; break;
        default: break;
    }
    switch (AxisY)
    {
        case 1:
            crdPrm.profile1 = 2; break;
        case 2:
            crdPrm.profile2 = 2; break;
        case 3:
            crdPrm.profile3 = 2; break;
        case 4:
            crdPrm.profile4 = 2; break;
        case 5:
            crdPrm.profile5 = 2; break;
        case 6:
            crdPrm.profile6 = 2; break;
        case 7:
            crdPrm.profile7 = 2; break;
        case 8:
            crdPrm.profile8 = 2; break;
        default: break;
    }
    if(dimension==3)
    {
        switch (AxisZ)
        {
            case 1:
                crdPrm.profile1 = 3; break;
            case 2:
                crdPrm.profile2 = 3; break;
            case 3:
                crdPrm.profile3 = 3; break;
            case 4:
                crdPrm.profile4 = 3; break;
            case 5:
                crdPrm.profile5 = 3; break;
            case 6:
                crdPrm.profile6 = 3; break;
            case 7:
                crdPrm.profile7 = 3; break;
            case 8:
                crdPrm.profile8 = 3; break;
            default: break;
        }
    }

    crdPrm.setOriginFlag = 1; // 指定坐标系的原点坐标的规划位置
    crdPrm.originPos1 = originPosX; 
    crdPrm.originPos2 = originPosY;
    crdPrm.originPos3 = originPosZ;
   
    sRtn = gts.mc.GT_SetCrdPrm(cardNum, crdNum, ref crdPrm);
    commandhandler("GT_SetCrdPrm", sRtn);
    if (lookAheadFlag)
    {
        gts.mc_la.EMachineMode machineMode = gts.mc_la.EMachineMode.NORMAL_THREE_AXIS; // 机床类型
        gts.mc_la.TLookAheadParameter lookAheadPara = new gts.mc_la.TLookAheadParameter(); // 前瞻参数
        lookAheadPara.lookAheadNum = 200; // 前瞻缓冲区大小段
        lookAheadPara.time = lookAheadTime; // 时间常数
        lookAheadPara.radiusRatio = lookAheadRadius; //曲率参数

        gts.mc_la.TPreStartPos pPreStartPos = new gts.mc_la.TPreStartPos(); 

        lookAheadPara.aMax1 = accMax;
        lookAheadPara.aMax2 = accMax;
        lookAheadPara.aMax3 = accMax;
        lookAheadPara.aMax4 = accMax;
        lookAheadPara.aMax5 = accMax;
        lookAheadPara.aMax6 = accMax;
        lookAheadPara.aMax7 = accMax;
        lookAheadPara.aMax8 = accMax;

        lookAheadPara.vMax1 = velMax;
        lookAheadPara.vMax2 = velMax;
        lookAheadPara.vMax3 = velMax;
        lookAheadPara.vMax4 = velMax;
        lookAheadPara.vMax5 = velMax;
        lookAheadPara.vMax6 = velMax;
        lookAheadPara.vMax7 = velMax;
        lookAheadPara.vMax8 = velMax;

        lookAheadPara.DVMax1 = 50;
        lookAheadPara.DVMax2 = 50;
        lookAheadPara.DVMax3 = 50;
        lookAheadPara.DVMax4 = 50;
        lookAheadPara.DVMax5 = 50;
        lookAheadPara.DVMax6 = 50;
        lookAheadPara.DVMax7 = 50;
        lookAheadPara.DVMax8 = 50;

        lookAheadPara.axisRelation1 = 1;
        lookAheadPara.axisRelation2 = 2;
        lookAheadPara.axisRelation3 = 3;
        lookAheadPara.axisRelation4 = 4;
        lookAheadPara.axisRelation5 = 5;
        lookAheadPara.axisRelation6 = 6;
        lookAheadPara.axisRelation7 = 7;
        lookAheadPara.axisRelation8 = 8;

        lookAheadPara.scale1 = axisScale;
        lookAheadPara.scale2 = axisScale;
        lookAheadPara.scale3 = axisScale;
        lookAheadPara.scale4 = axisScale;
        lookAheadPara.scale5 = axisScale;
        lookAheadPara.scale6 = axisScale;
        lookAheadPara.scale7 = axisScale;
        lookAheadPara.scale8 = axisScale;

        //lookAheadPara.machineCfgFileName = "";

        sRtn = gts.mc_la.GT_SetupLookAheadCrd(cardNum, crdNum, machineMode); //加载前瞻,设置机床模型
        commandhandler("GT_SetupLookAheadCrd", sRtn);
        sRtn = gts.mc_la.GT_InitLookAheadEx(cardNum, crdNum, ref lookAheadPara, fifo, 0, ref pPreStartPos); //初始化前瞻
        commandhandler("GT_InitLookAheadEx", sRtn);
    }
    if(sRtn==0)
    {
        LogHandler("建立坐标系完成!");
    }
}

2.压入插补数据并启动插补

void loadDataAndStart()
{
    short sRtn = 0;
    short pRun;
    int pSegment;
    int startTick, endTick, exeTick;
   
    if (lookAheadFlag)
    {
        sRtn = gts.mc_la.GT_LnXYZG0Ex(cardNum, crdNum, 10, 30, 0, idleVel, idleAcc, 0, 0, 0);
        commandhandler("GT_LnXYZG0Ex", sRtn);

        sRtn = gts.mc_la.GT_LnXYZEx(cardNum, crdNum, 10, 30, 10, workVel, workAcc, 0, 0, 0);
        commandhandler("GT_LnXYZEx", sRtn);

        sRtn = gts.mc_la.GT_LnXYZEx(cardNum, crdNum, 20, 30, 10, workVel, workAcc, 0, 0, 0);
        commandhandler("GT_LnXYZEx", sRtn);

        sRtn = gts.mc_la.GT_LnXYZEx(cardNum, crdNum, 30, 10, 10, workVel, workAcc, 0, 0, 0);
        commandhandler("GT_LnXYZEx", sRtn);

        sRtn = gts.mc_la.GT_LnXYZEx(cardNum, crdNum, 10, 30, 10, workVel, workAcc, 0, 0, 0);
        commandhandler("GT_LnXYZEx", sRtn);

        sRtn = gts.mc_la.GT_LnXYZG0Ex(cardNum, crdNum, 50, 30, 10, idleVel, idleAcc, 0, 0, 0);
        commandhandler("GT_LnXYZG0Ex", sRtn);

        sRtn = gts.mc_la.GT_LnXYZEx(cardNum, crdNum, 70, 30, 10, workVel, workAcc, 0, 0, 0);
        commandhandler("GT_LnXYZEx", sRtn);

        sRtn = gts.mc_la.GT_LnXYZEx(cardNum, crdNum, 80, 10, 10, workVel, workAcc, 0, 0, 0);
        commandhandler("GT_LnXYZEx", sRtn);

        sRtn = gts.mc_la.GT_LnXYZEx(cardNum, crdNum, 40, 10, 10, workVel, workAcc, 0, 0, 0);
        commandhandler("GT_LnXYZEx", sRtn);

        sRtn = gts.mc_la.GT_LnXYZEx(cardNum, crdNum, 50, 30, 10, workVel, workAcc, 0, 0, 0);
        commandhandler("GT_LnXYZEx", sRtn);

        sRtn = gts.mc_la.GT_LnXYZG0Ex(cardNum, crdNum, 60, 70, 10, idleVel, idleAcc, 0, 0, 0);
        commandhandler("GT_LnXYZG0Ex", sRtn);

        sRtn = gts.mc_la.GT_ArcXYCEx(cardNum, crdNum, 60, 70, 0, -10, 1, workVel, workAcc, 0, 0, 0);
        commandhandler("GT_ArcXYCEx", sRtn);

        sRtn = gts.mc_la.GT_LnXYZG0Ex(cardNum, crdNum, 30, 70, 10, idleVel, idleAcc, 0, 0, 0);
        commandhandler("GT_LnXYZG0Ex", sRtn);

        sRtn = gts.mc_la.GT_LnXYZEx(cardNum, crdNum, 30, 50, 10, workVel, workAcc, 0, 0, 0);
        commandhandler("GT_LnXYZEx", sRtn);

        sRtn = gts.mc_la.GT_LnXYZEx(cardNum, crdNum, 10, 50, 10, workVel, workAcc, 0, 0, 0);
        commandhandler("GT_LnXYZEx", sRtn);

        sRtn = gts.mc_la.GT_LnXYZEx(cardNum, crdNum, 10, 70, 10, workVel, workAcc, 0, 0, 0);
        commandhandler("GT_LnXYZEx", sRtn);

        sRtn = gts.mc_la.GT_LnXYZEx(cardNum, crdNum, 30, 70, 10, workVel, workAcc, 0, 0, 0);
        commandhandler("GT_LnXYZEx", sRtn);

        sRtn = gts.mc_la.GT_LnXYZEx(cardNum, crdNum, 30, 70, 0, workVel, workAcc, 0, 0, 0);
        commandhandler("GT_LnXYZEx", sRtn);

        sRtn = gts.mc_la.GT_LnXYZG0Ex(cardNum, crdNum, 0, 0, 0, idleVel, idleAcc, 0, 0, 0);
        commandhandler("GT_LnXYZG0Ex", sRtn);

        do
        {
            sRtn = gts.mc_la.GT_CrdDataEx(cardNum, crdNum, System.IntPtr.Zero, 0);
            commandhandler("GT_CrdDataEx", sRtn);
            Thread.Sleep(50);
        } while (sRtn != 0);
        int temp = 0x1;
        int ltemp = crdNum - 1;
        int opCrd = temp << ltemp;
        // 启动运动
        sRtn = gts.mc.GT_CrdStart(cardNum, (short)opCrd, 0);
        commandhandler("GTN_CrdStart", sRtn);
        if(sRtn==0)
        {
            LogHandler("启动加工!:" );
            startTick = System.Environment.TickCount;
            do
            {
                gts.mc.GT_CrdStatus(cardNum, crdNum, out pRun, out pSegment, 0);
            } while (pRun == 1);
            endTick = System.Environment.TickCount;
            exeTick = endTick - startTick;
            LogHandler("加工完成\n加工总耗时:" + exeTick + "ms");

        }
        
    }
    else
    {
        double Vel1 = idleVel * axisScale / 1000;
        double Acc1 = idleAcc * axisScale / 1000000;

        double Vel2 = workVel * axisScale / 1000;
        double Acc2 = workAcc * axisScale / 1000000;

        sRtn = gts.mc.GT_LnXYZG0(cardNum, crdNum, (int)(10 * axisScale), (int)(30 * axisScale), (int)(0 * axisScale), Vel1, Acc1, 0);
        commandhandler("GT_LnXYZG0", sRtn);

        sRtn = gts.mc.GT_LnXYZ(cardNum, crdNum, (int)(10 * axisScale), (int)(30 * axisScale), (int)(10 * axisScale), Vel2, Acc2, 0, 0);
        commandhandler("GT_LnXYZ", sRtn);

        sRtn = gts.mc.GT_LnXYZ(cardNum, crdNum, (int)(20 * axisScale), (int)(30 * axisScale), (int)(10 * axisScale), Vel2, Acc2, 0, 0);
        commandhandler("GT_LnXYZ", sRtn);

        sRtn = gts.mc.GT_LnXYZ(cardNum, crdNum, (int)(30 * axisScale), (int)(10 * axisScale), (int)(10 * axisScale), Vel2, Acc2, 0, 0);
        commandhandler("GT_LnXYZ", sRtn);

        sRtn = gts.mc.GT_LnXYZ(cardNum, crdNum, (int)(10 * axisScale), (int)(30 * axisScale), (int)(10 * axisScale), Vel2, Acc2, 0, 0);
        commandhandler("GT_LnXYZ", sRtn);

        sRtn = gts.mc.GT_LnXYZG0(cardNum, crdNum, (int)(50 * axisScale), (int)(30 * axisScale), (int)(10 * axisScale), Vel1, Acc2, 0);
        commandhandler("GT_LnXYZG0", sRtn);

        sRtn = gts.mc.GT_LnXYZ(cardNum, crdNum, (int)(70 * axisScale), (int)(30 * axisScale), (int)(10 * axisScale), Vel2, Acc2, 0, 0);
        commandhandler("GT_LnXYZ", sRtn);

        sRtn = gts.mc.GT_LnXYZ(cardNum, crdNum, (int)(80 * axisScale), (int)(10 * axisScale), (int)(10 * axisScale), Vel2, Acc2, 0, 0);
        commandhandler("GT_LnXYZ", sRtn);

        sRtn = gts.mc.GT_LnXYZ(cardNum, crdNum, (int)(40 * axisScale), (int)(10 * axisScale), (int)(10 * axisScale), Vel2, Acc2, 0, 0);
        commandhandler("GT_LnXYZ", sRtn);

        sRtn = gts.mc.GT_LnXYZ(cardNum, crdNum, (int)(50 * axisScale), (int)(30 * axisScale), (int)(10 * axisScale), Vel2, Acc2, 0, 0);
        commandhandler("GT_LnXYZ", sRtn);

        sRtn = gts.mc.GT_LnXYZG0(cardNum, crdNum, (int)(60 * axisScale), (int)(70 * axisScale), (int)(10 * axisScale), Vel1, Acc1, 0);
        commandhandler("GT_LnXYZG0", sRtn);

        sRtn = gts.mc.GT_ArcXYC(cardNum, crdNum, (int)(60 * axisScale), (int)(70 * axisScale), (int)(0 * axisScale), (int)(-10 * axisScale), 1, Vel2, Acc2, 0, 0);
        commandhandler("GT_ArcXYC", sRtn);

        sRtn = gts.mc.GT_LnXYZG0(cardNum, crdNum, (int)(30 * axisScale), (int)(70 * axisScale), (int)(10 * axisScale), Vel1, Acc1, 0);
        commandhandler("GT_LnXYZG0", sRtn);

        sRtn = gts.mc.GT_LnXYZ(cardNum, crdNum, (int)(30 * axisScale), (int)(50 * axisScale), (int)(10 * axisScale), Vel2, Acc2, 0, 0);
        commandhandler("GT_LnXYZ", sRtn);

        sRtn = gts.mc.GT_LnXYZ(cardNum, crdNum, (int)(10 * axisScale), (int)(50 * axisScale), (int)(10 * axisScale), Vel2, Acc2, 0, 0);
        commandhandler("GT_LnXYZ", sRtn);

        sRtn = gts.mc.GT_LnXYZ(cardNum, crdNum, (int)(10 * axisScale), (int)(70 * axisScale), (int)(10 * axisScale), Vel2, Acc2, 0, 0);
        commandhandler("GT_LnXYZ", sRtn);

        sRtn = gts.mc.GT_LnXYZ(cardNum, crdNum, (int)(30 * axisScale), (int)(70 * axisScale), (int)(10 * axisScale), Vel2, Acc2, 0, 0);
        commandhandler("GT_LnXYZ", sRtn);

        sRtn = gts.mc.GT_LnXYZ(cardNum, crdNum, (int)(30 * axisScale), (int)(70 * axisScale), 0, Vel2, Acc2, 0, 0);
        commandhandler("GT_LnXYZ", sRtn);

        sRtn = gts.mc.GT_LnXYZG0(cardNum, crdNum, 0, 0, 0, Vel1, Acc1, 0);
        commandhandler("GT_LnXYZG0", sRtn);


        int temp = 0x1;
        int ltemp = crdNum - 1;
        int opCrd = temp << ltemp;
        // 启动运动
        sRtn = gts.mc.GT_CrdStart(cardNum, (short)opCrd, 0);
        commandhandler("GTN_CrdStart", sRtn);
        if (sRtn == 0)
        {
            LogHandler("启动加工!:");
            startTick = System.Environment.TickCount;
            do
            {
                gts.mc.GT_CrdStatus(cardNum, crdNum, out pRun, out pSegment, 0);
            } while (pRun == 1);
            endTick = System.Environment.TickCount;
            exeTick = endTick - startTick;
            LogHandler("加工完成\n加工总耗时:" + exeTick + "ms");

        }

    }
}

需要Demo源码请在下方下载!

我也是有底线哒~
GTS 插补运动的使用方法-工控吧!
GTS 插补运动的使用方法
此内容为付费资源,请付费后查看
300积分
付费资源
© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容