/// <summary> /// 带参数的启动 /// </summary> /// <param name="PosPut">放晶位置</param> public void Start(FPointXYZR PosPut, FPointXY PosCheck) { if (LG.Execute == false && LG.Step == 0) { this.Pos_Put = PosPut; this.Pos_Check = PosCheck; Start(); } }
/// <summary> /// 带参数的启动 /// </summary> /// <param name="p">跳跃目标位置</param> /// <param name="CheckVacuo">在跳跃到目标位置上方时,检测真空</param> /// <param name="PreInpZ">Z轴提前量,平滑处理</param> /// <param name="PreInpY">Y轴提前量,平滑处理</param> public void Start(FPointXYZR p, bool CheckVacuo = false, float PreInpZ = 0, float PreInpY = 0) { if (LG.Execute == false && LG.Step == 0) { this.CheckVacuo = CheckVacuo; this.PreInpY = PreInpY; this.PreInpZ = PreInpZ; this.PosTar = p; Start(); } }
protected override void LogicImpl() { switch (LG.Step) { case 1: FPointXYZR p = TaskMain.PickTake.Pos_Take.Clone(); //取晶位置,clone出来 p.Z = TaskMain.PickJump.Ready.Z; //Z位置改成预备高度 TaskMain.PickJump.Start(p); //跳跃到取晶位上方 LG.StepNext(2); break; case 2: if (TaskMain.PickJump.GetSta() == 0) //等待定位结束 { DeviceRsDef.Ax_PickZ.MC_MoveAbs(0, Pos_DetectMax); //以最慢速度向测高极限移动 LG.StepNext(3); } break; case 3: if (DeviceRsDef.Ax_PickZ.busy) //在轴运行过程中 { if (DeviceRsDef.I_PickDetect.value) //检测到测高信号 { TaskMain.PickTake.Pos_Take.Z = DeviceRsDef.Ax_PickZ.currPos; //更新取晶高度 DeviceRsDef.Ax_PickZ.MC_Stop(); //停止轴 LG.StepNext(4); // } } else //测高轴运行结束 { MessageBox.Show("测高失败,到达测高极限", "提示"); LG.End(); } break; case 4: if (!DeviceRsDef.Ax_PickZ.busy) { MessageBox.Show("测高完成,取晶高度已更新", "提示"); LG.End(); } break; } }
public PickTakeDef() : base("拾取取晶") { Pos_Take = new FPointXYZR(); }
public bool VacuoResult; //真空检测结果 public PickJumpDef() : base("拾取跳跃") { Ready = new FPointXYZR(); }
public PickDiscardDef() : base("拾取弃料") { Pos_Discard = new FPointXYZR(); }
protected override void LogicImpl() { //放晶时循环处理提前控制真空和吹气 if (LG.Execute == true) { if (Tr.TrigOne(System.Math.Abs(DeviceRsDef.Ax_PickZ.currPos - Pos_Put.Z) <= Pos_Ahead, 0)) //当Z位置进入到提前范围内时,执行一次 { DeviceRsDef.Q_PickVacuo.OFF(); //关真空 DeviceRsDef.Q_PickBlow.ON(); //开吹气 } } switch (LG.Step) { case 1: if (!DeviceRsDef.Q_PickVacuo.Value || !DeviceRsDef.I_PickVacuo.value) //如果没取好片 { TaskMain.PickTake.Start(); //执行取片 } LG.StepNext(2); break; case 2: if (DeviceRsDef.Q_PickVacuo.Value && DeviceRsDef.I_PickVacuo.value) //如果取好片了 { FPointXYZR p = Pos_Put.Clone(); //取放晶点位置 p.Z = Pos_Put.Z - Pos_Slow; //Z修改为慢速点 TaskMain.PickJump.Start(p, true, TaskMain.PickJump.Pos_PreInpZ); //跳跃到放晶点的慢速高度,检测真空,Z带提前量 LG.StepNext(3); } else //如果没取好片 { LG.End(); //结束流程 } break; case 3: if (TaskMain.PickJump.GetSta() == 0) //跳跃结束 { if (TaskMain.PickJump.VacuoResult) //真空检测OK { DeviceRsDef.Ax_PickZ.MC_MoveAbs(Spd_Slow, Pos_Put.Z); //Z慢速到放晶位 LG.StepNext(4); } else //真空异常 { //要报警 PutOk = false; //标志放晶失败 LG.End(); } } break; case 4: if (!DeviceRsDef.Ax_PickZ.busy) //等待Z到位 { //DeviceRsDef.Q_PickVacuo.OFF();//由提前量控制吹气和真空 //DeviceRsDef.Q_PickBlow.ON(); Tm.Restart(); //到位开始计时 LG.StepNext(5); } break; case 5: if (Tm.ElapsedMilliseconds >= Tim_Put) //放晶时间到 { DeviceRsDef.Q_PickBlow.OFF(); //关闭吹气 TaskMain.PickTake.Start(); //取晶 TaskMain.TrayDesk.Start(Pos_Check); //相机移动到该点 LG.StepNext(6); } break; case 6: if (TaskMain.TrayDesk.GetSta() == 0 && DeviceRsDef.Ax_PickY.currPos < TaskMain.PickJump.Ready.Y + 1) { VisionSot = true; //触发视觉 LG.StepNext(7); } break; case 7: if (!VisionSot) //等待视觉结束 { PutOk = VisionRet; //标志放晶结果 LG.End(); } break; } }