Esempio n. 1
0
 //生成卡仓抓卡动作
 public ResInfoData GenerateTakeGelFromWare(ResInfoData take_seat, ref Sequence seque, string gelmask = "")
 {
     if (take_seat != null)
     {
         //卡仓位移动
         //抓手移动到卡仓机位
         var move_act = Spawn.create(
             MoveTo.create(Engine.getInstance().gelwareDevice, 3001, take_seat.StoreX, -1, -1),
             MoveTo.create(Engine.getInstance().handDevice, 3001, take_seat.X, take_seat.Y));
         seque.AddAction(move_act);
         //抓手抓卡
         var take_act = HandTakeCard.create(Engine.getInstance().handDevice, 3001, take_seat.Z, take_seat.ZLimit, take_seat.ZCatch, 0);
         seque.AddAction(take_act);
         //把测试卡放在卡仓Gel位中
         var geltem = take_seat.Values[take_seat.CountX, 0];
         take_seat.Values[take_seat.CountX, 0] = null;
         take_act.successfun = (ActionBase act) =>
         {
             ResManager.getInstance().handseat_resinfo = (ResInfoData)geltem;
             return(true);
         };
         take_act.destroyfun = (ActionBase act) =>
         {
             take_seat.Values[take_seat.CountX, 0] = geltem;
             return(true);
         };
     }
     else
     {
         ErrorSystem.WriteActError("卡仓无卡", true, false);
     }
     return(take_seat);
 }
Esempio n. 2
0
        public void ErrorCode(int tagerid, byte[] data)
        {
            string[] error_msg   = { "电机归零超时", "电机运动超时", "电机运动中停止" };
            int      error_index = data[7] % 3;
            int      moto_index  = handDevice.Hand.ZMotor.GetMotoIndex();

            if (error_index == 2 && moto_index == data[5])
            {
                //初始化电机
                var task = new Task(() =>
                {
                    stop();
                    var act_tem = InitXyz.create(handDevice, 30000, false, false, true);
                    act_tem.init();
                    long lasttime = getSystemMs();
                    while (true)
                    {
                        long dt = 100;
                        act_tem.run(dt);
                        Thread.Sleep(100);
                        if (act_tem.isfinish)
                        {
                            break;
                        }
                    }
                    start();
                });
                task.Start();
            }
            if (error_index != 2)
            {
                ErrorSystem.WriteActError(error_msg[error_index], true, false);
            }
        }
Esempio n. 3
0
        public int GetIntBlock(String CanAddress, int timeout, out bool is_timeout)
        {
            int ret = 0;

            if (CanAddress == null)
            {
                ErrorSystem.WriteActError("地址为空", true, false);
                is_timeout = true;
                return(ret);
            }
            String key       = CanAddress.ToUpper();
            int    timecount = 0;

            timeout    = timeout / 10;
            is_timeout = false;
            if (key.Length == 0)
            {
                return(ret);
            }
            while (!RegisterMap.ContainsKey(key))
            {
                Thread.Sleep(1);
                timecount++;
                if (timecount > timeout)
                {
                    last_error = "错误代码:" + CanAddress + " time:" + timeout * 10 + " src:" + GetStacktRace();
                    ErrorSystem.WriteCanError(last_error);
                    is_timeout = true;
                    return(0);
                }
            }
            ret = RegisterMap[key];
            return(ret);
        }
Esempio n. 4
0
 //生成在普通位抓卡
 public ResInfoData GenerateTakeGelFromNormal(ResInfoData take_seat, ref Sequence seque)
 {
     if (take_seat != null)
     {
         //抓手移动
         seque.AddAction(MoveTo.create(Engine.getInstance().handDevice, 3001, (int)take_seat.X, (int)(take_seat.Y), 0));
         //抓手抓卡
         var take_act = HandTakeCard.create(Engine.getInstance().handDevice, 3001, (int)take_seat.Z, (int)take_seat.ZLimit, (int)take_seat.ZCatch, 0);
         seque.AddAction(take_act);
         //把测试卡放在Gel位中
         var geltem = take_seat.Values[take_seat.CountX, 0];
         if (take_seat.Values != null)
         {
             take_seat.Values[take_seat.CountX, 0] = null;
         }
         take_act.successfun = (ActionBase act) =>
         {
             ResManager.getInstance().handseat_resinfo = (ResInfoData)geltem;
             return(true);
         };
         take_act.destroyfun = (ActionBase act) =>
         {
             take_seat.Values[take_seat.CountX, 0] = geltem;
             return(true);
         };
     }
     else
     {
         ErrorSystem.WriteActError("普通位找不到卡", true, false);
     }
     return(take_seat);
 }
Esempio n. 5
0
        public bool GetRealPump(AbstractCanDevice node_tem, Enterclose[] injects, ref int[] pump)
        {
            bool ret = true;

            if (node_tem is InjectorDevice)
            {
                var device = (InjectorDevice)node_tem;
                foreach (var inject in injects)
                {
                    ret = ret && device.CanComm.ReadRegister(inject.PumpMotor.RealDistance.Addr);
                    if (inject.PumpMotor.Factor.SetValue <= 0)
                    {
                        ErrorSystem.WriteActError("加样通道:" + inject.Index + "校正因子不可为0", true, false, 9999);
                        return(false);
                    }
                    if (ret)
                    {
                        pump[inject.Index] = (int)device.CanComm.GetInt(inject.PumpMotor.RealDistance.Addr, 0);
                        pump[inject.Index] = Convert.ToInt32(pump[inject.Index] / Convert.ToDecimal(inject.PumpMotor.Factor.SetValue));
                    }
                    else
                    {
                        break;
                    }
                }
            }
            return(ret);
        }
Esempio n. 6
0
 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);
         }
     }
 }
Esempio n. 7
0
        //生成放卡在普通位
        public bool GeneratePutGelToNormal(T_Gel gel, ref Sequence seque, string code = "", int seatindex = -1)
        {
            var          resmanager = ResManager.getInstance();
            T_BJ_GelSeat gelselect  = (T_BJ_GelSeat)resmanager.SearchGelCard(typeof(T_BJ_GelSeat).Name, gel, false, code, seatindex);

            if (gelselect != null)
            {
                //抓手移动
                seque.AddAction(MoveTo.create(300000, (int)gelselect.X, (int)(gelselect.Y + gelselect.Gap * seatindex), 0));
                //抓手放卡
                seque.AddAction(HandPutCard.create(500000, (int)gelselect.ZPut, 0));
                //把测试卡放在Gel位中
                gelselect.Values[seatindex, 0] = gel;
                seque.destroyfun = (ActionBase act) =>
                {
                    gelselect.Values[seatindex, 0] = null;
                    return(true);
                };
            }
            else
            {
                ErrorSystem.WriteActError(gelselect.Code + "位已满");
            }
            return(gelselect != null);
        }
Esempio n. 8
0
        //生成离心机抓卡动作
        public bool GenerateTakeGelFromCent(T_Gel gel, ref Sequence seque, string code = "", int seatindex = -1)
        {
            var             resmanager = ResManager.getInstance();
            T_BJ_Centrifuge gelselect  = (T_BJ_Centrifuge)resmanager.SearchGelCard(typeof(T_BJ_Centrifuge).Name, gel, true, code, seatindex);
            var             centrifuge = cenMrg.GetCentrifugeByCode(code);

            if (centrifuge == null)
            {
                centrifuge = cenMrg.GetFreeCentrifuge();
            }
            if (gelselect != null)
            {
                //离心机位移动
                //抓手移动到离心机位
                var move_act = Spawn.create(
                    MoveTo.create(centrifuge, 30000, -1, -1, (int)(seatindex * (double)gelselect.Gel0), 5),
                    MoveTo.create(handDevice, 30000, (int)gelselect.HandX, (int)gelselect.HandY));
                seque.AddAction(move_act);
                //抓手抓卡
                seque.AddAction(HandTakeCard.create(700000, (int)gelselect.HandZ, (int)gelselect.ZLimit, (int)gelselect.ZCatch, 0));
                //把测试卡放在离心Gel位中
                gelselect.Values[seatindex, 0] = null;
                seque.destroyfun = (ActionBase act) =>
                {
                    gelselect.Values[seatindex, 0] = gel;
                    return(true);
                };
            }
            else
            {
                ErrorSystem.WriteActError("离心机位打不到卡");
            }
            return(gelselect != null);
        }
Esempio n. 9
0
        public static int g_batch_id = 0;     //实验批次号
        protected override void OnViewLoaded()
        {
            foreach (var sample in Samples)
            {
                sample.TestItem1 = false;
                sample.TestItem2 = false;
                sample.TestItem3 = false;
                sample.TestItem4 = false;
                sample.TestItem5 = false;
                sample.TestItem6 = false;
                sample.TestItem7 = false;
                sample.TestItem8 = false;
                sample.TestItem9 = false;
            }
            op.CanComm.SetListenFun(op.OP.SampleRackCoils[0].Addr, CanFunCodeEnum.UPLOAD_REGISTER, RackChange);
            var scaner_info = ResManager.getInstance().GetScaner("0");

            if (scaner_info == null)
            {
                ErrorSystem.WriteActError("扫码器无法识别!", false);
            }
            if (scaner_info != null)
            {
                scaner      = IoC.Get <AbstractScaner>(scaner_info.ScanerType);
                scaner_port = scaner_info.Port;
            }
            visible = true;
            for (int i = 0; i < 24; i++)
            {
                template_code_list.Add(new ScanSampleIndexData(i, string.Format("{0:D2}", i + 1), "*", string.Format("{0:D2}", i + 2)));
            }
            if (Samples.Count == 0)
            {
                for (int i = 0; i < 24; i++)
                {
                    for (int j = 0; j < 6; j++)
                    {
                        var sample_code = "";
                        var resinfo     = ResManager.getInstance().SearchGelCard("T_BJ_SampleRack", "", "", i, j);
                        resinfo.SetCode(sample_code);
                        resinfo.Values[resinfo.CountX, resinfo.CountY] = resinfo;
                        resinfo.sampleinfo = new SampleInfo(sample_code, (byte)i, (byte)j);
                        Samples.Add(resinfo.sampleinfo);
                    }
                }
            }
            var samples_sort = Samples.ToList();

            samples_sort.Sort((a, b) =>
            {
                return((a.RackIndex * 100 + a.Index) - (b.RackIndex * 100 + b.Index));
            });
            Samples.Clear();
            foreach (var item in samples_sort)
            {
                Samples.Add(item);
            }

            base.OnViewLoaded();
        }
Esempio n. 10
0
        public override void run(double dt)
        {
            bool resultz = true;

            sumdt += dt;
            if (sumdt >= time || istimeout)
            {
                istimeout = true;
                isfinish  = true;
                return;
            }
            var device = new ActionDevice(node);
            var hand   = (MachineHandDevice)node;

            switch (step)
            {
            case 0:
                if (hand.CheckGel() == false)
                {
                    ErrorSystem.WriteActError("抓手无卡!", true);
                    istimeout = true;
                    isfinish  = true;
                    return;
                }
                else
                {
                    step++;
                }
                break;

            case 1:
                act_movez.run(dt);
                if (act_movez.getIsFinish())
                {
                    step++;
                }
                break;

            case 2:
                resultz = hand.SwitchHand(true);
                if (resultz)
                {
                    step++;
                }
                break;

            case 3:
                act_movezb.run(dt);
                if (act_movezb.getIsFinish())
                {
                    step++;
                }
                break;

            case 4:
                isfinish = true;
                break;
            }
        }
Esempio n. 11
0
        public void Ok()
        {
            var resmanager = ResManager.getInstance();
            var actiongen  = ActionGenerater.getInstance();
            var GelList    = (this.View as ScanSampleView).GelList;
            List <T_GelStep> gelstep_list = new List <T_GelStep>();

            foreach (var sample in Samples)
            {
                var test_list = sample.GetTestList();
                var gel_list  = new List <ResInfoData>();
                foreach (var test in test_list)
                {
                    var ware_seat = resmanager.GetResByCode(GelList[test].GelMask + "*", "T_BJ_GelWarehouse", "", "", lastinfo_list);
                    if (ware_seat == null)
                    {
                        ErrorSystem.WriteActError("无卡", true, false);
                        return;
                    }
                    ware_seat.sampleinfo = sample;
                    lastinfo_list.Add(ware_seat);
                    gel_list.Add(ware_seat);
                }
                foreach (var ware_seat in gel_list)
                {
                    var gelend = new T_GelStep();
                    gelstep_list     = gelstep_list.Concat(actiongen.ResolveActions(ware_seat)).ToList();
                    gelend.StepClass = TestStepEnum.GELEND;
                    gelstep_list.Add(gelend);
                }
            }
            //破孔位还有多小个
            int paperseat_count = 9;

            for (int i = 0; i < gelstep_list.Count; i++)
            {
                if (gelstep_list[i].StepClass == TestStepEnum.LoadGel && paperseat_count > 0)
                {
                    gelstep_list[i].StepIndex = 10000 - i;
                    paperseat_count--;
                }
                else
                {
                    gelstep_list[i].StepIndex = 1000 - i;
                }
            }
            gelstep_list.Sort((T_GelStep a, T_GelStep b) => { return(a.StepIndex < b.StepIndex ? 1 : -1); });
            var action_tree = actiongen.DivideIntoGroups(gelstep_list, 1);

            InjLogicManager.getInstance().AddAction(action_tree);

            this.RequestClose();
        }
Esempio n. 12
0
        //生成离心机放卡动作
        public bool GeneratePutGelToCent(string cen_code, ResInfoData put_seat, ResInfoData put_gel, ref Sequence seque)
        {
            var centrifuge = Engine.getInstance().cenMrg.GetCentrifugeByCode(cen_code);

            if (centrifuge == null)
            {
                centrifuge = Engine.getInstance().cenMrg.GetFreeCentrifuge();
            }
            if (put_seat != null)
            {
                //打开离心机门
                var opendoor_act = HandOpenCloseDoor.create(Engine.getInstance().handDevice, 5000, cen_code, true);
                seque.AddAction(opendoor_act);
                //离心机位移动
                //抓手移动到离心机位
                var move_act = Spawn.create(
                    MoveTo.create(centrifuge, 30001, -1, -1, put_seat.CenGelP[put_seat.CountX]),
                    MoveTo.create(Engine.getInstance().handDevice, 3001, (int)put_seat.X, (int)put_seat.CenHandYP[put_seat.CountX]));
                seque.AddAction(move_act);
                //抓手放卡
                var put_act = HandPutCard.create(Engine.getInstance().handDevice, 3001, (int)put_seat.ZPut);
                seque.AddAction(put_act);
                //把测试卡放在离心Gel位中
                put_seat.Values[put_seat.CountX, 0] = put_gel;
                if (put_gel != null)
                {
                    put_gel.PutOk = false;
                }
                put_act.successfun = (ActionBase act) =>
                {
                    if (put_gel != null)
                    {
                        put_gel.PutOk = true;
                        put_gel.SetSeatInfo(put_seat);
                    }
                    ResManager.getInstance().handseat_resinfo = null;
                    return(true);
                };
                put_act.destroyfun = (ActionBase act) =>
                {
                    put_seat.Values[put_seat.CountX, 0] = null;
                    ResManager.getInstance().handseat_resinfo = null;
                    return(true);
                };
            }
            else
            {
                ErrorSystem.WriteActError("离心机位已满", true, false);
            }
            return(put_seat != null);
        }
Esempio n. 13
0
        //生成离心机放卡动作
        public bool GeneratePutGelToCent(T_Gel gel, ref Sequence seque, string code = "", int seatindex = -1)
        {
            int[] gelseatindex = { 0, 6, 1, 7, 2, 8, 3, 9, 4, 10, 5, 11 };
            var   centrifuge   = cenMrg.GetCentrifugeByCode(code);

            if (centrifuge == null)
            {
                centrifuge = cenMrg.GetFreeCentrifuge();
            }
            var  gelseat        = centrifuge.GetGelSeatsInfo();
            var  gelseatsetting = centrifuge.GetGelSeatSetting();
            bool isfind         = seatindex != -1;

            if (seatindex == -1)
            {
                for (int i = 0; i < 12; i++)
                {
                    int index = gelseatindex[i];
                    if (gelseat[index] == false)
                    {
                        seatindex = index;
                        isfind    = true;
                        break;
                    }
                }
            }
            if (isfind)
            {
                //离心机位移动
                //抓手移动到离心机位
                var move_act = Spawn.create(
                    MoveTo.create(centrifuge, 30000, -1, -1, (int)(seatindex * (double)gelseatsetting.Gel0), 5),
                    MoveTo.create(handDevice, 30000, (int)gelseatsetting.HandX, (int)gelseatsetting.HandY));
                seque.AddAction(move_act);
                //抓手放卡
                seque.AddAction(HandPutCard.create(handDevice, 30000, (int)gelseatsetting.ZPut));
                //把测试卡放在离心Gel位中
                gelseatsetting.Values[seatindex, 0] = gel;
                seque.destroyfun = (ActionBase act) =>
                {
                    gelseatsetting.Values[seatindex, 0] = null;
                    return(true);
                };
            }
            else
            {
                ErrorSystem.WriteActError("离心机位已满");
            }
            return(isfind);
        }
Esempio n. 14
0
        public void Ok()
        {
            var resmanager = ResManager.getInstance();
            var actiongen  = ActionGenerater.getInstance();
            var GelList    = (this.View as ScanSampleView).GelList;
            List <T_GelStep> gelstep_list = new List <T_GelStep>();
            bool             isRepeat     = Samples.Where(item => item.Barcode != "").GroupBy(i => i.Barcode).Any(g => g.Count() > 1);

            if (isRepeat)
            {
                ErrorSystem.WriteActError("样本条码有重复!", true, false);
            }
            else
            {
                var samples_list = Samples.Where(item => item.Barcode != "").ToList();
                foreach (var sample in samples_list)
                {
                    if (sample.Barcode != "")
                    {
                        var test_list = sample.GetTestList();
                        var gel_list  = new List <T_Gel>();
                        foreach (var test in test_list)
                        {
                            var gel = GelList[test].clone();
                            if (gel.IsCrossMatching)
                            {
                                //交叉配血
                                //寻找当前木样本架连续位
                                var sample_list = GetCrossMatchingSampleInfo(sample);
                                foreach (var sample_tem in sample_list)
                                {
                                    gel = GelList[test].clone();
                                    var exp_package = ExperimentPackage.Create(actiongen.ResolveActions(gel), gel.GelMask, sample.Barcode, sample_tem.Barcode, sample.GetLever(), gel.GelType, gel.GelRenFen, gel.AfterKKTime, gel.IsUsedGel, gel.ID, gel.IsCrossMatching, g_batch_id, is_double);
                                    ExperimentLogic.getInstance().AddPackage(exp_package);
                                }
                            }
                            else
                            {
                                var exp_package = ExperimentPackage.Create(actiongen.ResolveActions(gel), gel.GelMask, sample.Barcode, "", sample.GetLever(), gel.GelType, gel.GelRenFen, gel.AfterKKTime, gel.IsUsedGel, gel.ID, gel.IsCrossMatching, g_batch_id, is_double);
                                ExperimentLogic.getInstance().AddPackage(exp_package);
                            }
                        }
                    }
                }
                ExperimentLogic.getInstance().UpDataAction();
                this.RequestClose();
                g_batch_id++;
            }
        }
Esempio n. 15
0
        public void ClsCoilMap(String CanAddress)
        {
            if (CanAddress == null)
            {
                ErrorSystem.WriteActError("后台设置有误!", true, false, 9999);
                return;
            }
            String key = CanAddress.ToUpper();

            lock (BoolLock)
            {
                if (this.CoilMap.ContainsKey(key))
                {
                    CoilMap.Remove(key);
                }
            }
        }
Esempio n. 16
0
 //生成放卡在普通位
 public bool GeneratePutGelToNormal(ResInfoData put_seat, ResInfoData put_gel, ref Sequence seque)
 {
     if (put_seat != null)
     {
         //抓手移动
         seque.AddAction(MoveTo.create(Engine.getInstance().handDevice, 3001, (int)put_seat.X, (int)(put_seat.Y), 0));
         //抓手放卡
         var put_act = HandPutCard.create(Engine.getInstance().handDevice, 3001, (int)put_seat.ZPut, 0);
         seque.AddAction(put_act);
         //把测试卡放在Gel位中
         if (put_seat.Values != null)
         {
             put_seat.Values[put_seat.CountX, 0] = put_gel;
         }
         if (put_gel != null)
         {
             put_gel.PutOk = false;
         }
         put_act.successfun = (ActionBase act) =>
         {
             if (put_gel != null)
             {
                 put_gel.PutOk = true;
                 put_gel.SetSeatInfo(put_seat);
             }
             ResManager.getInstance().handseat_resinfo = null;
             return(true);
         };
         put_act.destroyfun = (ActionBase act) =>
         {
             if (put_seat.Values != null)
             {
                 put_seat.Values[put_seat.CountX, 0] = null;
             }
             ResManager.getInstance().handseat_resinfo = null;
             return(true);
         };
     }
     else
     {
         ErrorSystem.WriteActError("普通位已满", true, false);
     }
     return(put_seat != null);
 }
Esempio n. 17
0
        /// <summary>
        /// 初始化所有设备
        /// </summary>
        /// <returns></returns>
        public ActionBase InitAllDevice()
        {
            var devices = new ValueTuple <AbstractCanDevice, String>[] { (this, "样本扫码器载架初始化失败")
                                                                         , (IoC.Get <PiercerDevice>(), "打孔器初始化失败")
                                                                         , (IoC.Get <CentrifugeMrg>(), "离心管理器初始化失败")
                                                                         //,(IoC.Get<GelWarehouseDevice>(),"卡仓初始化失败")
                                                                         , (IoC.Get <CouveuseMixerDevice>(), "孵育或混匀初始化失败")
                                                                         //,(IoC.Get<MachineHandDevice>(),"机械手初始化失败")
                                                                         //,(IoC.Get<InjectorDevice>(),"加样器初始化失败")
            };
            var seq = Sequence.create();
            var spa = Spawn.create();

            spa.AddAction(InitXyz.create(this, 10000, true, false, false));
            foreach (var device in devices)
            {
                var act = device.Item1.InitAll();
                if (act != null)
                {
                    spa.AddAction(act);
                }
            }
            var seq_hand_ware_inj = Sequence.create();
            var act_inj           = IoC.Get <InjectorDevice>().InitAll();
            var act_hand          = IoC.Get <MachineHandDevice>().InitAll();
            var act_ware          = IoC.Get <GelWarehouseDevice>().InitAll();

            seq_hand_ware_inj.AddAction(act_inj);
            seq_hand_ware_inj.AddAction(act_hand);
            seq_hand_ware_inj.AddAction(act_ware);
            spa.AddAction(seq_hand_ware_inj);
            seq.AddAction(Sequence.create(spa, SkCallBackFun.create((ActionBase acttem) =>
            {
                if (acttem.istimeout == false)
                {
                    ErrorSystem.WriteActError("开机成功!", true, false);
                }
                return(true);
            })));
            CameraLight(false);
            LedGreen();
            return(seq);
        }
Esempio n. 18
0
        //生成离心机抓卡动作
        public ResInfoData GenerateTakeGelFromCent(ResInfoData take_seat, string cen_code, ref Sequence seque)
        {
            var centrifuge = Engine.getInstance().cenMrg.GetCentrifugeByCode(cen_code);

            if (centrifuge == null)
            {
                centrifuge = Engine.getInstance().cenMrg.GetFreeCentrifuge();
            }
            if (take_seat != null)
            {
                //打开离心机门
                var opendoor_act = HandOpenCloseDoor.create(Engine.getInstance().handDevice, 5000, cen_code, true);
                seque.AddAction(opendoor_act);
                //离心机位移动
                //抓手移动到离心机位
                var move_act = Spawn.create(
                    MoveTo.create(centrifuge, 30001, -1, -1, (int)take_seat.CenGelP[take_seat.CountX]),
                    MoveTo.create(Engine.getInstance().handDevice, 3001, (int)take_seat.X, (int)take_seat.CenHandYP[take_seat.CountX]));
                seque.AddAction(move_act);
                //抓手抓卡
                var take_act = HandTakeCard.create(Engine.getInstance().handDevice, 3001, (int)take_seat.Z, (int)take_seat.ZLimit, (int)take_seat.ZCatch, 0, centrifuge);
                seque.AddAction(take_act);
                //把测试卡放在离心Gel位中
                var geltem = take_seat.Values[take_seat.CountX, 0];
                take_seat.Values[take_seat.CountX, 0] = null;
                take_act.successfun = (ActionBase act) =>
                {
                    ResManager.getInstance().handseat_resinfo = (ResInfoData)geltem;
                    return(true);
                };
                take_act.destroyfun = (ActionBase act) =>
                {
                    take_seat.Values[take_seat.CountX, 0] = geltem;
                    return(true);
                };
            }
            else
            {
                ErrorSystem.WriteActError("离心机位找不到卡", true, false);
            }
            return(take_seat);
        }
Esempio n. 19
0
 //生成卡仓放卡动作
 public bool GeneratePutGelToWare(ResInfoData put_seat, ResInfoData put_gel, ref Sequence seque)
 {
     if (put_seat != null)
     {
         var move_act = Spawn.create(
             MoveTo.create(Engine.getInstance().gelwareDevice, 3001, (int)(put_seat.StoreX), -1, -1),
             MoveTo.create(Engine.getInstance().handDevice, 3001, (int)put_seat.X, (int)put_seat.Y));
         seque.AddAction(move_act);
         //抓手放卡
         var put_act = HandPutCard.create(Engine.getInstance().handDevice, 3001, (int)put_seat.ZPut);
         seque.AddAction(put_act);
         //把测试卡放在离心Gel位中
         put_seat.Values[put_seat.CountX, 0] = put_gel;
         if (put_gel != null)
         {
             put_gel.PutOk = false;
         }
         put_act.successfun = (ActionBase act) =>
         {
             if (put_gel != null)
             {
                 put_gel.PutOk = true;
                 put_gel.SetSeatInfo(put_seat);
             }
             ResManager.getInstance().handseat_resinfo = null;
             return(true);
         };
         put_act.destroyfun = (ActionBase act) =>
         {
             put_seat.Values[put_seat.CountX, 0] = null;
             ResManager.getInstance().handseat_resinfo = null;
             return(true);
         };
     }
     else
     {
         ErrorSystem.WriteActError("卡仓位已满", true, false);
     }
     return(put_seat != null);
 }
Esempio n. 20
0
 public void StopAll(int tagerid, byte[] data)
 {
     if (data[5] == 0xff)
     {
         var task = new Task(() =>
         {
             stop();
             handDevice.CanComm.StopMotor(handDevice.Hand.XMotor);
             handDevice.CanComm.StopMotor(handDevice.Hand.YMotor);
             handDevice.CanComm.StopMotor(handDevice.Hand.ZMotor);
             injectorDevice.CanComm.StopMotor(injectorDevice.Injector.XMotor);
             foreach (var ent in injectorDevice.Injector.Entercloses)
             {
                 injectorDevice.CanComm.StopMotor(ent.YMotor);
                 injectorDevice.CanComm.StopMotor(ent.ZMotor);
             }
             ActionManager.getInstance().removeAllActions();
             ExperimentLogic.getInstance().DelAllPackage();
             ErrorSystem.WriteActError("系统急停!请重新开机", true, false, 999999);
             start();
         });
         task.Start();
     }
 }
Esempio n. 21
0
        unsafe public override void Can_Rec_Tick()
        {
            UInt32 res = new UInt32();

            res = VCI_GetReceiveNum(DevType, DevIndex, CanIndex);
            if (res == 0)
            {
                return;
            }
            /////////////////////////////////////
            UInt32 con_maxlen = 100;
            IntPtr pt         = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(VCI_CAN_OBJ)) * (Int32)con_maxlen);

            res = VCI_Receive(DevType, DevIndex, CanIndex, pt, con_maxlen, 5);
            ////////////////////////////////////////////////////////
            String str = "";

            for (UInt32 i = 0; i < res; i++)
            {
                VCI_CAN_OBJ?reviceObj = null;
                try
                {
                    reviceObj = (VCI_CAN_OBJ)Marshal.PtrToStructure((IntPtr)(pt.ToInt64() + i * Marshal.SizeOf(typeof(VCI_CAN_OBJ))), typeof(VCI_CAN_OBJ));
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
                if (!reviceObj.HasValue)
                {
                    break;
                }
                var obj      = reviceObj.Value;
                var targetID = (byte)(obj.ID >> 3);
                var mask     = (byte)(obj.ID & 0b111);

                Console.Write("rec: 0x{0:x4} ", obj.ID);
                for (var j = 0; j < obj.DataLen; j++)
                {
                    Console.Write("0x{0:x2} ", obj.Data[j]);
                }
                TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0);
                Console.WriteLine("TimeStamp:" + Convert.ToInt64(ts.TotalSeconds).ToString());

                if (targetID != (byte)(ID & (0xFF << 3 | mask)))
                {
                    Console.WriteLine("ID不符,数据丢弃");
                    continue;
                }

                //Console.WriteLine("objlen=" + obj.DataLen);
                str  = "接收到数据: ";
                str += "  设备ID:0x" + Convert.ToString(targetID, 16);
                str += "  ID掩码:0x" + Convert.ToString(mask, 16);
                str += "  帧格式:";
                if (obj.RemoteFlag == 0)
                {
                    str += "数据帧 ";
                }
                else
                {
                    str += "远程帧 ";
                }
                if (obj.ExternFlag == 0)
                {
                    str += "标准帧 ";
                }
                else
                {
                    str += "扩展帧 ";
                }

                //////////////////////////////////////////
                if (obj.RemoteFlag == 0)
                {
                    str += "数据: ";
                    byte   len  = (byte)(Math.Min(obj.DataLen % 50, 8));
                    byte[] data = new byte[len];
                    for (byte j = 0; j < len; j++)
                    {
                        data[j] = obj.Data[j];
                        str    += " " + ByteUtil.ToHex(obj.Data[j]);
                    }
                    //bool is_mask = (data[0] & 0x07) == 0x07;
                    //data[0] = is_mask ? (byte)(data[0] >> 3) : data[0];
                    (String CanAddress, CanFunCodeEnum FunCode) = ParseCanData(data);
                    if (FunCode == CanFunCodeEnum.UPLOAD_COIL || FunCode == CanFunCodeEnum.UPLOAD_REGISTER || FunCode == CanFunCodeEnum.READ_COIL || FunCode == CanFunCodeEnum.READ_REGISTER || FunCode == CanFunCodeEnum.WRITE_SINGLE_COIL || FunCode == CanFunCodeEnum.WRITE_SINGLE_REGISTER)
                    {
                        lock (RecSafeData.Lock)
                        {
                            bool is_pass = true;
                            if (FunCode == CanFunCodeEnum.WRITE_SINGLE_COIL || FunCode == CanFunCodeEnum.WRITE_SINGLE_REGISTER)
                            {
                                is_pass = data[3] == 0xb0 || data[4] == 0xff || data[5] == 0xff;
                            }
                            if (is_pass == false)
                            {
                                ErrorSystem.WriteActError("通讯返回错误!", false);
                            }
                            if (is_pass)
                            {
                                string key_str = ByteUtil.ToHex(targetID) + ByteUtil.ToHex(data[0]) + ByteUtil.ToHex(data[1]) + ByteUtil.ToHex(data[2]) + ByteUtil.ToHex(data[3]);
                                if (!Rec_SafeData.ContainsKey(key_str))
                                {
                                    Rec_SafeData.Add(key_str, true);
                                }
                                else
                                {
                                    Rec_SafeData[key_str] = true;
                                }
                                if (ListenFunList.ContainsKey(key_str))
                                {
                                    var task = Task.Run(() =>
                                    {
                                        ListenFunList[key_str](targetID, data);
                                    });
                                }
                            }
                        }
                    }
                    switch (FunCode)
                    {
                    case CanFunCodeEnum.READ_COIL:
                    {
                        byte   length = 1;
                        String canId  = CanAddress.Split('-')[0];
                        UInt16 addr   = ByteUtil.BytesToUInt16(data[2], data[3]);
                        for (byte k = 0; k < length; k++)
                        {
                            byte   curData = data[k / 8 + 4];
                            String key     = canId + "-" + Convert.ToString(addr + k, 16).PadLeft(4, '0').ToUpper();
                            //var val = ((0x01 << (k % 8)) & curData) == 0x01;
                            var val = data[4] == 0xff;
                            SetBool(key, val);
                        }
                        break;
                    }

                    case CanFunCodeEnum.UPLOAD_COIL:
                    {
                        byte   length = data[4];
                        String canId  = CanAddress.Split('-')[0];
                        UInt16 addr   = ByteUtil.BytesToUInt16(data[2], data[3]);
                        for (byte k = 0; k < length; k++)
                        {
                            byte   curData = data[k / 8 + 5];
                            String key     = canId + "-" + Convert.ToString(addr + k, 16).PadLeft(4, '0').ToUpper();
                            var    val     = ((0x01 << (k % 8)) & curData) == 0x01;
                            SetBool(key, val);
                        }
                        break;
                    }

                    case CanFunCodeEnum.READ_REGISTER:
                    case CanFunCodeEnum.UPLOAD_REGISTER:
                    {
                        var val = ByteUtil.BytesToInt(data[4], data[5], data[6], data[7]);
                        SetInt(CanAddress, val);
                        break;
                    }

                    case CanFunCodeEnum.WRITE_MULTI_COIL:
                    {
                        break;
                    }

                    case CanFunCodeEnum.WRITE_SINGLE_COIL:
                    {
                        break;
                    }

                    case CanFunCodeEnum.WRITE_SINGLE_REGISTER:
                    {
                        break;
                    }
                    }
                }
                //Console.WriteLine(str);
            }
            Marshal.FreeHGlobal(pt);
        }
Esempio n. 22
0
        public unsafe override bool Send(byte targetId, byte[] data, byte mask, bool is_wait)
        {
            string sendmsg    = "";
            bool   is_send_ok = false;

            lock (Send_Lock)
            {
                Thread.Sleep(2);
                VCI_CAN_OBJ sendobj = new VCI_CAN_OBJ();
                //sendobj.Init();
                string adressstr = string.Format("{0:D2}-{1:x}{2:x}", targetId, data[2], data[3]);
                ClsCoilMap(adressstr);

                sendobj.SendType   = 0x00; //02 自发自收 //0x00;//正常发送
                sendobj.RemoteFlag = 0x00; //数据帧
                sendobj.ExternFlag = 0x00; //标准帧
                targetId           = (byte)((0xFF << 3 | mask) & targetId);
                var canid = targetId << 3 | (mask & 0b111);
                sendobj.ID = System.Convert.ToUInt32(canid);
                int len = data.Length;
                sendobj.DataLen = System.Convert.ToByte(len);

                sendmsg = string.Format("send:0x{0:x4} ", canid);
                for (var j = 0; j < Math.Min(len, 8); j++)
                {
                    sendobj.Data[j] = data[j];
                    sendmsg        += string.Format("0x{0:x2} ", data[j]);
                }
                TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0);
                sendmsg += "TimeStamp:" + Convert.ToInt64(ts.TotalSeconds).ToString();
                //安全重发
                (String CanAddress, CanFunCodeEnum FunCode) = ParseCanData(data);
                string key_str = ByteUtil.ToHex(data[0]) + ByteUtil.ToHex(targetId) + ByteUtil.ToHex(data[1]) + ByteUtil.ToHex(data[2]) + ByteUtil.ToHex(data[3]);
                lock (RecSafeData.Lock)
                {
                    if (!Rec_SafeData.ContainsKey(key_str))
                    {
                        Rec_SafeData.Add(key_str, false);
                    }
                    else
                    {
                        Rec_SafeData[key_str] = false;
                    }
                }
                bool is_find = is_wait ? false : true;
                for (int i = 0; i < 5; i++)
                {
                    Console.WriteLine(sendmsg);
                    is_send_ok = VCI_Transmit(DevType, DevIndex, CanIndex, ref sendobj, 1) != 0;

                    if (!is_send_ok)
                    {
                        continue;
                    }
                    if (is_wait)
                    {
                        for (int wait_count = 0; wait_count < 200; wait_count++)
                        {
                            lock (RecSafeData.Lock)
                            {
                                if (Rec_SafeData[key_str])
                                {
                                    Rec_SafeData[key_str] = false;
                                    is_find = true;
                                    break;
                                }
                            }
                            if (is_find)
                            {
                                break;
                            }
                            Thread.Sleep(1);
                        }
                    }
                    if (is_find)
                    {
                        break;
                    }
                    Thread.Sleep(100);
                }
                is_send_ok = is_find;
            }
            if (is_send_ok == false)
            {
                if (ErrorSystem.WriteActError("板号" + targetId + ":通讯错误!\n错误代码:\n" + sendmsg.Replace("send:", ""), true, true, 20) == false)
                {
                    lock (ActionManager.lockObj)
                    {
                        var action_manager   = ActionManager.getInstance();
                        var experiment_logic = ExperimentLogic.getInstance();
                        action_manager.removeAllActions();
                        experiment_logic.DelAllPackage();
                    }
                }
            }
            return(is_send_ok);
        }
Esempio n. 23
0
        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);
        }
Esempio n. 24
0
        public override void run(double dt)
        {
            bool resulty = true;

            if (CountTime(dt))
            {
                return;
            }
            var device        = new ActionDevice(node);
            var inject_device = (InjectorDevice)node;

            switch (step)
            {
            case 0:
                //容量检测
                bool is_ok = true;
                int  index = 0;
                foreach (var inject in injects)
                {
                    bool is_timeout = false;
                    inject_device.CanComm.ReadRegister(inject.PumpMotor.RealDistance.Addr);
                    int curz = inject_device.CanComm.GetIntBlock(inject.PumpMotor.RealDistance.Addr, 1000, out is_timeout);
                    movez[inject.Index] = curz + absorbs[inject.Index];
                    bool is_enough = is_timeout == false && movez[inject.Index] <= (int)inject.PumpMotor.Maximum.SetValue && movez[inject.Index] >= 0;
                    if (is_enough == false || is_timeout)
                    {
                        index = inject.Index;
                        is_ok = false;
                        break;
                    }
                }
                if (is_ok)
                {
                    step++;
                }
                else
                {
                    bool ret = ErrorSystem.WriteActError("液泵:" + index + "容量不足!");
                    if (ret == false)
                    {
                        istimeout = true;
                        errmsg    = "液泵:" + index + "容量不足!";
                        return;
                    }
                }
                if (injects.Count() == 0)
                {
                    bool ret = ErrorSystem.WriteActError("没有可用加样器");
                    if (ret == false)
                    {
                        istimeout = true;
                        errmsg    = "没有可用加样器";
                        return;
                    }
                }
                break;

            case 1:
                resulty = device.MovePump(injects, speed, movez);
                if (resulty)
                {
                    step++;
                }
                break;

            case 2:
                isfinish = device.DonePump(injects);
                break;
            }
        }
Esempio n. 25
0
        //无速度手动限制
        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);
        }
Esempio n. 26
0
 public static void Log(string msgtem)
 {
     engineinstance.msgdata.Add(msgtem);
     ErrorSystem.WriteActError(msgtem, true, false);
     //engineinstance.msgdata.Add(new MsgItem() { msg = msgtem });
 }
Esempio n. 27
0
        public override void run(double dt)
        {
            bool resultz = true;

            sumdt += dt;
            if (sumdt >= time || istimeout)
            {
                istimeout = true;
                isfinish  = true;
                return;
            }
            var device = new ActionDevice(node);
            var hand   = (MachineHandDevice)node;

            switch (step)
            {
            case 0:
                if (hand.CheckGel() == false)
                {
                    ErrorSystem.WriteActError("抓手无卡!", true);
                    istimeout = true;
                    isfinish  = true;
                    return;
                }
                else
                {
                    if (hand.CanComm.SetRegister(hand.Hand.ZMotor.Speed.Addr, hand.Hand.ZMotor.Speed.SetValue))
                    {
                        step++;
                    }
                }
                break;

            case 1:
                resultz = device.MoveZ((int)z);
                if (resultz)
                {
                    step++;
                }
                break;

            case 2:
                if (device.DoneZ())
                {
                    step++;
                }
                break;

            case 3:
                resultz = hand.SwitchHand(true);
                if (resultz)
                {
                    step++;
                }
                break;

            case 4:
                resultz = device.MoveZ((int)zb);
                if (resultz)
                {
                    step++;
                }
                break;

            case 5:
                isfinish = device.DoneZ();
                break;
            }
        }
Esempio n. 28
0
        public override void run(double dt)
        {
            bool resultz = true;

            sumdt += dt;
            if (sumdt >= time || istimeout)
            {
                istimeout = true;
                isfinish  = true;
                return;
            }
            var device = new ActionDevice(node);
            var hand   = (MachineHandDevice)node;

            switch (step)
            {
            case 0:
                if (hand.CheckGel() == true)
                {
                    ErrorSystem.WriteActError("抓手有卡!", true);
                    istimeout = true;
                    isfinish  = true;
                    return;
                }
                else
                {
                    if (hand.CanComm.SetRegister(hand.Hand.ZMotor.Speed.Addr, hand.Hand.ZMotor.Speed.SetValue))
                    {
                        step++;
                    }
                }
                break;

            case 1:
                resultz = hand.Hand.IsOpen || (hand.Hand.IsOpen == false && hand.SwitchHand(true));
                if (resultz)
                {
                    step++;
                }
                break;

            case 2:
                resultz = device.MoveZ((int)z, true);
                if (resultz)
                {
                    step++;
                }
                break;

            case 3:
                if (device.DoneZ())
                {
                    step++;
                }
                break;

            case 4:
                resultz = device.MoveZ((int)zl, false);
                if (resultz)
                {
                    step++;
                }
                break;

            case 5:
                if (sumdt - lasttime > 50)
                {
                    lasttime = sumdt;
                    if (hand.CheckGel() == true)
                    {
                        resultz = hand.CanComm.SetCoilOff(hand.Hand.ZMotor.StartCoil.Addr);
                        if (resultz)
                        {
                            step++;
                        }
                    }
                }
                break;

            case 6:
                bool is_timeout = false;
                hand.CanComm.ReadRegister(hand.Hand.ZMotor.RealDistance.Addr);
                curz = hand.CanComm.GetIntBlock(hand.Hand.ZMotor.RealDistance.Addr, 1000, out is_timeout) + (int)zc;
                if (is_timeout)
                {
                    ErrorSystem.WriteActError("抓手超时", true);
                    istimeout = true;
                    isfinish  = true;
                    return;
                }
                else
                {
                    step++;
                }
                break;

            case 7:
                resultz = device.MoveZ((int)curz, true);
                if (resultz)
                {
                    step++;
                }
                break;

            case 8:
                resultz = hand.SwitchHand(false);
                if (resultz)
                {
                    step++;
                }
                break;

            case 9:
                resultz = device.MoveZ((int)zb, true);
                if (resultz)
                {
                    step++;
                }
                break;

            case 10:
                isfinish = device.DoneZ();
                break;
            }
        }
Esempio n. 29
0
        public override void run(double dt)
        {
            bool resultz = true;

            sumdt += dt;
            if (sumdt >= time || istimeout)
            {
                istimeout = true;
                isfinish  = true;
                return;
            }
            var device = new ActionDevice(node);
            var hand   = (MachineHandDevice)node;

            switch (step)
            {
            case 0:
                if (hand.CheckGel() == true)
                {
                    ErrorSystem.WriteActError("抓手有卡!", true);
                    istimeout = true;
                    isfinish  = true;
                    return;
                }
                else
                {
                    step++;
                }
                break;

            case 1:
                resultz = hand.Hand.IsOpen || (hand.Hand.IsOpen == false && hand.SwitchHand(true));
                if (resultz)
                {
                    step++;
                }
                break;

            case 2:
                act_movez.run(dt);
                if (act_movez.getIsFinish())
                {
                    step++;
                }
                break;

            case 3:
                act_movezl.run(dt);
                if (sumdt - lasttime > 50)
                {
                    lasttime = sumdt;
                    if (hand.CheckGel() == true)
                    {
                        resultz = hand.CanComm.SetCoilOff(hand.Hand.ZMotor.StartCoil.Addr);
                        if (resultz)
                        {
                            step++;
                        }
                    }
                }
                if (act_movezl.getIsFinish())
                {
                    ErrorSystem.WriteActError("抓手抓不到卡!", true);
                    istimeout = true;
                    isfinish  = true;
                    return;
                }
                break;

            case 4:
                bool is_timeout = false;
                hand.CanComm.ReadRegister(hand.Hand.ZMotor.RealDistance.Addr);
                curz = hand.CanComm.GetIntBlock(hand.Hand.ZMotor.RealDistance.Addr, 1000, out is_timeout) + (int)zc;
                if (is_timeout)
                {
                    ErrorSystem.WriteActError("抓手超时", true);
                    istimeout = true;
                    isfinish  = true;
                    return;
                }
                else
                {
                    act_movecurz = MoveTo.create(node, time, -1, -1, curz);
                    act_movecurz.init();
                    step++;
                }
                break;

            case 5:
                act_movecurz.run(dt);
                if (act_movecurz.getIsFinish())
                {
                    step++;
                }
                break;

            case 6:
                resultz = hand.SwitchHand(false);
                if (resultz)
                {
                    step++;
                }
                break;

            case 7:
                act_movezb.run(dt);
                if (act_movezb.getIsFinish())
                {
                    step++;
                }
                break;

            case 8:
                isfinish = true;
                break;
            }
        }