/// <summary> /// GotoHome(short CardNum[卡号], short Axis[轴号], double homeToLimitFDist[极限到原点距离], double searchHomeDist[原点搜索距离], double offsetPos[感应宽度], double homeoffset[原点偏移距离], double vel[搜索原点速度]) /// </summary> /// <param name="CardNum"></param> /// <param name="Axis"></param> /// <param name="homeToLimitFDist"></param> /// <param name="searchHomeDist"></param> /// <param name="offsetPos"></param> /// <param name="homeoffset"></param> /// <param name="vel"></param> public static void GotoHome(short CardNum, short Axis, double homeToLimitFDist, double searchHomeDist, double offsetPos, double homeoffset, double vel) { uint temp_pClock = 0; if (GoHome.Instance.AxisHome[CardNum, Axis].Step != 0) { GoHome.Instance.AxisHome[CardNum, Axis].State = true; switch (GoHome.Instance.AxisHome[CardNum, Axis].Step) { case 10: gts.GT_ClrSts(CardNum, Axis, (short)1); //清除报警 gts.GT_SetPrfPos(CardNum, Axis, 0); //规划器置零 gts.GT_SetEncPos(CardNum, Axis, 0); //编码器置零 gts.GT_SynchAxisPos(CardNum, 1 << (Axis - 1)); //将当前轴进行位置同步 GoHome.Instance.AxisHome[CardNum, Axis].Counter = 0; //回原点计数 GoHome.Instance.AxisHome[CardNum, Axis].Step = 20; break; case 20: GoHome.Instance.AxisHome[CardNum, Axis].Capture = 0; if (Gg.GetHomeDi(CardNum, Axis) == 0) //判断是否在原点上 { if (GoHome.Instance.AxisHome[CardNum, Axis].Counter > 1) { GoHome.Instance.AxisHome[CardNum, Axis].Step = 140; } else { GoHome.Instance.AxisHome[CardNum, Axis].Counter = GoHome.Instance.AxisHome[CardNum, Axis].Counter + 1; GoHome.Instance.AxisHome[CardNum, Axis].Step = 30; //开始搜索原点 } } else { GoHome.Instance.AxisHome[CardNum, Axis].Step = 200; //偏离原点,方向与搜索原点方向相反 } break; case 30: gts.GT_ClrSts(CardNum, Axis, (short)1); gts.GT_SetCaptureMode(CardNum, Axis, gts.CAPTURE_HOME); //第一次原点搜索 GoHome.Instance.AxisHome[CardNum, Axis].TempPos = 0; Gg.AbsMotion(CardNum, Axis, System.Convert.ToDouble(Gg.GetPrfPosmm(CardNum, Axis) + searchHomeDist), vel); //启动运动,开始搜索原点 GoHome.Instance.AxisHome[CardNum, Axis].Step = 40; break; case 40: gts.GT_ClrSts(CardNum, Axis, (short)1); gts.GT_GetSts(CardNum, Axis, out GoHome.Instance.AxisHome[CardNum, Axis].status, (short)1, out temp_pClock); gts.GT_GetCaptureStatus(CardNum, Axis, out GoHome.Instance.AxisHome[CardNum, Axis].Capture, out GoHome.Instance.AxisHome[CardNum, Axis].TempPos, (short)1, out temp_pClock); //获取当前轴原点捕获的状态及捕获的当前位置 if (GoHome.Instance.AxisHome[CardNum, Axis].Capture == 1) //判断当前轴是否原点捕获触发 { Gg.AxisStop(CardNum, Axis); //当前轴停止 GoHome.Instance.AxisHome[CardNum, Axis].Capture = 0; GoHome.Instance.AxisHome[CardNum, Axis].Step = 50; } else if (Gg.GetLimitDi_Z(CardNum, Axis) == 1) //判断当前轴是否触发正极限 { Gg.AxisStop(CardNum, Axis); //当前轴停止 GoHome.Instance.AxisHome[CardNum, Axis].Step = 170; } else if (Gg.GetLimitDi_F(CardNum, Axis) == 1) //判断当前轴是否触发负极限 { Gg.AxisStop(CardNum, Axis); //当前轴停止 GoHome.Instance.AxisHome[CardNum, Axis].Step = 150; } else if (System.Convert.ToBoolean(GoHome.Instance.AxisHome[CardNum, Axis].status & 0x400) == false) //判断当前轴规划器是否运动停止(原点搜索距离太小) { GoHome.Instance.AxisHome[CardNum, Axis].Step = 140; } break; case 50: Gg.AbsMotion(CardNum, Axis, System.Convert.ToDouble(GoHome.Instance.AxisHome[CardNum, Axis].TempPos / Gg.PlusPerUnit(CardNum, Axis)) / Tools.GeerRate[CardNum, Axis] + 1, 2); //Gg.AbsMotion(CardNum, Axis, System.Convert.ToDouble(Gg.GetPrfPosmm(CardNum, Axis) + offsetPos), 10); //启动运动,原点反向运动 GoHome.Instance.AxisHome[CardNum, Axis].Step = 60; break; case 60: gts.GT_ClrSts(CardNum, Axis, (short)1); gts.GT_GetSts(CardNum, Axis, out GoHome.Instance.AxisHome[CardNum, Axis].status, (short)1, out temp_pClock); //获取当前轴的状态 if (System.Convert.ToBoolean(GoHome.Instance.AxisHome[CardNum, Axis].status & 0x400) == false) //判断当前轴是否运动停止 { GoHome.Instance.AxisHome[CardNum, Axis].Step = 70; } break; case 70: gts.GT_SetCaptureMode(CardNum, Axis, gts.CAPTURE_HOME); //第二次原点搜索 //hRtn = gts.GT_SetCaptureMode(CardNum, Axis,gts. CAPTURE_INDEX); //启动当前轴的Z相脉冲捕获 Gg.AbsMotion(CardNum, Axis, System.Convert.ToDouble(Gg.GetPrfPosmm(CardNum, Axis) - offsetPos * 2), 1); //以1mm/s速度找原点 GoHome.Instance.AxisHome[CardNum, Axis].Step = 80; //跳转到下一步 break; case 80: gts.GT_ClrSts(CardNum, Axis, (short)1); gts.GT_GetSts(CardNum, Axis, out GoHome.Instance.AxisHome[CardNum, Axis].status, (short)1, out temp_pClock); //获取当前轴的状态 gts.GT_GetCaptureStatus(CardNum, Axis, out GoHome.Instance.AxisHome[CardNum, Axis].Capture, out GoHome.Instance.AxisHome[CardNum, Axis].TempPos, (short)1, out temp_pClock); //获取当前轴Z相脉冲捕获的状态及捕获的当前位置 if (GoHome.Instance.AxisHome[CardNum, Axis].Capture == 1) //判断当前轴是否Z相脉冲捕获触发 { Gg.AxisStop(CardNum, Axis); //当前轴停止 GoHome.Instance.AxisHome[CardNum, Axis].Capture = 0; //捕获触发标志清零 GoHome.Instance.AxisHome[CardNum, Axis].Step = 90; } else if (System.Convert.ToBoolean(GoHome.Instance.AxisHome[CardNum, Axis].status & 0x400) == false) { GoHome.Instance.AxisHome[CardNum, Axis].Step = 140; //跳转到第110步(或脉冲未捕获,回原点结束,回原点失败) } break; case 90: if (homeoffset < 5) { Gg.AbsMotion(CardNum, Axis, System.Convert.ToDouble(GoHome.Instance.AxisHome[CardNum, Axis].TempPos / Gg.PlusPerUnit(CardNum, Axis) / Tools.GeerRate[CardNum, Axis]) + homeoffset, 2); } else { Gg.AbsMotion(CardNum, Axis, System.Convert.ToDouble(GoHome.Instance.AxisHome[CardNum, Axis].TempPos / Gg.PlusPerUnit(CardNum, Axis) / Tools.GeerRate[CardNum, Axis]) + homeoffset, 30); } GoHome.Instance.AxisHome[CardNum, Axis].Step = 100; break; case 100: gts.GT_ClrSts(CardNum, Axis, (short)1); gts.GT_GetSts(CardNum, Axis, out GoHome.Instance.AxisHome[CardNum, Axis].status, (short)1, out temp_pClock); if (System.Convert.ToBoolean(GoHome.Instance.AxisHome[CardNum, Axis].status & 0x400) == false) //判断当前轴是否运动停止 { GoHome.Instance.AxisHome[CardNum, Axis].oldtime = API.GetTickCount(); GoHome.Instance.AxisHome[CardNum, Axis].Step = 110; } break; case 110: if (API.GetTickCount() - GoHome.Instance.AxisHome[CardNum, Axis].oldtime > 200) { GoHome.Instance.AxisHome[CardNum, Axis].Step = 120; } break; case 120: gts.GT_SetPrfPos(CardNum, Axis, 0); //将当前轴规划器位置修改为零点 gts.GT_SetEncPos(CardNum, Axis, 0); //将当前轴编码器位置修改为零点 gts.GT_SynchAxisPos(CardNum, 1 << (Axis - 1)); //将当前轴进行位置同步 GoHome.Instance.AxisHome[CardNum, Axis].oldtime = API.GetTickCount(); GoHome.Instance.AxisHome[CardNum, Axis].Step = 130; break; case 130: if (API.GetTickCount() - GoHome.Instance.AxisHome[CardNum, Axis].oldtime > 50) { if (Gg.GetEncPos(CardNum, Axis) == 0 && Gg.GetPrfPos(CardNum, Axis) == 0) { GoHome.Instance.AxisHome[CardNum, Axis].Result = true; GoHome.Instance.AxisHome[CardNum, Axis].State = false; GoHome.Instance.AxisHome[CardNum, Axis].Step = 0; } else { GoHome.Instance.AxisHome[CardNum, Axis].oldtime = API.GetTickCount(); GoHome.Instance.AxisHome[CardNum, Axis].Step = 110; } } break; case 140: GoHome.Instance.AxisHome[CardNum, Axis].Result = false; GoHome.Instance.AxisHome[CardNum, Axis].State = false; GoHome.Instance.AxisHome[CardNum, Axis].Step = 0; break; //********************************************************************************************************************* case 150: //负极限和原点之间距离 gts.GT_ClrSts(CardNum, Axis, (short)1); Gg.AbsMotion(CardNum, Axis, System.Convert.ToDouble(Gg.GetPrfPosmm(CardNum, Axis) + homeToLimitFDist), vel * 0.5); GoHome.Instance.AxisHome[CardNum, Axis].Step = 160; break; case 160: gts.GT_ClrSts(CardNum, Axis, (short)1); gts.GT_GetSts(CardNum, Axis, out GoHome.Instance.AxisHome[CardNum, Axis].status, (short)1, out temp_pClock); if (System.Convert.ToBoolean(GoHome.Instance.AxisHome[CardNum, Axis].status & 0x400) == false) { GoHome.Instance.AxisHome[CardNum, Axis].Step = 20; //重新搜索原点 } break; //********************************************************************************************************************* case 170: //offsetPos大于感应片的宽度 gts.GT_ClrSts(CardNum, Axis, (short)1); Gg.AbsMotion(CardNum, Axis, System.Convert.ToDouble(Gg.GetPrfPosmm(CardNum, Axis) - offsetPos), vel); GoHome.Instance.AxisHome[CardNum, Axis].Step = 180; break; case 180: gts.GT_ClrSts(CardNum, Axis, (short)1); gts.GT_GetSts(CardNum, Axis, out GoHome.Instance.AxisHome[CardNum, Axis].status, (short)1, out temp_pClock); if (System.Convert.ToBoolean(GoHome.Instance.AxisHome[CardNum, Axis].status & 0x400) == false) { GoHome.Instance.AxisHome[CardNum, Axis].Step = 20; //重新搜索原点 } break; //********************************************************************************************************************* case 200: //offsetPos大于感应片的宽度 Gg.AbsMotion(CardNum, Axis, System.Convert.ToDouble(Gg.GetPrfPosmm(CardNum, Axis) + offsetPos), vel); GoHome.Instance.AxisHome[CardNum, Axis].Step = 201; break; case 201: if (Gg.GetHomeDi(CardNum, Axis) == 0) //判断是否在原点上 { Gg.AbsMotion(CardNum, Axis, System.Convert.ToDouble(Gg.GetPrfPosmm(CardNum, Axis) + 1), vel); GoHome.Instance.AxisHome[CardNum, Axis].oldtime = API.GetTickCount(); GoHome.Instance.AxisHome[CardNum, Axis].Step = 210; } else { gts.GT_ClrSts(CardNum, Axis, (short)1); gts.GT_GetSts(CardNum, Axis, out GoHome.Instance.AxisHome[CardNum, Axis].status, (short)1, out temp_pClock); if (System.Convert.ToBoolean(GoHome.Instance.AxisHome[CardNum, Axis].status & 0x400) == false) { GoHome.Instance.AxisHome[CardNum, Axis].oldtime = API.GetTickCount(); GoHome.Instance.AxisHome[CardNum, Axis].Step = 140; } } break; case 210: gts.GT_ClrSts(CardNum, Axis, (short)1); gts.GT_GetSts(CardNum, Axis, out GoHome.Instance.AxisHome[CardNum, Axis].status, (short)1, out temp_pClock); if (System.Convert.ToBoolean(GoHome.Instance.AxisHome[CardNum, Axis].status & 0x400) == false) { GoHome.Instance.AxisHome[CardNum, Axis].oldtime = API.GetTickCount(); GoHome.Instance.AxisHome[CardNum, Axis].Step = 220; } break; case (short)220: if (API.GetTickCount() - GoHome.Instance.AxisHome[CardNum, Axis].oldtime > 200) { if (Gg.GetHomeDi(CardNum, Axis) == 1) { GoHome.Instance.AxisHome[CardNum, Axis].Step = 140; } else { GoHome.Instance.AxisHome[CardNum, Axis].Step = 20; } } break; } } }
private void IO() { int Axisnum = (Globals.settingMachineInfo.什么机器 == WhichMachine.MMS)?1:1; //wl for (var i = 1; i <= Axisnum; i++) //王亮修改成一个轴,原来4个 { CardTmp = (int)(Conversion.Val(VB.Strings.Mid(System.Convert.ToString(this.Tag), System.Convert.ToInt32((i - 1) * 5 + 3), 1))); AxisTmp = (int)(Conversion.Val(VB.Strings.Mid(System.Convert.ToString(this.Tag), System.Convert.ToInt32((i - 1) * 5 + 5), 1))); if (AxisTmp != 0) { long StsValue = 0; StsValue = Gg.GetSts((short)CardTmp, (short)AxisTmp); if ((StsValue & 0x200) == 0) //使能 { mOvalShape[i, 1].FillColor = Color.White; } else { mOvalShape[i, 1].FillColor = Color.Lime; } if ((StsValue & 0x2) == 0) //报警 { mOvalShape[i, 2].FillColor = Color.White; } else { mOvalShape[i, 2].FillColor = Color.Lime; } if ((StsValue & 0x20) == 0) //正限位 { mOvalShape[i, 3].FillColor = Color.White; } else { mOvalShape[i, 3].FillColor = Color.Lime; } if (Gg.GetHomeDi((short)CardTmp, (short)AxisTmp) == 0) //原点 { mOvalShape[i, 4].FillColor = Color.White; } else { mOvalShape[i, 4].FillColor = Color.Lime; } if ((StsValue & 0x40) == 0) //负限位 { mOvalShape[i, 5].FillColor = Color.White; } else { mOvalShape[i, 5].FillColor = Color.Lime; } if ((StsValue & 0x400) == 0) //运动标志 { mOvalShape[i, 6].FillColor = Color.White; } else { mOvalShape[i, 6].FillColor = Color.Lime; } if ((StsValue & 0x10) == 0) //误差标志 { mOvalShape[i, 7].FillColor = Color.White; } else { mOvalShape[i, 7].FillColor = Color.Lime; } } else { if ((int)i == 1) { X_Axis_Name.Visible = false; } else if ((int)i == 2) { Y_Axis_Name.Visible = false; } else if ((int)i == 3) { Z_Axis_Name.Visible = false; } else if ((int)i == 4) { R_Axis_Name.Visible = false; } for (var j = 1; j <= 7; j++) { mOvalShape[i, j].Visible = false; } } } }