using BPASmartClient.CustomResource.Pages.Model; using BPASmartClient.Helper; using BPASmartClient.JXJFoodSmallStation.Model.HK_PLC; using BPASmartClient.JXJFoodSmallStation.Model.Siemens; using BPASmartClient.Modbus; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Configuration; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace BPASmartClient.JXJFoodSmallStation.Model { public class ProcessControl { private volatile static ProcessControl _Instance; public static ProcessControl GetInstance => _Instance ?? (_Instance = new ProcessControl()); private ProcessControl() { } public ObservableCollection RawMaterials { get; set; } = new ObservableCollection(); /// /// 配方数据 /// public ObservableCollection RemoteRecipes = new ObservableCollection(); /// /// 原料的名称和料仓的位置对应 /// public Dictionary RawMaterialsNamePos = new Dictionary(); /// /// 配方队列 /// public ConcurrentQueue RecipeQueue = new ConcurrentQueue(); public SiemensDeviceStatus SiemensDevice = new SiemensDeviceStatus(); public HKDeviceStatus HKDevice = new HKDeviceStatus(); GVL_SmallStation SmallStation = new GVL_SmallStation(); XL_Finish_DB RecipeFinishInfo = new XL_Finish_DB(); /// /// 接收原料数据 /// public RecipeRawMaterial RawMaterial; public void Init() { for (int i = 0; i < 16; i++) { if (DeviceInquire.GetInstance.GetDevice(i).DeviceName != null) { if (!RawMaterialsNamePos.ContainsKey(DeviceInquire.GetInstance.GetDevice(i).DeviceName)) { RawMaterialsNamePos.Add(DeviceInquire.GetInstance.GetDevice(i).DeviceName, (short)DeviceInquire.GetInstance.GetDevice(i).deviceStatus.DeviceNum); } } } ActionManage.GetInstance.Register(new Action((res) => { if (SiemensDevice.IsConnected) { if (res != null) { RawMaterials.Clear(); for (int i = 0; i < 15; i++) { if (RawMaterialsNamePos.ContainsKey(res.Material[i].Material_Name)) { RawMaterials.Add(new RemoteRecipeRawMaterial() { RawMaterialName = res.Material[i].Material_Name, RawMaterialBarrelNum = res.Material[i].Material_BarrelNum, RawMaterialWeight = res.Material[i].Material_Weight, RawMaterialLocation = (int)RawMaterialsNamePos[res.Material[i].Material_Name] }); } else { //报警,配方的原料名称下发和设备不一致 } } Json.Data.Recipes.Add(new RemoteRecipeData() { RecipeName = res.RecipeName, RecipeCode = res.RecipeCode, RawMaterial = RawMaterials, TrayCode = res.TrayCode }); } } }), "西门子下发配方", true); string HK_PLC_IP = ConfigurationManager.AppSettings["HKPlc_IP"]; string Siemens_PLC_IP = ConfigurationManager.AppSettings["Siemens_IP"]; try { HKDevice.HK_PLC_S7.Connect(S7.Net.CpuType.S71200, HK_PLC_IP); //SiemensDevice.Siemens_PLC_S7.Connect(S7.Net.CpuType.S71500, Siemens_PLC_IP); if (HKDevice.IsConnected) { HKDevice.Init(); } if (SiemensDevice.IsConnected) { SiemensDevice.Init(); } } catch(Exception ex) { } RecipeQueue.Clear(); //Json.Data.Recipes = TestData.GetInstance.Recipes;//添加测试数据 ThreadManage.GetInstance().StartLong(new Action(() => { ReceviceData(); RecipeInfoToHKPLC(); Thread.Sleep(10); }), "流程处理", true); ThreadManage.GetInstance().StartLong(new Action(() => { if (SiemensDevice.IsConnected && HKDevice.IsConnected) { /*AgvGetInDelivery(); AgvGetInPickUp();*/ } Thread.Sleep(10); }), "AGV进站送取货", true); ThreadManage.GetInstance().StartLong(new Action(() => { if (HKDevice.IsConnected) { ManualOpen(); ManualClose(); } Thread.Sleep(10); }), "手动操作", true); } private void ManualOpen() { ActionManage.GetInstance.Register(new Action((o) => { if (o != null) { if (o.ToString().Contains("升降气缸")) { int index = Convert.ToInt16(o.ToString().Substring(o.ToString().Length - 1)); switch (index) { case 1: HKDevice.HK_PLC_S7.Write("", true); break; case 2: HKDevice.HK_PLC_S7.Write("", true); break; case 3: HKDevice.HK_PLC_S7.Write("", true); break; case 4: HKDevice.HK_PLC_S7.Write("", true); break; case 5: HKDevice.HK_PLC_S7.Write("", true); break; case 6: HKDevice.HK_PLC_S7.Write("", true); break; case 7: HKDevice.HK_PLC_S7.Write("", true); break; case 8: HKDevice.HK_PLC_S7.Write("", true); break; case 9: HKDevice.HK_PLC_S7.Write("", true); break; case 10: HKDevice.HK_PLC_S7.Write("", true); break; case 11: HKDevice.HK_PLC_S7.Write("", true); break; case 12: HKDevice.HK_PLC_S7.Write("", true); break; case 13: HKDevice.HK_PLC_S7.Write("", true); break; case 14: HKDevice.HK_PLC_S7.Write("", true); break; case 15: HKDevice.HK_PLC_S7.Write("", true); break; default: break; } } else if (o.ToString().Contains("阻挡气缸")) { int index = Convert.ToInt16(o.ToString().Substring(o.ToString().Length - 1)); switch (index) { case 1: HKDevice.HK_PLC_S7.Write("", true); break; case 2: HKDevice.HK_PLC_S7.Write("", true); break; case 3: HKDevice.HK_PLC_S7.Write("", true); break; case 4: HKDevice.HK_PLC_S7.Write("", true); break; case 5: HKDevice.HK_PLC_S7.Write("", true); break; case 6: HKDevice.HK_PLC_S7.Write("", true); break; case 7: HKDevice.HK_PLC_S7.Write("", true); break; case 8: HKDevice.HK_PLC_S7.Write("", true); break; case 9: HKDevice.HK_PLC_S7.Write("", true); break; case 10: HKDevice.HK_PLC_S7.Write("", true); break; case 11: HKDevice.HK_PLC_S7.Write("", true); break; case 12: HKDevice.HK_PLC_S7.Write("", true); break; case 13: HKDevice.HK_PLC_S7.Write("", true); break; case 14: HKDevice.HK_PLC_S7.Write("", true); break; case 15: HKDevice.HK_PLC_S7.Write("", true); break; default: break; } } else if (o.ToString().Contains("托盘气缸")) { int index = Convert.ToInt16(o.ToString().Substring(o.ToString().Length - 1)); switch (index) { case 1: HKDevice.HK_PLC_S7.Write("", true); break; case 2: HKDevice.HK_PLC_S7.Write("", true); break; default: break; } } } }), "ManualOpen", true);//根据下发的配方ID将 托盘的位置信息添加到配方中 } private void ManualClose() { ActionManage.GetInstance.Register(new Action((o) => { if (o != null) { if (o.ToString().Contains("升降气缸")) { int index = Convert.ToInt16(o.ToString().Substring(o.ToString().Length - 1)); switch (index) { case 1: HKDevice.HK_PLC_S7.Write("", false); break; case 2: HKDevice.HK_PLC_S7.Write("", false); break; case 3: HKDevice.HK_PLC_S7.Write("", false); break; case 4: HKDevice.HK_PLC_S7.Write("", false); break; case 5: HKDevice.HK_PLC_S7.Write("", false); break; case 6: HKDevice.HK_PLC_S7.Write("", false); break; case 7: HKDevice.HK_PLC_S7.Write("", false); break; case 8: HKDevice.HK_PLC_S7.Write("", false); break; case 9: HKDevice.HK_PLC_S7.Write("", false); break; case 10: HKDevice.HK_PLC_S7.Write("", false); break; case 11: HKDevice.HK_PLC_S7.Write("", false); break; case 12: HKDevice.HK_PLC_S7.Write("", false); break; case 13: HKDevice.HK_PLC_S7.Write("", false); break; case 14: HKDevice.HK_PLC_S7.Write("", false); break; case 15: HKDevice.HK_PLC_S7.Write("", false); break; default: break; } } else if (o.ToString().Contains("阻挡气缸")) { int index = Convert.ToInt16(o.ToString().Substring(o.ToString().Length - 1)); switch (index) { case 1: HKDevice.HK_PLC_S7.Write("", false); break; case 2: HKDevice.HK_PLC_S7.Write("", false); break; case 3: HKDevice.HK_PLC_S7.Write("", false); break; case 4: HKDevice.HK_PLC_S7.Write("", false); break; case 5: HKDevice.HK_PLC_S7.Write("", false); break; case 6: HKDevice.HK_PLC_S7.Write("", false); break; case 7: HKDevice.HK_PLC_S7.Write("", false); break; case 8: HKDevice.HK_PLC_S7.Write("", false); break; case 9: HKDevice.HK_PLC_S7.Write("", false); break; case 10: HKDevice.HK_PLC_S7.Write("", false); break; case 11: HKDevice.HK_PLC_S7.Write("", false); break; case 12: HKDevice.HK_PLC_S7.Write("", false); break; case 13: HKDevice.HK_PLC_S7.Write("", false); break; case 14: HKDevice.HK_PLC_S7.Write("", false); break; case 15: HKDevice.HK_PLC_S7.Write("", false); break; default: break; } } else if (o.ToString().Contains("托盘气缸")) { int index = Convert.ToInt16(o.ToString().Substring(o.ToString().Length - 1)); switch (index) { case 1: HKDevice.HK_PLC_S7.Write("", false); break; case 2: HKDevice.HK_PLC_S7.Write("", false); break; default: break; } } } }), "ManualClose", true);//根据下发的配方ID将 托盘的位置信息添加到配方中 } /// /// AGV进站送货 /// private void AgvGetInDelivery() { switch (SmallStation.AgvDeliveryPosition) { case 0: if (RTrig.GetInstance("").Start(SiemensDevice.Siemens_PLC_S7.Read(SiemensCommAddress.DeliveryAGVApply) is bool)) { SmallStation.AgvDeliveryPosition = 1; HKDevice.HK_PLC_S7.Write(HKPlcCommAddress.DeliveryAGVApply, true); } break; case 1: if (RTrig.GetInstance("").Start(HKDevice.HK_PLC_S7.Read(HKPlcCommAddress.DeliveryAGVIsApply))) { SmallStation.AgvDeliveryPosition = 2; SiemensDevice.Siemens_PLC_S7.Write(SiemensCommAddress.DeliveryAGVIsApply, true); } break; case 2: if (RTrig.GetInstance("").Start(SiemensDevice.Siemens_PLC_S7.Read(SiemensCommAddress.DeliveryAGVApplyJack) is bool)) { SmallStation.AgvDeliveryPosition = 3; HKDevice.HK_PLC_S7.Write(HKPlcCommAddress.DeliveryAGVApplyJack, true); } break; case 3: if (RTrig.GetInstance("").Start(HKDevice.HK_PLC_S7.Read(HKPlcCommAddress.DeliveryAGVIsApplyJack))) { SmallStation.AgvDeliveryPosition = 4; SiemensDevice.Siemens_PLC_S7.Write(SiemensCommAddress.DeliveryAGVIsApplyJack, true); } break; case 4: if (RTrig.GetInstance("").Start(SiemensDevice.Siemens_PLC_S7.Read(SiemensCommAddress.DeliveryAGVFinsih) is bool)) { SmallStation.AgvDeliveryPosition = 5; HKDevice.HK_PLC_S7.Write(HKPlcCommAddress.DeliveryAGVFinsih, true); } break; case 5: if (RTrig.GetInstance("").Start(HKDevice.HK_PLC_S7.Read(HKPlcCommAddress.StationHaveCargo))) { SmallStation.AgvDeliveryPosition = 0; SiemensDevice.Siemens_PLC_S7.Write(SiemensCommAddress.StationHaveCargo, true); } break; default: break; } //获取工位上是否有小车 SiemensDevice.Siemens_PLC_S7.Write(SiemensCommAddress.StationIsExistCar, (bool) HKDevice.HK_PLC_S7.Read(HKPlcCommAddress.StationIsExistTray)); } /// /// AGV进站取货 /// private void AgvGetInPickUp() { switch (SmallStation.AgvPickUpPosition) { case 0: if (RTrig.GetInstance("").Start(SiemensDevice.Siemens_PLC_S7.Read(SiemensCommAddress.PickAGVApply))) { SmallStation.AgvPickUpPosition = 1; HKDevice.HK_PLC_S7.Write(HKPlcCommAddress.PickAGVApply, true); } break; case 1: if (RTrig.GetInstance("").Start(HKDevice.HK_PLC_S7.Read(HKPlcCommAddress.PickAGVIsApply))) { SmallStation.AgvPickUpPosition = 2; SiemensDevice.Siemens_PLC_S7.Write(SiemensCommAddress.PickAGVIsApply, true); } break; case 2: if (RTrig.GetInstance("").Start(SiemensDevice.Siemens_PLC_S7.Read(SiemensCommAddress.PickCargoAGVFinish) is bool)) { SmallStation.AgvPickUpPosition = 3; HKDevice.HK_PLC_S7.Write(HKPlcCommAddress.PickCargoAGVFinish, true); } break; case 3: if (RTrig.GetInstance("").Start(HKDevice.HK_PLC_S7.Read(HKPlcCommAddress.PickAGVFinish))) { SmallStation.AgvPickUpPosition = 0; SiemensDevice.Siemens_PLC_S7.Write(SiemensCommAddress.PickAGVFinish, true); } break; default: break; } } /// /// 将配方添加到配方队列中 /// private void ReceviceData() { RemoteRecipes = Json.Data.Recipes; if (RemoteRecipes.Count > 0) { foreach (var data in RemoteRecipes) { if (!(RecipeQueue.Contains(data.RecipeCode))) RecipeQueue.Enqueue(data.RecipeCode); } } } /// /// 执行配方队列中的第一个配方 /// private void RecipeInfoToHKPLC() { if (RecipeQueue.Count > 0) { int index = Array.FindIndex(RemoteRecipes.ToArray(), p => p.RecipeCode == RecipeQueue.ElementAt(0)); if (index >= 0 && index < RemoteRecipes.Count) { string code = RemoteRecipes.ElementAt(index).RecipeCode; int trayCode = RemoteRecipes.ElementAt(index).TrayCode; string recipeName = RemoteRecipes.ElementAt(index).RecipeName; //MessageLog.GetInstance.ShowRunLog($"开始执行配方{recipeName}"); if ( true) /*trayCode == 1 &&*/ { if (HKDevice.HK_PLC_S7.Read("DB3.DBX1.5") || SmallStation.RecipeStatusID == 0) { foreach (var item in RemoteRecipes.ElementAt(index).RawMaterial) { HKDevice.StockBinPar((uint)item.RawMaterialBarrelNum, (ushort)item.RawMaterialLocation); } HKDevice.HK_PLC_S7.Write("DB3.DBX1.5", false); HKDevice.HK_PLC_S7.Write("DB4.DBX1.3", true); SmallStation.RecipeStatusID = 1; MessageLog.GetInstance.ShowRunLog($"{recipeName}配方下发完成"); HKDevice.HK_PLC_S7.Write("DB3.DBX1.3", true); } if (HKDevice.HK_PLC_S7.Read("DB3.DBX1.3") && SmallStation.RecipeStatusID == 1) { HKDevice.HK_PLC_S7.Write("DB3.DBX1.3", false); SmallStation.RecipeStatusID = 2; MessageLog.GetInstance.ShowRunLog($"{recipeName}plc端 配方接收完成"); } if (SmallStation.RecipeStatusID == 2) { if (RTrig.GetInstance("DB3.DBX50.0").Start(HKDevice.HK_PLC_S7.Read("DB3.DBX50.0"))) { var res1= HKDevice.HK_PLC_S7.Read("DB4.DBD26"); var res = HKDevice.HK_PLC_S7.Read("DB3.DBD10"); if (res > 0 && res is UInt32 loc) { int loc_index = Array.FindIndex(RemoteRecipes.ElementAt(index).RawMaterial.ToArray(), p => p.RawMaterialLocation == loc); double weight = RemoteRecipes.ElementAt(index).RawMaterial.ElementAt(loc_index).RawMaterialWeight; if (loc_index >= 1 && loc_index <= 15) { DeviceInquire.GetInstance.GetDevice(loc_index)?.Start((uint)weight);//根据料仓编号 启动并写入每个原料重量 SmallStation.StockInIsWork = loc_index; HKDevice.HK_PLC_S7.Write("DB3.DBX50.0", false); } MessageLog.GetInstance.ShowRunLog($"{recipeName}托盘1_1号桶允许配料"); } } else if(RTrig.GetInstance("DB3.DBX50.1").Start(HKDevice.HK_PLC_S7.Read("DB3.DBX50.1"))) { var res = HKDevice.HK_PLC_S7.Read("DB3.DBD14"); if (res > 0 && res is float loc) { ushort a = (ushort)loc; int loc_index = Array.FindIndex(RemoteRecipes.ElementAt(index).RawMaterial.ToArray(), p => p.RawMaterialLocation == loc); double weight = RemoteRecipes.ElementAt(index).RawMaterial.ElementAt(loc_index).RawMaterialWeight; if (loc_index >= 1 && loc_index <= 15) { DeviceInquire.GetInstance.GetDevice(loc_index)?.Start((uint)weight);//启动并写入每个原料重量 SmallStation.StockInIsWork = loc_index; HKDevice.HK_PLC_S7.Write("DB3.DBX50.1", false); } MessageLog.GetInstance.ShowRunLog($"{recipeName}托盘1_2号桶允许配料"); } } else if (RTrig.GetInstance("DB3.DBX50.2").Start(HKDevice.HK_PLC_S7.Read("DB3.DBX50.2"))) { var res = HKDevice.HK_PLC_S7.Read("DB3.DBD18"); if (res > 0 && res is float loc) { int loc_index = Array.FindIndex(RemoteRecipes.ElementAt(index).RawMaterial.ToArray(), p => p.RawMaterialLocation == loc); if (loc_index >= 1 && loc_index <= 15) { double weight = RemoteRecipes.ElementAt(index).RawMaterial.ElementAt(loc_index).RawMaterialWeight; if (loc_index >= 1 && loc_index <= 15) { DeviceInquire.GetInstance.GetDevice(loc_index)?.Start((uint)weight);//启动并写入每个原料重量 SmallStation.StockInIsWork = loc_index; HKDevice.HK_PLC_S7.Write("DB3.DBX50.2", false); } MessageLog.GetInstance.ShowRunLog($"{recipeName}托盘1_3号桶允许配料"); } } } else if (RTrig.GetInstance("DB3.DBX50.3").Start(HKDevice.HK_PLC_S7.Read("DB3.DBX50.3"))) { var res = HKDevice.HK_PLC_S7.Read("DB3.DBD22"); if (res > 0 && res is float loc) { int loc_index = Array.FindIndex(RemoteRecipes.ElementAt(index).RawMaterial.ToArray(), p => p.RawMaterialLocation == loc); double weight = RemoteRecipes.ElementAt(index).RawMaterial.ElementAt(loc_index).RawMaterialWeight; if (loc_index >= 1 && loc_index <= 15) { DeviceInquire.GetInstance.GetDevice(loc_index)?.Start((uint)weight);//启动并写入每个原料重量 SmallStation.StockInIsWork = loc_index; HKDevice.HK_PLC_S7.Write("DB3.DBX50.3", false); } MessageLog.GetInstance.ShowRunLog($"{recipeName}托盘1_4号桶允许配料"); } } for (int i = 1; i < 16; i++) { if (RTrig.GetInstance("柔性味魔方配料完成").Start(DeviceInquire.GetInstance.GetDevice(i).deviceStatus.RunStatus == 3)) { int res = Array.FindIndex(RemoteRecipes.ElementAt(index).RawMaterial.ToArray(), p => p.RawMaterialLocation == i); RemoteRecipes.ElementAt(index).RawMaterial.ElementAt(res).Laying_Off_Weight = DeviceInquire.GetInstance.GetDevice(i).deviceStatus.CutWeightFeedback; DeviceInquire.GetInstance.GetDevice(i).StatusReset(); if (i >= 1 && i <= 8) { HKDevice.HK_PLC_S7.Write("DB4.DBX30." + (i - 1), true); } else if (i >= 9 && i <= 15) { HKDevice.HK_PLC_S7.Write("DB4.DBX31." + (i - 9), true); } } } if (RTrig.GetInstance("配方配料完成").Start(HKDevice.HK_PLC_S7.Read("DB3.DBX1.1"))) { var res = Json.Data.Recipes.FirstOrDefault(p => p.RecipeCode == code); MessageLog.GetInstance.ShowRunLog($"配方{res.RecipeName}配料完成"); RecipeFinishInfo.Order_No = RemoteRecipes.ElementAt(index).RecipeCode; RecipeFinishInfo.Product_Code = RemoteRecipes.ElementAt(index).RecipeName; for (int i = 0; i < 16; i++) { RecipeFinishInfo.Material[i].Material_Name = RemoteRecipes.ElementAt(index).RawMaterial.ElementAt(i).RawMaterialName; RecipeFinishInfo.Material[i].Material_BarrelNum = RemoteRecipes.ElementAt(index).RawMaterial.ElementAt(i).RawMaterialBarrelNum; RecipeFinishInfo.Material[i].Material_Laying_Off_Weight = RemoteRecipes.ElementAt(index).RawMaterial.ElementAt(i).Laying_Off_Weight; } SiemensDevice.Siemens_PLC_S7.WriteClass(RecipeFinishInfo, 3); RecipeFinishInfo.Ask_For_Finish = true; Json.Data.Recipes.Remove(res); RecipeQueue.TryDequeue(out code); HKDevice.HK_PLC_S7.Write("DB3.DBX1.1", false); SmallStation.RecipeStatusID = 0; } } } } } } } }