public void TakeTip() { if (this.SelectedBJ == null) { return; } if (SelectedBJ is T_BJ_Tip tipseat) { var tip_seat = IMask.Gen(new ActionPoint(-1, -1, -1)); int x = (int)(tipseat.X - SeatXIndex * tipseat.GapX); int y = (int)(tipseat.Y + SeatYIndex * tipseat.GapY); foreach (var ent in injectorDevice.GetSeleteced()) { var point = new ActionPoint(); point.x = x; point.y = y; point.z = (int)tipseat.Limit; point.type = TestStepEnum.JXZT; point.index = ent.Index; tip_seat[ent.Index] = point; } var sequ_taketip = Sequence.create(); var move_act = InjectMoveActs.create(3000, tip_seat.ToArray(), false); sequ_taketip.AddAction(InjectMoveTo.create(3000, injectorDevice.GetSeleteced(), -1, IMask.Gen(-1), IMask.Gen(0))); sequ_taketip.AddAction(move_act); sequ_taketip.runAction(injectorDevice); } }
public override ActionBase InitAll() { var by = IMask.Gen(0); foreach (var ent in Injector.Entercloses) { by[ent.Index] = (int)ent.YZero; } var inject_list = Injector.Entercloses.Where(item => item.InjEnable).ToList(); var act = Sequence.create(InitXyz.create(this, 30000, inject_list.ToArray(), false, false, true)); act.AddAction(InitXyz.create(this, 30000, inject_list.ToArray(), true, true, false, by)); var device = new ActionDevice(this); int x = 0; int[] y = new int[4]; int [] z = new int [4]; device.GetRealX(ref x); device.GetRealY(inject_list.ToArray(), ref y); device.GetRealZ(inject_list.ToArray(), ref z); Injector.XMotor.CurrentDistance = x; for (int i = 0; i < inject_list.Count(); i++) { inject_list[i].YMotor.CurrentDistance = y[i] + (int)inject_list[i].TipDis; inject_list[i].ZMotor.CurrentDistance = z[i]; } return(act); }
public void TakeTipAuto() { //生成装帧动作 if (this.SelectedBJ == null) { return; } if (SelectedBJ is T_BJ_Tip tipseat) { var sequ_taketip = Sequence.create(); var tip_seat = resmanager.GetFreeTipActPoint(injectorDevice.GetSeleteced().Length, 2, tipseat.Name); if (tip_seat != null) { int index = 0; var tip_seat_tem = IMask.Gen(new ActionPoint(-1, -1, -1)); foreach (var ent in injectorDevice.GetSeleteced()) { tip_seat_tem[ent.Index] = tip_seat[index]; index++; } var move_act = InjectMoveActs.create(20000, tip_seat_tem, false); //sequ_taketip.AddAction(InjectMoveTo.create(3000, injectorDevice.GetSeleteced(), -1, IMask.Gen(-1), IMask.Gen(0))); sequ_taketip.AddAction(move_act); sequ_taketip.runAction(injectorDevice); } else { ErrorSystem.WriteActError("吸盘盒为空!", true, false, 9999); } } }
public void SubLiquid() { if (SelectedBJ is T_BJ_GelSeat gelseat) { int x = (int)(gelseat.InjectorX); int y = gelseat.GetInjectorY(SeatYIndex); var sequ_putsample = Sequence.create( InjectMoveTo.create(injectorDevice, 3000, injectorDevice.GetSeleteced(), -1, IMask.Gen(-1), IMask.Gen(0)), InjectAbsorbMove.create(300, injectorDevice.GetSeleteced(), 100, IMask.Gen(0))); for (int i = 0; i < 8; i++) { var points = IMask.Gen(new ActionPoint(-1, -1, -1)); foreach (var ent in injectorDevice.GetSeleteced()) { points[ent.Index].x = x + i * (int)gelseat.InjectorGapX; points[ent.Index].y = y + ent.Index * (int)gelseat.InjectorGapY; points[ent.Index].z = (int)gelseat.InjectorZ; points[ent.Index].zb = points[ent.Index].z - 1500; points[ent.Index].minwidth = (double)gelseat.MinWidth; points[ent.Index].type = TestStepEnum.SpuLiquid; points[ent.Index].capacity = 500; } sequ_putsample.AddAction(InjectMoveActs.create(3000, points.ToArray(), true)); } sequ_putsample.runAction(injectorDevice); } }
public void MoveXY() { if (this.SelectedBJ == null) { return; } var move_act = Sequence.create(); move_act.AddAction(InjectMoveTo.create(10000, injectorDevice.GetSeleteced(), -1, IMask.Gen(-1), IMask.Gen(0))); int x = 0; int y = 0; double min_width = 1.0f; if (SelectedBJ is T_BJ_Tip tipseat) { x = (int)(tipseat.X - SeatXIndex * tipseat.GapX); y = tipseat.GetY(SeatYIndex); min_width = (double)tipseat.MinWidth; } else if (SelectedBJ is T_BJ_SampleRack sampleseat) { x = (int)(sampleseat.X); y = (int)sampleseat.GetY(SeatYIndex); min_width = (double)sampleseat.MinWidth; } else if (SelectedBJ is T_BJ_DeepPlate deepplate) { x = (int)(deepplate.X + SeatXIndex * deepplate.GapX); y = deepplate.GetY(SeatYIndex); min_width = (double)deepplate.MinWidth; } else if (SelectedBJ is T_BJ_AgentiaWarehouse agentiaware) { x = (int)(agentiaware.X); y = agentiaware.GetY(SeatYIndex); min_width = (double)agentiaware.MinWidth; } else if (SelectedBJ is T_BJ_GelSeat gelseat) { x = (int)(gelseat.InjectorX + SeatXIndex * gelseat.InjectorGapX); y = gelseat.GetInjectorY(SeatYIndex); min_width = (double)gelseat.MinWidth; } else if (SelectedBJ is T_BJ_Unload unload) { x = (int)(unload.X); y = (int)(unload.Y + SeatYIndex * unload.FZ); } var points = IMask.Gen(new ActionPoint(-1, -1, -1)); foreach (var ent in injectorDevice.GetSeleteced()) { points[ent.Index].x = x; points[ent.Index].y = y; points[ent.Index].minwidth = min_width; } move_act.AddAction(InjectMoveActs.create(3001, points.ToArray(), true)); move_act.runAction(injectorDevice); }
public bool DoneZ(Enterclose[] injects, int speed) { bool ret = true; var device = (InjectorDevice)node; foreach (var ent in injects) { ret = ret && device.CanComm.GetBool(ent.ZMotor.DoneCoil.Addr, false); if (ent.ZMotor.forecast_move.Count != 0) { int set_speed = 0; if (speed == 0) { set_speed = ent.ZMotor.Speed.SetValue; } else if (speed == 1) { set_speed = ent.ZMotor.SecondSpeed.SetValue; } else if (speed == 2) { set_speed = ent.ZMotor.DownSpeed.SetValue; } else { set_speed = speed; } if (ent.ZMotor.forecast_move.ContainsKey(set_speed)) { var forecastmove = ent.ZMotor.forecast_move[set_speed]; if (ret == false && forecastmove.is_bin && forecastmove.distance != 0 && forecastmove.tager == 0) { double min_dis = 2000; double wait_time = forecastmove.setp_time * (forecastmove.distance - min_dis); if (CurrentTimeStamp() - forecastmove.beg_time >= wait_time) { var real_z = IMask.Gen(0); Enterclose[] ents = { ent }; GetRealZ(ents, ref real_z); ret = Math.Abs(forecastmove.tager - real_z[ent.Index]) < min_dis; } } else if (ret && forecastmove.distance != 0 && forecastmove.is_bin == false) { var use_time = CurrentTimeStamp() - forecastmove.beg_time; forecastmove.setp_time = use_time / forecastmove.distance; forecastmove.is_bin = true; } } } if (ret == false) { break; } } return(ret); }
/// <summary> /// 初始化Y轴初始化 /// </summary> public void InitY() { var by = IMask.Gen(0); foreach (var ent in injectorDevice.Injector.Entercloses) { by[ent.Index] = (int)ent.YZero; } var act = Sequence.create(InitXyz.create(30000, injectorDevice.GetSeleteced(), false, true, false, by)); act.runAction(injectorDevice); }
/// <summary> /// 移动Y /// </summary> public void MoveY() { var move_act = Sequence.create(); var device = new ActionDevice(injectorDevice); move_act.AddAction(InjectMoveTo.create(10000, injectorDevice.GetSeleteced(), -1, IMask.Gen(-1), IMask.Gen(0))); int x = 0; int y = (int)DistanceY; double min_width = 1.0f; var points = IMask.Gen(new ActionPoint(-1, -1, -1)); if (device.GetRealX(ref x)) { var ens = injectorDevice.Injector.Entercloses; int[] py = { 0, (int)(ens[1].TipDis), (int)(ens[2].TipDis + ens[2].InjWidth), (int)(ens[3].TipDis + ens[3].InjWidth) }; foreach (var ent in injectorDevice.GetSeleteced()) { points[ent.Index].x = x; points[ent.Index].y = y + py[ent.Index]; points[ent.Index].minwidth = min_width; } move_act.AddAction(InjectMoveActs.create(3001, points.ToArray(), true)); move_act.runAction(injectorDevice); } //var canComm = IoC.Get<AbstractCanComm>(); //var injects = injectorDevice.GetSeleteced(); //if(IsUseTMotor) //{ // var act = InjectMoveTo.create(5001, injects.ToArray(), -1, IMask.Gen((int)DistanceY), IMask.Gen(0), 2); // act.runAction(injectorDevice); //} //else //{ // var points = IMask.Gen(new ActionPoint(-1, -1, -1)); // var device = new ActionDevice(injectorDevice); // int x = 0; // if(device.GetRealX(ref x)) // { // var min_index = injects.Min(et => et.Index); // points[min_index].x = x; // points[min_index].y = (int)DistanceY; // points[min_index].minwidth = 1.0f; // var act = InjectMoveActs.create(3001, points.ToArray(), true); // act.runAction(injectorDevice); // } //} }
//得到恢复当前状态的动作 public bool GetReSetAct(ref Sequence seque_act) { int x = 0; int [] y = IMask.Gen(-1); int[] z = IMask.Gen(-1); var device = new ActionDevice(this); var inject_list = Injector.Entercloses.Where(item => item.InjEnable).ToList(); bool ret = device.GetRealX(ref x); ret = ret && device.GetRealY(inject_list.ToArray(), ref y); ret = ret && device.GetRealZ(inject_list.ToArray(), ref z); for (int i = 0; i < inject_list.Count; i++) { y[inject_list[i].Index] += (int)inject_list[i].TipDis; } seque_act.AddAction(InjectMoveTo.create(3000, inject_list.ToArray(), -1, IMask.Gen(-1), IMask.Gen(0))); seque_act.AddAction(InjectMoveTo.create(3000, inject_list.ToArray(), x, y, IMask.Gen(-1))); seque_act.AddAction(InjectMoveTo.create(3000, inject_list.ToArray(), -1, IMask.Gen(-1), z)); return(ret); }
public void CheckTip() { var inject_list = injector.Entercloses.Where(item => item.InjEnable).ToList(); int[] pressure = IMask.Gen(0); int[] movez = IMask.Gen(100); var act = PressureTest.create(3000, inject_list.ToArray(), movez, 50, 50); act.runAction(injectorDevice); ////var act = InjectCheckTip.create(30000, 100, 0); ////act.runAction(injectorDevice); //Random rd = new Random(); //T_BJ_GelSeat seat = new T_BJ_GelSeat(); //seat.X = 2120; //seat.Y = 3820; //seat.Z = 5700; //seat.ZCatch = 100; //seat.ZPut = 100; //seat.ZLimit = 6000; //seat.Gap = 0; //int sleeptime = rd.Next()%10*10000; //var act_inject = Sequence.create(InjectMoveTo.create(300000, injectorDevice.GetSeleteced(), 3000, IMask.Gen(1000, 1000, 1000, -1), IMask.Gen(-1))); //var act_hand = Sequence.create( // SkCallBackFun.create((ActionBase act_tem)=> { // if (injectorDevice.Injector.XMotor.CurrentDistance < 2000) // { // return true; // } // return false; // }), // MoveTo.create(300000, -1, -1, 0), MoveTo.create(300000, (int)seat.X, (int)(seat.Y + seat.Gap), -1), HandTakeCard.create(700000, (int)seat.Z, (int)seat.ZLimit, (int)seat.ZCatch, 0),HandPutCard.create(500000, (int)seat.Z, 0), SKSleep.create(sleeptime), MoveTo.create(300000, -1, -1, 0), MoveTo.create(300000, (int)seat.X, (int)(seat.Y + seat.Gap), -1), HandTakeCard.create(700000, (int)seat.Z, (int)seat.ZLimit, (int)seat.ZCatch, 0), HandPutCard.create(500000, (int)seat.Z, 0)); //act_inject.AddAction(SkCallBackFun.create((ActionBase act_tem) => //{ // act_hand.runAction(handDevice); // return true; //})); //act_inject.runAction(injectorDevice); }
// public Sequence GenerateInjectActGroup(ActionPoint[] tagers, bool is_asc = true) { int[] point = { 0, 0, 0, 0 }; int[] width = { 0, 0, 0, 0 }; //目标要根据针头偏移 for (int i = 0; i < tagers.Length; i++) { tagers[i].y = tagers[i].y + (int)Engine.getInstance().injectorDevice.Injector.Entercloses[i].MinDistance; tagers[i].index = i; } //删除为负数的参数 tagers = tagers.ToList().Where(item => item.x >= 0).ToArray(); for (int i = 0; i < 4; i++) { bool is_timeout = false; width[i] = (int)Engine.getInstance().injectorDevice.Injector.Entercloses[1].YZero; //得到当前各别样Y轴坐标 Engine.getInstance().injectorDevice.CanComm.ReadRegister(Engine.getInstance().injectorDevice.Injector.Entercloses[i].YMotor.RealDistance.Addr); int pointtem = Engine.getInstance().injectorDevice.CanComm.GetIntBlock(Engine.getInstance().injectorDevice.Injector.Entercloses[i].YMotor.RealDistance.Addr, 1000, out is_timeout); point[i] = pointtem + (int)Engine.getInstance().injectorDevice.Injector.Entercloses[i].YZero; if (is_timeout) { return(null); } } //接X分组 List <ActionPoint> tager_list = tagers.ToList(); List <List <ActionPoint> > tager_group = new List <List <ActionPoint> >(); if (is_asc) { tager_list.Sort((a, b) => { return(a.x > b.x ? 1 : -1); }); } else { tager_list.Sort((a, b) => { return(a.x < b.x ? 1 : -1); }); } int x = -1; foreach (var tagerp in tager_list) { if (tagerp.x != x) { var group = new List <ActionPoint>(); group.Add(tagerp); tager_group.Add(group); x = tagerp.x; } else if (tager_group.Count != 0) { tager_group[tager_group.Count - 1].Add(tagerp); } } //生成动作组合 int index = 0; bool is_ok = false; var seque = Sequence.create(); foreach (var group in tager_group) { var move_y = Sequence.create(); ActionPoint[] tager = IMask.Gen(new ActionPoint(-1, -1, -1)); for (int i = 0; i < group.Count(); i++) { tager[group[i].index] = group[i]; tager[group[i].index] = group[i]; } index = 0; var spawn = Spawn.create(); var move_x = (ActionBase)MoveTo.create(3001, group[0].x, -1, -1); var spawz_action = Spawn.create();//同步Z动作 move_y.AddAction(spawz_action); GenerateInjectActGroup(ref move_y, ref index, ref tager, ref point, ref width, ref is_ok, move_x, spawz_action); if (is_ok) { spawn.AddAction(move_x); spawn.AddAction(move_y); seque.AddAction(spawn); } else { break; } } return(seque); }
//按小组生成动作 public Sequence GenerateAction(List <T_GelStep> act_group) { //更新坐标计算吸头个数 int zt_count = 0; foreach (var act in act_group) { zt_count += act.InjectCount; } var resmanager = ResManager.getInstance(); Enterclose[] enters = new Enterclose[zt_count];//使用加样器个数 for (int i = 0; i < zt_count; i++) { enters[i] = Engine.getInstance().injectorDevice.Injector.Entercloses[i]; } //生成装帧动作 var tip_seat = resmanager.GetFreeTipActPoint(zt_count, 2); var sequ_taketip = InjectMoveActs.create(3001, tip_seat, false); //生成加样动作 var sequ_takesample = Sequence.create(); List <ActionPoint> abs_seat = new List <ActionPoint>(); foreach (var act_abs in act_group) { var abs_point = GelStepToActionPoint(act_abs, TestStepEnum.AbsLiquid); abs_seat.Add(abs_point); } sequ_takesample.AddAction(InjectMoveActs.create(3001, abs_seat.ToArray(), true)); //生成混合液体 var sequ_mixsample = Sequence.create(); List <ActionPoint> mix_seat = new List <ActionPoint>(); foreach (var act_mix in act_group) { if (act_mix.is_mix) { var mix_point = GelStepToActionPoint(act_mix, TestStepEnum.MixLiquid); mix_seat.Add(mix_point); } } sequ_mixsample.AddAction(InjectMoveActs.create(3001, mix_seat.ToArray(), true)); //生成分配动作 var sequ_putsample = Sequence.create(); List <ActionPoint> spu_seat = new List <ActionPoint>(); int spu_index = 0; foreach (var act_spu in act_group) { if (act_spu.is_spu) { var spu_point = GelStepToActionPoint(act_spu, TestStepEnum.SpuLiquid); var tubelist = spu_point.GetTubeList(); for (int i = 0; i < tubelist.Count(); i++) { var points = IMask.Gen(new ActionPoint(-1, -1, -1)); points[spu_index] = (ActionPoint)spu_point.Clone(); points[spu_index].x = (int)(spu_point.x + tubelist[i] * spu_point.tube_gap); if (tubelist.Count() != 1 && i >= 0 && i < tubelist.Count() - 1) { points[spu_index].zb = points[spu_index].z - 1500; if (points[spu_index].zb <= 0) { points[spu_index].zb = 0; } } sequ_putsample.AddAction(InjectMoveActs.create(3001, points.ToArray(), true)); } } spu_index++; } //生成脱针动作 var sequ_puttip = Sequence.create(); List <ActionPoint> unload_seat = new List <ActionPoint>(); var inject_unload = resmanager.unload_list; if (inject_unload.Count() == 1) { var unloader = inject_unload[0]; for (int i = 0; i < 4; i++) { var unload_point = new ActionPoint((int)unloader.X, (int)unloader.Y + i * (int)unloader.FZ, (int)unloader.Z, TestStepEnum.PutTip); unload_point.puttip_x = (int)unloader.FirstX; unload_seat.Add(unload_point); } sequ_puttip.AddAction(InjectMoveActs.create(3001, unload_seat.ToArray(), true)); } var action_list = Sequence.create(); action_list.node = Engine.getInstance().injectorDevice; action_list.AddAction(sequ_taketip); action_list.AddAction(sequ_takesample); action_list.AddAction(sequ_mixsample); action_list.AddAction(sequ_putsample); //action_list.AddAction(sequ_puttip); return(action_list); }
//生成加样移动组合 public void GenerateInjectActGroup(ref Sequence seque, int [] hitsort, ref int index, ref ActionPoint[] tager, ref int[] point, ref int[] width, ref double[] width_rate, ref bool is_ok, ActionBase move_x = null) { int hit_index = 0; if (index < 4) { hit_index = hitsort[index]; } if (index == 4) { is_ok = true; return; } else if ((tager[hit_index].isdone && tager[hit_index].y == point[hit_index]) || tager[hit_index].y == -1) { index++; GenerateInjectActGroup(ref seque, hitsort, ref index, ref tager, ref point, ref width, ref width_rate, ref is_ok, move_x); } else { List <int[]> node_list = new List <int[]>(); int[] width_tem = IMask.Gen(0); for (int i = 0; i < 4; i++) { width_tem[i] = (int)(width[i] * width_rate[hit_index]); } for (int i = 0; i < 4; i++) { for (int j = i; j < 4; j++) { for (int k = j; k < 4; k++) { for (int l = k; l < 4; l++) { int[] point_tem = { 0, 0, 0, 0 }; point_tem[i] = tager[i].y; point_tem[j] = tager[j].y; point_tem[k] = tager[k].y; point_tem[l] = tager[l].y; for (int n = 0; n < 4; n++) { if (point_tem[n] < 0) { point_tem[n] = 0; } } bool ispass = true; int frist = 0; for (int n = 0; n < 4; n++) { if (point_tem[n] != 0) { frist = n; break; } } for (int n = frist; n < 4; n++) { if (point_tem[n] == 0 && n - 1 >= 0) { point_tem[n] = point_tem[n - 1] + width_tem[n]; } } for (int n = 0; n < frist; n++) { if (point_tem[n] == 0 && n + 1 <= 3) { point_tem[n] = point_tem[frist] - width_tem[n] * (frist - n); } } for (int n = 0; n < 4; n++) { bool isforward = n - 1 >= 0 ? point_tem[n] >= point_tem[n - 1] + width_tem[n - 1] : true; bool isback = n + 1 <= 3 ? point_tem[n] + width_tem[n] <= point_tem[n + 1] : true; ispass = isforward && isforward; if (!ispass) { break; } } if (ispass && point_tem[hit_index] == tager[hit_index].y) { node_list.Add(point_tem); } } } } } int[] minnode = node_list[0]; foreach (var node in node_list) { if (GetLoss(tager, node) < GetLoss(tager, minnode)) { minnode = node; } } List <int> left = new List <int>(); List <int> right = new List <int>(); for (int i = 0; i < 4; i++) { if (point[i] - minnode[i] < 0) { left.Add(i); } else { right.Add(i); } } left.Sort((a, b) => { return(a < b ? 1 : -1); }); right.Sort((a, b) => { return(a > b ? 1 : -1); }); var movesp_act = Spawn.create(); var move_act = Sequence.create(); string msg = ""; int[] yy = IMask.Gen(-1); int[] zz = IMask.Gen(-1); List <Enterclose> ents = new List <Enterclose>(); for (int i = 0; i < left.Count; i++) { int indextem = left[i]; if (point[indextem] != minnode[indextem]) { ents.Add(Engine.getInstance().injectorDevice.Injector.Entercloses[indextem]); yy[indextem] = minnode[indextem]; } } for (int i = 0; i < right.Count; i++) { int indextem = right[i]; if (point[indextem] != minnode[indextem]) { ents.Add(Engine.getInstance().injectorDevice.Injector.Entercloses[indextem]); yy[indextem] = minnode[indextem]; } } movesp_act.AddAction(InjectMoveTo.create(3001, ents.ToArray(), -1, yy, zz)); for (int i = 0; i < 4; i++) { point[i] = minnode[i]; } move_act.AddAction(movesp_act); //得到到达的点 List <ActionPoint> done_points = new List <ActionPoint>(); List <Enterclose> entcloses = new List <Enterclose>(); for (int i = 0; i < 4; i++) { if (tager[i].y == point[i] && tager[i].isdone == false) { done_points.Add(tager[i]); entcloses.Add(Engine.getInstance().injectorDevice.Injector.Entercloses[i]); tager[i].isdone = true; } } var run_act = Sequence.create(); //对到达的点进行分类生成 int[] injz = IMask.Gen(-1); int[] injzl = IMask.Gen(-1); int[] injzd = IMask.Gen(-1); int[] absorbs = IMask.Gen(-1); run_act.AddAction(SkWaitForAction.create(move_x)); if (done_points.Count != 0) { if (done_points[0].type == TestStepEnum.JXZT) { var injact_sp = Spawn.create(); for (int i = 0; i < done_points.Count; i++) { injz[entcloses[i].Index] = done_points[i].z; absorbs[entcloses[i].Index] = (int)entcloses[0].PumpMotor.Maximum.SetValue; } injact_sp.AddAction(InjectMoveTo.create(3001, entcloses.ToArray(), -1, IMask.Gen(-1), injz, 2)); injact_sp.AddAction(InjectAbsorbMove.create(3001, entcloses.ToArray(), 100, absorbs)); for (int i = 0; i < done_points.Count; i++) { injz[entcloses[i].Index] = done_points[i].zb; } run_act.AddAction(injact_sp); run_act.AddAction(InjectMoveTo.create(3001, entcloses.ToArray(), -1, IMask.Gen(-1), injz)); } else if (done_points[0].type == TestStepEnum.PutTip) { var sequ = Sequence.create(); for (int i = 0; i < done_points.Count; i++) { injz[entcloses[i].Index] = done_points[i].z; } sequ.AddAction(InjectMoveTo.create(3001, entcloses.ToArray(), -1, IMask.Gen(-1), injz, 2)); sequ.AddAction(MoveTo.create(3001, done_points[0].puttip_x, -1, -1)); for (int i = 0; i < done_points.Count; i++) { injz[entcloses[i].Index] = done_points[i].z - 1000; } sequ.AddAction(InjectMoveTo.create(3001, entcloses.ToArray(), -1, IMask.Gen(-1), injz, 1)); for (int i = 0; i < done_points.Count; i++) { injz[entcloses[i].Index] = done_points[i].zb; } sequ.AddAction(InjectMoveTo.create(3001, entcloses.ToArray(), -1, IMask.Gen(-1), injz)); run_act.AddAction(sequ); } else if (done_points[0].type == TestStepEnum.AbsLiquid) { run_act.AddAction(InjectMoveTo.create(3001, entcloses.ToArray(), -1, IMask.Gen(-1), IMask.Gen(-1), 0)); for (int i = 0; i < done_points.Count; i++) { injz[entcloses[i].Index] = done_points[i].z + done_points[i].deep; absorbs[entcloses[i].Index] = -(done_points[i].capacity); } run_act.AddAction(InjectMoveTo.create(3001, entcloses.ToArray(), -1, IMask.Gen(-1), injz, done_points[0].deepspeed)); run_act.AddAction(InjectAbsorb.create(3001, entcloses.ToArray(), done_points[0].absbspeed, absorbs)); //回吸 var back_act = Spawn.create(); for (int i = 0; i < done_points.Count; i++) { if (done_points[i].backcapacity != 0) { absorbs[entcloses[i].Index] = -(done_points[i].backcapacity); List <Enterclose> ent_tem = new List <Enterclose>(); ent_tem.Add(entcloses[i]); back_act.AddAction(Sequence.create(SKSleep.create(200), InjectAbsorb.create(3001, ent_tem.ToArray(), done_points[i].backspeed, absorbs))); } } for (int i = 0; i < done_points.Count; i++) { injz[entcloses[i].Index] = done_points[i].zb; } back_act.AddAction(InjectMoveTo.create(3001, entcloses.ToArray(), -1, IMask.Gen(-1), injz)); run_act.AddAction(back_act); } else if (done_points[0].type == TestStepEnum.FollowAbsLiquid) { for (int i = 0; i < done_points.Count; i++) { injz[entcloses[i].Index] = done_points[i].z; injzl[entcloses[i].Index] = done_points[i].z + done_points[i].detectordeep; injzd[entcloses[i].Index] = done_points[i].deep; absorbs[entcloses[i].Index] = -(done_points[i].capacity); } run_act.AddAction(InjectDetector.create(3001, entcloses.ToArray(), injz, injzl, injzd, 2, 1)); run_act.AddAction(InjectAbsorb.create(3001, entcloses.ToArray(), done_points[0].absbspeed, absorbs)); //回吸 var back_act = Spawn.create(); for (int i = 0; i < done_points.Count; i++) { if (done_points[i].backcapacity != 0) { absorbs[entcloses[i].Index] = -(done_points[i].backcapacity); List <Enterclose> ent_tem = new List <Enterclose>(); ent_tem.Add(entcloses[i]); back_act.AddAction(Sequence.create(SKSleep.create(200), InjectAbsorb.create(3001, ent_tem.ToArray(), done_points[i].backspeed, absorbs))); } } for (int i = 0; i < done_points.Count; i++) { injz[entcloses[i].Index] = done_points[i].zb; } back_act.AddAction(InjectMoveTo.create(3001, entcloses.ToArray(), -1, IMask.Gen(-1), injz)); run_act.AddAction(back_act); } else if (done_points[0].type == TestStepEnum.SpuLiquid) { for (int i = 0; i < done_points.Count; i++) { injz[entcloses[i].Index] = done_points[i].z; absorbs[entcloses[i].Index] = done_points[i].spucapacity + done_points[i].backcapacity; } run_act.AddAction(InjectMoveTo.create(3001, entcloses.ToArray(), -1, IMask.Gen(-1), injz, 2)); run_act.AddAction(InjectAbsorb.create(3001, entcloses.ToArray(), done_points[0].spuspeed, absorbs)); //回吸 var back_act = Spawn.create(); for (int i = 0; i < done_points.Count; i++) { if (done_points[i].backcapacity != 0) { absorbs[entcloses[i].Index] = -(done_points[i].backcapacity); List <Enterclose> ent_tem = new List <Enterclose>(); ent_tem.Add(entcloses[i]); back_act.AddAction(Sequence.create(SKSleep.create(200), InjectAbsorb.create(3001, ent_tem.ToArray(), done_points[i].backspeed, absorbs))); } } for (int i = 0; i < done_points.Count; i++) { injz[entcloses[i].Index] = done_points[i].zb; } back_act.AddAction(InjectMoveTo.create(3001, entcloses.ToArray(), -1, IMask.Gen(-1), injz)); run_act.AddAction(back_act); } else if (done_points[0].type == TestStepEnum.MixLiquid) { for (int i = 0; i < done_points.Count; i++) { injz[entcloses[i].Index] = done_points[i].z; absorbs[entcloses[i].Index] = done_points[i].capacity + done_points[i].backcapacity; } run_act.AddAction(InjectMoveTo.create(3001, entcloses.ToArray(), -1, IMask.Gen(-1), injz, 2)); run_act.AddAction(InjectAbsorb.create(3001, entcloses.ToArray(), 100, absorbs));//把稀释液放进去 //混合操作 var mix_act = Spawn.create(); for (int i = 0; i < done_points.Count; i++) { List <Enterclose> ent_tem = new List <Enterclose>(); ent_tem.Add(entcloses[i]); var mix_seq_act = Sequence.create(); if (done_points[i].mixtimes != 0) { for (int j = 0; j < done_points[i].mixtimes * 2; j++) { int mixz = done_points[i].z - done_points[i].mixdeep;//混合高度 if (mixz <= 0) { mixz = done_points[i].z; } absorbs[entcloses[i].Index] = j % 2 == 0 ? -done_points[i].capacity : done_points[i].capacity; injz[entcloses[i].Index] = j % 2 == 0 ? done_points[i].z : mixz; mix_seq_act.AddAction(InjectMoveTo.create(3001, ent_tem.ToArray(), -1, IMask.Gen(-1), injz, 2)); mix_seq_act.AddAction(InjectAbsorb.create(30001, ent_tem.ToArray(), 100, absorbs)); } injz[entcloses[i].Index] = done_points[i].z; mix_seq_act.AddAction(InjectMoveTo.create(3001, ent_tem.ToArray(), -1, IMask.Gen(-1), injz, 2)); absorbs[entcloses[i].Index] = (int)ent_tem[0].PumpMotor.Maximum.SetValue; mix_seq_act.AddAction(InjectAbsorbMove.create(3001, ent_tem.ToArray(), 100, absorbs)); absorbs[entcloses[i].Index] = -(done_points[i].GetTubeList().Count *done_points[i].spucapacity); mix_seq_act.AddAction(InjectAbsorb.create(3001, ent_tem.ToArray(), 100, absorbs)); } mix_act.AddAction(mix_seq_act); } run_act.AddAction(mix_act); var zb_act = Spawn.create(); for (int i = 0; i < done_points.Count; i++) { injz[entcloses[i].Index] = done_points[i].zb; } zb_act.AddAction(InjectMoveTo.create(3001, entcloses.ToArray(), -1, IMask.Gen(-1), injz)); //回吸 var back_act = Spawn.create(); for (int i = 0; i < done_points.Count; i++) { List <Enterclose> ent_tem = new List <Enterclose>(); ent_tem.Add(entcloses[i]); if (done_points[i].backcapacity != 0 && done_points[i].mixtimes != 0) { absorbs[entcloses[i].Index] = -(done_points[i].backcapacity); back_act.AddAction(Sequence.create(SKSleep.create(500), InjectAbsorb.create(3001, ent_tem.ToArray(), done_points[i].backspeed, absorbs))); } } zb_act.AddAction(back_act); run_act.AddAction(zb_act); } } move_act.AddAction(run_act); seque.AddAction(move_act); GenerateInjectActGroup(ref seque, hitsort, ref index, ref tager, ref point, ref width, ref width_rate, ref is_ok, move_x); } }
// public Sequence GenerateInjectActGroup(ActionPoint[] tagers, bool is_asc = true, double [] width_rate = null) { int[] point = { 0, 0, 0, 0 }; int[] width = { 0, 0, 0, 0 }; //目标要根据针头偏移 for (int i = 0; i < tagers.Length; i++) { tagers[i].index = i; } //删除为负数的参数 if (width_rate == null) { width_rate = IMask.Gen(1.0f); } tagers = tagers.ToList().Where(item => item.y >= 0).ToArray(); for (int i = 0; i < 4; i++) { bool is_timeout = false; width[i] = (int)((double)Engine.getInstance().injectorDevice.Injector.Entercloses[i].InjWidth); //得到当前各别样Y轴坐标 Engine.getInstance().injectorDevice.CanComm.ReadRegister(Engine.getInstance().injectorDevice.Injector.Entercloses[i].YMotor.RealDistance.Addr); int pointtem = Engine.getInstance().injectorDevice.CanComm.GetIntBlock(Engine.getInstance().injectorDevice.Injector.Entercloses[i].YMotor.RealDistance.Addr, 1000, out is_timeout); point[i] = pointtem + (int)Engine.getInstance().injectorDevice.Injector.Entercloses[i].TipDis; if (is_timeout) { return(null); } } //接X分组 List <ActionPoint> tager_list = tagers.ToList(); List <List <ActionPoint> > tager_group = new List <List <ActionPoint> >(); if (is_asc) { tager_list.Sort((a, b) => { return(a.x > b.x ? 1 : -1); }); } else { tager_list.Sort((a, b) => { return(a.x < b.x ? 1 : -1); }); } int x = -10; foreach (var tagerp in tager_list) { if (tagerp.x != x) { var group = new List <ActionPoint>(); group.Add(tagerp); tager_group.Add(group); x = tagerp.x; } else if (tager_group.Count != 0) { tager_group[tager_group.Count - 1].Add(tagerp); } } //生成动作组合 int index = 0; bool is_ok = false; var seque = Sequence.create(); foreach (var group in tager_group) { var move_y = Sequence.create(); ActionPoint[] tager = IMask.Gen(new ActionPoint(-1, -1, -1)); var tager_sort = IMask.Gen(new ActionPoint(-1, -1, -1)).ToList(); for (int i = 0; i < group.Count(); i++) { tager[group[i].index] = group[i]; tager_sort[group[i].index] = group[i]; } index = 0; int[] hit_sort = { 0, 1, 2, 3 }; //y轴顺序排列 tager_sort.Sort((a, b) => { return(a.hitsort <= b.hitsort ? 1 : -1); }); for (int i = 0; i < tager_sort.Count(); i++) { hit_sort[i] = tager_sort[i].index; } var spawn = Spawn.create(); ActionBase move_x = null; if (group[0].x != -1) { move_x = (ActionBase)MoveTo.create(3001, group[0].x, -1, -1); } else { move_x = SKSleep.create(0); } GenerateInjectActGroup(ref move_y, hit_sort, ref index, ref tager, ref point, ref width, ref width_rate, ref is_ok, move_x); if (is_ok) { spawn.AddAction(move_x); spawn.AddAction(move_y); seque.AddAction(spawn); } else { break; } } return(seque); }
/// <summary> /// 分液 /// </summary> public void Distribute() { int[] absorbs = { (int)DistributeVol, (int)DistributeVol, (int)DistributeVol, (int)DistributeVol }; var act = Sequence.create(InjectAbsorb.create(3000, injectorDevice.GetSeleteced(), DistributeSpeed, absorbs, IMask.Gen(0))); act.runAction(injectorDevice); }
//无速度手动限制 public bool MoveY(Enterclose[] injects, int speed = 0, bool is_abs = false, params int[] y) { bool ret = false; System.Diagnostics.Debug.Assert(y.Count() == 4); System.Diagnostics.Debug.Assert(injects != null); if (injects.Length == 0) { return(true); } if (node is InjectorDevice) { ret = true; var device = (InjectorDevice)node; var realy = IMask.Gen(0); GetRealY(injects, ref realy); foreach (var inject in injects) { int set_speed = 0; if (speed == 0) { set_speed = inject.YMotor.Speed.SetValue; } else if (speed == 1) { set_speed = inject.YMotor.SecondSpeed.SetValue; } else if (speed == 2) { set_speed = inject.YMotor.DownSpeed.SetValue; } else { set_speed = speed; } if (inject.YMotor.device_speed != set_speed) { ret = ret && device.CanComm.SetRegister(inject.YMotor.Speed.Addr, set_speed); if (ret) { inject.YMotor.device_speed = set_speed; } } int pcby = 0; int pcbry = realy[inject.Index]; int distance = Convert.ToInt32(y[inject.Index] * Convert.ToDecimal(inject.YMotor.Factor.SetValue)); if (is_abs) { pcby = distance; } else { pcby = distance - (int)inject.TipDis; } if (pcby < 0) { pcby = distance - (int)inject.InjWidth; } if (pcby < 0) { if (y[inject.Index] != 0) { ErrorSystem.WriteActError("加样器:" + (inject.Index + 1) + "无法到达" + y[inject.Index], true, false); var act_list = ActionManager.getInstance().getAllRuningActions(node); foreach (var act in act_list) { act.isdelete = true; } return(false); } else { pcby = 0; } } device.CanComm.Set2PLC(inject.YMotor.StopCoil); ret = ret && device.CanComm.StopMotor(inject.YMotor); ret = ret && device.CanComm.SetCoilOff(inject.YMotor.DoneCoil.Addr); ret = ret && device.CanComm.SetRegister(inject.YMotor.Distance.Addr, pcby); } //Thread.Sleep(50); foreach (var inject in injects) { Thread.Sleep(20); ret = ret && device.CanComm.StartMotor(inject.YMotor); Thread.Sleep(20); } } System.Diagnostics.Debug.Assert(ret); return(ret); }
//执行 public void Logic(double dt) { ClsAction(); //并行执行 foreach (var pack in experiment_package_list) { if (pack.action_list.Count != 0) { if (pack.is_jyjs) { var cen_tree = generater.DivideIntoGroups(pack.action_list, 1); ActLogic(cen_tree[0], null, dt); } } } //离心逻辑 bool is_use_cent = false; foreach (var cent in cenMrg.CentrifugeMDevices) { if (resmanager.GetCenStatus(cent.Centrifugem.Code.SetValue)) { //如果当前离心机在跑或已满卡就添加到下一个离心机中 is_use_cent = CenRunLogic(cent); if (is_use_cent) { break; // 离心启动逻辑 } } } if (is_use_cent == false) { //顺序执行 int inject_count = 1; var inj_action_list_tem = inj_action_list.Where(item => ((ExperimentPackage)item.ExperPackage).is_jyjs == false).ToList(); if (inj_action_list_tem.Count != 0) { var action_tem = inj_action_list_tem[0]; var exp_pack = (ExperimentPackage)action_tem.ExperPackage; var paper_seat = resmanager.GetResByCode(exp_pack.GetGelMask(), "T_BJ_GelSeat", "", "4"); var liquidinfo = action_tem.GetLiquidInfo(); inject_count = GetInjectCount(); //如果是加样试剂最多两个针头 if (liquidinfo != null && liquidinfo.IsAgentia && inject_count > 2) { inject_count = 2; } var inj_tree = generater.DivideIntoGroups(inj_action_list_tem, inject_count); var act_group = inj_tree[0]; var act_group_next = inj_tree.Count > 1 ? inj_tree[1] : null; ActLogic(act_group, act_group_next, dt); } } //机器手空闲回零 if (actionmanager.getAllActionsCount(handDevice) == 0 && handDevice.Hand.XMotor.CurrentDistance != 0) { hand_wait_time += dt; if (hand_wait_time > 1000) { var act = Sequence.create(MoveTo.create(handDevice, 10000, -1, -1, 0), MoveTo.create(handDevice, 10000, 0, 0, 0), InitXyz.create(10000, true, true, true)); act.runAction(handDevice); hand_wait_time = 0; } } //加样器空闲回零 if (actionmanager.getAllActionsCount(injectorDevice) == 0 && injectorDevice.Injector.XMotor.CurrentDistance != 0) { inj_wait_time += dt; if (inj_wait_time > 1000) { var by = IMask.Gen(0); foreach (var ent in injectorDevice.Injector.Entercloses) { by[ent.Index] = (int)ent.YZero; } var act = Sequence.create( InjectMoveTo.create(injectorDevice, 3000, injectorDevice.Injector.Entercloses, -1, IMask.Gen(-1), IMask.Gen(0)), InjectMoveTo.create(injectorDevice, 3000, injectorDevice.Injector.Entercloses, 0, IMask.Gen(0), IMask.Gen(-1)), InitXyz.create(injectorDevice, 20000, injectorDevice.Injector.Entercloses, true, true, true, by)); act.runAction(injectorDevice); inj_wait_time = 0; } } else { inj_wait_time = 0; } }
public void AbsLiquid() { if (this.SelectedBJ == null) { return; } var move_act = Sequence.create(); bool is_find = false; move_act.AddAction(InjectMoveTo.create(10000, injectorDevice.GetSeleteced(), -1, IMask.Gen(-1), IMask.Gen(0))); int x = 0; int y = 0; int z = 0; if (SelectedBJ is T_BJ_SampleRack sampleseat) { x = (int)(sampleseat.X); y = (int)(sampleseat.Y + SeatYIndex * sampleseat.Gap); z = (int)(sampleseat.Z); is_find = true; } else if (SelectedBJ is T_BJ_DeepPlate deepplate) { x = (int)(deepplate.X + SeatXIndex * deepplate.GapX); y = (int)(deepplate.Y + SeatYIndex * deepplate.GapY); z = (int)(deepplate.Z); is_find = true; } else if (SelectedBJ is T_BJ_AgentiaWarehouse agentiaware) { x = (int)(agentiaware.X); y = (int)(agentiaware.Y + SeatYIndex * agentiaware.Gap); z = (int)(agentiaware.Z); is_find = true; } else if (SelectedBJ is T_BJ_GelSeat gelseat) { x = (int)(gelseat.InjectorX + SeatXIndex * gelseat.InjectorGapX); y = (int)(gelseat.InjectorY + SeatYIndex * gelseat.InjectorGapY); z = (int)(gelseat.InjectorZ); is_find = true; } else if (SelectedBJ is T_BJ_Unload unload) { x = (int)(unload.X); y = (int)(unload.Y); z = (int)(unload.Z); is_find = true; } if (is_find) { var tip_seat = IMask.Gen(new ActionPoint(-1, -1, -1)); foreach (var ent in injectorDevice.GetSeleteced()) { var point = new ActionPoint(); point.x = x; point.y = y; point.z = z; point.zb = 0; point.type = TestStepEnum.JXZT; point.index = ent.Index; tip_seat[ent.Index] = point; } move_act.AddAction(InjectMoveActs.create(3000, tip_seat.ToArray(), false)); move_act.runAction(injectorDevice); } }
private bool RunLogic(IList <T_LogicStep> steps, out String msg) { msg = null; var seque_root = Sequence.create(); var seque = Sequence.create(); var resmanager = ResManager.getInstance(); var generater = ActionGenerater.getInstance(); int loop_times = 0; foreach (var step in steps) { switch (step.StepEnum) { case LogicStepEnum.Alert: seque.AddAction(SkCallBackFun.create((ActionBase act_tem) => { ErrorSystem.WriteActError(step.Parameters, true, false, 9999); return(true); })); break; case LogicStepEnum.InitAll: var act_init = opDevice.InitAllDevice(); seque.AddAction(act_init); break; case LogicStepEnum.Centrifuge: { CommonAction action = Convert2T <CommonAction>(step.Parameters); var cen = cenMrg.GetCentrifugeByCode(action.Code); if (cen != null) { if (action.DoAction == 0) //正常离心程序 { int hspeed = (int)cen.Centrifugem.HightSpeed.SetValue; int lspeed = (int)cen.Centrifugem.LowSpeed.SetValue; int htime = (int)cen.Centrifugem.HightSpeedTime.SetValue; int ltime = (int)cen.Centrifugem.LowSpeedTime.SetValue; int uphtime = (int)cen.Centrifugem.AddHSpeedTime.SetValue; int upltime = (int)cen.Centrifugem.AddLSpeedTime.SetValue; int stime = (int)cen.Centrifugem.StopSpeedTime.SetValue; var act = CentrifugeStart.create(cen, 3000000, hspeed, lspeed, htime, ltime, uphtime, upltime, stime); seque.AddAction(act); } else if (action.DoAction == 1) //移动指定卡位 { var resinfo = ResManager.getInstance().SearchGelCard("T_BJ_Centrifuge", action.Code, "", (int)action.SeatIndex); var act = MoveTo.create(cen, 30000, -1, -1, resinfo.CenGelP[resinfo.CountX], 5); seque.AddAction(act); } else if (action.DoAction == 2) //开舱门 { var act = HandOpenCloseDoor.create(handDevice, 3000, action.Code, true); seque.AddAction(act); } else if (action.DoAction == 3) //关舱门 { var act = HandOpenCloseDoor.create(handDevice, 3000, action.Code, false); seque.AddAction(act); } else if (action.DoAction == 4) //初始化 { var act = InitXyz.create(cen, 3000, false, false, true); seque.AddAction(act); } } else { ErrorSystem.WriteActError("找不到指定离心机", true, false, 9999); } } break; case LogicStepEnum.Couveuse: { } break; case LogicStepEnum.Delay: { int DelayTime = Convert.ToInt32(step.Parameters); seque.AddAction(SKSleep.create(DelayTime)); } break; case LogicStepEnum.DetectSquid: { DetectAction action = Convert2T <DetectAction>(step.Parameters); List <Enterclose> iinjects = new List <Enterclose>(); foreach (var entindex in action.Indexs) { iinjects.Add(injDevice.Injector.Entercloses[entindex]); } seque.AddAction(InjectDetector.create(3000, iinjects.ToArray(), IMask.Gen((int)action.Start), IMask.Gen((int)action.ZLimit), IMask.Gen(0))); } break; case LogicStepEnum.SimpleAction: { SimpleAction action = Convert2T <SimpleAction>(step.Parameters); AbstractCanDevice device = null; switch (action.Device) { case "加样器": device = injDevice; break; case "机械手": device = handDevice; break; case "卡仓": device = gelwareDevice; break; case "破孔器": device = gelwareDevice; break; } if (action.Action == "移动") { ActionBase act_move = null; int x = action.Direction == "X" ? (int)action.Value : -1; int y = action.Direction == "Y" ? (int)action.Value : -1; int z = action.Direction == "Z"? (int)action.Value:-1; if (action.Direction == "XYZ") { x = y = z = (int)action.Value; } if (device is InjectorDevice) { act_move = InjectMoveTo.create(device, 3000, injDevice.Injector.Entercloses, x, IMask.Gen(y), IMask.Gen(z)); } else { act_move = MoveTo.create(device, 3000, x, y, z); } seque.AddAction(act_move); } else if (action.Action == "初始化") { ActionBase act_move = null; bool x = action.Direction == "X" ? true : false; bool y = action.Direction == "Y" ? true : false; bool z = action.Direction == "Z" ? true : false; if (action.Direction == "XYZ") { x = y = z = true; } if (device is InjectorDevice) { act_move = InitXyz.create(device, 30000, injDevice.Injector.Entercloses, x, y, z); } else { act_move = InitXyz.create(device, 30000, x, y, z); } seque.AddAction(act_move); } } break; case LogicStepEnum.TakeAndPutDownGel: { GelAction[] actions = Convert2T <GelAction[]>(step.Parameters); seque.AddAction(MoveTo.create(handDevice, 3000, -1, -1, 0)); ResInfoData take_seat = null; if (actions[0].BJType == "T_BJ_GelSeat") { take_seat = resmanager.SearchGelCard("T_BJ_GelSeat", "", "", actions[0].Index, 0, true, actions[0].BJName); generater.GenerateTakeGelFromNormal(take_seat, ref seque); } else if (actions[0].BJType == "T_BJ_Centrifuge") { take_seat = resmanager.SearchGelCard("T_BJ_Centrifuge", "", "", actions[0].Index, 0, true, actions[0].BJName); var act = generater.GenerateTakeGelFromCent(take_seat, "", ref seque); } else if (actions[0].BJType == "T_BJ_GelWarehouse") { take_seat = resmanager.SearchGelCard("T_BJ_GelWarehouse", "", "", actions[0].Index, 0, true, actions[0].BJName); var act = generater.GenerateTakeGelFromWare(take_seat, ref seque); } if (actions[1].BJType == "T_BJ_GelSeat") { var put_seat = resmanager.SearchGelCard("T_BJ_GelSeat", "", "", actions[1].Index, 0, true, actions[1].BJName); generater.GeneratePutGelToNormal(put_seat, take_seat, ref seque); } else if (actions[1].BJType == "T_BJ_Centrifuge") { var put_seat = resmanager.SearchGelCard("T_BJ_Centrifuge", "", "", actions[1].Index, 0, true, actions[1].BJName); generater.GeneratePutGelToCent(put_seat.CenCode, put_seat, take_seat, ref seque); } else if (actions[1].BJType == "T_BJ_GelWarehouse") { var put_seat = resmanager.SearchGelCard("T_BJ_GelWarehouse", "", "", actions[1].Index, 0, true, actions[1].BJName); generater.GeneratePutGelToWare(put_seat, take_seat, ref seque); } } break; case LogicStepEnum.TakeGel: { GelAction action = Convert2T <GelAction>(step.Parameters); ResInfoData take_seat = null; if (action.BJType == "T_BJ_GelSeat") { take_seat = resmanager.SearchGelCard("T_BJ_GelSeat", "", "", action.Index, 0, true, action.BJName); generater.GenerateTakeGelFromNormal(take_seat, ref seque); } else if (action.BJType == "T_BJ_Centrifuge") { take_seat = resmanager.SearchGelCard("T_BJ_Centrifuge", "", "", action.Index, 0, true, action.BJName); var act = generater.GenerateTakeGelFromCent(take_seat, "", ref seque); } else if (action.BJType == "T_BJ_GelWarehouse") { take_seat = resmanager.SearchGelCard("T_BJ_GelWarehouse", "", "", action.Index, 0, true, action.BJName); var act = generater.GenerateTakeGelFromWare(take_seat, ref seque); } break; } case LogicStepEnum.PutDownGel: { GelAction action = Convert2T <GelAction>(step.Parameters); ResInfoData take_seat = resmanager.handseat_resinfo; if (action.BJType == "T_BJ_GelSeat") { var put_seat = resmanager.SearchGelCard("T_BJ_GelSeat", "", "", action.Index, 0, true, action.BJName); generater.GeneratePutGelToNormal(put_seat, take_seat, ref seque); } else if (action.BJType == "T_BJ_Centrifuge") { var put_seat = resmanager.SearchGelCard("T_BJ_Centrifuge", "", "", action.Index, 0, true, action.BJName); generater.GeneratePutGelToCent(put_seat.CenCode, put_seat, take_seat, ref seque); } else if (action.BJType == "T_BJ_GelWarehouse") { var put_seat = resmanager.SearchGelCard("T_BJ_GelWarehouse", "", "", action.Index, 0, true, action.BJName); generater.GeneratePutGelToWare(put_seat, take_seat, ref seque); } break; } case LogicStepEnum.TakeTip: { TakeTipAction action = Convert2T <TakeTipAction>(step.Parameters); var ents = injDevice.Injector.Entercloses.Where(ent => ent.Valid && action.Indexs.Contains(ent.Index)).ToArray(); var tipseat = Constants.BJDict[typeof(T_BJ_Tip).Name].Where(item => item.Name == action.TipBoxName).FirstOrDefault() as T_BJ_Tip; List <ActionPoint> tip_seat = new List <ActionPoint>(); foreach (var ent in ents) { int x = (int)(tipseat.X - action.C * tipseat.GapX); int y = (int)(tipseat.Y + action.R * tipseat.GapY); var point = new ActionPoint(); point.x = x; point.y = y; point.z = (int)tipseat.Limit; point.type = TestStepEnum.JXZT; point.index = ent.Index; tip_seat.Add(point); } var sequ_taketip = Sequence.create(); var move_act = InjectMoveActs.create(injDevice, 3000, tip_seat.ToArray(), false); sequ_taketip.AddAction(InjectMoveTo.create(injDevice, 3000, ents, -1, IMask.Gen(-1), IMask.Gen(0))); sequ_taketip.AddAction(move_act); seque.AddAction(sequ_taketip); } break; case LogicStepEnum.OutTip: { TakeTipAction action = Convert2T <TakeTipAction>(step.Parameters); var ents = injDevice.Injector.Entercloses.Where(ent => ent.Valid && action.Indexs.Contains(ent.Index)).ToArray(); var sequ_puttip = Sequence.create(); List <ActionPoint> unload_seat = new List <ActionPoint>(); var inject_unload = resmanager.unload_list; if (inject_unload.Count() == 1) { var unloader = inject_unload[0]; for (int i = 0; i < 4; i++) { var unload_point = new ActionPoint((int)unloader.X, (int)unloader.Y + i * (int)unloader.FZ, (int)unloader.Z, TestStepEnum.JXZT); unload_point.puttip_x = (int)unloader.FirstX; unload_seat.Add(unload_point); } sequ_puttip.AddAction(InjectMoveTo.create(injDevice, 3000, ents, -1, IMask.Gen(-1), IMask.Gen(0))); sequ_puttip.AddAction(InjectMoveActs.create(injDevice, 3000, unload_seat.ToArray(), true)); seque.AddAction(sequ_puttip); } } break; case LogicStepEnum.Piercer: { var paper_seat = resmanager.GetResByCode("", "T_BJ_GelSeat", "", "4"); seque.AddAction(PaperCard.create(pieDevice, 3000, paper_seat, 0)); } break; case LogicStepEnum.LoopStart: { LogicLoop logicLoop = Convert2T <LogicLoop>(step.Parameters); loop_times = logicLoop.Count; seque_root.AddAction(seque); seque = Sequence.create(); } break; case LogicStepEnum.LoopEnd: { var act_repat = Repeat.create(seque, loop_times); seque_root.AddAction(act_repat); seque = Sequence.create(); loop_times = 0; } break; } } seque_root.AddAction(seque); seque_root.runAction(opDevice); return(true); }
public void PutTip() { var sequ_puttip = Sequence.create(); List <ActionPoint> unload_seat = new List <ActionPoint>(); var inject_unload = resmanager.unload_list; if (inject_unload.Count() == 1) { var unloader = inject_unload[0]; for (int i = 0; i < 4; i++) { var unload_point = new ActionPoint((int)unloader.X, (int)unloader.Y + i * (int)unloader.FZ, (int)unloader.Z, TestStepEnum.PutTip); unload_point.puttip_x = (int)unloader.FirstX; unload_seat.Add(unload_point); } sequ_puttip.AddAction(InjectMoveTo.create(3000, injectorDevice.GetSeleteced(), -1, IMask.Gen(-1), IMask.Gen(0))); sequ_puttip.AddAction(InjectMoveActs.create(3000, unload_seat.ToArray(), true)); sequ_puttip.runAction(injectorDevice); } }
public void MoveZ() { int[] z = { (int)DistanceZ, (int)DistanceZ, (int)DistanceZ, (int)DistanceZ }; var act = Sequence.create(InjectMoveTo.create(300000, injectorDevice.GetSeleteced(), -1, IMask.Gen(-1), z)); act.runAction(injectorDevice); }
/// <summary> /// 吸液 /// </summary> public void Absorb() { int[] absorbs = { -(int)AbsorbVol, -(int)AbsorbVol, -(int)AbsorbVol, -(int)AbsorbVol }; var act = Sequence.create(InjectAbsorb.create(30000, injectorDevice.GetSeleteced(), AbsorbSpeed, absorbs, IMask.Gen(0))); act.runAction(injectorDevice); }
//生成加样移动组合 public void GenerateInjectActGroup(ref Sequence seque, ref int index, ref ActionPoint[] tager, ref int[] point, ref int[] width, ref bool is_ok, ActionBase move_x = null, Spawn move_zt = null) { if (index == 4) { is_ok = true; return; } else if (tager[index].y == point[index] || tager[index].y == -1) { if (tager[index].y == point[index]) { var action_point = tager[index]; var move_act = Sequence.create(); List <Enterclose> ents = new List <Enterclose>(); int[] injz = IMask.Gen(-1); int[] injzl = IMask.Gen(-1); int[] injzd = IMask.Gen(-1); ents.Add(Engine.getInstance().injectorDevice.Injector.Entercloses[index]); move_act.AddAction(SkWaitForAction.create(move_x)); if (action_point.type == TestStepEnum.JXZT) { int[] absorbs = IMask.Gen(-1); var injact_sp = Spawn.create(); injz[index] = action_point.z; absorbs[index] = (int)ents[0].PumpMotor.Maximum.SetValue; injact_sp.AddAction(InjectMoveTo.create(3001, ents.ToArray(), -1, IMask.Gen(-1), injz, 2)); injact_sp.AddAction(InjectAbsorbMove.create(3001, ents.ToArray(), 100, absorbs)); move_act.AddAction(injact_sp); injz[index] = action_point.zb; move_act.AddAction(InjectMoveTo.create(3001, ents.ToArray(), -1, IMask.Gen(-1), injz)); } else if (action_point.type == TestStepEnum.PutTip) { injz[index] = action_point.z; var sequ = Sequence.create(); sequ.AddAction(InjectMoveTo.create(3001, ents.ToArray(), -1, IMask.Gen(-1), injz, 2)); sequ.AddAction(MoveTo.create(3001, action_point.puttip_x, -1, -1)); injz[index] = action_point.z - 1000; sequ.AddAction(InjectMoveTo.create(3001, ents.ToArray(), -1, IMask.Gen(-1), injz, 100)); injz[index] = action_point.zb; sequ.AddAction(InjectMoveTo.create(3001, ents.ToArray(), -1, IMask.Gen(-1), injz)); move_act.AddAction(sequ); } else if (action_point.type == TestStepEnum.AbsLiquid) { int[] absorbs = IMask.Gen(-1); absorbs[index] = -(action_point.capacity); move_act.AddAction(InjectMoveTo.create(3001, ents.ToArray(), -1, IMask.Gen(-1), injz, 0)); injz[index] = action_point.z + action_point.deep; move_act.AddAction(InjectMoveTo.create(3001, ents.ToArray(), -1, IMask.Gen(-1), injz, action_point.deepspeed)); move_act.AddAction(InjectAbsorb.create(3001, ents.ToArray(), action_point.absbspeed, absorbs)); //回吸 var back_act = Spawn.create(); if (action_point.backcapacity != 0) { absorbs[index] = -(action_point.backcapacity); back_act.AddAction(Sequence.create(SKSleep.create(500), InjectAbsorb.create(3001, ents.ToArray(), action_point.backspeed, absorbs))); } injz[index] = action_point.zb; back_act.AddAction(InjectMoveTo.create(3001, ents.ToArray(), -1, IMask.Gen(-1), injz)); move_act.AddAction(back_act); } else if (action_point.type == TestStepEnum.FollowAbsLiquid) { int[] absorbs = IMask.Gen(-1); injz[index] = action_point.z; injzl[index] = action_point.z + action_point.detectordeep; injzd[index] = action_point.deep; absorbs[index] = -(action_point.capacity); move_act.AddAction(InjectDetector.create(3001, ents.ToArray(), injz, injzl, injzd, 2, 1)); move_act.AddAction(InjectAbsorb.create(3001, ents.ToArray(), action_point.absbspeed, absorbs)); //回吸 var back_act = Spawn.create(); if (action_point.backcapacity != 0) { absorbs[index] = -(action_point.backcapacity); back_act.AddAction(Sequence.create(SKSleep.create(500), InjectAbsorb.create(3001, ents.ToArray(), action_point.backspeed, absorbs))); } injz[index] = action_point.zb; back_act.AddAction(InjectMoveTo.create(3001, ents.ToArray(), -1, IMask.Gen(-1), injz)); move_act.AddAction(back_act); } else if (action_point.type == TestStepEnum.SpuLiquid) { int[] absorbs = IMask.Gen(-1); injz[index] = action_point.z; absorbs[index] = action_point.spucapacity + action_point.backcapacity; move_act.AddAction(InjectMoveTo.create(3001, ents.ToArray(), -1, IMask.Gen(-1), injz, 2)); move_act.AddAction(InjectAbsorb.create(3001, ents.ToArray(), action_point.spuspeed, absorbs)); //回吸 var back_act = Spawn.create(); if (action_point.backcapacity != 0) { absorbs[index] = -(action_point.backcapacity); back_act.AddAction(Sequence.create(SKSleep.create(100), InjectAbsorb.create(3001, ents.ToArray(), action_point.backcapacity, absorbs))); } injz[index] = action_point.zb; back_act.AddAction(InjectMoveTo.create(3001, ents.ToArray(), -1, IMask.Gen(-1), injz)); move_act.AddAction(back_act); } else if (action_point.type == TestStepEnum.MixLiquid) { int[] absorbs = IMask.Gen(-1); injz[index] = action_point.z; move_act.AddAction(InjectMoveTo.create(3001, ents.ToArray(), -1, IMask.Gen(-1), injz, 2)); absorbs[index] = action_point.capacity; move_act.AddAction(InjectAbsorb.create(3001, ents.ToArray(), 100, absorbs));//把稀释液放进去 //混合操作 if (action_point.mixtimes != 0) { for (int i = 0; i < action_point.mixtimes * 2; i++) { int mixz = action_point.z - action_point.mixdeep;//混合高度 if (mixz <= 0) { mixz = action_point.z; } absorbs[index] = i % 2 == 0 ? -action_point.capacity : action_point.capacity; injz[index] = i % 2 == 0 ? action_point.z: mixz; move_act.AddAction(InjectMoveTo.create(3001, ents.ToArray(), -1, IMask.Gen(-1), injz, 2)); move_act.AddAction(InjectAbsorb.create(3001, ents.ToArray(), 100, absorbs)); } injz[index] = action_point.z; move_act.AddAction(InjectMoveTo.create(3001, ents.ToArray(), -1, IMask.Gen(-1), injz, 2)); absorbs[index] = (int)ents[0].PumpMotor.Maximum.SetValue; move_act.AddAction(InjectAbsorbMove.create(3001, ents.ToArray(), 100, absorbs)); absorbs[index] = -(action_point.GetTubeList().Count *action_point.spucapacity); move_act.AddAction(InjectAbsorb.create(3001, ents.ToArray(), 100, absorbs)); } //回吸 if (action_point.backcapacity != 0) { injz[index] = action_point.z; move_act.AddAction(InjectMoveTo.create(3001, ents.ToArray(), -1, IMask.Gen(-1), injz)); absorbs[index] = -(action_point.backcapacity); move_act.AddAction(InjectAbsorb.create(3001, ents.ToArray(), action_point.backspeed, absorbs)); } injz[index] = action_point.zb; move_act.AddAction(InjectMoveTo.create(3001, ents.ToArray(), -1, IMask.Gen(-1), injz)); } //查找前面的 if (move_zt != null) { move_zt.AddAction(move_act); } else { seque.AddAction(move_act); } } index++; GenerateInjectActGroup(ref seque, ref index, ref tager, ref point, ref width, ref is_ok, move_x, move_zt); } else { List <int[]> node_list = new List <int[]>(); for (int i = 0; i < 4; i++) { for (int j = i; j < 4; j++) { for (int k = j; k < 4; k++) { for (int l = k; l < 4; l++) { int[] point_tem = { 0, 0, 0, 0 }; point_tem[i] = tager[i].y; point_tem[j] = tager[j].y; point_tem[k] = tager[k].y; point_tem[l] = tager[l].y; for (int n = 0; n < 4; n++) { if (point_tem[n] < 0) { point_tem[n] = 0; } } bool ispass = true; int frist = 0; for (int n = 0; n < 4; n++) { if (point_tem[n] != 0) { frist = n; break; } } for (int n = frist; n < 4; n++) { if (point_tem[n] == 0 && n - 1 >= 0) { point_tem[n] = point_tem[n - 1] + width[n]; } } for (int n = 0; n < frist; n++) { if (point_tem[n] == 0 && n + 1 <= 3) { point_tem[n] = point_tem[frist] - width[n] * (frist - n); } } for (int n = 0; n < 4; n++) { bool isforward = n - 1 >= 0 ? point_tem[n] >= point_tem[n - 1] + width[n - 1] : true; bool isback = n + 1 <= 3 ? point_tem[n] + width[n] <= point_tem[n + 1] : true; ispass = isforward && isforward; if (!ispass) { break; } } if (ispass && point_tem[index] == tager[index].y) { node_list.Add(point_tem); } } } } } int[] minnode = node_list[0]; foreach (var node in node_list) { if (GetLoss(tager, node) < GetLoss(tager, minnode)) { minnode = node; } } List <int> left = new List <int>(); List <int> right = new List <int>(); for (int i = 0; i < 4; i++) { if (point[i] - minnode[i] < 0) { left.Add(i); } else { right.Add(i); } } left.Sort((a, b) => { return(a < b ? 1 : -1); }); right.Sort((a, b) => { return(a > b ? 1 : -1); }); var movesp_act = Spawn.create(); var move_act = Sequence.create(); string msg = ""; int[] yy = { -1, -1, -1, -1 }; int[] zz = { -1, -1, -1, -1 }; List <Enterclose> ents = new List <Enterclose>(); for (int i = 0; i < left.Count; i++) { int indextem = left[i]; if (point[indextem] != minnode[indextem]) { ents.Add(Engine.getInstance().injectorDevice.Injector.Entercloses[indextem]); yy[indextem] = minnode[indextem]; } } movesp_act.AddAction(InjectMoveTo.create(3001, ents.ToArray(), -1, yy, zz)); ents.Clear(); for (int i = 0; i < right.Count; i++) { int indextem = right[i]; if (point[indextem] != minnode[indextem]) { ents.Add(Engine.getInstance().injectorDevice.Injector.Entercloses[indextem]); yy[indextem] = minnode[indextem]; } } movesp_act.AddAction(InjectMoveTo.create(3001, ents.ToArray(), -1, yy, zz)); for (int i = 0; i < 4; i++) { point[i] = minnode[i]; } move_act.AddAction(movesp_act); //同步Z动作 var spawz_action = Spawn.create(); move_act.AddAction(spawz_action); seque.AddAction(move_act); GenerateInjectActGroup(ref seque, ref index, ref tager, ref point, ref width, ref is_ok, move_x, spawz_action); } }
public override void run(double dt) { bool resultx = true; bool resulty = true; bool resultz = true; int device_rx = 0; int device_cx = 0; AbstractCanDevice checkdev = null; var handdev = ActionGenerater.getInstance().handDevice; var injectdev = ActionGenerater.getInstance().injectorDevice; if (CountTime(dt)) { return; } var device = new ActionDevice(node); if (node is InjectorDevice) { checkdev = ActionGenerater.getInstance().handDevice; device_cx = (int)handdev.Hand.XMotor.CurrentDistance; } else if (node is MachineHandDevice) { checkdev = ActionGenerater.getInstance().injectorDevice; device_cx = (int)injectdev.Injector.XMotor.CurrentDistance; } switch (step) { case 0: if (x >= 0 && checkdev != null && false) { sumdt = 0; wait_time += dt; if (wait_time > 500) { wait_time = 0; bool is_timeout = false; if (checkdev is MachineHandDevice) { handdev.CanComm.ReadRegister(handdev.Hand.XMotor.RealDistance.Addr); device_rx = handdev.CanComm.GetIntBlock(handdev.Hand.XMotor.RealDistance.Addr, 1000, out is_timeout); } else if (checkdev is InjectorDevice) { injectdev.CanComm.ReadRegister(injectdev.Injector.XMotor.RealDistance.Addr); device_rx = injectdev.CanComm.GetIntBlock(injectdev.Injector.XMotor.RealDistance.Addr, 1000, out is_timeout); } if (is_timeout == false) { int device_max = 10000 - x; if (device_max < 0) { device_max = 0; } if (device_rx <= device_max && device_cx <= device_max) { step++; } else if (ActionManager.getInstance().getAllRuningActionsCount(checkdev) == 0) { Sequence sequ = null; List <Enterclose> ents = new List <Enterclose>(); ents.Add(injectdev.Injector.Entercloses[0]); if (checkdev is MachineHandDevice) { sequ = Sequence.create(MoveTo.create(checkdev, 3000, -1, -1, 0), MoveTo.create(checkdev, 3000, device_max, -1, -1)); } else if (checkdev is InjectorDevice) { sequ = Sequence.create(InjectMoveTo.create(3000, ents.ToArray(), -1, IMask.Gen(-1), IMask.Gen(0)), MoveTo.create(checkdev, 3000, device_max, -1, -1)); } sequ.runAction(checkdev); } } } } else { } step++; break; case 1: if (x >= 0) { resultx = device.MoveX((int)x); } if (y >= 0) { resulty = device.MoveY((int)y); } if (z >= 0) { resultz = device.MoveZ((int)z, speed); } if (resultx && resulty && resultz) { step++; } break; case 2: if (xdone == false) { xdone = device.DoneX(); } if (ydone == false) { ydone = device.DoneY(); } if (zdone == false) { zdone = device.DoneZ(); } isfinish = xdone && ydone && zdone; break; } }
//按小组生成动作 public Sequence GenerateAction(List <T_GelStep> act_group, SampleInfo sample_info) { //更新坐标计算针头个数 int zt_count = 0; foreach (var act in act_group) { zt_count += act.InjectCount; act.UpdataPoints(sample_info); } var resmanager = ResManager.getInstance(); Enterclose[] enters = new Enterclose[zt_count];//使用加样器个数 for (int i = 0; i < zt_count; i++) { enters[i] = injectorDevice.Injector.Entercloses[i]; } //生成装帧动作 var tip_seat = resmanager.GetFreeTip(zt_count); int [] absorbs = { (int)injectorDevice.Injector.Entercloses[0].PumpMotor.Maximum.SetValue, (int)injectorDevice.Injector.Entercloses[1].PumpMotor.Maximum.SetValue, (int)injectorDevice.Injector.Entercloses[2].PumpMotor.Maximum.SetValue, (int)injectorDevice.Injector.Entercloses[3].PumpMotor.Maximum.SetValue }; var sequ_taketip = Sequence.create( InjectTakeTip.create(30000, tip_seat.Z, 0, 0, tip_seat), InjectAbsorbMove.create(30000, enters, 100, absorbs)); //生成加样动作 var sequ_takesample = Sequence.create(); var act_tree = DivideXIntoGroups(act_group); int inject_beg = 0; int[] point = { 0, 0, 0, 0 }; for (int i = 0; i < 4; i++) { point[i] = (int)injectorDevice.Injector.Entercloses[i].YMotor.CurrentDistance; if (point[i] == 0) { point[i] += (int)injectorDevice.Injector.Entercloses[i].YZero; } } foreach (var act_g in act_tree) { var sque_movey = Sequence.create(); int index = 0; bool is_ok = false; int[] tager = { -1, -1, -1, -1 }; int[] width = { 0, 0, 0, 0 }; for (int i = 0; i < 4; i++) { width[i] = (int)injectorDevice.Injector.Entercloses[1].YZero; if (i < act_g.Count()) { tager[inject_beg + i] = act_g[i].Abs_Y; } } GenerateSampleAddAct(ref sque_movey, ref index, ref tager, ref point, ref width, ref is_ok); inject_beg += act_g.Count(); if (is_ok) { sequ_takesample.AddAction(MoveTo.create(30000, act_g[0].Abs_X, -1, -1));//移动X sequ_takesample.AddAction(sque_movey); } } //生成混合液体 var sequ_mixsample = Sequence.create(); foreach (var act in act_group) { if (act.IsMix()) { sequ_mixsample.AddAction(MoveTo.create(30000, act.Mix_X, act.Mix_Y, -1)); sequ_mixsample.AddAction(InjectMoveTo.create(30000, enters, -1, IMask.Gen(-1), IMask.Gen(act.Mix_Z))); if (act.StepClass == TestStepEnum.FPXSY) { for (int i = 0; i < 3; i++) { absorbs[0] = 1000; sequ_mixsample.AddAction(InjectAbsorb.create(30000, enters, 100, absorbs)); absorbs[0] = -1000; sequ_mixsample.AddAction(InjectAbsorb.create(30000, enters, 100, absorbs)); } } if (act.IsSpu() == false) { absorbs[0] = 1000; sequ_mixsample.AddAction(InjectAbsorb.create(30000, enters, 100, absorbs)); } sequ_mixsample.AddAction(InjectMoveTo.create(30000, enters, -1, IMask.Gen(-1), IMask.Gen(0))); } } //生成分配动作 var sequ_putsample = Sequence.create(); foreach (var act in act_group) { if (act.IsSpu()) { sequ_putsample.AddAction(MoveTo.create(30000, act.Spu_X, act.Spu_Y, -1)); sequ_putsample.AddAction(InjectMoveTo.create(30000, injectorDevice.GetSeleteced(), -1, IMask.Gen(-1), IMask.Gen(act.Spu_Z))); absorbs[0] = 1000; sequ_putsample.AddAction(InjectAbsorb.create(30000, injectorDevice.GetSeleteced(), 100, absorbs)); sequ_putsample.AddAction(InjectMoveTo.create(30000, injectorDevice.GetSeleteced(), -1, IMask.Gen(-1), IMask.Gen(0))); } } var action_list = Sequence.create(); //生成脱针动作 var sequ_puttip = Sequence.create(); var inject_unload = resmanager.unload_list; if (inject_unload.Count() == 1) { sequ_puttip.AddAction(InjectPutTip.create(30000, (int)inject_unload[0].Z, 800, (int)inject_unload[0].FirstX, 0, new TakeTipData((int)inject_unload[0].X, (int)inject_unload[0].Y, 0, 1))); sequ_puttip.AddAction(InitXyz.create(30000, injectorDevice.GetSeleteced(), false, false, true)); } action_list.AddAction(sequ_taketip); action_list.AddAction(sequ_takesample); action_list.AddAction(sequ_mixsample); action_list.AddAction(sequ_putsample); action_list.AddAction(sequ_puttip); return(action_list); }
//生成加样移动组合 public void GenerateInjectActGroup(ref Sequence seque, ref int index, ref int[] tager, ref int[] point, ref int[] width, ref bool is_ok) { if (index == 4) { is_ok = true; return; } bool isforward = index - 1 >= 0 ? tager[index] >= point[index - 1] + width[index - 1] : true; bool isback = index + 1 <= 3 ? tager[index] + width[index] <= point[index + 1] : true; if (tager[index] < 0) { index++; GenerateInjectActGroup(ref seque, ref index, ref tager, ref point, ref width, ref is_ok); } else if (isforward && isback) { //单移 bool is_moveok = point[index] == tager[index];//是否已经在那个位置了 point[index] = tager[index]; int[] y = { -1, -1, -1, -1 }; int[] z = { -1, -1, -1, -1 }; y[index] = point[index]; z[index] = -1; for (int i = 0; i < 4; i++) { injectorDevice.Injector.Entercloses[i].Selected = i == index; } var move_act = Sequence.create(); if (is_moveok == false) { move_act.AddAction(InjectMoveTo.create(300000, injectorDevice.GetSeleteced(), -1, y, z)); } if (index == 0) { move_act.AddAction(InjectMoveTo.create(300000, injectorDevice.GetSeleteced(), -1, IMask.Gen(-1), IMask.Gen(400, -1, -1, -1))); move_act.AddAction(InjectMoveTo.create(300000, injectorDevice.GetSeleteced(), -1, IMask.Gen(-1), IMask.Gen(0, -1, -1, -1))); } else { move_act.AddAction(MoveTo.create(handDevice, 300000, -1, -1, 100)); move_act.AddAction(MoveTo.create(handDevice, 300000, -1, -1, 0)); } //查找上一个sp if (seque.actionlist.Count != 0 && seque.actionlist[seque.actionlist.Count() - 1] is Spawn) { int inster = is_moveok?0:1; var spawn = (Spawn)seque.actionlist[seque.actionlist.Count() - 1]; if (index != 0) { move_act.actionlist.Insert(inster, SKSleep.create(spawn.actionlist.Count * 1000)); } spawn.AddAction(move_act); } else { var spawn = Spawn.create(); spawn.AddAction(move_act); seque.AddAction(spawn); } index++; GenerateInjectActGroup(ref seque, ref index, ref tager, ref point, ref width, ref is_ok); } else if (isforward == false || isback == false) { int movew = tager[index] - point[index]; int[] stori = isback ? IMask.Gen(0, 1, 2, 3): IMask.Gen(3, 2, 1, 0); int count = isback ? (index + 1) : (4 - index); int fx = isback ? -1 : 1; int[] pointtem = { point[0], point[1], point[2], point[3] }; for (int i = 0; i < count; i++) { if (pointtem[stori[i]] + movew >= 0) { pointtem[stori[i]] = pointtem[stori[i]] + movew; } else { pointtem[stori[i]] = tager[index] + width[stori[i]] * (stori[i] - index); } if (pointtem[stori[i]] < 0) { is_ok = false; return; } } var movesp_act = Spawn.create(); var move_act = Sequence.create(); for (int i = 0; i < count; i++) { int[] yy = { -1, -1, -1, -1 }; int[] zz = { -1, -1, -1, -1 }; int indextem = stori[i]; point[indextem] = pointtem[indextem]; for (int j = 0; j < 4; j++) { injectorDevice.Injector.Entercloses[j].Selected = false; } yy[indextem] = point[indextem]; injectorDevice.Injector.Entercloses[indextem].Selected = true; movesp_act.AddAction(InjectMoveTo.create(300000, injectorDevice.GetSeleteced(), -1, yy, zz)); } move_act.AddAction(movesp_act); move_act.AddAction(SKSleep.create(1)); seque.AddAction(move_act); GenerateInjectActGroup(ref seque, ref index, ref tager, ref point, ref width, ref is_ok); } }
//生成加样移动组合 public void GenerateInjectActGroup(ref Sequence seque, ref int index, ref int[] tager, ref int[] point, ref int[] width, ref bool is_ok) { bool isforward = false; bool isback = false; if (index == 4) { is_ok = true; return; } else { isforward = index - 1 >= 0 ? tager[index] >= point[index - 1] + width[index - 1] : true; isback = index + 1 <= 3 ? tager[index] + width[index] <= point[index + 1] : true; } if (tager[index] < 0) { index++; GenerateInjectActGroup(ref seque, ref index, ref tager, ref point, ref width, ref is_ok); } else if (isforward && isback) { //单移 bool is_moveok = point[index] == tager[index];//是否已经在那个位置了 point[index] = tager[index]; int[] y = { -1, -1, -1, -1 }; int[] z = { -1, -1, -1, -1 }; y[index] = point[index]; z[index] = -1; for (int i = 0; i < 4; i++) { injectorDevice.Injector.Entercloses[i].Selected = i == index; } var move_act = Sequence.create(); if (is_moveok == false) { move_act.AddAction(InjectMoveTo.create(300000, injectorDevice.GetSeleteced(), -1, y, z)); } if (index == 0) { move_act.AddAction(InjectMoveTo.create(300000, injectorDevice.GetSeleteced(), -1, IMask.Gen(-1), IMask.Gen(400, -1, -1, -1))); move_act.AddAction(InjectMoveTo.create(300000, injectorDevice.GetSeleteced(), -1, IMask.Gen(-1), IMask.Gen(0, -1, -1, -1))); } else { move_act.AddAction(MoveTo.create(handDevice, 300000, -1, -1, 100)); move_act.AddAction(MoveTo.create(handDevice, 300000, -1, -1, 0)); } //查找上一个sp if (seque.actionlist.Count != 0 && seque.actionlist[seque.actionlist.Count() - 1] is Spawn) { int inster = is_moveok?0:1; var spawn = (Spawn)seque.actionlist[seque.actionlist.Count() - 1]; if (index != 0) { move_act.actionlist.Insert(inster, SKSleep.create(spawn.actionlist.Count * 1000)); } spawn.AddAction(move_act); } else { var spawn = Spawn.create(); spawn.AddAction(move_act); seque.AddAction(spawn); } index++; GenerateInjectActGroup(ref seque, ref index, ref tager, ref point, ref width, ref is_ok); } else if (isforward && isback == false) { //全移 int movew = tager[index] - point[index]; bool is_once = true; for (int i = 0; i <= index; i++) { if (point[i] + movew > 20000) { is_once = false; break; } } if (is_once) { int injcount = index + 1; for (int i = index; i < injcount; i++) { point[i] = point[i] + movew; bool is_pass = i + 1 <= 3 ? point[i] + width[i] <= point[i + 1] : true; if (!is_pass) { injcount++; } } int indexx = index; int y = point[index]; //全轴 //var move_act = Sequence.create(SkCallBackFun.create((ActionBase act) => //{ // for (int i = 0; i < 4; i++) // injectorDevice.Injector.Entercloses[i].Selected = false; // for (int i = indexx; i < injcount; i++) // injectorDevice.Injector.Entercloses[i].Selected = true; // return true; //}), MoveTo.create(injectorDevice, 300000, -1, y, -1)); //单轴测 var movesp_act = Spawn.create(); var move_act = Sequence.create(); List <ActionBase> actlist = new List <ActionBase>(); for (int i = indexx; i < injcount; i++) { int[] yy = { -1, -1, -1, -1 }; int[] zz = { -1, -1, -1, -1 }; for (int j = 0; j < 4; j++) { injectorDevice.Injector.Entercloses[j].Selected = false; } injectorDevice.Injector.Entercloses[i].Selected = true; yy[i] = point[i]; actlist.Add(InjectMoveTo.create(300000, injectorDevice.GetSeleteced(), -1, yy, zz)); } for (int i = actlist.Count - 1; i >= 0; i--) { movesp_act.AddAction(actlist[i]); } move_act.AddAction(movesp_act); move_act.AddAction(SKSleep.create(1)); seque.AddAction(move_act); GenerateInjectActGroup(ref seque, ref index, ref tager, ref point, ref width, ref is_ok); } else { int[] pointtem = { -1, -1, -1, -1 }; var movesp_act = Spawn.create(); var move_act = Sequence.create(); for (int i = indexx; i < injcount; i++) { pointtem[i] = tager[index] - width[i] * (index - i); if (pointtem[i] < 0) { is_ok = false; return; } } for (int i = 0; i <= index; i++) { int[] yy = { -1, -1, -1, -1 }; int[] zz = { -1, -1, -1, -1 }; point[i] = pointtem[i]; for (int j = 0; j < 4; j++) { injectorDevice.Injector.Entercloses[j].Selected = false; } yy[i] = point[i]; injectorDevice.Injector.Entercloses[i].Selected = true; movesp_act.AddAction(InjectMoveTo.create(300000, injectorDevice.GetSeleteced(), -1, yy, zz)); } move_act.AddAction(movesp_act); move_act.AddAction(SKSleep.create(1)); seque.AddAction(move_act); GenerateInjectActGroup(ref seque, ref index, ref tager, ref point, ref width, ref is_ok); } } else if (isforward == false && isback) { //等待前面完成 int movew = tager[index] - point[index]; bool is_once = true; for (int i = 0; i <= index; i++) { if (point[i] + movew < 0) { is_once = false; break; } } if (is_once) { for (int i = 0; i <= index; i++) { point[i] = point[i] + movew; } int y = point[0]; int count = index; //全轴 //var move_act = Sequence.create(SkCallBackFun.create((ActionBase act) => { // for (int i = 0; i < count; i++) // injectorDevice.Injector.Entercloses[i].Selected = true; // return true; //}), MoveTo.create(injectorDevice, 300000, -1, y, -1)); //单轴测 var movesp_act = Spawn.create(); var move_act = Sequence.create(); for (int i = 0; i <= count; i++) { int[] yy = { -1, -1, -1, -1 }; int[] zz = { -1, -1, -1, -1 }; for (int j = 0; j < 4; j++) { injectorDevice.Injector.Entercloses[j].Selected = false; } yy[i] = point[i]; injectorDevice.Injector.Entercloses[i].Selected = true; movesp_act.AddAction(InjectMoveTo.create(300000, injectorDevice.GetSeleteced(), -1, yy, zz)); } move_act.AddAction(movesp_act); move_act.AddAction(SKSleep.create(1)); seque.AddAction(move_act); GenerateInjectActGroup(ref seque, ref index, ref tager, ref point, ref width, ref is_ok); } else { int[] pointtem = { -1, -1, -1, -1 }; var movesp_act = Spawn.create(); var move_act = Sequence.create(); for (int i = 0; i <= index; i++) { pointtem[i] = tager[index] - width[i] * (index - i); if (pointtem[i] < 0) { is_ok = false; return; } } for (int i = 0; i <= index; i++) { int[] yy = { -1, -1, -1, -1 }; int[] zz = { -1, -1, -1, -1 }; point[i] = pointtem[i]; for (int j = 0; j < 4; j++) { injectorDevice.Injector.Entercloses[j].Selected = false; } yy[i] = point[i]; injectorDevice.Injector.Entercloses[i].Selected = true; movesp_act.AddAction(InjectMoveTo.create(300000, injectorDevice.GetSeleteced(), -1, yy, zz)); } move_act.AddAction(movesp_act); move_act.AddAction(SKSleep.create(1)); seque.AddAction(move_act); GenerateInjectActGroup(ref seque, ref index, ref tager, ref point, ref width, ref is_ok); } } }
//按小组生成动作 public Sequence GenerateAction(List <T_GelStep> act_group) { //更新坐标计算吸头个数 int zt_count = 0; foreach (var act in act_group) { act.InjIndex = zt_count; zt_count += act.InjectCount; } var resmanager = ResManager.getInstance(); Enterclose[] enters = new Enterclose[zt_count];//使用加样器个数 for (int i = 0; i < zt_count; i++) { enters[i] = Engine.getInstance().injectorDevice.Injector.Entercloses[i]; } //生成装帧动作 var tip_seat = resmanager.GetFreeTipActPoint(zt_count, 2); var sequ_taketip = InjectMoveActs.create(3001, tip_seat, false); //生成加样动作 var sequ_takesample = Sequence.create(); List <ActionPoint> abs_seat = new List <ActionPoint>(); int abs_index = 0; var abs_width_rate = IMask.Gen(1.0f); foreach (var act_abs in act_group) { var abs_point = GelStepToActionPoint(act_abs, TestStepEnum.AbsLiquid, null); var agentseat = resmanager.GetAgentiaWarehouseSeat(abs_point.liquid_type); if (agentseat != null) { abs_width_rate[act_abs.InjIndex] = !act_abs.GetLiquidInfo().IsAgentia ? 0.7693f : 1.1f; abs_point.y += (int)(agentseat.Gap * abs_index) * (agentseat.Count == 1 ? 1 : 0); } abs_seat.Add(abs_point); abs_index++; } sequ_takesample.AddAction(InjectMoveActs.create(3001, abs_seat.ToArray(), true, abs_width_rate)); //计算混合是否需要分配(当前卡在第一卡位时且只有一个试验) var inj_exp_list = ExperimentLogic.getInstance().GetInjExpPackageList(); foreach (var act_mix in act_group) { var exp = (ExperimentPackage)act_mix.ExperPackage; var piperseat = resmanager.GetResByCode(exp.GetGelMask(), "T_BJ_GelSeat", "", "4"); if (piperseat.CountX == 0 && inj_exp_list.Count == 1) { act_mix.is_spu = act_mix.InjIndex == 0; } else { act_mix.is_spu = act_mix.LiquidTypeIndex == act_mix.GetFpytInfo().LiquidList.Count - 1; } } //得到可用深盘 var mix_list = act_group.Where(item => item.is_mix == true).ToList(); mix_list = mix_list.Where((x, x_index) => x_index == (mix_list.FindIndex(y => y.MixCode == x.MixCode))).ToList(); int mix_inj_count = mix_list.Count; var mix_deep_seat = resmanager.GetFreeDeepPlate(mix_inj_count, 2); //生成混合液体 var sequ_mixsample = Sequence.create(); var mix_seat = IMask.Gen(new ActionPoint(-1, -1, -1)); int mix_index = 0; foreach (var act_mix in act_group) { if (act_mix.is_mix) { var mix_point = GelStepToActionPoint(act_mix, TestStepEnum.MixLiquid, mix_deep_seat[mix_index % mix_inj_count]); mix_seat[act_mix.InjIndex] = mix_point; mix_index++; } } sequ_mixsample.AddAction(InjectMoveActs.create(3001, mix_seat.ToArray(), true)); //生成分配动作 var sequ_putsample = Sequence.create(); //查找卡位 List <ActionPoint> spupoint_list = new List <ActionPoint>(); foreach (var act_spu in act_group) { if (act_spu.is_spu) { var spu_point = GelStepToActionPoint(act_spu, TestStepEnum.SpuLiquid, null); spu_point.index = act_spu.InjIndex; spupoint_list.Add(spu_point); } } var hit_count = IMask.Gen(0); for (int i = 0; i < 8; i++) { bool is_find = false; var points = IMask.Gen(new ActionPoint(-1, -1, -1)); foreach (var spuc in spupoint_list) { bool is_hit = (spuc.tube & (0x01 << i)) != 0; if (is_hit) { var tubelist = spuc.GetTubeList(); points[spuc.index] = (ActionPoint)spuc.Clone(); points[spuc.index].x = (int)(spuc.x + i * spuc.tube_gap); points[spuc.index].y = (int)spuc.y; if (tubelist.Count() != 1 && hit_count[spuc.index] < tubelist.Count() - 1) { points[spuc.index].zb = points[spuc.index].z - 1500; if (points[spuc.index].zb <= 0) { points[spuc.index].zb = 0; } } hit_count[spuc.index]++; is_find = true; } } if (is_find) { sequ_putsample.AddAction(InjectMoveActs.create(3001, points.ToArray(), true)); } } //生成脱针动作 var sequ_puttip = Sequence.create(); List <ActionPoint> unload_seat = new List <ActionPoint>(); var inject_unload = resmanager.unload_list; if (inject_unload.Count() == 1) { var unloader = inject_unload[0]; for (int i = 0; i < 4; i++) { var unload_point = new ActionPoint((int)unloader.X, (int)unloader.Y + i * (int)unloader.FZ, (int)unloader.Z, TestStepEnum.PutTip); unload_point.puttip_x = (int)unloader.FirstX; unload_seat.Add(unload_point); } sequ_puttip.AddAction(InjectMoveActs.create(3001, unload_seat.ToArray(), true)); } var action_list = Sequence.create(); action_list.node = Engine.getInstance().injectorDevice; action_list.AddAction(sequ_taketip); action_list.AddAction(sequ_takesample); action_list.AddAction(sequ_mixsample); action_list.AddAction(sequ_putsample); action_list.AddAction(sequ_puttip); return(action_list); }
//生成加样移动组合 public void GenerateInjectActGroup(ref Sequence seque, ref int index, ref int[] tager, ref int[] point, ref int[] width, ref bool is_ok) { if (index == 4) { is_ok = true; return; } else if (tager[index] == point[index] || tager[index] == -1) { if (tager[index] == point[index]) { List <Enterclose> ents = new List <Enterclose>(); if (index == 0) { var move_act = Sequence.create(); ents.Add(injectorDevice.Injector.Entercloses[index]); move_act.AddAction(InjectMoveTo.create(300000, ents.ToArray(), -1, IMask.Gen(-1), IMask.Gen(400, -1, -1, -1))); move_act.AddAction(InjectMoveTo.create(300000, ents.ToArray(), -1, IMask.Gen(-1), IMask.Gen(0, -1, -1, -1))); seque.AddAction(move_act); } else { var move_act = Sequence.create(); move_act.AddAction(MoveTo.create(handDevice, 300000, -1, -1, 100)); move_act.AddAction(MoveTo.create(handDevice, 300000, -1, -1, 0)); seque.AddAction(move_act); } } index++; GenerateInjectActGroup(ref seque, ref index, ref tager, ref point, ref width, ref is_ok); } else { List <int[]> node_list = new List <int[]>(); for (int i = 0; i < 4; i++) { for (int j = i; j < 4; j++) { for (int k = j; k < 4; k++) { for (int l = k; l < 4; l++) { int[] point_tem = { 0, 0, 0, 0 }; point_tem[i] = tager[i]; point_tem[j] = tager[j]; point_tem[k] = tager[k]; point_tem[l] = tager[l]; for (int n = 0; n < 4; n++) { if (point_tem[n] < 0) { point_tem[n] = 0; } } bool ispass = true; int frist = 0; for (int n = 0; n < 4; n++) { if (point_tem[n] != 0) { frist = n; break; } } for (int n = frist; n < 4; n++) { if (point_tem[n] == 0 && n - 1 >= 0) { point_tem[n] = point_tem[n - 1] + width[n]; } } for (int n = 0; n < frist; n++) { if (point_tem[n] == 0 && n + 1 <= 3) { point_tem[n] = point_tem[frist] - width[n] * (frist - n); } } for (int n = 0; n < 4; n++) { bool isforward = n - 1 >= 0 ? point_tem[n] >= point_tem[n - 1] + width[n - 1] : true; bool isback = n + 1 <= 3 ? point_tem[n] + width[n] <= point_tem[n + 1] : true; ispass = isforward && isforward; if (!ispass) { break; } } if (ispass && point_tem[index] == tager[index]) { node_list.Add(point_tem); } } } } } int[] minnode = node_list[0]; foreach (var node in node_list) { if (GetLoss(tager, node) < GetLoss(tager, minnode)) { minnode = node; } } List <int> left = new List <int>(); List <int> right = new List <int>(); for (int i = 0; i < 4; i++) { if (point[i] - minnode[i] < 0) { left.Add(i); } else { right.Add(i); } } left.Sort((a, b) => { return(a < b ? 1 : -1); }); right.Sort((a, b) => { return(a > b ? 1 : -1); }); var movesp_act = Spawn.create(); var move_act = Sequence.create(); string msg = ""; int[] yy = { -1, -1, -1, -1 }; int[] zz = { -1, -1, -1, -1 }; List <Enterclose> ents = new List <Enterclose>(); for (int i = 0; i < left.Count; i++) { int indextem = left[i]; if (point[indextem] != minnode[indextem]) { ents.Add(injectorDevice.Injector.Entercloses[indextem]); yy[indextem] = minnode[indextem]; } } movesp_act.AddAction(InjectMoveTo.create(300000, ents.ToArray(), -1, yy, zz)); ents.Clear(); for (int i = 0; i < right.Count; i++) { int indextem = right[i]; if (point[indextem] != minnode[indextem]) { ents.Add(injectorDevice.Injector.Entercloses[indextem]); yy[indextem] = minnode[indextem]; } } movesp_act.AddAction(InjectMoveTo.create(300000, ents.ToArray(), -1, yy, zz)); //for (int i = 0; i < 4; i++) //{ // for (int j = 0; j < 4; j++) // injectorDevice.Injector.Entercloses[j].Selected = false; // int[] yy = { -1, -1, -1, -1 }; // int[] zz = { -1, -1, -1, -1 }; // if (i < left.Count) // { // //msg = msg + "left " + left[i] + ":" + point[left[i]] + "->" + (minnode[left[i]] + " "); // int indextem = left[i]; // if (point[indextem] !=minnode[indextem]) // { // yy[indextem] = minnode[indextem]; // injectorDevice.Injector.Entercloses[indextem].Selected = true; // movesp_act.AddAction(InjectMoveTo.create(300000, injectorDevice.GetSeleteced(), -1, yy, zz)); // } // } // for (int j = 0; j < 4; j++) // injectorDevice.Injector.Entercloses[j].Selected = false; // if (i < right.Count) // { // //msg = msg + "right " + right[i] + ":" + point[right[i]] + "->" + (minnode[right[i]] + " "); // int indextem = right[i]; // if (point[indextem] != minnode[indextem]) // { // yy[indextem] = minnode[indextem]; // injectorDevice.Injector.Entercloses[indextem].Selected = true; // movesp_act.AddAction(InjectMoveTo.create(300000, injectorDevice.GetSeleteced(), -1, yy, zz)); // } // } //} for (int i = 0; i < 4; i++) { point[i] = minnode[i]; } move_act.AddAction(movesp_act); move_act.AddAction(SKSleep.create(1)); seque.AddAction(move_act); GenerateInjectActGroup(ref seque, ref index, ref tager, ref point, ref width, ref is_ok); } }
/// <summary> /// 探测液面 /// </summary> public void Detect() { if (this.SelectedBJ == null) { return; } var move_act = Sequence.create(); move_act.AddAction(InjectMoveTo.create(10000, injectorDevice.GetSeleteced(), -1, IMask.Gen(-1), IMask.Gen(0))); int x = 0; int y = 0; int z = 0; int zl = (int)ZDeepWhenDetecting; double gap = 0; if (SelectedBJ is T_BJ_SampleRack sampleseat) { x = (int)(sampleseat.X); y = (int)(sampleseat.Y + SeatYIndex * sampleseat.Gap); z = (int)sampleseat.Z; if (zl == 0) { zl = (int)sampleseat.Z + 1000; } else { zl = (int)sampleseat.Z + (int)ZDeepWhenDetecting; } gap = (double)sampleseat.Gap; } else if (SelectedBJ is T_BJ_DeepPlate deepplate) { x = (int)(deepplate.X + SeatXIndex * deepplate.GapX); y = (int)(deepplate.Y + SeatYIndex * deepplate.GapY); z = (int)deepplate.Z; if (zl == 0) { zl = (int)deepplate.Z; } else { zl = (int)deepplate.Z + (int)ZDeepWhenDetecting; } gap = (double)deepplate.GapX; } else if (SelectedBJ is T_BJ_AgentiaWarehouse agentiaware) { x = (int)(agentiaware.X); y = (int)(agentiaware.Y + SeatYIndex * agentiaware.Gap); z = (int)agentiaware.Z; if (zl == 0) { zl = (int)agentiaware.Z + 1000; } else { zl = (int)agentiaware.Z + (int)ZDeepWhenDetecting; } gap = (double)agentiaware.Gap; } var points = IMask.Gen(new ActionPoint(-1, -1, -1)); foreach (var ent in injectorDevice.GetSeleteced()) { points[ent.Index].x = x; points[ent.Index].y = y + (int)(ent.Index * gap); points[ent.Index].z = z; points[ent.Index].zb = z; } move_act.AddAction(InjectMoveActs.create(3001, points.ToArray(), true)); move_act.AddAction(InjectDetector.create(30000, injectorDevice.GetSeleteced(), IMask.Gen(z), IMask.Gen((int)zl), IMask.Gen((int)0))); move_act.runAction(injectorDevice); }