在切割、点胶、焊接等需要跑轨迹的场合,插补运动是必不可少的运动模式。固高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源码请在下方下载!

我也是有底线哒~
© 版权声明
THE END
暂无评论内容