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
LNkvXXu0mjfCeX!B
literal 0
HcmV?d00001
diff --git a/BPASmartClient.CustomResource/UserControls/Cylinder.xaml b/BPASmartClient.CustomResource/UserControls/Cylinder.xaml
index 97f5d6f8..41e769c6 100644
--- a/BPASmartClient.CustomResource/UserControls/Cylinder.xaml
+++ b/BPASmartClient.CustomResource/UserControls/Cylinder.xaml
@@ -13,14 +13,75 @@
+
+
+
+
+
+
+
+
+
diff --git a/BPASmartClient.CustomResource/UserControls/Cylinder.xaml.cs b/BPASmartClient.CustomResource/UserControls/Cylinder.xaml.cs
index b115ba13..9969addd 100644
--- a/BPASmartClient.CustomResource/UserControls/Cylinder.xaml.cs
+++ b/BPASmartClient.CustomResource/UserControls/Cylinder.xaml.cs
@@ -26,6 +26,38 @@ namespace BPASmartClient.CustomResource.UserControls
}
+ private static void OnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
+ {
+ (d as Cylinder)?.Refresh();
+ }
+
+ private void Refresh()
+ {
+ this.LeftTog.IsChecked = LeftTogIsChecked;
+ this.RightTog.IsChecked = RightTogIsChecked;
+ }
+
+
+ public bool LeftTogIsChecked
+ {
+ get { return (bool)GetValue(LeftTogIsCheckedProperty); }
+ set { SetValue(LeftTogIsCheckedProperty, value); }
+ }
+ public static readonly DependencyProperty LeftTogIsCheckedProperty =
+ DependencyProperty.Register("LeftTogIsChecked", typeof(bool), typeof(Cylinder),
+ new PropertyMetadata(false, new PropertyChangedCallback(OnPropertyChanged)));
+
+
+ public bool RightTogIsChecked
+ {
+ get { return (bool)GetValue(RightTogIsCheckedProperty); }
+ set { SetValue(RightTogIsCheckedProperty, value); }
+ }
+ public static readonly DependencyProperty RightTogIsCheckedProperty =
+ DependencyProperty.Register("RightTogIsChecked", typeof(bool), typeof(Cylinder),
+ new PropertyMetadata(false, new PropertyChangedCallback(OnPropertyChanged)));
+
+
}
}
diff --git a/BPASmartClient/MainWindow.xaml b/BPASmartClient/MainWindow.xaml
index ec97dc59..49784b1a 100644
--- a/BPASmartClient/MainWindow.xaml
+++ b/BPASmartClient/MainWindow.xaml
@@ -27,7 +27,7 @@
-
+
@@ -40,7 +40,8 @@
- ManualControl = new ObservableCollection();
+ ManualControl.Add(new SubMenumodel()
+ {
+ SubMenuName = "手动控制",
+ SubMenuPermission = new Permission[] { Permission.管理员, Permission.操作员, Permission.技术员 },
+ AssemblyName = "BPASmartClient.DosingSystem",
+ ToggleWindowPath = "View.ManualControlView"
+ });
+
+ MenuManage.GetInstance.menuModels.Add(new MenuModel()
+ {
+ MainMenuIcon = "",
+ MainMenuName = "手动控制",
+ Alias = "Parameter Set",
+ subMenumodels = ManualControl,
+ });
+ #endregion
+
#region 消息日志
ObservableCollection InfoLog = new ObservableCollection();
InfoLog.Add(new SubMenumodel()
diff --git a/DosingSystem/View/ManualControlView.xaml b/DosingSystem/View/ManualControlView.xaml
new file mode 100644
index 00000000..b1a83b7f
--- /dev/null
+++ b/DosingSystem/View/ManualControlView.xaml
@@ -0,0 +1,186 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/DosingSystem/View/ManualControlView.xaml.cs b/DosingSystem/View/ManualControlView.xaml.cs
new file mode 100644
index 00000000..3cd21a96
--- /dev/null
+++ b/DosingSystem/View/ManualControlView.xaml.cs
@@ -0,0 +1,28 @@
+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.Navigation;
+using System.Windows.Shapes;
+
+namespace BPASmartClient.DosingSystem.View
+{
+ ///
+ /// ManualControlView.xaml 的交互逻辑
+ ///
+ public partial class ManualControlView : UserControl
+ {
+ public ManualControlView()
+ {
+ InitializeComponent();
+ }
+ }
+}
diff --git a/DosingSystem/ViewModel/ManualControlViewModel.cs b/DosingSystem/ViewModel/ManualControlViewModel.cs
new file mode 100644
index 00000000..4b63e1d7
--- /dev/null
+++ b/DosingSystem/ViewModel/ManualControlViewModel.cs
@@ -0,0 +1,45 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Microsoft.Toolkit.Mvvm.ComponentModel;
+using System.Collections.ObjectModel;
+
+namespace BPASmartClient.DosingSystem.ViewModel
+{
+ public class ManualControlViewModel : ObservableObject
+ {
+ public ManualControlViewModel()
+ {
+ for (int i = 0; i < 40; i++)
+ {
+ cylinderModels.Add(new CylinderModel()
+ {
+ Name = $"设备 {i.ToString()}",
+ LeftTog = false,
+ RightTog = false,
+ });
+ }
+ }
+
+ public ObservableCollection cylinderModels { get; set; } = new ObservableCollection();
+
+ }
+
+ public class CylinderModel : ObservableObject
+ {
+
+ public bool LeftTog { get { return _mLeftTog; } set { _mLeftTog = value; OnPropertyChanged(); } }
+ private bool _mLeftTog;
+
+ public bool RightTog { get { return _mRightTog; } set { _mRightTog = value; OnPropertyChanged(); } }
+ private bool _mRightTog;
+
+ public string Name { get { return _mName; } set { _mName = value; OnPropertyChanged(); } }
+ private string _mName;
+
+
+
+ }
+}
From b93480f5252d1bca5050ce9a40aece52d082ca85 Mon Sep 17 00:00:00 2001
From: NXX <447201003@qq>
Date: Sat, 20 Aug 2022 15:21:44 +0800
Subject: [PATCH 02/13] =?UTF-8?q?=E9=85=8D=E6=96=99=E5=8A=9F=E8=83=BD?=
=?UTF-8?q?=E9=9B=86=E6=88=90?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
DosingSystem/View/RecipeControlView.xaml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/DosingSystem/View/RecipeControlView.xaml b/DosingSystem/View/RecipeControlView.xaml
index acd58d57..a4c968c0 100644
--- a/DosingSystem/View/RecipeControlView.xaml
+++ b/DosingSystem/View/RecipeControlView.xaml
@@ -9,8 +9,8 @@
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:pry="clr-namespace:BPASmartClient.CustomResource.UserControls;assembly=BPASmartClient.CustomResource"
xmlns:vm="clr-namespace:BPASmartClient.DosingSystem.ViewModel"
- d:DesignHeight="450"
- d:DesignWidth="800"
+ d:DesignHeight="800"
+ d:DesignWidth="1400"
mc:Ignorable="d">
From a8fa0a409712ac006402a73301645c19b0d49087 Mon Sep 17 00:00:00 2001
From: taoye
Date: Mon, 22 Aug 2022 11:44:35 +0800
Subject: [PATCH 03/13] =?UTF-8?q?=E5=B0=8F=E7=82=92=E6=9B=B4=E6=96=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Fonts/font/iconfont.ttf | Bin 3852 -> 5848 bytes
.../Pages/Model/AlarmHelper.cs | 2 +-
.../Pages/Model/AlarmInfo.cs | 84 +-
.../Pages/View/UserLogView.xaml | 8 +-
.../Pages/View/UserManageView.xaml | 77 +-
.../Pages/View/UserManageView.xaml.cs | 11 +-
.../Pages/View/VariableConfigView.xaml | 6 +-
.../Pages/ViewModel/AlarmViewModel.cs | 6 +-
.../Pages/ViewModel/LoginViewModel.cs | 94 +-
.../Pages/ViewModel/UserManageViewModel.cs | 35 +-
BPASmartClient.MorkF/Control_MorkF.cs | 1456 ++++++++++-------
BPASmartClient.MorkF/GVL_MorkF.cs | 10 +-
FryPot_DosingSystem/App.xaml.cs | 21 +-
.../Control/DosingLogicControl.cs | 130 +-
FryPot_DosingSystem/Control/GlobalVariable.cs | 10 +-
.../Resources/fonts/demo_index.html | 29 +-
.../Resources/fonts/iconfont.ttf | Bin 5720 -> 5848 bytes
FryPot_DosingSystem/View/UserManageView.xaml | 4 +-
.../View/UserManageView.xaml.cs | 9 +-
19 files changed, 1184 insertions(+), 808 deletions(-)
diff --git a/BPASmartClient.CustomResource/Fonts/font/iconfont.ttf b/BPASmartClient.CustomResource/Fonts/font/iconfont.ttf
index f964af1f901ffc4a0145b0727827fce5dc14055b..f34fabb33d5d180bf3dd204266f6f7b7ae059a2b 100644
GIT binary patch
delta 2628
zcmZuyYit}>6+Y+Ab00J7-JRLBz3#@dYwy~zy^i-Wo77J1kd2kLN!12^L?%+Qi5>5z
zv17Nkh%L~%4M;#ulwt~zsM-Kh12U>A{G(D;kXs(=k09}Xmw=iGB&%kg*nE*rJP;fDZl830b6o+{5QckKNu0Lv5BC(kXMdF+D+
zJ_Zol0Mt@tqC9S#`E5VhZV=2038W9X?@|2?LPuq4?!qCy{vYDIL+wN7&YvzPwD|V{
z_ti4aMIZx2>?1H+2m2lyV(duzQbYRhV
z9S|{C!!De0T8CXYDYYstoE%wI7Zdu%35Oqo}~T>Vo0}>ope?DOex5a1wfR
z)dfWlo7Y`93EkXq;SAu`f(uY7K!CsCGq}kTY>xe$y~mZfpK^EkEdMZnUAQ6kiZ>)0
zBGibwewEwc%J5^Ftqk^K%K5ldx(CGoCkE(`Dn5YP4vf$j<&ud2rp;kAi-lBrtHb{o
zOHtRDdJAHJiMlkP#WA}N3j_Hr{%|fkj8UmZ%KLQ~&N=j-eg$p=Ii3l!-{X~ZO_sf0
z$>Ry>UfC}T9BG&wWP)^B);0eRsKpQ&AJdrESxbTHwlctMhQ-?$vrg)1V%#GoT*#3o3-3P(;`bdGp}5;?i)3427pFW`{`pNI`&
zzvKz{{GuH823=cGv^PZI3N>W8$>VG8Qkf|5k`u%|+ZwSr#;uxQ{}BbR?2}ZVPYj8Y
zl6){ppCl?Gx$${fhr2#(f1MV8S6vQ{K!O*@zw-&>}fKCv@ft
zS+g)8NLY+yi#lzBLOzu&B!l!f5~3bV>h#ybx>0ZwoE$I)5~3Ethrws;_hFR0N)S8CxjQVMi)_ii3hsDnt|?K%tqrFjcAgJ5)F&iVJctTheb2&
zxTVuZZ5&(KVP?`I4IssnW>7hC{8GBBD}Cwsi9dW+t%O=G^8q6)DDU{={qPB%xf6
zG;vFxH~d_^4lN=3l{wBMwHdxuk7t$lCt8?y4vz+#*_tes`I?8Ko#&BTqzj-KIw1?g
za0JF+66OG+W-(63Xe6p)s&gNUGfl+|E5_MA=59~H5vuH-EW>CkcG8*4(&k=_GhHa;
z&7xV}!o>
z%uMX=zg-1(9emu;#QF=FR*dx(Gp*bU(HPrvro?~otEIc+qx*9s(wC>jR@AV2^s!PG
z^&qa?XH{7(0Qw9B@0v^&<<;*wFYYm>eZ_oWaW)Ev^9MUmFDj2`r&
z5B;dn?G?Z#3}Ohw5IkF*7_XM67pv#0^QS8l)06U6MZ8cgFP5vmQ=~pyeX275>y(xc=4j-FpwQQ34#}ID#D83a|I6`6!b9Smu7?E3%|VgzP#`M|G#`JE{#9V
zcP1}i0%!?9WyZA{7Z=Yx0+bwcY_`_ARg$l+1L`!Ot=d)VX8z1qozM1|lFbEeOFZQD
zCUeww=bNSy?6BSs-kY_#87uKXU*`Tv-sfDa*`P7JwTtE8Yc~vyc5d7&f4HKunI9)nLP77X$>lBd}tUMt|-!!
zj%>>nxh^-hd;L}r0J0$M|7+Z_e-QVNAiMA37_3Z)AOE;5iAVZj$jMOm5A`?$n^+lJa0s>Kel@j;l=x{iSWhd
z9BMGGVG+M*nwIIga$KAi3*x.GetInstance.Base.Add(tempAlarm);
Sqlite.GetInstance.Save();
diff --git a/BPASmartClient.CustomResource/Pages/Model/AlarmInfo.cs b/BPASmartClient.CustomResource/Pages/Model/AlarmInfo.cs
index 3c19179c..a7b82d22 100644
--- a/BPASmartClient.CustomResource/Pages/Model/AlarmInfo.cs
+++ b/BPASmartClient.CustomResource/Pages/Model/AlarmInfo.cs
@@ -12,7 +12,8 @@ namespace BPASmartClient.CustomResource.Pages.Model
{
}
-
+
+ #region 180项目报警信息
///
/// 1 号滚筒线故障
///
@@ -53,7 +54,86 @@ namespace BPASmartClient.CustomResource.Pages.Model
///
[Alarm("【5】号炒锅滚筒运行故障", AlarmTriggerType.Rising, AlarmLevel.严重报警)]
public ushort FryPotFiveRollerTrouble { get; set; }
+ #region 滚筒是否运行状态监测
+ ///
+ /// 1号滚筒线滚筒未运行
+ ///
+ [Alarm("【1】号滚筒线未运行", AlarmTriggerType.Falling, AlarmLevel.一般报警)]
+ public ushort LineOneRollerRunning { get; set; }
+ ///
+ /// 2号滚筒线滚筒未运行
+ ///
+ [Alarm("【2】号滚筒线未运行", AlarmTriggerType.Falling, AlarmLevel.一般报警)]
+ public ushort LineTwoRollerRunning { get; set; }
+ ///
+ /// 3号滚筒线滚筒未运行
+ ///
+ [Alarm("【3】号滚筒线未运行", AlarmTriggerType.Falling, AlarmLevel.一般报警)]
+ public ushort LineThreeRollerRunning { get; set; }
+ ///
+ /// 1号炒锅进料滚筒未运行
+ ///
+ [Alarm("【1】号炒锅进料滚筒未运行", AlarmTriggerType.Falling, AlarmLevel.一般报警)]
+ public ushort FryPotOneRollerRunning { get; set; }
+ ///
+ /// 2号炒锅进料滚筒未运行
+ ///
+ [Alarm("【2】号炒锅进料滚筒未运行", AlarmTriggerType.Falling, AlarmLevel.一般报警)]
+ public ushort FryPotTwoRollerRunning { get; set; }
+ ///
+ /// 3号炒锅进料滚筒未运行
+ ///
+ [Alarm("【3】号炒锅进料滚筒未运行", AlarmTriggerType.Falling, AlarmLevel.一般报警)]
+ public ushort FryPotThreeRollerRunning { get; set; }
+ ///
+ /// 4号炒锅进料滚筒未运行
+ ///
+ [Alarm("【4】号炒锅进料滚筒未运行", AlarmTriggerType.Falling, AlarmLevel.一般报警)]
+ public ushort FryPotFourRollerRunning { get; set; }
+ ///
+ /// 5号炒锅进料滚筒未运行
+ ///
+ [Alarm("【5】号炒锅进料滚筒未运行", AlarmTriggerType.Falling, AlarmLevel.一般报警)]
+ public ushort FryPotFiveRollerRunning { get; set; }
+ ///
+ /// 1号炒锅空桶出料滚筒未运行
+ ///
+ [Alarm("【1】号炒锅空桶出料滚筒未运行", AlarmTriggerType.Falling, AlarmLevel.一般报警)]
+ public ushort FryPotOneEmptyRollerRunning { get; set; }
+
+ ///
+ /// 2号炒锅空桶出料滚筒未运行
+ ///
+ [Alarm("【2】号炒锅空桶出料滚筒未运行", AlarmTriggerType.Falling, AlarmLevel.一般报警)]
+ public ushort FryPotTwoEmptyRollerRunning { get; set; }
+ ///
+ /// 3号炒锅空桶出料滚筒未运行
+ ///
+ [Alarm("【3】号炒锅空桶出料滚筒未运行", AlarmTriggerType.Falling, AlarmLevel.一般报警)]
+ public ushort FryPotThreeEmptyRollerRunning { get; set; }
+ ///
+ /// 4号炒锅空桶出料滚筒未运行
+ ///
+ [Alarm("【4】号炒锅空桶出料滚筒未运行", AlarmTriggerType.Falling, AlarmLevel.一般报警)]
+ public ushort FryPotFourEmptyRollerRunning { get; set; }
+ ///
+ /// 5号炒锅空桶出料滚筒未运行
+ ///
+ [Alarm("【5】号炒锅空桶出料滚筒未运行", AlarmTriggerType.Falling, AlarmLevel.一般报警)]
+ public ushort FryPotFiveEmptyRollerRunning { get; set; }
+ ///
+ /// 洗桶工位进桶滚筒未运行
+ ///
+ [Alarm("洗桶工位进桶滚筒未运行", AlarmTriggerType.Falling, AlarmLevel.一般报警)]
+ public ushort CleanEnterRollerRunning { get; set; }
+ ///
+ /// 洗桶工位出桶滚筒未运行
+ ///
+ [Alarm("洗桶工位出桶滚筒未运行", AlarmTriggerType.Falling, AlarmLevel.一般报警)]
+ public ushort CleanOutputRollerRunning { get; set; }
+ #endregion
+ #endregion
+
-
}
}
diff --git a/BPASmartClient.CustomResource/Pages/View/UserLogView.xaml b/BPASmartClient.CustomResource/Pages/View/UserLogView.xaml
index ac3ce937..502972ba 100644
--- a/BPASmartClient.CustomResource/Pages/View/UserLogView.xaml
+++ b/BPASmartClient.CustomResource/Pages/View/UserLogView.xaml
@@ -256,7 +256,7 @@
FontSize="16"
Foreground="{StaticResource TitleFontColor}"
Text="日期" />
-
+
+
+
+
+
diff --git a/BPASmartClient.CustomResource/Pages/View/UserManageView.xaml b/BPASmartClient.CustomResource/Pages/View/UserManageView.xaml
index a3e55d72..3a2e5bfc 100644
--- a/BPASmartClient.CustomResource/Pages/View/UserManageView.xaml
+++ b/BPASmartClient.CustomResource/Pages/View/UserManageView.xaml
@@ -317,11 +317,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
@@ -418,7 +491,7 @@
-
+
diff --git a/BPASmartClient.CustomResource/Pages/View/UserManageView.xaml.cs b/BPASmartClient.CustomResource/Pages/View/UserManageView.xaml.cs
index 13a7bff7..ff8b88e7 100644
--- a/BPASmartClient.CustomResource/Pages/View/UserManageView.xaml.cs
+++ b/BPASmartClient.CustomResource/Pages/View/UserManageView.xaml.cs
@@ -25,6 +25,7 @@ namespace BPASmartClient.CustomResource.Pages.View
public UserManageView()
{
InitializeComponent();
+ //this.DataContext = UserManageViewModel.GetInstance;
}
private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
@@ -32,15 +33,21 @@ namespace BPASmartClient.CustomResource.Pages.View
ComboBox cbo = sender as ComboBox;
var id = cbo.Tag;
var per = cbo.SelectedItem;
- if (id == null)
+ if (id != null)
{
- var a = UserManageViewModel.GetInstance.usersInfo.FirstOrDefault(p => p.Id == id);
+ var a = UserManageViewModel.usersInfo.FirstOrDefault(p => p.Id == id.ToString());
if (a != null && per != null)
{
a.permission = (Permission)Enum.Parse(typeof(Permission), per.ToString());
}
}
+ else
+ {
+ UserManageViewModel.usersInfo.Last().permission = (Permission)Enum.Parse(typeof(Permission), per.ToString());
+ }
}
+
+
}
}
diff --git a/BPASmartClient.CustomResource/Pages/View/VariableConfigView.xaml b/BPASmartClient.CustomResource/Pages/View/VariableConfigView.xaml
index 5247d35a..9c64bfe2 100644
--- a/BPASmartClient.CustomResource/Pages/View/VariableConfigView.xaml
+++ b/BPASmartClient.CustomResource/Pages/View/VariableConfigView.xaml
@@ -374,13 +374,15 @@
+ VerticalContentAlignment="Center"
+ SelectionChanged="ComboBox_SelectionChanged" FontSize="20" Foreground="#FF2AB2E7" Width="130" Height="40" Margin="0,0,10,0">
+ LoadingRow="DataGrid_LoadingRow"
+ CanUserDeleteRows="True" ColumnHeaderStyle="{StaticResource ColumHeaderStyle}" RowStyle="{StaticResource rowStyle}" CellStyle="{StaticResource cellStyle}">
diff --git a/BPASmartClient.CustomResource/Pages/ViewModel/AlarmViewModel.cs b/BPASmartClient.CustomResource/Pages/ViewModel/AlarmViewModel.cs
index 65788bcb..262d27e5 100644
--- a/BPASmartClient.CustomResource/Pages/ViewModel/AlarmViewModel.cs
+++ b/BPASmartClient.CustomResource/Pages/ViewModel/AlarmViewModel.cs
@@ -64,8 +64,8 @@ namespace BPASmartClient.CustomResource.Pages.ViewModel
}
});
- AlarmInfos = MessageLog.GetInstance.alarmLogs;
-
+ //AlarmInfos = MessageLog.GetInstance.alarmLogs;
+ AlarmInfos = AlarmHelper.Alarms;
}
private void GetHistoryAlarm()
@@ -130,7 +130,7 @@ namespace BPASmartClient.CustomResource.Pages.ViewModel
private DateTime _mEndDateTime = DateTime.Now;
- public ObservableCollection AlarmInfos { get; set; }
+ public ObservableCollection AlarmInfos { get; set; }
public ObservableCollection HistoryAlarm { get; set; } = new ObservableCollection();
}
diff --git a/BPASmartClient.CustomResource/Pages/ViewModel/LoginViewModel.cs b/BPASmartClient.CustomResource/Pages/ViewModel/LoginViewModel.cs
index f427fbed..6b3ae30a 100644
--- a/BPASmartClient.CustomResource/Pages/ViewModel/LoginViewModel.cs
+++ b/BPASmartClient.CustomResource/Pages/ViewModel/LoginViewModel.cs
@@ -59,58 +59,58 @@ namespace BPASmartClient.CustomResource.Pages.ViewModel
if (res != null)
{
Global.userInfo = res;
-
- Global.userInfo.LastLogInTime = DateTime.Now.ToString();
- res.LastLogInTime = DateTime.Now.ToString();
- Config.GetInstance.SaveUser();
- if(res.permission == Enums.Permission.管理员)
- {
- foreach( var items in MenuManage.GetInstance.menuModels)
- {
- foreach(var item in items.subMenumodels)
- {
- item.SubMenuVisibility = Visibility.Visible;
- }
- }
- }
- else
- {
- if (res.userTreeViewModels != null)
- {
- if (res.userTreeViewModels.Count > 0)
- {
- foreach (var items in MenuManage.GetInstance.menuModels)
- {
- foreach (var item in items.subMenumodels)
- {
- if (res.userTreeViewModels.FirstOrDefault(p => p.Name == item.SubMenuName) != null)
- {
- item.SubMenuVisibility = Visibility.Visible;
- }
- }
- }
- }
- }
- }
- //for (int i = 0; i < MenuManage.GetInstance.menuModels.Count; i++)
+ //Global.userInfo.LastLogInTime = DateTime.Now.ToString();
+ //res.LastLogInTime = DateTime.Now.ToString();
+ //Config.GetInstance.SaveUser();
+ //if(res.permission == Enums.Permission.管理员)
//{
- // if (MenuManage.GetInstance.menuModels.ElementAt(i).MainMenuPermission.Contains(res.permission))
- // MenuManage.GetInstance.menuModels.ElementAt(i).MainMenuVisibility = Visibility.Visible;
- // else
- // MenuManage.GetInstance.menuModels.ElementAt(i).MainMenuVisibility = Visibility.Collapsed;
-
- // if (MenuManage.GetInstance.menuModels.ElementAt(i).subMenumodels.FirstOrDefault(p => p.SubMenuPermission.Contains(res.permission)) == null)
- // MenuManage.GetInstance.menuModels.ElementAt(i).MainMenuVisibility = Visibility.Collapsed;
-
- // for (int m = 0; m < MenuManage.GetInstance.menuModels.ElementAt(i).subMenumodels.Count; m++)
+ // foreach( var items in MenuManage.GetInstance.menuModels)
// {
- // if (MenuManage.GetInstance.menuModels.ElementAt(i).subMenumodels.ElementAt(m).SubMenuPermission.Contains(res.permission))
- // MenuManage.GetInstance.menuModels.ElementAt(i).subMenumodels.ElementAt(m).SubMenuVisibility = Visibility.Visible;
- // else
- // MenuManage.GetInstance.menuModels.ElementAt(i).subMenumodels.ElementAt(m).SubMenuVisibility = Visibility.Collapsed;
+ // foreach(var item in items.subMenumodels)
+ // {
+ // item.SubMenuVisibility = Visibility.Visible;
+ // }
// }
//}
+ //else
+ //{
+ // if (res.userTreeViewModels != null)
+ // {
+ // if (res.userTreeViewModels.Count > 0)
+ // {
+ // foreach (var items in MenuManage.GetInstance.menuModels)
+ // {
+ // foreach (var item in items.subMenumodels)
+ // {
+ // if (res.userTreeViewModels.FirstOrDefault(p => p.Name == item.SubMenuName) != null)
+ // {
+ // item.SubMenuVisibility = Visibility.Visible;
+ // }
+ // }
+ // }
+ // }
+ // }
+ //}
+
+ for (int i = 0; i < MenuManage.GetInstance.menuModels.Count; i++)
+ {
+ if (MenuManage.GetInstance.menuModels.ElementAt(i).MainMenuPermission.Contains(res.permission))
+ MenuManage.GetInstance.menuModels.ElementAt(i).MainMenuVisibility = Visibility.Visible;
+ else
+ MenuManage.GetInstance.menuModels.ElementAt(i).MainMenuVisibility = Visibility.Collapsed;
+
+ if (MenuManage.GetInstance.menuModels.ElementAt(i).subMenumodels.FirstOrDefault(p => p.SubMenuPermission.Contains(res.permission)) == null)
+ MenuManage.GetInstance.menuModels.ElementAt(i).MainMenuVisibility = Visibility.Collapsed;
+
+ for (int m = 0; m < MenuManage.GetInstance.menuModels.ElementAt(i).subMenumodels.Count; m++)
+ {
+ if (MenuManage.GetInstance.menuModels.ElementAt(i).subMenumodels.ElementAt(m).SubMenuPermission.Contains(res.permission))
+ MenuManage.GetInstance.menuModels.ElementAt(i).subMenumodels.ElementAt(m).SubMenuVisibility = Visibility.Visible;
+ else
+ MenuManage.GetInstance.menuModels.ElementAt(i).subMenumodels.ElementAt(m).SubMenuVisibility = Visibility.Collapsed;
+ }
+ }
ActionManage.GetInstance.Send("PermissionChange");
ActionManage.GetInstance.Send("LoginOk");
diff --git a/BPASmartClient.CustomResource/Pages/ViewModel/UserManageViewModel.cs b/BPASmartClient.CustomResource/Pages/ViewModel/UserManageViewModel.cs
index c1ad1d9f..29004637 100644
--- a/BPASmartClient.CustomResource/Pages/ViewModel/UserManageViewModel.cs
+++ b/BPASmartClient.CustomResource/Pages/ViewModel/UserManageViewModel.cs
@@ -17,14 +17,18 @@ namespace BPASmartClient.CustomResource.Pages.ViewModel
{
internal class UserManageViewModel:ObservableObject
{
- private static UserManageViewModel _instance;
- public static UserManageViewModel GetInstance => _instance ??= new UserManageViewModel();
- public ObservableCollection usersInfo { get; set; } = new ObservableCollection();
+ //private static UserManageViewModel _instance;
+ //public static UserManageViewModel GetInstance => _instance ??= new UserManageViewModel();
+ public static ObservableCollection usersInfo { get; set; } = new ObservableCollection();
//public List Authorities { get; set; } = new List() { Permission.管理员, Permission.操作员, Permission.观察员, Permission.技术员 };
public List Authorities { get; set; } = new List();
public RelayCommand SaveCommand { get; set; }
public RelayCommand DeleteCommand { get; set; }
+
+ public RelayCommand AddUserInfoCommand { get; set; }
+
+ public RelayCommand SaveDataCommand { get; set; }
public UserManageViewModel()
{
var userManager = JsonConvert.DeserializeObject(File.ReadAllText("up.hbl").AESDecrypt());
@@ -52,7 +56,10 @@ namespace BPASmartClient.CustomResource.Pages.ViewModel
MessageBox.Show("保存成功", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
}
-
+ }
+ else
+ {
+ MessageBox.Show("用户名为空或输入后未回车确认", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
}
});
DeleteCommand = new RelayCommand((str) =>
@@ -73,6 +80,26 @@ namespace BPASmartClient.CustomResource.Pages.ViewModel
MessageBox.Show("未找到对应记录", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
}
}
+ else
+ {
+ usersInfo.Remove(usersInfo.Last());
+ Global.userManager.userInfos = usersInfo;
+ File.WriteAllText("up.hbl", JsonConvert.SerializeObject(Global.userManager).AESEncrypt());
+ }
+ });
+
+
+ AddUserInfoCommand = new RelayCommand( ()=>
+ {
+ usersInfo.Add(new UserInfo());
+
+ });
+ SaveDataCommand = new RelayCommand(() =>
+ {
+ Global.userManager.userInfos = usersInfo;
+ File.WriteAllText("up.hbl", JsonConvert.SerializeObject(Global.userManager).AESEncrypt());
+ MessageBox.Show("保存成功", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
+
});
}
diff --git a/BPASmartClient.MorkF/Control_MorkF.cs b/BPASmartClient.MorkF/Control_MorkF.cs
index 269d342c..7cfcf255 100644
--- a/BPASmartClient.MorkF/Control_MorkF.cs
+++ b/BPASmartClient.MorkF/Control_MorkF.cs
@@ -320,7 +320,7 @@ namespace BPASmartClient.MorkF
///
private void InitialData()
{
- //队列
+ //单个订单
string subId = Guid.NewGuid().ToString();
morkF.TakeMaterialQueue.Enqueue(new OrderLocInfo() { SuborderId = subId, MaterialLoc = new List() { 1 } });//A料
morkF.TakeMaterialQueue.Enqueue(new OrderLocInfo() { SuborderId = subId, MaterialLoc = new List() { 2 } });//B料
@@ -328,6 +328,21 @@ namespace BPASmartClient.MorkF
morkF.TakePlateQueue.Enqueue(new OrderLocInfo() { SuborderId = subId });
resultorder.AddRange(new int[] { 1, 2, 3 });
morkF.listStirBom.Add(stirFryBom);
+
+ //多个订单
+ //string subId = Guid.NewGuid().ToString();
+ //morkF.TakeMaterialQueue.Enqueue(new OrderLocInfo() { SuborderId = subId, MaterialLoc = new List() { 1 } });//A料
+ //morkF.TakeMaterialQueue.Enqueue(new OrderLocInfo() { SuborderId = subId, MaterialLoc = new List() { 2 } });//B料
+ //morkF.TakeMaterialQueue.Enqueue(new OrderLocInfo() { SuborderId = subId, MaterialLoc = new List() { 3 } });//C料
+ //morkF.TakeMaterialQueue.Enqueue(new OrderLocInfo() { SuborderId = subId+1, MaterialLoc = new List() { 1 } });//A料
+ //morkF.TakeMaterialQueue.Enqueue(new OrderLocInfo() { SuborderId = subId+1, MaterialLoc = new List() { 2 } });//B料
+ //morkF.TakeMaterialQueue.Enqueue(new OrderLocInfo() { SuborderId = subId+1, MaterialLoc = new List() { 3 } });//C料
+ //morkF.TakePlateQueue.Enqueue(new OrderLocInfo() { SuborderId = subId });
+ //morkF.TakePlateQueue.Enqueue(new OrderLocInfo() { SuborderId = subId+1 });
+ //resultorder.AddRange(new int[] { 1, 2, 3 });
+ //resultorder.AddRange(new int[] { 1, 2, 3 });
+ //morkF.listStirBom.Add(stirFryBom);
+ //morkF.listStirBom.Add(stirFryBom);
}
#endregion
@@ -466,7 +481,7 @@ namespace BPASmartClient.MorkF
MessageLog.GetInstance.Show($"倒菜");
break;
case StirFryRobotAction.灶取锅:
- MessageLog.GetInstance.Show($"灶取锅");
+ MessageLog.GetInstance.Show($"灶取锅");
break;
}
}
@@ -525,7 +540,11 @@ namespace BPASmartClient.MorkF
}
});
}
-
+ ///
+ /// 订单状态发布
+ ///
+ ///
+ ///
private void OrderChange(string subid, ORDER_STATUS oRDER_STATUS)
{
EventBus.EventBus.GetInstance().Publish(new OrderStatusChangedEvent() { Status = oRDER_STATUS, SubOrderId = subid });
@@ -596,7 +615,7 @@ namespace BPASmartClient.MorkF
morkF.MinorProcessExcuteLock = true;
Task.Run(() =>
{
- if (morkF.MinorProcessFlag && !morkF.RoobotIdle && morkF.TakeMaterialQueue.Count > 0)
+ if (morkF.MinorProcessFlag && !morkF.RoobotIdle && morkF.TakeMaterialQueue.Count > 0 && morkF.listStirBom.Count > 0 )
{
morkF.MinorProessStatus = true;
morkF.MainProcessStatus = false;
@@ -625,8 +644,8 @@ namespace BPASmartClient.MorkF
TakeBurdenCTask();//执行取C料操作
break;
case StirFryRobotAction.灶取锅:
- OutDishTask();//执行出餐操作
- CleanPotTask();//洗锅操作
+ MinorProcessOutDishTask();//执行出餐操作
+ MinorProcessCleanPotTask();//洗锅操作
break;
}
@@ -643,42 +662,42 @@ namespace BPASmartClient.MorkF
case StirFryPotAction.NONE:
break;
case StirFryPotAction.大火t1s:
- KitchenAdjustGears(3);
+ MinorProcessKitchenAdjustGears(3);
Task.Delay(1000).Wait(); //大火加热1s//执行大火锅干操作
break;
case StirFryPotAction.加油:
AddOil();//注油//执行加油操作
break;
case StirFryPotAction.中火t2s:
- KitchenAdjustGears(2);
+ MinorProcessKitchenAdjustGears(2);
Task.Delay(2000).Wait();//执行操作
break;
case StirFryPotAction.小火持续:
- KitchenAdjustGears(1);
+ MinorProcessKitchenAdjustGears(1);
break;
case StirFryPotAction.中火持续:
- KitchenAdjustGears(5);
+ MinorProcessKitchenAdjustGears(5);
break;
case StirFryPotAction.大火持续:
- KitchenAdjustGears(7);
+ MinorProcessKitchenAdjustGears(7);
break;
case StirFryPotAction.停止火力:
- KitchenAdjustGears(0);//关闭灶加热
+ MinorProcessKitchenAdjustGears(0);//关闭灶加热
break;
case StirFryPotAction.搅拌臂上位:
- TurnUpStatusDetect();//执行搅拌臂上位操作
+ MinorProcessTurnUpStatusDetect();//执行搅拌臂上位操作
break;
case StirFryPotAction.搅拌臂下位:
- TurnDownStatusDetect();//执行搅拌臂下位操作
+ MinorProcessTurnDownStatusDetect();//执行搅拌臂下位操作
break;
case StirFryPotAction.低速旋转:
- TurnMachineGearsControl(1);//执行搅拌臂速度1挡操作
+ MinorProcessTurnMachineGearsControl(1);//执行搅拌臂速度1挡操作
break;
case StirFryPotAction.快速旋转:
- TurnMachineGearsControl(2);//执行搅拌臂速度3挡操作
+ MinorProcessTurnMachineGearsControl(2);//执行搅拌臂速度3挡操作
break;
case StirFryPotAction.停止旋转:
- TurnMachineGearsControl(0);//执行搅拌臂速度0挡操作
+ MinorProcessTurnMachineGearsControl(0);//执行搅拌臂速度0挡操作
break;
}
}
@@ -687,21 +706,20 @@ namespace BPASmartClient.MorkF
Task.Delay(res.During * 1000).Wait();//当前流程延迟
if (morkF.MainProcessWait)
{
- if (morkF.MinorHasTakeMaterial)
+ if (morkF.MainHasTakeMaterial)
{
}
else
{
- KitchenAdjustGears(0);//关闭灶加热
- morkF.MinorProessStatus = false;
- morkF.MainProcessStatus = true;
+ MinorProcessKitchenAdjustGears(0);//关闭灶加热
//阻塞辅流程
minorReset.WaitOne();
+ //morkF.MinorProessStatus = true;
+ //morkF.MainProcessStatus = false;
}
}
- morkF.MinorProessStatus = true;
- morkF.MainProcessStatus = false;
+
}
morkF.MinorOutMealComplete = true;
}
@@ -721,7 +739,7 @@ namespace BPASmartClient.MorkF
morkF.MainProcessExcuteLock = true;
Task.Run(new Action(() =>
{
- if (!morkF.RoobotIdle && morkF.InitialComplete && morkF.TakeMaterialQueue.Count > 0 && morkF.MainProcessFlag)
+ if (!morkF.RoobotIdle && morkF.InitialComplete && morkF.TakeMaterialQueue.Count > 0 && morkF.MainProcessFlag&& morkF.listStirBom.Count > 0)
{
morkF.MainProcessStatus = true;
morkF.MinorProessStatus = false;
@@ -750,8 +768,8 @@ namespace BPASmartClient.MorkF
TakeBurdenCTask();//执行取C料操作
break;
case StirFryRobotAction.灶取锅:
- OutDishTask();//执行出餐操作
- CleanPotTask();//洗锅操作
+ MainProcessOutDishTask();//执行出餐操作
+ MainProcessCleanPotTask();//洗锅操作
break;
}
@@ -768,66 +786,66 @@ namespace BPASmartClient.MorkF
case StirFryPotAction.NONE:
break;
case StirFryPotAction.大火t1s:
- KitchenAdjustGears(3);
+ MainProcessKitchenAdjustGears(3);
Task.Delay(1000).Wait(); //大火加热1s//执行大火锅干操作
break;
case StirFryPotAction.加油:
AddOil();//注油//执行加油操作
break;
case StirFryPotAction.中火t2s:
- KitchenAdjustGears(2);
+ MainProcessKitchenAdjustGears(2);
Task.Delay(2000).Wait();//执行操作
break;
case StirFryPotAction.小火持续:
- KitchenAdjustGears(1);
+ MainProcessKitchenAdjustGears(1);
break;
case StirFryPotAction.中火持续:
- KitchenAdjustGears(5);
+ MainProcessKitchenAdjustGears(5);
break;
case StirFryPotAction.大火持续:
- KitchenAdjustGears(7);
+ MainProcessKitchenAdjustGears(7);
break;
case StirFryPotAction.停止火力:
- KitchenAdjustGears(0);//关闭灶加热
+ MainProcessKitchenAdjustGears(0);//关闭灶加热
break;
case StirFryPotAction.搅拌臂上位:
- TurnUpStatusDetect();//执行搅拌臂上位操作
+ MainProcessTurnUpStatusDetect();//执行搅拌臂上位操作
break;
case StirFryPotAction.搅拌臂下位:
- TurnDownStatusDetect();//执行搅拌臂下位操作
+ MainProcessTurnDownStatusDetect();//执行搅拌臂下位操作
break;
case StirFryPotAction.低速旋转:
- TurnMachineGearsControl(1);//执行搅拌臂速度1挡操作
+ MainProcessTurnMachineGearsControl(1);//执行搅拌臂速度1挡操作
break;
case StirFryPotAction.快速旋转:
- TurnMachineGearsControl(2);//执行搅拌臂速度3挡操作
+ MainProcessTurnMachineGearsControl(2);//执行搅拌臂速度3挡操作
break;
case StirFryPotAction.停止旋转:
- TurnMachineGearsControl(0);//执行搅拌臂速度0挡操作
+ MainProcessTurnMachineGearsControl(0);//执行搅拌臂速度0挡操作
break;
}
}
}));
-
Task.WhenAll(taskRobot, taskPot).Wait();//等待所有线程结束
Task.Delay(res.During * 1000).Wait();//当前流程延迟
- if (morkF.MinorProcessWait)
- {
- if (morkF.MainHasTakeMaterial)//针对主流程准备出餐但辅流程机器人忙碌情况下,辅流程不阻塞
- {
- }
- else
- {
- KitchenAdjustGears(0);//关闭灶加热
- morkF.MinorProessStatus = true;
- morkF.MainProcessStatus = false;
- //阻塞主流程
- mainReset.WaitOne();
- }
+ #region 两口锅逻辑
+ //if (morkF.MinorProcessWait)
+ //{
+ // if (morkF.MinorHasTakeMaterial)//针对主流程准备出餐但辅流程机器人忙碌情况下,辅流程不阻塞
+ // {
+ // }
+ // else
+ // {
+ // MainProcessKitchenAdjustGears(0);//关闭灶加热
+ // //阻塞主流程
+ // mainReset.WaitOne();
+ // //morkF.MinorProessStatus = false;
+ // //morkF.MainProcessStatus = true;
+ // }
+
+ //}
+ #endregion
- }
- morkF.MinorProessStatus = false;
- morkF.MainProcessStatus = true;
}
morkF.MainOutMealComplete = true;
@@ -845,31 +863,39 @@ namespace BPASmartClient.MorkF
///
private void SingleProcess()
{
-
+
//主流程出餐完成,相应变量复位
if (morkF.MainOutMealComplete)
{
+ morkF.MainOutMealComplete = false;
morkF.TakePlateLock = false;
morkF.MainProcessExcuteLock = false;
morkF.MainOrderMaterialCom = false;
- morkF.MinorProcessWait = false;//主流程出餐完成取消辅流程线程阻塞
- if (morkF.MainProcessPotLoc == 1)
- {
- morkF.PotInPlace = false;
- }
- else if (morkF.MainProcessPotLoc == 2)
- {
- morkF.SecondPotInPlace = false;
- }
+ morkF.MainProcessWait = false;//主流程出餐完成取消辅流程线程阻塞
+
+ #region 单口锅逻辑
+ morkF.PotInPlace = false;
+ #endregion
+ #region 两口锅逻辑
+ //if (morkF.MainProcessPotLoc == 1)
+ //{
+ // morkF.PotInPlace = false;
+ //}
+ //else if (morkF.MainProcessPotLoc == 2)
+ //{
+ // morkF.SecondPotInPlace = false;
+ //}
+ #endregion
}
//辅流程出餐完成,相应变量复位
if (morkF.MinorOutMealComplete)
{
+ morkF.MinorOutMealComplete = false;
morkF.TakePlateLock = false;
morkF.MinorProcessExcuteLock = false;
morkF.MinorOrderMaterialCom = false;
- morkF.MainProcessWait = false;//辅流程出餐完成取消主流程线程阻塞
+ morkF.MinorProcessWait = false;//辅流程出餐完成取消主流程线程阻塞
if (morkF.MinorProcessPotLoc == 1)
{
morkF.PotInPlace = false;
@@ -902,7 +928,7 @@ namespace BPASmartClient.MorkF
}
else
{
- DeviceProcessLogShow("未找到可用的物料信息");
+ DeviceProcessLogShow("当前订单未找到可用的物料信息");
}
}
@@ -920,7 +946,7 @@ namespace BPASmartClient.MorkF
}
else
{
- DeviceProcessLogShow("未找到可用的物料信息");
+ DeviceProcessLogShow("当前订单未找到可用的物料信息");
}
}
@@ -941,14 +967,19 @@ namespace BPASmartClient.MorkF
if (morkF.TakePlateQueue.TryDequeue(out OrderLocInfo order))
{
StartTakePlate();
- if (morkF.MainProcessStatus)
- morkF.MainCurrentOrderId = order.SuborderId;
- if (morkF.MinorProessStatus)
- morkF.MinorCurrentOrderId = order.SuborderId;
+ #region 两口锅逻辑
+ //if (morkF.MainProcessStatus)
+ // morkF.MainCurrentOrderId = order.SuborderId;
+
+ //if (morkF.MinorProessStatus)
+ // morkF.MinorCurrentOrderId = order.SuborderId;
+ #endregion
+ #region 单口锅逻辑
+ morkF.CurrentOrderId = order.SuborderId;
+ #endregion
morkF.TakePlateLock = true; //订单完成后置false
- morkF.MainOutMealComplete = false;
- morkF.MinorOutMealComplete = false;
- // OrderChange(morkF.CurrentOrderId, ORDER_STATUS.COOKING);
+
+
DeviceProcessLogShow($"订单【{order.SuborderId}】执行取碗控制");
}
}
@@ -960,75 +991,95 @@ namespace BPASmartClient.MorkF
///
private void TakePotTask()
{
- //while (!((!morkF.CleanModule && !morkF.KitchenOneStatus && morkF.CleanComplete) || (!morkF.SecondCleanModule && !morkF.KitchenSecondStatus && morkF.SecondCleanComplete)))
- //{
- // Task.Delay(5).Wait();
- //}
- while (!(!morkF.CleanModule || !morkF.SecondCleanModule) && (!morkF.KitchenOneStatus || !morkF.KitchenSecondStatus) && (morkF.CleanComplete || morkF.SecondCleanComplete))//等待取锅条件满足
+
+ while (morkF.CleanModule || morkF.KitchenOneStatus || !morkF.CleanComplete || morkF.RoobotIdle)//等待取锅条件满足
{
Task.Delay(5).Wait();
}
- while (morkF.RoobotIdle)//等待机器人空闲
+
+ #region 单口锅逻辑
+ //if (!morkF.CleanModule && !morkF.KitchenOneStatus && morkF.CleanComplete)
+ //{
+ //取1号锅到1号灶台
+ TakePotToKitchen(1);
+ WriteData("M1.5", false);//清洗模组1完成复位
+ DeviceProcessLogShow($"订单【{morkF.CurrentOrderId}】执行取锅到灶台控制");
+ while (!morkF.PutPotToKitchenComlete)
{
Task.Delay(5).Wait();
}
- if (!morkF.CleanModule && !morkF.KitchenOneStatus && morkF.CleanComplete)
- {
- //取1号锅到1号灶台
- TakePotToKitchen(1);
- morkF.CurrentPutPotLoc = 1;
- WriteData("M1.5", false);//清洗模组1完成复位
- }
- else if (!morkF.SecondCleanModule && !morkF.KitchenOneStatus && morkF.SecondCleanComplete)
- {
- //取2号锅到1号灶台
- TakePotToKitchen(1);
- morkF.CurrentPutPotLoc = 1;
- WriteData("M2.0", false);//清洗模组2完成复位
- }
- if (!morkF.SecondCleanModule && !morkF.KitchenSecondStatus && morkF.SecondCleanComplete)
- {
- //取2号锅到2号灶台
- TakePotToKitchen(2);
- morkF.CurrentPutPotLoc = 2;
- WriteData("M2.0", false);//清洗模组2完成复位
- }
- else if (!morkF.CleanModule && !morkF.KitchenSecondStatus && morkF.CleanComplete)
- {
- //取1号锅到2号灶台
- TakePotToKitchen(2);
- morkF.CurrentPutPotLoc = 2;
- WriteData("M2.0", false);//清洗模组1完成复位
- }
- if (morkF.MainProcessStatus)
- {
- morkF.MainProcessPotLoc = morkF.CurrentPutPotLoc;
- DeviceProcessLogShow($"订单【{morkF.MainCurrentOrderId}】执行取锅到灶台控制");
- }
- if (morkF.MinorProessStatus)
- {
- morkF.MinorProcessPotLoc = morkF.CurrentPutPotLoc;
- DeviceProcessLogShow($"订单【{morkF.MinorCurrentOrderId}】执行取锅到灶台控制");
- }
- if (morkF.CurrentPutPotLoc == 1)
- {
- while (!morkF.PutPotToKitchenComlete)
- {
- Task.Delay(5).Wait();
- }
- morkF.PotInPlace = morkF.PutPotToKitchenComlete;//锅到位
- WriteData("M14.0", false);//机器人取锅完成复位
- }
- if (morkF.CurrentPutPotLoc == 2)
- {
- while (!morkF.PutPotToSecondKitchenComlete)
- {
- Task.Delay(5).Wait();
- }
- morkF.SecondPotInPlace = morkF.PutPotToSecondKitchenComlete;
- WriteData("M14.4", false);//机器人取锅完成复位
- }
+ morkF.PotInPlace = true;//锅到位
+ WriteData("M14.0", false);//机器人取锅完成复位
+ //}
+ #endregion
+ #region 两口锅逻辑
+ //while (!((!morkF.CleanModule || !morkF.SecondCleanModule) && (!morkF.KitchenOneStatus || !morkF.KitchenSecondStatus) && (morkF.CleanComplete || morkF.SecondCleanComplete)))//等待取锅条件满足
+ //{
+ // Task.Delay(5).Wait();
+ //}
+ //while (morkF.RoobotIdle)//等待机器人空闲
+ //{
+ // Task.Delay(5).Wait();
+ //}
+ //if (!morkF.CleanModule && !morkF.KitchenOneStatus && morkF.CleanComplete)
+ //{
+ // //取1号锅到1号灶台
+ // TakePotToKitchen(1);
+ // morkF.CurrentPutPotLoc = 1;
+ // WriteData("M1.5", false);//清洗模组1完成复位
+ // DeviceProcessLogShow($"订单【{morkF.CurrentOrderId}】执行取锅到灶台控制");
+ //}
+ //else if (!morkF.SecondCleanModule && !morkF.KitchenOneStatus && morkF.SecondCleanComplete)
+ //{
+ // //取2号锅到1号灶台
+ // TakePotToKitchen(1);
+ // morkF.CurrentPutPotLoc = 1;
+ // WriteData("M2.0", false);//清洗模组2完成复位
+ //}
+ //if (!morkF.SecondCleanModule && !morkF.KitchenSecondStatus && morkF.SecondCleanComplete)
+ //{
+ // //取2号锅到2号灶台
+ // TakePotToKitchen(2);
+ // morkF.CurrentPutPotLoc = 2;
+ // WriteData("M2.0", false);//清洗模组2完成复位
+ //}
+ //else if (!morkF.CleanModule && !morkF.KitchenSecondStatus && morkF.CleanComplete)
+ //{
+ // //取1号锅到2号灶台
+ // TakePotToKitchen(2);
+ // morkF.CurrentPutPotLoc = 2;
+ // WriteData("M2.0", false);//清洗模组1完成复位
+ //}
+ //if (morkF.MainProcessStatus)
+ //{
+ // morkF.MainProcessPotLoc = morkF.CurrentPutPotLoc;
+ // DeviceProcessLogShow($"订单【{morkF.MainCurrentOrderId}】执行取锅到灶台控制");
+ //}
+ //if (morkF.MinorProessStatus)
+ //{
+ // morkF.MinorProcessPotLoc = morkF.CurrentPutPotLoc;
+ // DeviceProcessLogShow($"订单【{morkF.MinorCurrentOrderId}】执行取锅到灶台控制");
+ //}
+ //if (morkF.CurrentPutPotLoc == 1)
+ //{
+ // while (!morkF.PutPotToKitchenComlete)
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // morkF.PotInPlace = true;//锅到位
+ // WriteData("M14.0", false);//机器人取锅完成复位
+ //}
+ //if (morkF.CurrentPutPotLoc == 2)
+ //{
+ // while (!morkF.PutPotToSecondKitchenComlete)
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // morkF.SecondPotInPlace = true;
+ // WriteData("M14.4", false);//机器人取锅完成复位
+ //}
+ #endregion
Thread.Sleep(2000);
@@ -1079,76 +1130,94 @@ namespace BPASmartClient.MorkF
private void TakeBurdenATask()
{
int loc = 0;
- //while (morkF.RoobotIdle || (!morkF.PotInPlace && !morkF.SecondPotInPlace) || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅到位
- //{
- // Task.Delay(5).Wait();
- //}
- if (morkF.MainProcessStatus)
+ #region 单口锅逻辑
+ while (morkF.RoobotIdle || !morkF.PotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅1到位
{
- if (morkF.MainProcessPotLoc == 1)
- {
- while (morkF.RoobotIdle || !morkF.PotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅1到位
- {
- Task.Delay(5).Wait();
- }
- }
- else
- {
- while (morkF.RoobotIdle || !morkF.SecondPotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅2到位
- {
- Task.Delay(5).Wait();
- }
- }
- if (morkF.TakeMaterialQueue.TryDequeue(out OrderLocInfo order))
- {
- loc = order.MaterialLoc[0];
- TakeBurden();
- TurnReset(loc);//转台复位
-
- DeviceProcessLogShow($"订单【{order.SuborderId}】,执行到转台{loc}位置取料");
- }
- //等待取料完成
- while (!morkF.TakeMaterialComplete)
- {
- Task.Delay(5).Wait();
- }
- morkF.MainOrderMaterialCom = false;
- morkF.MainHasTakeMaterial = true;
- WriteData("M14.1", false);//机器人取料完成复位
+ Task.Delay(5).Wait();
}
- if (morkF.MinorProessStatus)
+ if (morkF.TakeMaterialQueue.TryDequeue(out OrderLocInfo order))
{
- if (morkF.MinorProcessPotLoc == 1)
- {
- while (morkF.RoobotIdle || !morkF.PotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅1到位
- {
- Task.Delay(5).Wait();
- }
- }
- else
- {
- while (morkF.RoobotIdle || !morkF.SecondPotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅2到位
- {
- Task.Delay(5).Wait();
- }
- }
- if (morkF.TakeMaterialQueue.TryDequeue(out OrderLocInfo order))
- {
- loc = order.MaterialLoc[0];
- TakeBurden();
- TurnReset(loc);//转台复位
+ loc = order.MaterialLoc[0];
+ TakeBurden();
+ TurnReset(loc);//转台复位
- DeviceProcessLogShow($"订单【{order.SuborderId}】,执行到转台{loc}位置取料");
- }
- //等待取料完成
- while (!morkF.TakeMaterialComplete)
- {
- Task.Delay(5).Wait();
- }
- morkF.MinorOrderMaterialCom = false;
- morkF.MinorHasTakeMaterial = true;
- WriteData("M14.5", false);//机器人取料完成复位
+ DeviceProcessLogShow($"订单【{order.SuborderId}】,执行到转台{loc}位置取料");
+ }
+ //等待取料完成
+ while (!morkF.TakeMaterialComplete)
+ {
+ Task.Delay(5).Wait();
}
+ WriteData("M14.1", false);//机器人取料完成复位
+ #endregion
+ #region 两口锅逻辑
+ //if (morkF.MainProcessStatus)
+ //{
+ // if (morkF.MainProcessPotLoc == 1)
+ // {
+ // while (morkF.RoobotIdle || !morkF.PotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅1到位
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // }
+ // else
+ // {
+ // while (morkF.RoobotIdle || !morkF.SecondPotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅2到位
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // }
+ // if (morkF.TakeMaterialQueue.TryDequeue(out OrderLocInfo order))
+ // {
+ // loc = order.MaterialLoc[0];
+ // TakeBurden();
+ // TurnReset(loc);//转台复位
+
+ // DeviceProcessLogShow($"订单【{order.SuborderId}】,执行到转台{loc}位置取料");
+ // }
+ // //等待取料完成
+ // while (!morkF.TakeMaterialComplete)
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // morkF.MainOrderMaterialCom = false;
+ // morkF.MainHasTakeMaterial = true;
+ // WriteData("M14.1", false);//机器人取料完成复位
+ //}
+ //if (morkF.MinorProessStatus)
+ //{
+ // if (morkF.MinorProcessPotLoc == 1)
+ // {
+ // while (morkF.RoobotIdle || !morkF.PotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅1到位
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // }
+ // else
+ // {
+ // while (morkF.RoobotIdle || !morkF.SecondPotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅2到位
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // }
+ // if (morkF.TakeMaterialQueue.TryDequeue(out OrderLocInfo order))
+ // {
+ // loc = order.MaterialLoc[0];
+ // TakeBurden();
+ // TurnReset(loc);//转台复位
+
+ // DeviceProcessLogShow($"订单【{order.SuborderId}】,执行到转台{loc}位置取料");
+ // }
+ // //等待取料完成
+ // while (!morkF.TakeMaterialComplete)
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // morkF.MinorOrderMaterialCom = false;
+ // morkF.MinorHasTakeMaterial = true;
+ // WriteData("M14.5", false);//机器人取料完成复位
+ //}
+ #endregion
morkF.TurnTableLock = false;//转台互锁解除
@@ -1238,179 +1307,219 @@ namespace BPASmartClient.MorkF
///
private void TakeBurdenCTask()
{
- #region 旧代码
- //while (morkF.RoobotIdle || (!morkF.PotInPlace && !morkF.SecondPotInPlace) || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅到位
+ #region 单口锅逻辑
+ int loc = 0;
+ while (morkF.RoobotIdle || !morkF.PotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅1到位
+ {
+ Task.Delay(5).Wait();
+ }
+ if (morkF.TakeMaterialQueue.TryDequeue(out OrderLocInfo order))
+ {
+ loc = order.MaterialLoc[0];
+ TakeBurden();
+ TurnReset(loc);//转台复位
+
+ DeviceProcessLogShow($"订单【{order.SuborderId}】,执行到转台{loc}位置取料");
+ }
+ //等待取料完成
+ while (!morkF.TakeMaterialComplete)
+ {
+ Task.Delay(5).Wait();
+ }
+
+ WriteData("M14.1", false);//机器人取料完成复位
+ morkF.TurnTableLock = false;//转台互锁解除
+ #endregion
+ #region 两口锅逻辑
+ //int loc = 0;
+
+ //if (morkF.MainProcessStatus)
//{
- // Task.Delay(5).Wait();
+ // if (morkF.MainProcessPotLoc == 1)
+ // {
+ // while (morkF.RoobotIdle || !morkF.PotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅1到位
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // }
+ // else
+ // {
+ // while (morkF.RoobotIdle || !morkF.SecondPotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅2到位
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // }
+ // if (morkF.TakeMaterialQueue.TryDequeue(out OrderLocInfo order))
+ // {
+ // loc = order.MaterialLoc[0];
+ // TakeBurden();
+ // TurnReset(loc);//转台复位
+
+ // DeviceProcessLogShow($"订单【{order.SuborderId}】,执行到转台{loc}位置取料");
+ // }
+ // //等待取料完成
+ // while (!morkF.TakeMaterialComplete)
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // morkF.MainOrderMaterialCom = false;
+ // morkF.MainHasTakeMaterial = true;
+ // WriteData("M14.1", false);//机器人取料完成复位
//}
- //if (morkF.TakeMaterialQueue.TryDequeue(out OrderLocInfo order))
+ //if (morkF.MinorProessStatus)
//{
- // int loc = order.MaterialLoc;
- // TakeBurden(loc);
- // TurnReset(loc);//转台复位
- // DeviceProcessLogShow($"订单【{ order.SuborderId}】,执行取C料");
+ // if (morkF.MinorProcessPotLoc == 1)
+ // {
+ // while (morkF.RoobotIdle || !morkF.PotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅1到位
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // }
+ // else
+ // {
+ // while (morkF.RoobotIdle || !morkF.SecondPotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅2到位
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // }
+ // if (morkF.TakeMaterialQueue.TryDequeue(out OrderLocInfo order))
+ // {
+ // loc = order.MaterialLoc[0];
+ // TakeBurden();
+ // TurnReset(loc);//转台复位
+
+ // DeviceProcessLogShow($"订单【{order.SuborderId}】,执行到转台{loc}位置取料");
+ // }
+ // //等待取料完成
+ // while (!morkF.TakeMaterialComplete)
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // morkF.MinorOrderMaterialCom = false;
+ // morkF.MinorHasTakeMaterial = true;
+ // WriteData("M14.5", false);//机器人取料完成复位
//}
- //DeviceProcessLogShow($"剩余配料数量{morkF.TakeMaterialQueue.Count}");
- ////等待取料完成
- //while (!morkF.TakeMaterialComplete)
+ //morkF.TurnTableLock = false;//转台互锁解除
+ #endregion
+ }
+ ///
+ /// 主流程出餐
+ ///
+ private void MainProcessOutDishTask()
+ {
+ //while (morkF.RoobotIdle || morkF.CleanModule || !morkF.ProvidePlateComplete)//等待条件满足
//{
// Task.Delay(5).Wait();
//}
- //morkF.MainOrderMaterialCom = false;
- //if (morkF.MainProcessStatus)
+ #region 单口锅逻辑
+ while (morkF.RoobotIdle || morkF.CleanModule || !morkF.ProvidePlateComplete)//等待条件满足
+ {
+ Task.Delay(5).Wait();
+ }
+ if (morkF.TakePlateQueue.Count == 0)
+ {
+ WriteData("M0.7", false);//无订单关闭抽风机
+ }
+ MainProcessRobotOutMeal();
+ WriteData("M1.2", false);//供盘复位
+ DeviceProcessLogShow($"订单【{morkF.CurrentOrderId}】执行取锅到清洗台控制");
+ #endregion
+ #region 两口锅逻辑
+ //while (morkF.RoobotIdle || (morkF.CleanModule && morkF.SecondCleanModule) || !morkF.ProvidePlateComplete)//等待条件满足
//{
- // morkF.MainOrderMaterialCom = false;
- // WriteData("M14.1", false);//机器人取料完成复位
+ // Task.Delay(5).Wait();
//}
- //if (morkF.MinorProessStatus)
+ //if (morkF.TakePlateQueue.Count == 0)
//{
- // morkF.MinorOrderMaterialCom = false;
- // WriteData("M14.5", false);//机器人取料完成复位
+ // WriteData("M0.7", false);//无订单关闭抽风机
//}
- //morkF.TurnTableLock = false;//转台互锁解除
+ //MainProcessRobotOutMeal();
+ //WriteData("M1.2", false);//供盘复位
+ //DeviceProcessLogShow($"订单【{morkF.MainCurrentOrderId}】执行取锅到清洗台控制");
#endregion
- int loc = 0;
- //while (morkF.RoobotIdle || (!morkF.PotInPlace && !morkF.SecondPotInPlace) || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅到位
+
+ }
+ ///
+ /// 复流程流程出餐
+ ///
+ private void MinorProcessOutDishTask()
+ {
+ //while (morkF.RoobotIdle || morkF.CleanModule || !morkF.ProvidePlateComplete)//等待条件满足
//{
// Task.Delay(5).Wait();
//}
- if (morkF.MainProcessStatus)
+ while (morkF.RoobotIdle || (morkF.CleanModule && morkF.SecondCleanModule) || !morkF.ProvidePlateComplete)//等待条件满足
{
- if (morkF.MainProcessPotLoc == 1)
- {
- while (morkF.RoobotIdle || !morkF.PotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅1到位
- {
- Task.Delay(5).Wait();
- }
- }
- else
- {
- while (morkF.RoobotIdle || !morkF.SecondPotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅2到位
- {
- Task.Delay(5).Wait();
- }
- }
- if (morkF.TakeMaterialQueue.TryDequeue(out OrderLocInfo order))
- {
- loc = order.MaterialLoc[0];
- TakeBurden();
- TurnReset(loc);//转台复位
-
- DeviceProcessLogShow($"订单【{order.SuborderId}】,执行到转台{loc}位置取料");
- }
- //等待取料完成
- while (!morkF.TakeMaterialComplete)
- {
- Task.Delay(5).Wait();
- }
- morkF.MainOrderMaterialCom = false;
- morkF.MainHasTakeMaterial = true;
- WriteData("M14.1", false);//机器人取料完成复位
+ Task.Delay(5).Wait();
}
- if (morkF.MinorProessStatus)
+ if (morkF.TakePlateQueue.Count == 0)
{
- if (morkF.MinorProcessPotLoc == 1)
- {
- while (morkF.RoobotIdle || !morkF.PotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅1到位
- {
- Task.Delay(5).Wait();
- }
- }
- else
- {
- while (morkF.RoobotIdle || !morkF.SecondPotInPlace || !morkF.MaterialArriveComplete)//等待机器人空闲以及锅2到位
- {
- Task.Delay(5).Wait();
- }
- }
- if (morkF.TakeMaterialQueue.TryDequeue(out OrderLocInfo order))
- {
- loc = order.MaterialLoc[0];
- TakeBurden();
- TurnReset(loc);//转台复位
-
- DeviceProcessLogShow($"订单【{order.SuborderId}】,执行到转台{loc}位置取料");
- }
- //等待取料完成
- while (!morkF.TakeMaterialComplete)
- {
- Task.Delay(5).Wait();
- }
- morkF.MinorOrderMaterialCom = false;
- morkF.MinorHasTakeMaterial = true;
- WriteData("M14.5", false);//机器人取料完成复位
+ WriteData("M0.7", false);//无订单关闭抽风机
}
- morkF.TurnTableLock = false;//转台互锁解除
-
+ MinorProcessRobotOutMeal();
+ WriteData("M1.2", false);//供盘复位
+ DeviceProcessLogShow($"订单【{morkF.MinorCurrentOrderId}】执行取锅到清洗台控制");
}
///
- /// 出餐
+ /// 主流程洗锅放锅
///
- private void OutDishTask()
+ private void MainProcessCleanPotTask()
{
- //while (morkF.RoobotIdle || morkF.CleanModule || !morkF.ProvidePlateComplete)//等待条件满足
- //{
- // Task.Delay(5).Wait();
- //}
- while (morkF.RoobotIdle || (!morkF.CleanModule && !morkF.SecondCleanModule) || !morkF.ProvidePlateComplete)//等待条件满足
+ #region 单口锅逻辑
+ while (!morkF.PlaceRinseTableComplete || morkF.CleanModule)
{
Task.Delay(5).Wait();
}
- if (morkF.TakePlateQueue.Count == 0)
- {
- WriteData("M0.7", false);//无订单关闭抽风机
- }
- RobotOutMeal();
- WriteData("M1.2", false);//供盘复位
- if (morkF.MainProcessStatus)
- DeviceProcessLogShow($"订单【{morkF.MainCurrentOrderId}】执行取锅到清洗台控制");
- if (morkF.MinorProessStatus)
- DeviceProcessLogShow($"订单【{morkF.MinorCurrentOrderId}】执行取锅到清洗台控制");
+ WriteData("M14.2", false);//机器人出餐完成复位
+ CleanModuleControl("Start", 1);
+ DeviceProcessLogShow($"订单【{morkF.CurrentOrderId}】执行清洗操作");
+ #endregion
+ #region 两口锅逻辑
+ //while ((!morkF.PlaceRinseTableComplete || morkF.CleanModule) && (!morkF.PlaceRinseSecondTableComplete || morkF.SecondCleanModule))
+ //{
+ // Task.Delay(5).Wait();
+ //}
+ //WriteData("M14.2", false);//机器人出餐完成复位
+ //if (morkF.PlaceRinseTableComplete && !morkF.CleanModule)
+ //{
+ // CleanModuleControl("Start", 1);
+ //}
+ //if (morkF.PlaceRinseSecondTableComplete && !morkF.SecondCleanModule)
+ //{
+ // CleanModuleControl("Start", 2);
+ //}
+ //DeviceProcessLogShow($"订单【{morkF.MainCurrentOrderId}】执行清洗操作");
+ //morkF.MainProcessFlag = false;
+ //minorReset.Set();
+ #endregion
+ //OrderChange(morkF.CurrentOrderId, ORDER_STATUS.COMPLETED_COOK);
}
///
- /// 洗锅放锅
+ /// 辅流程洗锅放锅
///
- private void CleanPotTask()
+ private void MinorProcessCleanPotTask()
{
while ((!morkF.PlaceRinseTableComplete || morkF.CleanModule) && (!morkF.PlaceRinseSecondTableComplete || morkF.SecondCleanModule))
{
Task.Delay(5).Wait();
}
- if (morkF.MainProcessStatus)
+
+ WriteData("M14.6", false);//机器人出餐完成复位
+ if (morkF.PlaceRinseTableComplete && !morkF.CleanModule)
{
- WriteData("M14.2", false);//机器人出餐完成复位
- if (morkF.PlaceRinseTableComplete && morkF.CleanModule)
- {
- CleanModuleControl("Start", 1);
- }
- if (morkF.PlaceRinseSecondTableComplete && morkF.SecondCleanModule)
- {
- CleanModuleControl("Start", 2);
- }
- DeviceProcessLogShow($"订单【{morkF.MainCurrentOrderId}】执行清洗操作");
- morkF.MainProcessFlag = false;
- minorReset.Set();
+ CleanModuleControl("Start", 1);
}
- if (morkF.MinorProessStatus)
+ if (morkF.PlaceRinseSecondTableComplete && !morkF.SecondCleanModule)
{
- WriteData("M14.6", false);//机器人出餐完成复位
- if (morkF.PlaceRinseTableComplete && morkF.CleanModule)
- {
- CleanModuleControl("Start", 1);
- }
- if (morkF.PlaceRinseSecondTableComplete && morkF.SecondCleanModule)
- {
- CleanModuleControl("Start", 2);
- }
- DeviceProcessLogShow($"订单【{morkF.MinorCurrentOrderId}】执行清洗操作");
- morkF.MinorProcessFlag = false;
- mainReset.Set();
+ CleanModuleControl("Start", 2);
}
- //OrderChange(morkF.CurrentOrderId, ORDER_STATUS.COMPLETED_COOK);
-
+ DeviceProcessLogShow($"订单【{morkF.MinorCurrentOrderId}】执行清洗操作");
+ morkF.MinorProcessFlag = false;
+ mainReset.Set();
+ //OrderChange(morkF.CurrentOrderId, ORDER_STATUS.COMPLETED_COOK);
}
///
/// 任务复位重启
@@ -1439,11 +1548,37 @@ namespace BPASmartClient.MorkF
// }), "ResetProgram");
//}
///
- /// 翻转机下降及状态检测
+ /// 主流程翻转机下降及状态检测
///
- public void TurnDownStatusDetect()
+ public void MainProcessTurnDownStatusDetect()
{
- int potLoc = TurnMachineOrientControl("Down");
+ int potLoc = MainProcessTurnMachineOrientControl("Down");
+
+ if (potLoc == 1)
+ {
+ while (!morkF.TurnMachineDownComplete)//等待翻转机下降完成
+ {
+ Task.Delay(5).Wait();
+ }
+ WriteData("M8.3", false);//下降完成复位
+ }
+ if (potLoc == 2)
+ {
+ while (!morkF.SecondTurnMachineDownComplete)//等待翻转机下降完成
+ {
+ Task.Delay(5).Wait();
+ }
+ WriteData("M8.7", false);//下降完成复位
+ }
+ DeviceProcessLogShow($"翻转机下降完成");
+
+ }
+ ///
+ /// 辅流程翻转机下降及状态检测
+ ///
+ public void MinorProcessTurnDownStatusDetect()
+ {
+ int potLoc = MinorProcessTurnMachineOrientControl("Down");
if (potLoc == 1)
{
@@ -1472,160 +1607,173 @@ namespace BPASmartClient.MorkF
//}
}
-
///
- /// 翻转机上升及状态检测
+ /// 主流程翻转机上升及状态检测
///
- public void TurnUpStatusDetect()
+ public void MainProcessTurnUpStatusDetect()
+ {
+ //while (morkF.RoobotIdle)//机器人忙碌
+ //{
+ // Task.Delay(5).Wait();
+ //}
+ MainProcessTurnMachineOrientControl("Top");//翻转机上升
+ #region 单口锅逻辑
+ while (!morkF.TurnMachineUpComplete)//等待翻转机上升完成以及取料完成
+ {
+ Task.Delay(5).Wait();
+ }
+ WriteData("M8.1", false);//上升完成复位
+ WriteData("M14.3", true);//倒料
+ while (!morkF.FallMaterialComplete)//等待倒料完成
+ {
+ Task.Delay(5).Wait();
+ }
+ WriteData("M14.3", false);//倒料复位
+ DeviceProcessLogShow($"订单【{morkF.CurrentOrderId}】,配料倒料完成");
+ #endregion
+ #region 两口锅逻辑
+ //if (morkF.MainProcessPotLoc == 1)
+ //{
+ // while (!morkF.TurnMachineUpComplete)//等待翻转机上升完成以及取料完成
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // WriteData("M8.1", false);//上升完成复位
+ // if (!morkF.MainOrderMaterialCom)
+ // {
+ // WriteData("M14.3", true);//倒料
+ // while (!morkF.FallMaterialComplete)//等待倒料完成
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // morkF.MaterialCount++;
+ // WriteData("M14.3", false);//倒料复位
+ // if (morkF.MaterialCount == 3)
+ // {
+ // //允许执行下一个订单流程
+ // morkF.MaterialCount = 0;
+ // morkF.MinorProcessFlag = true;
+
+ // }
+ // morkF.MainOrderMaterialCom = true;
+ // morkF.MainHasTakeMaterial = false;
+ // DeviceProcessLogShow($"订单【{morkF.MainCurrentOrderId}】,配料倒料完成");
+ // }
+ // else //辅程准备阻塞
+ // {
+ // morkF.MainProcessWait = true;
+ // }
+ //}
+ //if (morkF.MainProcessPotLoc == 2)
+ //{
+ // while (!morkF.SecondTurnMachineUpComplete)//等待翻转机上升完成以及取料完成
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // WriteData("M8.5", false);//上升完成复位
+ // if (!morkF.MainOrderMaterialCom)
+ // {
+ // WriteData("M14.7", true);//倒料
+ // while (!morkF.SecondFallMaterialComplete)//等待倒料完成
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // morkF.MaterialCount++;
+ // WriteData("M14.7", false);//倒料复位
+ // if (morkF.MaterialCount == 3)
+ // {
+ // //允许执行下一个订单流程
+ // morkF.MaterialCount = 0;
+ // morkF.MinorProcessFlag = true;
+
+ // }
+ // morkF.MainOrderMaterialCom = true;
+ // morkF.MainHasTakeMaterial = false;
+ // DeviceProcessLogShow($"订单【{morkF.MinorCurrentOrderId}】,配料倒料完成");
+ // }
+ // else //辅流程准备阻塞
+ // {
+ // morkF.MainProcessWait = true;
+ // }
+ //}
+ #endregion
+ DeviceProcessLogShow("翻转机上升完成");
+ }
+ ///
+ /// 辅流程翻转机上升及状态检测
+ ///
+ public void MinorProcessTurnUpStatusDetect()
{
while (morkF.RoobotIdle)//机器人忙碌
{
Task.Delay(5).Wait();
}
- TurnMachineOrientControl("Top");//翻转机上升
- if (morkF.MainProcessStatus)
+ MinorProcessTurnMachineOrientControl("Top");//翻转机上升
+
+ if (morkF.MinorProcessPotLoc == 1)
{
- if (morkF.MainProcessPotLoc == 1)
+ while (!morkF.TurnMachineUpComplete)//等待翻转机上升完成以及取料完成
{
- while (!morkF.TurnMachineUpComplete)//等待翻转机上升完成以及取料完成
- {
- Task.Delay(5).Wait();
- }
- WriteData("M8.1", false);//上升完成复位
- if (!morkF.MainOrderMaterialCom)
- {
- WriteData("M14.3", true);//倒料
- while (!morkF.FallMaterialComplete)//等待倒料完成
- {
- Task.Delay(5).Wait();
- }
- morkF.MaterialCount++;
- WriteData("M14.3", false);//倒料复位
- if (morkF.MaterialCount == 3)
- {
- //允许执行下一个订单流程
- morkF.MaterialCount = 0;
- morkF.MinorProcessFlag = true;
-
- }
- morkF.MainOrderMaterialCom = true;
- morkF.MainHasTakeMaterial = false;
- DeviceProcessLogShow($"订单【{morkF.MainCurrentOrderId}】,配料倒料完成");
- }
- else //辅程准备阻塞
- {
- morkF.MainProcessWait = true;
- }
+ Task.Delay(5).Wait();
}
- if (morkF.MainProcessPotLoc == 2)
+ WriteData("M8.1", false);//上升完成复位
+ if (!morkF.MinorOrderMaterialCom)
{
- while (!morkF.SecondTurnMachineUpComplete)//等待翻转机上升完成以及取料完成
+ WriteData("M14.3", true);//倒料
+ while (!morkF.FallMaterialComplete)//等待倒料完成
{
Task.Delay(5).Wait();
}
- WriteData("M8.5", false);//上升完成复位
- if (!morkF.MainOrderMaterialCom)
+ morkF.MaterialCount++;
+ WriteData("M14.3", false);//倒料复位
+ if (morkF.MaterialCount == 3)
{
- WriteData("M14.7", true);//倒料
- while (!morkF.SecondFallMaterialComplete)//等待倒料完成
- {
- Task.Delay(5).Wait();
- }
- morkF.MaterialCount++;
- WriteData("M14.7", false);//倒料复位
- if (morkF.MaterialCount == 3)
- {
- //允许执行下一个订单流程
- morkF.MaterialCount = 0;
- morkF.MinorProcessFlag = true;
+ //允许执行下一个订单流程
+ morkF.MaterialCount = 0;
+ morkF.MainProcessFlag = true;
- }
- morkF.MainOrderMaterialCom = true;
- morkF.MainHasTakeMaterial = false;
- DeviceProcessLogShow($"订单【{morkF.MinorCurrentOrderId}】,配料倒料完成");
- }
- else //辅流程准备阻塞
- {
- morkF.MainProcessWait = true;
}
+ morkF.MinorOrderMaterialCom = true;
+ morkF.MinorHasTakeMaterial = false;
+ DeviceProcessLogShow($"订单【{morkF.MainCurrentOrderId}】,配料倒料完成");
+ }
+ else //主程准备阻塞
+ {
+ morkF.MinorProcessWait = true;
}
}
- if (morkF.MinorProessStatus)
+ if (morkF.MinorProcessPotLoc == 2)
{
- if (morkF.MinorProcessPotLoc == 1)
+ while (!morkF.SecondTurnMachineUpComplete)//等待翻转机上升完成以及取料完成
{
- while (!morkF.TurnMachineUpComplete)//等待翻转机上升完成以及取料完成
- {
- Task.Delay(5).Wait();
- }
- WriteData("M8.1", false);//上升完成复位
- if (!morkF.MinorOrderMaterialCom)
- {
- WriteData("M14.3", true);//倒料
- while (!morkF.FallMaterialComplete)//等待倒料完成
- {
- Task.Delay(5).Wait();
- }
- morkF.MaterialCount++;
- WriteData("M14.3", false);//倒料复位
- if (morkF.MaterialCount == 3)
- {
- //允许执行下一个订单流程
- morkF.MaterialCount = 0;
- morkF.MainProcessFlag = true;
-
- }
- morkF.MinorOrderMaterialCom = true;
- morkF.MinorHasTakeMaterial = false;
- DeviceProcessLogShow($"订单【{morkF.MainCurrentOrderId}】,配料倒料完成");
- }
- else //主程准备阻塞
- {
- morkF.MinorProcessWait = true;
- }
+ Task.Delay(5).Wait();
}
- if (morkF.MinorProcessPotLoc == 2)
+ WriteData("M8.5", false);//上升完成复位
+ if (!morkF.MinorOrderMaterialCom)
{
- while (!morkF.SecondTurnMachineUpComplete)//等待翻转机上升完成以及取料完成
+ WriteData("M14.7", true);//倒料
+ while (!morkF.SecondFallMaterialComplete)//等待倒料完成
{
Task.Delay(5).Wait();
}
- WriteData("M8.5", false);//上升完成复位
- if (!morkF.MinorOrderMaterialCom)
+ morkF.MaterialCount++;
+ WriteData("M14.7", false);//倒料复位
+ if (morkF.MaterialCount == 3)
{
- WriteData("M14.7", true);//倒料
- while (!morkF.SecondFallMaterialComplete)//等待倒料完成
- {
- Task.Delay(5).Wait();
- }
- morkF.MaterialCount++;
- WriteData("M14.7", false);//倒料复位
- if (morkF.MaterialCount == 3)
- {
- //允许执行下一个订单流程
- morkF.MaterialCount = 0;
- morkF.MainProcessFlag = true;
+ //允许执行下一个订单流程
+ morkF.MaterialCount = 0;
+ morkF.MainProcessFlag = true;
- }
- morkF.MinorOrderMaterialCom = true;
- morkF.MinorHasTakeMaterial = false;
- DeviceProcessLogShow($"订单【{morkF.MinorCurrentOrderId}】,配料倒料完成");
- }
- else //主流程准备阻塞
- {
- morkF.MinorProcessWait = true;
}
+ morkF.MinorOrderMaterialCom = true;
+ morkF.MinorHasTakeMaterial = false;
+ DeviceProcessLogShow($"订单【{morkF.MinorCurrentOrderId}】,配料倒料完成");
+ }
+ else //主流程准备阻塞
+ {
+ morkF.MinorProcessWait = true;
}
}
- //if (morkF.MainProcessStatus)//代表主流程执行的操作
- //{
-
- //}
- //else if (morkF.MinorProessStatus)//代表辅流程执行的操作
- //{
-
- //}
-
DeviceProcessLogShow("翻转机上升完成");
}
@@ -1782,57 +1930,62 @@ namespace BPASmartClient.MorkF
}
}
///
- /// 灶台档位调节
+ /// 主流程灶台档位调节
///
- public void KitchenAdjustGears(int number)
+ public void MainProcessKitchenAdjustGears(int number)
{
- //while (!morkF.PotInPlace||!morkF.SecondPotInPlace)
+ #region 单口锅逻辑
+ while (!morkF.PotInPlace)
+ {
+ Task.Delay(5).Wait();
+ }
+ FirstPotGears(number);
+ DeviceProcessLogShow($"灶台【{morkF.CurrentOrderId}】档位调节至【{number}】挡");
+ #endregion
+
+ #region 两口锅逻辑
+ //if (morkF.MainProcessPotLoc == 1)
//{
- // Task.Delay(5).Wait();
+ // while (!morkF.PotInPlace)
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // FirstPotGears(number);
//}
- if (morkF.MainProcessStatus)
+ //if (morkF.MainProcessPotLoc == 2)
+ //{
+ // while (!morkF.SecondPotInPlace)
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // SecondPotGears(number);
+ //}
+ //DeviceProcessLogShow($"灶台【{morkF.MainProcessPotLoc}】档位调节至【{number}】挡");
+ #endregion
+
+ }
+ ///
+ /// 辅流程灶台档位调节
+ ///
+ public void MinorProcessKitchenAdjustGears(int number)
+ {
+ if (morkF.MinorProcessPotLoc == 1)
{
- if (morkF.MainProcessPotLoc == 1)
- {
- while (!morkF.PotInPlace)
- {
- Task.Delay(5).Wait();
- }
- FirstPotGears(number);
- }
- if (morkF.MainProcessPotLoc == 2)
+ while (!morkF.PotInPlace)
{
- while (!morkF.SecondPotInPlace)
- {
- Task.Delay(5).Wait();
- }
- SecondPotGears(number);
+ Task.Delay(5).Wait();
}
-
+ FirstPotGears(number);
}
- if (morkF.MinorProessStatus)
+ if (morkF.MinorProcessPotLoc == 2)
{
- if (morkF.MinorProcessPotLoc == 1)
- {
- while (!morkF.PotInPlace)
- {
- Task.Delay(5).Wait();
- }
- FirstPotGears(number);
- }
- if (morkF.MinorProcessPotLoc == 2)
+ while (!morkF.SecondPotInPlace)
{
- while (!morkF.SecondPotInPlace)
- {
- Task.Delay(5).Wait();
- }
- SecondPotGears(number);
+ Task.Delay(5).Wait();
}
+ SecondPotGears(number);
}
- if (morkF.MainProcessStatus)
- DeviceProcessLogShow($"订单【{morkF.MainCurrentOrderId}】执行取锅到灶台控制");
- if (morkF.MinorProessStatus)
- DeviceProcessLogShow($"订单【{morkF.MinorCurrentOrderId}】执行取锅到灶台控制");
+ DeviceProcessLogShow($"灶台【{morkF.MinorProcessPotLoc}】档位调节至【{number}】挡");
}
///
/// PLC转台控制
@@ -1883,33 +2036,41 @@ namespace BPASmartClient.MorkF
WriteData("M14.4", true);
}
///
- /// 机器人出餐并将锅放置清洗台位置
+ /// 主流程机器人出餐并将锅放置清洗台位置
///
- public void RobotOutMeal()
+ public void MainProcessRobotOutMeal()
{
- if (morkF.MainProcessStatus)
+ #region 单口锅逻辑
+ WriteData("M14.2", true);//1号锅出餐
+ #endregion
+ #region 两口锅逻辑
+ //if (morkF.MainProcessPotLoc == 1)
+ //{
+ // WriteData("M14.2", true);//1号锅出餐
+ //}
+ //else if (morkF.MainProcessPotLoc == 2)
+ //{
+ // WriteData("M14.6", true);//2号锅出餐
+ //}
+ #endregion
+ }
+
+ ///
+ /// 复流程机器人出餐并将锅放置清洗台位置
+ ///
+ public void MinorProcessRobotOutMeal()
+ {
+
+ if (morkF.MinorProcessPotLoc == 1)
{
- if (morkF.MainProcessPotLoc == 1)
- {
- WriteData("M14.2", true);//1号锅出餐
- }
- else if (morkF.MainProcessPotLoc == 2)
- {
- WriteData("M14.6", true);//2号锅出餐
- }
+ WriteData("M14.2", true);//1号锅出餐
}
- if (morkF.MinorProessStatus)
+ else if (morkF.MinorProcessPotLoc == 2)
{
- if (morkF.MinorProcessPotLoc == 1)
- {
- WriteData("M14.2", true);//1号锅出餐
- }
- else if (morkF.MinorProcessPotLoc == 2)
- {
- WriteData("M14.6", true);//2号锅出餐
- }
+ WriteData("M14.6", true);//2号锅出餐
}
+
}
public void OpenDraft()
{
@@ -1920,68 +2081,83 @@ namespace BPASmartClient.MorkF
///
public void AddOil()
{
- if (morkF.MainProcessStatus)
+ #region 单口锅逻辑
+ while (!morkF.PotInPlace)
{
- if (morkF.MainProcessPotLoc == 1)
- {
- while (!morkF.PotInPlace)
- {
- Task.Delay(5).Wait();
- }
- WriteData("M2.7", true);//加油
- OpenDraft();
- DeviceProcessLogShow("开始注油");
- while (!morkF.FallOilComplete)
- {
- Task.Delay(5).Wait();
- }
- }
- if (morkF.MainProcessPotLoc == 2)
- {
- while (!morkF.SecondPotInPlace)
- {
- Task.Delay(5).Wait();
- }
- WriteData("M3.1", true);//加油
- OpenDraft();
- DeviceProcessLogShow("开始注油");
- while (!morkF.SecondOilComplete)
- {
- Task.Delay(5).Wait();
- }
- }
+ Task.Delay(5).Wait();
}
- if (morkF.MinorProessStatus)
+ WriteData("M2.7", true);//加油
+ OpenDraft();
+ DeviceProcessLogShow("开始注油");
+ while (!morkF.FallOilComplete)
{
- if (morkF.MinorProcessPotLoc == 1)
- {
- while (!morkF.PotInPlace)
- {
- Task.Delay(5).Wait();
- }
- WriteData("M2.7", true);//加油
- OpenDraft();
- DeviceProcessLogShow("开始注油");
- while (!morkF.FallOilComplete)
- {
- Task.Delay(5).Wait();
- }
- }
- if (morkF.MinorProcessPotLoc == 2)
- {
- while (!morkF.SecondPotInPlace)
- {
- Task.Delay(5).Wait();
- }
- WriteData("M3.1", true);//加油
- OpenDraft();
- DeviceProcessLogShow("开始注油");
- while (!morkF.SecondOilComplete)
- {
- Task.Delay(5).Wait();
- }
- }
+ Task.Delay(5).Wait();
}
+ #endregion
+ #region 两口锅逻辑
+ //if (morkF.MainProcessStatus)
+ //{
+ // if (morkF.MainProcessPotLoc == 1)
+ // {
+ // while (!morkF.PotInPlace)
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // WriteData("M2.7", true);//加油
+ // OpenDraft();
+ // DeviceProcessLogShow("开始注油");
+ // while (!morkF.FallOilComplete)
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // }
+ // if (morkF.MainProcessPotLoc == 2)
+ // {
+ // while (!morkF.SecondPotInPlace)
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // WriteData("M3.1", true);//加油
+ // OpenDraft();
+ // DeviceProcessLogShow("开始注油");
+ // while (!morkF.SecondOilComplete)
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // }
+ //}
+ //if (morkF.MinorProessStatus)
+ //{
+ // if (morkF.MinorProcessPotLoc == 1)
+ // {
+ // while (!morkF.PotInPlace)
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // WriteData("M2.7", true);//加油
+ // OpenDraft();
+ // DeviceProcessLogShow("开始注油");
+ // while (!morkF.FallOilComplete)
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // }
+ // if (morkF.MinorProcessPotLoc == 2)
+ // {
+ // while (!morkF.SecondPotInPlace)
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // WriteData("M3.1", true);//加油
+ // OpenDraft();
+ // DeviceProcessLogShow("开始注油");
+ // while (!morkF.SecondOilComplete)
+ // {
+ // Task.Delay(5).Wait();
+ // }
+ // }
+ //}
+ #endregion
//while (!morkF.FallOilComplete || !morkF.SecondOilComplete)
//{
// Task.Delay(5).Wait();
@@ -2007,47 +2183,54 @@ namespace BPASmartClient.MorkF
}
///
- /// 翻转机方向控制
+ /// 主流程翻转机方向控制
///
///
- public int TurnMachineOrientControl(string orientation)
+ public int MainProcessTurnMachineOrientControl(string orientation)
{
- int potLoc = 0; ;
- //switch (orientation)
+ int potLoc = 0;
+ #region 单口锅逻辑
+ FirstPotTurnMachine(orientation);
+ potLoc = 1;
+ #endregion
+ #region 两口锅逻辑
+ //if (morkF.MainProcessPotLoc == 1)
//{
- // case "Top": if (morkF.MainProcessStatus) WriteData("M8.0", true); if (morkF.MinorProessStatus) WriteData("M8.4", true); break;
- // case "Down": if (morkF.MainProcessStatus) WriteData("M8.2", true); if (morkF.MinorProessStatus) WriteData("M8.6", true); break;
+ // FirstPotTurnMachine(orientation);
+ // potLoc = 1;
//}
- if (morkF.MainProcessStatus)
+ //if (morkF.MainProcessPotLoc == 2)
+ //{
+ // SecondPotTurnMachine(orientation);
+ // potLoc = 2;
+ //}
+ #endregion
+ DeviceProcessLogShow($"翻转机执行{orientation}操作");
+
+ return potLoc;
+ }
+ ///
+ /// 辅流程翻转机方向控制
+ ///
+ ///
+ public int MinorProcessTurnMachineOrientControl(string orientation)
+ {
+ int potLoc = 0;
+
+ if (morkF.MinorProcessPotLoc == 1)
{
- if (morkF.MainProcessPotLoc == 1)
- {
- FirstPotTurnMachine(orientation);
- potLoc = 1;
- }
- if (morkF.MainProcessPotLoc == 2)
- {
- SecondPotTurnMachine(orientation);
- potLoc = 2;
- }
+ FirstPotTurnMachine(orientation);
+ potLoc = 1;
}
- if (morkF.MinorProessStatus)
+ if (morkF.MinorProcessPotLoc == 2)
{
- if (morkF.MinorProcessPotLoc == 1)
- {
- FirstPotTurnMachine(orientation);
- potLoc = 1;
- }
- if (morkF.MinorProcessPotLoc == 2)
- {
- SecondPotTurnMachine(orientation);
- potLoc = 2;
- }
+ SecondPotTurnMachine(orientation);
+ potLoc = 2;
}
+
DeviceProcessLogShow($"翻转机执行{orientation}操作");
return potLoc;
}
-
public void FirstPotTurnMachine(int gear)
{
while (!morkF.PotInPlace)
@@ -2078,47 +2261,56 @@ namespace BPASmartClient.MorkF
}
///
- /// 翻转机档位控制
+ /// 主流程翻转机档位控制
///
- public void TurnMachineGearsControl(int gear)
+ public void MainProcessTurnMachineGearsControl(int gear)
{
- //while (!morkF.PotInPlace)
+ #region 单口锅逻辑
+ FirstPotTurnMachine(gear);
+ DeviceProcessLogShow($"炒锅【{morkF.CurrentOrderId}】翻转机档位调至{gear}挡");
+ #endregion
+ #region 两口锅逻辑
+ //if (morkF.MainProcessPotLoc == 1)
//{
- // Task.Delay(5).Wait();
+ // FirstPotTurnMachine(gear);
//}
- if (morkF.MainProcessStatus)
+ //if (morkF.MainProcessPotLoc == 2)
+ //{
+ // SecondPotTurnMachine(gear);
+ //}
+ //DeviceProcessLogShow($"炒锅【{morkF.MainProcessPotLoc}】翻转机档位调至{gear}挡");
+ #endregion
+ }
+ ///
+ /// 辅流程翻转机档位控制
+ ///
+ public void MinorProcessTurnMachineGearsControl(int gear)
+ {
+ if (morkF.MinorProcessPotLoc == 1)
{
- if (morkF.MainProcessPotLoc == 1)
- {
- FirstPotTurnMachine(gear);
- }
- if (morkF.MainProcessPotLoc == 2)
- {
- SecondPotTurnMachine(gear);
- }
+ FirstPotTurnMachine(gear);
}
- if (morkF.MinorProessStatus)
+ if (morkF.MinorProcessPotLoc == 2)
{
- if (morkF.MinorProcessPotLoc == 1)
- {
- FirstPotTurnMachine(gear);
- }
- if (morkF.MinorProcessPotLoc == 2)
- {
- SecondPotTurnMachine(gear);
- }
+ SecondPotTurnMachine(gear);
}
- DeviceProcessLogShow($"翻转机档位调至{gear}挡");
+
+ DeviceProcessLogShow($"炒锅【{morkF.MinorProcessPotLoc}】翻转机档位调至{gear}挡");
}
///
/// 取A,B,C料
///
public void TakeBurden()
{
- if (morkF.MainProcessStatus && morkF.PotInPlace)
- WriteData("M14.1", true);//机器人倒料至1号锅
- if (morkF.MinorProessStatus && morkF.SecondPotInPlace)
- WriteData("M14.5", true);//机器人倒料至2号锅
+ #region 单口锅逻辑
+ WriteData("M14.1", true);//机器人取料至1号锅
+ #endregion
+ #region 两口锅逻辑
+ //if (morkF.PotInPlace)
+ // WriteData("M14.1", true);//机器人取料至1号锅
+ //if (morkF.SecondPotInPlace)
+ // WriteData("M14.5", true);//机器人取料至2号锅
+ #endregion
}
///
/// 清洗模组1启停控制
diff --git a/BPASmartClient.MorkF/GVL_MorkF.cs b/BPASmartClient.MorkF/GVL_MorkF.cs
index f9229946..3aa23c03 100644
--- a/BPASmartClient.MorkF/GVL_MorkF.cs
+++ b/BPASmartClient.MorkF/GVL_MorkF.cs
@@ -80,7 +80,7 @@ namespace BPASmartClient.MorkF
///
public bool MaterialArriveComplete { get; set; }
///
- /// 机器人空闲状态
+ /// 机器人空闲状态 1:忙碌 0:空闲
///
public bool RoobotIdle { get; set; }
///
@@ -291,6 +291,14 @@ namespace BPASmartClient.MorkF
/// 辅流程所执行的锅位置
///
public int MinorProcessPotLoc { get; set; }
+
+
+ #region 单口锅逻辑变量
+ ///
+ /// 订单唯一ID
+ ///
+ public string CurrentOrderId { get; set; }
+ #endregion
}
}
diff --git a/FryPot_DosingSystem/App.xaml.cs b/FryPot_DosingSystem/App.xaml.cs
index 123863ae..2ce646db 100644
--- a/FryPot_DosingSystem/App.xaml.cs
+++ b/FryPot_DosingSystem/App.xaml.cs
@@ -38,6 +38,7 @@ namespace FryPot_DosingSystem
if (res != null && res == true)
{
mv.Show();
+ MessageLog.GetInstance.ShowUserLog("用户登录");
DeviceOperate deviceOperate = DeviceOperate.GetInstance;//开启实时PLC数据读取
DosingLogicControl logigControl = DosingLogicControl.GetInstance;//开启逻辑控制任务程序
HubHelper.GetInstance.Connect("192.168.1.40", 8089);
@@ -105,7 +106,7 @@ namespace FryPot_DosingSystem
InfoLog.Add(new SubMenumodel()
{
SubMenuName = "操作日志",
- SubMenuPermission = new Permission[] { Permission.操作员, Permission.管理员, Permission.技术员 },
+ SubMenuPermission = new Permission[] { Permission.操作员, Permission.管理员, Permission.技术员,Permission.观察员 },
AssemblyName = "BPASmartClient.CustomResource",
ToggleWindowPath = "Pages.View.UserLogView"
});
@@ -113,7 +114,7 @@ namespace FryPot_DosingSystem
InfoLog.Add(new SubMenumodel()
{
SubMenuName = "运行日志",
- SubMenuPermission = new Permission[] { Permission.操作员, Permission.管理员, Permission.技术员 },
+ SubMenuPermission = new Permission[] { Permission.操作员, Permission.管理员, Permission.技术员, Permission.观察员 },
AssemblyName = "BPASmartClient.CustomResource",
ToggleWindowPath = "Pages.View.RunLogView"
});
@@ -121,14 +122,14 @@ namespace FryPot_DosingSystem
InfoLog.Add(new SubMenumodel()
{
SubMenuName = "报警记录",
- SubMenuPermission = new Permission[] { Permission.操作员, Permission.管理员, Permission.技术员 },
+ SubMenuPermission = new Permission[] { Permission.操作员, Permission.管理员, Permission.技术员, Permission.观察员 },
AssemblyName = "BPASmartClient.CustomResource",
ToggleWindowPath = "Pages.View.AlarmView"
});
InfoLog.Add(new SubMenumodel()
{
SubMenuName = "炒锅状态记录",
- SubMenuPermission = new Permission[] { Permission.操作员, Permission.管理员, Permission.技术员 },
+ SubMenuPermission = new Permission[] { Permission.操作员, Permission.管理员, Permission.技术员, Permission.观察员 },
AssemblyName = "FryPot_DosingSystem",
ToggleWindowPath = "View.SqliteDataView"
});
@@ -138,7 +139,7 @@ namespace FryPot_DosingSystem
MainMenuIcon = "",
MainMenuName = "消息日志",
Alias = "Message Log",
- MainMenuPermission = new Permission[] { Permission.管理员, Permission.操作员, Permission.技术员 },
+ MainMenuPermission = new Permission[] { Permission.管理员, Permission.操作员, Permission.技术员, Permission.观察员 },
subMenumodels = InfoLog,
});
#endregion
@@ -155,7 +156,7 @@ namespace FryPot_DosingSystem
DeviceMonitor.Add(new SubMenumodel()
{
SubMenuName = "PLC变量配置",
- SubMenuPermission = new Permission[] { Permission.管理员, Permission.操作员, Permission.技术员 },
+ SubMenuPermission = new Permission[] { Permission.管理员, Permission.技术员 },
AssemblyName = "BPASmartClient.CustomResource",
ToggleWindowPath = "Pages.View.VariableConfigView"
});
@@ -180,7 +181,7 @@ namespace FryPot_DosingSystem
DeviceMonitor.Add(new SubMenumodel()
{
SubMenuName = "AGV视图",
- SubMenuPermission = new Permission[] { Permission.管理员, Permission.操作员, Permission.技术员 },
+ SubMenuPermission = new Permission[] { Permission.管理员, Permission.操作员, Permission.技术员, Permission.观察员 },
AssemblyName = "FryPot_DosingSystem",
ToggleWindowPath = "View.AgvView"
});
@@ -200,7 +201,7 @@ namespace FryPot_DosingSystem
UserManager.Add(new SubMenumodel()
{
SubMenuName = "用户登录",
- SubMenuPermission = new Permission[] { Permission.管理员, Permission.操作员, Permission.技术员 },
+ SubMenuPermission = new Permission[] { Permission.管理员, Permission.技术员 },
AssemblyName = "BPASmartClient.CustomResource",
ToggleWindowPath = "Pages.View.SubPagLoginView"
});
@@ -208,7 +209,7 @@ namespace FryPot_DosingSystem
UserManager.Add(new SubMenumodel()
{
SubMenuName = "密码修改",
- SubMenuPermission = new Permission[] { Permission.管理员, Permission.技术员 },
+ SubMenuPermission = new Permission[] { Permission.管理员 },
AssemblyName = "BPASmartClient.CustomResource",
ToggleWindowPath = "Pages.View.PasswordChangeView"
});
@@ -231,7 +232,7 @@ namespace FryPot_DosingSystem
MainMenuIcon = "",
MainMenuName = "用户管理",
Alias = "User Management",
- MainMenuPermission = new Permission[] { Permission.管理员, Permission.操作员, Permission.技术员 },
+ MainMenuPermission = new Permission[] { Permission.管理员, Permission.技术员 },
subMenumodels = UserManager,
});
#endregion
diff --git a/FryPot_DosingSystem/Control/DosingLogicControl.cs b/FryPot_DosingSystem/Control/DosingLogicControl.cs
index f7defdac..32fbf274 100644
--- a/FryPot_DosingSystem/Control/DosingLogicControl.cs
+++ b/FryPot_DosingSystem/Control/DosingLogicControl.cs
@@ -1372,9 +1372,11 @@ namespace FryPot_DosingSystem.Control
globalVar.rollerLineOne.OutMaterialingSingle = data[3];
globalVar.rollerLineTwo.OutMaterialingSingle = data[4];
globalVar.rollerLineThree.OutMaterialingSingle = data[5];
- //globalVar.rollerLineOne.OutMaterialingTroubleSingle = data[6];
- //globalVar.rollerLineTwo.OutMaterialingTroubleSingle = data[7];
- //globalVar.rollerLineThree.OutMaterialingTroubleSingle = data[8];
+
+ AlarmHelper.Alarm.LineOneRollerRunning = data[3];
+ AlarmHelper.Alarm.LineTwoRollerRunning = data[4];
+ AlarmHelper.Alarm.LineThreeRollerRunning = data[5];
+
AlarmHelper.Alarm.LOneRollerTrouble = data[6];
AlarmHelper.Alarm.LTwoRollerTrouble = data[7];
AlarmHelper.Alarm.LThreeRollerTrouble = data[8];
@@ -1387,6 +1389,13 @@ namespace FryPot_DosingSystem.Control
globalVar.fryPotThree.InputMaterialRollerRunningSingle = data[2];
globalVar.fryPotFour.InputMaterialRollerRunningSingle = data[3];
globalVar.fryPotFive.InputMaterialRollerRunningSingle = data[4];
+
+ AlarmHelper.Alarm.FryPotOneRollerRunning= data[0];
+ AlarmHelper.Alarm.FryPotTwoRollerRunning = data[1];
+ AlarmHelper.Alarm.FryPotThreeRollerRunning = data[2];
+ AlarmHelper.Alarm.FryPotFourRollerRunning = data[3];
+ AlarmHelper.Alarm.FryPotFiveRollerRunning = data[4];
+
}));
GetAddressData("D2045", new Action((data) =>
{
@@ -1411,6 +1420,12 @@ namespace FryPot_DosingSystem.Control
globalVar.fryPotThree.EmptyBarrelRollerRunningSingle = data[2];
globalVar.fryPotFour.EmptyBarrelRollerRunningSingle = data[3];
globalVar.fryPotFive.EmptyBarrelRollerRunningSingle = data[4];
+
+ AlarmHelper.Alarm.FryPotOneEmptyRollerRunning = data[0];
+ AlarmHelper.Alarm.FryPotTwoEmptyRollerRunning = data[1];
+ AlarmHelper.Alarm.FryPotThreeEmptyRollerRunning = data[2];
+ AlarmHelper.Alarm.FryPotFourEmptyRollerRunning = data[3];
+ AlarmHelper.Alarm.FryPotFiveEmptyRollerRunning = data[4];
}));
GetAddressData("D2070", new Action((data) =>
{
@@ -1433,7 +1448,7 @@ namespace FryPot_DosingSystem.Control
}));
GetAddressData("D2075", new Action