Commit 0db7cbfe authored by 潘栩锋's avatar 潘栩锋 🚴

1.[添加] TimeGrid界面添加数据统计,显示设置功能

2.[添加] 输出口设置界面,可以设置全0,或全FF. 输出口 的textbox 填入的是 X2格式数值 如F5
3.[添加] X光传感器基本参数.txt
parent 61de5d33
......@@ -360,4 +360,7 @@ MigrationBackup/
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
\ No newline at end of file
FodyWeavers.xsd
# backup file of FLYAutomation
*.bk.7z
\ No newline at end of file
......@@ -240,12 +240,14 @@
<StackPanel>
<StackPanel Orientation="Horizontal" >
<Button Content="输出设置" Command="{Binding SetOStatusCmd}" />
<TextBox Text="{Binding SetOStatusValue}" />
<TextBox Text="{Binding SetOStatusValueString}" />
<Button Command="{Binding AutoOStatusCmd}" >
<TextBlock>
走马灯(<Run Text="{Binding IsAutoOutRunning,Mode=OneWay}"/>)
</TextBlock>
</Button>
<Button Command="{Binding OStatus00Cmd}" Content="全0"/>
<Button Command="{Binding OStatusFFCmd}" Content="全1"/>
</StackPanel>
<StackPanel >
<StackPanel.Resources>
......
......@@ -46,6 +46,7 @@ namespace AD2021.B2.TestApp
{
public event PropertyChangedEventHandler PropertyChanged;
public string SetOStatusValueString { get; set; }
public UInt16 SetOStatusValue { get; set; }
public bool IsAutoOutRunning { get; private set; }
public string AreaWaitForAnswer { get; private set; }
......@@ -97,7 +98,8 @@ namespace AD2021.B2.TestApp
public RelayCommand SetOStatusCmd { get; private set; }
public RelayCommand AutoOStatusCmd { get; private set; }
public RelayCommand OStatus00Cmd { get; private set; }
public RelayCommand OStatusFFCmd { get; private set; }
public RelayCommand<string> SetBitCmd { get; private set; }
public RelayCommand SetPosParamCmd { get; private set; }
......@@ -129,6 +131,8 @@ namespace AD2021.B2.TestApp
ConnectCmd = new RelayCommand(Connect);
DisconnectCmd = new RelayCommand(Disconnect);
SetOStatusCmd = new RelayCommand(SetOStatus);
OStatus00Cmd = new RelayCommand(OStatus00);
OStatusFFCmd = new RelayCommand(OStatusFF);
AutoOStatusCmd = new RelayCommand(AutoOStatus);
SetBitCmd = new RelayCommand<string>(SetBit);
InitAreaCmd = new RelayCommand(InitArea);
......@@ -284,6 +288,8 @@ namespace AD2021.B2.TestApp
else {
flyad.SetOutputBit(index, true);
}
}
DispatcherTimer autoOStatusTimer;
......@@ -316,9 +322,39 @@ namespace AD2021.B2.TestApp
private void SetOStatus()
{
if(updateSetOStatusValue())
flyad.SetOutput(0x00ff, SetOStatusValue);
}
bool updateSetOStatusValue()
{
if (UInt16.TryParse(SetOStatusValueString, System.Globalization.NumberStyles.AllowHexSpecifier, null, out UInt16 num))
{
SetOStatusValue = num;
return true;
}
else
{
MessageBox.Show("无法转为U16");
return false;
}
}
void updateSetOStatusValueString()
{
SetOStatusValueString = SetOStatusValue.ToString("X2");
}
private void OStatusFF()
{
SetOStatusValue = 0xFF;
updateSetOStatusValueString();
flyad.SetOutput(0x00ff, SetOStatusValue);
}
private void OStatus00()
{
SetOStatusValue = 0x00;
updateSetOStatusValueString();
flyad.SetOutput(0x00ff, SetOStatusValue);
}
private void Disconnect()
{
flyad.Disconnect();
......
......@@ -15,15 +15,15 @@
<lvc:CartesianChart Hoverable="False" DisableAnimations="True" DataTooltip="{x:Null}" >
<lvc:CartesianChart.AxisX>
<lvc:Axis LabelFormatter="{Binding XFormatter}"
Foreground="Black" MaxValue="2000" MinValue="0"
Foreground="Black" MaxValue="{Binding ValuesCap}" MinValue="0"
>
<lvc:Axis.Separator>
<lvc:Separator Stroke="Gray" StrokeDashArray="3" Step="100"/>
<lvc:Separator Stroke="Gray" StrokeDashArray="3" Step="{Binding XStep}"/>
</lvc:Axis.Separator>
</lvc:Axis>
</lvc:CartesianChart.AxisX>
<lvc:CartesianChart.AxisY>
<lvc:Axis LabelFormatter="{Binding YFormatter}" MinValue="0"
<lvc:Axis LabelFormatter="{Binding YFormatter}" MaxValue="{Binding YMax1}" MinValue="{Binding YMin1}"
Foreground="Black" >
<lvc:Axis.Separator>
<lvc:Separator Stroke="Gray" StrokeDashArray="3" />
......@@ -38,19 +38,37 @@
PointGeometry ="{x:Null}"/>
</lvc:CartesianChart.Series>
</lvc:CartesianChart>
<StackPanel Grid.Row="0" Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Top">
<StackPanel Orientation="Horizontal" Margin="{StaticResource ControlMargin}">
<TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="均值:"/>
<TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding Average1}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="{StaticResource ControlMargin}">
<TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="最大值:"/>
<TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding Max1}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="{StaticResource ControlMargin}">
<TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="最小值:"/>
<TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding Min1}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="{StaticResource ControlMargin}">
<TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="2σ:"/>
<TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding Sigma2_1}"/>
</StackPanel>
</StackPanel>
<TextBlock Grid.Row="0" Text="AD1" Background="Yellow" Padding="20,5" HorizontalAlignment="Right" VerticalAlignment="Top"/>
<lvc:CartesianChart Grid.Row="1" Hoverable="False" DisableAnimations="True" DataTooltip="{x:Null}" >
<lvc:CartesianChart.AxisX>
<lvc:Axis LabelFormatter="{Binding XFormatter}"
Foreground="Black" MaxValue="2000" MinValue="0"
Foreground="Black" MaxValue="{Binding ValuesCap}" MinValue="0"
>
<lvc:Axis.Separator>
<lvc:Separator Stroke="Gray" StrokeDashArray="3" Step="100"/>
<lvc:Separator Stroke="Gray" StrokeDashArray="3" Step="{Binding XStep}"/>
</lvc:Axis.Separator>
</lvc:Axis>
</lvc:CartesianChart.AxisX>
<lvc:CartesianChart.AxisY>
<lvc:Axis LabelFormatter="{Binding YFormatter}" MinValue="0"
<lvc:Axis LabelFormatter="{Binding YFormatter}" MaxValue="{Binding YMax2}" MinValue="{Binding YMin2}"
Foreground="Black" >
<lvc:Axis.Separator>
<lvc:Separator Stroke="Gray" StrokeDashArray="3" />
......@@ -65,15 +83,45 @@
PointGeometry ="{x:Null}"/>
</lvc:CartesianChart.Series>
</lvc:CartesianChart>
<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Top">
<StackPanel Orientation="Horizontal" Margin="{StaticResource ControlMargin}">
<TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="均值:"/>
<TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding Average2}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="{StaticResource ControlMargin}">
<TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="最大值:"/>
<TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding Max2}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="{StaticResource ControlMargin}">
<TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="最小值:"/>
<TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding Min2}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Margin="{StaticResource ControlMargin}">
<TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="2σ:"/>
<TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding Sigma2_2}"/>
</StackPanel>
</StackPanel>
<TextBlock Grid.Row="1" Text="AD2" Background="Yellow" Padding="20,5" HorizontalAlignment="Right" VerticalAlignment="Top"/>
<StackPanel Grid.Row="2" Orientation="Horizontal">
<StackPanel Orientation="Horizontal" Margin="{StaticResource Margin.Text}">
<TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="间隔:"/>
<TextBox Text="{Binding Interval}"/>
<Button Content="设置"/>
<StackPanel Margin="{StaticResource ControlMargin}">
<TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="Y轴范围"/>
<TextBox Style="{StaticResource Styles.Text.FieldContent.Input}" Text="{Binding YRange}"/>
</StackPanel>
<StackPanel Margin="{StaticResource ControlMargin}">
<TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="X轴Max"/>
<TextBox Style="{StaticResource Styles.Text.FieldContent.Input}" Text="{Binding ValuesCap}"/>
</StackPanel>
<StackPanel Margin="{StaticResource ControlMargin}">
<TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="X轴间隔"/>
<TextBox Style="{StaticResource Styles.Text.FieldContent.Input}" Text="{Binding XStep}"/>
</StackPanel>
<StackPanel Margin="{StaticResource ControlMargin}">
<TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="间隔(ms)"/>
<TextBox Style="{StaticResource Styles.Text.FieldContent.Input}" Text="{Binding Interval}"/>
</StackPanel>
<Button Style="{StaticResource Styles.Button.Square2}" Content="清空数据" Command="{Binding ClearCmd}" />
<Button Style="{StaticResource Styles.Button.Square2}" Content="保存设置" Command="{Binding SaveCmd}" />
</StackPanel>
</Grid>
</Window>
using LiveCharts;
using CommunityToolkit.Mvvm.Input;
using LiveCharts;
using Misc;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
......@@ -45,31 +48,88 @@ namespace AD2021.B2.TestApp
}
}
public class WdTimeGridVm : INotifyPropertyChanged,IDisposable
public class WdTimeGridVm : INotifyPropertyChanged, IDisposable
{
public event PropertyChangedEventHandler PropertyChanged;
const int MaxCount = 2000;
public ChartValues<int> Data1s { get; } = new ChartValues<int>();
public ChartValues<int> Data2s { get; } = new ChartValues<int>();
public int Value1 { get; set; }
public int Average1 { get; set; }
public int Min1 { get; set; }
public int Max1 { get; set; }
public int Sigma2_1 { get; set; }
public int Value2 { get; set; }
public int Average2 { get; set; }
public int Min2 { get; set; }
public int Max2 { get; set; }
public int Sigma2_2 { get; set; }
/// <summary>
/// values容量
/// </summary>
public int ValuesCap { get; set; } = 200;
/// <summary>
/// 间隔
/// </summary>
public int Interval { get; set; } = 1;
public int Interval { get; set; } = 100;
/// <summary>
/// X轴间隔
/// </summary>
public int XStep { get; set; } = 10;
/// <summary>
/// Y轴范围
/// </summary>
public double YRange { get; set; } = double.NaN;
public double YMax1 { get; set; } = double.NaN;
public double YMin1 { get; set; } = double.NaN;
public double YMax2 { get; set; } = double.NaN;
public double YMin2 { get; set; } = double.NaN;
public RelayCommand ClearCmd { get; private set; }
public RelayCommand SaveCmd { get; private set; }
List<int> Buf1 = new List<int>();
List<int> Buf2 = new List<int>();
List<int> Ad1s = new List<int>();
List<int> Ad2s = new List<int>();
FlyADBase.FlyAd2021B2 flyAd;
public void Init(FlyADBase.FlyAd2021B2 flyAd)
public WdTimeGridVm()
{
ClearCmd = new RelayCommand(Clear);
SaveCmd = new RelayCommand(Save);
}
public void Init(FlyADBase.FlyAd2021B2 flyAd)
{
this.flyAd = flyAd;
this.flyAd.TimeGridEvent += FlyAd_TimeGridEvent;
if (!Load())
{
Save();
}
}
private void Clear()
{
Ad1s.Clear();
Ad2s.Clear();
}
private void FlyAd_TimeGridEvent(object sender, FlyADBase.TimeGridEventArgs e)
{
//确保 Data 只有 2000个数据
......@@ -99,9 +159,9 @@ namespace AD2021.B2.TestApp
}
}
if (Ad1s.Count > MaxCount)
if (Ad1s.Count > ValuesCap)
{
int removeCnt = Ad1s.Count - MaxCount;
int removeCnt = Ad1s.Count - ValuesCap;
Ad1s.RemoveRange(0, removeCnt);
Ad2s.RemoveRange(0, removeCnt);
}
......@@ -111,12 +171,142 @@ namespace AD2021.B2.TestApp
Data1s.AddRange(Ad1s);
Data2s.AddRange(Ad2s);
if (Ad1s.Count() > 10) {
Value1 = (int)Ad1s.GetRange(Ad1s.Count() - 10, 10).Average();
Value2 = (int)Ad2s.GetRange(Ad2s.Count() - 10, 10).Average();
}
else
{
Value1 = Ad1s.Last();
Value2 = Ad2s.Last();
}
Average1 = (int)Ad1s.Average();
Max1 = (int)Ad1s.Max();
Min1 = (int)Ad1s.Min();
Sigma2_1 = (int)Ad1s.Sigma() * 2;
Average2 = (int)Ad2s.Average();
Max2 = (int)Ad2s.Max();
Min2 = (int)Ad2s.Min();
Sigma2_2 = (int)Ad2s.Sigma() * 2;
if (double.IsNaN(YRange) || YRange<10)
{
YMax1 = double.NaN;
YMin1 = double.NaN;
YMax2 = double.NaN;
YMin2 = double.NaN;
}
else
{
if (IsY1OutOfShowRange()) {
YMax1 = Value1 + YRange / 2;
YMin1 = Value1 - YRange / 2;
}
if (IsY2OutOfShowRange())
{
YMax2 = Value2 + YRange / 2;
YMin2 = Value2 - YRange / 2;
}
}
return;
}
bool IsY1OutOfShowRange()
{
//超出显示范围
if (double.IsNaN(YMax1))
return true;
if (YMax1 - YMin1 != YRange)
return true;
double mid1 = (YMax1 + YMin1) / 2;
if (Math.Abs(Value1 - mid1) > YRange / 4)
return true;
return false;
}
bool IsY2OutOfShowRange()
{
//超出显示范围
if (double.IsNaN(YMax2))
return true;
if (YMax2 - YMin2 != YRange)
return true;
double mid2 = (YMax2 + YMin2) / 2;
if (Math.Abs(Value2 - mid2) > YRange / 4)
return true;
return false;
}
public void Dispose()
{
flyAd.TimeGridEvent -= FlyAd_TimeGridEvent;
}
string filePath = "timegrid.json";
private void Save()
{
WdTimeGridVmJsonDb.Save(filePath, this);
}
private bool Load()
{
return WdTimeGridVmJsonDb.Load(filePath, this);
}
}
public class WdTimeGridVmJsonDb
{
public int ValuesCap { get; set; } = 200;
public int Interval { get; set; } = 100;
public int XStep { get; set; } = 10;
/// <summary>
/// Y轴范围
/// </summary>
public double YRange { get; set; } = double.NaN;
public static bool Save(string path, WdTimeGridVm src)
{
WdTimeGridVmJsonDb jsonDb = new WdTimeGridVmJsonDb() {
Interval = src.Interval,
ValuesCap = src.ValuesCap,
XStep = src.XStep,
YRange = src.YRange
};
try
{
var json = Newtonsoft.Json.JsonConvert.SerializeObject(jsonDb, Newtonsoft.Json.Formatting.Indented);
File.WriteAllText(path, json);
return true;
}
catch(Exception e)
{
return false;
}
}
public static bool Load(string path, WdTimeGridVm src)
{
if (!File.Exists(path))
{
return false;
}
try
{
string json = File.ReadAllText(path);
var jsonDb = Newtonsoft.Json.JsonConvert.DeserializeObject<WdTimeGridVmJsonDb>(json);
src.Interval = jsonDb.Interval;
src.ValuesCap = jsonDb.ValuesCap;
src.XStep = jsonDb.XStep;
src.YRange = jsonDb.YRange;
return true;
}
catch (Exception e) {
return false;
}
}
}
}
测量光斑大小:
取决于X光与传感器之间的距离。
在30mm 下,光斑为 25mm
在10mm下,光斑为15mm
测量范围:
取决于高压与管流,与被测物。
对应高压=20000V, 管流=100uA
电池涂布正极材料
0~800g/m²
(越厚,到达传感器的X射线越小,AD盒采集到AD值越小,太小就没有精度)
采样频率:
AD盒输出最大1000Hz
重复精度:
对应高压=20000V, 管流=100uA
AD值平均 55000, 采集间隔=10ms 时, AD值的2σ = 50
AD值平均 55000, 采集间隔=100ms 时, AD值的2σ = 30
对应高压=20000V, 管流=150uA
AD值平均 55000, 采集间隔=100ms 时, AD值的2σ = 20
补充:测量光斑大小可以通过约束传感器接收区域面积而自定义。
但是面积小了,收到的能量就会变小,信噪比就变差。
在30mm下,传感器约束到10mm长条, AD值会剩下原来的 1/3。
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment