private void motionDO1_Click(object sender, EventArgs e){// TCrdPrm结构体变量,该结构体定义了坐标系GTN.mc.TCrdPrm crdprm;short sRtn = GTN.mc.GTN_GetCrdPrm(1, 1, out crdprm);crdprm.dimension = 2; // 坐标系为二维坐标系crdprm.synVelMax = 800; // 最大合成速度:500pulse/mscrdprm.synAccMax = 8; // 最大加速度:1pulse/ms^2crdprm.evenTime = 50; // 最小匀速时间:50mscrdprm.profile1 = 1; // 规划器1对应到X轴crdprm.profile2 = 2; // 规划器2对应到Y轴crdprm.setOriginFlag = 1; // 需要指定坐标系的原点坐标的规划位置crdprm.originPos1 = 0; // 坐标系的原点坐标的规划位置为(100, 100)crdprm.originPos2 = 0;sRtn = GTN.mc.GTN_SetCrdPrm(1, 1, ref crdprm);Task.Run(LookAheadTest);}private static void LookAheadTest(){short sRtn;int space;GTN.mc.TCrdData[] crdData = new GTN.mc.TCrdData[200]; //前瞻缓冲区int[] posTest = new int[2];// 初始化坐标系1的FIFO0的前瞻模块sRtn = GTN.mc.GTN_InitLookAhead(1, //core1, //crd 0, //fifo5, //T //拐弯时间7, //accMax 200, //nref crdData[0]); // 定义前瞻缓存区内存区//压插补数据:小线段加工posTest[0] = 0;posTest[1] = 0;{sRtn = mc.GTN_LnXY( //向前瞻缓冲区冲写入数据共300段1, //core1, //crd0 + posTest[0], //x0 + posTest[1], //y800, //vel6, //acc0, //velend0); //fifoif (0 != sRtn){do{// 查询运动缓存区空间,直至空间不为0sRtn = GTN.mc.GTN_CrdSpace(1, 1, out space, 0);} while (0 == space);// 重新调用上次失败的插补指令sRtn = GTN.mc.GTN_LnXY(1, 1, 0 + posTest[0], 0 + posTest[1], 800, 6, 0, 0);}posTest[0] = 3000000;posTest[1] = 0;sRtn = mc.GTN_LnXY( //向前瞻缓冲区冲写入数据第2段1, //core1, //crd0 + posTest[0], //x0 + posTest[1], //y800, //vel6, //acc0, //velend0); //fifoif (0 != sRtn){do{// 查询运动缓存区空间,直至空间不为0sRtn = GTN.mc.GTN_CrdSpace(1, 1, out space, 0);} while (0 == space);// 重新调用上次失败的插补指令sRtn = GTN.mc.GTN_LnXY(1, 1, 0 + posTest[0], 0 + posTest[1], 800, 6, 0, 0);}posTest[0] = 3000000;posTest[1] = 3000000;sRtn = mc.GTN_LnXY( //向前瞻缓冲区冲写入数据第3段1, //core1, //crd0 + posTest[0], //x0 + posTest[1], //y800, //vel6, //acc0, //velend0); //fifoif (0 != sRtn){do{// 查询运动缓存区空间,直至空间不为0sRtn = GTN.mc.GTN_CrdSpace(1, 1, out space, 0);} while (0 == space);// 重新调用上次失败的插补指令sRtn = GTN.mc.GTN_LnXY(1, 1, 0 + posTest[0], 0 + posTest[1], 800, 6, 0, 0);}posTest[0] = 0;posTest[1] = 3000000;sRtn = mc.GTN_LnXY( //向前瞻缓冲区冲写入数据第4段1, //core1, //crd0 + posTest[0], //x0 + posTest[1], //y800, //vel6, //acc0, //velend0); //fifoif (0 != sRtn){do{// 查询运动缓存区空间,直至空间不为0sRtn = GTN.mc.GTN_CrdSpace(1, 1, out space, 0);} while (0 == space);// 重新调用上次失败的插补指令sRtn = GTN.mc.GTN_LnXY(1, 1, 0 + posTest[0], 0 + posTest[1], 800, 6, 0, 0);}posTest[0] = 0;posTest[1] = 0;sRtn = mc.GTN_LnXY( //向前瞻缓冲区冲写入数据第5段1, //core1, //crd0 + posTest[0], //x0 + posTest[1], //y600, //vel5, //acc0, //velend0); //fifoif (0 != sRtn){do{// 查询运动缓存区空间,直至空间不为0sRtn = GTN.mc.GTN_CrdSpace(1, 1, out space, 0);} while (0 == space);// 重新调用上次失败的插补指令sRtn = GTN.mc.GTN_LnXY(1, 1, 0 + posTest[0], 0 + posTest[1], 800, 6, 0, 0);}}// 将前瞻缓存区中的数据压入控制器IntPtr crdDataNULL = new IntPtr();sRtn = GTN.mc.GTN_CrdData(1, 1, crdDataNULL, 0);// 启动运动sRtn = GTN.mc.GTN_CrdStart(1, 1, 0); //mask bit0 对应坐标系 1,bit1 对应坐标系 2,0:不启动该坐标系,1:启动该坐标系。}
拐弯时间(T):
GTN_InitLookAhead 指令的第三个参数,单位:ms。T 的经验范围是:1ms~10ms, T 越大,计算出来的终点速度越大,但却降低了加工精度;反之,提高了加工的精度,但计算出 的终点速度偏低。因此要合理选择 T 值。
最大加速度(accMax):
GTN_InitLookAhead 指令的第四个参数,单位:pulse/ms2。系统能承受的 最大加速度,根据不同的机械系统和电机驱动器取值不同。
前瞻缓存区(pLookAheadBuf):
前瞻缓存区是用户在应用程序中自己定义的,用于存放描述运动轨 迹的数组。用户应根据自己的需要以及计算机的条件定义合适的缓存区大小,并且要在 GTN_InitLookAhead 指令的第五个参数中说明数组的大小