Browse Source

add reservoir

chenkui 3 days ago
parent
commit
a6ca057bac

+ 0 - 1
Framework/Common/ToolLayout/MetalItemManager.cs

@@ -48,7 +48,6 @@ namespace MECF.Framework.Common.ToolLayout
             metalItem.PlatingPowerSupplyAID = metalItemElement.SelectSingleNode("PlatingPowerSupplyAID").InnerText;
             metalItem.PlatingPowerSupplyBID = metalItemElement.SelectSingleNode("PlatingPowerSupplyBID").InnerText;
             metalItem.LinmotID = metalItemElement.SelectSingleNode("LinmotID").InnerText;
-            metalItem.DepPump = bool.Parse(metalItemElement.SelectSingleNode("DepPump").InnerText);
             string key = $"{PREFIX}{metalItem.MetalID}";
             metalItem.ModuleName = key;
             metalItem.ModuleType = ModuleType.Metal.ToString();

+ 0 - 1
Framework/Common/ToolLayout/ReservoirItemManager.cs

@@ -119,7 +119,6 @@ namespace MECF.Framework.Common.ToolLayout
             reservoirItem.CMMType = reservoirElement.SelectSingleNode("CMMType").InnerText;
             reservoirItem.CMMSupplyID = reservoirElement.SelectSingleNode("CMMSupplyID").InnerText;
             reservoirItem.EvaporatorType = reservoirElement.SelectSingleNode("EvaporatorType").InnerText;
-            reservoirItem.PumpType = reservoirElement.SelectSingleNode("PumpType").InnerText;
             DATA.Subscribe($"{key}.CMMPowerSupplier", () => { return reservoirItem.CMMSupplyID; }, SubscriptionAttribute.FLAG.IgnoreSaveDB);
 
             if (reservoirItem.Installed && !InstalledModules.Contains(key))

+ 10 - 0
PunkHPX8_Core/RtState.cs

@@ -148,4 +148,14 @@ namespace PunkHPX8_Core
         CycleManualProcessing,
         Aborting
     }
+    public enum ReservoirState
+    {
+        Unknown,
+        Disable,
+        Error,
+        Init,
+        Initializing,
+        Initialized,
+        Idle,
+    }
 }

+ 1 - 1
PunkHPX8_RT/Config/Devices/Beckhoffcfg.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <BeckhoffCfg>
-	<Controller Name="MASTER" IPAddress="192.168.0.200.1.1" PortAddress="301">
+	<Controller Name="MASTER" IPAddress="192.168.0.200.1.1" PortAddress="851">
 
 		<!-- Need to have at least one input and one output before Axis stuff -->
 

+ 2 - 0
PunkHPX8_RT/Devices/Reservoir/HSReservoirDevice.cs

@@ -15,5 +15,7 @@ namespace PunkHPX8_RT.Devices.Reservoir
         public HSReservoirDevice(string moduleName) : base(moduleName)
         {
         }
+
+        
     }
 }

+ 140 - 1
PunkHPX8_RT/Devices/Reservoir/ReservoirDevice.cs

@@ -1,6 +1,9 @@
 using Aitex.Core.RT.Device;
 using Aitex.Core.RT.Log;
+using Aitex.Core.RT.OperationCenter;
+using Aitex.Core.Util;
 using MECF.Framework.Common.Persistent.Reservoirs;
+using PunkHPX8_RT.Modules;
 using System;
 using System.Collections.Generic;
 using System.Linq;
@@ -22,6 +25,10 @@ namespace PunkHPX8_RT.Devices.Reservoir
         /// Prewet 持久性数值对象
         /// </summary>
         private ReservoirsPersistentValue _persistentValue;
+        /// <summary>
+        /// 定时器
+        /// </summary>
+        private PeriodicJob _periodicJob;
         #endregion
 
         #region 属性
@@ -53,12 +60,17 @@ namespace PunkHPX8_RT.Devices.Reservoir
         public bool Initialize()
         {
             InitializeParameter();
+            InitializeRoutine();
+            SubscribeData();
+            InitializeOperation();
+            SubscribeValueAction();
+            _periodicJob = new PeriodicJob(200, OnTimer, $"{Module}.Timer", true, true);
             return true;
         }
         /// <summary>
         /// 初始化参数
         /// </summary>
-        public void InitializeParameter()
+        private void InitializeParameter()
         {
             _persistentValue = ReservoirsPersistentManager.Instance.GetReservoirsPersistentValue(Module.ToString());
             if (_persistentValue == null)
@@ -66,7 +78,134 @@ namespace PunkHPX8_RT.Devices.Reservoir
                 LOG.WriteLog(eEvent.ERR_RESERVOIR, Module.ToString(), "Persistent Value Object is not exist");
             }
         }
+        /// <summary>
+        /// 初始化Routine
+        /// </summary>
+        private void InitializeRoutine()
+        {
+
+        }
+        /// <summary>
+        /// 订阅数据
+        /// </summary>
+        private void SubscribeData()
+        {
+
+        }
+        /// <summary>
+        /// 初始化Operation
+        /// </summary>
+        private void InitializeOperation()
+        {
+            OP.Subscribe($"{Module}.DisabledAction", DisabledOperation);
+            OP.Subscribe($"{Module}.ManualAction", ManualOperation);
+            OP.Subscribe($"{Module}.AutoAction", AutoOperation);
+            OP.Subscribe($"{Module}.EngineeringModeAction", EngineeringModeOperation);
+            OP.Subscribe($"{Module}.ProductionModeAction", ProductionModeOperation);
+        }
+        /// <summary>
+        /// 订阅变量数值发生变化
+        /// </summary>
+        protected virtual void SubscribeValueAction()
+        {
+
+        }
+        /// <summary>
+        /// 定时器
+        /// </summary>
+        /// <returns></returns>
+        protected virtual bool OnTimer()
+        {
+            return true;
+        }
+
+        #region Mode switch
+        /// <summary>
+        /// DisabledAction
+        /// </summary>
+        /// <param name="cmd"></param>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool DisabledOperation(string cmd, object[] args)
+        {
+            string currentOperation = "Disabled";
+            string preOperation = _persistentValue.OperatingMode;
+            _persistentValue.OperatingMode = currentOperation;
+
+            LOG.WriteLog(eEvent.INFO_RESERVOIR, Module, $"Operating mode is switched from {preOperation} to {currentOperation}");
+            
+            ReservoirsPersistentManager.Instance.UpdatePersistentValue(Module);
+            return true;
+        }
+        /// <summary>
+        /// ManualAction
+        /// </summary>
+        /// <param name="cmd"></param>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool ManualOperation(string cmd, object[] args)
+        {
+            string currentOperation = "Manual";
+            string preOperation = _persistentValue.OperatingMode;
+            
+            _persistentValue.OperatingMode = currentOperation;
 
+            LOG.WriteLog(eEvent.INFO_RESERVOIR, Module, $"Operating mode is switched from {preOperation} to {currentOperation}");
+            
+            ReservoirsPersistentManager.Instance.UpdatePersistentValue(Module);
+            return true;
+        }
+        /// <summary>
+        /// AutoAction
+        /// </summary>
+        /// <param name="cmd"></param>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool AutoOperation(string cmd, object[] args)
+        {
+            string currentOperation = "Auto";
+            string preOperation = _persistentValue.OperatingMode;
+
+            _persistentValue.OperatingMode = currentOperation;
+
+            LOG.WriteLog(eEvent.INFO_RESERVOIR, Module, $"Operating mode is switched from {preOperation} to {currentOperation}");
+            
+            ReservoirsPersistentManager.Instance.UpdatePersistentValue(Module);
+            return true;
+        }
+        /// <summary>
+        /// EngineeringModeAction
+        /// </summary>
+        /// <param name="cmd"></param>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool EngineeringModeOperation(string cmd, object[] args)
+        {
+            string currentRecipeOperation = "Engineering";
+            if (_persistentValue != null)
+            {
+                _persistentValue.RecipeOperatingMode = currentRecipeOperation;
+            }
+            ReservoirsPersistentManager.Instance.UpdatePersistentValue(Module);
+            return true;
+        }
+        /// <summary>
+        /// ProductionAction
+        /// </summary>
+        /// <param name="cmd"></param>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool ProductionModeOperation(string cmd, object[] args)
+        {
+            string currentRecipeOperation = "Production";
+            if (_persistentValue != null)
+            {
+                _persistentValue.RecipeOperatingMode = currentRecipeOperation;
+            }
+            ReservoirsPersistentManager.Instance.UpdatePersistentValue(Module);
+            return true;
+        }
+        #endregion
 
         /// <summary>
         /// 监控

+ 209 - 0
PunkHPX8_RT/Modules/Reservoir/ReservoirEntity.cs

@@ -0,0 +1,209 @@
+using Aitex.Core.RT.Fsm;
+using Aitex.Core.RT.Log;
+using Aitex.Core.Utilities;
+using MECF.Framework.Common.Equipment;
+using MECF.Framework.Common.Persistent.Reservoirs;
+using MECF.Framework.Common.Persistent.Temperature;
+using PunkHPX8_Core;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace PunkHPX8_RT.Modules.Reservoir
+{
+    public class ReservoirEntity : Entity, IEntity, IModuleEntity
+    {
+        #region 常量
+        private const string STRATUS = "Stratus";
+        private const string AUTO = "Auto";
+        private const string MANUAL = "Manual";
+        private const string DISABLED = "Disabled";
+        private const string ENGINEERING = "Engineering";
+        private const string PRODUCTION = "Production";
+        #endregion
+
+        #region 内部变量
+        /// <summary>
+        /// 持久化数值
+        /// </summary>
+        private ReservoirsPersistentValue _persistentValue;
+        #endregion
+        #region 属性
+        /// <summary>
+        /// 模块名称
+        /// </summary>
+        public ModuleName Module { get; private set; }
+        /// <summary>
+        /// 是否Init
+        /// </summary>
+        public bool IsInit
+        {
+            get { return fsm.State == (int)ReservoirState.Init; }
+        }
+        /// <summary>
+        /// 是否Idle
+        /// </summary>
+        public bool IsIdle
+        {
+            get
+            {
+                return fsm.State == (int)ReservoirState.Idle;
+            }
+        }
+        /// <summary>
+        /// 是否错误
+        /// </summary>
+        public bool IsError
+        {
+            get { return fsm.State == (int)ReservoirState.Error; }
+        }
+        /// <summary>
+        /// 正在忙碌
+        /// </summary>
+        public bool IsBusy
+        {
+            get { return fsm.State == (int)ReservoirState.Initializing; }
+        }
+        /// <summary>
+        /// 是否禁用
+        /// </summary>
+        public bool IsDisable { get { return _persistentValue == null || _persistentValue.OperatingMode == DISABLED; } }
+
+        /// <summary>
+        /// 自动模式
+        /// </summary>
+        public bool IsAuto { get { return _persistentValue != null && _persistentValue.OperatingMode == AUTO; } }
+        /// <summary>
+        /// 自动模式
+        /// </summary>
+        public bool IsManual { get { return _persistentValue != null && _persistentValue.OperatingMode == MANUAL; } }
+        /// <summary>
+        /// 是否为工程模式
+        /// </summary>
+        public bool IsEngineering { get { return _persistentValue != null && _persistentValue.RecipeOperatingMode == ENGINEERING; } }
+        /// <summary>
+        /// 是否为产品模式
+        /// </summary>
+        public bool IsProduction { get { return _persistentValue != null && _persistentValue.RecipeOperatingMode == PRODUCTION; } }
+        /// <summary>
+        /// 状态机状态
+        /// </summary>
+        public ReservoirState State { get { return (ReservoirState)fsm.State; } }
+        #endregion
+        /// <summary>
+        /// 构造函数
+        /// </summary>
+        /// <param name="module"></param>
+        public ReservoirEntity(ModuleName module)
+        {
+            this.Module = module;
+            InitializeParameter();
+            InitialFsm();
+        }
+        /// <summary>
+        /// 初始化
+        /// </summary>
+        /// <returns></returns>
+        protected override bool Init()
+        {
+            InitializeRoutine();
+            InitializeDATA();
+            InitializeOperation();
+            return true;
+        }
+
+        /// <summary>
+        /// 初始化参数
+        /// </summary>
+        private void InitializeParameter()
+        {
+            _persistentValue = ReservoirsPersistentManager.Instance.GetReservoirsPersistentValue(Module.ToString());
+            if (_persistentValue == null)
+            {
+                LOG.WriteLog(eEvent.ERR_RESERVOIR, Module.ToString(), "Persistent Value Object is not exist");
+            }
+        }
+        /// <summary>
+        /// 初始化Routine
+        /// </summary>
+        private void InitializeRoutine()
+        {
+
+        }
+        /// <summary>
+        /// 初始化DATA
+        /// </summary>
+        private void InitializeDATA()
+        {
+        }
+        /// <summary>
+        /// 初始化Operation
+        /// </summary>
+        private void InitializeOperation()
+        {
+
+        }
+
+        /// 初始化状态机
+        /// </summary>
+        private void InitialFsm()
+        {
+            fsm = new StateMachine<ReservoirEntity>(Module.ToString(), (int)ReservoirState.Init, 100);
+            fsm.EnableRepeatedMsg(true);
+
+            AnyStateTransition(ReservoirMsg.Error, NullFunc, ReservoirState.Error);
+            //Initialized
+            Transition(ReservoirState.Error, ReservoirMsg.Initialize, InitializeAll, ReservoirState.Initializing);
+            Transition(ReservoirState.Init, ReservoirMsg.Initialize, InitializeAll, ReservoirState.Initializing);
+            Transition(ReservoirState.Idle, ReservoirMsg.Initialize, InitializeAll, ReservoirState.Initializing);
+            Transition(ReservoirState.Initializing, FSM_MSG.TIMER, InitializeAllMonitor, ReservoirState.Idle);
+
+            //直接进入Idle
+            Transition(ReservoirState.Initialized, FSM_MSG.TIMER, NullFunc, ReservoirState.Idle);
+            //Enter Init
+            Transition(ReservoirState.Idle, ReservoirMsg.Init, NullFunc, ReservoirState.Init);
+
+            EnumLoop<ReservoirState>.ForEach((item) => { fsm.MapState((int)item, item.ToString()); });
+
+            EnumLoop<ReservoirMsg>.ForEach((item) => { fsm.MapMessage((int)item, item.ToString()); });
+        }
+        #region Initialize All
+        /// <summary>
+        /// 初始化
+        /// </summary>
+        /// <returns></returns>
+        private bool InitializeAll(object[] param)
+        {
+            return true;
+        }
+        /// <summary>
+        /// Initialize 监控
+        /// </summary>
+        /// <param name="param"></param>
+        /// <returns></returns>
+        private bool InitializeAllMonitor(object[] param)
+        {
+            return true;
+        }
+        #endregion
+
+
+        public bool Check(int msg, out string reason, params object[] args)
+        {
+            reason = "";
+            return true;
+        }
+
+        public bool CheckAcked(int msg)
+        {
+            throw new NotImplementedException();
+        }
+
+        public int Invoke(string function, params object[] args)
+        {
+            throw new NotImplementedException();
+        }
+    }
+}

+ 19 - 0
PunkHPX8_RT/Modules/Reservoir/ReservoirMsg.cs

@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace PunkHPX8_RT.Modules.Reservoir
+{
+    public enum ReservoirMsg
+    {
+        Error,
+        Initialize,
+        DosingInitialize,
+        ResumeError,
+        CycleProcessRecipe,
+        Init,
+        Abort
+    }
+}

+ 1 - 0
PunkHPX8_RT/Modules/RouteManager.cs

@@ -191,6 +191,7 @@ namespace PunkHPX8_RT.Modules
             InitialModuleList(VpwMainItemManager.Instance.InstalledModules, typeof(VpwMainEntity), ModuleType.VpwMain);
             InitialModuleList(VpwCellItemManager.Instance.InstalledModules, typeof(VpwCellEntity), ModuleType.VPW);
             InitialModuleList(SrdItemManager.Instance.InstalledModules, typeof(SRDEntity), ModuleType.SRD);
+            InitialModuleList(ReservoirItemManager.Instance.InstalledModules, typeof(ReservoirEntity), ModuleType.Reservoir);
 
             fsm = new StateMachine<RouteManager>(Name, (int)RtState.Init, 200);
 

+ 2 - 0
PunkHPX8_RT/PunkHPX8_RT.csproj

@@ -290,6 +290,8 @@
     <Compile Include="Modules\LPs\LoadPortMapRoutine.cs" />
     <Compile Include="Modules\LPs\LoadPortUnDockRoutine.cs" />
     <Compile Include="Modules\ModuleHomeAllRoutine.cs" />
+    <Compile Include="Modules\Reservoir\ReservoirEntity.cs" />
+    <Compile Include="Modules\Reservoir\ReservoirMsg.cs" />
     <Compile Include="Modules\SRD\SRDAWCCycleRoutine.cs" />
     <Compile Include="Modules\SRD\SRDInitializeHomeRoutine.cs" />
     <Compile Include="Modules\SRD\SRDLoaderRoutine.cs" />