public void Run(RunModeDef RunMode) { if (!movedriverZm.Succeed) { return; } this.RunMode = RunMode; BaseData RunMode_Reg = new BaseData(1504, new int[] { (int)RunMode }); movedriverZm.WriteRegister(RunMode_Reg); while (RunMode_Reg.Succeed == false) { Thread.Sleep(1); } BaseData FsmCmd_Reg = new BaseData(1500, new int[] { (int)FsmStaDef.RUN }); movedriverZm.WriteRegister(FsmCmd_Reg); while (FsmCmd_Reg.Succeed == false) { Thread.Sleep(1); } this.Status = FsmStaDef.RUN; }
//private int whichNuzzle; public void Logic(RunModeDef runMode) { LG.Start(); switch (LG.step) { case 1: //走剥膜长度 if (MotionCard.MotionFun.MC_AxGetStatus((int)AxisName.FeedLable) == 0) { MotionCard.MotionFun.OutputON((int)OutputName.Q_Suck); if (MotionCard.MotionFun.InputGet((int)InputName.I_LableCheck_1) == false) { MotionCard.MotionFun.MC_MoveRel((int)AxisName.FeedLable, Para.speed, Para.labelLength); LG.TonRst(); LG.step = 2; } else { LG.step = 4; } } break; case 2: //检测感应 if (LG.Ton(MotionCard.MotionFun.InputGet((int)InputName.I_LableCheck_1) || MotionCard.MotionFun.InputGet((int)InputName.I_LableCheck_2), Para.checkDelay)) { MotionCard.MotionFun.MC_Stop((int)AxisName.FeedLable); LG.step = 3; } else if (MotionCard.MotionFun.MC_AxGetStatus((int)AxisName.FeedLable) == 0) { LG.count++; if (runMode == RunModeDef.NORMAL) { if (LG.count > Para.StripNumAlrm) { LG.count = 0; LG.step = 0xfe; if (Para.StripNumAlrm > 0) { MachineAlarm.SetAlarm(AlarmLevelEnum.Level2, "剥标失败,请检查卷料是否用完"); } } else { LG.step = 1; } } else { LG.step = 3; } } break; case 3: // if (MotionCard.MotionFun.MC_AxGetStatus((int)AxisName.FeedLable) == 0) { MotionCard.MotionFun.MC_MoveRel((int)AxisName.FeedLable, Para.speed, -Para.LableSupplyBack); LG.step = 4; } break; case 4: // if (MotionCard.MotionFun.MC_AxGetStatus((int)AxisName.FeedLable) == 0) { LG.step = 0xff; } break; case 0xfe: LG.ErrorStop(); break; case 0xff: LG.End(); break; default: break; } }
public void Logic(RunModeDef runMode) { LG.Start(); switch (LG.step) { case 1: //Z轴抬起到安全高度 if (Para.OverTake == 1) { whichNuzzle = (int)LogicDef.NuzzleNum - 1; } else { whichNuzzle = 0; } //if (AllAxisArrive()) { for (int i = 0; i < (int)LogicDef.NuzzleNum; i++) { MotionCard.MotionFun.MC_MoveAbs((int)AxisName.Z, Para.SafePos_Z); } LG.step = 2; } break; case 2: //xy到取标位置 if (MotionCard.MotionFun.MC_AxGetStatus((int)AxisName.Z) == 0) { //取标的时候将吹气关 for (int i = 0; i < (int)LogicDef.NuzzleNum; i++) { MotionCard.MotionFun.OutputOFF((int)OutputName.Q_Suck_1); } //确定哪一个吸嘴是禁用的 if (Para.OverTake == 1) { if (Functions.GetBitValue(Para.NuzzleSwitch, (ushort)whichNuzzle) == false) { if (whichNuzzle > 0) { whichNuzzle--; } else { LG.step = 9; } } else { MotionCard.MotionFun.MC_MoveAbs((int)AxisName.X, Para.PointData.X); MotionCard.MotionFun.MC_MoveAbs((int)AxisName.Y, Para.PointData.Y); for (int i = 0; i < (int)LogicDef.NuzzleNum; i++) { if (Functions.GetBitValue(Para.NuzzleSwitch, (ushort)i) == true) { MotionCard.MotionFun.MC_MoveAbs((int)AxisName.R, Para.PointData.R); } } LG.step = 3; } } else { for (int i = whichNuzzle; i < (int)LogicDef.NuzzleNum; i++) { if (Functions.GetBitValue(Para.NuzzleSwitch, (ushort)i) == false) { whichNuzzle++; } else { break; } } if (whichNuzzle < (int)LogicDef.NuzzleNum) { MotionCard.MotionFun.MC_MoveAbs((int)AxisName.X, Para.PointData.X); MotionCard.MotionFun.MC_MoveAbs((int)AxisName.Y, Para.PointData.Y); for (int i = 0; i < (int)LogicDef.NuzzleNum; i++) { if (Functions.GetBitValue(Para.NuzzleSwitch, (ushort)i) == true) { MotionCard.MotionFun.MC_MoveAbs((int)AxisName.R, Para.PointData.R); } } LG.step = 3; } else { LG.step = 9; } } } break; case 3: //XY到位后判断缓取,开始下压时打开吸嘴 if (AllAxisArrive()) { MotionCard.MotionFun.OutputON((int)OutputName.Q_Suck_1); if (Para.TakeSlowDistance_Z > 0) { MotionCard.MotionFun.MC_MoveAbs((int)AxisName.Z, Para.TakePos_Z - Para.TakeSlowDistance_Z); LG.step = 4; } else { MotionCard.MotionFun.MC_MoveAbs((int)AxisName.Z, Para.TakePos_Z); LG.step = 5; } } break; case 4: //Z轴缓慢到取标高度 if (AllAxisArrive()) { MotionCard.MotionFun.MC_MoveAbs((int)AxisName.Z, Para.TakeSlowSpeed_Z, Para.TakePos_Z); LG.step = 5; } break; case 5: //Z轴到达 if (AllAxisArrive() && MotionCard.MotionFun.MC_AxGetStatus((int)AxisName.Y) == 0) { LG.step = 6; } break; case 6: //取标延时后Z轴抬起(缓抬) if (LG.TCnt((uint)Para.TakeDelay)) { LG.step = 7; } break; case 7: //取标延时后Z轴抬起 if (AllAxisArrive()) { MotionCard.MotionFun.MC_MoveAbs((int)AxisName.Z, Para.SafePos_Z); LG.step = 8; } break; case 8: //检测真空 if (MotionCard.MotionFun.MC_AxGetStatus((int)AxisName.Z) == 0) { if (MotionCard.MotionFun.InputGet((int)InputName.I_VacuoCheck) == false && Para.CheckVacuumEn == 1) { LG.step = 9; //判断是否在老化模式 if (runMode == RunModeDef.NORMAL) { LG.count++; if (LG.count >= 2) { LG.step = 9; MotionCard.MotionFun.OutputON((int)OutputName.Q_Suck_2); MachineAlarm.SetAlarm(AlarmLevelEnum.Level2, "取料失败,请检查真空和真空感应"); } else { LG.step = 3; } } } else { LG.step = 9; } } break; case 9: //结束 if (MotionCard.MotionFun.MC_AxGetStatus((int)AxisName.Z) == 0) { LG.count = 0; if (Para.OverTake == 1) { if (whichNuzzle > 0) { whichNuzzle--; LG.step = 3; } else { LG.step = 10; } } else { whichNuzzle++; if (whichNuzzle < (int)LogicDef.NuzzleNum) { LG.step = 3; } else { LG.step = 10; } } } break; case 10: if (MotionCard.MotionFun.MC_AxGetStatus((int)AxisName.Z) == 0) { //确定哪一个吸嘴是禁用的 for (int i = 0; i < (int)LogicDef.NuzzleNum; i++) { if (Functions.GetBitValue(Para.NuzzleSwitch, (ushort)i) == false) { whichNuzzle++; } else { break; } } } LG.step = 0xff; break; case 0xff: LG.End(); break; } }
public FsmDef(Device.BoardCtrllerManager movedriverZm) { this.movedriverZm = movedriverZm; Status = FsmStaDef.INIT; RunMode = RunModeDef.NORMAL; }