using System; using HBLConsole.Interface; using HBLConsole.Service; using HBLConsole.Communication; using BPA.Message; using HBLConsole.Model; using System.Linq; using System.Threading; using HBLConsole.Factory; using BPA.Message.Enum; namespace HBLConsole.MORKD { public class Control_MORKD : IControl { #region 单例模式 private static Control_MORKD _instance; public static Control_MORKD Instance { get { if (_instance == null) _instance = new Control_MORKD(); return _instance; } } public Control_MORKD() { } #endregion GVL_MORKD mORKD = new GVL_MORKD(); public void ConnectOk() { Main(); ReadData(); } public object GetT() { return mORKD; } public void DataParse(T order) { if (order is MorkOrderPush morkOrderPush) { foreach (var item in morkOrderPush.GoodBatchings) { var res = Json.Data.orderMaterialDelivery.BatchingInfo.FirstOrDefault(p => p.BatchingId == item.BatchingId); if (res != null) { if (ushort.TryParse(res.BatchingLoc, out ushort loc)) { if (loc >= 1 && loc <= 5) { mORKD.RBTakeNoodleTask.Enqueue(new OrderLocInfo() { Loc = loc, SuborderId = morkOrderPush.SuborderId, BatchingId = res.BatchingId }); } else if (loc >= 6 && loc <= 10) { mORKD.TakeSoupTask.Enqueue(new OrderLocInfo() { Loc = loc, SuborderId = morkOrderPush.SuborderId }); } else if (loc >= 11 && loc <= 12) { mORKD.TakeBowlTask.Enqueue(new OrderLocInfo() { Loc = loc, SuborderId = morkOrderPush.SuborderId }); } } } } } } public void Init() { ActionOperate.GetInstance.Register(new Action(() => { mORKD.InitControl(); }), "InitCommand"); } public void Main() { ThreadOperate.GetInstance.StartLong(new Action(() => { mORKD.AllowRun = mORKD.InitComplete && !mORKD.TemperatureReached; TakeBowlTask(); TakeNoodleTask(); OutNoodleTask(); SingleDetect(); TurntableControl(); OutSoupTask(); TakeSoupTask(); Thread.Sleep(100); }), "MainTask"); } public void ReadData() { ModbusTcpHelper.GetInstance.Readbool(1120, 29, new Action((bools) => { mORKD.InitComplete = bools[0]; mORKD.TurntableInPlace = bools[1]; mORKD.RBTakeNoodleComplete = bools[2]; for (int i = 0; i < 2; i++) { mORKD.AxisIdle[i] = bools[3 + i]; mORKD.AxisAllowInvertedNoodle[i] = bools[5 + i]; mORKD.AxisAllowInvertedSoup[i] = bools[7 + i]; mORKD.SoupHeatComplete[i] = bools[9 + i]; mORKD.BreakMechanismIdle[i] = bools[25 + i]; } for (int i = 0; i < 6; i++) { mORKD.CookNoodleBasketIdle[i] = bools[11 + i]; mORKD.CookNoodleComplete[i] = bools[17 + i]; } mORKD.TakeNoodleRobotIdle = bools[23]; mORKD.TakeSoupRobotIdle = bools[24]; mORKD.TakeSoupComplete = bools[27]; mORKD.PutNoodleTakeMealComplete = bools[28]; })); ModbusTcpHelper.GetInstance.Readbool(1200, 11, new Action((bools) => { mORKD.TurntableLowerLimit = bools[0]; mORKD.TurntableUpLimit = bools[1]; for (int i = 0; i < 5; i++) { mORKD.SoupMaterialShortage[i] = bools[2 + i]; } for (int i = 0; i < 3; i++) { mORKD.OutMealDetect[i] = bools[7 + i]; } mORKD.TemperatureReached = bools[10]; })); } public void SimOrder(T simOrder) { if (simOrder != null) { if (simOrder is SimOrderData simOrderData) { string subId = Guid.NewGuid().ToString(); mORKD.RBTakeNoodleTask.Enqueue(new OrderLocInfo() { Loc = simOrderData.NoodleLoc, SuborderId = subId }); mORKD.TakeBowlTask.Enqueue(new OrderLocInfo() { Loc = simOrderData.BowlLoc, SuborderId = subId }); mORKD.TakeSoupTask.Enqueue(new OrderLocInfo() { Loc = simOrderData.SoupLoc, SuborderId = subId }); MessageLog.GetInstance.Show($"添加订单:面条位置【{simOrderData.NoodleLoc}】,浇头位置【{simOrderData.SoupLoc}】,碗位置【{simOrderData.BowlLoc}】"); } } } /// /// 取碗控制 /// private void TakeBowlTask() { mORKD.AxisIdleIndex = mORKD.AxisIdle.GetIndex(true); mORKD.AxisIdleLockIndex = mORKD.AxisIdleLock.GetIndex(false); if (mORKD.AxisIdleLockIndex == mORKD.AxisIdleIndex) { if (mORKD.AxisIdleIndex >= 0 && mORKD.AxisIdleIndex <= 1) { if (mORKD.AllowRun && mORKD.TakeBowlTask.Count > 0) { if (mORKD.TakeBowlTask.TryDequeue(out OrderLocInfo orderLocInfo)) { mORKD.AxisAllowInvertedNoodleID[mORKD.AxisIdleIndex] = orderLocInfo.SuborderId; mORKD.DropBowlStart((ushort)mORKD.AxisIdleIndex, orderLocInfo.Loc); mORKD.AxisIdleLock[mORKD.AxisIdleLockIndex] = true; MessageLog.GetInstance.Show($"执行取碗控制,位置:[{orderLocInfo.Loc}]"); } } } } } /// /// 转台控制 /// private void TurntableControl() { if (mORKD.InitComplete && !mORKD.TurntableInterlock && !mORKD.AllowTakeNoodle && mORKD.RBTakeNoodleTask.Count > 0) { var result = Json.Data.orderMaterialDelivery.BatchingInfo.Where(p => p.BatchingId == mORKD.RBTakeNoodleTask.ElementAt(0).BatchingId).ToList(); if (result != null) { foreach (var item in result) { if (ushort.TryParse(item.BatchingLoc, out ushort loc)) { if (!mORKD.TurntableLocLists.Contains(loc)) { mORKD.TurntableStart(loc); return; } } } } } //转台到位检测 if (RTrig.GetInstance("TurntableInPlace").Start(mORKD.TurntableInPlace)) { if (mORKD.TurntableInterlock) { if (mORKD.TurntableLowerLimit) { mORKD.TurntableLocLists.Clear(); mORKD.AllowTakeNoodle = true; } else { mORKD.TurntableInterlock = false; mORKD.AllowTakeNoodle = false; } } } } /// /// 取面任务 /// private void TakeNoodleTask() { //取面控制 if (mORKD.AllowRun && mORKD.TakeNoodleRobotIdle && !mORKD.RobotTaskInterlock && mORKD.AllowTakeNoodle) { if (mORKD.TurntableInPlace && !mORKD.OutNoodleing && mORKD.RBTakeNoodleTask.Count > 0) { int loc = mORKD.CookNoodleBasketIdle.GetIndex(false);//查找煮面炉空闲位置 if (loc >= 0 && loc <= 5) { if (mORKD.RBTakeNoodleTask.TryDequeue(out OrderLocInfo orderLocInfo)) { mORKD.RBTakeNoodleStart((ushort)(loc + 1), orderLocInfo.Loc); mORKD.CookNodelId[loc] = orderLocInfo.SuborderId; SimpleFactory.GetInstance.OrderChanged(orderLocInfo.SuborderId, ORDER_STATUS.COOKING); MessageLog.GetInstance.Show($"订单【{orderLocInfo.SuborderId}】,煮面栏:[{loc + 1}]"); mORKD.TakeNoodleInterlock = true; } } } } //机器人取面完成信号检测 if (RTrig.GetInstance("TakeNoodleComplete").Start(mORKD.RBTakeNoodleComplete)) { mORKD.TakeNoodleInterlock = false; mORKD.AllowTakeNoodle = false; MessageLog.GetInstance.Show("转台取面完成"); mORKD.TakeNoodleCompleteReset(); } } /// /// 出餐控制 /// private void OutNoodleTask() { for (ushort i = 0; i < 6; i++) { if (RTrig.GetInstance($"CookNoodleCompleteTask{i}").Start(mORKD.CookNoodleComplete[i])) { mORKD.CookNoodleCompleteTask.Enqueue(i); } } if (mORKD.RobotTaskInterlock && !mORKD.TakeNoodleInterlock && mORKD.TakeNoodleRobotIdle) { if (mORKD.CookNoodleCompleteTask.Count > 0) { string id = mORKD.CookNodelId[mORKD.CookNoodleCompleteTask.ElementAt(0)]; int index = mORKD.AxisAllowInvertedNoodleID.GetIndex(id); if (index >= 0 && index <= 1) { if (mORKD.AxisAllowInvertedNoodle[index]) { if (mORKD.CookNoodleCompleteTask.TryDequeue(out ushort loc)) { mORKD.OutNoodleing = true; mORKD.RBOutNoodleStart((ushort)(loc + 1), (ushort)(index + 1)); mORKD.AxisIdleLock[index] = false; mORKD.AxisAllowInvertedSoupID[index] = mORKD.AxisAllowInvertedNoodleID[index]; mORKD.AxisAllowInvertedNoodleID[index] = string.Empty; MessageLog.GetInstance.Show($"从{loc + 1}号位置取面"); MessageLog.GetInstance.Show($"倒入{index + 1}号碗位置"); } } } } } int mlCount = mORKD.CookNoodleBasketIdle.Where(p => p == true).ToList().Count; mORKD.RobotTaskInterlock = mORKD.CookNoodleCompleteTask.Count > 0 && (mlCount >= 2 || mORKD.RBTakeNoodleTask.Count == 0); } /// /// 取浇头控制 /// private void TakeSoupTask() { int index = mORKD.BreakMechanismIdle.GetIndex(true); if (index >= 0 && index <= 1) { if (mORKD.TakeSoupTask.Count > 0 && !mORKD.AllowTakeSoup && mORKD.TakeSoupRobotIdle && mORKD.AllowRun) { if (mORKD.TakeSoupTask.TryDequeue(out OrderLocInfo orderLocInfo)) { mORKD.SoupHeatCompleteID[index] = orderLocInfo.SuborderId; mORKD.RBTakeSoupStart(orderLocInfo.Loc, (ushort)(index + 1)); SimpleFactory.GetInstance.OrderChanged(orderLocInfo.SuborderId, ORDER_STATUS.COOKING); } } } if (RTrig.GetInstance("TakeSoupComplete").Start(mORKD.TakeSoupComplete)) { mORKD.AllowTakeSoup = false; MessageLog.GetInstance.Show("取浇头完成"); mORKD.TakeSoupCompleteReset(); } } /// /// 浇头加热完成出浇头控制 /// private void OutSoupTask() { if (!mORKD.AllowTakeSoup && !mORKD.AllowPutSoup && mORKD.TakeSoupRobotIdle) { mORKD.PutNoodleLoc = mORKD.OutMealDetect.GetIndex(false); if (mORKD.PutNoodleLoc >= 0 && mORKD.PutNoodleLoc <= 2) { for (int i = 0; i < 2; i++) { if (mORKD.SoupHeatComplete[i] && mORKD.SoupHeatCompleteID[i].Length > 0) { for (int m = 0; m < 2; m++) { if (mORKD.AxisAllowInvertedSoup[m] && mORKD.AxisAllowInvertedSoupID[m].Length > 0) { if (mORKD.SoupHeatCompleteID[i] == mORKD.AxisAllowInvertedSoupID[m]) { mORKD.HeatCompleteTakeSoupStart((ushort)(i + 1), (ushort)(m + 1), (ushort)(mORKD.PutNoodleLoc + 1)); mORKD.OutMealId[mORKD.PutNoodleLoc] = mORKD.AxisAllowInvertedSoupID[m]; mORKD.AxisAllowInvertedSoupID[m] = string.Empty; mORKD.SoupHeatCompleteID[i] = string.Empty; } } } } } } } if (RTrig.GetInstance("PutNoodleTakeMealComplete").Start(mORKD.PutNoodleTakeMealComplete)) { mORKD.AllowPutSoup = false; SimpleFactory.GetInstance.OrderChanged(mORKD.OutMealId[mORKD.PutNoodleLoc], ORDER_STATUS.COMPLETED_COOK); mORKD.PutNoodleTakeMealCompleteReset(); } } /// /// 信号检测 /// private void SingleDetect() { } } }