public static MoveTo create(AbstractCanDevice nodetem, double ttime = 0, int xx = -1, int yy = -1, int zz = -1, int sspeed = 0) { MoveTo acttem = create(ttime, xx, yy, zz, sspeed); acttem.node = nodetem; return(acttem); }
public void GelWareDoor(int tagerid, byte[] data) { //开门 if (is_gelware_ok == false && (getSystemMs() - last_gelware_door_time) > 1000) { is_gelware_ok = true; var task = new Task(() => { stop(); var t_gelWare = res_manager.SearchGelCard("T_BJ_GelWarehouse", "", "", 0, res_manager.gelwarehouse_list.Count - 3); int storex = data[5] == 0xff ? (int)t_gelWare.StoreX : 0; var act_tem = MoveTo.create(gelwareDevice, 5000, storex); act_tem.init(); while (true) { long dt = 100; act_tem.run(dt); Thread.Sleep(100); if (act_tem.isfinish) { break; } } if (data[5] == 0x00) { start(); } is_gelware_ok = false; }); task.Start(); } last_gelware_door_time = getSystemMs(); }
public static MoveTo getInstance() { if (instance == null) { instance = new MoveTo(); } return(instance); }
public static MoveTo create(double ttime = 0, int xx = -1, int yy = -1, int zz = -1, int sspeed = 0) { MoveTo acttem = new MoveTo(); acttem.x = xx; acttem.y = yy; acttem.z = zz; acttem.time = ttime; acttem.speed = sspeed; return(acttem); }
public void runLoop(double time) { double dt = time - lasttime; if (dt < 500) { return; } lasttime = time; //更新卡 UpdataResInfoList(); if (resinfo_list.Count == 0 && InjLogicManager.getInstance().action_tree.Count == 0) { return; } foreach (var resinfo in resinfo_list) { Logic(resinfo, dt); } ////离心逻辑 foreach (var cent in cenMrg.CentrifugeMDevices) { //如果当前离心机在跑或已满卡就添加到下一个离心机中 if (CenRunLogic(cent)) { return; // 离心启动逻辑 } break; } //机器手空闲回零 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, 0, 0, 0), InitXyz.create(20000, true, true, true)); act.runAction(handDevice); hand_wait_time = 0; } } }
//执行 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 ActLogic(List <T_GelStep> act_group, List <T_GelStep> act_group_next, double dt) { if (act_group != null && act_group.Count != 0 && act_group[0].State == 0) { int next_state = 2; var seque_act = Sequence.create(); var exper_package = ((ExperimentPackage)act_group[0].ExperPackage); seque_act.exp_pack = exper_package; AbstractCanDevice device = null; foreach (var act in act_group) { resmanager.tip_count += act.InjectCount; } if (act_group[0].InjectCount != 0) { var act_next = act_group_next == null ? null : act_group_next[0]; device = injectorDevice; act_group.Sort((a, b) => { return(((ExperimentPackage)a.ExperPackage).piercer_index > ((ExperimentPackage)b.ExperPackage).piercer_index ? 1 : -1); }); seque_act = generater.GenerateAction(act_group); if (act_next != null && act_next.InjectCount == 0) { seque_act.AddAction(SkCallBackFun.create((ActionBase act_tem) => { inj_wait_time = 9999; return(true); })); } } else { var act = act_group[0]; var act_next = act_group_next == null ? null : act_group_next[0]; var resinfo = resmanager.GetResByCode(exper_package.GetGelMask(), "T_BJ_GelSeat"); if (resinfo == null) { resinfo = resmanager.GetResByCode(exper_package.GetGelMask(), "T_BJ_Centrifuge"); } if ((resinfo == null || !resinfo.PutOk) && act.StepClass != TestStepEnum.LoadGel) { return; } switch (act.StepClass) { case TestStepEnum.LoadGel: { if (actionmanager.getAllActionsCount(handDevice) == 0) { var take_seat = resmanager.GetResByCode(exper_package.GetGelMask(), "T_BJ_GelSeat", "", "3"); var paper_seat = resmanager.GetResByCode("null", "T_BJ_GelSeat", "", "4", null, exper_package.is_crossmatching); if (paper_seat != null) { device = handDevice; if (take_seat != null) { generater.GenerateTakeGelFromNormal(take_seat, ref seque_act); } else { seque_act.AddAction(HandTakeGelFromWare.create(handDevice, 3001, gelwareDevice, exper_package.gel_mask_id, exper_package.GetGelMask(), exper_package.GetSampleCode(act.SampleIndex))); } seque_act.AddAction(HandPutGelToNormal.create(handDevice, 3001, gelwareDevice, paper_seat)); if (act_next != null && act_next.StepClass != TestStepEnum.LoadGel) { seque_act.AddAction(SkCallBackFun.create((ActionBase act_tem) => { hand_wait_time = 999999; var ware_act = MoveTo.create(gelwareDevice, 3000, 0); ware_act.runAction(gelwareDevice); return(true); })); } exper_package.piercer_index = paper_seat.CountX; paper_seat.Values[paper_seat.CountX, 0] = new ResInfoData(); seque_act.destroyfun = (ActionBase act_tem) => { paper_seat.Values[paper_seat.CountX, 0] = null; return(true); }; next_state = 2; } else { next_state = 0; } } else { next_state = 0; } } break; case TestStepEnum.KaiKongGel: { int handrx = 0; int injrx = 0; var device_hand = new ActionDevice(handDevice); var device_inj = new ActionDevice(injectorDevice); next_state = 0; if (resinfo.Purpose != "4") { var put_seat = resmanager.GetResByCode("null", "T_BJ_GelSeat", "", "4"); if (put_seat == null && resinfo.Purpose != "3") { put_seat = resmanager.GetResByCode("null", "T_BJ_GelSeat", "", "3"); } if (put_seat != null) { device = handDevice; ResInfoData put_gel = null; if (resinfo.Purpose == "lxj") { put_gel = generater.GenerateTakeGelFromCent(resinfo, resinfo.CenCode, ref seque_act); } else { put_gel = generater.GenerateTakeGelFromNormal(resinfo, ref seque_act); } generater.GeneratePutGelToNormal(put_seat, put_gel, ref seque_act); next_state = 0; } } else { bool is_next_kaikong = act_next != null ? act_next.StepClass == TestStepEnum.KaiKongGel : false; var paper_seat = resmanager.GetResByCode(exper_package.GetGelMask(), "T_BJ_GelSeat", "", "4"); int yb = is_next_kaikong ? -1 : 0; if (paper_seat != null && device_hand.GetRealX(ref handrx) && (handrx + 1000) < paper_seat.X && ActionDevice.hand_tx < paper_seat.X && device_inj.GetRealX(ref injrx) && (injrx + 1000) < paper_seat.InjectorX && ActionDevice.inj_tx < paper_seat.InjectorX + 1000) { device = piercerDevice; seque_act.AddAction(PaperCard.create(piercerDevice, 3000, paper_seat, yb)); seque_act.AddAction(SkCallBackFun.create((ActionBase acttem) => { exper_package.is_open = true; resmanager.gel_count++; return(true); })); next_state = 2; } } } break; case TestStepEnum.JYJS: { exper_package.is_jyjs = true; next_state = 2; } break; case TestStepEnum.ZKDFY: { next_state = 0; if (resinfo.Purpose == "1") { next_state = 0; exper_package.hatch_cur_time += dt; if (exper_package.hatch_cur_time >= exper_package.hatch_time) { next_state = 2; } } else if (!(resinfo.Purpose == "4" && actionmanager.getAllActionsCount(piercerDevice) != 0)) { var put_seat = resmanager.GetResByCode("null", "T_BJ_GelSeat", "", "1"); if (put_seat == null && resinfo.Purpose != "3") { put_seat = resmanager.GetResByCode("null", "T_BJ_GelSeat", "", "3"); } if (put_seat != null) { device = handDevice; ResInfoData put_gel = null; if (resinfo.Purpose == "lxj") { put_gel = generater.GenerateTakeGelFromCent(resinfo, resinfo.CenCode, ref seque_act); } else { put_gel = generater.GenerateTakeGelFromNormal(resinfo, ref seque_act); } exper_package.hatch_cur_time = 0; generater.GeneratePutGelToNormal(put_seat, put_gel, ref seque_act); next_state = 0; } else { next_state = 0; } } } break; case TestStepEnum.ZKDLXJ: { if (actionmanager.getAllActionsCount(handDevice) == 0) { next_state = 0; if (resinfo.Purpose != "lxj" && !(resinfo.Purpose == "4" && actionmanager.getAllActionsCount(piercerDevice) != 0)) { //查看可用离心机 var centrifuge_list = resmanager.centrifuge_list.Where(item => item.Status == 1).ToList(); centrifuge_list.Sort((a, b) => { return(a.LastUseTime < b.LastUseTime ? 1 : -1); }); foreach (var seat in centrifuge_list) { CentrifugeMDevice cendev = cenMrg.GetCentrifugeByCode(seat.Code); if (seat.Status == 1 && cendev != null) { device = handDevice; bool is_last_cent = seat == centrifuge_list[centrifuge_list.Count - 1]; bool iscanputcen = IsCanPutCen(cendev); var put_seat = resmanager.GetResByCode("null", "T_BJ_Centrifuge", cendev.Centrifugem.Code.SetValue); if (iscanputcen == false) { put_seat = null; } //放进待定位 if (put_seat == null && resinfo.Purpose != "3" && is_last_cent) { put_seat = resmanager.GetResByCode("null", "T_BJ_GelSeat", "", "3"); } if (put_seat != null) { var spaw = Spawn.create(); var put_seque = Sequence.create(); if (put_seat.Purpose == "lxj") { //打开离心机门 var opendoor_act = HandOpenCloseDoor.create(handDevice, 5000, cendev.Centrifugem.Code.SetValue, true); put_seque.AddAction(opendoor_act); } var put_gel = generater.GenerateTakeGelFromNormal(resinfo, ref put_seque); spaw.AddAction(put_seque); seque_act.AddAction(spaw); if (put_seat.Purpose == "lxj") { spaw.AddAction(MoveTo.create(cendev, 30001, -1, -1, put_seat.CenGelP[put_seat.CountX])); generater.GeneratePutGelToCent(cendev.Centrifugem.Code.SetValue, put_seat, put_gel, ref seque_act); } else { generater.GeneratePutGelToNormal(put_seat, put_gel, ref seque_act); } seat.LastUseTime = Engine.getInstance().getSystemMs(); break; } else { next_state = 0; } } } } } else { next_state = 0; } } break; case TestStepEnum.PutPeiGelBack: { var put_seat = resmanager.GetResByCode("null", "T_BJ_GelSeat", "", "2"); if (put_seat != null && resinfo.Purpose == "lxj") { device = handDevice; var put_gel = generater.GenerateTakeGelFromCent(resinfo, resinfo.CenCode, ref seque_act); generater.GeneratePutGelToNormal(put_seat, put_gel, ref seque_act); next_state = 2; } } break; case TestStepEnum.XJPD: { var put_seat = resmanager.GetResByCode("", "T_BJ_Camera"); //相机位 var wasted_seat = resmanager.GetResByCode("", "T_BJ_WastedSeat", "", "1"); //垃圾位 var daiding_seat = resmanager.GetResByCode("null", "T_BJ_GelSeat", "", "3"); //待定位 if (put_seat != null && wasted_seat != null && !(resinfo.Purpose == "4" && actionmanager.getAllActionsCount(piercerDevice) != 0)) { device = handDevice; ResInfoData put_gel = null; if (resinfo.Purpose == "lxj") { put_gel = generater.GenerateTakeGelFromCent(resinfo, resinfo.CenCode, ref seque_act); } else { put_gel = generater.GenerateTakeGelFromNormal(resinfo, ref seque_act); } seque_act.AddAction(MoveTo.create(handDevice, 3000, -1, -1, 0)); seque_act.AddAction(MoveTo.create(handDevice, 3000, (int)put_seat.X, (int)(put_seat.Y), -1)); seque_act.AddAction(MoveTo.create(handDevice, 3000, -1, -1, (int)(put_seat.Z))); //拍照分析 seque_act.AddAction(SkCallBackFun.create((ActionBase acttem) => { opDevice.CameraLight(true); bool result = true; if (cameraDevice.IsOpen == false) { result = cameraDevice.Open(); } var bm = cameraDevice.CaptureImage(); cameraDevice.Save(bm, exper_package); opDevice.CameraLight(false); return(true); })); //是否还有动作 if (exper_package.action_list.Count > 1 && daiding_seat != null) { seque_act.AddAction(MoveTo.create(handDevice, 3000, -1, -1, 0)); generater.GeneratePutGelToNormal(daiding_seat, put_gel, ref seque_act); } else { seque_act.AddAction(MoveTo.create(handDevice, 3000, -1, -1, 0)); seque_act.AddAction(MoveTo.create(handDevice, 3000, (int)wasted_seat.X, (int)(wasted_seat.Y))); seque_act.AddAction(HandPutCard.create(handDevice, 3000, (int)wasted_seat.ZPut, 0)); seque_act.AddAction(SkCallBackFun.create((ActionBase act_tem) => { DelPackage(exper_package); return(true); })); } next_state = 2; } } break; case TestStepEnum.ECONOMIZECOUNTTIME: { next_state = 0; if (exper_package.is_open) { exper_package.after_kktime -= dt; if (exper_package.after_kktime <= 0) { device = handDevice; next_state = 2; exper_package.after_kktime = 0; ResInfoData put_gel = null; if (resinfo.Purpose == "lxj") { put_gel = generater.GenerateTakeGelFromCent(resinfo, resinfo.CenCode, ref seque_act); } else { put_gel = generater.GenerateTakeGelFromNormal(resinfo, ref seque_act); } var wasted_seat = resmanager.GetResByCode("", "T_BJ_WastedSeat"); //垃圾位 seque_act.AddAction(MoveTo.create(handDevice, 3000, -1, -1, 0)); seque_act.AddAction(MoveTo.create(handDevice, 3000, (int)wasted_seat.X, (int)(wasted_seat.Y))); seque_act.AddAction(HandPutCard.create(handDevice, 3000, (int)wasted_seat.ZPut, 0)); } } } break; } } if (device != null) { seque_act.AddAction(SkCallBackFun.create((ActionBase act) => { foreach (var act_tem in act_group) { act_tem.State = next_state; } return(true); })); foreach (var act_tem in act_group) { act_tem.State = 1; } seque_act.runAction(device); } else { foreach (var act_tem in act_group) { act_tem.State = next_state; } } } }
//离心开始逻辑 public bool CenRunLogic(CentrifugeMDevice cendev) { bool is_allcenact = true; //是否全是离心动作 bool is_allputok = true; //是否全是已放好 bool is_empty = true; //是否为空 bool is_gelfull = false; //是否已满 bool is_gelsoon = false; //是否有卡快要离心 int gel_count = 0; List <ResInfoData> resinfo_list = new List <ResInfoData>(); if (experiment_package_list.Count == 0) { return(false); } foreach (var seat in resmanager.centrifuge_list) { if (seat.Code == cendev.Centrifugem.Code.SetValue) { for (int i = 0; i < seat.Values.Length; i++) { ResInfoData resinfo = (ResInfoData)seat.Values[i, 0]; if (resinfo != null && resinfo.PutOk) { is_empty = false; var exp_pack = GetExpPackageByMask(resinfo.GetGelMask()); if (exp_pack == null) { exp_pack = GetExpPackageByMask(resinfo.GetCodeAt(0)); } System.Diagnostics.Debug.Assert(exp_pack != null); if (exp_pack == null) { return(false); } is_allcenact = is_allcenact && exp_pack.GetActionTypeAt(0) == TestStepEnum.ZKDLXJ; is_allputok = is_allputok && resinfo.PutOk; resinfo_list.Add(resinfo); gel_count++; } } is_gelfull = gel_count >= seat.Values.Length; } } if ((is_gelfull == false && actionmanager.getAllActionsCount(handDevice) != 0) || actionmanager.getAllActionsCount(cendev) != 0) { return(false); } //普通卡位是否有卡快要离心 foreach (var seat in resmanager.gelseat_list) { for (int i = 0; i < seat.Values.Length; i++) { ResInfoData resinfo = (ResInfoData)seat.Values[i, 0]; if (resinfo != null && resinfo.PutOk && resinfo.FindCode("pei*", false) == false) { var exp_pack = GetExpPackageByMask(resinfo.GetGelMask()); if (exp_pack == null) { continue; } is_gelsoon = (exp_pack.GetActionTypeAt(0) == TestStepEnum.ZKDLXJ) || (exp_pack.GetActionTypeAt(0) == TestStepEnum.ZKDFY && exp_pack.GetActionTypeAt(1) == TestStepEnum.ZKDLXJ && exp_pack.hatch_time - exp_pack.hatch_cur_time <= 20000); if (seat.Purpose == 4 && exp_pack.FindAct(TestStepEnum.ZKDLXJ) && exp_pack.FindAct(TestStepEnum.ZKDFY) == false) { is_gelsoon = true; } if (is_gelsoon) { break; } } } if (is_gelsoon) { break; } } //检测是否满足运行条件 if (is_allcenact && is_allputok && !is_empty && (!is_gelsoon || is_gelfull)) { int hspeed = (int)cendev.Centrifugem.HightSpeed.SetValue; int lspeed = (int)cendev.Centrifugem.LowSpeed.SetValue; int htime = (int)cendev.Centrifugem.HightSpeedTime.SetValue; int ltime = (int)cendev.Centrifugem.LowSpeedTime.SetValue; int uphtime = (int)cendev.Centrifugem.AddHSpeedTime.SetValue; int upltime = (int)cendev.Centrifugem.AddLSpeedTime.SetValue; int stime = (int)cendev.Centrifugem.StopSpeedTime.SetValue; //配平卡动作(如果离心机内卡是单数就再放一张配平卡) var seque_pei = Sequence.create(); var seque = Sequence.create(); if (resinfo_list.Count() % 2 != 0) { var spaw = Spawn.create(); var put_seque = Sequence.create(); //得到配平卡 var pei_gel = resmanager.GetResByCode("pei" + cendev.Centrifugem.Code.SetValue, "T_BJ_GelSeat"); var put_gel = generater.GenerateTakeGelFromNormal(pei_gel, ref put_seque); T_GelStep[] pei_step = { new T_GelStep(), new T_GelStep() }; pei_step[0].StepClass = TestStepEnum.ZKDLXJ; pei_step[1].StepClass = TestStepEnum.PutPeiGelBack; var exp_pack = ExperimentPackage.Create(pei_step.ToList(), pei_gel.GetCodeAt(0), "123", 8, 0, 1, 0, false, 0, 0, false); exp_pack.is_jyjs = true; experiment_package_list.Add(exp_pack); resinfo_list.Add(put_gel); var put_seat = resmanager.GetResByCode("null", "T_BJ_Centrifuge", cendev.Centrifugem.Code.SetValue); spaw.AddAction(put_seque); spaw.AddAction(MoveTo.create(cendev, 30001, -1, -1, put_seat.CenGelP[put_seat.CountX])); seque_pei.AddAction(spaw); generater.GeneratePutGelToCent(cendev.Centrifugem.Code.SetValue, put_seat, put_gel, ref seque_pei); } seque_pei.AddAction(HandOpenCloseDoor.create(handDevice, 5000, cendev.Centrifugem.Code.SetValue, false)); seque.AddAction(SkWaitForAction.create(handDevice, seque_pei)); seque.AddAction(CentrifugeStart.create(cendev, 6000000, hspeed, lspeed, htime, ltime, uphtime, upltime, stime)); seque.AddAction(SkCallBackFun.create((ActionBase acttem) => { foreach (var resinfo in resinfo_list) { var exp_pack = GetExpPackageByMask(resinfo.GetGelMask()); if (exp_pack == null) { exp_pack = GetExpPackageByMask(resinfo.GetCodeAt(0)); } System.Diagnostics.Debug.Assert(exp_pack != null); var act = exp_pack.GetActionAt(0); act.State = 2; } return(true); })); seque_pei.runAction(handDevice); seque.runAction(cendev); return(true); } return(false); }
//排序 public void UpDataAction() { lock (mylock) { //融合两个试验 foreach (var package in experiment_package_list) { if (package.is_used_gel && package.action_list.Count != 0 && package.ren_fen != package.GetCurRenFen()) { var exp_pack_tem = GetCombinationExpPackage(package); if (exp_pack_tem != null) { if (exp_pack_tem.samples_barcode.Count == 1) { package.Combination(exp_pack_tem); } else { exp_pack_tem.Combination(package); } } } } ClsAction(); //把交叉配血卡的动作ID更新 //foreach (var package in experiment_package_list) //{ // if (package.is_crossmatching) package.UpDataCrossMatchingSetpIndex(); //} inj_action_list = new List <T_GelStep>(); List <List <T_GelStep> > action_group = new List <List <T_GelStep> >(); int index = 0; int max_goup_size = 12; //按有孵育的就组 experiment_package_list = experiment_package_list.OrderByDescending(a => a.sort_index).ToList(); //12个一组 int group_last_gel_test_id = -1; for (int i = 0; i < experiment_package_list.Count; i++) { //不同卡为一组 if (experiment_package_list[i].is_jyjs == false) { if (index % max_goup_size == 0 || (group_last_gel_test_id != experiment_package_list[i].gel_test_id)) { action_group.Add(new List <T_GelStep>()); index = 1; } else { index++; } action_group[action_group.Count - 1] = action_group[action_group.Count - 1].Concat(experiment_package_list[i].action_list).ToList(); group_last_gel_test_id = experiment_package_list[i].gel_test_id; } } for (int i = 0; i < action_group.Count; i++) { action_group[i] = action_group[i].OrderBy(u => u.StepIndex).ToList(); inj_action_list = inj_action_list.Concat(action_group[i]).ToList(); } //试剂(最多两个针头加样,分配,把脱针去掉,把加样去掉,把容量合并) //查找连续试剂(如果超过三个就合并) AgentiaCombination(inj_action_list, 0); SlysCombination(inj_action_list, 0); //交叉配血合并 CrossMatchingCombination(inj_action_list, 0); //破空器返回 int pier_y = 0; var pier_device = new ActionDevice(piercerDevice); pier_device.GetRealY(ref pier_y); if (pier_y != 0 && inj_action_list.Count != 0 && inj_action_list[0].StepClass != TestStepEnum.KaiKongGel) { var pier_back = MoveTo.create(piercerDevice, 3000, -1, 0, -1); pier_back.runAction(); } } }
//垃圾箱逻辑 public bool RubbishLogic(double dt) { if (actionmanager.getAllActionsCount(handDevice) != 0) { return(false); } //普通卡位 ResInfoData camer_gel = null; if (resmanager.handseat_resinfo != null && resmanager.handseat_resinfo.GetActionAt(0) == ActionPoint.ActionPointType.Rubbish) { camer_gel = resmanager.handseat_resinfo; camer_gel.Purpose = "hand"; } if (camer_gel == null) { foreach (var seat in resmanager.gelseat_list) { for (int i = 0; i < seat.Values.Length; i++) { ResInfoData resinfo = (ResInfoData)seat.Values[i, 0]; if (resinfo != null && resinfo.InjectFinish && resinfo.PutOk) { if (resinfo.GetActionAt(0) == ActionPoint.ActionPointType.Rubbish) { camer_gel = resinfo; } break; } } if (camer_gel != null) { break; } } } //检测离心机只的卡 if (camer_gel == null) { foreach (var seat in resmanager.centrifuge_list) { for (int i = 0; i < seat.Values.Length; i++) { ResInfoData resinfo = (ResInfoData)seat.Values[i, 0]; if (seat.Status == 1 && resinfo != null && resinfo.InjectFinish && resinfo.PutOk) { if (resinfo.GetActionAt(0) == ActionPoint.ActionPointType.Rubbish) { resinfo.Purpose = "lxj"; resinfo.CenCode = seat.Code; camer_gel = resinfo; break; } } } if (camer_gel != null) { break; } } } //把卡转到垃圾位 if (camer_gel != null && camer_gel.GetActionAt(0) == ActionPoint.ActionPointType.Rubbish) { var seque = Sequence.create(); bool is_put = false; var put_seat = resmanager.GetResByCode("", "T_BJ_WastedSeat"); if (put_seat != null) { ResInfoData put_gel = null; if (camer_gel.Purpose == "lxj") { put_gel = generater.GenerateTakeGelFromCent(camer_gel, camer_gel.CenCode, ref seque); } else if (camer_gel.Purpose == "hand") { put_gel = camer_gel; } else { put_gel = generater.GenerateTakeGelFromNormal(camer_gel, ref seque); } seque.AddAction(MoveTo.create(handDevice, 3000, (int)put_seat.X, (int)(put_seat.Y))); seque.AddAction(HandPutCard.create(handDevice, 3000, (int)put_seat.ZPut, 0)); seque.AddAction(MoveTo.create(handDevice, 3000, -1, -1, 0)); seque.AddAction(SkCallBackFun.create((ActionBase acttem) => { if (camer_gel.Purpose == "hand") { resmanager.handseat_resinfo = null; } put_gel.RemoveActionAt(0); return(true); })); is_put = true; } if (is_put) { seque.runAction(handDevice); return(true); } } return(false); }
//孵育逻辑(孵育位计数不在孵育位就添加抓卡) public bool HatchLogic(double dt) { //普通卡位 List <ResInfoData> resinfo_list = new List <ResInfoData>(); foreach (var seat in resmanager.gelseat_list) { for (int i = 0; i < seat.Values.Length; i++) { ResInfoData resinfo = (ResInfoData)seat.Values[i, 0]; if (resinfo != null && resinfo.InjectFinish && resinfo.PutOk) { if (seat.Purpose != 1) { if (resinfo.GetActionAt(0) == ActionPoint.ActionPointType.Hatch) { resinfo_list.Add(resinfo); } } else if (seat.Purpose == 1) { if (resinfo.GetActionAt(0) == ActionPoint.ActionPointType.Hatch) { resinfo.HatchCurTime += dt; if (resinfo.HatchCurTime >= resinfo.HatchTime) { resinfo.RemoveActionAt(0); } } } } } } //检测离心机只的卡 foreach (var seat in resmanager.centrifuge_list) { for (int i = 0; i < seat.Values.Length; i++) { ResInfoData resinfo = (ResInfoData)seat.Values[i, 0]; if (seat.Status == 1 && resinfo != null && resinfo.InjectFinish && resinfo.PutOk) { if (resinfo.GetActionAt(0) == ActionPoint.ActionPointType.Hatch) { resinfo.Purpose = "lxj"; resinfo.CenCode = seat.Code; resinfo_list.Add(resinfo); } } } } if (actionmanager.getAllActionsCount(piercerDevice) != 0 || actionmanager.getAllActionsCount(handDevice) != 0 || resmanager.handseat_resinfo != null) { return(false); } //把卡转到孵育位 if (resinfo_list.Count != 0) { var seque = Sequence.create(); bool is_put = false; foreach (var resinfo in resinfo_list) { var put_seat = resmanager.GetResByCode("null", "T_BJ_GelSeat", "", "1"); if (put_seat == null && resinfo.Purpose != "3") { put_seat = resmanager.GetResByCode("null", "T_BJ_GelSeat", "", "3"); } if (put_seat != null) { ResInfoData put_gel = null; if (resinfo.Purpose == "lxj") { put_gel = generater.GenerateTakeGelFromCent(resinfo, resinfo.CenCode, ref seque); } else { put_gel = generater.GenerateTakeGelFromNormal(resinfo, ref seque); } put_gel.HatchCurTime = 0; generater.GeneratePutGelToNormal(put_seat, put_gel, ref seque); is_put = true; } } if (is_put) { seque.AddAction(MoveTo.create(handDevice, 3000, 0, -1, -1)); seque.runAction(handDevice); return(true); } } return(false); }
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 bool CenRunLogic(CentrifugeMDevice cendev) { bool is_allcenact = true; //是否全是离心动作 bool is_allputok = true; //是否全是已放好 bool is_empty = true; //是否为空 bool is_gelfull = false; //是否已满 bool is_gelsoon = false; //是否有卡快要离心 int gel_count = 0; List <ResInfoData> resinfo_list = new List <ResInfoData>(); foreach (var seat in resmanager.centrifuge_list) { if (seat.Code == cendev.Centrifugem.Code.SetValue) { for (int i = 0; i < seat.Values.Length; i++) { ResInfoData resinfo = (ResInfoData)seat.Values[i, 0]; if (resinfo != null && resinfo.InjectFinish && resinfo.PutOk) { is_empty = false; is_allcenact = is_allcenact && resinfo.GetActionAt(0) == ActionPoint.ActionPointType.Centrifugal; is_allputok = is_allputok && resinfo.PutOk; resinfo_list.Add(resinfo); gel_count++; } } is_gelfull = gel_count >= seat.Values.Length; } } if ((is_gelfull == false && actionmanager.getAllActionsCount(handDevice) != 0) || actionmanager.getAllActionsCount(cendev) != 0) { return(false); } //普通卡位是否有卡快要离心 foreach (var seat in resmanager.gelseat_list) { for (int i = 0; i < seat.Values.Length; i++) { ResInfoData resinfo = (ResInfoData)seat.Values[i, 0]; if (resinfo != null && resinfo.InjectFinish && resinfo.PutOk) { is_gelsoon = (resinfo.GetActionAt(0) == ActionPoint.ActionPointType.Centrifugal) || (resinfo.GetActionAt(0) == ActionPoint.ActionPointType.Hatch && resinfo.GetActionAt(1) == ActionPoint.ActionPointType.Centrifugal && resinfo.HatchTime - resinfo.HatchCurTime <= 20000); if (seat.Purpose == 4 && resinfo.FindAct(ActionPoint.ActionPointType.Centrifugal) && resinfo.FindAct(ActionPoint.ActionPointType.Hatch) == false) { is_gelsoon = true; } if (is_gelsoon) { break; } } } if (is_gelsoon) { break; } } //检测是否满足运行条件 if (is_allcenact && is_allputok && !is_empty && (!is_gelsoon || is_gelfull)) { int hspeed = (int)cendev.Centrifugem.HightSpeed.SetValue; int lspeed = (int)cendev.Centrifugem.LowSpeed.SetValue; int htime = (int)cendev.Centrifugem.HightSpeedTime.SetValue; int ltime = (int)cendev.Centrifugem.LowSpeedTime.SetValue; int uphtime = (int)cendev.Centrifugem.AddHSpeedTime.SetValue; int upltime = (int)cendev.Centrifugem.AddLSpeedTime.SetValue; int stime = (int)cendev.Centrifugem.StopSpeedTime.SetValue; //配平卡动作(如果离心机内卡是单数就再放一张配平卡) var seque_pei = Sequence.create(); var seque = Sequence.create(); if (resinfo_list.Count() % 2 != 0) { var spaw = Spawn.create(); var put_seque = Sequence.create(); //得到配平卡 var pei_gel = resmanager.GetResByCode("pei" + cendev.Centrifugem.Code.SetValue, "T_BJ_GelSeat"); var put_gel = generater.GenerateTakeGelFromNormal(pei_gel, ref put_seque); put_gel.ActionList.Add(ActionPointType.Centrifugal); put_gel.ActionList.Add(ActionPointType.PutPeiGelBack); put_gel.InjectFinish = true; resinfo_list.Add(put_gel); var put_seat = resmanager.GetResByCode("null", "T_BJ_Centrifuge", cendev.Centrifugem.Code.SetValue); spaw.AddAction(put_seque); spaw.AddAction(MoveTo.create(cendev, 30001, -1, -1, put_seat.CenGelP[put_seat.CountX])); seque_pei.AddAction(spaw); generater.GeneratePutGelToCent(cendev.Centrifugem.Code.SetValue, put_seat, put_gel, ref seque_pei); } seque_pei.AddAction(HandOpenCloseDoor.create(handDevice, 5000, cendev.Centrifugem.Code.SetValue, false)); seque.AddAction(SkWaitForAction.create(handDevice, seque_pei)); seque.AddAction(CentrifugeStart.create(cendev, 300000, hspeed, lspeed, htime, ltime, uphtime, upltime, stime)); seque.AddAction(SkCallBackFun.create((ActionBase acttem) => { foreach (var resinfo in resinfo_list) { if (resinfo.InjectFinish) { resinfo.RemoveActionAt(0); } } return(true); })); seque_pei.runAction(handDevice); seque.runAction(cendev); return(true); } return(false); }
public void Logic(ResInfoData resinfo, double dt) { switch (resinfo.GetActionAt(0)) { case ActionPointType.Hatch: { if (resinfo.Purpose == "1") { resinfo.HatchCurTime += dt; if (resinfo.HatchCurTime >= resinfo.HatchTime) { resinfo.RemoveActionAt(0); } } else if (!(resinfo.Purpose == "4" && actionmanager.getAllActionsCount(piercerDevice) != 0)) { var seque = Sequence.create(); var put_seat = resmanager.GetResByCode("null", "T_BJ_GelSeat", "", "1"); if (put_seat == null && resinfo.Purpose != "3") { put_seat = resmanager.GetResByCode("null", "T_BJ_GelSeat", "", "3"); } if (put_seat != null) { ResInfoData put_gel = null; if (resinfo.Purpose == "lxj") { //CentrifugeMDevice cendev = cenMrg.GetCentrifugeByCode(resinfo.CenCode); //seque.AddAction(MoveTo.create(cendev, 30000, -1, -1, 0)); //seque.AddAction(InitXyz.create(cendev, 30000, false, false, true)); put_gel = generater.GenerateTakeGelFromCent(resinfo, resinfo.CenCode, ref seque); } else { put_gel = generater.GenerateTakeGelFromNormal(resinfo, ref seque); } put_gel.HatchCurTime = 0; generater.GeneratePutGelToNormal(put_seat, put_gel, ref seque); seque.runAction(handDevice); } } } break; case ActionPointType.Centrifugal: { if (resinfo.Purpose != "lxj" && !(resinfo.Purpose == "4" && actionmanager.getAllActionsCount(piercerDevice) != 0)) { foreach (var seat in resmanager.centrifuge_list) { CentrifugeMDevice cendev = cenMrg.GetCentrifugeByCode(seat.Code); if (seat.Status == 1 && cendev != null) { bool iscanputcen = IsCanPutCen(cendev); var seque = Sequence.create(); var put_seat = resmanager.GetResByCode("null", "T_BJ_Centrifuge", cendev.Centrifugem.Code.SetValue); if (iscanputcen == false) { put_seat = null; } if (put_seat == null && resinfo.Purpose != "3") { put_seat = resmanager.GetResByCode("null", "T_BJ_GelSeat", "", "3"); } if (put_seat != null) { var spaw = Spawn.create(); var put_seque = Sequence.create(); var put_gel = generater.GenerateTakeGelFromNormal(resinfo, ref put_seque); spaw.AddAction(put_seque); seque.AddAction(spaw); if (put_seat.Purpose == "lxj") { spaw.AddAction(MoveTo.create(cendev, 30001, -1, -1, put_seat.CenGelP[put_seat.CountX])); generater.GeneratePutGelToCent(cendev.Centrifugem.Code.SetValue, put_seat, put_gel, ref seque); } else { generater.GeneratePutGelToNormal(put_seat, put_gel, ref seque); } seque.runAction(handDevice); break; } } } } } break; case ActionPointType.PutPeiGelBack: { var seque = Sequence.create(); var put_seat = resmanager.GetResByCode("null", "T_BJ_GelSeat", "", "2"); if (put_seat != null && resinfo.Purpose == "lxj") { //CentrifugeMDevice cendev = cenMrg.GetCentrifugeByCode(resinfo.CenCode); //seque.AddAction(MoveTo.create(cendev, 30000, -1, -1, 0)); //seque.AddAction(InitXyz.create(cendev, 30000, false, false, true)); var put_gel = generater.GenerateTakeGelFromCent(resinfo, resinfo.CenCode, ref seque); generater.GeneratePutGelToNormal(put_seat, put_gel, ref seque); seque.AddAction(SkCallBackFun.create((ActionBase acttem) => { resinfo.RemoveActionAt(0); return(true); })); seque.runAction(handDevice); } } break; case ActionPointType.Camera: { var seque = Sequence.create(); var put_seat = resmanager.GetResByCode("", "T_BJ_Camera"); var wasted_seat = resmanager.GetResByCode("", "T_BJ_WastedSeat"); if (put_seat != null && wasted_seat != null && !(resinfo.Purpose == "4" && actionmanager.getAllActionsCount(piercerDevice) != 0)) { ResInfoData put_gel = null; if (resinfo.Purpose == "lxj") { //CentrifugeMDevice cendev = cenMrg.GetCentrifugeByCode(resinfo.CenCode); //seque.AddAction(MoveTo.create(cendev, 30000, -1, -1, 0)); //seque.AddAction(InitXyz.create(cendev, 30000, false, false, true)); put_gel = generater.GenerateTakeGelFromCent(resinfo, resinfo.CenCode, ref seque); } else { put_gel = generater.GenerateTakeGelFromNormal(resinfo, ref seque); } seque.AddAction(MoveTo.create(handDevice, 3000, -1, -1, 0)); seque.AddAction(MoveTo.create(handDevice, 3000, (int)put_seat.X, (int)(put_seat.Y), -1)); seque.AddAction(MoveTo.create(handDevice, 3000, -1, -1, (int)(put_seat.Z))); //拍照分析 seque.AddAction(SkCallBackFun.create((ActionBase acttem) => { bool result = true; if (cameraDevice.IsOpen == false) { result = cameraDevice.Open(); } var bm = cameraDevice.CaptureImage(); var bag = new TestBag(Common.Enums.TestLevelEnum.Normal); var gel = new Gel(resinfo.GetGelMask()); bag.GelType = resinfo.gel; bag.Add(resinfo.GetSampleBarcode(), (byte)resinfo.GetSampleRackIndex(), (byte)resinfo.CountX); bag.SetStartTime(resinfo.StartTime); gel.SampleBarcodes.Add(resinfo.GetSampleBarcode()); cameraDevice.Save(bag, gel, bm, "888"); //cameraDevice.Close(); put_gel.RemoveActionAt(0); return(true); })); seque.AddAction(MoveTo.create(handDevice, 3000, (int)wasted_seat.X, (int)(wasted_seat.Y))); seque.AddAction(HandPutCard.create(handDevice, 3000, (int)wasted_seat.ZPut, 0)); seque.runAction(handDevice); } } break; } }
//排序 public void UpDataAction() { lock (mylock) { //融合两个试验 foreach (var package in experiment_package_list) { if (package.is_used_gel && package.action_list.Count != 0 && package.ren_fen != package.GetCurRenFen()) { var exp_pack_tem = GetCombinationExpPackage(package); if (exp_pack_tem != null) { if (exp_pack_tem.action_list.Count != 1) { package.Combination(exp_pack_tem); } else { exp_pack_tem.Combination(package); } } } } ClsAction(); inj_action_list = new List <T_GelStep>(); List <List <T_GelStep> > action_group = new List <List <T_GelStep> >(); int index = 0; int max_goup_size = 12; //加载卡打孔12个一组 for (int i = 0; i < experiment_package_list.Count; i++) { if (experiment_package_list[i].is_jyjs == false) { if (index % max_goup_size == 0) { action_group.Add(new List <T_GelStep>()); } var loadgel_list = experiment_package_list[i].action_list.Where(item => item.StepClass == TestStepEnum.LoadGel); var kaikonggel_list = experiment_package_list[i].action_list.Where(item => item.StepClass == TestStepEnum.KaiKongGel); action_group[action_group.Count - 1] = action_group[action_group.Count - 1].Concat(loadgel_list).ToList(); action_group[action_group.Count - 1] = action_group[action_group.Count - 1].Concat(kaikonggel_list).ToList(); index++; } } //加样动作4个一组 index = 0; max_goup_size = 4; for (int i = 0; i < experiment_package_list.Count; i++) { if (experiment_package_list[i].is_jyjs == false) { if (index % max_goup_size == 0) { action_group.Add(new List <T_GelStep>()); } var jyact_list = experiment_package_list[i].action_list.Where(item => item.StepClass == TestStepEnum.JYJS).ToList(); int jyjs_index = jyact_list.Count != 0?jyact_list[0].StepIndex:1000; var nomoact_list = experiment_package_list[i].action_list.Where(item => item.StepIndex < jyjs_index && item.StepClass != TestStepEnum.LoadGel && item.StepClass != TestStepEnum.KaiKongGel); action_group[action_group.Count - 1] = action_group[action_group.Count - 1].Concat(nomoact_list).ToList(); index++; } } //加样后动作12个一组 index = 0; max_goup_size = 12; for (int i = 0; i < experiment_package_list.Count; i++) { if (experiment_package_list[i].is_jyjs == false) { if (index % max_goup_size == 0) { action_group.Add(new List <T_GelStep>()); } var jyact_list = experiment_package_list[i].action_list.Where(item => item.StepClass == TestStepEnum.JYJS).ToList(); int jyjs_index = jyact_list.Count != 0 ? jyact_list[0].StepIndex : 1000; var nomoact_list = experiment_package_list[i].action_list.Where(item => item.StepIndex >= jyjs_index && item.StepClass != TestStepEnum.LoadGel && item.StepClass != TestStepEnum.KaiKongGel); action_group[action_group.Count - 1] = action_group[action_group.Count - 1].Concat(nomoact_list).ToList(); index++; } } for (int i = 0; i < action_group.Count; i++) { action_group[i] = action_group[i].OrderBy(u => u.StepIndex).ToList(); inj_action_list = inj_action_list.Concat(action_group[i]).ToList(); } //试剂(最多两个针头加样,分配,把脱针去掉,把加样去掉,把容量合并) //查找连续试剂(如果超过三个就合并) AgentiaCombination(inj_action_list, 0); //破空器返回 int pier_y = 0; var pier_device = new ActionDevice(piercerDevice); pier_device.GetRealY(ref pier_y); if (pier_y != 0 && inj_action_list.Count != 0 && inj_action_list[0].StepClass != TestStepEnum.KaiKongGel) { var pier_back = MoveTo.create(piercerDevice, 3000, -1, 0, -1); pier_back.runAction(); } } }