Browse Source

add vpw main home rotation

chenzk 2 days ago
parent
commit
c8074c102c

+ 3 - 2
PunkHPX8_MainPages/ViewModels/VPWMainViewModel.cs

@@ -188,7 +188,7 @@ namespace PunkHPX8_MainPages.ViewModels
 
             _rtDataKeys.Add($"{Module}.{PERSISTENT_VALUE}");
             _rtDataKeys.Add($"{Module}.{COMMONDATA}");
-            _rtDataKeys.Add($"{Module}.MachineState");
+            _rtDataKeys.Add($"{Module}.FsmState");
 
             if (_timer == null)
             {
@@ -212,6 +212,7 @@ namespace PunkHPX8_MainPages.ViewModels
                 {
                     VpwMainCommonData = CommonFunction.GetValue<VpwMainCommonData>(_rtDataValueDic, $"{Module}.{COMMONDATA}");
                     VpwMainPersistent = CommonFunction.GetValue<VpwMainPersistentValue>(_rtDataValueDic, $"{Module}.{PERSISTENT_VALUE}");
+                    Status = CommonFunction.GetValue<string>(_rtDataValueDic, $"{Module}.FsmState");
                 }
             }
         }
@@ -242,7 +243,7 @@ namespace PunkHPX8_MainPages.ViewModels
         /// <param name="param"></param>
         private void HomeAction(object param)
         {
-            InvokeClient.Instance.Service.DoOperation($"{Module}.Home");
+            InvokeClient.Instance.Service.DoOperation($"{Module}.HomeAllRotation");
         }
         #endregion
 

+ 1 - 0
PunkHPX8_MainPages/Views/VPWMainView.xaml

@@ -57,6 +57,7 @@
                                                FluidInContainment="{Binding VpwMainCommonData.LeakDetected}"
                                                DIWInletValveOpen="{Binding VpwMainCommonData.DiwEnable}"
                                                WaterPressure="{Binding VpwMainCommonData.DiwPressure}"
+                                               MachineState="{Binding Status}"
                                                
                                                
                                                

+ 26 - 1
PunkHPX8_RT/Devices/VpwMain/VpwMainDevice.cs

@@ -14,6 +14,7 @@ using MECF.Framework.Common.Persistent.Prewet;
 using MECF.Framework.Common.Persistent.VpwMain;
 using PunkHPX8_Core;
 using PunkHPX8_RT.Modules;
+using PunkHPX8_RT.Modules.VpwCelMain;
 using PunkHPX8_RT.Modules.VpwMain;
 using System;
 using System.Collections.Generic;
@@ -58,7 +59,8 @@ namespace PunkHPX8_RT.Devices.VpwMain
         {
             None,
             PumpEnable,
-            PumpDisable
+            PumpDisable,
+            HomeAllRotation
         }
 
         #region 内部变量
@@ -119,6 +121,10 @@ namespace PunkHPX8_RT.Devices.VpwMain
         /// 启动自动调泵速
         /// </summary>
         private bool _isStartAutoSpeed;
+        /// <summary>
+        /// Home 电机
+        /// </summary>
+        private VpwSimpleHomeRoutine _simpleHomeRoutine;
         #endregion
 
         #region 属性
@@ -172,6 +178,7 @@ namespace PunkHPX8_RT.Devices.VpwMain
         {
             _boosterPumpEnableRoutine = new BoosterPumpEnableRoutine(Module, this);
             _boosterPumpDisableRoutine = new BoosterPumpDisableRoutine(Module, this);
+            _simpleHomeRoutine = new VpwSimpleHomeRoutine(Module.ToString());
         }
         /// <summary>
         /// 订阅
@@ -291,12 +298,28 @@ namespace PunkHPX8_RT.Devices.VpwMain
             OP.Subscribe($"{Module}.AutoAction", AutoOperation);
             OP.Subscribe($"{Module}.EngineeringModeAction", EngineeringModeOperation);
             OP.Subscribe($"{Module}.ProductionModeAction", ProductionModeOperation);
+            
+            OP.Subscribe($"{Module}.HomeAllRotation", HomeAllRotation);
 
         }
         #endregion
 
         #region Action
 
+        #region HomeAllRotation
+        public bool HomeAllRotation(string cmd, object[] param)
+        {
+            if (_status == RState.Running)
+            {
+                LOG.WriteLog(eEvent.ERR_PREWET, Module.ToString(), $"{Module} current execute {_currentOperation},cannot home all rotation");
+                return false;
+            }
+            _status = _simpleHomeRoutine.Start();
+            _currentOperation = VPWOperation.HomeAllRotation;
+            return _status == RState.Running;
+        }
+        #endregion
+
         #region Vacum Pump
         /// <summary>
         /// Pump Power On
@@ -810,6 +833,8 @@ namespace PunkHPX8_RT.Devices.VpwMain
                     return _boosterPumpEnableRoutine;
                 case VPWOperation.PumpDisable:
                     return _boosterPumpDisableRoutine;
+                case VPWOperation.HomeAllRotation:
+                    return _simpleHomeRoutine;
                 default:
                     return null;
             }

+ 8 - 0
PunkHPX8_RT/Modules/VpwCell/VpwCellEntity.cs

@@ -1,6 +1,7 @@
 using Aitex.Core.RT.Device;
 using Aitex.Core.RT.Fsm;
 using Aitex.Core.RT.Log;
+using Aitex.Core.Utilities;
 using MECF.Framework.Common.Equipment;
 using MECF.Framework.Common.Persistent.Temperature;
 using MECF.Framework.Common.Persistent.VpwCell;
@@ -13,6 +14,7 @@ using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
+using System.Threading;
 using System.Threading.Tasks;
 
 namespace PunkHPX8_RT.Modules.VpwMain
@@ -114,6 +116,7 @@ namespace PunkHPX8_RT.Modules.VpwMain
         protected override bool Init()
         {
             InitializeParameter();
+            InitialFsm();
             return true;
         }
 
@@ -128,6 +131,11 @@ namespace PunkHPX8_RT.Modules.VpwMain
                 LOG.WriteLog(eEvent.ERR_VPW, Module.ToString(), "Persistent Value Object is not exist");
             }
         }
+        private void InitialFsm()
+        {
+            fsm = new StateMachine<VpwMainEntity>(Module.ToString(), (int)VPWMainState.Init, 100);
+            fsm.EnableRepeatedMsg(true);
+        }
 
         public bool Check(int msg, out string reason, params object[] args)
         {

+ 34 - 1
PunkHPX8_RT/Modules/VpwMain/VpwMainEntity.cs

@@ -1,6 +1,10 @@
-using Aitex.Core.RT.Device;
+using Aitex.Core.RT.DataCenter;
+using Aitex.Core.RT.Device;
 using Aitex.Core.RT.Fsm;
 using Aitex.Core.RT.Log;
+using Aitex.Core.RT.OperationCenter;
+using Aitex.Core.RT.Routine;
+using Aitex.Core.Util;
 using Aitex.Core.Utilities;
 using MECF.Framework.Common.Equipment;
 using MECF.Framework.Common.Persistent.Reservoirs;
@@ -8,10 +12,12 @@ using MECF.Framework.Common.Persistent.VpwMain;
 using MECF.Framework.Common.ToolLayout;
 using PunkHPX8_Core;
 using PunkHPX8_RT.Devices.VpwCell;
+using PunkHPX8_RT.Modules.VpwCelMain;
 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
+using System.Threading;
 using System.Threading.Tasks;
 
 namespace PunkHPX8_RT.Modules.VpwMain
@@ -123,6 +129,8 @@ namespace PunkHPX8_RT.Modules.VpwMain
             InitialFsm();
             InitializeParameter();
             InitializeRoutine();
+            InitialDATA();
+            InitialOperation();
             return true;
         }
         /// 初始化状态机
@@ -133,12 +141,14 @@ namespace PunkHPX8_RT.Modules.VpwMain
             fsm.EnableRepeatedMsg(true);
 
             AnyStateTransition(VPWMainState.Error, NullFunc, VPWMainState.Error);
+            AnyStateTransition(FSM_MSG.TIMER, fnMonitor, FSM_STATE.SAME);
             //Initialized
             Transition(VPWMainState.Error, VPWMainMsg.Initialize, InitializeAll, VPWMainState.Initializing);
             Transition(VPWMainState.Init, VPWMainMsg.Initialize, InitializeAll, VPWMainState.Initializing);
             Transition(VPWMainState.Idle, VPWMainMsg.Initialize, InitializeAll, VPWMainState.Initializing);
             Transition(VPWMainState.Initializing, FSM_MSG.TIMER, InitializeAllMonitor, VPWMainState.Idle);
 
+
             //直接进入Idle
             Transition(VPWMainState.Initialized, FSM_MSG.TIMER, NullFunc, VPWMainState.Idle);
             //Enter Init
@@ -176,6 +186,29 @@ namespace PunkHPX8_RT.Modules.VpwMain
         private void InitializeRoutine()
         {
             _homeRoutine = new VPWHomeRoutine(Module.ToString());
+          
+        }
+        /// <summary>
+        /// 初始化数据
+        /// </summary>
+        private void InitialDATA()
+        {
+            DATA.Subscribe($"{Module}.FsmState", () => ((VPWMainState)fsm.State).ToString(), SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.IsError", () => IsError, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Module}.OperatingMode", () => _persistentValue != null ? _persistentValue.OperatingMode : "None", SubscriptionAttribute.FLAG.IgnoreSaveDB);
+        }
+        /// <summary>
+        /// 初始化操作
+        /// </summary>
+        private void InitialOperation()
+        {
+            OP.Subscribe($"{Module}.InitializeHome", (cmd, args) => { return CheckToPostMessage<VPWMainState, VPWMainMsg>(eEvent.ERR_VPWMAIN, Module.ToString(), (int)VPWMainMsg.Initialize); });
+        }
+        
+        private bool fnMonitor(object[] param)
+        {
+            
+            return true;
         }
 
         #region InitializeAll

+ 185 - 0
PunkHPX8_RT/Modules/VpwMain/VpwSimpleHomeRoutine.cs

@@ -0,0 +1,185 @@
+using Aitex.Core.RT.Device;
+using Aitex.Core.RT.Log;
+using Aitex.Core.RT.Routine;
+using Aitex.Core.Util;
+using MECF.Framework.Common.Routine;
+using MECF.Framework.Common.ToolLayout;
+using PunkHPX8_Core;
+using PunkHPX8_RT.Devices.AXIS;
+using PunkHPX8_RT.Devices.Facilities;
+using PunkHPX8_RT.Devices.VpwCell;
+using PunkHPX8_RT.Devices.VpwMain;
+using PunkHPX8_RT.Modules.VpwMain;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace PunkHPX8_RT.Modules.VpwCelMain
+{
+    public class VpwSimpleHomeRoutine : RoutineBase, IRoutine
+    {
+        private enum VpwSimpleHomeStep
+        {
+            CheckPreCondition,
+            ChamberUp,
+            HomeAllRotation,
+            CheckAllRotationHome,
+            ChamberDown,
+            End
+        }
+
+        #region 常量 
+        #endregion
+
+        #region 内部变量
+        /// <summary>
+        /// Cell device集合
+        /// </summary>
+        private List<VpwCellDevice> _vpwCellDevices = new List<VpwCellDevice>();
+        /// <summary>
+        /// Main Device
+        /// </summary>
+        private VpwMainDevice _mainDevice;
+        /// <summary>
+        /// 用于处理没有被dissable的vpwcell
+        /// </summary>
+        private List<VpwCellDevice> _cellLst = new List<VpwCellDevice>();
+        /// <summary>
+        /// vpw cell rotation列表
+        /// </summary>
+        private List<JetAxisBase> _rotationAxis = new List<JetAxisBase>();
+        #endregion
+
+        /// <summary>
+        /// 构造函数
+        /// </summary>
+        /// <param name="module"></param>
+        public VpwSimpleHomeRoutine(string module) : base(module)
+        {
+
+        }
+
+        /// <summary>
+        /// 中止
+        /// </summary>
+        public void Abort()
+        {
+            Runner.Stop("Vpw Simple Home abort");
+        }
+        /// <summary>
+        /// 监控
+        /// </summary>
+        /// <returns></returns>
+        public RState Monitor()
+        {
+            Runner.Run(VpwSimpleHomeStep.CheckPreCondition, CheckPreCondition, _delay_1ms)
+                .Run(VpwSimpleHomeStep.ChamberUp, _mainDevice.ChamberUp, CheckChamberClosed, _delay_1s)
+                .Run(VpwSimpleHomeStep.HomeAllRotation, HomeAllRotation,_delay_1s)
+                .WaitWithStopCondition(VpwSimpleHomeStep.CheckAllRotationHome, CheckAllRotationHomed, CheckRotationHomeFailed)
+                .Run(VpwSimpleHomeStep.ChamberDown, _mainDevice.ChamberDown, CheckChamberOpened, _delay_1s)
+                .End(VpwSimpleHomeStep.End, NullFun, _delay_1ms);
+            return Runner.Status;
+        }
+        
+        private bool CheckPreCondition()
+        {
+            //SystemFacilities systemFacility = DEVICE.GetDevice<SystemFacilities>("System.Facilities");
+            //if (systemFacility == null)
+            //{
+            //    LOG.WriteLog(eEvent.ERR_VPW, Module, "Facility is null");
+            //    return false;
+            //}
+            return true;
+        }
+        private bool HomeAllRotation()
+        {
+            bool result = true;
+            foreach (var axis in _rotationAxis)
+            {
+                result &= axis.Home();
+                if (result == false)
+                {
+                    return result;
+                }
+            }
+            return result;
+        }
+        
+        private bool CheckAllRotationHomed()
+        {
+            bool result = true;
+            foreach (var axis in _rotationAxis)
+            {
+                bool condition = axis.IsHomed && axis.Status == RState.End;
+                result &= condition;
+            }
+            return result;
+        }
+        private bool CheckRotationHomeFailed()
+        {
+            bool result = false;
+            foreach (var axis in _rotationAxis)
+            {
+                bool condition = axis.Status == RState.Failed;
+                result |= condition;
+            }
+            return result;
+        }
+        /// <summary>
+        /// 检验Chamber关闭
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckChamberClosed()
+        {
+            return _mainDevice.CommonData.ChamberClosed && !_mainDevice.CommonData.ChamberOpened;
+        }
+        /// <summary>
+        /// 检验Chamber打开
+        /// </summary>
+        /// <returns></returns>
+        private bool CheckChamberOpened()
+        {
+            return !_mainDevice.CommonData.ChamberClosed && _mainDevice.CommonData.ChamberOpened;
+        }
+        /// <summary>
+        /// 启动
+        /// </summary>
+        /// <param name="objs"></param>
+        /// <returns></returns>
+        public RState Start(params object[] objs)
+        {
+            _rotationAxis.Clear();
+            _vpwCellDevices.Clear();
+            _cellLst.Clear();
+            VpwMainItem vpwMainItem = VpwMainItemManager.Instance.GetItem(Module.ToString());
+            if (vpwMainItem == null || vpwMainItem.VpwCells == null)
+            {
+                return RState.Failed;
+            }
+            foreach (var item in vpwMainItem.VpwCells)
+            {
+                VpwCellDevice cellDevice = DEVICE.GetDevice<VpwCellDevice>(item.ModuleName);
+                _vpwCellDevices.Add(cellDevice);
+            }
+            
+            
+            foreach (var device in _vpwCellDevices)
+            {
+                VpwCellEntity vpwCellEntity = Singleton<RouteManager>.Instance.GetModule<VpwCellEntity>(device.Module);
+                if (vpwCellEntity.IsAuto || vpwCellEntity.IsManual)
+                {
+                    _cellLst.Add(device);
+                    
+                    JetAxisBase axis = DEVICE.GetDevice<JetAxisBase>($"{device.Module}.Rotation");
+                    _rotationAxis.Add(axis);
+                }
+            }
+            
+            _mainDevice = DEVICE.GetDevice<VpwMainDevice>(Module.ToString());
+            return Runner.Start(Module, "VPW Simple Home");
+        }
+
+    }
+}

+ 1 - 0
PunkHPX8_RT/PunkHPX8_RT.csproj

@@ -313,6 +313,7 @@
     <Compile Include="Modules\Dummy\DummyEntity.cs" />
     <Compile Include="Modules\DVIDName.cs" />
     <Compile Include="Modules\VpwCell\VpwCellEntity.cs" />
+    <Compile Include="Modules\VpwMain\VpwSimpleHomeRoutine.cs" />
     <Compile Include="Modules\VpwMain\VPWHomeRoutine.cs" />
     <Compile Include="Modules\VpwMain\VpwMainEntity.cs" />
     <Compile Include="Modules\VpwMain\VPWMsg.cs" />

+ 2 - 2
PunkHPX8_Twincate/PunkHPX8/PlcTest/POUs/MAIN.TcPOU

@@ -199,9 +199,9 @@ IF VPW2RotationModeOfOperation=1 THEN
 END_IF
 
 IF VPW_DO_16CHANNEL_EL2809_101_7=TRUE THEN
-	VPW_DI_16CHANNEL_EL1819_N100_9:=TRUE;
-ELSE IF VPW_DO_16CHANNEL_EL2809_101_7=FALSE THEN
 	VPW_DI_16CHANNEL_EL1819_N100_9:=FALSE;
+ELSE IF VPW_DO_16CHANNEL_EL2809_101_7=FALSE THEN
+	VPW_DI_16CHANNEL_EL1819_N100_9:=TRUE;
 END_IF
 END_IF