/// <summary> /// safe door /axis alarm /// </summary> private void AlarmReport() { #region 急停 Globals.Invoker.SetCtl_BckColor(this.Btn_EMG, Gg.GetDi(0, Gg.InPutMMS0.紧急停止) == 1 ? Mycolor.Red : Color.LimeGreen); if (EmgSt.Bool_LDP(Gg.GetDi(0, Gg.InPutMMS0.紧急停止) == 1)) { EMG(); if (ShowList != null) { ShowList("紧急停止按下!"); } } EmgSt.Update(Gg.GetDi(0, Gg.InPutMMS0.紧急停止) == 1); if (EmgSt.PLF) { //PVar.LampStatus = 50; Globals.addList("紧急停止松开!", Mycolor.Red); } #endregion #region 实时扫描 安全门 等 Globals.Invoker.SetCtl_BckColor(this.CurtionSts, Gg.GetDi(0, Gg.InPutMMS0.安全光幕) == 1 ? Mycolor.Red : Color.LimeGreen); Globals.Invoker.SetCtl_BckColor(this.AirSts, Gg.GetDi(0, Gg.InPutMMS0.正气源感应表) == 1 ? Color.LimeGreen : Mycolor.Red); if (Globals.settingFunc.打开安全门 && PVar.Stop_Flag == false && PVar.MacHold == false && PVar.AutoRunFlag) { string tempStr = ""; string tempStr1 = ""; if (Gg.GetDi(0, Gg.InPutMMS0.后安全门感应器) == 0) { tempStr = "后安全门"; } if (Gg.GetDi(0, Gg.InPutMMS0.左安全门感应器) == 0) { tempStr = "左安全门"; } if (Gg.GetDi(0, Gg.InPutMMS0.右安全门感应器) == 0) { tempStr = "右安全门"; } if (!string.IsNullOrEmpty(tempStr)) { PVar.MacHold = true; PVar.Stop_Flag = false; if (ShowList != null) { ShowList("请关闭" + tempStr); } if (PauseClick != null) { PauseClick(true); } PVar.LampStatus = 20; } if (CurtionLDPF.Bool_LDP(Gg.GetDi(0, Gg.InPutMMS0.安全光幕) == 1)) { tempStr1 = "光栅触发!"; } if (!string.IsNullOrEmpty(tempStr1)) { PVar.MacHold = true; PVar.Stop_Flag = false; Globals.addList(tempStr1, Mycolor.ErrorRed); if (ShowList != null) { ShowList(tempStr1); } if (PauseClick != null) { PauseClick(true); } PVar.LampStatus = 20; } //this.SafeDoorSts.Checked = string.IsNullOrEmpty(tempStr); this.CurtionSts.BackColor = string.IsNullOrEmpty(tempStr1) ? Mycolor.LimeGreen : Color.Red; this.AirSts.BackColor = (Gg.GetDi(0, Gg.InPutMMS0.正气源感应表) == 1) ? Mycolor.LimeGreen : Color.Red; } #endregion #region 轴报警 if (Gg.Get_AlarmDi(0, Gg.InAlarmMMS0.测试Y轴) == 1) { Globals.PostAlarmMachine(XAlarmLevel.STOP, (int)AlarmCode.Y伺服电机驱动器报警, AlarmCategory.SYSTEM.ToString(), "Y伺服电机驱动器报警"); } if (Gg.GetLimitDi_F(0, (short)Gg.InAlarmMMS0.测试Y轴) == 1 && GoHome.Instance.Reset.Result) { Globals.PostAlarmMachine(XAlarmLevel.STOP, (int)AlarmCode.Y伺服电机驱动器报警, AlarmCategory.SYSTEM.ToString(), "Y伺服电机负极限报警"); } if (Gg.GetLimitDi_Z(0, (short)Gg.InAlarmMMS0.测试Y轴) == 1 && GoHome.Instance.Reset.Result) { Globals.PostAlarmMachine(XAlarmLevel.STOP, (int)AlarmCode.Y伺服电机驱动器报警, AlarmCategory.SYSTEM.ToString(), "Y伺服电机正极限报警"); } #endregion }
/// <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; } } }