Kaynağa Gözat

add dm reservoir andireplen

chenzk 1 hafta önce
ebeveyn
işleme
ccbdaf69fd

+ 8 - 8
PunkHPX8_RT/Config/Layout/ToolLayoutConfiguration.xml

@@ -170,7 +170,7 @@
 			<ReservoirID>1</ReservoirID>
 			<Size>2</Size>
 			<TCID>TC1-1</TCID>
-			<SubType>DM</SubType>
+			<SubType>DegasMembrance</SubType>
 			<PHProbeChannelNumber>1</PHProbeChannelNumber>
 			<PlannedInitialChemistry>Ni</PlannedInitialChemistry>
 			<PlatingCells>
@@ -182,7 +182,7 @@
 					<PlatingCellID>1</PlatingCellID>
 					<PlatingPowerSupplyAID>Power13-1</PlatingPowerSupplyAID>
 					<PlatingPowerSupplyBID>Power14-1</PlatingPowerSupplyBID>
-					<SubType>DM</SubType>
+					<SubType>DegasMembrance</SubType>
 				</Item>
 			</PlatingCells>
 			<CellPosition>13</CellPosition>
@@ -206,7 +206,7 @@
 			<ReservoirID>2</ReservoirID>
 			<Size>2</Size>
 			<TCID>TC1-2</TCID>
-			<SubType>DM</SubType>
+			<SubType>DegasMembrance</SubType>
 			<PHProbeChannelNumber>1</PHProbeChannelNumber>
 			<PlannedInitialChemistry>Cu</PlannedInitialChemistry>
 			<PlatingCells>
@@ -218,7 +218,7 @@
 					<PlatingCellID>2</PlatingCellID>
 					<PlatingPowerSupplyAID></PlatingPowerSupplyAID>
 					<PlatingPowerSupplyBID></PlatingPowerSupplyBID>
-					<SubType>DM</SubType>
+					<SubType>DegasMembrance</SubType>
 				</Item>
 			</PlatingCells>
 			<CellPosition>14</CellPosition>
@@ -242,7 +242,7 @@
 			<ReservoirID>3</ReservoirID>
 			<Size>2</Size>
 			<TCID>TC1-3</TCID>
-			<SubType>DM</SubType>
+			<SubType>DegasMembrance</SubType>
 			<PHProbeChannelNumber>1</PHProbeChannelNumber>
 			<PlannedInitialChemistry>Cu</PlannedInitialChemistry>
 			<PlatingCells>
@@ -254,7 +254,7 @@
 					<PlatingCellID>3</PlatingCellID>
 					<PlatingPowerSupplyAID></PlatingPowerSupplyAID>
 					<PlatingPowerSupplyBID></PlatingPowerSupplyBID>
-					<SubType>DM</SubType>
+					<SubType>DegasMembrance</SubType>
 				</Item>
 			</PlatingCells>
 			<CellPosition>15</CellPosition>
@@ -278,7 +278,7 @@
 			<ReservoirID>4</ReservoirID>
 			<Size>2</Size>
 			<TCID>TC1-4</TCID>
-			<SubType>DM</SubType>
+			<SubType>DegasMembrance</SubType>
 			<PHProbeChannelNumber>1</PHProbeChannelNumber>
 			<PlannedInitialChemistry>Cu</PlannedInitialChemistry>
 			<PlatingCells>
@@ -290,7 +290,7 @@
 					<PlatingCellID>4</PlatingCellID>
 					<PlatingPowerSupplyAID></PlatingPowerSupplyAID>
 					<PlatingPowerSupplyBID></PlatingPowerSupplyBID>
-					<SubType>DM</SubType>
+					<SubType>DegasMembrance</SubType>
 				</Item>
 			</PlatingCells>
 			<CellPosition>16</CellPosition>

+ 5 - 4
PunkHPX8_RT/Devices/DeviceManager.cs

@@ -7,6 +7,7 @@ using MECF.Framework.Common.Equipment;
 using MECF.Framework.Common.ToolLayout;
 using MECF.Framework.Common.TwinCat;
 using MECF.Framework.RT.Core.Equipments;
+using PunkHPX8_Core;
 using PunkHPX8_RT.Devices;
 using PunkHPX8_RT.Devices.AXIS;
 using PunkHPX8_RT.Devices.EFEM;
@@ -140,12 +141,12 @@ namespace PunkHPX8_RT.Instances
             foreach (string item in PlatingCellItemManager.Instance.InstalledModules)
             {
                 PlatingCellItem platingCellItem = PlatingCellItemManager.Instance.GetPlatingCellItem(item);
-                if (platingCellItem.SubType == "DM")
+                if (platingCellItem.SubType == ReservoirType.DegasMembrance.ToString())
                 {
                     DMPlatingCellDevice platingCellDevice = new DMPlatingCellDevice(item);
                     AddCustomDevice(platingCellDevice);
                 }
-                else if(platingCellItem.SubType == "HS")
+                else if(platingCellItem.SubType == ReservoirType.HotStandard.ToString())
                 {
                     HSPlatingCellDevice platingCellDevice = new HSPlatingCellDevice(item);
                     AddCustomDevice(platingCellDevice);
@@ -165,12 +166,12 @@ namespace PunkHPX8_RT.Instances
             foreach (string item in ReservoirItemManager.Instance.InstalledModules)
             {
                 ReservoirItem reservoirItem = ReservoirItemManager.Instance.GetReservoirItem(item);
-                if (reservoirItem.SubType == "DM")
+                if (reservoirItem.SubType == ReservoirType.DegasMembrance.ToString())
                 {
                     DMReservoirDevice reservoirDevice = new DMReservoirDevice(item);
                     AddCustomDevice(reservoirDevice);
                 }
-                else if(reservoirItem.SubType == "HS")
+                else if(reservoirItem.SubType == ReservoirType.HotStandard.ToString())
                 {
                     HSReservoirDevice reservoirDevice = new HSReservoirDevice(item);
                     AddCustomDevice(reservoirDevice);

+ 84 - 4
PunkHPX8_RT/Devices/Reservoir/DMReservoirDevice.cs

@@ -12,6 +12,7 @@ using MECF.Framework.Common.TwinCat;
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.Runtime.InteropServices;
 using System.Text;
 using System.Threading.Tasks;
 
@@ -31,6 +32,7 @@ namespace PunkHPX8_RT.Devices.Reservoir
         /// an泵速Helper
         /// </summary>
         private ReservoirANPumpSpeedHelper _anPumpSpeedHelper;
+
         #endregion
 
         #region 属性
@@ -42,6 +44,10 @@ namespace PunkHPX8_RT.Devices.Reservoir
         /// 检验阳极是否lowlevel
         /// </summary>
         public bool IsANLowLevel { get { return _reservoirData.AnTowerLow; } }
+        /// <summary>
+        /// 阳极是否需要补水
+        /// </summary>
+        public bool AnNeedDireplen { get { return CheckANNeedDiReplen(); } }
         #endregion
 
         #region Trigger
@@ -215,7 +221,6 @@ namespace PunkHPX8_RT.Devices.Reservoir
             if (_anWaterLevelLowerTrigger.Q  && !Recipe.ANDIReplenEnable)
             {
                 LOG.WriteLog(eEvent.ERR_RESERVOIR, Module, $"AN tower low is activate and recipe ANDIReplenEnable is false");
-                //若recipe允许补水且res auto ,需要启动阳极自动补水
             }
             if (_anWaterLevelHighTrigger.Q && !Recipe.ANDIReplenEnable)
             {
@@ -223,7 +228,7 @@ namespace PunkHPX8_RT.Devices.Reservoir
             }
         }
         /// <summary>
-        /// 补水监控
+        /// 补水监控,用于关闭自动补水
         /// </summary>
         protected override void AutoDireplenMonitor()
         {
@@ -236,10 +241,9 @@ namespace PunkHPX8_RT.Devices.Reservoir
                     _currentDireplenOperation = DiReplenOperation.None;
                 }
             }
-            //阳极没有水位,自动补水监控逻辑待修正
             if (_currentDireplenOperation == DiReplenOperation.AutoANDiReplen)
             {
-
+                AutoANDiReplenMonitor(ANDiReplenOff, _resRecipe.ANDIReplenEnable,  _resRecipe.ANDIReplenTimeRate, _resRecipe.ANDIReplenCurrentRate);
             }
         }
 
@@ -317,8 +321,84 @@ namespace PunkHPX8_RT.Devices.Reservoir
             return ManualDiReplen(ANDiReplenOnOperation, DiReplenOperation.ManualANDiReplen, args[0].ToString());
         }
 
+        /// <summary>
+        /// 检验阳极是否需要补水
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckANNeedDiReplen()
+        {
+            if (IsAuto && _resRecipe != null)
+            {
+                if (_resRecipe.ANDIReplenEnable && _resRecipe.ANDIReplenCurrentRate == 0 && _resRecipe.ANDIReplenTimeRate == 0)
+                {
+                    return _reservoirData.AnTowerLow;
+                }
+                return false;
+            }
+            else
+            {
+                return false;
+            }
+        }
+
+        /// <summary>
+        /// 阳极自动注水
+        /// </summary>
+        /// <returns></returns>
+        public bool AutoANDiReplen()
+        {
+            return AutoDireplen(ANDiReplenOn, DiReplenOperation.AutoANDiReplen);
+        }
 
+        /// <summary>
+        /// 阳极自动注水监控
+        /// </summary>
+        /// <param name="direplenOff"></param>
+        /// <param name="level"></param>
+        /// <param name="recipeLevel"></param>
+        private void AutoANDiReplenMonitor(Func<string, object[], bool> direplenOff, bool replenEnable, int direplenTimeRate, int direplenCurrentRate)
+        {
+            //判断是否注水超时(包括单次和累计)
+            bool result = _direplenHelper.AutoDiReplenMonitorTimeOut(direplenOff, ref _isDIReplenMaxTimeOut, ref _isDIReplenPerfillTimeOut);
+            if (result)
+            {
+                _currentDireplenOperation = DiReplenOperation.None;
+            }
+            else
+            {
+                //按液位补水
+                result = AutoANDiReplenMonitorComplete(replenEnable, direplenTimeRate, direplenCurrentRate, direplenOff);
+                if (result)
+                {
+                    _currentDireplenOperation = DiReplenOperation.None;
+                }
+            }
+        }
 
+        /// <summary>
+        ///  阳极自动注水是否结束
+        /// </summary>
+        /// <param name="replenEnable"></param>
+        /// <param name="direplenTimeRate"></param>
+        /// <param name="direplenCurrentRate"></param>
+        /// <param name="direplenOffAction"></param>
+        /// <returns></returns>
+        private bool AutoANDiReplenMonitorComplete(bool replenEnable, int direplenTimeRate, int direplenCurrentRate, Func<string, object[], bool> direplenOffAction)
+        {
+            if (replenEnable && direplenTimeRate == 0 && direplenCurrentRate == 0 && ReservoirData.AnTowerHigh)
+            {
+                LOG.WriteLog(eEvent.INFO_RESERVOIR, Module, "Auto AN DiReplen complete");
+                bool result = direplenOffAction("", null);
+                if (result)
+                {
+                    _persistentValue.LastTotalReplen = _persistentValue.TotalReplen;
+                    _persistentValue.IsDiReplenOn = false;
+                    ReservoirsPersistentManager.Instance.UpdatePersistentValue(Module);
+                    return result;
+                }
+            }
+            return false;
+        }
 
     }
 }

+ 4 - 7
PunkHPX8_RT/Devices/Reservoir/ReservoirDevice.cs

@@ -110,13 +110,6 @@ namespace PunkHPX8_RT.Devices.Reservoir
         private int _levelSampleCount;
      
 
- 
-        /// <summary>
-        /// 单次补水是否超时
-        /// </summary>
-        private bool _isDIReplenPerfillTimeOut = false;
-   
-
         /// <summary>
         /// 上一时刻platingcell的overflow level
         /// </summary>
@@ -184,6 +177,10 @@ namespace PunkHPX8_RT.Devices.Reservoir
         /// 累计补水是否超时
         /// </summary>
         protected  bool _isDIReplenMaxTimeOut = false;
+        /// <summary>
+        /// 单次补水是否超时
+        /// </summary>
+        protected bool _isDIReplenPerfillTimeOut = false;
         #endregion
 
         #region 属性

+ 3 - 0
PunkHPX8_RT/Devices/Reservoir/ReservoirDiReplenHelper.cs

@@ -2,9 +2,11 @@
 using Aitex.Core.RT.Log;
 using Aitex.Core.RT.SCCore;
 using MECF.Framework.Common.Alarm;
+using MECF.Framework.Common.CommonData.Reservoir;
 using MECF.Framework.Common.Persistent.Reservoirs;
 using PunkHPX8_RT.Devices.Facilities;
 using System;
+using System.Reflection;
 
 namespace PunkHPX8_RT.Devices.Reservoir
 {
@@ -94,6 +96,7 @@ namespace PunkHPX8_RT.Devices.Reservoir
             }
             return false;
         }
+        
         /// <summary>
         /// 单次自动注水超时
         /// </summary>

+ 6 - 1
PunkHPX8_RT/Devices/Reservoir/TotalReservoirDevice.cs

@@ -3,6 +3,7 @@ using Aitex.Core.Util;
 using MECF.Framework.Common.CommonData;
 using MECF.Framework.Common.ToolLayout;
 using MECF.Framework.Common.TwinCat;
+using PunkHPX8_Core;
 using PunkHPX8_RT.Modules;
 using PunkHPX8_RT.Modules.Reservoir;
 using System;
@@ -59,7 +60,7 @@ namespace PunkHPX8_RT.Devices.Reservoir
                 ReservoirEntity reservoirEntity = Singleton<RouteManager>.Instance.GetModule<ReservoirEntity>(module);
                 if (reservoirEntity != null)
                 {
-                    if (reservoirItem.SubType == "DM")
+                    if (reservoirItem.SubType == ReservoirType.DegasMembrance.ToString())
                     {
                         DMReservoirDevice reservoirDevice = DEVICE.GetDevice<DMReservoirDevice>(module);
                         if (!reservoirEntity.IsInitialized || reservoirDevice.IsDIReplenMaxTimeOut
@@ -71,6 +72,10 @@ namespace PunkHPX8_RT.Devices.Reservoir
                         {
                             reservoirDevice.AutoCADiReplen();
                         }
+                        else if (reservoirDevice.AnNeedDireplen && !reservoirDevice.IsDireplenOn)
+                        {
+                            reservoirDevice.AutoANDiReplen();
+                        }
                     }
                 }
             }

+ 6 - 6
PunkHPX8_RT/Modules/Reservoir/ReservoirEntity.cs

@@ -221,11 +221,11 @@ namespace PunkHPX8_RT.Modules.Reservoir
             _reservoirItem = ReservoirItemManager.Instance.GetReservoirItem(Module.ToString());
             if (_reservoirItem != null)
             {
-                if (_reservoirItem.SubType == "DM")
+                if (_reservoirItem.SubType == ReservoirType.DegasMembrance.ToString())
                 {
                    _dmPlatingCellDevice = DEVICE.GetDevice<DMPlatingCellDevice>(_reservoirItem.PlatingCells[0].ModuleName);
                 }
-                else if (_reservoirItem.SubType == "HS")
+                else if (_reservoirItem.SubType == ReservoirType.HotStandard.ToString())
                 {
                    _hsPlatingCellDevice = DEVICE.GetDevice<HSPlatingCellDevice>(_reservoirItem.PlatingCells[0].ModuleName);
                 }
@@ -316,11 +316,11 @@ namespace PunkHPX8_RT.Modules.Reservoir
             //{
             //    return false;
             //}
-            if (_reservoirItem.SubType == "DM")
+            if (_reservoirItem.SubType == ReservoirType.DegasMembrance.ToString())
             {
                 return _dmInitializeRoutine.Start(_dmPlatingCellDevice,  _temperatureController) == RState.Running;
             }
-            else if(_reservoirItem.SubType == "HS")
+            else if(_reservoirItem.SubType == ReservoirType.HotStandard.ToString())
             {
                 return _hsInitializeRoutine.Start(_hsPlatingCellDevice, _temperatureController) == RState.Running;
             }
@@ -337,11 +337,11 @@ namespace PunkHPX8_RT.Modules.Reservoir
         private bool InitializeAllMonitor(object[] param)
         {
             RState ret = RState.Init;
-            if (_reservoirItem.SubType == "DM")
+            if (_reservoirItem.SubType == ReservoirType.DegasMembrance.ToString())
             {
                 ret = _dmInitializeRoutine.Monitor();
             }
-            else if(_reservoirItem.SubType == "HS")
+            else if(_reservoirItem.SubType == ReservoirType.HotStandard.ToString())
             {
                 ret = _hsInitializeRoutine.Monitor();
             }