using BPA.Message;
using BPA.Message.Enum;
using BPASmartClient.Device;
using BPASmartClient.EventBus;
using BPASmartClient.Helper;
using BPASmartClient.Message;
using BPASmartClient.Model;
using BPASmartClient.Model.PLC;
using BPA.Models;
using static BPASmartClient.EventBus.EventBus;
using BPASmartClient.Model.小炒机;
using BPASmartClient.MorkF.Model;

namespace BPASmartClient.MorkF
{
    public class Control_MorkF : BaseDevice
    {
        public override DeviceClientType DeviceType => DeviceClientType.MORKCS;
        public AutoResetEvent minorReset = new AutoResetEvent(false);
        public AutoResetEvent mainReset = new AutoResetEvent(false);
        GVL_MorkF morkF = new GVL_MorkF();//全局对象声明
        public StirFryBom stirFryBom = new StirFryBom();//创建获取流程的对象
        List<StirFryGoods> stirFryGoods = new List<StirFryGoods>();//创建商品对象
        List<int> resultorder = new List<int>();//调试变量
        /// <summary>
        /// 入口
        /// </summary>
        public override void DoMain()
        {
            CommandRegist();//调试
            ServerInit();
            DataParse();//数据解析
            DeviceProcessLogShow("MORKF 设备初始化完成");
        }
        #region 调试代码
        public void CommandRegist()
        {
            ActionManage.GetInstance.Register(PLCInite, "InitCommand");
            ActionManage.GetInstance.Register(InitialData, "SimultaorOrder");
            ActionManage.GetInstance.Register(MaterialOne, "MaterialOne");
            ActionManage.GetInstance.Register(MaterialTwo, "MaterialTwo");
            ActionManage.GetInstance.Register(MaterialThree, "MaterialThree");
            ActionManage.GetInstance.Register(MaterialFour, "MaterialFour");
            ActionManage.GetInstance.Register(MaterialFive, "MaterialFive");
            ActionManage.GetInstance.Register(ManualOpenExhaust, "OpenExhaust");
            ActionManage.GetInstance.Register(CloseExhaust, "CloaseExhaust");
            ActionManage.GetInstance.Register(StartQX, "StartQXOne");
            ActionManage.GetInstance.Register(StartQX, "StartQXTwo");

            ActionManage.GetInstance.Register(ShreddCabbage, "ShreddCabbage");
            ActionManage.GetInstance.Register(FryPork, "FryPork");
            ActionManage.GetInstance.Register(XingBaoGu, "XingBaoGu");

            ActionManage.GetInstance.Register(TakePot, "TakePot");
            ActionManage.GetInstance.Register(TakePotReset, "TakePotReset");
            ActionManage.GetInstance.Register(TakeMaterial, "TakeMaterial");
            ActionManage.GetInstance.Register(ManualOutMeal, "OutMeal");

            ActionManage.GetInstance.Register<Action>(AddOil, "AddOil");
            ActionManage.GetInstance.Register(TakeOff, "TakeOff");
            ActionManage.GetInstance.Register(OneBlock, "OneBlock");
            ActionManage.GetInstance.Register(TwoBlock, "TwoBlock");
            ActionManage.GetInstance.Register(ThreeBlock, "ThreeBlock");
            ActionManage.GetInstance.Register(OverTurnOff, "OverTurnOff");
            ActionManage.GetInstance.Register(OverOneBlock, "OverOneBlock");
            ActionManage.GetInstance.Register(OverTwoBlock, "OverTwoBlock");
            ActionManage.GetInstance.Register(OverThreeBlock, "OverThreeBlock");
            ActionManage.GetInstance.Register(OverGoOn, "OverGoOn");
            ActionManage.GetInstance.Register(OverGoDown, "OverGoDown");
            ActionManage.GetInstance.Register(AutoModel, "AutoModel");
            ActionManage.GetInstance.Register(ManualModel, "ManualModel");

            ActionManage.GetInstance.Register<Action>(AddOil, "SecAddOil");
            ActionManage.GetInstance.Register(TakeOff, "SecTakeOff");
            ActionManage.GetInstance.Register(OneBlock, "SecOneBlock");
            ActionManage.GetInstance.Register(TwoBlock, "SecTwoBlock");
            ActionManage.GetInstance.Register(ThreeBlock, "SecThreeBlock");
            ActionManage.GetInstance.Register(OverTurnOff, "SecOverTurnOff");
            ActionManage.GetInstance.Register(OverOneBlock, "SecOverOneBlock");
            ActionManage.GetInstance.Register(OverTwoBlock, "SecOverTwoBlock");
            ActionManage.GetInstance.Register(OverThreeBlock, "SecOverThreeBlock");
            ActionManage.GetInstance.Register(OverGoOn, "SecOverGoOn");
            ActionManage.GetInstance.Register(OverGoDown, "SecOverGoDown");
            ActionManage.GetInstance.Register(AutoModel, "SecAutoModel");
            ActionManage.GetInstance.Register(ManualModel, "SecManualModel");
        }
        /// <summary>
        /// 手撕包菜流程
        /// </summary>
        public void ShreddCabbage()
        {
            if (stirFryBom.StirFryActions.Count > 0)
            {
                stirFryBom.StirFryActions.Clear();
            }
            //流程
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T1, RobotActions = new List<StirFryRobotAction>() { StirFryRobotAction.清洗槽取锅 } });
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T2, PotActions = new List<StirFryPotAction>() { StirFryPotAction.大火持续 }, During = 5 });
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T3, RobotActions = new List<StirFryRobotAction>() { StirFryRobotAction.取A料 }, PotActions = new List<StirFryPotAction>() { StirFryPotAction.加油, StirFryPotAction.搅拌臂下位, StirFryPotAction.低速旋转 }, During = 6 });
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T4, PotActions = new List<StirFryPotAction>() { StirFryPotAction.停止旋转, StirFryPotAction.停止火力, StirFryPotAction.搅拌臂上位 } });//加A料
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T5, RobotActions = new List<StirFryRobotAction>() { StirFryRobotAction.取B料 }, PotActions = new List<StirFryPotAction>() { StirFryPotAction.中火持续, StirFryPotAction.搅拌臂下位, StirFryPotAction.快速旋转 }, During = 6 });
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T6, PotActions = new List<StirFryPotAction>() { StirFryPotAction.停止火力, StirFryPotAction.停止旋转, StirFryPotAction.搅拌臂上位 } });//加B料

            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T7, RobotActions = new List<StirFryRobotAction>() { StirFryRobotAction.取C料 }, PotActions = new List<StirFryPotAction>() { StirFryPotAction.中火持续, StirFryPotAction.搅拌臂下位, StirFryPotAction.快速旋转 }, During = 9 });

            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T8, PotActions = new List<StirFryPotAction>() { StirFryPotAction.停止火力, StirFryPotAction.停止旋转, StirFryPotAction.搅拌臂上位 } });//加C料
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T9, PotActions = new List<StirFryPotAction>() { StirFryPotAction.中火持续, StirFryPotAction.搅拌臂下位, StirFryPotAction.快速旋转 }, During = 30 });
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T10, PotActions = new List<StirFryPotAction>() { StirFryPotAction.停止火力, StirFryPotAction.停止旋转, StirFryPotAction.搅拌臂上位 } });
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T11, RobotActions = new List<StirFryRobotAction>() { StirFryRobotAction.灶取锅 } });
        }
        /// <summary>
        /// 盐煎肉流程
        /// </summary>
        public void FryPork()
        {
            if (stirFryBom.StirFryActions.Count > 0)
            {
                stirFryBom.StirFryActions.Clear();
            }
            //流程
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T1, RobotActions = new List<StirFryRobotAction>() { StirFryRobotAction.清洗槽取锅 } });
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T2, PotActions = new List<StirFryPotAction>() { StirFryPotAction.停止火力, StirFryPotAction.搅拌臂下位, StirFryPotAction.低速旋转 }, During = 15 });
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T3, PotActions = new List<StirFryPotAction>() { StirFryPotAction.加油, StirFryPotAction.停止火力 }, During = 19 });
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T4, PotActions = new List<StirFryPotAction>() { StirFryPotAction.停止旋转, StirFryPotAction.搅拌臂上位 } });

            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T5, RobotActions = new List<StirFryRobotAction>() { StirFryRobotAction.加入A料 } });

            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T6, PotActions = new List<StirFryPotAction>() { StirFryPotAction.搅拌臂下位, StirFryPotAction.快速旋转 }, During = 20 });
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T7, PotActions = new List<StirFryPotAction>() { StirFryPotAction.停止火力 }, During = 35 });
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T8, PotActions = new List<StirFryPotAction>() { StirFryPotAction.停止旋转, StirFryPotAction.搅拌臂上位, } });
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T9, RobotActions = new List<StirFryRobotAction>() { StirFryRobotAction.加入B料 } });
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T10, PotActions = new List<StirFryPotAction>() { StirFryPotAction.搅拌臂下位, StirFryPotAction.快速旋转 }, During = 22 });
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T11, PotActions = new List<StirFryPotAction>() { StirFryPotAction.停止旋转, StirFryPotAction.搅拌臂上位 } });
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T12, RobotActions = new List<StirFryRobotAction>() { StirFryRobotAction.加入C料 } });
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T13, PotActions = new List<StirFryPotAction>() { StirFryPotAction.搅拌臂下位, StirFryPotAction.快速旋转 }, During = 70 });
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T14, PotActions = new List<StirFryPotAction>() { StirFryPotAction.停止火力, StirFryPotAction.停止旋转, StirFryPotAction.搅拌臂上位 } });
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T15, RobotActions = new List<StirFryRobotAction>() { StirFryRobotAction.灶取锅 } });
        }
        /// <summary>
        /// 酱烧杏鲍菇流程
        /// </summary>
        public void XingBaoGu()
        {
            if (stirFryBom.StirFryActions.Count > 0)
            {
                stirFryBom.StirFryActions.Clear();
            }
            //流程
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T1, RobotActions = new List<StirFryRobotAction>() { StirFryRobotAction.清洗槽取锅 } });
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T2, RobotActions = new List<StirFryRobotAction>() { StirFryRobotAction.加入A料 }, PotActions = new List<StirFryPotAction>() { StirFryPotAction.中火持续, StirFryPotAction.搅拌臂下位, StirFryPotAction.低速旋转 }, During = 5 });
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T3, PotActions = new List<StirFryPotAction>() { StirFryPotAction.加油 }, During = 12 });
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T4, PotActions = new List<StirFryPotAction>() { StirFryPotAction.停止旋转, StirFryPotAction.搅拌臂上位 } });//加A料
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T6, RobotActions = new List<StirFryRobotAction>() { StirFryRobotAction.加入B料 }, PotActions = new List<StirFryPotAction>() { StirFryPotAction.搅拌臂下位, StirFryPotAction.快速旋转 }, During = 25 });

            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T7, PotActions = new List<StirFryPotAction>() { StirFryPotAction.停止旋转, StirFryPotAction.搅拌臂上位 } });//加B料

            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T9, RobotActions = new List<StirFryRobotAction>() { StirFryRobotAction.加入C料 }, PotActions = new List<StirFryPotAction>() { StirFryPotAction.搅拌臂下位, StirFryPotAction.快速旋转 }, During = 30 });

            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T10, PotActions = new List<StirFryPotAction>() { StirFryPotAction.停止火力, StirFryPotAction.停止旋转, StirFryPotAction.搅拌臂上位 } });//加C料
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T6, PotActions = new List<StirFryPotAction>() { StirFryPotAction.搅拌臂下位, StirFryPotAction.快速旋转 }, During = 55 });
            stirFryBom.AddAction(new StirFryAction() { Time = StirFryTime.T11, RobotActions = new List<StirFryRobotAction>() { StirFryRobotAction.灶取锅 } });
        }
        public void StartQX(object obj)
        {

            if ((int)obj == 1)
                WriteData("M1.4", true);
            if ((int)obj == 2)
                WriteData("M1.7", true);
        }
        public void ManualOpenExhaust()
        {
            WriteData("M0.7", true);
        }
        public void CloseExhaust()
        {
            WriteData("M0.7", false);
        }
        public void TakeMaterial()
        {
            WriteData("M14.1", true);
        }
        public void ManualOutMeal()
        {
            WriteData("M14.2", true);
        }
        public void MaterialOne()
        {
            WriteData("M13.0", true);
        }

        public void MaterialTwo()
        {
            WriteData("M13.1", true);
        }
        public void MaterialThree()
        {
            WriteData("M13.2", true);
        }
        public void MaterialFour()
        {
            WriteData("M13.3", true);
        }
        public void MaterialFive()
        {
            WriteData("M13.4", true);
        }
        public void AutoModel(object obj)
        {

            WriteData("0.3", true);

        }
        public void ManualModel()
        {
            WriteData("0.2", true);
        }
        public void AddOil(object obj)
        {
            if ((int)obj == 1)
            {
                Task.Run(() => { WriteData("M2.7", true); Task.Delay(4000).Wait(); WriteData("M2.7", false); });
            }

            if ((int)obj == 2)
            {
                Task.Run(() => { WriteData("M3.1", true); Task.Delay(4000).Wait(); WriteData("M3.1", false); });
            }
        }
        public void TakePot(object obj)
        {

            WriteData("M14.0", true);
        }

        public void TakePotReset(object obj)
        {
            WriteData("M14.0", false);
        }
        public void TakeOff(object obj)
        {
            if ((int)obj == 1)
                WriteData("M4.0", new bool[] { false, false, false, false, false, false, false, false });//0000 0000
            if ((int)obj == 2)
                WriteData("M5.0", new bool[] { false, false, false, false, false, false, false, false });//0000 0000
        }

        public void OneBlock(object obj)
        {
            if ((int)obj == 1)
                WriteData("M4.0", new bool[] { true, false, false, false, false, false, false, false });//0000 0001
            if ((int)obj == 2)
                WriteData("M5.0", new bool[] { true, false, false, false, false, false, false, false });//0000 0001


        }
        public void TwoBlock(object obj)
        {
            if ((int)obj == 1)
                WriteData("M4.0", new bool[] { false, true, false, false, false, false, false, false });//0000 0010
            if ((int)obj == 2)
                WriteData("M5.0", new bool[] { false, true, false, false, false, false, false, false });//0000 0010
        }
        public void ThreeBlock(object obj)
        {
            if ((int)obj == 1)
                WriteData("M4.0", new bool[] { true, true, false, false, false, false, false, false });//0000 0011
            if ((int)obj == 2)
                WriteData("M5.0", new bool[] { true, true, false, false, false, false, false, false });//0000 0011
        }
        public void OverTurnOff(object obj)
        {
            if ((int)obj == 1)
                WriteData("M7.0", true);
            if ((int)obj == 2)
                WriteData("M7.4", true);
        }
        public void OverOneBlock(object obj)
        {
            if ((int)obj == 1)
                WriteData("M7.1", true);
            if ((int)obj == 2)
                WriteData("M7.5", true);
        }
        public void OverTwoBlock(object obj)
        {
            if ((int)obj == 1)
                WriteData("M7.2", true);
            if ((int)obj == 2)
                WriteData("M7.6", true);
        }
        public void OverThreeBlock(object obj)
        {
            if ((int)obj == 1)
                WriteData("M7.3", true);
            if ((int)obj == 2)
                WriteData("M7.7", true);
        }
        public void OverGoOn(object obj)
        {
            if ((int)obj == 1)
                WriteData("M8.0", true);
            if ((int)obj == 2)
                WriteData("M8.4", true);
        }

        public void OverGoDown(object obj)
        {
            if ((int)obj == 1)
                WriteData("M8.2", true);
            if ((int)obj == 2)
                WriteData("M8.6", true);
        }
        public void FlowInite()
        {

        }
        /// <summary>
        /// 订单初始化
        /// </summary>
        private void InitialData()
        {
            //队列
            string subId = Guid.NewGuid().ToString();
            morkF.TakeMaterialQueue.Enqueue(new OrderLocInfo() { SuborderId = subId, MaterialLoc = new List<int>() { 1 } });//A料
            morkF.TakeMaterialQueue.Enqueue(new OrderLocInfo() { SuborderId = subId, MaterialLoc = new List<int>() { 2 } });//B料
            morkF.TakeMaterialQueue.Enqueue(new OrderLocInfo() { SuborderId = subId, MaterialLoc = new List<int>() { 3 } });//C料
            morkF.TakePlateQueue.Enqueue(new OrderLocInfo() { SuborderId = subId });
            resultorder.AddRange(new int[] { 1, 2, 3 });
            morkF.listStirBom.Add(stirFryBom);
        }
        #endregion

        public override void ResetProgram()
        {
            morkF = null;
            morkF = new GVL_MorkF();
        }

        /// <summary>
        /// PLC数据读取
        /// </summary>
        public override void ReadData()
        {

            GetStatus("M0.1", new Action<bool[]>((bools) =>
            {
                Initing = bools[0];
                morkF.InitialComplete = Initing;
            }));
            GetStatus("M1.0", new Action<bool[]>((bools) =>
            {
                morkF.ProvidePlateModule = bools[0];
                morkF.ProvidePlateComplete = bools[2];
                morkF.CleanModule = bools[3];
                morkF.CleanComplete = bools[5];
            }));
            GetStatus("M2.0", new Action<bool[]>((bools) =>
            {
                morkF.KitchenOneStatus = bools[1];
                morkF.KitchenSecondStatus = bools[4];
                morkF.FallOilComplete = bools[8];
            }));
            GetStatus("M8.0", new Action<bool[]>((bools) =>
            {
                morkF.TurnMachineUpComplete = bools[1];
                morkF.TurnMachineDownComplete = bools[3];
            }));
            GetStatus("M13.5", new Action<bool[]>((bools) =>
            {
                morkF.MaterialArriveComplete = bools[0];
            }));
            GetStatus("M16.0", new Action<bool[]>((bools) =>
            {
                morkF.PutPotToKitchenComlete = bools[1];
                morkF.TakeMaterialComplete = bools[2];
                morkF.FallMaterialComplete = bools[3];
                morkF.PlaceRinseTableComplete = bools[5];
                morkF.RoobotIdle = bools[6];
            }));

        }
        private void ServerInit()
        {
            //物料信息
            EventBus.EventBus.GetInstance().Subscribe<MaterialDeliveryEvent>(DeviceId, delegate (IEvent @event, EventCallBackHandle callBack)
            {
                if (@event == null) return;
                if (@event is MaterialDeliveryEvent material)
                {
                    orderMaterialDelivery = material.orderMaterialDelivery;

                }
            });

            //配方数据信息
            EventBus.EventBus.GetInstance().Subscribe<RecipeBomEvent>(DeviceId, delegate (IEvent @event, EventCallBackHandle callBack)
            {
                if (@event == null) return;
                if (@event is RecipeBomEvent recipe)
                {
                    recipeBoms = recipe.recipeBoms;
                    WriteRecipeBoms();
                }
            });
            //小炒流程信息
            EventBus.EventBus.GetInstance().Subscribe<StirFryGoodsEvent>(DeviceId, delegate (IEvent @event, EventCallBackHandle callback)
            {
                if (@event == null) return;
                if (@event is StirFryGoodsEvent stirFry)
                {
                    stirFryGoods = stirFry.stirFrymessage.stirFryGoods;
                    MessageLog.GetInstance.Show("接收到小炒流程信息");
                    //流程解析
                    foreach (var item in stirFryGoods)
                    {
                        MessageLog.GetInstance.ShowEx($"执行菜谱{item.GoodsKey}");
                        // morkF.listStirBom.Add(item.StirFryBomInfo);//添加订单制作流程
                        foreach (var items in item.StirFryBomInfo.StirFryActions)
                        {
                            MessageLog.GetInstance.Show($"执行流程{items.Time}");
                            foreach (var pro in items.RobotActions)
                            {
                                switch (pro)
                                {
                                    case StirFryRobotAction.等待:
                                        MessageLog.GetInstance.Show($"等待");
                                        break;
                                    case StirFryRobotAction.清洗槽取锅:
                                        MessageLog.GetInstance.Show($"清洗槽取锅");
                                        break;
                                    case StirFryRobotAction.灶放锅:
                                        MessageLog.GetInstance.Show($"灶放锅");
                                        break;
                                    case StirFryRobotAction.清洗槽放锅:
                                        MessageLog.GetInstance.Show($"清洗槽放锅");
                                        break;
                                    case StirFryRobotAction.取A料:
                                        MessageLog.GetInstance.Show($"取A料");
                                        break;
                                    case StirFryRobotAction.取B料:
                                        MessageLog.GetInstance.Show($"取B料");
                                        break;
                                    case StirFryRobotAction.取C料:
                                        MessageLog.GetInstance.Show($"取C料");
                                        break;
                                    case StirFryRobotAction.加入A料:
                                        MessageLog.GetInstance.Show($"加入A料");
                                        break;
                                    case StirFryRobotAction.加入B料:
                                        MessageLog.GetInstance.Show($"加入B料");
                                        break;
                                    case StirFryRobotAction.加入C料:
                                        MessageLog.GetInstance.Show($"加入C料");
                                        break;
                                    case StirFryRobotAction.切换快速:
                                        MessageLog.GetInstance.Show($"切换快速");
                                        break;
                                    case StirFryRobotAction.切换中速:
                                        MessageLog.GetInstance.Show($"切换中速");
                                        break;
                                    case StirFryRobotAction.丢料盒:
                                        MessageLog.GetInstance.Show($"丢料盒");
                                        break;
                                    case StirFryRobotAction.倒菜:
                                        MessageLog.GetInstance.Show($"倒菜");
                                        break;
                                    case StirFryRobotAction.灶取锅:
                                        MessageLog.GetInstance.Show($"灶取锅");     
                                        break;
                                }
                            }
                            foreach (var pro in items.PotActions)
                            {
                                switch (pro)
                                {
                                    case StirFryPotAction.NONE:
                                        break;
                                    case StirFryPotAction.加热:
                                        MessageLog.GetInstance.Show($"加热");
                                        break;
                                    case StirFryPotAction.大火t1s:
                                        MessageLog.GetInstance.Show($"大火1s");
                                        break;
                                    case StirFryPotAction.加油:
                                        MessageLog.GetInstance.Show($"加油");
                                        break;
                                    case StirFryPotAction.中火t2s:
                                        MessageLog.GetInstance.Show($"中火2s");
                                        break;
                                    case StirFryPotAction.小火持续:
                                        MessageLog.GetInstance.Show($"小火持续");
                                        break;
                                    case StirFryPotAction.中火持续:
                                        MessageLog.GetInstance.Show($"中火持续");
                                        break;
                                    case StirFryPotAction.大火持续:
                                        MessageLog.GetInstance.Show($"大火持续");
                                        break;
                                    case StirFryPotAction.停止火力:
                                        MessageLog.GetInstance.Show($"停止火力");
                                        break;
                                    case StirFryPotAction.搅拌臂上位:
                                        MessageLog.GetInstance.Show($"搅拌臂上位");
                                        break;
                                    case StirFryPotAction.搅拌臂中位:
                                        MessageLog.GetInstance.Show($"搅拌臂中位");
                                        break;
                                    case StirFryPotAction.搅拌臂下位:
                                        MessageLog.GetInstance.Show($"搅拌臂下位");
                                        break;
                                    case StirFryPotAction.低速旋转:
                                        MessageLog.GetInstance.Show($"低速旋转");
                                        break;
                                    case StirFryPotAction.快速旋转:
                                        MessageLog.GetInstance.Show($"快速旋转");
                                        break;
                                    case StirFryPotAction.停止旋转:
                                        MessageLog.GetInstance.Show($"停止旋转");
                                        break;
                                }
                            }
                        }
                    }
                    
                }   
                    
            });

        }

        private void OrderChange(string subid, ORDER_STATUS oRDER_STATUS)
        {
            EventBus.EventBus.GetInstance().Publish(new OrderStatusChangedEvent() { Status = oRDER_STATUS, SubOrderId = subid });
        }



        /// <summary>
        /// 数据解析
        /// </summary>
        private void DataParse()
        {
            EventBus.EventBus.GetInstance().Subscribe<DoOrderEvent>(DeviceId, delegate (IEvent @event, EventCallBackHandle callBackHandle)
            {
                if (@event == null) return;
                if (@event is DoOrderEvent order)
                {
                    if (order.MorkOrder.GoodBatchings == null) return;
                    OrderCount++;
                    DeviceProcessLogShow($"接收到{OrderCount}次订单");

                    var res = stirFryGoods?.FirstOrDefault(p => p.GoodsKey == order.MorkOrder.RecipeId);//匹配订单对应制作流程
                    if (res != null)
                    {
                        morkF.listStirBom.Add(res.StirFryBomInfo);//添加订单制作流程
                        if (morkF.TakeMaterialQueue.FirstOrDefault(p => p.SuborderId == order.MorkOrder.SuborderId) == null)
                        {
                            morkF.TakeMaterialQueue.Enqueue(new OrderLocInfo() { SuborderId = order.MorkOrder.SuborderId, MaterialLoc = res.StirFryBomInfo.ALoc });
                            morkF.TakeMaterialQueue.Enqueue(new OrderLocInfo() { SuborderId = order.MorkOrder.SuborderId, MaterialLoc = res.StirFryBomInfo.BLoc });
                            morkF.TakeMaterialQueue.Enqueue(new OrderLocInfo() { SuborderId = order.MorkOrder.SuborderId, MaterialLoc = res.StirFryBomInfo.CLoc });

                        }


                        //foreach (var item in order.MorkOrder.GoodBatchings)
                        //{
                        if (morkF.TakePlateQueue.FirstOrDefault(p => p.SuborderId == order.MorkOrder.SuborderId) == null)
                        {
                            morkF.TakePlateQueue.Enqueue(new OrderLocInfo()
                            {
                                SuborderId = order.MorkOrder.SuborderId,

                            });
                        }
                        //}
                    }
                }

            });
        }
        //}
        /// <summary>
        /// 主任务
        /// </summary>
        public override void MainTask()
        {
            TakePlatelTask();
            TurntableControl();
            MainProcessExecute();
            MinorProcessExcute();
            SingleProcess();
        }
        //辅流程执行
        private void MinorProcessExcute()
        {
            if (!morkF.MinorProcessExcuteLock)
            {
                morkF.MinorProcessExcuteLock = true;
                Task.Run(() =>
                   {
                       if (morkF.MinorProcessFlag && !morkF.RoobotIdle && morkF.TakeMaterialQueue.Count > 0)
                       {
                           morkF.MinorProessStatus = true;
                           morkF.MainProcessStatus = false;
                           StirFryBom bom = morkF.listStirBom.ElementAt(0);
                           morkF.listStirBom.RemoveAt(0);
                           foreach (var res in bom.StirFryActions)
                           {
                               DeviceProcessLogShow($"执行流程{res.Time}");
                               //机器人线程
                               Task taskRobot = Task.Run(new Action(() =>
                                      {
                                          foreach (var temp in res.RobotActions)
                                          {
                                              switch (temp)
                                              {
                                                  case StirFryRobotAction.清洗槽取锅:
                                                      TakePotTask();//执行取锅操作
                                                      break;
                                                  case StirFryRobotAction.取A料:
                                                      TakeBurdenATask();//执行取A料操作
                                                      break;
                                                  case StirFryRobotAction.取B料:
                                                      TakeBurdenATask();//执行取B料操作
                                                      break;
                                                  case StirFryRobotAction.取C料:
                                                      TakeBurdenCTask();//执行取C料操作
                                                      break;
                                                  case StirFryRobotAction.灶取锅:
                                                      OutDishTask();//执行出餐操作
                                                      CleanPotTask();//洗锅操作
                                                      break;
                                              }

                                          }

                                      }));
                               //炒锅线程操作
                               Task taskPot = Task.Run(new Action(() =>
                                      {
                                          foreach (var temp in res.PotActions)
                                          {
                                              switch (temp)
                                              {
                                                  case StirFryPotAction.NONE:
                                                      break;
                                                  case StirFryPotAction.大火t1s:
                                                      KitchenAdjustGears(3);
                                                      Task.Delay(1000).Wait(); //大火加热1s//执行大火锅干操作
                                                      break;
                                                  case StirFryPotAction.加油:
                                                      AddOil();//注油//执行加油操作
                                                      break;
                                                  case StirFryPotAction.中火t2s:
                                                      KitchenAdjustGears(2);
                                                      Task.Delay(2000).Wait();//执行操作
                                                      break;
                                                  case StirFryPotAction.小火持续:
                                                      KitchenAdjustGears(1);
                                                      break;
                                                  case StirFryPotAction.中火持续:
                                                      KitchenAdjustGears(5);
                                                      break;
                                                  case StirFryPotAction.大火持续:
                                                      KitchenAdjustGears(7);
                                                      break;
                                                  case StirFryPotAction.停止火力:
                                                      KitchenAdjustGears(0);//关闭灶加热
                                                      break;
                                                  case StirFryPotAction.搅拌臂上位:
                                                      TurnUpStatusDetect();//执行搅拌臂上位操作
                                                      break;
                                                  case StirFryPotAction.搅拌臂下位:
                                                      TurnDownStatusDetect();//执行搅拌臂下位操作
                                                      break;
                                                  case StirFryPotAction.低速旋转:
                                                      TurnMachineGearsControl(1);//执行搅拌臂速度1挡操作
                                                      break;
                                                  case StirFryPotAction.快速旋转:
                                                      TurnMachineGearsControl(2);//执行搅拌臂速度3挡操作
                                                      break;
                                                  case StirFryPotAction.停止旋转:
                                                      TurnMachineGearsControl(0);//执行搅拌臂速度0挡操作
                                                      break;
                                              }
                                          }
                                      }));
                               Task.WhenAll(taskRobot, taskPot).Wait();//等待所有线程结束
                               Task.Delay(res.During * 1000).Wait();//当前流程延迟 
                               if (morkF.MainProcessWait)
                               {
                                   if (morkF.MinorHasTakeMaterial)
                                   {
                                   }
                                   else
                                   {
                                       KitchenAdjustGears(0);//关闭灶加热
                                       morkF.MinorProessStatus = false;
                                       morkF.MainProcessStatus = true;
                                       //阻塞辅流程
                                       minorReset.WaitOne();
                                   }

                               }
                               morkF.MinorProessStatus = true;
                               morkF.MainProcessStatus = false;
                           }
                           morkF.MinorOutMealComplete = true;
                       }
                       else
                       {
                           morkF.MinorProcessExcuteLock = false;//解除辅流程自锁
                       }
                   });
            }
        }

        //机器人，锅灶主流程执行
        public void MainProcessExecute()
        {
            if (!morkF.MainProcessExcuteLock)
            {
                morkF.MainProcessExcuteLock = true;
                Task.Run(new Action(() =>
                {
                    if (!morkF.RoobotIdle && morkF.InitialComplete && morkF.TakeMaterialQueue.Count > 0 && morkF.MainProcessFlag)
                    {
                        morkF.MainProcessStatus = true;
                        morkF.MinorProessStatus = false;
                        StirFryBom bom = morkF.listStirBom.ElementAt(0);
                        morkF.listStirBom.RemoveAt(0);
                        foreach (var res in bom.StirFryActions)//遍历所有流程
                        {
                            DeviceProcessLogShow($"执行流程{res.Time}");
                            //机器人线程
                            Task taskRobot = Task.Run(new Action(() =>
                            {
                                foreach (var temp in res.RobotActions)
                                {
                                    switch (temp)
                                    {
                                        case StirFryRobotAction.清洗槽取锅:
                                            TakePotTask();//执行取锅操作
                                            break;
                                        case StirFryRobotAction.取A料:
                                            TakeBurdenATask();//执行取A料操作
                                            break;
                                        case StirFryRobotAction.取B料:
                                            TakeBurdenATask();//执行取B料操作
                                            break;
                                        case StirFryRobotAction.取C料:
                                            TakeBurdenCTask();//执行取C料操作
                                            break;
                                        case StirFryRobotAction.灶取锅:
                                            OutDishTask();//执行出餐操作
                                            CleanPotTask();//洗锅操作
                                            break;
                                    }

                                }

                            }));
                            //炒锅线程操作
                            Task taskPot = Task.Run(new Action(() =>
                            {
                                foreach (var temp in res.PotActions)
                                {
                                    switch (temp)
                                    {
                                        case StirFryPotAction.NONE:
                                            break;
                                        case StirFryPotAction.大火t1s:
                                            KitchenAdjustGears(3);
                                            Task.Delay(1000).Wait(); //大火加热1s//执行大火锅干操作
                                            break;
                                        case StirFryPotAction.加油:
                                            AddOil();//注油//执行加油操作
                                            break;
                                        case StirFryPotAction.中火t2s:
                                            KitchenAdjustGears(2);
                                            Task.Delay(2000).Wait();//执行操作
                                            break;
                                        case StirFryPotAction.小火持续:
                                            KitchenAdjustGears(1);
                                            break;
                                        case StirFryPotAction.中火持续:
                                            KitchenAdjustGears(5);
                                            break;
                                        case StirFryPotAction.大火持续:
                                            KitchenAdjustGears(7);
                                            break;
                                        case StirFryPotAction.停止火力:
                                            KitchenAdjustGears(0);//关闭灶加热
                                            break;
                                        case StirFryPotAction.搅拌臂上位:
                                            TurnUpStatusDetect();//执行搅拌臂上位操作
                                            break;
                                        case StirFryPotAction.搅拌臂下位:
                                            TurnDownStatusDetect();//执行搅拌臂下位操作
                                            break;
                                        case StirFryPotAction.低速旋转:
                                            TurnMachineGearsControl(1);//执行搅拌臂速度1挡操作
                                            break;
                                        case StirFryPotAction.快速旋转:
                                            TurnMachineGearsControl(2);//执行搅拌臂速度3挡操作
                                            break;
                                        case StirFryPotAction.停止旋转:
                                            TurnMachineGearsControl(0);//执行搅拌臂速度0挡操作
                                            break;
                                    }
                                }
                            }));

                            Task.WhenAll(taskRobot, taskPot).Wait();//等待所有线程结束
                            Task.Delay(res.During * 1000).Wait();//当前流程延迟
                            if (morkF.MinorProcessWait)
                            {
                                if (morkF.MainHasTakeMaterial)//针对主流程准备出餐但辅流程机器人忙碌情况下，辅流程不阻塞
                                {
                                }
                                else
                                {
                                    KitchenAdjustGears(0);//关闭灶加热
                                    morkF.MinorProessStatus = true;
                                    morkF.MainProcessStatus = false;
                                    //阻塞主流程
                                    mainReset.WaitOne();
                                }

                            }
                            morkF.MinorProessStatus = false;
                            morkF.MainProcessStatus = true;

                        }
                        morkF.MainOutMealComplete = true;
                    }
                    else
                    {
                        morkF.MainProcessExcuteLock = false;//解除流程自锁
                    }
                }));
            }

        }
        /// <summary>
        /// 信号处理
        /// </summary>
        private void SingleProcess()
        {


            //主流程出餐完成，相应变量复位
            if (morkF.MainOutMealComplete)
            {
                morkF.TakePlateLock = false;
                morkF.MainProcessExcuteLock = false;
                morkF.MainOrderMaterialCom = false;
                morkF.MinorProcessWait = false;//主流程出餐完成取消辅流程线程阻塞
                if (morkF.MainProcessPotLoc == 1)
                {
                    morkF.PotInPlace = false;
                }
                else if (morkF.MainProcessPotLoc == 2)
                {
                    morkF.SecondPotInPlace = false;
                }
            }
            //辅流程出餐完成，相应变量复位
            if (morkF.MinorOutMealComplete)
            {
                morkF.TakePlateLock = false;
                morkF.MinorProcessExcuteLock = false;
                morkF.MinorOrderMaterialCom = false;
                morkF.MainProcessWait = false;//辅流程出餐完成取消主流程线程阻塞
                if (morkF.MinorProcessPotLoc == 1)
                {
                    morkF.PotInPlace = false;
                }
                else if (morkF.MinorProcessPotLoc == 2)
                {
                    morkF.SecondPotInPlace = false;
                }
            }

        }

        /// <summary>
        /// 转台控制
        /// </summary>
        private void TurntableControl()
        {
            //模拟订单
            if (morkF.TakeMaterialQueue.Count > 0 && !morkF.TurnTableLock && General_Config.SimOrderAllow)
            {

                if (resultorder != null)
                {

                    TurnMaterialStore(resultorder[0]);
                    DeviceProcessLogShow($"转台转到【{resultorder[0]}】位置");
                    resultorder.RemoveAt(0);
                    morkF.TurnTableLock = true;  //取料完成后置false

                }
                else
                {
                    DeviceProcessLogShow("未找到可用的物料信息");
                }

            }
            //正式订单
            if (morkF.TakeMaterialQueue.Count > 0 && !morkF.TurnTableLock)
            {
                //var result = orderMaterialDelivery.BatchingInfo.Where(p => p.BatchingId == morkF.TakeMaterialQueue.ElementAt(0).BatchingId).ToList();
                var materialLoc = morkF.TakeMaterialQueue.ElementAt(0).MaterialLoc;
                if (materialLoc.Count != 0)
                {
                    TurnMaterialStore(materialLoc[0]);
                    DeviceProcessLogShow($"转台转到【{materialLoc[0]}】位置");
                    morkF.TurnTableLock = true;  //取料完成后置false

                }
                else
                {
                    DeviceProcessLogShow("未找到可用的物料信息");
                }

            }


        }


        /// <summary>
        /// 供盘
        /// </summary>
        /// <exception cref="NotImplementedException"></exception>
        private void TakePlatelTask()
        {
            if (!morkF.RoobotIdle && morkF.InitialComplete && morkF.TakePlateQueue.Count > 0 && !morkF.ProvidePlateModule && !morkF.TakePlateLock)
            {

                if (morkF.TakePlateQueue.TryDequeue(out OrderLocInfo order))
                {
                    StartTakePlate();
                    if (morkF.MainProcessStatus)
                        morkF.MainCurrentOrderId = order.SuborderId;
                    if (morkF.MinorProessStatus)
                        morkF.MinorCurrentOrderId = order.SuborderId;
                    morkF.TakePlateLock = true; //订单完成后置false
                    morkF.MainOutMealComplete = false;
                    morkF.MinorOutMealComplete = false;
                    // OrderChange(morkF.CurrentOrderId, ORDER_STATUS.COOKING);
                    DeviceProcessLogShow($"订单【{order.SuborderId}】执行取碗控制");
                }
            }
        }

        /// <summary>
        /// 取锅到灶台
        /// </summary>
        /// <exception cref="NotImplementedException"></exception>
        private void TakePotTask()
        {
            //while (!((!morkF.CleanModule && !morkF.KitchenOneStatus && morkF.CleanComplete) || (!morkF.SecondCleanModule && !morkF.KitchenSecondStatus && morkF.SecondCleanComplete)))
            //{
            //    Task.Delay(5).Wait();
            //}
            while (!(!morkF.CleanModule || !morkF.SecondCleanModule) && (!morkF.KitchenOneStatus || !morkF.KitchenSecondStatus) && (morkF.CleanComplete || morkF.SecondCleanComplete))//等待取锅条件满足
            {
                Task.Delay(5).Wait();
            }
            while (morkF.RoobotIdle)//等待机器人空闲
            {
                Task.Delay(5).Wait();
            }
            if (!morkF.CleanModule && !morkF.KitchenOneStatus && morkF.CleanComplete)
            {
                //取1号锅到1号灶台
                TakePotToKitchen(1);
                morkF.CurrentPutPotLoc = 1;
                WriteData("M1.5", false);//清洗模组1完成复位
            }
            else if (!morkF.SecondCleanModule && !morkF.KitchenOneStatus && morkF.SecondCleanComplete)
            {
                //取2号锅到1号灶台
                TakePotToKitchen(1);
                morkF.CurrentPutPotLoc = 1;
                WriteData("M2.0", false);//清洗模组2完成复位
            }
            if (!morkF.SecondCleanModule && !morkF.KitchenSecondStatus && morkF.SecondCleanComplete)
            {
                //取2号锅到2号灶台
                TakePotToKitchen(2);
                morkF.CurrentPutPotLoc = 2;
                WriteData("M2.0", false);//清洗模组2完成复位
            }
            else if (!morkF.CleanModule && !morkF.KitchenSecondStatus && morkF.CleanComplete)
            {
                //取1号锅到2号灶台
                TakePotToKitchen(2);
                morkF.CurrentPutPotLoc = 2;
                WriteData("M2.0", false);//清洗模组1完成复位
            }
            if (morkF.MainProcessStatus)
            {
                morkF.MainProcessPotLoc = morkF.CurrentPutPotLoc;
                DeviceProcessLogShow($"订单【{morkF.MainCurrentOrderId}】执行取锅到灶台控制");
            }
            if (morkF.MinorProessStatus)
            {
                morkF.MinorProcessPotLoc = morkF.CurrentPutPotLoc;
                DeviceProcessLogShow($"订单【{morkF.MinorCurrentOrderId}】执行取锅到灶台控制");
            }
            if (morkF.CurrentPutPotLoc == 1)
            {
                while (!morkF.PutPotToKitchenComlete)
                {
                    Task.Delay(5).Wait();
                }
                morkF.PotInPlace = morkF.PutPotToKitchenComlete;//锅到位
                WriteData("M14.0", false);//机器人取锅完成复位
            }
            if (morkF.CurrentPutPotLoc == 2)
            {
                while (!morkF.PutPotToSecondKitchenComlete)
                {
                    Task.Delay(5).Wait();
                }
                morkF.SecondPotInPlace = morkF.PutPotToSecondKitchenComlete;
                WriteData("M14.4", false);//机器人取锅完成复位
            }


            Thread.Sleep(2000);




        }

        /// <summary>
        /// 写入配方数据到 PLC
        /// </summary>
        private void WriteRecipeBoms()
        {
            //List<ushort> recipeBoms = new List<ushort>();
            //if (this.recipeBoms == null) return;
            //foreach (var item in this.recipeBoms.RecipeIds)
            //{
            //    foreach (var rec in item.Recipes)
            //    {
            //        recipeBoms.Add((ushort)rec);
            //    }
            //}
            //if (recipeBoms.Count > 0)
            //{
            //    //配方数据地址范围：VW2000 - VW2278
            //    WriteData("VW2000", recipeBoms.ToArray());
            //}
            //else {DeviceProcessLogShow("配方数据为空"); }
        }
        /// <summary>
        /// 转台复位
        /// </summary>
        /// <param name="loc"></param>
        public void TurnReset(int loc)
        {
            switch (loc)
            {
                case 1: WriteData("M13.0", false); break;
                case 2: WriteData("M13.1", false); break;
                case 3: WriteData("M13.2", false); break;
                case 4: WriteData("M13.3", false); break;
                case 5: WriteData("M13.4", false); break;
            }
        }
        /// <summary>
        /// 取素菜A料
        /// </summary>
        private void TakeBurdenATask()
        {
            int loc = 0;
            //while (morkF.RoobotIdle || (!morkF.PotInPlace && !morkF.SecondPotInPlace) || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅到位
            //{
            //    Task.Delay(5).Wait();
            //}
            if (morkF.MainProcessStatus)
            {
                if (morkF.MainProcessPotLoc == 1)
                {
                    while (morkF.RoobotIdle || !morkF.PotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅1到位
                    {
                        Task.Delay(5).Wait();
                    }
                }
                else
                {
                    while (morkF.RoobotIdle || !morkF.SecondPotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅2到位
                    {
                        Task.Delay(5).Wait();
                    }
                }
                if (morkF.TakeMaterialQueue.TryDequeue(out OrderLocInfo order))
                {
                    loc = order.MaterialLoc[0];
                    TakeBurden();
                    TurnReset(loc);//转台复位

                    DeviceProcessLogShow($"订单【{order.SuborderId}】，执行到转台{loc}位置取料");
                }
                //等待取料完成
                while (!morkF.TakeMaterialComplete)
                {
                    Task.Delay(5).Wait();
                }
                morkF.MainOrderMaterialCom = false;
                morkF.MainHasTakeMaterial = true;
                WriteData("M14.1", false);//机器人取料完成复位
            }
            if (morkF.MinorProessStatus)
            {
                if (morkF.MinorProcessPotLoc == 1)
                {
                    while (morkF.RoobotIdle || !morkF.PotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅1到位
                    {
                        Task.Delay(5).Wait();
                    }
                }
                else
                {
                    while (morkF.RoobotIdle || !morkF.SecondPotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅2到位
                    {
                        Task.Delay(5).Wait();
                    }
                }
                if (morkF.TakeMaterialQueue.TryDequeue(out OrderLocInfo order))
                {
                    loc = order.MaterialLoc[0];
                    TakeBurden();
                    TurnReset(loc);//转台复位

                    DeviceProcessLogShow($"订单【{order.SuborderId}】，执行到转台{loc}位置取料");
                }
                //等待取料完成
                while (!morkF.TakeMaterialComplete)
                {
                    Task.Delay(5).Wait();
                }
                morkF.MinorOrderMaterialCom = false;
                morkF.MinorHasTakeMaterial = true;
                WriteData("M14.5", false);//机器人取料完成复位
            }
            morkF.TurnTableLock = false;//转台互锁解除


        }

        /// <summary>
        /// 取素菜B料
        /// </summary>
        private void TakeBurdenBTask()
        {
            int loc = 0;
            //while (morkF.RoobotIdle || (!morkF.PotInPlace && !morkF.SecondPotInPlace) || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅到位
            //{
            //    Task.Delay(5).Wait();
            //}
            if (morkF.MainProcessStatus)
            {
                if (morkF.MainProcessPotLoc == 1)
                {
                    while (morkF.RoobotIdle || !morkF.PotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅1到位
                    {
                        Task.Delay(5).Wait();
                    }
                }
                else
                {
                    while (morkF.RoobotIdle || !morkF.SecondPotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅2到位
                    {
                        Task.Delay(5).Wait();
                    }
                }
                if (morkF.TakeMaterialQueue.TryDequeue(out OrderLocInfo order))
                {
                    loc = order.MaterialLoc[0];
                    TakeBurden();
                    TurnReset(loc);//转台复位

                    DeviceProcessLogShow($"订单【{order.SuborderId}】，执行到转台{loc}位置取料");
                }
                //等待取料完成
                while (!morkF.TakeMaterialComplete)
                {
                    Task.Delay(5).Wait();
                }
                morkF.MainOrderMaterialCom = false;
                morkF.MainHasTakeMaterial = true;
                WriteData("M14.1", false);//机器人取料完成复位
            }
            if (morkF.MinorProessStatus)
            {
                if (morkF.MinorProcessPotLoc == 1)
                {
                    while (morkF.RoobotIdle || !morkF.PotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅1到位
                    {
                        Task.Delay(5).Wait();
                    }
                }
                else
                {
                    while (morkF.RoobotIdle || !morkF.SecondPotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅2到位
                    {
                        Task.Delay(5).Wait();
                    }
                }
                if (morkF.TakeMaterialQueue.TryDequeue(out OrderLocInfo order))
                {
                    loc = order.MaterialLoc[0];
                    TakeBurden();
                    TurnReset(loc);//转台复位

                    DeviceProcessLogShow($"订单【{order.SuborderId}】，执行到转台{loc}位置取料");
                }
                //等待取料完成
                while (!morkF.TakeMaterialComplete)
                {
                    Task.Delay(5).Wait();
                }
                morkF.MinorOrderMaterialCom = false;
                morkF.MinorHasTakeMaterial = true;
                WriteData("M14.5", false);//机器人取料完成复位
            }
            morkF.TurnTableLock = false;//转台互锁解除
        }
        /// <summary>
        /// 取调味品C料
        /// </summary>
        /// <exception cref="NotImplementedException"></exception>
        private void TakeBurdenCTask()
        {
            #region 旧代码
            //while (morkF.RoobotIdle || (!morkF.PotInPlace && !morkF.SecondPotInPlace) || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅到位
            //{
            //    Task.Delay(5).Wait();
            //}
            //if (morkF.TakeMaterialQueue.TryDequeue(out OrderLocInfo order))
            //{
            //    int loc = order.MaterialLoc;
            //    TakeBurden(loc);
            //    TurnReset(loc);//转台复位
            //    DeviceProcessLogShow($"订单【{ order.SuborderId}】,执行取C料");
            //}
            //DeviceProcessLogShow($"剩余配料数量{morkF.TakeMaterialQueue.Count}");
            ////等待取料完成
            //while (!morkF.TakeMaterialComplete)
            //{
            //    Task.Delay(5).Wait();
            //}
            //morkF.MainOrderMaterialCom = false;
            //if (morkF.MainProcessStatus)
            //{
            //    morkF.MainOrderMaterialCom = false;
            //    WriteData("M14.1", false);//机器人取料完成复位
            //}
            //if (morkF.MinorProessStatus)
            //{
            //    morkF.MinorOrderMaterialCom = false;
            //    WriteData("M14.5", false);//机器人取料完成复位
            //}
            //morkF.TurnTableLock = false;//转台互锁解除 
            #endregion
            int loc = 0;
            //while (morkF.RoobotIdle || (!morkF.PotInPlace && !morkF.SecondPotInPlace) || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅到位
            //{
            //    Task.Delay(5).Wait();
            //}
            if (morkF.MainProcessStatus)
            {
                if (morkF.MainProcessPotLoc == 1)
                {
                    while (morkF.RoobotIdle || !morkF.PotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅1到位
                    {
                        Task.Delay(5).Wait();
                    }
                }
                else
                {
                    while (morkF.RoobotIdle || !morkF.SecondPotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅2到位
                    {
                        Task.Delay(5).Wait();
                    }
                }
                if (morkF.TakeMaterialQueue.TryDequeue(out OrderLocInfo order))
                {
                    loc = order.MaterialLoc[0];
                    TakeBurden();
                    TurnReset(loc);//转台复位

                    DeviceProcessLogShow($"订单【{order.SuborderId}】，执行到转台{loc}位置取料");
                }
                //等待取料完成
                while (!morkF.TakeMaterialComplete)
                {
                    Task.Delay(5).Wait();
                }
                morkF.MainOrderMaterialCom = false;
                morkF.MainHasTakeMaterial = true;
                WriteData("M14.1", false);//机器人取料完成复位
            }
            if (morkF.MinorProessStatus)
            {
                if (morkF.MinorProcessPotLoc == 1)
                {
                    while (morkF.RoobotIdle || !morkF.PotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅1到位
                    {
                        Task.Delay(5).Wait();
                    }
                }
                else
                {
                    while (morkF.RoobotIdle || !morkF.SecondPotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅2到位
                    {
                        Task.Delay(5).Wait();
                    }
                }
                if (morkF.TakeMaterialQueue.TryDequeue(out OrderLocInfo order))
                {
                    loc = order.MaterialLoc[0];
                    TakeBurden();
                    TurnReset(loc);//转台复位

                    DeviceProcessLogShow($"订单【{order.SuborderId}】，执行到转台{loc}位置取料");
                }
                //等待取料完成
                while (!morkF.TakeMaterialComplete)
                {
                    Task.Delay(5).Wait();
                }
                morkF.MinorOrderMaterialCom = false;
                morkF.MinorHasTakeMaterial = true;
                WriteData("M14.5", false);//机器人取料完成复位
            }
            morkF.TurnTableLock = false;//转台互锁解除

        }
        /// <summary>
        /// 出餐
        /// </summary>
        private void OutDishTask()
        {
            //while (morkF.RoobotIdle || morkF.CleanModule || !morkF.ProvidePlateComplete)//等待条件满足
            //{
            //    Task.Delay(5).Wait();
            //}
            while (morkF.RoobotIdle || (!morkF.CleanModule && !morkF.SecondCleanModule) || !morkF.ProvidePlateComplete)//等待条件满足
            {
                Task.Delay(5).Wait();
            }
            if (morkF.TakePlateQueue.Count == 0)
            {
                WriteData("M0.7", false);//无订单关闭抽风机
            }
            RobotOutMeal();
            WriteData("M1.2", false);//供盘复位
            if (morkF.MainProcessStatus)
                DeviceProcessLogShow($"订单【{morkF.MainCurrentOrderId}】执行取锅到清洗台控制");
            if (morkF.MinorProessStatus)
                DeviceProcessLogShow($"订单【{morkF.MinorCurrentOrderId}】执行取锅到清洗台控制");

        }

        /// <summary>
        /// 洗锅放锅
        /// </summary>
        private void CleanPotTask()
        {
            while ((!morkF.PlaceRinseTableComplete || morkF.CleanModule) && (!morkF.PlaceRinseSecondTableComplete || morkF.SecondCleanModule))
            {
                Task.Delay(5).Wait();
            }
            if (morkF.MainProcessStatus)
            {
                WriteData("M14.2", false);//机器人出餐完成复位
                if (morkF.PlaceRinseTableComplete && morkF.CleanModule)
                {
                    CleanModuleControl("Start", 1);
                }
                if (morkF.PlaceRinseSecondTableComplete && morkF.SecondCleanModule)
                {
                    CleanModuleControl("Start", 2);
                }
                DeviceProcessLogShow($"订单【{morkF.MainCurrentOrderId}】执行清洗操作");
                morkF.MainProcessFlag = false;
                minorReset.Set();
            }
            if (morkF.MinorProessStatus)
            {
                WriteData("M14.6", false);//机器人出餐完成复位
                if (morkF.PlaceRinseTableComplete && morkF.CleanModule)
                {
                    CleanModuleControl("Start", 1);
                }
                if (morkF.PlaceRinseSecondTableComplete && morkF.SecondCleanModule)
                {
                    CleanModuleControl("Start", 2);
                }
                DeviceProcessLogShow($"订单【{morkF.MinorCurrentOrderId}】执行清洗操作");
                morkF.MinorProcessFlag = false;
                mainReset.Set();
            }
            //OrderChange(morkF.CurrentOrderId, ORDER_STATUS.COMPLETED_COOK);


        }
        /// <summary>
        /// 任务复位重启
        /// </summary>
        //private void ResetProgram()
        //{
        //    ThreadManage.GetInstance().StartLong(new Action(() =>
        //    {
        //        if (RTrig.GetInstance("ResetProgram").Start(morkF.DevicDataInite))
        //        {
        //            ThreadManage.GetInstance().StopTask("MainTask", new Action(() =>
        //            {
        //                ThreadManage.GetInstance().StopTask("ReadPLCData", new Action(() =>
        //                {
        //                    morkF = null;
        //                    morkF = new GVL_MorkF();
        //                    ActionManage.GetInstance.Send("ResetProgram");
        //                    ActionManage.GetInstance.Send("ClearOrders");
        //                    ReadData();
        //                    Main();
        //                }));
        //            }));
        //        }

        //        Thread.Sleep(10);
        //    }), "ResetProgram");
        //}
        /// <summary>
        /// 翻转机下降及状态检测
        /// </summary>
        public void TurnDownStatusDetect()
        {
            int potLoc = TurnMachineOrientControl("Down");

            if (potLoc == 1)
            {
                while (!morkF.TurnMachineDownComplete)//等待翻转机下降完成
                {
                    Task.Delay(5).Wait();
                }
                WriteData("M8.3", false);//下降完成复位 
            }
            if (potLoc == 2)
            {
                while (!morkF.SecondTurnMachineDownComplete)//等待翻转机下降完成
                {
                    Task.Delay(5).Wait();
                }
                WriteData("M8.7", false);//下降完成复位 
            }
            DeviceProcessLogShow($"翻转机下降完成");
            //if (morkF.MaterialCount == 3 && morkF.MainProcessStatus)
            //{
            //    morkF.MainProcessWait = true;
            //}
            //else if (morkF.MaterialCount == 3 && morkF.MinorProessStatus)
            //{ 
            //    morkF.MinorProcessWait = true;
            //}

        }

        /// <summary>
        /// 翻转机上升及状态检测
        /// </summary>
        public void TurnUpStatusDetect()
        {
            while (morkF.RoobotIdle)//机器人忙碌
            {
                Task.Delay(5).Wait();
            }
            TurnMachineOrientControl("Top");//翻转机上升
            if (morkF.MainProcessStatus)
            {
                if (morkF.MainProcessPotLoc == 1)
                {
                    while (!morkF.TurnMachineUpComplete)//等待翻转机上升完成以及取料完成
                    {
                        Task.Delay(5).Wait();
                    }
                    WriteData("M8.1", false);//上升完成复位 
                    if (!morkF.MainOrderMaterialCom)
                    {
                        WriteData("M14.3", true);//倒料
                        while (!morkF.FallMaterialComplete)//等待倒料完成
                        {
                            Task.Delay(5).Wait();
                        }
                        morkF.MaterialCount++;
                        WriteData("M14.3", false);//倒料复位
                        if (morkF.MaterialCount == 3)
                        {
                            //允许执行下一个订单流程
                            morkF.MaterialCount = 0;
                            morkF.MinorProcessFlag = true;

                        }
                        morkF.MainOrderMaterialCom = true;
                        morkF.MainHasTakeMaterial = false;
                        DeviceProcessLogShow($"订单【{morkF.MainCurrentOrderId}】，配料倒料完成");
                    }
                    else //辅程准备阻塞
                    {
                        morkF.MainProcessWait = true;
                    }
                }
                if (morkF.MainProcessPotLoc == 2)
                {
                    while (!morkF.SecondTurnMachineUpComplete)//等待翻转机上升完成以及取料完成
                    {
                        Task.Delay(5).Wait();
                    }
                    WriteData("M8.5", false);//上升完成复位 
                    if (!morkF.MainOrderMaterialCom)
                    {
                        WriteData("M14.7", true);//倒料
                        while (!morkF.SecondFallMaterialComplete)//等待倒料完成
                        {
                            Task.Delay(5).Wait();
                        }
                        morkF.MaterialCount++;
                        WriteData("M14.7", false);//倒料复位
                        if (morkF.MaterialCount == 3)
                        {
                            //允许执行下一个订单流程
                            morkF.MaterialCount = 0;
                            morkF.MinorProcessFlag = true;

                        }
                        morkF.MainOrderMaterialCom = true;
                        morkF.MainHasTakeMaterial = false;
                        DeviceProcessLogShow($"订单【{morkF.MinorCurrentOrderId}】，配料倒料完成");
                    }
                    else //辅流程准备阻塞
                    {
                        morkF.MainProcessWait = true;
                    }
                }
            }
            if (morkF.MinorProessStatus)
            {
                if (morkF.MinorProcessPotLoc == 1)
                {
                    while (!morkF.TurnMachineUpComplete)//等待翻转机上升完成以及取料完成
                    {
                        Task.Delay(5).Wait();
                    }
                    WriteData("M8.1", false);//上升完成复位 
                    if (!morkF.MinorOrderMaterialCom)
                    {
                        WriteData("M14.3", true);//倒料
                        while (!morkF.FallMaterialComplete)//等待倒料完成
                        {
                            Task.Delay(5).Wait();
                        }
                        morkF.MaterialCount++;
                        WriteData("M14.3", false);//倒料复位
                        if (morkF.MaterialCount == 3)
                        {
                            //允许执行下一个订单流程
                            morkF.MaterialCount = 0;
                            morkF.MainProcessFlag = true;

                        }
                        morkF.MinorOrderMaterialCom = true;
                        morkF.MinorHasTakeMaterial = false;
                        DeviceProcessLogShow($"订单【{morkF.MainCurrentOrderId}】，配料倒料完成");
                    }
                    else //主程准备阻塞
                    {
                        morkF.MinorProcessWait = true;
                    }
                }
                if (morkF.MinorProcessPotLoc == 2)
                {
                    while (!morkF.SecondTurnMachineUpComplete)//等待翻转机上升完成以及取料完成
                    {
                        Task.Delay(5).Wait();
                    }
                    WriteData("M8.5", false);//上升完成复位 
                    if (!morkF.MinorOrderMaterialCom)
                    {
                        WriteData("M14.7", true);//倒料
                        while (!morkF.SecondFallMaterialComplete)//等待倒料完成
                        {
                            Task.Delay(5).Wait();
                        }
                        morkF.MaterialCount++;
                        WriteData("M14.7", false);//倒料复位
                        if (morkF.MaterialCount == 3)
                        {
                            //允许执行下一个订单流程
                            morkF.MaterialCount = 0;
                            morkF.MainProcessFlag = true;

                        }
                        morkF.MinorOrderMaterialCom = true;
                        morkF.MinorHasTakeMaterial = false;
                        DeviceProcessLogShow($"订单【{morkF.MinorCurrentOrderId}】，配料倒料完成");
                    }
                    else //主流程准备阻塞
                    {
                        morkF.MinorProcessWait = true;
                    }
                }
            }
            //if (morkF.MainProcessStatus)//代表主流程执行的操作
            //{

            //}
            //else if (morkF.MinorProessStatus)//代表辅流程执行的操作
            //{

            //}

            DeviceProcessLogShow("翻转机上升完成");

        }
        private void GetStatus(string key, Action<bool[]> action)
        {
            if (peripheralStatus.ContainsKey(key))
            {
                action((bool[])peripheralStatus[key]);//获取PLC指定地址的状态值
            }
        }
        /// <summary>
        /// 写数据
        /// </summary>
        /// <param name="address"></param>
        /// <param name="value"></param>
        private void WriteData(string address, object value)
        {
            EventBus.EventBus.GetInstance().Publish(new WriteModel() { DeviceId = DeviceId, Address = address, Value = value });
        }

        public void FirstPotGears(int number)
        {
            switch (number)
            {
                case 0:
                    //if (morkF.MainProcessStatus && morkF.PotInPlace)
                    WriteData("M4.0", new bool[] { false, false, false, false, false, false, false, false });//0000 0000
                                                                                                             //if (morkF.MinorProessStatus && morkF.SecondPotInPlace)
                                                                                                             //    WriteData("M5.0", new bool[] { false, false, false, false, false, false, false, false });//0000 0000
                    break;
                case 1:
                    // if (morkF.MainProcessStatus)
                    WriteData("M4.0", new bool[] { true, false, false, false, false, false, false, false });//0000 0001
                                                                                                            //if (morkF.MinorProessStatus)
                                                                                                            //    WriteData("M5.0", new bool[] { true, false, false, false, false, false, false, false });//0000 0001
                    break;
                case 2:
                    //if (morkF.MainProcessStatus)
                    WriteData("M4.0", new bool[] { false, true, false, false, false, false, false, false });//0000 0010
                                                                                                            //if (morkF.MinorProessStatus)
                                                                                                            //    WriteData("M5.0", new bool[] { false, true, false, false, false, false, false, false });//0000 0010
                    break;
                case 3:
                    //if (morkF.MainProcessStatus)
                    WriteData("M4.0", new bool[] { true, true, false, false, false, false, false, false });//0000 0011
                                                                                                           //if (morkF.MinorProessStatus)
                                                                                                           //    WriteData("M5.0", new bool[] { true, true, false, false, false, false, false, false });//0000 0011
                    break;
                case 4:
                    // if (morkF.MainProcessStatus)
                    WriteData("M4.0", new bool[] { false, false, true, false, false, false, false, false });//0000 0100
                                                                                                            //if (morkF.MinorProessStatus)
                                                                                                            //    WriteData("M5.0", new bool[] { false, false, true, false, false, false, false, false });//0000 0100
                    break;
                case 5:
                    if (morkF.MainProcessStatus)
                        WriteData("M4.0", new bool[] { true, false, true, false, false, false, false, false });//0000 0101
                                                                                                               //if (morkF.MinorProessStatus)
                                                                                                               //    WriteData("M5.0", new bool[] { true, false, true, false, false, false, false, false });//0000 0101
                    break;
                case 6:
                    // if (morkF.MainProcessStatus)
                    WriteData("M4.0", new bool[] { false, true, true, false, false, false, false, false });//0000 0110
                                                                                                           //if (morkF.MinorProessStatus)
                                                                                                           //    WriteData("M5.0", new bool[] { false, true, true, false, false, false, false, false });//0000 0110
                    break;
                case 7:
                    // if (morkF.MainProcessStatus)
                    WriteData("M4.0", new bool[] { true, true, true, false, false, false, false, false });//0000 0111
                                                                                                          //if (morkF.MinorProessStatus)
                                                                                                          //    WriteData("M5.0", new bool[] { true, true, true, false, false, false, false, false });//0000 0111
                    break;
                case 8:
                    //if (morkF.MainProcessStatus)
                    WriteData("M4.0", new bool[] { false, false, false, true, false, false, false, false });//0000 1000
                                                                                                            //if (morkF.MinorProessStatus)
                                                                                                            //    WriteData("M5.0", new bool[] { false, false, false, true, false, false, false, false });//0000 1000
                    break;
                case 9:
                    //if (morkF.MainProcessStatus)
                    WriteData("M4.0", new bool[] { true, false, false, true, false, false, false, false });//0000 1001
                                                                                                           //if (morkF.MinorProessStatus)
                                                                                                           //    WriteData("M5.0", new bool[] { true, false, false, true, false, false, false, false });//0000 1001
                    break;

            }
        }

        public void SecondPotGears(int number)
        {
            switch (number)
            {
                case 0:
                    //if (morkF.MainProcessStatus && morkF.PotInPlace)
                    WriteData("M5.0", new bool[] { false, false, false, false, false, false, false, false });//0000 0000
                                                                                                             //if (morkF.MinorProessStatus && morkF.SecondPotInPlace)
                                                                                                             //    WriteData("M5.0", new bool[] { false, false, false, false, false, false, false, false });//0000 0000
                    break;
                case 1:
                    // if (morkF.MainProcessStatus)
                    WriteData("M5.0", new bool[] { true, false, false, false, false, false, false, false });//0000 0001
                                                                                                            //if (morkF.MinorProessStatus)
                                                                                                            //    WriteData("M5.0", new bool[] { true, false, false, false, false, false, false, false });//0000 0001
                    break;
                case 2:
                    //if (morkF.MainProcessStatus)
                    WriteData("M5.0", new bool[] { false, true, false, false, false, false, false, false });//0000 0010
                                                                                                            //if (morkF.MinorProessStatus)
                                                                                                            //    WriteData("M5.0", new bool[] { false, true, false, false, false, false, false, false });//0000 0010
                    break;
                case 3:
                    //if (morkF.MainProcessStatus)
                    WriteData("M5.0", new bool[] { true, true, false, false, false, false, false, false });//0000 0011
                                                                                                           //if (morkF.MinorProessStatus)
                                                                                                           //    WriteData("M5.0", new bool[] { true, true, false, false, false, false, false, false });//0000 0011
                    break;
                case 4:
                    // if (morkF.MainProcessStatus)
                    WriteData("M5.0", new bool[] { false, false, true, false, false, false, false, false });//0000 0100
                                                                                                            //if (morkF.MinorProessStatus)
                                                                                                            //    WriteData("M5.0", new bool[] { false, false, true, false, false, false, false, false });//0000 0100
                    break;
                case 5:
                    if (morkF.MainProcessStatus)
                        WriteData("M5.0", new bool[] { true, false, true, false, false, false, false, false });//0000 0101
                                                                                                               //if (morkF.MinorProessStatus)
                                                                                                               //    WriteData("M5.0", new bool[] { true, false, true, false, false, false, false, false });//0000 0101
                    break;
                case 6:
                    // if (morkF.MainProcessStatus)
                    WriteData("M5.0", new bool[] { false, true, true, false, false, false, false, false });//0000 0110
                                                                                                           //if (morkF.MinorProessStatus)
                                                                                                           //    WriteData("M5.0", new bool[] { false, true, true, false, false, false, false, false });//0000 0110
                    break;
                case 7:
                    // if (morkF.MainProcessStatus)
                    WriteData("M5.0", new bool[] { true, true, true, false, false, false, false, false });//0000 0111
                                                                                                          //if (morkF.MinorProessStatus)
                                                                                                          //    WriteData("M5.0", new bool[] { true, true, true, false, false, false, false, false });//0000 0111
                    break;
                case 8:
                    //if (morkF.MainProcessStatus)
                    WriteData("M5.0", new bool[] { false, false, false, true, false, false, false, false });//0000 1000
                                                                                                            //if (morkF.MinorProessStatus)
                                                                                                            //    WriteData("M5.0", new bool[] { false, false, false, true, false, false, false, false });//0000 1000
                    break;
                case 9:
                    //if (morkF.MainProcessStatus)
                    WriteData("M5.0", new bool[] { true, false, false, true, false, false, false, false });//0000 1001
                                                                                                           //if (morkF.MinorProessStatus)
                                                                                                           //    WriteData("M5.0", new bool[] { true, false, false, true, false, false, false, false });//0000 1001
                    break;

            }
        }
        /// <summary>
        /// 灶台档位调节
        /// </summary>
        public void KitchenAdjustGears(int number)
        {
            //while (!morkF.PotInPlace||!morkF.SecondPotInPlace)
            //{
            //    Task.Delay(5).Wait();
            //}
            if (morkF.MainProcessStatus)
            {
                if (morkF.MainProcessPotLoc == 1)
                {
                    while (!morkF.PotInPlace)
                    {
                        Task.Delay(5).Wait();
                    }
                    FirstPotGears(number);
                }
                if (morkF.MainProcessPotLoc == 2)
                {
                    while (!morkF.SecondPotInPlace)
                    {
                        Task.Delay(5).Wait();
                    }
                    SecondPotGears(number);
                }

            }
            if (morkF.MinorProessStatus)
            {
                if (morkF.MinorProcessPotLoc == 1)
                {
                    while (!morkF.PotInPlace)
                    {
                        Task.Delay(5).Wait();
                    }
                    FirstPotGears(number);
                }
                if (morkF.MinorProcessPotLoc == 2)
                {
                    while (!morkF.SecondPotInPlace)
                    {
                        Task.Delay(5).Wait();
                    }
                    SecondPotGears(number);
                }
            }
            if (morkF.MainProcessStatus)
                DeviceProcessLogShow($"订单【{morkF.MainCurrentOrderId}】执行取锅到灶台控制");
            if (morkF.MinorProessStatus)
                DeviceProcessLogShow($"订单【{morkF.MinorCurrentOrderId}】执行取锅到灶台控制");
        }
        /// <summary>
        /// PLC转台控制
        /// </summary>
        /// <param name="loc"></param>
        public void TurnMaterialStore(int loc)
        {
            switch (loc)
            {
                case 1:
                    WriteData("M13.0", true);
                    break;
                case 2:
                    WriteData("M13.1", true);
                    break;
                case 3:
                    WriteData("M13.2", true);
                    break;
                case 4:
                    WriteData("M13.3", true);
                    break;
                case 5:
                    WriteData("M13.4", true);
                    break;
            }

        }
        public void PLCInite()
        {
            WriteData("M0.0", true);

        }
        /// <summary>
        /// 供盘启动
        /// </summary>
        public void StartTakePlate()
        {
            WriteData("M1.1", true);
        }
        /// <summary>
        /// 取锅到灶台
        /// </summary>
        public void TakePotToKitchen(int loc)
        {
            if (loc == 1)
                WriteData("M14.0", true);
            if (loc == 2)
                WriteData("M14.4", true);
        }
        /// <summary>
        /// 机器人出餐并将锅放置清洗台位置
        /// </summary>
        public void RobotOutMeal()
        {
            if (morkF.MainProcessStatus)
            {
                if (morkF.MainProcessPotLoc == 1)
                {
                    WriteData("M14.2", true);//1号锅出餐 
                }
                else if (morkF.MainProcessPotLoc == 2)
                {
                    WriteData("M14.6", true);//2号锅出餐
                }
            }
            if (morkF.MinorProessStatus)
            {
                if (morkF.MinorProcessPotLoc == 1)
                {
                    WriteData("M14.2", true);//1号锅出餐 
                }
                else if (morkF.MinorProcessPotLoc == 2)
                {
                    WriteData("M14.6", true);//2号锅出餐
                }
            }

        }
        public void OpenDraft()
        {
            WriteData("M0.7", true);//打开抽风机
        }
        /// <summary>
        /// 注油
        /// </summary>
        public void AddOil()
        {
            if (morkF.MainProcessStatus)
            {
                if (morkF.MainProcessPotLoc == 1)
                {
                    while (!morkF.PotInPlace)
                    {
                        Task.Delay(5).Wait();
                    }
                    WriteData("M2.7", true);//加油
                    OpenDraft();
                    DeviceProcessLogShow("开始注油");
                    while (!morkF.FallOilComplete)
                    {
                        Task.Delay(5).Wait();
                    }
                }
                if (morkF.MainProcessPotLoc == 2)
                {
                    while (!morkF.SecondPotInPlace)
                    {
                        Task.Delay(5).Wait();
                    }
                    WriteData("M3.1", true);//加油
                    OpenDraft();
                    DeviceProcessLogShow("开始注油");
                    while (!morkF.SecondOilComplete)
                    {
                        Task.Delay(5).Wait();
                    }
                }

            }
            if (morkF.MinorProessStatus)
            {
                if (morkF.MinorProcessPotLoc == 1)
                {
                    while (!morkF.PotInPlace)
                    {
                        Task.Delay(5).Wait();
                    }
                    WriteData("M2.7", true);//加油
                    OpenDraft();
                    DeviceProcessLogShow("开始注油");
                    while (!morkF.FallOilComplete)
                    {
                        Task.Delay(5).Wait();
                    }
                }
                if (morkF.MinorProcessPotLoc == 2)
                {
                    while (!morkF.SecondPotInPlace)
                    {
                        Task.Delay(5).Wait();
                    }
                    WriteData("M3.1", true);//加油
                    OpenDraft();
                    DeviceProcessLogShow("开始注油");
                    while (!morkF.SecondOilComplete)
                    {
                        Task.Delay(5).Wait();
                    }
                }
            }
            //while (!morkF.FallOilComplete || !morkF.SecondOilComplete)
            //{
            //    Task.Delay(5).Wait();
            //}
            DeviceProcessLogShow("注油完成");

        }
        public void FirstPotTurnMachine(string orientation)
        {
            switch (orientation)
            {
                case "Top": WriteData("M8.0", true); break;
                case "Down": WriteData("M8.2", true); break;
            }
        }
        public void SecondPotTurnMachine(string orientation)
        {
            switch (orientation)
            {
                case "Top": WriteData("M8.4", true); break;
                case "Down": WriteData("M8.6", true); break;
            }
        }

        /// <summary>
        /// 翻转机方向控制
        /// </summary>
        /// <param name="orientation"></param>
        public int TurnMachineOrientControl(string orientation)
        {
            int potLoc = 0; ;
            //switch (orientation)
            //{
            //    case "Top": if (morkF.MainProcessStatus) WriteData("M8.0", true); if (morkF.MinorProessStatus) WriteData("M8.4", true); break;
            //    case "Down": if (morkF.MainProcessStatus) WriteData("M8.2", true); if (morkF.MinorProessStatus) WriteData("M8.6", true); break;
            //}
            if (morkF.MainProcessStatus)
            {
                if (morkF.MainProcessPotLoc == 1)
                {
                    FirstPotTurnMachine(orientation);
                    potLoc = 1;
                }
                if (morkF.MainProcessPotLoc == 2)
                {
                    SecondPotTurnMachine(orientation);
                    potLoc = 2;
                }
            }
            if (morkF.MinorProessStatus)
            {
                if (morkF.MinorProcessPotLoc == 1)
                {
                    FirstPotTurnMachine(orientation);
                    potLoc = 1;
                }
                if (morkF.MinorProcessPotLoc == 2)
                {
                    SecondPotTurnMachine(orientation);
                    potLoc = 2;
                }
            }
            DeviceProcessLogShow($"翻转机执行{orientation}操作");
            return potLoc;
        }

        public void FirstPotTurnMachine(int gear)
        {
            while (!morkF.PotInPlace)
            {
                Task.Delay(5).Wait();
            }
            switch (gear)
            {
                case 0: WriteData("M7.0", true); Task.Delay(1000).Wait(); break;//关闭翻炒机
                case 1: WriteData("M7.1", true); break;//翻炒机1挡
                case 2: WriteData("M7.2", true); break;//翻炒机2挡
                case 3: WriteData("M7.3", true); break;//翻炒机3挡
            }
        }
        public void SecondPotTurnMachine(int gear)
        {
            while (!morkF.SecondPotInPlace)
            {
                Task.Delay(5).Wait();
            }
            switch (gear)
            {
                case 0: WriteData("M7.4", true); Task.Delay(1000).Wait(); break;//关闭翻炒机
                case 1: WriteData("M7.5", true); break;//翻炒机1挡
                case 2: WriteData("M7.6", true); break;//翻炒机2挡
                case 3: WriteData("M7.7", true); break;//翻炒机3挡
            }
        }

        /// <summary>
        /// 翻转机档位控制
        /// </summary>
        public void TurnMachineGearsControl(int gear)
        {
            //while (!morkF.PotInPlace)
            //{
            //    Task.Delay(5).Wait();
            //}
            if (morkF.MainProcessStatus)
            {
                if (morkF.MainProcessPotLoc == 1)
                {
                    FirstPotTurnMachine(gear);
                }
                if (morkF.MainProcessPotLoc == 2)
                {
                    SecondPotTurnMachine(gear);
                }
            }
            if (morkF.MinorProessStatus)
            {
                if (morkF.MinorProcessPotLoc == 1)
                {
                    FirstPotTurnMachine(gear);
                }
                if (morkF.MinorProcessPotLoc == 2)
                {
                    SecondPotTurnMachine(gear);
                }
            }
            DeviceProcessLogShow($"翻转机档位调至{gear}挡");
        }
        /// <summary>
        /// 取A,B,C料
        /// </summary>
        public void TakeBurden()
        {
            if (morkF.MainProcessStatus && morkF.PotInPlace)
                WriteData("M14.1", true);//机器人倒料至1号锅
            if (morkF.MinorProessStatus && morkF.SecondPotInPlace)
                WriteData("M14.5", true);//机器人倒料至2号锅
        }
        /// <summary>
        /// 清洗模组1启停控制
        /// </summary>
        public void CleanModuleControl(string status, int loc)
        {
            if (loc == 1)
            {
                if (status == "Start")
                {
                    WriteData("M1.4", true);
                }
                if (status == "Stop")
                {
                    WriteData("M1.4", false);
                }
                DeviceProcessLogShow($"清洗模组1执行【{status}】操作");
            }
            if (loc == 2)
            {
                if (status == "Start")
                {
                    WriteData("M1.7", true);
                }
                if (status == "Stop")
                {
                    WriteData("M1.7", false);
                }
                DeviceProcessLogShow($"清洗模组2执行【{status}】操作");
            }
        }

        public override void Stop()
        {

        }

        public override void SimOrder()
        {

        }
    }
}