From 227063648defb304c69ec25583e923b8d01d9a17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A6=82=E6=84=8F=20=E5=BD=AD?= <2417589739@qq.com> Date: Sat, 8 Oct 2022 17:32:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=8F=E9=85=8D=E6=96=99=E7=AB=99=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Pages/View/MainView.xaml.cs | 4 + .../Pages/View/RunLogView.xaml | 56 +--- .../Pages/ViewModel/MainViewModel.cs | 2 - BPASmartClient.SmallBatchingSystem/App.xaml | 1 + .../App.xaml.cs | 7 +- .../BPASmartClient.SmallBatchingSystem.csproj | 8 + .../Converter/ForegroundConverter.cs | 35 +++ .../Converter/StatusIconConverter.cs | 47 +++ .../Fonts/iconfont.ttf | Bin 0 -> 9412 bytes .../Models/CommunicationPar.cs | 3 +- .../Models/PlcDataModel.cs | 14 + .../Models/RecipeStatus.cs | 25 ++ .../Models/Status.cs | 15 + .../ResourcesStyle/ResourcesStyle.xaml | 133 ++++++++ .../Services/Control.cs | 99 ++++-- .../Services/PlcServer.cs | 15 +- .../Services/SiloServer.cs | 221 -------------- .../ViewModels/GrindArenaceousViewModel.cs | 48 +++ .../ViewModels/RecipeControlViewModel.cs | 7 +- .../Views/GrindArenaceousView.xaml | 153 ++++++++++ .../Views/GrindArenaceousView.xaml.cs | 29 ++ .../Views/NewOutletView.xaml | 84 ----- .../Views/NewRecipeView.xaml | 98 ------ .../Views/NewSiloView.xaml | 31 -- .../Views/OutletManagementView.xaml | 134 -------- .../Views/RecipeControlView.xaml | 287 +----------------- .../Views/RecipeView.xaml | 134 -------- .../Views/SiloManagementView.xaml | 134 -------- BPASmartClient/App.config | 14 +- 29 files changed, 637 insertions(+), 1201 deletions(-) create mode 100644 BPASmartClient.SmallBatchingSystem/Converter/ForegroundConverter.cs create mode 100644 BPASmartClient.SmallBatchingSystem/Converter/StatusIconConverter.cs create mode 100644 BPASmartClient.SmallBatchingSystem/Fonts/iconfont.ttf create mode 100644 BPASmartClient.SmallBatchingSystem/Models/RecipeStatus.cs create mode 100644 BPASmartClient.SmallBatchingSystem/Models/Status.cs create mode 100644 BPASmartClient.SmallBatchingSystem/ResourcesStyle/ResourcesStyle.xaml delete mode 100644 BPASmartClient.SmallBatchingSystem/Services/SiloServer.cs create mode 100644 BPASmartClient.SmallBatchingSystem/ViewModels/GrindArenaceousViewModel.cs create mode 100644 BPASmartClient.SmallBatchingSystem/Views/GrindArenaceousView.xaml create mode 100644 BPASmartClient.SmallBatchingSystem/Views/GrindArenaceousView.xaml.cs diff --git a/BPASmartClient.CustomResource/Pages/View/MainView.xaml.cs b/BPASmartClient.CustomResource/Pages/View/MainView.xaml.cs index 3e516b5e..d6f8e0f2 100644 --- a/BPASmartClient.CustomResource/Pages/View/MainView.xaml.cs +++ b/BPASmartClient.CustomResource/Pages/View/MainView.xaml.cs @@ -20,6 +20,10 @@ namespace BPASmartClient.CustomResource.Pages.View /// public partial class MainView : Window { + + public string TitleName { get { return _mTitleName; } set { _mTitleName = value; this.tbTitle.Text = value; } } + private string _mTitleName; + public MainView() { InitializeComponent(); diff --git a/BPASmartClient.CustomResource/Pages/View/RunLogView.xaml b/BPASmartClient.CustomResource/Pages/View/RunLogView.xaml index 26192229..ef67919e 100644 --- a/BPASmartClient.CustomResource/Pages/View/RunLogView.xaml +++ b/BPASmartClient.CustomResource/Pages/View/RunLogView.xaml @@ -51,7 +51,7 @@ - + @@ -160,8 +160,8 @@ - - + + @@ -243,8 +243,8 @@ - - + + @@ -260,28 +260,11 @@ - - - - + + @@ -323,28 +306,11 @@ - - + diff --git a/BPASmartClient.SmallBatchingSystem/App.xaml.cs b/BPASmartClient.SmallBatchingSystem/App.xaml.cs index b0e2fc31..7a7d82a6 100644 --- a/BPASmartClient.SmallBatchingSystem/App.xaml.cs +++ b/BPASmartClient.SmallBatchingSystem/App.xaml.cs @@ -26,8 +26,9 @@ namespace BPASmartClient.SmallBatchingSystem AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; MenuInit(); Control.GetInstance.Init(); - SiloServer siloServer = new SiloServer(); + //SiloServer siloServer = new SiloServer(); MainView mv = new MainView(); + mv.TitleName = "黑菠萝配料系统"; //LoginView lv = new LoginView(); //var res = lv.ShowDialog(); //if (res != null && res == true) @@ -132,6 +133,7 @@ namespace BPASmartClient.SmallBatchingSystem SubMenuName = "操作日志", SubMenuPermission = new Permission[] { Permission.操作员, Permission.管理员, Permission.技术员 }, AssemblyName = "BPASmartClient.CustomResource", + SubMenuVisibility = Visibility.Visible, ToggleWindowPath = "Pages.View.UserLogView" }); @@ -140,6 +142,7 @@ namespace BPASmartClient.SmallBatchingSystem SubMenuName = "运行日志", SubMenuPermission = new Permission[] { Permission.操作员, Permission.管理员, Permission.技术员 }, AssemblyName = "BPASmartClient.CustomResource", + SubMenuVisibility = Visibility.Visible, ToggleWindowPath = "Pages.View.RunLogView" }); @@ -148,6 +151,7 @@ namespace BPASmartClient.SmallBatchingSystem SubMenuName = "报警记录", SubMenuPermission = new Permission[] { Permission.操作员, Permission.管理员, Permission.技术员 }, AssemblyName = "BPASmartClient.CustomResource", + SubMenuVisibility = Visibility.Visible, ToggleWindowPath = "Pages.View.AlarmView" }); @@ -156,6 +160,7 @@ namespace BPASmartClient.SmallBatchingSystem SubMenuName = "调试日志", SubMenuPermission = new Permission[] { Permission.操作员, Permission.管理员, Permission.技术员, Permission.技术员 }, AssemblyName = "BPASmartClient.CustomResource", + SubMenuVisibility = Visibility.Visible, ToggleWindowPath = "Pages.View.DebugLogView" }); diff --git a/BPASmartClient.SmallBatchingSystem/BPASmartClient.SmallBatchingSystem.csproj b/BPASmartClient.SmallBatchingSystem/BPASmartClient.SmallBatchingSystem.csproj index 2c450236..4c0eab71 100644 --- a/BPASmartClient.SmallBatchingSystem/BPASmartClient.SmallBatchingSystem.csproj +++ b/BPASmartClient.SmallBatchingSystem/BPASmartClient.SmallBatchingSystem.csproj @@ -7,6 +7,10 @@ true + + + + @@ -23,4 +27,8 @@ + + + + diff --git a/BPASmartClient.SmallBatchingSystem/Converter/ForegroundConverter.cs b/BPASmartClient.SmallBatchingSystem/Converter/ForegroundConverter.cs new file mode 100644 index 00000000..e46f2e31 --- /dev/null +++ b/BPASmartClient.SmallBatchingSystem/Converter/ForegroundConverter.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Data; +using System.Windows.Data; +using System.Globalization; +using System.Windows.Media; + +namespace BPASmartClient.SmallBatchingSystem.Converter +{ + public class ForegroundConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + SolidColorBrush returnValue = new SolidColorBrush(Color.FromArgb(255, 0, 204, 255)); + if (value != null) + { + if (value.ToString() == "等待配料") + returnValue = new SolidColorBrush(Color.FromArgb(255, 236, 187, 17));//黄 FFECBB11 + else if (value.ToString() == "正在配料") + returnValue = new SolidColorBrush(Color.FromArgb(255, 22, 219, 234));//篮 FF16DBEA + else if (value.ToString() == "配料完成") + returnValue = new SolidColorBrush(Color.FromArgb(255, 43, 208, 111));//绿 FF2BD06F + } + return returnValue; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/BPASmartClient.SmallBatchingSystem/Converter/StatusIconConverter.cs b/BPASmartClient.SmallBatchingSystem/Converter/StatusIconConverter.cs new file mode 100644 index 00000000..5fc73f3c --- /dev/null +++ b/BPASmartClient.SmallBatchingSystem/Converter/StatusIconConverter.cs @@ -0,0 +1,47 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Data; +using System.Windows.Data; +using System.Globalization; +using System.Text.RegularExpressions; + +namespace BPASmartClient.SmallBatchingSystem.Converter +{ + public class StatusIconConverter : IValueConverter + { + public object Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + if (value != null) + { + if (value.ToString() == Status.等待配料.ToString()) + return Regex.Unescape(StringToUnicode("")); + else if (value.ToString() == Status.正在配料.ToString()) + return Regex.Unescape(StringToUnicode("")); + else if (value.ToString() == Status.配料完成.ToString()) + return Regex.Unescape(StringToUnicode("")); + } + return value; + } + + public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + + /// + /// 字符串转为UniCode码字符串 + /// + public static string StringToUnicode(string s) + { + if (!string.IsNullOrEmpty(s)) + { + //这里把格式 转为 \ue625 + return s.Replace(@"&#x", @"\u").Replace(";", ""); + } + return s; + } + } +} diff --git a/BPASmartClient.SmallBatchingSystem/Fonts/iconfont.ttf b/BPASmartClient.SmallBatchingSystem/Fonts/iconfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..22181b32edae9e2409cc835768530c82031f988a GIT binary patch literal 9412 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 + /// 到达目标位置 + /// + public static bool TargetLocComplete { get; set; } + + /// + /// 通道配料完成 + /// public static bool BatchingCompleted { get; set; } + + /// + /// 配方配料完成 + /// + public static bool RecipeBatchingComplete { get; set; } } } diff --git a/BPASmartClient.SmallBatchingSystem/Models/RecipeStatus.cs b/BPASmartClient.SmallBatchingSystem/Models/RecipeStatus.cs new file mode 100644 index 00000000..d73da174 --- /dev/null +++ b/BPASmartClient.SmallBatchingSystem/Models/RecipeStatus.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Toolkit.Mvvm.ComponentModel; + +namespace BPASmartClient.SmallBatchingSystem +{ + public class RecipeStatus : ObservableObject + { + + public string RawMaterialName { get { return _mRawMaterialName; } set { _mRawMaterialName = value; OnPropertyChanged(); } } + private string _mRawMaterialName; + + + public bool IsChecked { get { return _mIsChecked; } set { _mIsChecked = value; OnPropertyChanged(); } } + private bool _mIsChecked; + + + public string Status { get { return _mStatus; } set { _mStatus = value; OnPropertyChanged(); } } + private string _mStatus = "等待配料"; + + } +} diff --git a/BPASmartClient.SmallBatchingSystem/Models/Status.cs b/BPASmartClient.SmallBatchingSystem/Models/Status.cs new file mode 100644 index 00000000..e3bc9d9f --- /dev/null +++ b/BPASmartClient.SmallBatchingSystem/Models/Status.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BPASmartClient.SmallBatchingSystem +{ + public enum Status + { + 等待配料, + 正在配料, + 配料完成 + } +} diff --git a/BPASmartClient.SmallBatchingSystem/ResourcesStyle/ResourcesStyle.xaml b/BPASmartClient.SmallBatchingSystem/ResourcesStyle/ResourcesStyle.xaml new file mode 100644 index 00000000..1744800c --- /dev/null +++ b/BPASmartClient.SmallBatchingSystem/ResourcesStyle/ResourcesStyle.xaml @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BPASmartClient.SmallBatchingSystem/Services/Control.cs b/BPASmartClient.SmallBatchingSystem/Services/Control.cs index acd3e6c8..9f840605 100644 --- a/BPASmartClient.SmallBatchingSystem/Services/Control.cs +++ b/BPASmartClient.SmallBatchingSystem/Services/Control.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; +using BPASmartClient.CustomResource.Pages.Model; namespace BPASmartClient.SmallBatchingSystem { @@ -18,12 +19,13 @@ namespace BPASmartClient.SmallBatchingSystem private Control() { } public ConcurrentQueue MakeOrderQueue { get; set; } = new ConcurrentQueue(); + public bool IsCancel { get; set; } + public void Init() { ThreadManage.GetInstance().Start(new Action(() => { PlcServer.GetInstance.Connect(); - }), "设备初始化"); ThreadManage.GetInstance().StartLong(new Action(() => @@ -32,43 +34,84 @@ namespace BPASmartClient.SmallBatchingSystem { if (MakeOrderQueue.TryDequeue(out RecipeInfo recipeInfo)) { + IsCancel = false; List OutletInfo = new List(); recipeInfo.SiloInfoModels.ToList()?.ForEach(item => { var res = Json.Data.OutletInfoModels.FirstOrDefault(p => p.SiloInfos.FirstOrDefault(s => s.Contains(item.SiloName)) != null); if (res != null) if (!OutletInfo.Contains(res.OutletLoc)) OutletInfo.Add(res.OutletLoc); }); - - OutletInfo.ForEach(temp => + foreach (var temp in OutletInfo) { PlcServer.GetInstance.WriteData("VW302", (ushort)temp);//设置出料口位置 PlcServer.GetInstance.WriteData("M10.0", true);//定位启动 + Message($"启动定位,出料口位置:{temp}"); int index = temp - 1; - if (index >= 0 && index < PlcDataModel.TargetLocFeedback.Length) + if (index >= 0) { - while (!PlcDataModel.TargetLocFeedback[index]) Thread.Sleep(1);//等待定位反馈 - recipeInfo.SiloInfoModels.ToList()?.ForEach(temp1 => + Message("等待定位完成"); + while (!PlcDataModel.TargetLocComplete && !IsCancel) Thread.Sleep(1);//等待定位反馈 + if (IsCancel) break; + Message("定位完成"); + PlcServer.GetInstance.WriteData("M20.0", false); + while (PlcDataModel.TargetLocComplete && !IsCancel) Thread.Sleep(1); + if (IsCancel) break; + Message("定位完成,复位成功"); + foreach (var temp1 in recipeInfo.SiloInfoModels) { - var res = Json.Data.SiloInfoModels.FirstOrDefault(p => p.SiloName == temp1.SiloName); - if (res != null) + var rest = Json.Data.OutletInfoModels.FirstOrDefault(p => p.SiloInfos.FirstOrDefault(s => s.Contains(temp1.SiloName)) != null); + if (rest != null && rest.OutletLoc == temp) { - PlcServer.GetInstance.WriteData(GetWeightAdd(res.SiloLoc), (ushort)temp1.SiloWeight); - PlcServer.GetInstance.WriteData(GetStartSingleAdd(res.SiloLoc), true); - while (!PlcDataModel.BatchingCompleted) Thread.Sleep(1);//等待出料完成 - PlcServer.GetInstance.WriteData("M4.0", false);//复位出料完成信号 - while (PlcDataModel.BatchingCompleted) Thread.Sleep(1);//等待出料完成信号复位成功 + var res = Json.Data.SiloInfoModels.FirstOrDefault(p => p.SiloName == temp1.SiloName); + if (res != null) + { + StatusNotify(res.SiloName, Status.正在配料); + Message($"写重量地址:{GetWeightAdd(res.SiloLoc)},重量:{temp1.SiloWeight}"); + PlcServer.GetInstance.WriteData(GetWeightAdd(res.SiloLoc), (ushort)temp1.SiloWeight); + Message($"写启动信号地址:{GetStartSingleAdd(res.SiloLoc)}"); + PlcServer.GetInstance.WriteData(GetStartSingleAdd(res.SiloLoc), true); + while (!PlcDataModel.BatchingCompleted && !IsCancel) Thread.Sleep(1);//等待出料完成 + if (IsCancel) break; + Message("出料完成,复位出料完成状态"); + PlcServer.GetInstance.WriteData("M4.0", false);//复位出料完成信号 + while (PlcDataModel.BatchingCompleted && !IsCancel) Thread.Sleep(1);//等待出料完成信号复位成功 + if (IsCancel) break; + Message("出料完成复位成功"); + StatusNotify(res.SiloName, Status.配料完成); + } } - }); + } + if (IsCancel) return; } + } - }); - PlcServer.GetInstance.WriteData("M10.4", true); + if (!IsCancel) + { + Message($"写入配方执行完成信号"); + PlcServer.GetInstance.WriteData("M10.4", true); + Message("等待配方执行完成"); + while (!PlcDataModel.RecipeBatchingComplete && !IsCancel) Thread.Sleep(1); + if (IsCancel) break; + Message($"【{recipeInfo.RecipeName}】配方执行完成"); + ActionManage.GetInstance.Send("GrindArenaceousCancel"); + } } } Thread.Sleep(10); }), "配方流程控制"); } + private bool Wait(ref bool Targger, bool IsCancel = false) + { + bool a = Targger; + while (!IsCancel) + { + if (a) + Thread.Sleep(1); + } + return !IsCancel; + } + /// @@ -80,12 +123,31 @@ namespace BPASmartClient.SmallBatchingSystem { if (num > 0) { - var s = 100 + (num - 1) * 2; - return $"VW{s}"; + int add = 0; + if (num >= 1 && num <= 8) + { + add = 100 + (num - 1) * 2; + } + else if (num >= 9 && num <= 18) + { + add = 102 + (num - 1) * 2; + } + return $"VW{add}"; } return default; } + private void StatusNotify(string SiloName, Status Status) + { + ActionManage.GetInstance.Send("StatusNotify", new RecipeStatus() { RawMaterialName = SiloName, Status = Status.ToString() }); + } + + private void Message(string info) + { + BPASmartClient.CustomResource.Pages.Model.MessageLog.GetInstance.ShowRunLog(info); + Debug.WriteLine($"{DateTime.Now.ToString("HH:mm:ss")}:{info}"); + } + /// /// 获取启动信号地址 /// @@ -104,7 +166,6 @@ namespace BPASmartClient.SmallBatchingSystem c = 7; } else c--; - Add = $"M{ t}.{c}"; return Add; } diff --git a/BPASmartClient.SmallBatchingSystem/Services/PlcServer.cs b/BPASmartClient.SmallBatchingSystem/Services/PlcServer.cs index 813be047..b0b9cb46 100644 --- a/BPASmartClient.SmallBatchingSystem/Services/PlcServer.cs +++ b/BPASmartClient.SmallBatchingSystem/Services/PlcServer.cs @@ -26,13 +26,10 @@ namespace BPASmartClient.SmallBatchingSystem MessageLog.GetInstance.Show("设备连接成功"); ThreadManage.GetInstance().StartLong(new Action(() => { - var res = ReadData("M20.0", 16);//到达目标位置信号 - if (res != null && res is bool[] bools && bools.Length == 16) + var res = ReadData("M20.0", 1);//到达目标位置信号 + if (res != null && res is bool[] bools && bools.Length == 1) { - for (int i = 0; i < bools.Length; i++) - { - PlcDataModel.TargetLocFeedback[i] = bools[i]; - } + PlcDataModel.TargetLocComplete = bools[0]; } var res1 = ReadData("M4.0", 1);//通道出料完成 @@ -41,6 +38,12 @@ namespace BPASmartClient.SmallBatchingSystem PlcDataModel.BatchingCompleted = bools1[0]; } + var res2 = ReadData("M13.3", 1);//配方配料完成 + if (res2 != null && res2 is bool[] bools2 && bools2.Length == 1) + { + PlcDataModel.RecipeBatchingComplete = bools2[0]; + } + Thread.Sleep(10); }), "PLC 数据监听"); }); diff --git a/BPASmartClient.SmallBatchingSystem/Services/SiloServer.cs b/BPASmartClient.SmallBatchingSystem/Services/SiloServer.cs deleted file mode 100644 index 570b460e..00000000 --- a/BPASmartClient.SmallBatchingSystem/Services/SiloServer.cs +++ /dev/null @@ -1,221 +0,0 @@ -using BPASmart.Model; -using BPASmartClient.Helper; -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Linq; -using System.Text; -using System.Threading; -using System.Threading.Tasks; - -namespace BPASmartClient.SmallBatchingSystem -{ - /// - /// 料仓服务线程 - /// - public class SiloServer - { - public SiloServer() - { - BusinessThread(); - RefreshRecips(); - MakeToRecipsID("2d1ac4da-110b-4d4d-9e94-36aac6d67124"); - } - - #region 临时变量 - /// - /// 物料数据 - /// - public ObservableCollection RecipeMaterialsDic = new ObservableCollection(); - /// - /// 当前配方 - /// - public ObservableCollection RecipesDic = new ObservableCollection(); - #endregion - - #region 订单管理 - public ConcurrentQueue MakeOrderQueue { get; set; } = new ConcurrentQueue(); - #endregion - - #region 业务 - /// - /// 业务线程 - /// - public void BusinessThread() - { - - ThreadManage.GetInstance().Start(new Action(() => - { - PlcServer.GetInstance.Connect(); - }), "启动PLC", false); - - ThreadManage.GetInstance().StartLong(new Action(() => - { - // if (PlcServer.GetInstance.Communication.Connected) - { - if (MakeOrderQueue.TryDequeue(out Recipes recipes)) - { - Make(recipes); - } - } - }), "配料线程启动", true); - } - #endregion - - #region 调用函数 - /// - /// 刷新配方数据 - /// - public void RefreshRecips() - { - try - { - //读取料仓物料数据 配方数据 - Json.Read(); - Json.Read(); - RecipeMaterialsDic = Json.Data.locaMaterails; - RecipesDic = Json.Data.locaRecipes; - RecipesDic?.ToList().ForEach(par => - { - par.recipeMaterials?.ToList().ForEach((recipeMaterial) => - { - RecipeMaterials recipe = RecipeMaterialsDic?.ToList().Find(k => k.ID == recipeMaterial.ID); - if (recipe != null) - { - recipeMaterial.MaterialType = recipe.MaterialType; - recipeMaterial.MaterialPosion = recipe.MaterialPosion; - recipeMaterial.PropertyCollections = recipe.PropertyCollections; - } - }); - - }); - } - catch (Exception ex) - { - - } - } - - /// - /// 根据配方ID制作流程 - /// - public void MakeToRecipsID(string id) - { - try - { - //chaxun 配方 - Recipes info = RecipesDic?.ToList().Find(par => par.ID == id); - if (info != null) - { - //添加到队列 - MakeOrderQueue.Enqueue(info); - } - } - catch (Exception ex) - { - - } - } - - /// - /// 根据配方控制流程 - /// - /// - public async void Make(Recipes recipes) - { - try - { - //遍历配方物料集合 - recipes?.recipeMaterials?.ToList().ForEach(recipe => - { - //料仓位置 - int recipesLoc = 1; - int.TryParse(recipe.PropertyCollections?.First()?.PropertyValue, out recipesLoc); - - //原料位置 - int storeLoc = 1; int.TryParse(recipe.MaterialPosion, out recipesLoc); - - //原料需求(g)数 - int storeWeight = recipe.MaterialWeight; - - //1.写PLC VW302 目标位置 -> recipesLoc M10.0 定位启动 开始运行 - //2.读取PLC M20.0 到达目标位置 <- 标志 (bool) 【等待】 - //3.写PLC VW100 料口X需求 ->写入重量 storeWeight - //4.写PLC M0.0 启动出料口xx ->storeLoc (bool) - //5.读PLC M4.0 通道XX出料完成<-标志 (bool) 【等待】 - - if (storeWeight > 0) - { - WriteData("VW302", recipesLoc); - WriteData("M10.0", true); - - #region 读取是否到达目标位置,超时10秒 - bool IsOver = false; - int fade1 = 1000; - while (fade1 != -1 && !IsOver) - { - IsOver = (bool)ReadData("M20.0", 1); - Thread.Sleep(10); - fade1--; - } - #endregion - - if (IsOver)//到达指定位置 - { - //写需求 - string adder = $"VW{100 + 2 * (storeLoc - 1)}"; - WriteData(adder, storeWeight); - - //写启动料口 - adder = storeLoc <= 8 ? $"M0.{(storeLoc - 1)}" : $"M1.{(storeLoc - 9)}"; - WriteData(adder, true); - - //读取通道下料是否完成 - adder = storeLoc <= 8 ? $"M4.{(storeLoc - 1)}" : $"M5.{(storeLoc - 9)}"; - #region 通道XX出料完成,超时10秒 - bool IsXLOver = false; - int fade1XL = 1000; - while (fade1XL != -1 && !IsXLOver) - { - IsXLOver = (bool)ReadData("M20.0", 1); - Thread.Sleep(30); - fade1XL--; - } - #endregion - } - } - }); - - //6.写PLC M10.4 上位机配料完成 - WriteData("M10.4", true); - } - catch (Exception ex) { } - } - #endregion - - #region 调用外部PLC - /// - /// 写PLC - /// - /// - /// - public void WriteData(string address, object value) - { - //PlcServer.GetInstance.WriteData(address, value); - } - /// - /// 读PLC - /// - /// - /// - /// - public object ReadData(string address, int length) - { - //return PlcServer.GetInstance.ReadData(address, length); - return null; - } - #endregion - - } -} diff --git a/BPASmartClient.SmallBatchingSystem/ViewModels/GrindArenaceousViewModel.cs b/BPASmartClient.SmallBatchingSystem/ViewModels/GrindArenaceousViewModel.cs new file mode 100644 index 00000000..fd7aec69 --- /dev/null +++ b/BPASmartClient.SmallBatchingSystem/ViewModels/GrindArenaceousViewModel.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.Toolkit.Mvvm.Input; +using BPA.Helper; +using System.Collections.ObjectModel; + +namespace BPASmartClient.SmallBatchingSystem.ViewModels +{ + public class GrindArenaceousViewModel : BaseModel + { + public GrindArenaceousViewModel() + { + ActionManage.GetInstance.Register(new Action((o) => + { + if (o != null && o is RecipeStatus recipe) + { + int index = Array.FindIndex(Recipes.ToArray(), p => p.RawMaterialName == recipe.RawMaterialName); + if (index >= 0 && index < Recipes.Count) + { + Recipes.ElementAt(index).Status = recipe.Status; + Recipes.ElementAt(index).IsChecked = true; + } + } + }), "StatusNotify", true); + ActionManage.GetInstance.Register(new Action((o) => + { + if (o != null && o is RecipeInfo recipe) + { + RecipeName = recipe.RecipeName; + recipe.SiloInfoModels.ToList()?.ForEach(x => + { + Recipes.Add(new RecipeStatus() { RawMaterialName = x.SiloName, Status = "等待配料" }); + }); + } + }), "OpenRecipeStatusMotion", true); + CancelCommand = new RelayCommand(() => { Control.GetInstance.IsCancel = true; ActionManage.GetInstance.Send("GrindArenaceousCancel"); }); + } + + public string RecipeName { get { return _mRecipeName; } set { _mRecipeName = value; OnPropertyChanged(); } } + private string _mRecipeName; + + + public ObservableCollection Recipes { get; set; } = new ObservableCollection(); + } +} diff --git a/BPASmartClient.SmallBatchingSystem/ViewModels/RecipeControlViewModel.cs b/BPASmartClient.SmallBatchingSystem/ViewModels/RecipeControlViewModel.cs index 583e3cc4..2314cf0a 100644 --- a/BPASmartClient.SmallBatchingSystem/ViewModels/RecipeControlViewModel.cs +++ b/BPASmartClient.SmallBatchingSystem/ViewModels/RecipeControlViewModel.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using BPA.Helper; using Microsoft.Toolkit.Mvvm.ComponentModel; using Microsoft.Toolkit.Mvvm.Input; +using BPASmartClient.SmallBatchingSystem.Views; namespace BPASmartClient.SmallBatchingSystem.ViewModels { @@ -22,7 +23,11 @@ namespace BPASmartClient.SmallBatchingSystem.ViewModels int index = Array.FindIndex(Json.Data.Recipes.ToArray(), p => p.RecipeName == o.ToString()); if (index >= 0 && index < Json.Data.Recipes.Count) { - Control.GetInstance.MakeOrderQueue.Enqueue(Json.Data.Recipes.ElementAt(index)); + var data = Json.Data.Recipes.ElementAt(index); + GrindArenaceousView grindArenaceousView = new GrindArenaceousView(); + ActionManage.GetInstance.Send("OpenRecipeStatusMotion", data); + Control.GetInstance.MakeOrderQueue.Enqueue(data); + grindArenaceousView.ShowDialog(); } } }); diff --git a/BPASmartClient.SmallBatchingSystem/Views/GrindArenaceousView.xaml b/BPASmartClient.SmallBatchingSystem/Views/GrindArenaceousView.xaml new file mode 100644 index 00000000..ca4b6b91 --- /dev/null +++ b/BPASmartClient.SmallBatchingSystem/Views/GrindArenaceousView.xaml @@ -0,0 +1,153 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BPASmartClient.SmallBatchingSystem/Views/GrindArenaceousView.xaml.cs b/BPASmartClient.SmallBatchingSystem/Views/GrindArenaceousView.xaml.cs new file mode 100644 index 00000000..045760d8 --- /dev/null +++ b/BPASmartClient.SmallBatchingSystem/Views/GrindArenaceousView.xaml.cs @@ -0,0 +1,29 @@ +using BPA.Helper; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Controls; +using System.Windows.Data; +using System.Windows.Documents; +using System.Windows.Input; +using System.Windows.Media; +using System.Windows.Media.Imaging; +using System.Windows.Shapes; + +namespace BPASmartClient.SmallBatchingSystem.Views +{ + /// + /// GrindArenaceousView.xaml 的交互逻辑 + /// + public partial class GrindArenaceousView : Window + { + public GrindArenaceousView() + { + InitializeComponent(); + ActionManage.GetInstance.Register(new Action(() => { App.Current.Dispatcher.Invoke(() => { this.Close(); }); }), "GrindArenaceousCancel", true); + } + } +} diff --git a/BPASmartClient.SmallBatchingSystem/Views/NewOutletView.xaml b/BPASmartClient.SmallBatchingSystem/Views/NewOutletView.xaml index 58c5c5c5..7283a458 100644 --- a/BPASmartClient.SmallBatchingSystem/Views/NewOutletView.xaml +++ b/BPASmartClient.SmallBatchingSystem/Views/NewOutletView.xaml @@ -20,90 +20,6 @@ - - - - - - - - - - - - - - - - - - diff --git a/BPASmartClient.SmallBatchingSystem/Views/NewRecipeView.xaml b/BPASmartClient.SmallBatchingSystem/Views/NewRecipeView.xaml index 0a9a9c31..dc13bb57 100644 --- a/BPASmartClient.SmallBatchingSystem/Views/NewRecipeView.xaml +++ b/BPASmartClient.SmallBatchingSystem/Views/NewRecipeView.xaml @@ -20,104 +20,6 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/BPASmartClient.SmallBatchingSystem/Views/NewSiloView.xaml b/BPASmartClient.SmallBatchingSystem/Views/NewSiloView.xaml index 95489a99..ddfeb174 100644 --- a/BPASmartClient.SmallBatchingSystem/Views/NewSiloView.xaml +++ b/BPASmartClient.SmallBatchingSystem/Views/NewSiloView.xaml @@ -19,37 +19,6 @@ - - - - - - - - - diff --git a/BPASmartClient.SmallBatchingSystem/Views/OutletManagementView.xaml b/BPASmartClient.SmallBatchingSystem/Views/OutletManagementView.xaml index 022c874d..55fc8980 100644 --- a/BPASmartClient.SmallBatchingSystem/Views/OutletManagementView.xaml +++ b/BPASmartClient.SmallBatchingSystem/Views/OutletManagementView.xaml @@ -16,140 +16,6 @@ - - - - - - - - - - - - - - - - - - diff --git a/BPASmartClient.SmallBatchingSystem/Views/RecipeControlView.xaml b/BPASmartClient.SmallBatchingSystem/Views/RecipeControlView.xaml index 30af7653..81c04d9e 100644 --- a/BPASmartClient.SmallBatchingSystem/Views/RecipeControlView.xaml +++ b/BPASmartClient.SmallBatchingSystem/Views/RecipeControlView.xaml @@ -16,295 +16,16 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + - + + Columns="8" /> diff --git a/BPASmartClient.SmallBatchingSystem/Views/RecipeView.xaml b/BPASmartClient.SmallBatchingSystem/Views/RecipeView.xaml index c2b59edd..e8e9f184 100644 --- a/BPASmartClient.SmallBatchingSystem/Views/RecipeView.xaml +++ b/BPASmartClient.SmallBatchingSystem/Views/RecipeView.xaml @@ -16,140 +16,6 @@ - - - - - - - - - - - - - - - - - - diff --git a/BPASmartClient.SmallBatchingSystem/Views/SiloManagementView.xaml b/BPASmartClient.SmallBatchingSystem/Views/SiloManagementView.xaml index cc01e4ac..415b9a05 100644 --- a/BPASmartClient.SmallBatchingSystem/Views/SiloManagementView.xaml +++ b/BPASmartClient.SmallBatchingSystem/Views/SiloManagementView.xaml @@ -16,140 +16,6 @@ - - - - - - - - - - - - - - - - - - diff --git a/BPASmartClient/App.config b/BPASmartClient/App.config index 1576a7da..1b915f4c 100644 --- a/BPASmartClient/App.config +++ b/BPASmartClient/App.config @@ -6,20 +6,20 @@ - + - + - - + +