瀏覽代碼

update efem

chenkui 5 天之前
父節點
當前提交
171e04deeb

+ 23 - 0
CyberX8_MainPages/ViewModels/EfemViewModel.cs

@@ -140,6 +140,7 @@ namespace CyberX8_MainPages.ViewModels
         private bool _isHomeAllEnable;
 
         private double _vacuumValue;
+        private bool _doorUnlock;
         #endregion
 
         #region 属性
@@ -562,6 +563,12 @@ namespace CyberX8_MainPages.ViewModels
             get { return _vacuumValue; }
             set { SetProperty(ref _vacuumValue, value); }
         }
+
+        public bool DoorUnlock
+        {
+            get { return _doorUnlock; }
+            set { SetProperty(ref _doorUnlock,value); }
+        }
         #endregion
 
         #region 命令
@@ -731,6 +738,12 @@ namespace CyberX8_MainPages.ViewModels
 
         private ICommand _lP3CycleCommand;
         public ICommand LP3CycleCommand => _lP3CycleCommand ?? (_lP3CycleCommand = new DelegateCommand<object>(OnLP3CycleAction));
+        private DelegateCommand _doorUnlockCommand;
+        public DelegateCommand DoorUnlockCommand =>
+            _doorUnlockCommand ?? (_doorUnlockCommand = new DelegateCommand(OnDoorUnlock));
+        private DelegateCommand _doorLockCommand;
+        public DelegateCommand DoorLockCommand =>
+            _doorLockCommand ?? (_doorLockCommand = new DelegateCommand(OnDoorLock));
         #endregion
 
         #region 构造函数
@@ -951,6 +964,14 @@ namespace CyberX8_MainPages.ViewModels
         {
             InvokeClient.Instance.Service.DoOperation($"{ModuleName.Aligner1}.{EfemOperation.Home}");
         }
+        private void OnDoorUnlock()
+        {
+            InvokeClient.Instance.Service.DoOperation($"{ModuleName.EFEM}.DoorUnlock",true);
+        }
+        private void OnDoorLock()
+        {
+            InvokeClient.Instance.Service.DoOperation($"{ModuleName.EFEM}.DoorUnlock", false);
+        }
         private void OnAlign1Align()
         { 
             InvokeClient.Instance.Service.DoOperation($"{ModuleName.Aligner1}.{EfemOperation.Align}",0, AlignValue);
@@ -1157,6 +1178,7 @@ namespace CyberX8_MainPages.ViewModels
                 IsLP3HasNoJob = lp3Cj == null ? true : false;
 
                 VacuumValue = CommonFunction.GetValue<double>(RtDataValues, "EFEM.VacuumValue");
+                DoorUnlock = CommonFunction.GetValue<bool>(RtDataValues, "EFEM.DoorUnlock");
             }
             RobotMoveInfo = (RobotMoveInfo)QueryDataClient.Instance.Service.GetData("EFEM.RobotMoveAction");
 
@@ -1226,6 +1248,7 @@ namespace CyberX8_MainPages.ViewModels
             m_RtDataKeys.Add("Dummy2.WaferSize");
 
             m_RtDataKeys.Add("EFEM.VacuumValue");
+            m_RtDataKeys.Add("EFEM.DoorUnlock");
         }
         /// <summary>
         /// Robot位置信息变更(动画)

+ 15 - 8
CyberX8_MainPages/Views/EfemView.xaml

@@ -71,9 +71,9 @@
             <TextBlock Text="{Binding RtDataValues[Dummy1.WaferSize], StringFormat=({0})}" HorizontalAlignment="Center" Margin="0,10,0,0" FontSize="12"
                        Visibility="{Binding RtDataValues[Dummy1.CassettePlaced],Converter={StaticResource BoolToVisibility2}}"/>
         </StackPanel>
-        <userControls:SRDFrontView UnitData1="{Binding Srd2ModuleInfo}" UnitData2="{Binding Srd1ModuleInfo}" Title="SRD"  Canvas.Top="80" Canvas.Left="1040"/>
+        <userControls:SRDFrontView UnitData1="{Binding Srd2ModuleInfo}" UnitData2="{Binding Srd1ModuleInfo}" Title="SRD"  Canvas.Top="67" Canvas.Left="1040" HorizontalAlignment="Center" VerticalAlignment="Top"/>
 
-        <userControls:RobotFrontView UnitData="{Binding EFEMModuleInfo}" Canvas.Left="1222" Canvas.Top="112"/>
+        <userControls:RobotFrontView UnitData="{Binding EFEMModuleInfo}" Canvas.Left="1222" Canvas.Top="99" HorizontalAlignment="Center" VerticalAlignment="Top"/>
 
         <Canvas Canvas.Top="-150">
             <Grid Canvas.Left="499" Canvas.Top="440" Panel.ZIndex="2" Visibility="{Binding IsLP1Unable,Converter={StaticResource bool2VisibilityConverter}}">
@@ -97,7 +97,7 @@
             <TextBlock Canvas.Top="680" Canvas.Left="430" Text="{Binding RtDataValues[LP3.WaferSize], StringFormat=({0})}" Visibility="{Binding RtDataValues[LP3.CassettePlaced], Converter={StaticResource BoolToVisibility2}}"
                        HorizontalAlignment="Center" Margin="0,5,0,0" FontSize="16">
             </TextBlock>
-            <Viewbox Width="890" Height="890" Canvas.Top="5" Canvas.Left="297" Stretch="Fill">
+            <Viewbox Width="890" Height="890" Canvas.Left="297" Stretch="Fill" HorizontalAlignment="Center" VerticalAlignment="Top" Canvas.Top="-8">
                 <Canvas Width="1000" Height="1000">
                     <!--<userControls:MainTM Width="300" Height="250" Canvas.Left="380" Canvas.Top="90"/>-->
                 </Canvas>
@@ -125,13 +125,20 @@
         <userControls:DummyCassette Canvas.Left="751" Canvas.Top="272" RotateTransformValue="180" Width="100" Height="100" HorizontalAlignment="Left" VerticalAlignment="Center"/>
         <TextBlock Canvas.Top="142" Canvas.Left="670" Text="Dummy" HorizontalAlignment="Center" Margin="0,5,0,0" FontSize="16">
         </TextBlock>
-        <GroupBox Header="" Background="{DynamicResource Table_BG_Content}" Width="500" Height="70" Canvas.Left="1020" Canvas.Top="504" HorizontalAlignment="Left" VerticalAlignment="Center">
+        <GroupBox Header="" Background="{DynamicResource Table_BG_Content}" Width="500" Height="70" Canvas.Left="1020" Canvas.Top="464" HorizontalAlignment="Center" VerticalAlignment="Top">
             <Grid>
-                <TextBlock Margin="20,0" Text="Vacuum" VerticalAlignment="Center" HorizontalAlignment="Left" FontSize="14" />
-                <TextBlock Margin="100,0" Text="{Binding VacuumValue}" HorizontalAlignment="left" FontSize="14" VerticalAlignment="Center"/>
+                <TextBlock Margin="20,0,0,0" Text="Vacuum" VerticalAlignment="Center" HorizontalAlignment="Left" FontSize="14" />
+                <TextBlock Margin="100,0,0,0" Text="{Binding VacuumValue}" HorizontalAlignment="Left" FontSize="14" VerticalAlignment="Center"/>
             </Grid>
         </GroupBox>
-        <Grid Canvas.Top="280" Canvas.Left="1020" Width="500">
+        <GroupBox Header="Door" Background="{DynamicResource Table_BG_Content}" Width="500" Height="70" Canvas.Left="1020" Canvas.Top="541" HorizontalAlignment="Center" VerticalAlignment="Top">
+            <Grid>
+                <Ellipse Width="16" Height="16"  Fill="{Binding DoorUnlock, Converter={StaticResource boolToColor}}"   Stroke="Silver" Margin="76,18,396,14"/>
+                <customControls:PathButton Content="Open" Height="33" Width="120"  Command="{Binding DoorUnlockCommand}" Margin="124,10,244,5"/>
+                <customControls:PathButton Content="Clock" Height="33" Width="120" Margin="309,10,59,5" Command="{Binding DoorLockCommand}"/>
+            </Grid>
+        </GroupBox>
+        <Grid Canvas.Top="253" Canvas.Left="1020" Width="500" HorizontalAlignment="Center" VerticalAlignment="Top">
             <Grid.RowDefinitions>
                 <RowDefinition Height="30"/>
                 <RowDefinition Height="36"/>
@@ -247,7 +254,7 @@
 
             </Grid>
         </Grid>
-        <StackPanel Canvas.Left="1040"  Canvas.Top="175" Width="400">
+        <StackPanel Canvas.Left="1040"  Canvas.Top="162" Width="400" HorizontalAlignment="Center" VerticalAlignment="Top">
             <Border  BorderBrush="{DynamicResource Table_BD}" BorderThickness="1,0,1,1" Background="{DynamicResource Table_BG_FirstTitle}" Padding="5,1" Height="30">
                 <StackPanel Orientation="Horizontal" HorizontalAlignment="Left" VerticalAlignment="Center">
                     <Path Data="M0,0 L5,0 5,5 z" Fill="White" HorizontalAlignment="Left" Grid.Row="1" RenderTransformOrigin="0.5,0.5" Stretch="Fill" Width="5" Height="5">

+ 4 - 0
CyberX8_RT/Config/Devices/ModuleIOCfg.xml

@@ -1,5 +1,9 @@
 <?xml version="1.0" encoding="utf-8"?>
 <BeckhoffModuleIOCfg xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+	<Module Name="EFEM">
+		<IO Name="EFEM.VacuumValue" IOName="r_EFEM_VACUUM"/>
+		<IO Name="EFEM.DoorUnlock" IOName="c_Door_Unlock"/>
+	</Module>
 	<Module Name="LP1">
 		<IO Name="LP1.Cassete200Present" IOName="r_Cassette_1_200"/>
 		<IO Name="LP1.Cassete150Present" IOName="r_Cassette_1_150"/>

+ 2 - 2
CyberX8_RT/Config/Devices/WagoControllerCfg-Simulator.xml

@@ -67,7 +67,7 @@
 				<DO Name="c_HVD_2_ENABLE"  Address="531" Invert="false"/>
 			</DOGroup>
 			<DOGroup Name="N11">
-				<DO Name="\c_Door_Unlock"  Address="532" Invert="false"/>
+				<DO Name="c_Door_Unlock"  Address="532" Invert="false"/>
 				<DO Name="DO21"  Address="533" Invert="false"/>
 			</DOGroup>
 			<DOGroup Name="N12">
@@ -78,7 +78,7 @@
 		<Ano_In>
 			<AIGroup Name="N1">
 				<AI Name="AI1"  Address="0" Scaling="0=3276.7,-757=16383.5" DataType="short"/>
-				<AI Name="AI2"  Address="1" DataType="short"/>
+				<AI Name="r_EFEM_VACUUM"  Address="1" Scaling="0=3276.7,-757=16383.5" DataType="short"/>
 				<AI Name="r_HVD_1_ANALOG"  Address="2" Scaling="0=3276.7,-757=16383.5" DataType="short"/>
 				<AI Name="r_HVD_2_ANALOG"  Address="3" Scaling="0=3276.7,-757=16383.5" DataType="short"/>
 				<AI Name="r_LoaderA_LS_Vacuum_anlg"  Address="4" Scaling="0=3276.7,-757=16383.5" DataType="short"/>

+ 20 - 14
CyberX8_RT/Config/Devices/WagoControllerCfg.xml

@@ -67,7 +67,7 @@
 			<DO Name="c_HVD_2_ENABLE"  Address="531" Invert="false"/>			
 		</DOGroup>
 		<DOGroup Name="N11">
-			<DO Name="\c_Door_Unlock"  Address="532" Invert="false"/>
+			<DO Name="c_Door_Unlock"  Address="532" Invert="false"/>
 			<DO Name="DO21"  Address="533" Invert="false"/>			
 		</DOGroup>
 		<DOGroup Name="N12">
@@ -83,7 +83,7 @@
 			<AI Name="r_HVD_2_ANALOG"  Address="3" Scaling="0=3276.7,-757=16383.5" DataType="short"/>
 			<AI Name="r_LoaderA_LS_Vacuum_anlg"  Address="4" Scaling="0=3276.7,-757=16383.5" DataType="short"/>
 			<AI Name="r_LoaderB_LS_Vacuum_anlg"  Address="5" Scaling="0=3276.7,-757=16383.5" DataType="short"/>
-			<AI Name="AI6"  Address="6" DataType="short"/>
+			<AI Name="r_EFEM_VACUUM" Address="6" Scaling="0=3276.7,-757=16383.5" DataType="short"/>
 			<AI Name="r_LOADER_GasFlowSensor_FLOW"  Address="7" Scaling="0=3370, 500=17000" DataType="short"/>
 		</AIGroup>
 		<AIGroup Name="N2">
@@ -96,11 +96,17 @@
 			<AI Name="r_SPUF_VAC"  Address="14" Scaling="1=0,5=-757.5" DataType="short"/>
 			<AI Name="r_LOADER_GasFlowSensor_VACUUM"  Address="15" Scaling="0=3276.7,-757=16383.5" DataType="short"/>
 		</AIGroup>
+		<AIGroup Name="N3">
+			<AI Name="r_SYSTEM_EXHAUST"  Address="16" Scaling="0=0, 2=32767" DataType="short"/>
+			<AI Name="AI17"  Address="17" DataType="short"/>
+			<AI Name="AI18"  Address="18" DataType="short"/>
+			<AI Name="AI19"  Address="19" DataType="short"/>
+		</AIGroup>
 	</Ano_In>
 	<Ano_Out>
-		<AOGroup Name="N3">
-			<AO Name="AO1"  Address="512" Scaling="0=3276.7,-757=16383.5" DataType="short"/>
-			<AO Name="AO2"  Address="513" DataType="short"/>
+		<AOGroup Name="N4">
+			<AO Name="AO1"  Address="512" DataType="short"/>
+			<AO Name="A02"  Address="513" DataType="short"/>
 			<AO Name="AO3"  Address="514" DataType="short"/>
 			<AO Name="AO4"  Address="515" DataType="short"/>
 			<AO Name="AO5"  Address="516" DataType="short"/>
@@ -108,7 +114,7 @@
 			<AO Name="AO7"  Address="518" DataType="short"/>
 			<AO Name="AO8"  Address="519" DataType="short"/>
 		</AOGroup>
-		<AOGroup Name="N4">
+		<AOGroup Name="N5">
 			<AO Name="AO9"  Address="520" DataType="short"/>
 			<AO Name="AO10"  Address="521" DataType="short"/>
 			<AO Name="AO11"  Address="522" DataType="short"/>
@@ -268,10 +274,10 @@
 			</DOGroup>
 			<DOGroup Name="28">
 				<DO Name="c_METAL4_PUMP_ON"  Address="550" Invert="false"/>
-				<DO Name="DO39"  Address="551" Invert="false"/>
+				<DO Name="c_RES1_POWER_ON"  Address="551" Invert="false"/>
 			</DOGroup>
 			<DOGroup Name="29">
-				<DO Name="c_RES1_POWER_ON"  Address="552" Invert="false"/>
+				<DO Name="DO40"  Address="552" Invert="false"/>
 				<DO Name="DO41"  Address="553" Invert="false"/>
 			</DOGroup>
 		</Dig_Out>
@@ -290,20 +296,20 @@
 			</AIGroup>
 			<AIGroup Name="3">
 				<AI Name="AI8"  Address="8" Scaling="0=3276.7,-757.5=16383.5" DataType="short"/>
-				<AI Name="r_SYSTEM_EXHAUST"  Address="9" Scaling="0=0, 2=32767" DataType="short"/>
+				<AI Name="AI9"  Address="9" Scaling="0=0, 2=32767" DataType="short"/>
 				<AI Name="r_PREWET_FLOW"  Address="10" Scaling="0=3276.7,40=32767" DataType="short"/>
 				<AI Name="r_DI_WATER_PRESSURE"  Address="11" Scaling="0=0, 100=32767" DataType="short"/>
 			</AIGroup>
 			<AIGroup Name="4">
-				<AI Name="r_PUMP1_FLOW"  Address="12" Scaling="0=3276.7,100=16383.5" DataType="short"/>
+				<AI Name="r_PUMP1_FLOW"  Address="12" Scaling="0=0,100=32767" DataType="short"/>
 				<AI Name="AI13"  Address="13" Scaling="0=3276.7,40=16383.5" DataType="short"/>
-				<AI Name="r_PUMP2_FLOW"  Address="14" Scaling="0=3276.7,100=16383.5" DataType="short"/>
+				<AI Name="r_PUMP2_FLOW"  Address="14" Scaling="0=0,100=32767" DataType="short"/>
 				<AI Name="AI15"  Address="15" Scaling="0=3276.7,40=16383.5" DataType="short"/>
 			</AIGroup>
 			<AIGroup Name="5">
-				<AI Name="r_PUMP3_FLOW"  Address="16" Scaling="0=3276.7,100=16383.5" DataType="short"/>
+				<AI Name="r_PUMP3_FLOW"  Address="16" Scaling="0=0,100=32767" DataType="short"/>
 				<AI Name="AI17"  Address="17" Scaling="0=3276.7,40=16383.5" DataType="short"/>
-				<AI Name="r_PUMP4_FLOW"  Address="18" Scaling="0=3276.7,100=16383.5" DataType="short"/>
+				<AI Name="r_PUMP4_FLOW"  Address="18" Scaling="0=0,100=32767" DataType="short"/>
 				<AI Name="AI19"  Address="19" Scaling="0=3276.7,40=16383.5" DataType="short"/>
 			</AIGroup>
 			<AIGroup Name="6">
@@ -316,7 +322,7 @@
 				<AI Name="AI24"  Address="24" Scaling="0=3276.7,-757.5=16383.5" DataType="short"/>
 				<AI Name="AI25"  Address="25" Scaling="0=3276.7,-757.5=16383.5" DataType="short"/>
 				<AI Name="AI26"  Address="26" Scaling="13=0,150=32767" DataType="short"/>
-				<AI Name="r_MBS3_FLOW"  Address="27" Scaling="0=0,20=32767" DataType="short"/>
+				<AI Name="r_MBS3_FLOW"  Address="27" Scaling="0=0,40=32767" DataType="short"/>
 			</AIGroup>
 			<AIGroup Name="8">
 				<AI Name="r_QDRD1_WATER_LEVEL"  Address="28" Scaling="0=0,100=32767" DataType="short"/>

+ 29 - 3
CyberX8_RT/Modules/EFEM/EfemEntity.cs

@@ -28,6 +28,7 @@ using MECF.Framework.Common.CommonData;
 using CyberX8_RT.Modules.Loader;
 using Aitex.Core.RT.Routine;
 using MECF.Framework.Common.IOCore;
+using MECF.Framework.Common.Beckhoff.ModuleIO;
 
 namespace CyberX8_RT.Modules
 {
@@ -35,6 +36,7 @@ namespace CyberX8_RT.Modules
     {
         #region 常量
         private const string VACUUM_VALUE = "VacuumValue";
+        private const string DOOR_UNLOCK = "DoorUnlock";
         #endregion
         //private int _bigWafer = 0;
         //private int _midWafer = 0;
@@ -234,6 +236,7 @@ namespace CyberX8_RT.Modules
         /// 真空数值
         /// </summary>
         private double _vacuumValue;
+        private bool _doorUnlock;
         // Constructor
         public EfemEntity()
         {
@@ -287,6 +290,9 @@ namespace CyberX8_RT.Modules
             _lpms[1].Initialize();
             _lpms[2].Initialize();
 
+            BeckhoffIoSubscribeUpdateVariable(VACUUM_VALUE);
+            BeckhoffIoSubscribeUpdateVariable(DOOR_UNLOCK);
+
 
             OP.Subscribe($"{ModuleName.EFEM}.{EfemOperation.Home}",             (cmd, args) => { PostMsg(MSG.HomeAll); return true; });
             OP.Subscribe($"{ModuleName.EFEM}.{EfemOperation.RobotCycle}",             (cmd, args) => { 
@@ -327,8 +333,8 @@ namespace CyberX8_RT.Modules
             OP.Subscribe($"{ModuleName.Aligner1}.{EfemOperation.Align}",    (cmd, args) => { CheckToPostMessage<STATE,MSG>(eEvent.ERR_EFEM_COMMON_FAILED,ModuleName.EFEM.ToString(),(int)MSG.Align, ModuleName.Aligner1, args[0], args[1]); return true; });            
             //OP.Subscribe($"{ModuleName.Aligner1}.{EfemOperation.Vacuum}",    (cmd, args) => { CheckToPostMessage<STATE,MSG>(eEvent.ERR_EFEM_COMMON_FAILED,ModuleName.EFEM.ToString(),(int)MSG.Vacuum, args); return true; });            
             OP.Subscribe($"{ModuleName.Aligner1}.{EfemOperation.Vacuum}", (cmd, args) => { return VacuumAction(args); });            
-            
-           
+            OP.Subscribe($"{Name}.DoorUnlock", (cmd, args) => { return DoorUnlock(args); });
+
             DATA.Subscribe($"{Name}.FsmState", () => ((STATE)fsm.State).ToString(),SubscriptionAttribute.FLAG.IgnoreSaveDB);
             DATA.Subscribe($"{Name}.FsmPrevState", () => ((STATE)fsm.PrevState).ToString(), SubscriptionAttribute.FLAG.IgnoreSaveDB);
             DATA.Subscribe($"{Name}.FsmLastMessage", GetFsmLastMessage, SubscriptionAttribute.FLAG.IgnoreSaveDB);
@@ -343,6 +349,7 @@ namespace CyberX8_RT.Modules
             DATA.Subscribe($"{Name}.RobotSpeed",()=>IsIdle?SC.GetValue<int>("EFEM.DefaultMoveSpeedInPercent"):0);
             DATA.Subscribe($"{Name}.CurrentRobotCycleTime",()=>_currentCycleTimes, SubscriptionAttribute.FLAG.IgnoreSaveDB);
             DATA.Subscribe($"{Name}.VacuumValue",()=>_vacuumValue, SubscriptionAttribute.FLAG.IgnoreSaveDB);
+            DATA.Subscribe($"{Name}.DoorUnlock", () => _doorUnlock, SubscriptionAttribute.FLAG.IgnoreSaveDB);
             _robotWatch.Restart();
             return true;
         }
@@ -361,7 +368,15 @@ namespace CyberX8_RT.Modules
         /// <param name="value"></param>
         private void UpdateVariableValue(string variable, object value)
         {
-            _vacuumValue = (double)value;
+            _variableInitializeDic[variable] = true;
+            if (variable == VACUUM_VALUE)
+            {
+                _vacuumValue = (double)value;
+            }
+            else if (variable == DOOR_UNLOCK)
+            {
+                _doorUnlock = (bool)value;
+            }
         }
         private void InitFsmMap()
         {
@@ -1122,6 +1137,17 @@ namespace CyberX8_RT.Modules
             return result;
         }
 
+        private bool DoorUnlock(object[] param)
+        {
+            bool unlock = (bool)param[0];
+            string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{DOOR_UNLOCK}");
+            if (!string.IsNullOrEmpty(ioName))
+            {
+                return IOModuleManager.Instance.WriteIoValue(ioName, unlock);
+            }
+            return true;
+        }
+
         private bool fnGrip(object[] param)
         {