using BPASmartClient.CustomResource.Pages.Model; using BPASmartClient.Helper; using BPASmartClient.JXJFoodSmallStation.Model.HK_PLC; using BPASmartClient.JXJFoodSmallStation.Model.Siemens; using BPASmartClient.JXJFoodSmallStation.Model.WindSend; 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 RemoteRecipes = new ObservableCollection(); /// /// 原料的名称和料仓的位置对应 /// public Dictionary RawMaterialsNamePos = new Dictionary(); /// /// 配方队列 /// public ConcurrentQueue RecipeQueueTray1 = new ConcurrentQueue(); public ConcurrentQueue RecipeQueueTray2 = new ConcurrentQueue(); public SiemensDeviceStatus SiemensDevice = new SiemensDeviceStatus(); public HKDeviceStatus HKDevice = new HKDeviceStatus(); public WindSendDeviceStatus WindSendDevice = new WindSendDeviceStatus(); XL_Finish_DB RecipeFinishInfo = new XL_Finish_DB(); /// /// 风送PLC的DB块 /// WindSend_Write WindSendData = new WindSend_Write(); /// /// 接收原料数据 /// public RecipeRawMaterial RawMaterial; public void Init() { testData(); 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.CancelRegister("SiemensRecipeRecive"); ActionManage.GetInstance.Register(new Action((res) => { ObservableCollection RawMaterials = new ObservableCollection(); ObservableCollection WindSendData = new ObservableCollection(); if (SiemensDevice.IsConnected) { if (res != null && res is XL_Start_DB recipe) { if (!string.IsNullOrEmpty(recipe.RecipeCode)) { RawMaterials.Clear(); for (int i = 0; i < GVL_SmallStation.Max_DosingSotckBinNum; i++) { if (!string.IsNullOrEmpty(recipe.Material[i].Material_Name)) { if (RawMaterialsNamePos.ContainsKey(recipe.Material[i].Material_Name)) { RawMaterials.Add(new RemoteRecipeRawMaterial() { RawMaterialName = recipe.Material[i].Material_Name, RawMaterialBarrelNum = recipe.Material[i].Material_BarrelNum, RawMaterialWeight = recipe.Material[i].Material_Weight, RawMaterialLocation = (int)RawMaterialsNamePos[recipe.Material[i].Material_Name] }); } else { //MessageNotify.GetInstance.AlarmLog("配方名称与本地不符合"); } } else { break; } } for (int i = 0; i < GVL_SmallStation.Max_PowderSotckBinNum; i++) { if (!string.IsNullOrEmpty(recipe.Powder[i].Powder_Name)) { WindSendData.Add(new WindSendRawMaterial() { RawMaterialName = recipe.Powder[i].Powder_Name, RawMaterialWeight = recipe.Powder[i].Powder_Weight }); } else { break; } } App.Current.Dispatcher.Invoke(() => { Json.Data.Recipes.Add(new RemoteRecipeData() { RecipeName = recipe.RecipeName, RecipeCode = recipe.RecipeCode, RawMaterial = RawMaterials, TrayCode = recipe.StockCode, WindSend = WindSendData }); }); } } } }), "SiemensRecipeRecive", true); ActionManage.GetInstance.CancelRegister("SiemensRecipeFinish"); ActionManage.GetInstance.Register(new Action((res) => { if (SiemensDevice.IsConnected) { if (res != null && res is RemoteRecipeData recipe) { RecipeFinishInfo.Order_No = recipe.RecipeCode; RecipeFinishInfo.Product_Code = recipe.RecipeName; RecipeFinishInfo.Job_No = (short)recipe.TrayCode; for (int i = 0; i < recipe.RawMaterial.Count; i++) { RecipeFinishInfo.Material[i] = new UDT1(); RecipeFinishInfo.Material[i].Material_Name = recipe.RawMaterial.ElementAt(i).RawMaterialName; RecipeFinishInfo.Material[i].Material_BarrelNum = recipe.RawMaterial.ElementAt(i).RawMaterialBarrelNum; RecipeFinishInfo.Material[i].Material_Laying_Off_Weight = recipe.RawMaterial.ElementAt(i).Laying_Off_Weight; } for (int i = 0; i < recipe.WindSend.Count; i++) { RecipeFinishInfo.Powder[i] = new UDT2(); RecipeFinishInfo.Powder[i].Powder_Name = recipe.RawMaterial.ElementAt(i).RawMaterialName; RecipeFinishInfo.Powder[i].Powder_Weight = recipe.RawMaterial.ElementAt(i).Laying_Off_Weight; } if (GVL_SmallStation.SiemensSendRecipeStatus == 6) { GVL_SmallStation.SiemensSendRecipeStatus = 7; RecipeFinishInfo.Ask_For_Finish = true; SiemensDevice.Siemens_PLC_S7.WriteClass(RecipeFinishInfo, 2261); } } } }), "SiemensRecipeFinish", true); ActionManage.GetInstance.CancelRegister("LocalSimulationRecipeIssue"); ActionManage.GetInstance.Register(new Action((res) => { if (res != null && res is RemoteRecipeData recipe) { Json.Data.Recipes.Add(recipe); } }), "LocalSimulationRecipeIssue", true); ActionManage.GetInstance.Register(new Action(() => { Json.Data.Recipes.Clear(); GVL_SmallStation.SiemensSendRecipeStatus = 0; MessageNotify.GetInstance.ShowRunLog("系统流程复位,等待西门子重新下发订单"); }), "BPASystemReset",true); string HK_PLC_IP = ConfigurationManager.AppSettings["HKPlc_IP"]; string Siemens_PLC_IP = ConfigurationManager.AppSettings["Siemens_IP"]; string WindSend_PLC_IP = ConfigurationManager.AppSettings["WindSend_IP"]; try { if (Json.Data.deviceConnectPar.HKPlcConnect) { HKDevice.HK_PLC_S7.Connect(S7.Net.CpuType.S71200, HK_PLC_IP); if (HKDevice.IsConnected) MessageNotify.GetInstance.ShowRunLog("海科plc连接成功"); } } catch (Exception ex) { MessageNotify.GetInstance.ShowAlarmLog("海科plc连接失败,等待重新连接"); } finally { HKDevice.Init(); MessageNotify.GetInstance.ShowRunLog("海科plc初始化完成"); } try { if (Json.Data.deviceConnectPar.SiemensConnect) { SiemensDevice.Siemens_PLC_S7.Connect(S7.Net.CpuType.S71500, Siemens_PLC_IP); if (SiemensDevice.IsConnected) MessageNotify.GetInstance.ShowRunLog("西门子plc连接成功"); } } catch (Exception ex) { MessageNotify.GetInstance.ShowAlarmLog("西门子plc连接失败,等待重新连接"); } finally { SiemensDevice.Init(); MessageNotify.GetInstance.ShowRunLog("西门子plc初始化完成"); } try { if (Json.Data.deviceConnectPar.WindSendConnect) { WindSendDevice.Siemens_PLC_S7.Connect(S7.Net.CpuType.S71200, WindSend_PLC_IP); if (WindSendDevice.IsConnected) MessageNotify.GetInstance.ShowRunLog("风送plc连接成功"); } } catch (Exception ex) { MessageNotify.GetInstance.ShowAlarmLog("粉料plc连接失败,等待重新连接"); } finally { WindSendDevice.Init(); MessageNotify.GetInstance.ShowRunLog("风送粉料plc初始化完成"); } ThreadManage.GetInstance().StartLong(new Action(() => { try { if (!HKDevice.IsConnected && Json.Data.deviceConnectPar.HKPlcConnect) { HKDevice.HK_PLC_S7.Connect(S7.Net.CpuType.S71200, HK_PLC_IP); if (HKDevice.IsConnected) MessageNotify.GetInstance.ShowRunLog("海科PLC重新连接成功"); } } catch (Exception ex) { } try { if (!SiemensDevice.IsConnected && Json.Data.deviceConnectPar.SiemensConnect) { SiemensDevice.Siemens_PLC_S7.Connect(S7.Net.CpuType.S71500, Siemens_PLC_IP); if (SiemensDevice.IsConnected) MessageNotify.GetInstance.ShowRunLog("西门子PLC重新连接成功"); } } catch (Exception ex) { } try { if (!WindSendDevice.IsConnected && Json.Data.deviceConnectPar.WindSendConnect) { WindSendDevice.Siemens_PLC_S7.Connect(S7.Net.CpuType.S71200, WindSend_PLC_IP); if (WindSendDevice.IsConnected) MessageNotify.GetInstance.ShowRunLog("风送plc重新连接成功"); } } catch (Exception ex) { } Thread.Sleep(50); }), "设备连接", true); RecipeQueueTray1.Clear(); //手动控制系统模式 ActionManage.GetInstance.Register(new Action(() => { HKDevice.HK_PLC_S7.Write("DB44.DBX0.0", true); }), "SystemStart", true); ActionManage.GetInstance.Register(new Action(() => { HKDevice.HK_PLC_S7.Write("DB44.DBX0.0", false); }), "SystemStop", true); ActionManage.GetInstance.Register(new Action(() => { HKDevice.HK_PLC_S7.Write("DB44.DBX0.2", true); }), "SystemPause", true); ActionManage.GetInstance.Register(new Action(() => { HKDevice.HK_PLC_S7.Write("DB44.DBX0.2", false); }), "SystemReset", true); ActionManage.GetInstance.Register(new Action(() => { HKDevice.HK_PLC_S7.Write("DB44.DBX0.1", false); }), "SystemAutoMode", true); ActionManage.GetInstance.Register(new Action(() => { HKDevice.HK_PLC_S7.Write("DB44.DBX0.1", true); }), "SystemDebugMode", true); //流程控制 ActionManage.GetInstance.Register(new Action(() => { HKDevice.HK_PLC_S7.Write("DB44.DBX0.3", true); }), "ManualSystemReset", true); ActionManage.GetInstance.Register(new Action(() => { HKDevice.HK_PLC_S7.Write("DB44.DBX0.4", true); }), "CLearRecipeInfo", true); ActionManage.GetInstance.Register(new Action(() => { HKDevice.HK_PLC_S7.Write("DB4.DBX0.7", true); }), "AGVPutTrayFinish", true); //手动控制电机轴 ActionManage.GetInstance.Register(new Action(() => { HKDevice.HK_PLC_S7.Write("DB5.DBX4.6", true); }), "StartAxisLoadCommand", true); ActionManage.GetInstance.Register(new Action(() => { HKDevice.HK_PLC_S7.Write("DB5.DBX4.6", false); }), "StopAxisLoadCommand", true); ActionManage.GetInstance.Register(new Action(() => { HKDevice.HK_PLC_S7.Write("DB5.DBX4.7", true); }), "StartAxisMidCommand", true); ActionManage.GetInstance.Register(new Action(() => { HKDevice.HK_PLC_S7.Write("DB5.DBX4.7", false); }), "StopAxisMidCommand", true); ActionManage.GetInstance.Register(new Action(() => { HKDevice.HK_PLC_S7.Write("DB5.DBX5.0", true); }), "StartAxisUnLoadCommand", true); ActionManage.GetInstance.Register(new Action(() => { HKDevice.HK_PLC_S7.Write("DB5.DBX5.0", false); }), "StopAxisUnLoadCommand", true); ActionManage.GetInstance.Register(new Action(() => { HKDevice.HK_PLC_S7.Write("DB5.DBX5.1", true); }), "StartAxis1Command", true); ActionManage.GetInstance.Register(new Action(() => { HKDevice.HK_PLC_S7.Write("DB5.DBX5.1", false); }), "StopAxis1Command", true); ActionManage.GetInstance.Register(new Action(() => { HKDevice.HK_PLC_S7.Write("DB5.DBX5.2", true); }), "StartAxis2Command", true); ActionManage.GetInstance.Register(new Action(() => { HKDevice.HK_PLC_S7.Write("DB5.DBX5.2", false); }), "StopAxis2Command", true); //电机速度 ActionManage.GetInstance.Register(new Action((o) => { if (o != null && o is short value) { HKDevice.HK_PLC_S7.Write("DB47.DBD8", value); } }), "AxisLoadSpeedSet", true); ActionManage.GetInstance.Register(new Action((o) => { if (o != null && o is short value) { HKDevice.HK_PLC_S7.Write("DB47.DBD10", value); } }), "AxisMidSpeedSet", true); ActionManage.GetInstance.Register(new Action((o) => { if (o != null && o is short value) { HKDevice.HK_PLC_S7.Write("DB47.DBD12", value); } }), "AxisUnLoadSpeedSet", true); ActionManage.GetInstance.Register(new Action((o) => { if (o != null && o is float value) { HKDevice.HK_PLC_S7.Write("DB47.DBD0", value); } }), "Axis1SpeedSet", true); ActionManage.GetInstance.Register(new Action((o) => { if (o != null && o is float value) { HKDevice.HK_PLC_S7.Write("DB47.DBD4", value); } }), "Axis2SpeedSet", true); //Json.Data.Recipes = TestData.GetInstance.Recipes;//添加测试数据 ThreadManage.GetInstance().StartLong(new Action(() => { if (HKDevice.IsConnected) { GVL_SmallStation.GetInstance.HeartBeatToPlc = !GVL_SmallStation.GetInstance.HeartBeatToPlc; HKDevice.HK_PLC_S7.Write("DB4.DBX0.0", GVL_SmallStation.GetInstance.HeartBeatToPlc); GVL_SmallStation.GetInstance.HeartBeatFromPlc = HKDevice.HK_PLC_S7.Read("DB45.DBX0.0"); //获取系统状态 GVL_SmallStation.SystemStatus = HKDevice.HK_PLC_S7.Read("DB44.DBX0.0");//系统启停 GVL_SmallStation.SystemMode = HKDevice.HK_PLC_S7.Read("DB44.DBX0.1");//系统模式 GVL_SmallStation.SystemRunStatus = HKDevice.HK_PLC_S7.Read("DB44.DBX0.2");//系统暂停 } Thread.Sleep(200); }), "通信心跳", true); ThreadManage.GetInstance().StartLong(new Action(() => { DeviceStatusDispose(); ReceviceData(); RecipeInfoToHKPLC(); Thread.Sleep(10); }), "西门子配发下发流程处理", true); ThreadManage.GetInstance().StartLong(new Action(() => { if (!HKDevice.IsConnected) { ManualOpen(); ManualClose(); } Thread.Sleep(10); }), "手动操作", true); } private void GetStatus() { for (int i = 0; i < 8; i++) { GVL_SmallStation.GetInstance.Cylinder_JackInfo[i] = HKDevice.HK_PLC_S7.Read("DB5.DBX0." + i); } for (int i = 0; i < 7; i++) { GVL_SmallStation.GetInstance.Cylinder_JackInfo[i + 8] = HKDevice.HK_PLC_S7.Read("DB5.DBX0." + i); } } 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 - 2)); if (index >= 1 && index <= 15) { string address = "DB5.DBX" + (index / 8) + "." + (index % 8 - 1); if (index == 8) address = "DB5.DBX0.7"; HKDevice.HK_PLC_S7.Write(address, true); } } else if (o.ToString().Contains("阻挡气缸")) { int index = Convert.ToInt16(o.ToString().Substring(o.ToString().Length - 2)); if (index >= 1 && index <= 15) { string address = ""; if (index == 1) address = "DB5.DBX1.7"; if (index == 2) address = "DB5.DBX2.0"; if (index == 3) address = "DB5.DBX2.1"; if (index == 4) address = "DB5.DBX2.2"; if (index == 5) address = "DB5.DBX2.3"; if (index == 6) address = "DB5.DBX2.4"; if (index == 7) address = "DB5.DBX2.5"; if (index == 8) address = "DB5.DBX2.6"; if (index == 9) address = "DB5.DBX2.7"; if (index == 10) address = "DB5.DBX3.0"; if (index == 11) address = "DB5.DBX3.1"; if (index == 12) address = "DB5.DBX3.2"; if (index == 13) address = "DB5.DBX3.3"; if (index == 14) address = "DB5.DBX3.4"; if (index == 15) address = "DB5.DBX3.5"; HKDevice.HK_PLC_S7.Write(address, true); } } else if (o.ToString().Contains("进料桶顶升气缸")) { HKDevice.HK_PLC_S7.Write("DB5.DBX3.6", false);//默认顶升 } else if (o.ToString().Contains("出料桶顶升气缸1")) { HKDevice.HK_PLC_S7.Write("DB5.DBX3.7", true); } else if (o.ToString().Contains("出料桶顶升气缸2")) { HKDevice.HK_PLC_S7.Write("DB5.DBX4.0", true); } else if (o.ToString().Contains("出料桶顶升气缸3")) { HKDevice.HK_PLC_S7.Write("DB5.DBX4.1", true); } else if (o.ToString().Contains("托盘气缸1_1")) { HKDevice.HK_PLC_S7.Write("DB5.DBX4.2", false);//默认伸出 } else if (o.ToString().Contains("托盘气缸1_2")) { HKDevice.HK_PLC_S7.Write("DB5.DBX4.3", false); } else if (o.ToString().Contains("托盘气缸2_1")) { HKDevice.HK_PLC_S7.Write("DB5.DBX4.4", false); } else if (o.ToString().Contains("托盘气缸2_2")) { HKDevice.HK_PLC_S7.Write("DB5.DBX4.5", false); } } }), "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 - 2)); if (index >= 1 && index <= 15) { string address = "DB5.DBX" + (index / 8) + "." + (index % 8 - 1); if (index == 8) address = "DB5.DBX0.7"; HKDevice.HK_PLC_S7.Write(address, false); } } else if (o.ToString().Contains("阻挡气缸")) { int index = Convert.ToInt16(o.ToString().Substring(o.ToString().Length - 2)); if (index >= 1 && index <= 15) { string address = ""; if (index == 1) address = "DB5.DBX1.7"; if (index == 2) address = "DB5.DBX2.0"; if (index == 3) address = "DB5.DBX2.1"; if (index == 4) address = "DB5.DBX2.2"; if (index == 5) address = "DB5.DBX2.3"; if (index == 6) address = "DB5.DBX2.4"; if (index == 7) address = "DB5.DBX2.5"; if (index == 8) address = "DB5.DBX2.6"; if (index == 9) address = "DB5.DBX2.7"; if (index == 10) address = "DB5.DBX3.0"; if (index == 11) address = "DB5.DBX3.1"; if (index == 12) address = "DB5.DBX3.2"; if (index == 13) address = "DB5.DBX3.3"; if (index == 14) address = "DB5.DBX3.4"; if (index == 15) address = "DB5.DBX3.5"; HKDevice.HK_PLC_S7.Write(address, false); } } else if (o.ToString().Contains("进料桶顶升气缸")) { HKDevice.HK_PLC_S7.Write("DB5.DBX3.6", true); } else if (o.ToString().Contains("出料桶顶升气缸1")) { HKDevice.HK_PLC_S7.Write("DB5.DBX3.7", false); } else if (o.ToString().Contains("出料桶顶升气缸2")) { HKDevice.HK_PLC_S7.Write("DB5.DBX4.0", false); } else if (o.ToString().Contains("出料桶顶升气缸3")) { HKDevice.HK_PLC_S7.Write("DB5.DBX4.1", false); } else if (o.ToString().Contains("托盘气缸1_1")) { HKDevice.HK_PLC_S7.Write("DB5.DBX4.2", true); } else if (o.ToString().Contains("托盘气缸1_2")) { HKDevice.HK_PLC_S7.Write("DB5.DBX4.3", true); } else if (o.ToString().Contains("托盘气缸2_1")) { HKDevice.HK_PLC_S7.Write("DB5.DBX4.4", true); } else if (o.ToString().Contains("托盘气缸2_2")) { HKDevice.HK_PLC_S7.Write("DB5.DBX4.5", true); } } }), "ManualClose", true);//根据下发的配方ID将 托盘的位置信息添加到配方中 } /// /// /// private void DeviceStatusDispose() { if (HKDevice.IsConnected) { GVL_SmallStation.Station1HaveTray = HKDevice.HK_PLC_S7.Read("DB3.DBX0.7");//工站1 有货架 GVL_SmallStation.Station2HaveTray = HKDevice.HK_PLC_S7.Read("DB3.DBX1.0");//工站1 有货架 if (RTrig.GetInstance("WindSendDosingCompleToHKPLC").Start(GVL_SmallStation.WindSendDosingComple)) { GVL_SmallStation.WindSendDosingComple = false; HKDevice.HK_PLC_S7.Write("DB4.DBX1.7", true); MessageNotify.GetInstance.ShowRunLog("风送配料完成信号,发给产线plc信号"); } if (HKDevice.HK_PLC_S7.Read("DB3.DBX1.1")) { HKDevice.HK_PLC_S7.Write("DB4.DBX1.7", false); } if (HKDevice.HK_PLC_S7.Read("DB3.DBX1.7"))//允许下配方1或者允许下配方2 { GVL_SmallStation.IsAllowSiemensSendRecipe = true; } GVL_SmallStation.Station1Sensor = HKDevice.HK_PLC_S7.Read("DB3.DBX2.1"); GVL_SmallStation.Station2Sensor = HKDevice.HK_PLC_S7.Read("DB3.DBX2.2"); GVL_SmallStation.Station1Cylinder = HKDevice.HK_PLC_S7.Read("DB3.DBX2.3"); GVL_SmallStation.Station2Cylinder = HKDevice.HK_PLC_S7.Read("DB3.DBX2.4"); if (!GVL_SmallStation.TrayLogicFinish) { if (GVL_SmallStation.AGV_PutTray1Finish) { HKDevice.HK_PLC_S7.Write("DB4.DBX0.7", true); GVL_SmallStation.AGV_PutTray1Finish = false; MessageNotify.GetInstance.ShowRunLog("AGV到位 发送到位信号给plc"); } if (GVL_SmallStation.Station1HaveTray) { HKDevice.HK_PLC_S7.Write("DB4.DBX0.7", false); GVL_SmallStation.TrayLogicFinish = true; MessageNotify.GetInstance.ShowRunLog("托盘1有货架"); } else { if (HKDevice.HK_PLC_S7.Read("DB3.DBX1.5") == true) { if (GVL_SmallStation.CylinderReset) { HKDevice.HK_PLC_S7.Write("DB4.DBX1.5", true); } MessageNotify.GetInstance.ShowRunLog("气缸收紧错位"); } else { HKDevice.HK_PLC_S7.Write("DB4.DBX1.5", false); } } } else { if (GVL_SmallStation.AGV_GetTray1Finish) { HKDevice.HK_PLC_S7.Write("DB4.DBX1.1", true); if (HKDevice.HK_PLC_S7.Read("DB3.DBX1.7") == true) { HKDevice.HK_PLC_S7.Write("DB4.DBX1.1", false); GVL_SmallStation.TrayLogicFinish = false; GVL_SmallStation.AGV_GetTray1Finish = false; } } } } if (SiemensDevice.IsConnected) { ushort TrayCylinder = 0; ushort TraySensor = 0; if (GVL_SmallStation.Station1Sensor) { TraySensor = TraySensor.SetBitValue(1, true); } else { TraySensor = TraySensor.SetBitValue(0, false); } if (!GVL_SmallStation.Station1Cylinder) { TrayCylinder = TrayCylinder.SetBitValue(1, true); } else { TrayCylinder = TrayCylinder.SetBitValue(0, false); } this.SiemensDevice.Siemens_PLC_S7.Write("DB2231.DBX28.4", GVL_SmallStation.WindSendAllowAGVPutGet); this.SiemensDevice.Siemens_PLC_S7.Write("DB2231.DBW190", TraySensor);//添加工位传感器的信号 this.SiemensDevice.Siemens_PLC_S7.Write("DB2231.DBW192", TrayCylinder);//添加工位气缸的信号 if (RTrig.GetInstance("AGV_PutTray1Finish1111").Start(SiemensDevice.XL_Status.AgvFinishPut == 1)) { GVL_SmallStation.AGV_PutTray1Finish = true; } if (RTrig.GetInstance("AGV_GetTray1Finish111").Start(SiemensDevice.XL_Status.AgvFinishGet == 1)) { GVL_SmallStation.AGV_GetTray1Finish = true; } } } /// /// 将配方添加到配方队列中 /// private void ReceviceData() { if (!GVL_SmallStation.GetInstance.IsUseLocalRecipe) { RemoteRecipes = Json.Data.Recipes; if (RemoteRecipes.Count > 0) { foreach (var data in RemoteRecipes) { if (data.TrayCode == 1) { if (!(RecipeQueueTray1.Contains(data.RecipeCode))) { if (SiemensDevice.XL_Status is XL_Status_DB status) { if (GVL_SmallStation.SiemensSendRecipeStatus == 3) { GVL_SmallStation.SiemensSendRecipeStatus = 4; SiemensDevice.Siemens_PLC_S7.WriteString(2231, data.RecipeCode, 10); SiemensDevice.Siemens_PLC_S7.Write("DB2231.DBX28.0", true); MessageNotify.GetInstance.ShowRunLog($"配方{data.RecipeCode},请求配料"); } if (GVL_SmallStation.SiemensSendRecipeStatus == 4) { if (SiemensDevice.XL_Status.Dosing_Confirm) { GVL_SmallStation.SiemensSendRecipeStatus = 5; SiemensDevice.Siemens_PLC_S7.WriteString(2231, "", 10);//复位字符串 SiemensDevice.Siemens_PLC_S7.Write("DB2231.DBX28.0", false); MessageNotify.GetInstance.ShowRunLog($"配方{data.RecipeCode},配料信号复位"); } } if (GVL_SmallStation.SiemensSendRecipeStatus == 5) { MessageNotify.GetInstance.ShowRunLog($"配方{data.RecipeCode},西门子确认配料"); if (SiemensDevice.XL_Status.Dosing_Confirm == false) { RecipeQueueTray1.Enqueue(data.RecipeCode); GVL_SmallStation.SiemensSendRecipeStatus = 6; MessageNotify.GetInstance.ShowRunLog($"配方{data.RecipeCode},加入队列"); } } } } } else if (data.TrayCode == 2) { if (!(RecipeQueueTray2.Contains(data.RecipeCode))) { if (SiemensDevice.XL_Status is XL_Status_DB status) { if (GVL_SmallStation.SiemensSendRecipeStatus == 3) { GVL_SmallStation.SiemensSendRecipeStatus = 4; SiemensDevice.Siemens_PLC_S7.WriteString(2231, data.RecipeCode, 10); SiemensDevice.Siemens_PLC_S7.Write("DB2231.DBX28.0", true); } if (GVL_SmallStation.SiemensSendRecipeStatus == 4) { if (SiemensDevice.XL_Status.Dosing_Confirm) { GVL_SmallStation.SiemensSendRecipeStatus = 5; SiemensDevice.Siemens_PLC_S7.WriteString(2231, "", 10); SiemensDevice.Siemens_PLC_S7.Write("DB2231.DBX28.0", false); } } if (GVL_SmallStation.SiemensSendRecipeStatus == 5) { if (SiemensDevice.XL_Status.Dosing_Confirm == false) { GVL_SmallStation.SiemensSendRecipeStatus = 0; RecipeQueueTray2.Enqueue(data.RecipeCode); } } } } } } } else { RecipeQueueTray1.Clear(); RecipeQueueTray2.Clear(); GVL_SmallStation.GetInstance.RecipeStatusID = 0; GVL_SmallStation.GetInstance.RecipeStatusIDTray2 = 0; } } else { RemoteRecipes = Json.Data.Recipes; if (RemoteRecipes.Count > 0) { foreach (var data in RemoteRecipes) { if (data.TrayCode == 1) { if (!(RecipeQueueTray1.Contains(data.RecipeCode))) { RecipeQueueTray1.Enqueue(data.RecipeCode); } } else if (data.TrayCode == 2) { if (!(RecipeQueueTray2.Contains(data.RecipeCode))) { RecipeQueueTray2.Enqueue(data.RecipeCode); } } } } else { RecipeQueueTray1.Clear(); RecipeQueueTray2.Clear(); GVL_SmallStation.GetInstance.DosingTray1 = false; GVL_SmallStation.GetInstance.DosingTray1Loc = 0; GVL_SmallStation.GetInstance.DosingTray2 = false; GVL_SmallStation.GetInstance.DosingTray2Loc = 0; GVL_SmallStation.GetInstance.RecipeStatusID = 0; GVL_SmallStation.GetInstance.RecipeStatusIDTray2 = 0; } } if (GVL_SmallStation.Order_Cancel) //订单取消 { if (!string.IsNullOrEmpty(GVL_SmallStation.Order_CancelRecipeCode)) { string code = GVL_SmallStation.Order_CancelRecipeCode; int index = Array.FindIndex(Json.Data.Recipes.ToArray(), p => p.RecipeCode == code); if (index >= 0) { short TrayCode = (short)Json.Data.Recipes.ElementAt(index).TrayCode; if (RecipeQueueTray1.Contains(code) || RecipeQueueTray1.Contains(code)) { if (RecipeQueueTray1.Contains(code)) { App.Current.Dispatcher.Invoke(() => { Json.Data.Recipes.RemoveAt(index); }); if (GVL_SmallStation.GetInstance.RecipeStatusID != 0) { HKDevice.HK_PLC_S7.Write("DB4.DBX2.1", true); DateTime dateTime = DateTime.Now; MessageNotify.GetInstance.ShowRunLog($"PLC正在执行配料流程,正在取消订单:{code}"); while (!(HKDevice.HK_PLC_S7.Read("DB3.DBX2.5") || DateTime.Now.Subtract(dateTime).TotalSeconds >= 10)) { if (DateTime.Now.Subtract(dateTime).TotalSeconds > 1) { MessageNotify.GetInstance.ShowRunLog($"等待PLC取消订单完成:{code}"); } } MessageNotify.GetInstance.ShowRunLog($"PLC正在执行配料流程,取消订单:{code}"); } else { MessageNotify.GetInstance.ShowRunLog($"AGV未到达工站前,未给plc下发配方,取消订单:{code}"); } GVL_SmallStation.GetInstance.RecipeStatusID = 0; RecipeQueueTray1.TryDequeue(out code); SiemensDevice.Siemens_PLC_S7.Write("DB2201.DBX440.1", false); SiemensDevice.Siemens_PLC_S7.Write("DB2201.DBX450.1", true); MessageNotify.GetInstance.ShowRunLog($"队列1,西门子取消订单完成,订单号:{code}"); } else if (RecipeQueueTray2.Contains(code)) { App.Current.Dispatcher.Invoke(() => { Json.Data.Recipes.RemoveAt(index); }); if (GVL_SmallStation.GetInstance.RecipeStatusID != 0) { HKDevice.HK_PLC_S7.Write("DB4.DBX2.2", true); DateTime dateTime = DateTime.Now; MessageNotify.GetInstance.ShowRunLog($"PLC正在执行配料流程,正在取消订单:{code}"); while (!(HKDevice.HK_PLC_S7.Read("DB3.DBX2.6") || DateTime.Now.Subtract(dateTime).TotalSeconds >= 10)) { if (DateTime.Now.Subtract(dateTime).TotalSeconds > 1) { MessageNotify.GetInstance.ShowRunLog($"等待PLC取消订单完成:{code}"); } } MessageNotify.GetInstance.ShowRunLog($"PLC正在执行配料流程,已经取消订单:{code}"); } else { MessageNotify.GetInstance.ShowRunLog($"AGV未到达工站前,未给plc下发配方,取消订单:{code}"); } GVL_SmallStation.GetInstance.RecipeStatusID = 0; RecipeQueueTray2.TryDequeue(out code); SiemensDevice.Siemens_PLC_S7.Write("DB2201.DBX440.1", false); SiemensDevice.Siemens_PLC_S7.Write("DB2201.DBX450.1", true); MessageNotify.GetInstance.ShowRunLog($"队列2,西门子取消订单完成,订单号:{code}"); } GVL_SmallStation.Order_Cancel = false; GVL_SmallStation.Order_CancelRecipeCode = ""; } else { if (GVL_SmallStation.SiemensSendRecipeStatus != 0 || GVL_SmallStation.SiemensSendRecipeStatus != 1) { GVL_SmallStation.SiemensSendRecipeStatus = 0; App.Current.Dispatcher.Invoke(() => { Json.Data.Recipes.RemoveAt(index); }); MessageNotify.GetInstance.ShowRunLog($"正在执行请求订单流程,配方还未到PLC,订单号:{code}"); } else { MessageNotify.GetInstance.ShowRunLog($"订单取消异常,订单号:{code}"); } GVL_SmallStation.Order_Cancel = false; GVL_SmallStation.Order_CancelRecipeCode = ""; SiemensDevice.Siemens_PLC_S7.Write("DB2201.DBX440.1", false); SiemensDevice.Siemens_PLC_S7.Write("DB2201.DBX450.1", true); } } else { GVL_SmallStation.Order_Cancel = false; GVL_SmallStation.Order_CancelRecipeCode = ""; SiemensDevice.Siemens_PLC_S7.Write("DB2201.DBX440.1", false); SiemensDevice.Siemens_PLC_S7.Write("DB2201.DBX450.1", true); MessageNotify.GetInstance.ShowRunLog($"西门子取消订单,但未找到订单:{code}"); } } } } /// /// 执行配方队列中的第一个配方 /// private void RecipeInfoToHKPLC() { if (RecipeQueueTray1.Count > 0 && GVL_SmallStation.TrayLogicFinish) { int index = Array.FindIndex(RemoteRecipes.ToArray(), p => p.RecipeCode == RecipeQueueTray1.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; string windSend = RemoteRecipes.ElementAt(index).ToString(); if (trayCode == 1) { if (GVL_SmallStation.GetInstance.RecipeStatusID == 0) { if (GVL_SmallStation.GetInstance.IsUseWindSend) { WindSendData.TargetRecipeCode = code; WindSendData.IsAllowDosing = true; foreach (var item in RemoteRecipes.ElementAt(index).WindSend) { if (item.RawMaterialName == "0037") { WindSendData.RawMaterial1_SetWeight = item.RawMaterialWeight; } if (item.RawMaterialName == "0038") { WindSendData.RawMaterial2_SetWeight = item.RawMaterialWeight; } if (item.RawMaterialName == "") { WindSendData.RawMaterial3_SetWeight = item.RawMaterialWeight; } if (item.RawMaterialName == "") { WindSendData.RawMaterial4_SetWeight = item.RawMaterialWeight; } if (item.RawMaterialName == "0036") { WindSendData.RawMaterial5_SetWeight = item.RawMaterialWeight; } } WindSendDevice.Siemens_PLC_S7.WriteClass(WindSendData, 95); } foreach (var item in RemoteRecipes.ElementAt(index).RawMaterial) { HKDevice.StockBinPar((uint)item.RawMaterialBarrelNum, (ushort)item.RawMaterialLocation); } HKDevice.HK_PLC_S7.Write("DB4.DBX1.3", true); GVL_SmallStation.GetInstance.RecipeStatusID = 1; MessageNotify.GetInstance.ShowRunLog($"托盘1,配方:{recipeName},下发完成"); GVL_SmallStation.GetInstance.time1 = DateTime.Now; } if (HKDevice.HK_PLC_S7.Read("DB3.DBX1.3") && GVL_SmallStation.GetInstance.RecipeStatusID == 1) { HKDevice.HK_PLC_S7.Write("DB4.DBX1.3", false); GVL_SmallStation.GetInstance.RecipeStatusID = 2; MessageNotify.GetInstance.ShowRunLog($"托盘1,{ recipeName}plc端 配方接收完成"); } if (GVL_SmallStation.GetInstance.RecipeStatusID == 2) { if (GVL_SmallStation.GetInstance.DosingTray1 == false && GVL_SmallStation.GetInstance.DosingTray1Loc == 0) { if (RTrig.GetInstance("DB3.DBX50.0").Start(HKDevice.HK_PLC_S7.Read("DB3.DBX50.0"))) { var res = HKDevice.HK_PLC_S7.Read("DB3.DBD10"); MessageNotify.GetInstance.ShowRunLog($"托盘1,配方:{recipeName},1号桶,{res}料仓,允许配料"); if (res > 0 && res is float loc) { int loc_index = Array.FindIndex(RemoteRecipes.ElementAt(index).RawMaterial.ToArray(), p => p.RawMaterialLocation == loc); float weight = RemoteRecipes.ElementAt(index).RawMaterial.ElementAt(loc_index).RawMaterialWeight * 1000;//单位g转换kg if (loc_index >= 0) { DeviceInquire.GetInstance.GetDevice((int)loc)?.Start(weight);//根据料仓编号 启动并写入每个原料重量 GVL_SmallStation.GetInstance.StockInIsWork = (int)loc; } GVL_SmallStation.GetInstance.DosingTray1 = true; GVL_SmallStation.GetInstance.DosingTray1Loc = (int)loc; MessageNotify.GetInstance.ShowRunLog($"托盘1,配方:{recipeName},1号桶,{(int)loc}号仓,配料完成"); } } 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"); MessageNotify.GetInstance.ShowRunLog($"托盘1,配方:{recipeName},2号桶,{res}料仓,允许配料"); if (res > 0 && res is float loc) { int loc_index = Array.FindIndex(RemoteRecipes.ElementAt(index).RawMaterial.ToArray(), p => p.RawMaterialLocation == loc); float weight = RemoteRecipes.ElementAt(index).RawMaterial.ElementAt(loc_index).RawMaterialWeight * 1000; if (loc_index >= 0) { DeviceInquire.GetInstance.GetDevice((int)loc)?.Start(weight);//启动并写入每个原料重量 GVL_SmallStation.GetInstance.StockInIsWork = (int)loc; } GVL_SmallStation.GetInstance.DosingTray1 = true; GVL_SmallStation.GetInstance.DosingTray1Loc = (int)loc; MessageNotify.GetInstance.ShowRunLog($"托盘1,配方:{recipeName},2号桶,{(int)loc}号仓,配料完成"); } } 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"); MessageNotify.GetInstance.ShowRunLog($"托盘1,配方:{recipeName},3号桶,{res}料仓,允许配料"); if (res > 0 && res is float loc) { int loc_index = Array.FindIndex(RemoteRecipes.ElementAt(index).RawMaterial.ToArray(), p => p.RawMaterialLocation == loc); float weight = RemoteRecipes.ElementAt(index).RawMaterial.ElementAt(loc_index).RawMaterialWeight * 1000; if (loc_index >= 0) { DeviceInquire.GetInstance.GetDevice((int)loc)?.Start(weight);//启动并写入每个原料重量 GVL_SmallStation.GetInstance.StockInIsWork = (int)loc; } GVL_SmallStation.GetInstance.DosingTray1 = true; GVL_SmallStation.GetInstance.DosingTray1Loc = (int)loc; MessageNotify.GetInstance.ShowRunLog($"托盘1,配方:{recipeName},3号桶,{(int)loc}号仓,配料完成"); } } 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"); MessageNotify.GetInstance.ShowRunLog($"托盘1,配方:{recipeName},4号桶,{res}料仓,允许配料"); if (res > 0 && res is float loc) { int loc_index = Array.FindIndex(RemoteRecipes.ElementAt(index).RawMaterial.ToArray(), p => p.RawMaterialLocation == loc); float weight = RemoteRecipes.ElementAt(index).RawMaterial.ElementAt(loc_index).RawMaterialWeight * 1000; if (loc_index >= 0) { DeviceInquire.GetInstance.GetDevice((int)loc)?.Start(weight);//启动并写入每个原料重量 GVL_SmallStation.GetInstance.StockInIsWork = (int)loc; } GVL_SmallStation.GetInstance.DosingTray1 = true; GVL_SmallStation.GetInstance.DosingTray1Loc = (int)loc; MessageNotify.GetInstance.ShowRunLog($"托盘1,配方:{recipeName},4号桶,{(int)loc}号仓,配料完成"); } } } if (GVL_SmallStation.GetInstance.DosingTray1 && GVL_SmallStation.GetInstance.DosingTray1Loc > 0 && GVL_SmallStation.GetInstance.DosingTray1Loc < 16) { int i = GVL_SmallStation.GetInstance.DosingTray1Loc; if (DeviceInquire.GetInstance.GetDevice(i).deviceStatus.RunStatus == 3) { MessageNotify.GetInstance.ShowRunLog($"柔性味魔方,托盘1,配方:{recipeName},{i}号仓,配料完成"); 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.NowWeightFeedback; bool info = DeviceInquire.GetInstance.GetDevice(i).StatusReset(); MessageNotify.GetInstance.ShowRunLog($"柔性味魔方,托盘1,配方:{recipeName},{i}号仓,下料完成重量:{RemoteRecipes.ElementAt(index).RawMaterial.ElementAt(res).Laying_Off_Weight}"); if (info) { MessageNotify.GetInstance.ShowRunLog($"柔性味魔方配料完成后复位 发送成功"); } else { MessageNotify.GetInstance.ShowRunLog($"柔性味魔方配料完成后复位 发送失败"); } if (i >= 1 && i <= 8) { string commInfo = HKDevice.HK_PLC_S7.Write("DB4.DBX30." + (i - 1), true, 4); MessageNotify.GetInstance.ShowRunLog(commInfo); } else if (i >= 9 && i <= 15) { string commInfo1 = HKDevice.HK_PLC_S7.Write("DB4.DBX31." + (i - 9), true, 4); MessageNotify.GetInstance.ShowRunLog(commInfo1); } GVL_SmallStation.GetInstance.DosingTray1 = false; GVL_SmallStation.GetInstance.DosingTray1Loc = 0; } } if ((RTrig.GetInstance("配方配料完成").Start(HKDevice.HK_PLC_S7.Read("DB3.DBX1.1")))) { var res = Json.Data.Recipes.FirstOrDefault(p => p.RecipeCode == code); MessageNotify.GetInstance.ShowRunLog($"托盘1,配方{res.RecipeName},配料完成"); foreach (var item in RemoteRecipes.ElementAt(index).RawMaterial) { MessageNotify.GetInstance.ShowRunLog($"{item.RawMaterialName},下料重量:{item.Laying_Off_Weight}g"); } if (SiemensDevice.IsConnected) { RecipeFinishInfo.Order_No = RemoteRecipes.ElementAt(index).RecipeCode; RecipeFinishInfo.Product_Code = RemoteRecipes.ElementAt(index).RecipeName; RecipeFinishInfo.Job_No = (short)trayCode; for (int i = 0; i < 20; i++) { RecipeFinishInfo.Material[i] = new UDT1(); } for (int i = 0; i < 10; i++) { RecipeFinishInfo.Powder[i] = new UDT2(); } for (int i = 0; i < RemoteRecipes.ElementAt(index).RawMaterial.Count; 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 * (float)0.001; } for (int i = 0; i < RemoteRecipes.ElementAt(index).WindSend.Count; i++) { RecipeFinishInfo.Powder[i].Powder_Weight = RemoteRecipes.ElementAt(index).WindSend.ElementAt(i).DosingCompleWeight; } if (GVL_SmallStation.SiemensSendRecipeStatus == 6) { double a = DateTime.Now.Subtract(GVL_SmallStation.GetInstance.time1).TotalSeconds; GVL_SmallStation.SiemensSendRecipeStatus = 7; RecipeFinishInfo.Ask_For_Finish = true; RecipeFinishInfo.DosingTime = Convert.ToInt16(a); SiemensDevice.Siemens_PLC_S7.WriteClass(RecipeFinishInfo, 2261); } } App.Current.Dispatcher.Invoke(() => { Json.Data.Recipes.Remove(res); }); RecipeQueueTray1.TryDequeue(out code); HKDevice.HK_PLC_S7.Write("DB3.DBX1.1", false); GVL_SmallStation.GetInstance.RecipeStatusID = 0; } } } } } if (RecipeQueueTray2.Count > 0 && GVL_SmallStation.Station2HaveTray) { int index = Array.FindIndex(RemoteRecipes.ToArray(), p => p.RecipeCode == RecipeQueueTray2.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; if (trayCode == 2) { if (GVL_SmallStation.GetInstance.RecipeStatusIDTray2 == 0) { MessageNotify.GetInstance.ShowRunLog($"托盘2,配方:{recipeName},初始化"); foreach (var item in RemoteRecipes.ElementAt(index).RawMaterial) { HKDevice.StockBinPar((uint)item.RawMaterialBarrelNum, (ushort)item.RawMaterialLocation, 2); } HKDevice.HK_PLC_S7.Write("DB4.DBX1.4", true); GVL_SmallStation.GetInstance.RecipeStatusIDTray2 = 1; MessageNotify.GetInstance.ShowRunLog($"托盘2,配方:{recipeName},下发完成"); } if (HKDevice.HK_PLC_S7.Read("DB3.DBX1.4") && GVL_SmallStation.GetInstance.RecipeStatusIDTray2 == 1) { HKDevice.HK_PLC_S7.Write("DB3.DBX1.4", false); GVL_SmallStation.GetInstance.RecipeStatusIDTray2 = 2; MessageNotify.GetInstance.ShowRunLog($"配方:{recipeName},plc端 配方接收完成"); } if (GVL_SmallStation.GetInstance.RecipeStatusIDTray2 == 2) { if (RTrig.GetInstance("DB3.DBX50.4").Start(HKDevice.HK_PLC_S7.Read("DB3.DBX50.4"))) { var res = HKDevice.HK_PLC_S7.Read("DB3.DBD26"); MessageNotify.GetInstance.ShowRunLog($"托盘2,配方:{recipeName},1号桶,{res}料仓,允许配料"); 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 >= 0) { DeviceInquire.GetInstance.GetDevice((int)loc)?.Start((uint)weight);//根据料仓编号 启动并写入每个原料重量 GVL_SmallStation.GetInstance.StockInIsWork = (int)loc; } GVL_SmallStation.GetInstance.DosingTray2 = true; GVL_SmallStation.GetInstance.DosingTray2Loc = (int)loc; MessageNotify.GetInstance.ShowRunLog($"托盘2,配方:{recipeName},1号桶,{(int)loc}号仓,配料完成"); } } else if (RTrig.GetInstance("DB3.DBX50.5").Start(HKDevice.HK_PLC_S7.Read("DB3.DBX50.5"))) { var res = HKDevice.HK_PLC_S7.Read("DB3.DBD30"); MessageNotify.GetInstance.ShowRunLog($"托盘2,配方:{recipeName},2号桶,{res}料仓,允许配料"); 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 >= 0) { DeviceInquire.GetInstance.GetDevice((int)loc)?.Start((uint)weight);//启动并写入每个原料重量 GVL_SmallStation.GetInstance.StockInIsWork = (int)loc; } GVL_SmallStation.GetInstance.DosingTray2 = true; GVL_SmallStation.GetInstance.DosingTray2Loc = (int)loc; MessageNotify.GetInstance.ShowRunLog($"托盘2,配方:{recipeName},2号桶,{(int)loc}号仓,配料完成"); } } else if (RTrig.GetInstance("DB3.DBX50.6").Start(HKDevice.HK_PLC_S7.Read("DB3.DBX50.6"))) { var res = HKDevice.HK_PLC_S7.Read("DB3.DBD34"); MessageNotify.GetInstance.ShowRunLog($"托盘2,配方:{recipeName},3号桶,{res}料仓,允许配料"); 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 >= 0) { DeviceInquire.GetInstance.GetDevice((int)loc)?.Start((uint)weight);//启动并写入每个原料重量 GVL_SmallStation.GetInstance.StockInIsWork = (int)loc; } GVL_SmallStation.GetInstance.DosingTray2 = true; GVL_SmallStation.GetInstance.DosingTray2Loc = (int)loc; MessageNotify.GetInstance.ShowRunLog($"托盘2,配方:{recipeName},3号桶,{(int)loc}号仓,配料完成"); } } else if (RTrig.GetInstance("DB3.DBX50.7").Start(HKDevice.HK_PLC_S7.Read("DB3.DBX50.7"))) { var res = HKDevice.HK_PLC_S7.Read("DB3.DBD38"); MessageNotify.GetInstance.ShowRunLog($"托盘2,配方:{recipeName},4号桶,{res}料仓,允许配料"); 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 >= 0) { DeviceInquire.GetInstance.GetDevice((int)loc)?.Start((uint)weight);//启动并写入每个原料重量 GVL_SmallStation.GetInstance.StockInIsWork = (int)loc; } GVL_SmallStation.GetInstance.DosingTray2 = true; GVL_SmallStation.GetInstance.DosingTray2Loc = (int)loc; MessageNotify.GetInstance.ShowRunLog($"托盘2,配方:{recipeName},4号桶,{(int)loc}号仓,配料完成"); } } if (GVL_SmallStation.GetInstance.DosingTray2 == true && GVL_SmallStation.GetInstance.DosingTray1 == false && GVL_SmallStation.GetInstance.DosingTray2Loc > 0 && GVL_SmallStation.GetInstance.DosingTray2Loc < 16) { int i = GVL_SmallStation.GetInstance.DosingTray2Loc; if (RTrig.GetInstance("Tray2StatusDevice" + i).Start(DeviceInquire.GetInstance.GetDevice(i).deviceStatus.RunStatus == 3)) { MessageNotify.GetInstance.ShowRunLog($"柔性味魔方,托盘2,配方:{recipeName},{i}号仓,配料完成"); 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.NowWeightFeedback; bool info = DeviceInquire.GetInstance.GetDevice(i).StatusReset(); if (info) { MessageNotify.GetInstance.ShowRunLog($"柔性味魔方配料完成后复位 发送成功"); } else { MessageNotify.GetInstance.ShowRunLog($"柔性味魔方配料完成后复位 发送失败"); } if (i >= 1 && i <= 8) { string commInfo = HKDevice.HK_PLC_S7.Write("DB4.DBX30." + (i - 1), true, 4); MessageNotify.GetInstance.ShowRunLog(commInfo); } else if (i >= 9 && i <= 15) { string commInfo1 = HKDevice.HK_PLC_S7.Write("DB4.DBX31." + (i - 9), true, 4); MessageNotify.GetInstance.ShowRunLog(commInfo1); } GVL_SmallStation.GetInstance.DosingTray2 = false; GVL_SmallStation.GetInstance.DosingTray2Loc = 0; } } if (RTrig.GetInstance("DB3.DBX1.2").Start(HKDevice.HK_PLC_S7.Read("DB3.DBX1.2"))) { var res = Json.Data.Recipes.FirstOrDefault(p => p.RecipeCode == code); MessageNotify.GetInstance.ShowRunLog($"托盘2,配方{res.RecipeName},配料完成"); RecipeFinishInfo.Order_No = RemoteRecipes.ElementAt(index).RecipeCode; RecipeFinishInfo.Product_Code = RemoteRecipes.ElementAt(index).RecipeName; for (int i = 0; i < RemoteRecipes.ElementAt(index).RawMaterial.Count; i++) { RecipeFinishInfo.Material[i] = new UDT1(); 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; } if (SiemensDevice.IsConnected) { RecipeFinishInfo.Ask_For_Finish = true; SiemensDevice.Siemens_PLC_S7.WriteClass(RecipeFinishInfo, 2261); } App.Current.Dispatcher.Invoke(() => { Json.Data.Recipes.Remove(res); }); RecipeQueueTray2.TryDequeue(out code); HKDevice.HK_PLC_S7.Write("DB3.DBX1.2", false); GVL_SmallStation.GetInstance.RecipeStatusIDTray2 = 0; } } } } } } private void StockBinInit() { for (int i = 1; i < 16; i++) { if (DeviceInquire.GetInstance.GetDevice(i).deviceStatus.RunStatus == 3) { DeviceInquire.GetInstance.GetDevice(i).StatusReset(); } } } private void DosingDevice(int Index,int DeviceID) { if (RTrig.GetInstance("Tray2StatusDevice" + DeviceID).Start(DeviceInquire.GetInstance.GetDevice(DeviceID).deviceStatus.RunStatus == 3)) { MessageNotify.GetInstance.ShowRunLog($"柔性味魔方,托盘2,配方:{RemoteRecipes.ElementAt(Index).RecipeName},{DeviceID}号仓,配料完成"); int res = Array.FindIndex(RemoteRecipes.ElementAt(Index).RawMaterial.ToArray(), p => p.RawMaterialLocation == DeviceID); RemoteRecipes.ElementAt(Index).RawMaterial.ElementAt(res).Laying_Off_Weight = DeviceInquire.GetInstance.GetDevice(DeviceID).deviceStatus.CutWeightFeedback; DeviceInquire.GetInstance.GetDevice(DeviceID).StatusReset(); if (DeviceID >= 1 && DeviceID <= 8) { HKDevice.HK_PLC_S7.Write("DB4.DBX30." + (DeviceID - 1), true); } else if (DeviceID >= 9 && DeviceID <= 15) { HKDevice.HK_PLC_S7.Write("DB4.DBX31." + (DeviceID - 9), true); } } } private void testData() { RawMaterialsNamePos.Add("0051", 3); RawMaterialsNamePos.Add("0052", 4); RawMaterialsNamePos.Add("0054", 5); RawMaterialsNamePos.Add("0057", 6); RawMaterialsNamePos.Add("0050", 8); RawMaterialsNamePos.Add("0048", 13); RawMaterialsNamePos.Add("0036", 13);//I+G RawMaterialsNamePos.Add("0037", 13);//味精 RawMaterialsNamePos.Add("0038", 13);//白糖 } public short SetBitValue(short data, byte offset, bool val) { if (offset > 16 || offset < 1) { return data; } short num = (short)(1 << offset - 1); return (short)(val ? (data | num) : (data & ~num)); } } }