private void IO() { for (var i = 1; i <= 4; i++) { 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; } } } }
public static void AutoRun(ref PVar.WorkType StaWork) { try { switch (StaWork.Step) { case 10: if (PVar.Stop_Flag == false) { StaWork.Result = false; StaWork.State = false; PressTime.InitialTime(); StaWork.Step = 20; } break; case 20: if (StaWork.State == false && StaWork.Enable) { AddList("保压开始!"); StaWork.Enable = false; StaWork.State = true; PressTime.InitialTime(); StaWork.Step = 30; } break; case 30: if (EpsonRobot.RobotLivePos.Y > -200) //判断机械手是否在流水线外 { AddList("保压无杆气缸向左移动!"); Gg.SetExDo(0, 0, Gg.OutPut1.保压无杆气缸左, 1); Gg.SetExDo(0, 0, Gg.OutPut1.保压无杆气缸右, 0); Command.Com1_Send(Command.压力控制打开); PressTime.InitialTime(); StaWork.Step = 40; } break; case 40: if (Gg.GetExDi(0, Gg.InPut1.保压无杆气缸左) == 1 && Gg.GetExDi(0, Gg.InPut1.保压无杆气缸右) == 0) { PressTime.InitialTime(); StaWork.Step = 50; } else if (PressTime.TimeIsUp(8000)) { AddList("保压无杆气缸左信号感应异常!"); ShowList("保压无杆气缸左信号感应异常!"); PressTime.InitialTime(); BufferStep = 40; StaWork.Step = 8000; } break; case 50: if (PressTime.TimeIsUp(200)) { BVar.ProData[2, 6] = Frm_Engineering.fEngineering.Press1_Text.Text; //获取自重的压力值 Gg.AbsMotion(0, Axis.保压Z轴, mFunction.Pos.TeachAxis1[Axis.tTag.保压, Axis.Point保压.保压位置], PVar.ParAxis.Speed[Axis.保压Z轴]); PressTime.InitialTime(); StaWork.Step = 60; } break; case 60: if (Gg.ZSPD(0, Axis.保压Z轴)) { PressTime.InitialTime(); StaWork.Step = 70; } break; case 70: if (PressTime.TimeIsUp((int)PVar.ParList.Data[44] * 1000)) //配重块保压时间 { AddList("保压时间为:" + PVar.ParList.Data[44] * 1000 + "S"); Gg.AbsMotion(0, Axis.保压Z轴, mFunction.Pos.TeachAxis1[Axis.tTag.保压, Axis.Point保压.初始位置], PVar.ParAxis.Speed[Axis.保压Z轴]); PressTime.InitialTime(); StaWork.Step = 80; } break; case 80: //保压轴和气缸复位 if (Gg.ZSPD(0, Axis.保压Z轴) && Gg.GetHomeDi(0, Axis.保压Z轴) == 1) { //保压站无杆气缸双头电磁阀向右 AddList("保压无杆气缸向右移动!"); Gg.SetExDo(0, 0, Gg.OutPut1.保压无杆气缸左, 0); Gg.SetExDo(0, 0, Gg.OutPut1.保压无杆气缸右, 1); PressTime.InitialTime(); StaWork.Step = 90; } break; case 90: if (Gg.GetExDi(0, Gg.InPut1.保压无杆气缸左) == 0 && Gg.GetExDi(0, Gg.InPut1.保压无杆气缸右) == 1) { AddList("保压工作完成!"); PressTime.InitialTime(); StaWork.Step = 100; } else if (PressTime.TimeIsUp(5000)) { AddList("保压无杆气缸右信号感应异常!"); ShowList("保压无杆气缸右信号感应异常!"); BufferStep = 90; StaWork.Step = 8000; } break; case 100: //复位流水线2等待状态 PVar.Sta_Work[(int)BVar.工位.流水线2].IsReady = false; PressTime.InitialTime(); StaWork.Step = 800; break; case 800: StaWork.Enable = false; StaWork.State = false; StaWork.Step = 10; break; case 1000: StaWork.Enable = false; StaWork.Result = false; StaWork.State = false; StaWork.Step = 10; break; //遇到异常,设备先暂停,确定后处理************************ case 8000: PVar.IsSystemOnPauseMode = true; PVar.MacHold = true; StaWork.StaHold = true; PVar.Stop_Flag = false; Frm_Main.fMain.Btn_Start.Enabled = false; Frm_Main.fMain.Btn_Pause.Enabled = true; Frm_Main.fMain.Btn_Stop.Enabled = false; Frm_Main.fMain.Btn_Start.BZ_BackColor = PVar.BZColor_UnselectedBtn; Frm_Main.fMain.Btn_Pause.BZ_BackColor = PVar.BZColor_SelectedEndBtn; Frm_Main.fMain.Btn_Stop.BZ_BackColor = PVar.BZColor_UnselectedBtn; Frm_Engineering.fEngineering.Auto_Timer.Enabled = false; PVar.LampStatus = 20; StaWork.Step = BufferStep; break; } } catch (Exception exc) { string Error_Str = ""; string Error_Str1 = ""; Frm_Engineering.fEngineering.MacStop(); MessageBox.Show(exc.Message); Error_Str = PVar.BZ_LogPath + DateTime.Now.ToString("yyyyMMdd") + "\\" + DateTime.Now.ToString("yyyyMMdd") + "_代码异常记录" + ".txt"; Error_Str1 = "\r\n" + "※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※" + "\r\n" + "[" + DateTime.Now.ToString("HH:mm:ss") + "]" + "\r\n" + exc.ToString(); FileRw.WriteDattxt(Error_Str, Error_Str1); } }
public static void AutoRun(ref PVar.WorkType StaWork) { try { switch (StaWork.Step) { case 10: if (PVar.Stop_Flag == false) { StaWork.State = false; StaWork.Result = false; Line2Time.InitialTime(); StaWork.Step = 20; } break; case 20: if (PVar.空跑) { if (StaWork.State == false && StaWork.Enable && StaWork.IsHaveFix) { AddList("组装开始!"); StaWork.State = true; StaWork.Enable = false; BVar.ProData[2, 1] = BVar.ProData[1, 1]; //Bezel条码 BVar.ProData[2, 3] = BVar.ProData[1, 3]; //载具条码 Frm_Engineering.fEngineering.Lab_Station2.Text = BVar.ProData[2, 1]; Gg.SetExDo(0, 0, Gg.OutPut1.载具夹紧气缸, 1); Gg.SetExDo(0, 1, Gg.OutPut2.载具上产品真空吸, 1); Gg.SetExDo(0, 1, Gg.OutPut2.载具上产品破真空, 0); Line2Time.InitialTime(); StaWork.Step = 30; } else { if (Line2Time.TimeIsUp(20)) { Line2Time.InitialTime(); StaWork.Step = 10; } } } else //******************************************** { if (StaWork.State == false && StaWork.Enable && StaWork.IsHaveFix) { AddList("组装开始!"); StaWork.State = true; StaWork.Enable = false; BVar.ProData[2, 1] = BVar.ProData[1, 1]; //Bezel条码 BVar.ProData[2, 3] = BVar.ProData[1, 3]; //载具条码 Frm_Engineering.fEngineering.Lab_Station2.Text = BVar.ProData[2, 1]; Gg.SetExDo(0, 0, Gg.OutPut1.载具夹紧气缸, 1); Gg.SetExDo(0, 1, Gg.OutPut2.载具上产品真空吸, 1); Gg.SetExDo(0, 1, Gg.OutPut2.载具上产品破真空, 0); Line2Time.InitialTime(); StaWork.Step = 30; } else if (StaWork.State == false && StaWork.Enable == false && StaWork.IsHaveFix) { AddList("没有条码,跳过组装!"); StaWork.Result = false; Line2Time.InitialTime(); StaWork.Step = 5000; //等待放行 } else { StaWork.Step = 10; } } break; case 30: AddList("保压Z轴回初始位置!"); Gg.AbsMotion(0, Axis.保压Z轴, mFunction.Pos.TeachAxis1[Axis.tTag.保压, Axis.Point保压.初始位置], PVar.ParAxis.Speed[Axis.保压Z轴]); Line2Time.InitialTime(); StaWork.Step = 40; break; case 40: //保压轴和气缸复位 if (Gg.ZSPD(0, Axis.保压Z轴) && Gg.GetHomeDi(0, Axis.保压Z轴) == 1) { //保压站无杆气缸双头电磁阀向右 AddList("保压Z轴OK!"); Gg.SetExDo(0, 0, Gg.OutPut1.保压无杆气缸左, 0); Gg.SetExDo(0, 0, Gg.OutPut1.保压无杆气缸右, 1); Line2Time.InitialTime(); StaWork.Step = 50; } else if (Line2Time.TimeIsUp(8000)) { AddList("保压Z轴运动到初始位置超时!"); ShowList("保压Z轴运动到初始位置超时!"); StaWork.Result = false; Line2Time.InitialTime(); StaWork.Step = 10000; } break; case 50: if (Gg.GetExDi(0, Gg.InPut1.保压无杆气缸左) == 0 && Gg.GetExDi(0, Gg.InPut1.保压无杆气缸右) == 1) { if (EpsonRobot.RobotLivePos.Y > -150) //判断机械手是否在流水线外 { Gg.SetExDo(0, 0, Gg.OutPut1.光源旋转气缸, 1); } Line2Time.InitialTime(); StaWork.Step = 60; } else if (Line2Time.TimeIsUp(5000)) { AddList("保压无杆气缸右信号感应异常!"); ShowList("保压无杆气缸右信号感应异常!"); StaWork.Result = false; Line2Time.InitialTime(); StaWork.Step = 5000; //等待放行 } break; case 60: if (Gg.GetExDi(0, Gg.InPut1.载具夹紧气缸缩回) == 0 && Gg.GetExDi(0, Gg.InPut1.载具夹紧气缸伸出) == 1) { AddList("载具夹紧气缸伸出信号OK!"); AddList("等待光源旋转气缸伸出信号感应!"); Line2Time.InitialTime(); StaWork.Step = 70; } else if (Line2Time.TimeIsUp(2000) && Gg.GetExDi(0, Gg.InPut1.载具夹紧气缸缩回) == 0) { AddList("保载具夹紧气缸伸出信号感应异常!"); Line2Time.InitialTime(); StaWork.Step = 70; //小异常忽略 } break; case 70: if (Gg.GetExDi(0, Gg.InPut1.光源旋转气缸缩回) == 0 && Gg.GetExDi(0, Gg.InPut1.光源旋转气缸伸出) == 1) { AddList("光源旋转气缸伸出信号感应OK!"); Line2Time.InitialTime(); StaWork.Step = 200; } else { if (EpsonRobot.RobotLivePos.Y > -200) //判断机械手是否在流水线外 { Gg.SetExDo(0, 0, Gg.OutPut1.光源旋转气缸, 1); } } break; //相机拍照 case 200: CCD_CMD = "T31" + "," + BVar.ProData[2, 1] + "," + EpsonRobot.RobotLivePos.X + "," + EpsonRobot.RobotLivePos.Y + "," + EpsonRobot.RobotLivePos.U; sRtn = Command.TCP_CCD_Send(CCD_CMD); AddList("Bezel定位拍照"); if (PVar.空跑) { Line2Time.InitialTime(); StaWork.Step = 210; } else { if (sRtn == 1) //命令发送成功 { Line2Time.InitialTime(); StaWork.Step = 210; } else { AddList("T31命令发送失败!"); ShowList("T31命令发送失败!"); Line2Time.InitialTime(); StaWork.Step = 1000; } } break; case 210: if (PVar.空跑) { if (Line2Time.TimeIsUp(2000)) { AddList("<<- Recevied:" + PVar.CCD_StrData); Gg.SetExDo(0, 0, Gg.OutPut1.光源旋转气缸, 0); Line2Time.InitialTime(); StaWork.Step = 220; } } else //**************************************************** { if (Command.CCD_Resule && PVar.CCD_Data[0] == "T31") { AddList("<<- Recevied:" + PVar.CCD_StrData); Gg.SetExDo(0, 0, Gg.OutPut1.光源旋转气缸, 0); Line2Time.InitialTime(); StaWork.Step = 220; } else { if (Line2Time.TimeIsUp(5000)) { AddList("等待CCD T31数据超时!"); ShowList("等待CCD T31数据超时!"); Line2Time.InitialTime(); StaWork.Step = 1000; } } } break; case 220: if (PVar.空跑) { AddList("拍照OK,开始等待机械手开始工作结束"); Gg.SetExDo(0, 1, Gg.OutPut2.载具上产品真空吸, 0); PVar.Sta_Work[(int)BVar.工位.机械手].Enable = true; //允许机械手开始工作,目前不考虑CT,后续提前并行 Line2Time.InitialTime(); StaWork.Step = 230; } else { if (PVar.CCD_Data[1] == "1") { AddList("拍照OK,开始等待机械手开始工作结束"); PVar.Sta_Work[(int)BVar.工位.机械手].Enable = true; //允许机械手开始工作,目前不考虑CT,后续提前并行 Line2Time.InitialTime(); StaWork.Step = 230; } else { AddList("Bezel拍照NG,异常直接流出"); StaWork.Result = false; Line2Time.InitialTime(); StaWork.Step = 5000; } } break; case 230: if (Gg.GetExDi(0, Gg.InPut1.光源旋转气缸缩回) == 1 && Gg.GetExDi(0, Gg.InPut1.光源旋转气缸伸出) == 0) { AddList("光源旋转气缸缩回信号感应OK!"); StaWork.IsReady = true; //所有准备就绪,等待机械手完成 Line2Time.InitialTime(); StaWork.Step = 300; } else if (Line2Time.TimeIsUp(5000)) { AddList("光源旋转气缸缩回超时!"); ShowList("光源旋转气缸缩回超时!"); Line2Time.InitialTime(); StaWork.Step = 5000; } break; //************************************************************************************************ //等待机械手装配完成 case 300: if (StaWork.IsReady == false) { AddList("装配完成,开始复检!"); Line2Time.InitialTime(); StaWork.Step = 310; } break; case 310: if (Gg.GetExDi(0, Gg.InPut1.光源旋转气缸缩回) == 0 && Gg.GetExDi(0, Gg.InPut1.光源旋转气缸伸出) == 1) { AddList("光源旋转气缸伸出信号感应OK!"); Line2Time.InitialTime(); StaWork.Step = 320; } else { if (EpsonRobot.RobotLivePos.Y > -150) //判断机械手是否在流水线外 { Gg.SetExDo(0, 0, Gg.OutPut1.光源旋转气缸, 1); } } break; case 320: CCD_CMD = "T33" + "," + BVar.ProData[2, 1] + "," + EpsonRobot.RobotLivePos.X + "," + EpsonRobot.RobotLivePos.Y + "," + EpsonRobot.RobotLivePos.U; sRtn = Command.TCP_CCD_Send(CCD_CMD); AddList("Bezel下相机复检拍照"); if (PVar.空跑) { Line2Time.InitialTime(); StaWork.Step = 330; } else { if (sRtn == 1) //命令发送成功 { Line2Time.InitialTime(); StaWork.Step = 330; } else { AddList("T33命令发送失败!"); ShowList("T33命令发送失败!"); Line2Time.InitialTime(); StaWork.Step = 1000; } } break; case 330: if (PVar.空跑) { if (Line2Time.TimeIsUp(1000)) { AddList("<<- Recevied:" + PVar.CCD_StrData); Line2Time.InitialTime(); StaWork.Step = 340; } } else { if (Command.CCD_Resule && PVar.CCD_Data[0] == "T33") { AddList("<<- Recevied:" + PVar.CCD_StrData); Line2Time.InitialTime(); StaWork.Step = 340; } else { if (Line2Time.TimeIsUp(5000)) { AddList("等待CCD T33数据超时!"); ShowList("等待CCD T33数据超时!"); Line2Time.InitialTime(); StaWork.Step = 1000; } } } break; case 340: if (PVar.空跑) { AddList("拍照OK"); Line2Time.InitialTime(); StaWork.Step = 350; } else { if (PVar.CCD_Data[1] == "1") { AddList("拍照OK"); Line2Time.InitialTime(); StaWork.Step = 350; } else { AddList("Bezel拍照NG,异常直接流出"); StaWork.Result = false; Line2Time.InitialTime(); StaWork.Step = 5000; } } break; case 350: CCD_CMD = "T41" + "," + BVar.ProData[2, 1] + "," + EpsonRobot.RobotLivePos.X + "," + EpsonRobot.RobotLivePos.Y + "," + EpsonRobot.RobotLivePos.U; sRtn = Command.TCP_CCD_Send(CCD_CMD); AddList("Bezel上相机复检拍照"); if (PVar.空跑) { Line2Time.InitialTime(); StaWork.Step = 360; } else { if (sRtn == 1) //命令发送成功 { Line2Time.InitialTime(); StaWork.Step = 360; } else { AddList("T41命令发送失败!"); ShowList("T41命令发送失败!"); Line2Time.InitialTime(); StaWork.Step = 1000; } } break; case 360: if (PVar.空跑) { if (Line2Time.TimeIsUp(1000)) { AddList("<<- Recevied:" + PVar.CCD_StrData); Line2Time.InitialTime(); StaWork.Step = 370; } } else { if (Command.CCD_Resule && PVar.CCD_Data[0] == "T41") { AddList("<<- Recevied:" + PVar.CCD_StrData); Line2Time.InitialTime(); StaWork.Step = 370; } else { if (Line2Time.TimeIsUp(5000)) { AddList("等待CCD T41数据超时!"); ShowList("等待CCD T41数据超时!"); Line2Time.InitialTime(); StaWork.Step = 1000; } } } break; case 370: if (PVar.空跑) { AddList("拍照OK,开始上传PDCA"); Line2Time.InitialTime(); StaWork.Step = 380; } else { if (PVar.CCD_Data[1] == "1") { AddList("拍照OK,开始上传PDCA"); Line2Time.InitialTime(); StaWork.Step = 380; } else { AddList("Bezel拍照NG,异常直接流出"); StaWork.Result = false; Line2Time.InitialTime(); StaWork.Step = 5000; } } break; case 380: Line2Time.InitialTime(); StaWork.Step = 505; break; //复检检测输出值 //*********************************************** case 505: Gg.SetDo(0, Gg.OutPut0.阻挡气缸3, 0); Gg.SetExDo(0, 0, Gg.OutPut1.载具夹紧气缸, 0); Gg.SetExDo(0, 1, Gg.OutPut2.载具上产品真空吸, 0); Gg.SetExDo(0, 1, Gg.OutPut2.载具上产品破真空, 1); Line2Time.InitialTime(); StaWork.Step = 510; break; case 510: if (Gg.GetExDi(0, Gg.InPut1.载具夹紧气缸缩回) == 1 && Gg.GetExDi(0, Gg.InPut1.载具夹紧气缸伸出) == 0) { AddList("装配完成,等待放行!"); Line2Time.InitialTime(); StaWork.Step = 600; } else if (Line2Time.TimeIsUp(3000)) { AddList("保载具夹紧气缸伸出信号感应异常!"); Line2Time.InitialTime(); StaWork.Step = 400; } break; case 600: if (PVar.空跑) { if (PVar.Stop_Flag == false && Linechange.LineOut() == 0 && PVar.Sta_Work[(int)BVar.工位.流水线3].State == false) { AddList("载具开始放行,等待流水线3接收!"); Gg.SetExDo(0, 1, Gg.OutPut2.载具上产品破真空, 0); Frm_Engineering.fEngineering.Txt_BarCode.Text = ""; Linechange.SetMotor2(true, PVar.ParList.Data[43]); Linechange.SetMotor3(true, PVar.ParList.Data[43]); Line2Time.InitialTime(); StaWork.Step = 610; } else { if (PVar.Stop_Flag) { StaWork.State = false; Line2Time.InitialTime(); StaWork.Step = 10; } } } else //****************************************************** { //等待放行***************************** if (PVar.Stop_Flag == false && Linechange.LineOut() == 0 && PVar.Sta_Work[(int)BVar.工位.流水线3].State == false) { AddList("载具开始放行,等待流水线3接收!"); Frm_Engineering.fEngineering.Txt_BarCode.Text = ""; Linechange.SetMotor2(true, PVar.ParList.Data[43]); Linechange.SetMotor3(true, PVar.ParList.Data[43]); Line2Time.InitialTime(); StaWork.Step = 610; } } break; case 610: if (PVar.空跑) { if (Line2Time.TimeIsUp(1000)) { AddList("载具开始放行!"); Line2Time.InitialTime(); StaWork.Step = 620; } } else { if (Gg.GetExDi(1, Gg.InPut2.流水线对射感应4) == 0) { AddList("载具开始放行!"); Line2Time.InitialTime(); StaWork.Step = 620; } else if (Line2Time.TimeIsUp(5000)) { AddList("流水线2放行载具超时!"); ShowList("流水线2放行载具超时!"); Line2Time.InitialTime(); StaWork.Step = 620; } } break; case 620: if (PVar.空跑) { if (Line2Time.TimeIsUp(1000)) { AddList("流水线2载具开始放行完成!"); //*********************************************************应该可以开始接受上站载具 PVar.Sta_Work[(int)BVar.工位.流水线3].IsHaveFix = true; Line2Time.InitialTime(); StaWork.Step = 630; } } else { if (Gg.GetExDi(1, Gg.InPut2.流水线对射感应5) == 0) { AddList("流水线2载具开始放行完成!"); //*********************************************************应该可以开始接受上站载具 PVar.Sta_Work[(int)BVar.工位.流水线3].IsHaveFix = true; Gg.SetDo(0, Gg.OutPut0.阻挡气缸3, 1); Line2Time.InitialTime(); StaWork.Step = 630; } else if (Line2Time.TimeIsUp(5000)) { AddList("流水线2放行载具超时!"); ShowList("流水线2放行载具超时!"); Line2Time.InitialTime(); StaWork.Step = 630; } } break; case 630: if (Line2Time.TimeIsUp(500)) { AddList("流水线2载具放行完成!"); Gg.SetDo(0, Gg.OutPut0.阻挡气缸3, 1); PVar.Sta_Work[(int)BVar.工位.流水线2].IsHaveFix = false; PVar.Sta_Work[(int)BVar.工位.流水线3].IsHaveFix = true; Linechange.SetMotor2(false, PVar.ParList.Data[43]); Line2Time.InitialTime(); StaWork.Step = 650; } break; case 650: if (Line2Time.TimeIsUp(200)) { Line2Time.InitialTime(); StaWork.Step = 800; } break; case 800: StaWork.Enable = false; StaWork.Result = true; StaWork.State = false; Manual.AutoMotionFlag[2] = false; StaWork.Step = 10; break; case 1000: StaWork.Enable = false; StaWork.Result = false; StaWork.State = false; Manual.AutoMotionFlag[2] = false; StaWork.Step = 10; break; } } catch (Exception exc) { string Error_Str = ""; string Error_Str1 = ""; Frm_Engineering.fEngineering.MacStop(); MessageBox.Show(exc.Message); Error_Str = PVar.BZ_LogPath + DateTime.Now.ToString("yyyyMMdd") + "\\" + DateTime.Now.ToString("yyyyMMdd") + "_代码异常记录" + ".txt"; Error_Str1 = "\r\n" + "※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※※" + "\r\n" + "[" + DateTime.Now.ToString("HH:mm:ss") + "]" + "\r\n" + exc.ToString(); FileRw.WriteDattxt(Error_Str, Error_Str1); } }
private void Output_Click(dynamic sender, EventArgs e) { int tag; tag = Convert.ToInt32(this.Tag); switch (tag) { case 1: if (sender.Text == "ON") { if (Convert.ToInt32(sender.Tag) == 2) //保压无杆气缸 { if (Gg.GetHomeDi(0, 4) == 0) { ShowList("保压Z轴不在安全高度,禁止气缸运动!"); return; } if (Frm_Engineering.fEngineering.Tcp_RobotData.IsStart == false) //判断机械手是否在流水线外 { ShowList("请先确认机械手网络,无法确认位置状态!"); return; } if (EpsonRobot.RobotLivePos.Y < -150) //判断机械手是否在流水线外 { ShowList("请先把机械移开,或工程师更改安全位置!"); return; } if (!(Gg.GetExDi(0, Gg.InPut1.光源旋转气缸伸出) == 0 && Gg.GetExDi(0, Gg.InPut1.光源旋转气缸缩回) == 1)) { ShowList("光源旋转气缸不在缩回状态或请检测信号异常!"); return; } mFunction.mSetDO(System.Convert.ToInt32(this.Tag), 2, 1); mFunction.mSetDO(System.Convert.ToInt32(this.Tag), 3, 0); } else if (Convert.ToInt32(sender.Tag) == 3) { if (Gg.GetHomeDi(0, 4) == 0) { ShowList("保压Z轴不在安全高度,禁止气缸运动!"); return; } mFunction.mSetDO(System.Convert.ToInt32(this.Tag), 2, 0); mFunction.mSetDO(System.Convert.ToInt32(this.Tag), 3, 1); } else if (Convert.ToInt32(sender.Tag) == 14) { if (!(Gg.GetExDi(0, Gg.InPut1.保压无杆气缸左) == 0 && Gg.GetExDi(0, Gg.InPut1.保压无杆气缸右) == 1)) { ShowList("保压无杆气缸不在右侧或请检测信号异常!"); return; } if (Frm_Engineering.fEngineering.Tcp_RobotData.IsStart == false) //判断机械手是否在流水线外 { ShowList("请先确认机械手网络,无法确认位置状态!"); return; } if (EpsonRobot.RobotLivePos.Y < -150) //判断机械手是否在流水线外 { ShowList("请先把机械移开,或工程师更改安全位置!"); return; } mFunction.mSetDO(System.Convert.ToInt32(this.Tag), System.Convert.ToInt32(sender.Tag), 1); } else { mFunction.mSetDO(System.Convert.ToInt32(this.Tag), System.Convert.ToInt32(sender.Tag), 1); } } else { if (Convert.ToInt32(sender.Tag) == 2) { if (Gg.GetHomeDi(0, 4) == 0) { ShowList("保压Z轴不在安全高度,禁止气缸运动!"); return; } mFunction.mSetDO(System.Convert.ToInt32(this.Tag), 2, 0); mFunction.mSetDO(System.Convert.ToInt32(this.Tag), 3, 1); } else if (Convert.ToInt32(sender.Tag) == 3) { if (Gg.GetHomeDi(0, 4) == 0) { ShowList("保压Z轴不在安全高度,禁止气缸运动!"); return; } if (Frm_Engineering.fEngineering.Tcp_RobotData.IsStart == false) //判断机械手是否在流水线外 { ShowList("请先确认机械手网络,无法确认位置状态!"); return; } if (EpsonRobot.RobotLivePos.Y < -150) //判断机械手是否在流水线外 { ShowList("请先把机械移开,或工程师更改安全位置!"); return; } if (!(Gg.GetExDi(0, Gg.InPut1.光源旋转气缸伸出) == 0 && Gg.GetExDi(0, Gg.InPut1.光源旋转气缸缩回) == 1)) { ShowList("光源旋转气缸不在缩回状态或请检测信号异常!"); return; } mFunction.mSetDO(System.Convert.ToInt32(this.Tag), 2, 1); mFunction.mSetDO(System.Convert.ToInt32(this.Tag), 3, 0); } else { mFunction.mSetDO(System.Convert.ToInt32(this.Tag), System.Convert.ToInt32(sender.Tag), 0); } } break; case 3: if (sender.Text == "ON") { if (Convert.ToInt32(sender.Tag) == 11) { mFunction.mSetDO(System.Convert.ToInt32(this.Tag), 11, 1); mFunction.mSetDO(System.Convert.ToInt32(this.Tag), 12, 0); } else if (Convert.ToInt32(sender.Tag) == 12) { mFunction.mSetDO(System.Convert.ToInt32(this.Tag), 11, 0); mFunction.mSetDO(System.Convert.ToInt32(this.Tag), 12, 1); } else if (Convert.ToInt32(sender.Tag) == 13) { mFunction.mSetDO(System.Convert.ToInt32(this.Tag), 13, 1); mFunction.mSetDO(System.Convert.ToInt32(this.Tag), 14, 0); } else if (Convert.ToInt32(sender.Tag) == 14) { mFunction.mSetDO(System.Convert.ToInt32(this.Tag), 13, 0); mFunction.mSetDO(System.Convert.ToInt32(this.Tag), 14, 1); } else { mFunction.mSetDO(System.Convert.ToInt32(this.Tag), System.Convert.ToInt32(sender.Tag), 1); } } else { if (Convert.ToInt32(sender.Tag) == 11) { mFunction.mSetDO(System.Convert.ToInt32(this.Tag), 11, 0); mFunction.mSetDO(System.Convert.ToInt32(this.Tag), 12, 1); } else if (Convert.ToInt32(sender.Tag) == 12) { mFunction.mSetDO(System.Convert.ToInt32(this.Tag), 11, 1); mFunction.mSetDO(System.Convert.ToInt32(this.Tag), 12, 0); } else if (Convert.ToInt32(sender.Tag) == 13) { mFunction.mSetDO(System.Convert.ToInt32(this.Tag), 13, 0); mFunction.mSetDO(System.Convert.ToInt32(this.Tag), 14, 1); } else if (Convert.ToInt32(sender.Tag) == 14) { mFunction.mSetDO(System.Convert.ToInt32(this.Tag), 13, 1); mFunction.mSetDO(System.Convert.ToInt32(this.Tag), 14, 0); } else { mFunction.mSetDO(System.Convert.ToInt32(this.Tag), System.Convert.ToInt32(sender.Tag), 0); } } break; default: if (sender.Text == "ON") { mFunction.mSetDO(System.Convert.ToInt32(this.Tag), System.Convert.ToInt32(sender.Tag), 1); } else { mFunction.mSetDO(System.Convert.ToInt32(this.Tag), System.Convert.ToInt32(sender.Tag), 0); } break; } IO(); }
/// <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.AxisHome[CardNum, Axis].Step != 0) { Frm_Engineering.fEngineering.textBox3.Text = GoHome.AxisHome[CardNum, Axis].Step.ToString(); GoHome.AxisHome[CardNum, Axis].State = true; switch (GoHome.AxisHome[CardNum, Axis].Step) { case 10: InitTimeH[CardNum, Axis] = new Tool.Delay(); 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.AxisHome[CardNum, Axis].Counter = 0; //回原点计数 GoHome.AxisHome[CardNum, Axis].Step = 20; break; case 20: GoHome.AxisHome[CardNum, Axis].Capture = 0; if (Gg.GetHomeDi(CardNum, Axis) == 0) //判断是否在原点上 { if (GoHome.AxisHome[CardNum, Axis].Counter > 1) { GoHome.AxisHome[CardNum, Axis].Step = 140; } else { GoHome.AxisHome[CardNum, Axis].Counter = GoHome.AxisHome[CardNum, Axis].Counter + 1; GoHome.AxisHome[CardNum, Axis].Step = 30; //开始搜索原点 } } else { GoHome.AxisHome[CardNum, Axis].Step = 200; //偏离原点,方向与搜索原点方向相反 } break; case 30: gts.GT_ClrSts(CardNum, Axis, (short)1); gts.GT_SetCaptureMode(CardNum, Axis, gts.CAPTURE_HOME); //第一次原点搜索 GoHome.AxisHome[CardNum, Axis].TempPos = 0; Gg.AbsMotion(CardNum, Axis, System.Convert.ToDouble(Gg.GetPrfPosmm(CardNum, Axis) + searchHomeDist), vel); //启动运动,开始搜索原点 GoHome.AxisHome[CardNum, Axis].Step = 40; break; case 40: gts.GT_ClrSts(CardNum, Axis, (short)1); gts.GT_GetSts(CardNum, Axis, out GoHome.AxisHome[CardNum, Axis].status, (short)1, out temp_pClock); gts.GT_GetCaptureStatus(CardNum, Axis, out GoHome.AxisHome[CardNum, Axis].Capture, out GoHome.AxisHome[CardNum, Axis].TempPos, (short)1, out temp_pClock); //获取当前轴原点捕获的状态及捕获的当前位置 if (GoHome.AxisHome[CardNum, Axis].Capture == 1) //判断当前轴是否原点捕获触发 { //Gg.AxisStop(CardNum, Axis); //当前轴停止 gts.GT_Stop(CardNum, 1 << (Axis - 1), 1 << (Axis - 1)); InitTimeH[CardNum, Axis].InitialTime(); GoHome.AxisHome[CardNum, Axis].Capture = 0; GoHome.AxisHome[CardNum, Axis].Step = 50; } else if (Gg.GetLimitDi_Z(CardNum, Axis) == 1) //判断当前轴是否触发正极限 { //Gg.AxisStop(CardNum, Axis); //当前轴停止 gts.GT_Stop(CardNum, 1 << (Axis - 1), 1 << (Axis - 1)); InitTimeH[CardNum, Axis].InitialTime(); GoHome.AxisHome[CardNum, Axis].Step = 170; } else if (Gg.GetLimitDi_F(CardNum, Axis) == 1) //判断当前轴是否触发负极限 { //Gg.AxisStop(CardNum, Axis); //当前轴停止 gts.GT_Stop(CardNum, 1 << (Axis - 1), 1 << (Axis - 1)); InitTimeH[CardNum, Axis].InitialTime(); GoHome.AxisHome[CardNum, Axis].Step = 150; } else if (System.Convert.ToBoolean(GoHome.AxisHome[CardNum, Axis].status & 0x400) == false) //判断当前轴规划器是否运动停止(原点搜索距离太小) { InitTimeH[CardNum, Axis].InitialTime(); GoHome.AxisHome[CardNum, Axis].Step = 140; } break; case 50: if (InitTimeH[CardNum, Axis].TimeIsUp(500)) { GoHome.AxisHome[CardNum, Axis].Step = 52; } break; case 52: //Gg.AbsMotion(CardNum, Axis, System.Convert.ToDouble(GoHome.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); //启动运动,原点反向运动 Gg.AbsMotion(CardNum, Axis, System.Convert.ToDouble(Gg.GetPrfPosmm(CardNum, Axis) + 2), 5); //启动运动,原点反向运动 GoHome.AxisHome[CardNum, Axis].Step = 60; break; case 60: gts.GT_ClrSts(CardNum, Axis, (short)1); gts.GT_GetSts(CardNum, Axis, out GoHome.AxisHome[CardNum, Axis].status, (short)1, out temp_pClock); //获取当前轴的状态 if (System.Convert.ToBoolean(GoHome.AxisHome[CardNum, Axis].status & 0x400) == false) //判断当前轴是否运动停止 { GoHome.AxisHome[CardNum, Axis].Step = 70; } break; case 70: if (InitTimeH[CardNum, Axis].TimeIsUp(500)) { GoHome.AxisHome[CardNum, Axis].Step = 72; } break; case 72: 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.AxisHome[CardNum, Axis].Step = 80; //跳转到下一步 break; case 80: gts.GT_ClrSts(CardNum, Axis, (short)1); gts.GT_GetSts(CardNum, Axis, out GoHome.AxisHome[CardNum, Axis].status, (short)1, out temp_pClock); //获取当前轴的状态 gts.GT_GetCaptureStatus(CardNum, Axis, out GoHome.AxisHome[CardNum, Axis].Capture, out GoHome.AxisHome[CardNum, Axis].TempPos, (short)1, out temp_pClock); //获取当前轴Z相脉冲捕获的状态及捕获的当前位置 if (GoHome.AxisHome[CardNum, Axis].Capture == 1) //判断当前轴是否Z相脉冲捕获触发 { //Gg.AxisStop(CardNum, Axis); //当前轴停止 gts.GT_Stop(CardNum, 1 << (Axis - 1), 1 << (Axis - 1)); GoHome.AxisHome[CardNum, Axis].Capture = 0; //捕获触发标志清零 GoHome.AxisHome[CardNum, Axis].Step = 90; } else if (System.Convert.ToBoolean(GoHome.AxisHome[CardNum, Axis].status & 0x400) == false) { GoHome.AxisHome[CardNum, Axis].Step = 140; //跳转到第110步(或脉冲未捕获,回原点结束,回原点失败) } break; case 90: if (InitTimeH[CardNum, Axis].TimeIsUp(500)) { GoHome.AxisHome[CardNum, Axis].Step = 92; } break; case 92: Gg.AbsMotion(CardNum, Axis, System.Convert.ToDouble(Gg.GetPrfPosmm(CardNum, Axis) + homeoffset), 2); //if (homeoffset < 3) // { // Gg.AbsMotion(CardNum, Axis, System.Convert.ToDouble(GoHome.AxisHome[CardNum, Axis].TempPos / Gg.PlusPerUnit(CardNum, Axis) / Tools.GeerRate[CardNum, Axis]) + homeoffset, 2); // } //else // { // Gg.AbsMotion(CardNum, Axis, System.Convert.ToDouble(GoHome.AxisHome[CardNum, Axis].TempPos / Gg.PlusPerUnit(CardNum, Axis) / Tools.GeerRate[CardNum, Axis]) + homeoffset, 5); // } GoHome.AxisHome[CardNum, Axis].Step = 100; break; case 100: gts.GT_ClrSts(CardNum, Axis, (short)1); gts.GT_GetSts(CardNum, Axis, out GoHome.AxisHome[CardNum, Axis].status, (short)1, out temp_pClock); if (System.Convert.ToBoolean(GoHome.AxisHome[CardNum, Axis].status & 0x400) == false) //判断当前轴是否运动停止 { InitTime.InitialTime(); InitTimeH[CardNum, Axis].InitialTime(); GoHome.AxisHome[CardNum, Axis].Step = 110; } break; case 110: if (InitTimeH[CardNum, Axis].TimeIsUp(200)) { GoHome.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)); //将当前轴进行位置同步 InitTimeH[CardNum, Axis].InitialTime(); GoHome.AxisHome[CardNum, Axis].Step = 130; break; case 130: if (InitTimeH[CardNum, Axis].TimeIsUp(50)) { if (Gg.GetEncPos(CardNum, Axis) == 0 && Gg.GetPrfPos(CardNum, Axis) == 0) { GoHome.AxisHome[CardNum, Axis].Result = true; GoHome.AxisHome[CardNum, Axis].State = false; GoHome.AxisHome[CardNum, Axis].Step = 0; } else { InitTimeH[CardNum, Axis].InitialTime(); GoHome.AxisHome[CardNum, Axis].Step = 110; } } break; case 140: GoHome.AxisHome[CardNum, Axis].Result = false; GoHome.AxisHome[CardNum, Axis].State = false; GoHome.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); GoHome.AxisHome[CardNum, Axis].Step = 160; break; case 160: gts.GT_ClrSts(CardNum, Axis, (short)1); gts.GT_GetSts(CardNum, Axis, out GoHome.AxisHome[CardNum, Axis].status, (short)1, out temp_pClock); if (System.Convert.ToBoolean(GoHome.AxisHome[CardNum, Axis].status & 0x400) == false) { GoHome.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.AxisHome[CardNum, Axis].Step = 180; break; case 180: gts.GT_ClrSts(CardNum, Axis, (short)1); gts.GT_GetSts(CardNum, Axis, out GoHome.AxisHome[CardNum, Axis].status, (short)1, out temp_pClock); if (System.Convert.ToBoolean(GoHome.AxisHome[CardNum, Axis].status & 0x400) == false) { GoHome.AxisHome[CardNum, Axis].Step = 20; //重新搜索原点 } break; //********************************************************************************************************************* case 200: //offsetPos大于感应片的宽度 Gg.AbsMotion(CardNum, Axis, System.Convert.ToDouble(Gg.GetPrfPosmm(CardNum, Axis) + offsetPos), vel); GoHome.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); InitTimeH[CardNum, Axis].InitialTime(); GoHome.AxisHome[CardNum, Axis].Step = 210; } else { gts.GT_ClrSts(CardNum, Axis, (short)1); gts.GT_GetSts(CardNum, Axis, out GoHome.AxisHome[CardNum, Axis].status, (short)1, out temp_pClock); if (System.Convert.ToBoolean(GoHome.AxisHome[CardNum, Axis].status & 0x400) == false) { InitTimeH[CardNum, Axis].InitialTime(); GoHome.AxisHome[CardNum, Axis].Step = 140; } } break; case 210: gts.GT_ClrSts(CardNum, Axis, (short)1); gts.GT_GetSts(CardNum, Axis, out GoHome.AxisHome[CardNum, Axis].status, (short)1, out temp_pClock); if (System.Convert.ToBoolean(GoHome.AxisHome[CardNum, Axis].status & 0x400) == false) { InitTimeH[CardNum, Axis].InitialTime(); GoHome.AxisHome[CardNum, Axis].Step = 220; } break; case (short)220: if (InitTimeH[CardNum, Axis].TimeIsUp(200)) { if (Gg.GetHomeDi(CardNum, Axis) == 1) { GoHome.AxisHome[CardNum, Axis].Step = 140; } else { GoHome.AxisHome[CardNum, Axis].Step = 20; } } break; } } }