1添加真值表XML配置

2添加实时气体流量显示界面,封装单独用户控件
3添加后台数据绑定,添加后台数据
4修改S02数据不显示问题
This commit is contained in:
hanqiangqiang 2026-08-25 14:49:11 +08:00
parent b412ddd3ba
commit cab224c9f9
16 changed files with 3495 additions and 3439 deletions

File diff suppressed because it is too large Load Diff

View File

@ -491,7 +491,7 @@ namespace SicModules.PMs
_pmProcessAbort = new PMProcessAbortRoutine(ModuleHelper.Converter(Module), this);
//初始化加载真值表
//PMGasTrueTable = new PMGasTrueTableInitialize(Module, $"Config\\PM\\{Module}\\RealtimeGasFlow{Module}.xml");
PMGasTrueTable = new PMGasTrueTableInitialize(Module, $"Config\\PM\\{Module}\\RealtimeGasFlow{Module}.xml");
}

View File

@ -51,7 +51,7 @@ using System.Windows;
// 可以指定所有值,也可以使用以下所示的 "*" 预置版本号和修订号
// 方法是按如下所示使用“*”: :
[assembly: AssemblyVersion("1.1.0.60824")]
[assembly: AssemblyVersion("1.1.0.60825")]
[assembly: AssemblyInformationalVersion("MoS2无EFEM")]

View File

@ -2750,7 +2750,7 @@
<Label
Canvas.Left="143"
Canvas.Top="627"
Content="Mo(CO)6" />
Content="MO(CO)6" />
<controlRT:ValveBig
Canvas.Left="143"
Canvas.Top="426"

View File

@ -55,6 +55,6 @@ using System.Windows;
// by using the '*' as shown below:
[assembly: AssemblyVersion("1.1.0.60824")]
[assembly: AssemblyVersion("1.1.0.60825")]
[assembly: AssemblyInformationalVersion("MoS2无EFEM")]

View File

@ -0,0 +1,28 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
namespace MECF.Framework.Common.Aitex.Core.Common.DeviceData
{
public class GasFlowData
{
private const double RUN_LOWER_LIMIT = 2.0;
public string GasName { get; set; }
public double Flow { get; set; }
public double RunFlow { get; set; }
public double VentFlow { get; set; }
public double Mol { get; set; }
public bool IsRun => Flow > RUN_LOWER_LIMIT;
public Visibility RunVisibility => RunFlow > RUN_LOWER_LIMIT ? Visibility.Visible : Visibility.Hidden;
}
}

View File

@ -234,6 +234,7 @@
<Compile Include="Aitex\Core\Common\DeviceData\EnumRfPowerRegulationMode.cs" />
<Compile Include="Aitex\Core\Common\DeviceData\EnumRfPowerWorkMode.cs" />
<Compile Include="Aitex\Core\Common\DeviceData\FlowMeterAlarmItem.cs" />
<Compile Include="Aitex\Core\Common\DeviceData\GasFlowData.cs" />
<Compile Include="Aitex\Core\Common\DeviceData\GasFlowSum.cs" />
<Compile Include="Aitex\Core\Common\DeviceData\IDeviceData.cs" />
<Compile Include="Aitex\Core\Common\DeviceData\IoDevice\AITProcessRunData.cs" />

View File

@ -64,7 +64,7 @@ namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.GasFlow
SC.RegisterValueChangedCallback($"PM.{ModuleName}.Efficiency.{GasFlowRatioName}", OnGasFlowRatioSCChanged);
GasFlowRatioValue = SC.SafeGetValue<double>($"PM.{ModuleName}.Efficiency.{GasFlowRatioName}", 1d);
if (GasName == "PN2_Vent")
if (GasName == "O2_Vent")
DATA.Subscribe($"{ModuleName}.GasRealTimeFlow.{GasName}.FeedBackSpecial", () => PN2_VentSpecial, SubscriptionAttribute.FLAG.IgnoreSaveDB);//仅作为显示用,不存储数据库
DATA.Subscribe($"{ModuleName}.GasRealTimeFlow.{GasName}.FeedBack", () => GasFlowFeedBack);
@ -93,9 +93,9 @@ namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.GasFlow
{
//PN2是特殊计算
if (GasName == "PN2_Run")
if (GasName == "O2_Run")
_feedBack += GasTrueTableRowList[i].AccumulationPN2Run();
else if (GasName == "PN2_Vent")
else if (GasName == "O2_Vent")
{
double cache = GasTrueTableRowList[i].AccumulationPN2Run();
if (i == 2)

View File

@ -46,7 +46,7 @@ namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.GasFlow
}
if (GasName.Contains("PN2"))//PN2是特殊计算不能在此初始化
if (GasName=="O2_Run" || GasName == "O2_Vent")//PN2是特殊计算不能在此初始化
return;
foreach (var rowOutputs in XMLOutputList)
@ -111,13 +111,7 @@ namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.GasFlow
foreach (var rowOutputs in XMLOutputList)
{
if (rowOutputs.ControlName.Contains("Mfc5"))
{
//Output配置的单元格
var _mfc = DEVICE.GetDevice<IoMFC>($"{ModuleName}.{rowOutputs.ControlName}");
volue += _mfc.FeedBack * rowOutputs.Value;
}
else if (rowOutputs.ControlName.Contains("Mfc6"))
if (rowOutputs.ControlName.Contains("Mfc6"))
{
//特殊气体流量
var _mfc3 = DEVICE.GetDevice<IoMFC>($"{ModuleName}.Mfc3");

View File

@ -1585,102 +1585,6 @@ namespace MECF.Framework.UI.Client.CenterViews.Modules.PM
public bool IsTCSRunMode => V53.IsOpen;
public bool IsTMARunMode => V41.IsOpen && !V42.IsOpen;
[Subscription("GasRealTimeFlow.Ar_Run.FeedBack")]
public double ArFlow_Run { get; set; }
[Subscription("GasRealTimeFlow.Ar_Vent.FeedBack")]
public double ArFlow_Vent { get; set; }
public double ArFlow => ArFlow_Run > 0 ? ArFlow_Run : ArFlow_Vent;
public double ArMol => GetMol(ArFlow_Run);
[Subscription("GasRealTimeFlow.H2_Run.FeedBack")]
public double H2_Run { get; set; }
[Subscription("GasRealTimeFlow.H2_Vent.FeedBack")]
public double H2_Vent { get; set; }
public double H2Flow => H2_Run > 0 ? H2_Run : H2_Vent;
public double H2Mol => GetMol(H2_Run);
[Subscription("GasRealTimeFlow.PN2_Run.FeedBack")]
public double PN2_Run { get; set; }
[Subscription("GasRealTimeFlow.PN2_Vent.FeedBackSpecial")]
public double PN2_Vent { get; set; }
public double PN2Flow => PN2_Run + PN2_Vent;//=> GetPN2MFCFlow(IsPN2RunMode) * _pn2FlowRatio;
public double PN2Mol => GetMol(PN2Flow);
[Subscription("GasRealTimeFlow.HCL_Run.FeedBack")]
public double HCL_Run { get; set; }
[Subscription("GasRealTimeFlow.HCL_Vent.FeedBack")]
public double HCL_Vent { get; set; }
public double HCLFlow => HCL_Run + HCL_Vent;
public double HCLMol => GetMol(HCLFlow);
[Subscription("GasRealTimeFlow.SiH4_Run.FeedBack")]
public double SiH4_Run { get; set; }
[Subscription("GasRealTimeFlow.SiH4_Vent.FeedBack")]
public double SiH4_Vent { get; set; }
public double SiH4Flow => SiH4_Run + SiH4_Vent;
public double SIH4Mol => GetMol(SiH4Flow);
[Subscription("GasRealTimeFlow.C2H4_Run.FeedBack")]
public double C2H4_Run { get; set; }
[Subscription("GasRealTimeFlow.C2H4_Vent.FeedBack")]
public double C2H4_Vent { get; set; }
public double C2H4Flow => C2H4_Run + C2H4_Vent;
public double C2H4Mol => GetMol(C2H4Flow);
[Subscription("GasRealTimeFlow.TCS_Run.FeedBack")]
public double TCS_Run { get; set; }
[Subscription("GasRealTimeFlow.TCS_Vent.FeedBack")]
public double TCS_Vent { get; set; }
public double TCSFlow => TCS_Run + TCS_Vent;
public double TCSMol => GetMol(TCSFlow);
[Subscription("GasRealTimeFlow.TMA_Run.FeedBack")]
public double TMA_Run { get; set; }
[Subscription("GasRealTimeFlow.TMA_Vent.FeedBack")]
public double TMA_Vent { get; set; }
public double TMAFlow => TMA_Run + TMA_Vent;
public double TMAMol => GetMol(TMAFlow);
public bool ISPN2Flow => PN2Flow > 0 && IsPN2RunMode;
public bool ISHCLFlow => HCLFlow > 0 && IsHCLRunMode;
public bool ISSiH4Flow => SiH4Flow > 0 && IsSiH4RunMode;
public bool ISC2H4Flow => C2H4Flow > 0 && IsC2H4RunMode;
public bool ISArFlow => ArFlow_Run > 0;
public bool ISH2Flow => H2_Run > 0;
public bool ISTCSFlow => TCSFlow > 0 && IsTCSRunMode;
public bool ISTMAFlow => TMAFlow > 0 && IsTMARunMode;
private double GetMol(double fedback)
{
return fedback / 1000 / 22.4141;
}
#region Process Data Statistic
[Subscription("ProcessDataStat.RealtimeList")]
@ -1689,6 +1593,38 @@ namespace MECF.Framework.UI.Client.CenterViews.Modules.PM
#endregion
#region
public GasFlowData H2FlowData => GetFlow("H2");
public GasFlowData N2FlowData => GetFlow("N2");
public GasFlowData WCO6FlowData => GetFlow("WCO6");
public GasFlowData MOFlowData => GetFlow("MO");
public GasFlowData MOCO6FlowData => GetFlow("MOCO6");
public GasFlowData CS2FlowData => GetFlow("CS2");
public GasFlowData O2FlowData => GetFlow("O2");
public GasFlowData H2SeFlowData => GetFlow("H2Se");
public GasFlowData SO2FlowData => GetFlow("SO2");
public GasFlowData H2SFlowData => GetFlow("H2S");
private GasFlowData GetFlow(string gasName)
{
var run = (double)QueryDataClient.Instance.Service.GetData($"{SystemName}.GasRealTimeFlow.{gasName}_Run.FeedBack");
var vent = (double)QueryDataClient.Instance.Service.GetData($"{SystemName}.GasRealTimeFlow.{gasName}_Vent.FeedBack");
GasFlowData flow = new GasFlowData
{
GasName = gasName,
RunFlow = run,
VentFlow = vent,
Flow = run + vent,
Mol = GetMol(run)
};
return flow;
}
private double GetMol(double fedback)
{
return fedback / 1000 / 22.4141;
}
/// <summary>
/// 返回ViewModel绑定的视图对象。
/// </summary>

View File

@ -0,0 +1,64 @@
<UserControl
x:Class="Aitex.Core.UI.Control.GasFlow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:control="clr-namespace:Aitex.Core.UI.Control;assembly=MECF.Framework.UI.Core"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Aitex.Core.UI.Control"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
d:Background="#91b0cd"
d:DesignHeight="26"
d:DesignWidth="287"
mc:Ignorable="d">
<StackPanel Orientation="Horizontal">
<Grid Visibility="{Binding FlowData.RunVisibility, RelativeSource={RelativeSource AncestorType=UserControl}}">
<local:FlowPipeV2
Width="62"
Height="9"
FlowOrientation="Horizontal"
GasType="Slow"
IsFlowing="True"
RenderTransformOrigin="0.5,0.5">
<local:FlowPipeV2.RenderTransform>
<TransformGroup>
<RotateTransform Angle="180" />
</TransformGroup>
</local:FlowPipeV2.RenderTransform>
</local:FlowPipeV2>
<Border
Width="62"
Height="9"
Background="Gold"
Opacity="0.8" />
</Grid>
<Border
Width="75"
Height="26"
Background="LightGray"
BorderBrush="Gray"
BorderThickness="1">
<TextBlock Text="{Binding FlowData.RunFlow, StringFormat={}{0:f1}, RelativeSource={RelativeSource AncestorType=UserControl}}" />
</Border>
<Border
Width="75"
Height="26"
Background="Gold"
BorderBrush="Gray"
BorderThickness="1"
Opacity="0.8">
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="{Binding FlowData.GasName, RelativeSource={RelativeSource AncestorType=UserControl}}" />
</Border>
<Border
Width="75"
Height="26"
Background="LightGray"
BorderBrush="Gray"
BorderThickness="1">
<TextBlock Text="{Binding FlowData.VentFlow, StringFormat={}{0:f1}, RelativeSource={RelativeSource AncestorType=UserControl}}" />
</Border>
</StackPanel>
</UserControl>

View File

@ -0,0 +1,28 @@
using MECF.Framework.Common.Aitex.Core.Common.DeviceData;
using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
namespace Aitex.Core.UI.Control
{
/// <summary>
/// GasFlow.xaml 的交互逻辑
/// </summary>
public partial class GasFlow : UserControl
{
public GasFlow()
{
InitializeComponent();
}
public GasFlowData FlowData
{
get => (GasFlowData)GetValue(FlowDataProperty);
set => SetValue(FlowDataProperty, value);
}
public static readonly DependencyProperty FlowDataProperty =
DependencyProperty.Register(nameof(FlowData), typeof(GasFlowData), typeof(GasFlow), new PropertyMetadata(null));
}
}

View File

@ -0,0 +1,57 @@
<UserControl
x:Class="Aitex.Core.UI.Control.GasFlow2"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Aitex.Core.UI.Control"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
d:Background="#91b0cd"
d:DesignHeight="26"
d:DesignWidth="287"
mc:Ignorable="d">
<StackPanel Orientation="Horizontal">
<Border
Width="75"
Height="26"
Background="LightGray"
BorderBrush="Gray"
BorderThickness="1">
<TextBlock Text="{Binding FlowData.VentFlow, StringFormat={}{0:f1}, RelativeSource={RelativeSource AncestorType=UserControl}}" />
</Border>
<Border
Width="75"
Height="26"
Background="Cyan"
BorderBrush="Gray"
BorderThickness="1"
Opacity="0.8">
<TextBlock
HorizontalAlignment="Center"
VerticalAlignment="Center"
Text="{Binding FlowData.GasName, RelativeSource={RelativeSource AncestorType=UserControl}}" />
</Border>
<Border
Width="75"
Height="26"
Background="LightGray"
BorderBrush="Gray"
BorderThickness="1">
<TextBlock Text="{Binding FlowData.RunFlow, StringFormat={}{0:f1}, RelativeSource={RelativeSource AncestorType=UserControl}}" />
</Border>
<Grid Visibility="{Binding FlowData.RunVisibility, RelativeSource={RelativeSource AncestorType=UserControl}}">
<local:FlowPipeV2
Width="62"
Height="9"
FlowOrientation="Horizontal"
GasType="Slow"
IsFlowing="True"
RenderTransformOrigin="0.5,0.5" />
<Border
Width="62"
Height="9"
Background="Cyan"
Opacity="0.8" />
</Grid>
</StackPanel>
</UserControl>

View File

@ -0,0 +1,28 @@
using MECF.Framework.Common.Aitex.Core.Common.DeviceData;
using System;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
namespace Aitex.Core.UI.Control
{
/// <summary>
/// GasFlow2.xaml 的交互逻辑
/// </summary>
public partial class GasFlow2 : UserControl
{
public GasFlow2()
{
InitializeComponent();
}
public GasFlowData FlowData
{
get => (GasFlowData)GetValue(FlowDataProperty);
set => SetValue(FlowDataProperty, value);
}
public static readonly DependencyProperty FlowDataProperty =
DependencyProperty.Register(nameof(FlowData), typeof(GasFlowData), typeof(GasFlow2), new PropertyMetadata(null));
}
}

View File

@ -108,6 +108,12 @@
<DependentUpon>CheckValue2.xaml</DependentUpon>
</Compile>
<Compile Include="Control\ColorPicker.xaml.cs" />
<Compile Include="Control\GasFlow.xaml.cs">
<DependentUpon>GasFlow.xaml</DependentUpon>
</Compile>
<Compile Include="Control\GasFlow2.xaml.cs">
<DependentUpon>GasFlow2.xaml</DependentUpon>
</Compile>
<Compile Include="Control\GasSplitterControl.xaml.cs">
<DependentUpon>GasSplitterControl.xaml</DependentUpon>
</Compile>
@ -449,6 +455,14 @@
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Control\ColorPicker.xaml" />
<Page Include="Control\GasFlow.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Control\GasFlow2.xaml">
<SubType>Designer</SubType>
<Generator>MSBuild:Compile</Generator>
</Page>
<Page Include="Control\GasSplitterControl.xaml">
<Generator>MSBuild:Compile</Generator>
<SubType>Designer</SubType>