diff --git a/BPASmartClient.Model/柔性味魔方/RawMaterialModel.cs b/BPASmartClient.Model/柔性味魔方/RawMaterialModel.cs index 2f21354e..bfff1159 100644 --- a/BPASmartClient.Model/柔性味魔方/RawMaterialModel.cs +++ b/BPASmartClient.Model/柔性味魔方/RawMaterialModel.cs @@ -13,6 +13,11 @@ namespace BPASmartClient.Model /// public class RawMaterialModel : NotifyBase { + /// + /// 配方料仓下料总量 + /// + public float TotalWeight { get { return _totalWeight; } set { _totalWeight = value; OnPropertyChanged(); } } + private float _totalWeight; /// /// 原料名称 /// diff --git a/DosingSystem/App.xaml.cs b/DosingSystem/App.xaml.cs index ceaf34e5..ad3e9562 100644 --- a/DosingSystem/App.xaml.cs +++ b/DosingSystem/App.xaml.cs @@ -6,6 +6,7 @@ using BPASmartClient.CustomResource.Pages.ViewModel; using BPASmartClient.DosingSystem.Model; using BPASmartClient.DosingSystem.Model.MQTT; using BPASmartClient.DosingSystem.Service; +using Google.Protobuf.WellKnownTypes; using System; using System.Collections.ObjectModel; using System.Collections.Specialized; @@ -14,6 +15,7 @@ using System.Diagnostics; using System.Threading; using System.Threading.Tasks; using System.Windows; +using Enum = System.Enum; namespace BPASmartClient.DosingSystem { @@ -102,11 +104,28 @@ namespace BPASmartClient.DosingSystem } else mv.Close(); + /*if (Json.Data.deviceParModels.Count == 0) + { + for (int i = 0; i < Json.Data.BaseParModel.StockCount; i++) + { + DeviceParModel devicePar = new DeviceParModel(); + devicePar.MaterialName = $"{i+1}"; + devicePar.SlowlyAddWeight = 50; + devicePar.PreCloseValveWeight = 3; + devicePar.RapidAcceleration = 20000; + devicePar.SlowAcceleration = 0; + devicePar.ServoManualSpeed = 20000; + devicePar.SiloUpperLimitWeight = 0; + devicePar.LowerLimitWeightOfSilo = 0; + devicePar.StirringSpeed = 0; + Json.Data.deviceParModels.Add(devicePar); + } + } + Json.Save();*/ //ServerFactory.GetInstance.Set(new APIServer()); //MqttServer.GetInstance.Init(); MainWindow = mv; } - protected override void OnExit(ExitEventArgs e) { base.OnExit(e); @@ -114,11 +133,13 @@ namespace BPASmartClient.DosingSystem //excute?.MqttDisConnect(); Json.Save(); Json.Save(); + Json.Save(); Json.Save(); BPASmartClient.CustomResource.Pages.Model.MessageNotify.GetInstance.LogSave(); TaskManage.GetInstance.Dispose(); //Process.GetCurrentProcess().Kill(); } + private void MenuInit() { @@ -378,6 +399,7 @@ namespace BPASmartClient.DosingSystem { //Config.GetInstance.Init(); Json.Read(); + Json.Read(); Json.Read(); Json.Read(); } diff --git a/DosingSystem/BPASmartClient.DosingSystem.csproj b/DosingSystem/BPASmartClient.DosingSystem.csproj index 09bb0f4a..eb7f063c 100644 --- a/DosingSystem/BPASmartClient.DosingSystem.csproj +++ b/DosingSystem/BPASmartClient.DosingSystem.csproj @@ -30,6 +30,7 @@ + diff --git a/DosingSystem/ExcuteControl .cs b/DosingSystem/ExcuteControl .cs index 11ae142f..10326ec0 100644 --- a/DosingSystem/ExcuteControl .cs +++ b/DosingSystem/ExcuteControl .cs @@ -31,6 +31,10 @@ using System.Text.RegularExpressions; using static System.Resources.ResXFileRef; using BPASmartClient.DosingSystem.Model.Dto; using BPASmartClient.DosingSystem.Model.MQTT; +using Microsoft.VisualBasic.Logging; +using Org.BouncyCastle.Asn1.Utilities; +using Google.Protobuf.WellKnownTypes; +using System.Windows; namespace BPASmartClient.DosingSystem { @@ -48,6 +52,8 @@ namespace BPASmartClient.DosingSystem public ObservableCollection Recipes { get; set; } = Json.Data.Recipes; public ObservableCollection StockStatus = new ObservableCollection(); + public Action Raction { get; set; } + public string CurrentRecipeName { get; set; } /// /// 当前正在制作的配方 @@ -367,10 +373,11 @@ namespace BPASmartClient.DosingSystem Json.Data.Recipes.ElementAt(index).IsEnable = false; } MessageNotify.GetInstance.ShowUserLog($"下发工单 {Recipes.ElementAt(index).RecipeName}"); - RecipeNames.Enqueue(RecipeName); + RecipeNames.Enqueue( RecipeName); var res = Recipes.FirstOrDefault(p => p.RecipeName == RecipeName); App.Current.Dispatcher.Invoke(() => { UserTreeWait.Add(new RecipeModel { RecipStatus = "等待制作", SerialNum = UserTreeWait.Count + 1, RecipeName = RecipeName, RawMaterials = res.RawMaterials }); }); } + App.Current.Dispatcher.Invoke(() => { NoticeDemoViewModel.OpenMsg(EnumPromptType.Success, App.MainWindow, "提示", $"配方下发成功!"); }); MessageNotify.GetInstance.runLogs.Add(new RunLog() { RunLogInfo = $"下发配方:{RecipeNames.Count}", Time = DateTime.Now.ToString() }); @@ -388,27 +395,30 @@ namespace BPASmartClient.DosingSystem List tasks = new(); tasks.Add( SimensSend.GetInstance.SendSimens.WriteAsync("M0.0", false)); tasks.Add( SimensSend.GetInstance.SendSimens.WriteAsync("M0.1", false)); - foreach (var item in DeviceInquire.GetInstance.DeviceLists.Values) + /* foreach (var item in DeviceInquire.GetInstance.DeviceLists.Values) { tasks.Add( item.modbusTcp.WriteAsync(DeviceAddress.TranspportSwitch.ToAdd(), 0)); } - Task.WaitAll(tasks.ToArray(),TimeSpan.FromSeconds(5)); + Task.WaitAll(tasks.ToArray(),TimeSpan.FromSeconds(5));*/ } public void ShutDown() { TaskManage.GetInstance.StopTask("设备下发配方"); - TaskManage.GetInstance.StopTask("下发设备参数"); - TaskManage.GetInstance.StopTask("控制传送带"); + TaskManage.GetInstance.StopTask("监控允许配料点位"); + TaskManage.GetInstance.StopTask("下料控制"); List tasks = new(); tasks.Add(SimensSend.GetInstance.SendSimens.WriteAsync("M0.0", false)); tasks.Add(SimensSend.GetInstance.SendSimens.WriteAsync("M0.1", false)); - var writeTasks = DeviceInquire.GetInstance.DeviceLists.Values.Select(async item => + /*var writeTasks = DeviceInquire.GetInstance.DeviceLists.Values.Select(async item => { bool writeSuccessful = false; int maxRetries = 3; int retryCount = 0; - + while (item.deviceStatus.TranspportSwitch == (ushort)1) + { + item.modbusTcp.Write(DeviceAddress.TranspportSwitch.ToAdd(), (ushort)0); + } while (!writeSuccessful && retryCount < maxRetries) { var result = await item.modbusTcp.WriteAsync(DeviceAddress.TranspportSwitch.ToAdd(), 0); @@ -422,21 +432,126 @@ namespace BPASmartClient.DosingSystem retryCount++; } } - }); + });*/ - tasks.AddRange(writeTasks); + /*tasks.AddRange(writeTasks);*/ Task.WaitAll(tasks.ToArray(), TimeSpan.FromSeconds(5)); } - private void MatchRun() + public ConcurrentDictionary rTrig = new ConcurrentDictionary(); + public ConcurrentDictionary tTrig = new ConcurrentDictionary(); + bool stop = true; + + + + private void MonitorStatus() { + TaskManage.GetInstance.StartLong(() => + { + for (int i = 0; i < DeviceInquire.GetInstance.devices.Count; i++) + { + if (DeviceInquire.GetInstance.DeviceLists.ContainsKey(DeviceInquire.GetInstance.devices[i].IpAddress)) + { + if (!rTrig.ContainsKey(DeviceInquire.GetInstance.devices[i].IpAddress)) + { + rTrig.TryAdd(DeviceInquire.GetInstance.devices[i].IpAddress, false); + } + if (!tTrig.ContainsKey(DeviceInquire.GetInstance.devices[i].IpAddress)) + { + tTrig.TryAdd(DeviceInquire.GetInstance.devices[i].IpAddress, false); + } + RTrig.GetInstance(DeviceInquire.GetInstance.devices[i].IpAddress).Start(DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.PailArrive); + TTrig.GetInstance(DeviceInquire.GetInstance.devices[i].IpAddress).Start(DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.Finish_mt); + if (RTrig.GetInstance(DeviceInquire.GetInstance.devices[i].IpAddress).Q) + { + MessageNotify.GetInstance.ShowRunLog($"检测到上升源"); + if (rTrig.ContainsKey(DeviceInquire.GetInstance.devices[i].IpAddress)) + { + rTrig.TryUpdate(DeviceInquire.GetInstance.devices[i].IpAddress, true, false); + } + else + { + rTrig.TryAdd(DeviceInquire.GetInstance.devices[i].IpAddress, true); + } + } + if (TTrig.GetInstance(DeviceInquire.GetInstance.devices[i].IpAddress).Q) + { + MessageNotify.GetInstance.ShowRunLog($"检测到下降源"); + if (tTrig.ContainsKey(DeviceInquire.GetInstance.devices[i].IpAddress)) + { + tTrig.TryUpdate(DeviceInquire.GetInstance.devices[i].IpAddress, true, false); + } + else + { + tTrig.TryAdd(DeviceInquire.GetInstance.devices[i].IpAddress, true); + } + } + + if (rTrig[DeviceInquire.GetInstance.devices[i].IpAddress] || tTrig[DeviceInquire.GetInstance.devices[i].IpAddress]) + { + int recipeNameNum = doDeviceCount[DeviceInquire.GetInstance.devices[i].IpAddress]; + if (recipeNameNum >= 0) + { + int doCount = Array.FindIndex(Recipes.ToArray(), p => p.RecipeName == RecipeNames.ElementAt(recipeNameNum - 1)); + if (doCount >= 0) + { + int res = Recipes.ElementAt(doCount).RawMaterials.ToList().FindIndex(a => a.RawMaterialName == DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].DeviceName && a.Loc == DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.PassPail); + if (res>=0) + { + int finish = UserTreeCompelete.Count; + int re =0; + int re_1 = 0; + if (recipeNameNum - finish<=recipeProcesses.Count) + { + re = recipeProcesses.ElementAt(recipeProcesses.Count-(recipeNameNum-finish)).RawMaterials.ToList().FindIndex(a => a.RawMaterialName == DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].DeviceName && a.Loc == DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.PassPail && a.RecipeStatus == 1); + re_1 = recipeProcesses.ElementAt(recipeProcesses.Count - (recipeNameNum - finish)).RawMaterials.ToList().FindIndex(a => a.RawMaterialName == DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].DeviceName && a.Loc == DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.PassPail && a.RecipeStatus == 2); + } + + if (rTrig[DeviceInquire.GetInstance.devices[i].IpAddress] && re>=0) + { + MessageNotify.GetInstance.ShowRunLog($"找到配方桶,开始下{Recipes.ElementAt(doCount).RawMaterials.ElementAt(res).RawMaterialWeight}g料"); + recipeProcesses.ElementAt(recipeNameNum - finish - 1).RawMaterials.ElementAt(re).RecipeStatus = 2; + Raction?.Invoke(DeviceInquire.GetInstance.devices[i].IpAddress, Recipes.ElementAt(doCount).RawMaterials.ElementAt(res).RawMaterialWeight); + rTrig.TryUpdate(DeviceInquire.GetInstance.devices[i].IpAddress,false,true); + } + + if (tTrig[DeviceInquire.GetInstance.devices[i].IpAddress] &&re_1>=0) + { + recipeProcesses.ElementAt(recipeNameNum - finish - 1).RawMaterials.ElementAt(re_1).RecipeStatus = 3; + Recipes.ElementAt(doCount).RawMaterials.ElementAt(res).TotalWeight = DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.CutWeightFeedback; + MessageNotify.GetInstance.ShowRunLog($"设备{DeviceInquire.GetInstance.devices[i].IpAddress}已下料{Recipes.ElementAt(doCount).RawMaterials.ElementAt(res).TotalWeight}g"); + tTrig.TryUpdate(DeviceInquire.GetInstance.devices[i].IpAddress, false, true); + } + + } + } + } + } + } + } + Thread.Sleep(10); + }, "监控允许配料点位"); + } + private void MatchRun() + { + MonitorStatus(); recipeProcesses.Clear(); + /*recipeProcesses = new ObservableCollection(Json.Data.Recipes.ToList()?.FindAll(o => o.RecipStatus == "正在制作")); + foreach (var recipe in recipeProcesses) + { + RecipeNames.Enqueue(recipe.RecipeName); + } + App.Current.Dispatcher.Invoke(() => { recipeProcesses.Add(Recipes.ElementAt(0)); });*/ + TaskManage.GetInstance.StartLong(() => { - if (RecipeNames.Count > 0) + + if (RecipeNames.Count > 0 && SimensSend.GetInstance.IsConnect) { SimensSend.GetInstance.SendSimens.Write("M0.0", true); SimensSend.GetInstance.SendSimens.Write("M0.1", true); + //下发设备参数 + //遍历每一个味魔方。 for (int i = 0; i < DeviceInquire.GetInstance.devices.Count; i++) { @@ -446,174 +561,223 @@ namespace BPASmartClient.DosingSystem //只有设备在等待配料状态才能下发数据 if (DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.RunStatus == 1) { - //判断MaxPassPail--配方的最大桶数,小于已经通过的桶数。 - if (DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.MaxPassPail <= DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.PassPail && DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.PailArrive == 0) + if (doDeviceCount.ContainsKey(DeviceInquire.GetInstance.devices[i].IpAddress)) { - if (doDeviceCount.ContainsKey(DeviceInquire.GetInstance.devices[i].IpAddress)) + int index = 0;//配方索引 + int maxPail = 0;//最大桶数 + List device_Loc = new List();//下发桶号 + int recipeNameNum = doDeviceCount[DeviceInquire.GetInstance.devices[i].IpAddress]; + var dnum = DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.DeviceNum; + if (recipeNameNum == 0) { - int index = 0; - // 该味魔方已经完成的配方数目。 - int recipeNameNum = doDeviceCount[DeviceInquire.GetInstance.devices[i].IpAddress]; - //设备已执行的配方必须小于已经下发的配方。所以每次开启软件时 必须清零设备上的数据。 - if (recipeNameNum == DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.DoRecipeCount && recipeNameNum < RecipeNames.Count) + MessageNotify.GetInstance.ShowRunLog("执行首个配方"); + index = Array.FindIndex(Recipes.ToArray(), p => p.RecipeName == RecipeNames.ElementAt(recipeNameNum)); + if (index >= 0 && dnum > 0) { - //查找配方。根据名称查找。 - index = Array.FindIndex(Recipes.ToArray(), p => p.RecipeName == RecipeNames.ElementAt(recipeNameNum)); - if (index >= 0 && index < Recipes.Count) + foreach (var rawMaterial in Recipes.ElementAt(index).RawMaterials) { - int maxPail = 0; - //查找配方的最大桶号。 - foreach (var rawMaterial in Recipes.ElementAt(index).RawMaterials) + if (rawMaterial.Loc > maxPail) { - if (rawMaterial.Loc > maxPail) - { - maxPail = rawMaterial.Loc; - } + maxPail = rawMaterial.Loc; } - //清除下位设备的最大桶号,下位设备认为配方制作完一个了。 - DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].modbusTcp.Write(DeviceAddress.DeletePassPail.ToAdd(), 1); - DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].modbusTcp.Write(DeviceAddress.MaxPail.ToAdd(), (ushort)maxPail); + if (rawMaterial.DeviceIp == DeviceInquire.GetInstance.devices[i].IpAddress) + { + device_Loc.Add(rawMaterial.Loc); + } + } + MessageNotify.GetInstance.ShowRunLog($"{DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.PassPail}/{maxPail}/{device_Loc}"); + if (DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.PassPail == 0) + { doDeviceCount.TryUpdate(DeviceInquire.GetInstance.devices[i].IpAddress, recipeNameNum + 1, doDeviceCount[DeviceInquire.GetInstance.devices[i].IpAddress]); - - App.Current.Dispatcher.Invoke(() => { NoticeDemoViewModel.OpenMsg(EnumPromptType.Success, App.MainWindow, "提示", $"配方{RecipeNames.ElementAt(recipeNameNum)}{recipeNameNum}下发到设备{DeviceInquire.GetInstance.devices[i].DeviceName}"); }); - //必须等第一台设备下发成功了,才算正在进行。 - if (doDeviceCount.ContainsKey("192.168.2.10") && UserTreeWait.Count > 0 && doDeviceCount["192.168.2.10"] > recipeProcesses.Count) + foreach (var down_Loc in device_Loc) + { + SimensSend.GetInstance.SendSimens.Write($"DB1.DBX{710 + 4 * (dnum - 1) + (int)((down_Loc - 1) / 8)}.{(down_Loc - 1) % 8}", true); + } + SimensSend.GetInstance.SendSimens.Write($"DB1.DBW{106 + 2 * (dnum - 1)}", 500); + MessageNotify.GetInstance.ShowRunLog($"设备{dnum}下发配方{RecipeNames.ElementAt(recipeNameNum)}"); + if (dnum == 1) { App.Current.Dispatcher.Invoke(() => { - recipeProcesses.Insert(0, UserTreeWait?.ToList().Find(a => a.RecipeName == RecipeNames.ElementAt(recipeNameNum))); + RecipeModel recipe = UserTreeWait?.ToList().Find(a => a.RecipeName == RecipeNames.ElementAt(recipeNameNum)); + recipe.RecipStatus = "正在配料"; + recipeProcesses.Insert(0, recipe); + /*Json.Data.Recipes.Insert(0, recipe); + Json.Save();*/ UserTreeWait.RemoveAt(UserTreeWait.ToList().FindIndex(a => a.RecipeName == RecipeNames.ElementAt(recipeNameNum))); }); } - // - if (DeviceInquire.GetInstance.devices[i].IpAddress == "192.168.2.180" && recipeNameNum > 1 && recipeProcesses.Count > 0) + } + } + } + if (recipeNameNum > 0 && recipeNameNum <= RecipeNames.Count) + { + index = Array.FindIndex(Recipes.ToArray(), p => p.RecipeName == RecipeNames.ElementAt(recipeNameNum - 1)); + if (index >= 0 && dnum > 0) + { + foreach (var rawMaterial in Recipes.ElementAt(index).RawMaterials) + { + if (rawMaterial.Loc > maxPail) + { + maxPail = rawMaterial.Loc; + } + if (rawMaterial.DeviceIp == DeviceInquire.GetInstance.devices[i].IpAddress) { - App.Current.Dispatcher.Invoke(() => + device_Loc.Add(rawMaterial.Loc); + } + } + if (dnum == 18 && maxPail <= DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.PassPail) + { + App.Current.Dispatcher.Invoke(() => + { + RecipeModel recipe = recipeProcesses?.ToList().Find(a => a.RecipeName == RecipeNames.ElementAt(recipeNameNum)); + if (recipe.RecipStatus != "制作完成") { - RecipeModel recipe = recipeProcesses?.ToList().Find(a => a.RecipeName == RecipeNames.ElementAt(recipeNameNum)); + /*Json.Data.Recipes.RemoveAt(recipeProcesses.ToList().FindIndex(a => a.RecipeName == RecipeNames.ElementAt(recipeNameNum))); + Json.Save();*/ recipe.RecipStatus = "制作完成"; UserTreeCompelete.Insert(0, recipe); recipeProcesses.RemoveAt(recipeProcesses.ToList().FindIndex(a => a.RecipeName == RecipeNames.ElementAt(recipeNameNum))); + } + }); + } + if (maxPail <= DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.PassPail&& recipeNameNum < RecipeNames.Count) + { + MessageNotify.GetInstance.ShowRunLog("下发下一个配方"); + doDeviceCount.TryUpdate(DeviceInquire.GetInstance.devices[i].IpAddress, recipeNameNum + 1, doDeviceCount[DeviceInquire.GetInstance.devices[i].IpAddress]); + index = Array.FindIndex(Recipes.ToArray(), p => p.RecipeName == RecipeNames.ElementAt(recipeNameNum-1)); + if (index >= 0) + { + foreach (var rawMaterial in Recipes.ElementAt(index).RawMaterials) + { + if (rawMaterial.Loc > maxPail) + { + maxPail = rawMaterial.Loc; + } + if (rawMaterial.DeviceIp == DeviceInquire.GetInstance.devices[i].IpAddress) + { + device_Loc.Add(rawMaterial.Loc); + } + } + } + foreach (var down_Loc in device_Loc) + { + SimensSend.GetInstance.SendSimens.Write($"DB1.DBX{710 + 4 * (dnum - 1) + (int)((down_Loc - 1) / 8)}.{(down_Loc - 1) % 8}", true); + } + SimensSend.GetInstance.SendSimens.Write($"DB1.DBW{106 + 2 * (dnum - 1)}", 600); + SimensSend.GetInstance.SendSimens.Write($"DB1.DBW{810 + 2 * (dnum - 1)}", 0); + MessageNotify.GetInstance.ShowRunLog($"设备{dnum}下发配方{RecipeNames.ElementAt(recipeNameNum)},桶数已清零"); + if (dnum == 1) + { + App.Current.Dispatcher.Invoke(() => + { + RecipeModel recipe = UserTreeWait?.ToList().Find(a => a.RecipeName == RecipeNames.ElementAt(recipeNameNum)); + recipe.RecipStatus = "正在配料"; + recipeProcesses.Insert(0, recipe); + /* Json.Data.Recipes.Insert(0, recipe); + Json.Save();*/ + UserTreeWait.RemoveAt(UserTreeWait.ToList().FindIndex(a => a.RecipeName == RecipeNames.ElementAt(recipeNameNum))); }); } } - } } - else - { - doDeviceCount.TryAdd(DeviceInquire.GetInstance.devices[i].IpAddress, 0); - } } + else + { + doDeviceCount.TryAdd(DeviceInquire.GetInstance.devices[i].IpAddress, 0); + } } + } + + + } - //if (doDeviceCount.ContainsKey("192.168.2.10")&&doDeviceCount.ContainsKey($"192.168.2.{Json.Data.BaseParModel.StockCount * 10}")) - //{ - // if (doDeviceCount[$"192.168.2.{Json.Data.BaseParModel.StockCount * 10}"] > 0 && DeviceInquire.GetInstance.DeviceLists[$"192.168.2.{Json.Data.BaseParModel.StockCount * 10}"].deviceStatus.DoRecipeCount == doDeviceCount[$"192.168.2.{Json.Data.BaseParModel.StockCount * 10}"]) - // { - // App.Current.Dispatcher.Invoke(new Action(() => - // { - // UserTreeCompelete.Insert(0, recipeProcesses.Last()); - // recipeProcesses.Remove(recipeProcesses.Last()); - // })); - - // } - // if (DeviceInquire.GetInstance.DeviceLists["192.168.2.10"].deviceStatus.DoRecipeCount == doDeviceCount["192.168.2.10"]) - // { - // App.Current.Dispatcher.Invoke(new Action(() => - // { - // if (UserTreeWait.Count > 0) - // { - // recipeProcesses.Insert(0, UserTreeWait[0]); - // UserTreeWait.RemoveAt(0); - // } - // })); - // } - //} - - } - Thread.Sleep(10); }, "设备下发配方"); - TaskManage.GetInstance.StartLong(() => + MessageNotify.GetInstance.ShowRunLog($"设备下发配方运行"); + Raction = ((s,f) => { + while (!DeviceInquire.GetInstance.DeviceLists[s].modbusTcp.Write(DeviceAddress.WeightSet.ToAdd(), f).IsSuccess) + { + DeviceInquire.GetInstance.DeviceLists[s].modbusTcp.Write(DeviceAddress.WeightSet.ToAdd(), f); + } + while (!DeviceInquire.GetInstance.DeviceLists[s].modbusTcp.Write(DeviceAddress.Start.ToAdd(), 1).IsSuccess) + { + DeviceInquire.GetInstance.DeviceLists[s].modbusTcp.Write(DeviceAddress.Start.ToAdd(), 1); + stop = false; + } + stop = true; + MessageNotify.GetInstance.ShowRunLog($"允许下发复位信号"); + }); + + + TaskManage.GetInstance.StartLong(() => + { for (int i = 0; i < DeviceInquire.GetInstance.devices.Count; i++) { - if (DeviceInquire.GetInstance.DeviceLists.ContainsKey(DeviceInquire.GetInstance.devices[i].IpAddress) && doDeviceCount.ContainsKey(DeviceInquire.GetInstance.devices[i].IpAddress)) + if (DeviceInquire.GetInstance.DeviceLists.ContainsKey(DeviceInquire.GetInstance.devices[i].IpAddress)) { - //判断桶到位 和 状态为等待配料。 - if (DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.PailArrive == 1 && DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.RunStatus == 1 && DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.DoRecipeCount > 0) + if (DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.Finish_mt) + { + int dnum = DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.DeviceNum; + SimensSend.GetInstance.SendSimens.Write($"DB1.DBX70{(int)((dnum-1)/8)}.{(dnum-1)%8}", true); + MessageNotify.GetInstance.ShowRunLog($"设备{dnum}下发完成信号"); + } + if (DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.RunStatus==2&& DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.RunStatus==3) { - int doCount = Array.FindIndex(Recipes.ToArray(), p => p.RecipeName == RecipeNames.ElementAt(DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.DoRecipeCount - 1)); - if (doCount >= 0 && doCount < Recipes.Count) + if (stop) { - //根据物料名称查找 - var res = Recipes.ElementAt(doCount).RawMaterials?.ToList().FindAll(a => a.RawMaterialName == DeviceInquire.GetInstance.devices[i].DeviceName); - - foreach (RawMaterialModel item in res) + MessageNotify.GetInstance.ShowRunLog($"下发复位信号"); + while (DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].modbusTcp.Write(DeviceAddress.Start.ToAdd(), 0).IsSuccess) { - //可能是多个桶都需要下同一种料,根据已通过桶数和当前物料信息的通号做对比。 - if (item != null && item.Loc == DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.PassPail) - { - DeviceParModel deviceSet = Json.Data.deviceParModels?.ToList().Find(a => a.MaterialName == DeviceInquire.GetInstance.devices[i].DeviceName); - if (deviceSet != null && DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].IsConnected == true) - { - var deviceModbus = DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].modbusTcp; - //传送带停止 - deviceModbus.Write(DeviceAddress.TranspportSwitch.ToAdd(), 0); - Thread.Sleep(50); - //设置下料重量 - deviceModbus.Write(DeviceAddress.WeightSet.ToAdd(), item.RawMaterialWeight); - Thread.Sleep(50); - //设置慢加重量 - deviceModbus.Write(DeviceAddress.SlowlyAddWeight.ToAdd(), deviceSet.SlowlyAddWeight); - Thread.Sleep(50); - //设置提前关阀重量 - deviceModbus.Write(DeviceAddress.PreCloseValveWeight.ToAdd(), deviceSet.PreCloseValveWeight); - Thread.Sleep(50); - - //设置快慢加速度 - deviceModbus.Write(DeviceAddress.SlowAcceleration.ToAdd(), (int)deviceSet.SlowAcceleration); - Thread.Sleep(50); - deviceModbus.Write(DeviceAddress.RapidAcceleration.ToAdd(), (int)deviceSet.RapidAcceleration); - Thread.Sleep(50); - - //设置伺服手动速度 - deviceModbus.Write(DeviceAddress.ServoManualSpeed.ToAdd(), deviceSet.ServoManualSpeed); - Thread.Sleep(50); - //设置料仓上下限重量 - deviceModbus.Write(DeviceAddress.SiloUpperLimitWeight.ToAdd(), deviceSet.SiloUpperLimitWeight); - Thread.Sleep(50); - deviceModbus.Write(DeviceAddress.LowerLimitWeightOfSilo.ToAdd(), deviceSet.LowerLimitWeightOfSilo); - Thread.Sleep(50); - //开始配料信号 - deviceModbus.Write(DeviceAddress.Start.ToAdd(), (ushort)1); - ////设置搅拌速度 - //DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].modbusTcp.Write(DeviceAddress.StirringSpeed.ToAdd(), deviceSet.StirringSpeed); - } - } + DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].modbusTcp.Write(DeviceAddress.Start.ToAdd(), 0); } } + } + } + } + Thread.Sleep(10); + }, "下料控制"); + MessageNotify.GetInstance.ShowRunLog($"下料控制运行"); + + //弃用 + /*TaskManage.GetInstance.StartLong(() => + { + for (int i = 0; i < DeviceInquire.GetInstance.devices.Count; i++) + { + if (DeviceInquire.GetInstance.DeviceLists.ContainsKey(DeviceInquire.GetInstance.devices[i].IpAddress) && doDeviceCount.ContainsKey(DeviceInquire.GetInstance.devices[i].IpAddress)) + { + if (DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.PailArrive && doDeviceCount[DeviceInquire.GetInstance.devices[i].IpAddress] >= 0) + { + int recipeNameNum = doDeviceCount[DeviceInquire.GetInstance.devices[i].IpAddress]; + int doCount = Array.FindIndex(Recipes.ToArray(), p => p.RecipeName == RecipeNames.ElementAt(recipeNameNum)); + var res = Recipes.ElementAt(doCount).RawMaterials?.ToList().Find(a => a.RawMaterialName == DeviceInquire.GetInstance.devices[i].DeviceName && a.Loc == DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.PassPail); + if (res != null) + { + var deviceModbus = DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].modbusTcp; + deviceModbus.Write(DeviceAddress.WeightSet.ToAdd(), res.RawMaterialWeight); + deviceModbus.Write(DeviceAddress.Start.ToAdd(), true); + } } } - } Thread.Sleep(10); - }, "下发设备参数"); - DeviceStatus nextDevice = new DeviceStatus(); + }, "下发设备参数");*/ + /*DeviceStatus nextDevice = new DeviceStatus(); TaskManage.GetInstance.StartLong(() => { - + for (int i = 0; i < DeviceInquire.GetInstance.devices.Count; i++) { if (DeviceInquire.GetInstance.DeviceLists.ContainsKey(DeviceInquire.GetInstance.devices[i].IpAddress)) @@ -621,7 +785,7 @@ namespace BPASmartClient.DosingSystem if (DeviceInquire.GetInstance.devices[i].IpAddress == "192.168.2.90") { - if (DeviceInquire.GetInstance.DeviceLists[ DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.PailArrive == 1) + if (DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.PailArrive == 1) { SimensSend.GetInstance.SendSimens.Write("DB1.DBX702.0", 0); } @@ -634,56 +798,56 @@ namespace BPASmartClient.DosingSystem if (DeviceInquire.GetInstance.devices[i].IpAddress != $"192.168.2.{Json.Data.BaseParModel.StockCount * 10}") { - ushort deviceNum = DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.DeviceNum; - string nextIp = ""; - if (DeviceInquire.GetInstance.DeviceLists.TryGetValue($"{Json.Data.BaseParModel.NetworkSegAddress}{(deviceNum + 1) * 10}", out nextDevice) && deviceNum != 0) - { - nextIp = DeviceInquire.GetInstance.DeviceLists.ToList().Find(q => q.Value == nextDevice).Key; - } - if (nextIp != "") + ushort deviceNum = DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.DeviceNum; + string nextIp = ""; + if (DeviceInquire.GetInstance.DeviceLists.ContainsKey($"{Json.Data.BaseParModel.NetworkSegAddress}{(deviceNum + 1) * 10}") && deviceNum != 0) + { + nextIp = $"{Json.Data.BaseParModel.NetworkSegAddress}{(deviceNum + 1) * 10}"; + } + if (nextIp != "") + { + //if (DeviceInquire.GetInstance.DeviceLists["192.168.2.10"].deviceStatus.RunStatus == 1 || DeviceInquire.GetInstance.DeviceLists["192.168.2.10"].deviceStatus.RunStatus == 3) + //{ + // DeviceParModel deviceSet = Json.Data.deviceParModels?.ToList().Find(a => a.MaterialName == DeviceInquire.GetInstance.devices[i].DeviceName); + // DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].modbusTcp.Write(DeviceAddress.TranspportSp.ToAdd(), 1000); + // DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].modbusTcp.Write(DeviceAddress.TranspportSwitch.ToAdd(), 1); + //} + if (DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.RunStatus == 1 || DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.RunStatus == 3) { - //if (DeviceInquire.GetInstance.DeviceLists["192.168.2.10"].deviceStatus.RunStatus == 1 || DeviceInquire.GetInstance.DeviceLists["192.168.2.10"].deviceStatus.RunStatus == 3) - //{ - // DeviceParModel deviceSet = Json.Data.deviceParModels?.ToList().Find(a => a.MaterialName == DeviceInquire.GetInstance.devices[i].DeviceName); - // DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].modbusTcp.Write(DeviceAddress.TranspportSp.ToAdd(), 1000); - // DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].modbusTcp.Write(DeviceAddress.TranspportSwitch.ToAdd(), 1); - //} - if (DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.RunStatus == 1 || DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.RunStatus == 3) - { - if (DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.PailArrive == 1 && DeviceInquire.GetInstance.DeviceLists[nextIp].deviceStatus.PailArrive == 1) - { - DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].modbusTcp.Write(DeviceAddress.TranspportSwitch.ToAdd(), (ushort)0); - } - else - { - DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].modbusTcp.Write(DeviceAddress.TranspportSp.ToAdd(), 600); - DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].modbusTcp.Write(DeviceAddress.TranspportSwitch.ToAdd(), (ushort)1); - } + if (DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.PailArrive == 1 && DeviceInquire.GetInstance.DeviceLists[nextIp].deviceStatus.PailArrive == 1) + { + DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].modbusTcp.Write(DeviceAddress.TranspportSwitch.ToAdd(), (ushort)0); } else { - DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].modbusTcp.Write(DeviceAddress.TranspportSwitch.ToAdd(), 0); - //传送带停止 + DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].modbusTcp.Write(DeviceAddress.TranspportSp.ToAdd(), 600); + DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].modbusTcp.Write(DeviceAddress.TranspportSwitch.ToAdd(), (ushort)1); } - - //DeviceInquire.GetInstance.DeviceLists["192.168.2.130"].modbusTcp.Write(DeviceAddress.TranspportSp.ToAdd(), 1000); - //DeviceInquire.GetInstance.DeviceLists["192.168.2.130"].modbusTcp.Write(DeviceAddress.TranspportSwitch.ToAdd(), 0); - //else if (DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.RunStatus == 3 && DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i + 1].IpAddress].deviceStatus.PailArrive == 1) - //{ - // //传送带运行 - // DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].modbusTcp.Write(DeviceAddress.Start.ToAdd(), (ushort)1); - // DeviceParModel deviceSet = Json.Data.deviceParModels?.ToList().Find(a => a.MaterialName == DeviceInquire.GetInstance.devices[i].DeviceName); - // DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].modbusTcp.Write(DeviceAddress.TranspportSp.ToAdd(), deviceSet.SendSp); - // DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].modbusTcp.Write(DeviceAddress.TranspportSwitch.ToAdd(), 1); - //} - } else { DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].modbusTcp.Write(DeviceAddress.TranspportSwitch.ToAdd(), 0); + //传送带停止 } + //DeviceInquire.GetInstance.DeviceLists["192.168.2.130"].modbusTcp.Write(DeviceAddress.TranspportSp.ToAdd(), 1000); + //DeviceInquire.GetInstance.DeviceLists["192.168.2.130"].modbusTcp.Write(DeviceAddress.TranspportSwitch.ToAdd(), 0); + //else if (DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].deviceStatus.RunStatus == 3 && DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i + 1].IpAddress].deviceStatus.PailArrive == 1) + //{ + // //传送带运行 + // DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].modbusTcp.Write(DeviceAddress.Start.ToAdd(), (ushort)1); + // DeviceParModel deviceSet = Json.Data.deviceParModels?.ToList().Find(a => a.MaterialName == DeviceInquire.GetInstance.devices[i].DeviceName); + // DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].modbusTcp.Write(DeviceAddress.TranspportSp.ToAdd(), deviceSet.SendSp); + // DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].modbusTcp.Write(DeviceAddress.TranspportSwitch.ToAdd(), 1); + //} + + } + else + { + DeviceInquire.GetInstance.DeviceLists[DeviceInquire.GetInstance.devices[i].IpAddress].modbusTcp.Write(DeviceAddress.TranspportSwitch.ToAdd(), 0); + } + } else { @@ -708,11 +872,13 @@ namespace BPASmartClient.DosingSystem } } + } - - + + Thread.Sleep(10); - }, "控制传送带"); + }, "控制传送带");*/ + #region 弃用配料流程 //弃用配料流程 diff --git a/DosingSystem/Model/Ctrl_AdressModel.cs b/DosingSystem/Model/Ctrl_AdressModel.cs new file mode 100644 index 00000000..88f51c0e --- /dev/null +++ b/DosingSystem/Model/Ctrl_AdressModel.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BPASmartClient.DosingSystem.Model +{ + public class Ctrl_AdressModel + { + public string PailArrive { get; set; } + public string MaxPail { get; set; } + public string ClearPail { get; set; } + public string PassPail { get; set; } + public string DoingRecipe { get; set; } + } +} diff --git a/DosingSystem/Model/DeviceInquire.cs b/DosingSystem/Model/DeviceInquire.cs index 75e03464..cfb1704b 100644 --- a/DosingSystem/Model/DeviceInquire.cs +++ b/DosingSystem/Model/DeviceInquire.cs @@ -2,6 +2,8 @@ using BPA.Communication; using BPA.Helper; using BPASmartClient.CustomResource.Pages.Model; +using BPASmartClient.CustomResource.UserControls; +using BPASmartClient.CustomResource.UserControls.MessageShow; using BPASmartClient.DosingSystem.Model; using BPASmartClient.DosingSystem.ViewModel; using BPASmartClient.Model; @@ -24,6 +26,7 @@ namespace BPASmartClient.DosingSystem int stockCount;//料仓数 private volatile static DeviceInquire _Instance; public static DeviceInquire GetInstance => _Instance ?? (_Instance = new DeviceInquire()); + private DeviceInquire() { } string IPSegment = "192.168.2."; @@ -159,10 +162,14 @@ namespace BPASmartClient.DosingSystem else Json.Data.BaseParModel.NetworkSegAddress = IPSegment; stockCount = Json.Data.BaseParModel.StockCount; //TestData(); - IpAddressLines(); + /*IpAddressLines();*/ Task.Factory.StartNew(() => { SimensSend.GetInstance.Connect(); + /*while(!clearValue) + { + clearValue = ClearData(); + }*/ //SiemensDevice.GetInstance.Connect(Json.Data.BaseParModel.DeviceAddress); }); DeviceDataInit(); @@ -173,6 +180,40 @@ namespace BPASmartClient.DosingSystem Thread.Sleep(5000); }), "配料机设备上线监听", true); } + /// + /// 清除所有数据 + /// + /// + public bool ClearData() + { + if (SimensSend.GetInstance.SendSimens.IsReconnect) + { + var res = SimensSend.GetInstance.SendSimens.Write("DB1.DBW840", (ushort)1).IsSuccess; + Thread.Sleep(2000); + bool result = false; + if (res) + { + result = SimensSend.GetInstance.SendSimens.Write("DB1.DBW840", (ushort)0).IsSuccess; + } + if (result) + { + App.Current.Dispatcher.Invoke(() => { NoticeDemoViewModel.OpenMsg(EnumPromptType.Success, App.MainWindow, "成功", $"数据清除完成"); }); + } + + /* #region 2023-11-20-17新增:在软件重启时,自动清零设备上的配方执行数量等数据。 + var result1= modbusTcp.Write(DeviceAddress.ZeroRecipeCount.ToAdd(), 1).IsSuccess; + Thread.Sleep(500); + var result2= modbusTcp.Write(DeviceAddress.ZeroRecipeCount.ToAdd(), 0).IsSuccess; + + return result1 && result2; + #endregion*/ + return result; + } + else + { + return false; + } + } public void Rescan() { @@ -239,6 +280,7 @@ namespace BPASmartClient.DosingSystem }); } + bool clearValue = false; private void _myPing_PingCompleted(object sender, PingCompletedEventArgs e) { @@ -250,7 +292,18 @@ namespace BPASmartClient.DosingSystem { DeviceStatus DS = new DeviceStatus(); DS.modbusTcp.IsReconnect = false; - + #region 2023-11-23修改:在该IP第一次连接时清除设备的数据,后续重连时不清除。 + /*if (IsClearData.ContainsKey(ip) && IsClearData[ip] == false) + { + if (DS.ClearData()) + { + //清除成功就置位。 + IsClearData[ip] = true; + } + } */ + //备注:2024-1-22修改,连接后整体数据清理 + + #endregion DS.modbusTcp.Connected = new Action(() => { var tt = DS.modbusTcp.Read(DeviceAddress.DeviceName.ToAdd(), 20); @@ -263,16 +316,7 @@ namespace BPASmartClient.DosingSystem DeviceLists[ip].Init(DeviceName); DeviceLists[ip].modbusTcp.IsReconnect = false; - #region 2023-11-23修改:在该IP第一次连接时清除设备的数据,后续重连时不清除。 - if (IsClearData.ContainsKey(ip) && IsClearData[ip] == false) - { - if (DS.ClearData()) - { - //清除成功就置位。 - IsClearData[ip] = true; - } - } - #endregion + App.Current.Dispatcher.Invoke(new Action(() => { @@ -383,6 +427,7 @@ namespace BPASmartClient.DosingSystem public void Init(string DeviceName) { + //modbusTcp.Show = new Action((s) => { MessageNotify.GetInstance.ShowRunLog(s); }); //modbusTcp.ShowEx = new Action((s) => { MessageNotify.GetInstance.ShowRunLog(s); }); this.DeviceName = DeviceName; @@ -408,7 +453,15 @@ namespace BPASmartClient.DosingSystem ////获取设备编号 var dnum = this.modbusTcp.Read(DeviceAddress.DeviceNum.ToAdd(), 1, BPA.Helper.DataFormat.CDAB); - if (dnum.IsSuccess) deviceStatus.DeviceNum = dnum.Content; + if (dnum.IsSuccess) + { + deviceStatus.DeviceNum = dnum.Content; + if (dnum.Content > 0&& SimensSend.GetInstance.IsConnect) + { + deviceStatus.PailArrive = SimensSend.GetInstance.SendSimens.Read($"DB1.DBX80{(int)((dnum.Content-1)/8)}.{(dnum.Content-1)%8}").Content; + deviceStatus.PassPail = SimensSend.GetInstance.SendSimens.Read($"DB1.DBW{810 + 2 * (dnum.Content - 1)}").Content; + } + } ////获取设备故障编码 var dac = this.modbusTcp.Read(DeviceAddress.DeviceAlarmCode.ToAdd(), 1, BPA.Helper.DataFormat.CDAB); @@ -420,8 +473,11 @@ namespace BPASmartClient.DosingSystem //获取工作模式 var wm = this.modbusTcp.Read(DeviceAddress.WorkModel.ToAdd(),1, BPA.Helper.DataFormat.CDAB); - if (wm.IsSuccess) deviceStatus.WorkModel = wm.Content.GetBitValue(1); - //慢加重量 + if (wm.IsSuccess) { + deviceStatus.WorkModel = wm.Content.GetBitValue(1); + deviceStatus.Finish_mt = wm.Content.GetBitValue(6); + } + /* //慢加重量 var ssaw = this.modbusTcp.Read(DeviceAddress.SlowlyAddWeight.ToAdd(), 1, BPA.Helper.DataFormat.CDAB); if (ssaw.IsSuccess) deviceStatus.SlowAddWeight = ssaw.Content; //提前关阀重量 @@ -444,8 +500,8 @@ namespace BPASmartClient.DosingSystem if (llw.IsSuccess) deviceStatus.SiloLowerLimitWeight = llw.Content; //料仓搅拌速度 var ss = this.modbusTcp.Read(DeviceAddress.StirringSpeed.ToAdd(), 1, BPA.Helper.DataFormat.CDAB); - if (ss.IsSuccess) deviceStatus.StirringSpeed = ss.Content; - //获取桶是否到位 + if (ss.IsSuccess) deviceStatus.StirringSpeed = ss.Content;*/ + /* //获取桶是否到位 var pailArrive = this.modbusTcp.Read(DeviceAddress.PailArrive.ToAdd(), 1, BPA.Helper.DataFormat.CDAB); if (pailArrive.IsSuccess) deviceStatus.PailArrive = pailArrive.Content; //已通过桶数 @@ -456,7 +512,10 @@ namespace BPASmartClient.DosingSystem if (max.IsSuccess) deviceStatus.MaxPassPail = max.Content; //执行配方数 var doCount = this.modbusTcp.Read(DeviceAddress.DoRecipeCount.ToAdd(), 1, BPA.Helper.DataFormat.CDAB); - if (doCount.IsSuccess) deviceStatus.DoRecipeCount = doCount.Content; + if (doCount.IsSuccess) deviceStatus.DoRecipeCount = doCount.Content;*/ + + /*var ts = this.modbusTcp.Read(DeviceAddress.TranspportSwitch.ToAdd(), 1, BPA.Helper.DataFormat.CDAB); + if (ts.IsSuccess) deviceStatus.TranspportSwitch = ts.Content;*/ //this.DeviceName = modbusTcp.Read(DeviceAddress.DeviceName.ToAdd(), 20).Content.Trim().Replace(" ", ""); //deviceStatus.RunStatus = (ushort)this.modbusTcp.Read(DeviceAddress.RunStatus.ToAdd()).Content; //获取设备运行状态 //deviceStatus.WeightFeedback = (float)this.modbusTcp.Read(DeviceAddress.WeightFeedback.ToAdd()).Content;//获取设备料仓剩余重量 @@ -477,20 +536,6 @@ namespace BPASmartClient.DosingSystem } } - public bool ClearData() - { - if (IsConnected) - { - #region 2023-11-20-17新增:在软件重启时,自动清零设备上的配方执行数量等数据。 - var result1= modbusTcp.Write(DeviceAddress.ZeroRecipeCount.ToAdd(), 1).IsSuccess; - Thread.Sleep(500); - var result2= modbusTcp.Write(DeviceAddress.ZeroRecipeCount.ToAdd(), 0).IsSuccess; - - return result1 && result2; - #endregion - } - return false; - } public void SetDeviceName(string name,int index) { this.modbusTcp.Write(DeviceAddress.DeviceName.ToAdd(), new ushort[20]); diff --git a/DosingSystem/Model/RawMaterialDeviceStatus.cs b/DosingSystem/Model/RawMaterialDeviceStatus.cs index d7833ba9..0cbb471c 100644 --- a/DosingSystem/Model/RawMaterialDeviceStatus.cs +++ b/DosingSystem/Model/RawMaterialDeviceStatus.cs @@ -66,6 +66,10 @@ namespace BPASmartClient.DosingSystem /// public bool WorkModel { get; set; } /// + /// 配料完成 + /// + public bool Finish_mt { get; set; } + /// /// 慢加重量 /// public float SlowAddWeight { get; set; } @@ -103,13 +107,13 @@ namespace BPASmartClient.DosingSystem /// public ushort MaxPassPail { get; set; } /// - /// 已通过桶数 + /// 已通过桶数 通过桶数计数 /// public ushort PassPail { get; set; } /// - /// 到位检测 为1有桶。0无桶 + /// 到位检测 为1有桶。0无桶 是否允许下料信号 /// - public ushort PailArrive { get; set; } + public bool PailArrive { get; set; } /// /// 设备执行配方数量 /// diff --git a/DosingSystem/Model/RecipeModel.cs b/DosingSystem/Model/RecipeModel.cs index 7f84e2ba..b6d3721f 100644 --- a/DosingSystem/Model/RecipeModel.cs +++ b/DosingSystem/Model/RecipeModel.cs @@ -44,5 +44,7 @@ namespace BPASmartClient.DosingSystem /// public ObservableCollection RawMaterials { get; set; } = new ObservableCollection(); + public int all_RawMt_weight = 0; + public int All_RawMt_weight { get { return all_RawMt_weight; } set { all_RawMt_weight = value;OnPropertyChanged(); } } } } diff --git a/DosingSystem/Model/ViewModelBase.cs b/DosingSystem/Model/ViewModelBase.cs index 13bad0b6..dce0baa3 100644 --- a/DosingSystem/Model/ViewModelBase.cs +++ b/DosingSystem/Model/ViewModelBase.cs @@ -10,6 +10,7 @@ namespace BPASmartClient.DosingSystem public BPARelayCommand SaveCommand { get; set; }//保存 public BPARelayCommand RemoveCommand { get; set; }//移除 public BPARelayCommand DetailsCommand { get; set; }//编辑 + public BPARelayCommand TextChanged { get; set; }//输入变化 /// /// 错误信息 diff --git a/DosingSystem/Model/par/BasePar.cs b/DosingSystem/Model/par/BasePar.cs index 6c5591cd..46743726 100644 --- a/DosingSystem/Model/par/BasePar.cs +++ b/DosingSystem/Model/par/BasePar.cs @@ -25,7 +25,7 @@ namespace BPASmartClient.DosingSystem /// 料仓数量 /// public int StockCount { get { return _stockCount; } set { _stockCount = value; OnPropertyChanged(); } } - private int _stockCount = 0; + private int _stockCount = 18; /// diff --git a/DosingSystem/Model/par/LocalRecipe.cs b/DosingSystem/Model/par/LocalRecipe.cs index 65980d91..335e2003 100644 --- a/DosingSystem/Model/par/LocalRecipe.cs +++ b/DosingSystem/Model/par/LocalRecipe.cs @@ -7,5 +7,11 @@ namespace BPASmartClient.DosingSystem public ObservableCollection Recipes { get; set; } = new ObservableCollection(); + } + public class OnRecipe + { + public ObservableCollection Recipes { get; set; } = new ObservableCollection(); + + } } diff --git a/DosingSystem/Service/SiemensDevice.cs b/DosingSystem/Service/SiemensDevice.cs index 4f3d5847..783d6dd1 100644 --- a/DosingSystem/Service/SiemensDevice.cs +++ b/DosingSystem/Service/SiemensDevice.cs @@ -1,5 +1,6 @@ using BPA.Communication; using BPA.Helper; +using BPASmartClient.CustomResource.Pages.Model; using BPASmartClient.DosingSystem.Model; using Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets.Internal; using System; @@ -19,14 +20,18 @@ namespace BPASmartClient.DosingSystem public ObservableCollection sendCtrlModels { get; set; } = new ObservableCollection(); public SendCtrlModel sendCtrlModel { get; set; } = new SendCtrlModel(); public Siemens SendSimens { get; set; } = new Siemens(); - private bool IsConnect { get; set; } + public bool IsConnect { get; set; } public bool tempValue = false; public void Connect() { try { - IsConnect = SendSimens.Connect(new BPA.Communication.Base.ConfigurationOptions() { IpAddress = "192.168.2.200", cpuType = BPA.Communication.CpuType.S71200, Port = 102 }); + IsConnect = SendSimens.Connect(new BPA.Communication.Base.ConfigurationOptions() { IpAddress = ip, cpuType = BPA.Communication.CpuType.S71200, Port = 102 }); + if (IsConnect) + { + MessageNotify.GetInstance.ShowRunLog("连接成功"); + } } catch (Exception) @@ -35,6 +40,23 @@ namespace BPASmartClient.DosingSystem //throw; } try + { + TaskManage.GetInstance.StartLong(new Action(() => + { + if (SendSimens.IsConnected()) + { + SendSimens.Write("M5.0", tempValue);//设备心跳 + tempValue = !tempValue; + } + Thread.Sleep(1000); + }), "设备心跳", true); + } + catch (Exception) + { + + /*throw;*/ + } + /* try { TaskManage.GetInstance.StartLong(new Action(() => @@ -98,7 +120,7 @@ namespace BPASmartClient.DosingSystem { - } + }*/ } } //public class SiemensDevice diff --git a/DosingSystem/View/NewRecipeView.xaml b/DosingSystem/View/NewRecipeView.xaml index dc6c4c4e..f17feaab 100644 --- a/DosingSystem/View/NewRecipeView.xaml +++ b/DosingSystem/View/NewRecipeView.xaml @@ -6,6 +6,7 @@ xmlns:local="clr-namespace:BPASmartClient.DosingSystem.View" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:vm="clr-namespace:BPASmartClient.DosingSystem.ViewModel" + xmlns:i ="http://schemas.microsoft.com/expression/2010/interactivity" Title="NewRecipeView" Width="550" Height="600" @@ -93,12 +94,30 @@ - + + + + + + + Text="{Binding RawMaterialWeight}"> + + + + + + + + + - + + @@ -384,9 +385,25 @@ FontSize="12" Foreground="#FF2AB2E7" Text="{Binding RecipeName}" /> - - + + + --> -