Commit d0b64cd2 authored by 潘栩锋's avatar 潘栩锋 🚴

1.修复 风环自动 只需要按清空全部加热就能对位复位。

2.修复 风环自动 修复自动加热没有降温操作。
3.修复 风环自动 对位显示记录
parent d3e29b0d
...@@ -356,6 +356,21 @@ ...@@ -356,6 +356,21 @@
<StackPanel Visibility="{Binding MaxR,Converter={StaticResource maxR2VisConv}}" DataContext="{Binding HeatBuf}"> <StackPanel Visibility="{Binding MaxR,Converter={StaticResource maxR2VisConv}}" DataContext="{Binding HeatBuf}">
<TextBlock Style="{StaticResource Text.FieldContent2}" Margin="{StaticResource ControlMargin}" FontSize="15" Text="{Binding MaxR_Time, StringFormat={}{0:MM-dd HH:mm}}" Padding="2" Background="#FFC107"/> <TextBlock Style="{StaticResource Text.FieldContent2}" Margin="{StaticResource ControlMargin}" FontSize="15" Text="{Binding MaxR_Time, StringFormat={}{0:MM-dd HH:mm}}" Padding="2" Background="#FFC107"/>
<StackPanel Orientation="Horizontal" > <StackPanel Orientation="Horizontal" >
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" DataContext="{Binding ElementName=grid_viewModel,Path=DataContext}">
<Button Content="查看" Style="{StaticResource Button.Square2}" Command="{Binding BestImageCmd}"/>
</StackPanel>
<StackPanel Margin="{StaticResource ControlMargin}">
<TextBlock Style="{StaticResource Text.FieldHeader2}" Text="ID0" />
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding MaxR_Id0}" />
</StackPanel>
</StackPanel>
<StackPanel Margin="{StaticResource ControlMargin}">
<TextBlock Style="{StaticResource Text.FieldHeader2}" Text="ID1" />
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding MaxR_Id1}" />
</StackPanel>
</StackPanel>
<StackPanel Margin="{StaticResource ControlMargin}"> <StackPanel Margin="{StaticResource ControlMargin}">
<TextBlock Style="{StaticResource Text.FieldHeader2}" Text="相关性" /> <TextBlock Style="{StaticResource Text.FieldHeader2}" Text="相关性" />
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
...@@ -383,34 +398,17 @@ ...@@ -383,34 +398,17 @@
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
<StackPanel Margin="{StaticResource ControlMargin}">
<TextBlock Style="{StaticResource Text.FieldHeader2}" Text="ID0" />
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding MaxR_Id0}" />
</StackPanel>
</StackPanel>
<StackPanel Margin="{StaticResource ControlMargin}">
<TextBlock Style="{StaticResource Text.FieldHeader2}" Text="ID1" />
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding MaxR_Id1}" />
</StackPanel>
</StackPanel>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" DataContext="{Binding ElementName=grid_viewModel,Path=DataContext}">
<Button Content="查看" Style="{StaticResource Button.Square2}" Command="{Binding BestImageCmd}"/>
</StackPanel>
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
<StackPanel Orientation="Horizontal" DataContext="{Binding HeatCell}" Visibility="{Binding ElementName=grid_viewModel,Path=DataContext.IsAutoONo,Converter={StaticResource visbilityconv},ConverterParameter=Collapsed}"> <StackPanel Orientation="Horizontal" DataContext="{Binding HeatCell}" Visibility="{Binding ElementName=grid_viewModel,Path=DataContext.IsAutoONo,Converter={StaticResource visbilityconv},ConverterParameter=Collapsed}">
<StackPanel Margin="{StaticResource ControlMargin}">
<TextBlock Style="{StaticResource Text.FieldHeader2}" Text="对位结果" />
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding AutoONoMsg}" />
</StackPanel>
</StackPanel>
<StackPanel Orientation="Horizontal" Visibility="{Binding AutoONoId0,Converter={StaticResource id2VisConv}}"> <StackPanel Orientation="Horizontal" Visibility="{Binding AutoONoId0,Converter={StaticResource id2VisConv}}">
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" DataContext="{Binding ElementName=grid_viewModel,Path=DataContext}">
<Button Content="查看" Style="{StaticResource Button.Square2}" Command="{Binding AutoONoImageCmd}"/>
</StackPanel>
<StackPanel Margin="{StaticResource ControlMargin}"> <StackPanel Margin="{StaticResource ControlMargin}">
<TextBlock Style="{StaticResource Text.FieldHeader2}" Text="对位前ID" /> <TextBlock Style="{StaticResource Text.FieldHeader2}" Text="对位前ID" />
<StackPanel Orientation="Horizontal"> <StackPanel Orientation="Horizontal">
...@@ -423,11 +421,13 @@ ...@@ -423,11 +421,13 @@
<TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding AutoONoId1}" /> <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding AutoONoId1}" />
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
<StackPanel Orientation="Horizontal" VerticalAlignment="Center" DataContext="{Binding ElementName=grid_viewModel,Path=DataContext}"> </StackPanel>
<Button Content="查看" Style="{StaticResource Button.Square2}" Command="{Binding AutoONoImageCmd}"/> <StackPanel Margin="{StaticResource ControlMargin}">
<TextBlock Style="{StaticResource Text.FieldHeader2}" Text="对位结果" />
<StackPanel Orientation="Horizontal">
<TextBlock Style="{StaticResource Text.FieldContent2}" Text="{Binding AutoONoMsg}" />
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
</StackPanel > </StackPanel >
</Border> </Border>
......
...@@ -243,7 +243,7 @@ namespace FLY.FeedbackRenZiJia.UI.Client ...@@ -243,7 +243,7 @@ namespace FLY.FeedbackRenZiJia.UI.Client
private void AutoONoImage() private void AutoONoImage()
{ {
var p = container.Resolve<PgHeatAnalyse>(); var p = container.Resolve<PgHeatAnalyse>();
if (HeatCell.AutoONoStatus == AutoONoStatusEnum.Success) //if (HeatCell.AutoONoStatus == AutoONoStatusEnum.Success)
{ {
p.SetNumber(HeatCell.AutoONoId0, HeatCell.AutoONoId1); p.SetNumber(HeatCell.AutoONoId0, HeatCell.AutoONoId1);
} }
......
...@@ -271,13 +271,13 @@ ...@@ -271,13 +271,13 @@
Fill="Transparent" Fill="Transparent"
Values="{Binding ThickPercents}" Values="{Binding ThickPercents}"
Configuration="{Binding MapperThickPercents}"/> Configuration="{Binding MapperThickPercents}"/>
<lvc:ScatterSeries <!--<lvc:ScatterSeries
PointGeometry="{StaticResource Geometry.Close}" PointGeometry="{StaticResource Geometry.Close}"
StrokeThickness ="1" StrokeThickness ="1"
Stroke="{StaticResource Brushes.Thick}" Stroke="{StaticResource Brushes.Thick}"
Fill="{StaticResource WhiteBrush}" Fill="{StaticResource WhiteBrush}"
Values="{Binding ThickPercents}" Values="{Binding ThickPercents}"
Configuration="{Binding MapperThickPercentsWithIsStable}"/> Configuration="{Binding MapperThickPercentsWithIsStable}"/>-->
</lvc:CartesianChart.Series> </lvc:CartesianChart.Series>
<lvc:CartesianChart.AxisX> <lvc:CartesianChart.AxisX>
<lvc:Axis Foreground="{StaticResource Brushes.AxisLabel}" <lvc:Axis Foreground="{StaticResource Brushes.AxisLabel}"
......
...@@ -58,7 +58,7 @@ namespace FLY.FeedbackRenZiJia.Common ...@@ -58,7 +58,7 @@ namespace FLY.FeedbackRenZiJia.Common
if (double.IsNaN(d)) if (double.IsNaN(d))
percent[i] = double.NaN; percent[i] = double.NaN;
else else
percent[i] = (int)(100 * (d - avg) / avg); percent[i] = 100 * (d - avg) / avg;
} }
} }
return percent; return percent;
......
...@@ -479,7 +479,11 @@ namespace FLY.FeedbackRenZiJia.Server ...@@ -479,7 +479,11 @@ namespace FLY.FeedbackRenZiJia.Server
{ {
//启动了自控,应该关闭检测 //启动了自控,应该关闭检测
mHeatCheck.Enable = false; mHeatCheck.Enable = false;
//复位自动对位状态
//mHeatCell.ResetAuto();
} }
} }
else if (e.PropertyName == nameof(IsConnectedWithPLC)) else if (e.PropertyName == nameof(IsConnectedWithPLC))
{ {
......
...@@ -12,6 +12,7 @@ using AutoMapper; ...@@ -12,6 +12,7 @@ using AutoMapper;
using System.IO; using System.IO;
using Newtonsoft.Json; using Newtonsoft.Json;
using FLY.Thick.Blowing.IService; using FLY.Thick.Blowing.IService;
using Misc;
namespace FLY.FeedbackRenZiJia.Server namespace FLY.FeedbackRenZiJia.Server
{ {
...@@ -209,17 +210,27 @@ namespace FLY.FeedbackRenZiJia.Server ...@@ -209,17 +210,27 @@ namespace FLY.FeedbackRenZiJia.Server
AutoONoStatus = AutoONoStatusEnum.Init; AutoONoStatus = AutoONoStatusEnum.Init;
AutoONoMsg = "等待 加热=0,厚度稳定"; AutoONoMsg = "等待 加热=0,厚度稳定";
AutoONoId0 = -1; AutoONoId0 = -1;
AutoONoId1 = -1; AutoONoId1 = 0;
} }
void AutoONoOnPoll() void AutoONoOnPoll()
{ {
if (mHeatBuf.Stability != STABILITY.OK_CORREL)
return;
if (Heats.All(h => h == 0))
{
//加热全部为0
//复位状态
ResetAuto();
}
switch (AutoONoStatus) switch (AutoONoStatus)
{ {
case AutoONoStatusEnum.Init: case AutoONoStatusEnum.Init:
{ {
if (mHeatBuf.Stability != STABILITY.OK_CORREL) //if (mHeatBuf.Stability != STABILITY.OK_CORREL)
break; // break;
if (Heats.All(h => h == 0)) if (Heats.All(h => h == 0))
{ {
...@@ -263,13 +274,19 @@ namespace FLY.FeedbackRenZiJia.Server ...@@ -263,13 +274,19 @@ namespace FLY.FeedbackRenZiJia.Server
return; return;
} }
//加热变化不够多, 变大Kp //加热变化不够多, 变大Kp
autoONoKp++; double k = autoONoKp * mHeatBuf.ThresholdMaxMin / maxMin - autoONoKp;
if (k < 0.5)
k = 0.5;
autoONoKp += k;
} }
} }
Offsets = offsets; Offsets = offsets;
UpdatePreHeats();//这句一定要加!!!! 不然没法平滑,没法加热 UpdatePreHeats();//这句一定要加!!!! 不然没法平滑,没法加热
//上面已经有平滑,不需要再执行 Smooth()
ModifyBase(); ModifyBase();
HeatApply(); HeatApply();
...@@ -279,8 +296,6 @@ namespace FLY.FeedbackRenZiJia.Server ...@@ -279,8 +296,6 @@ namespace FLY.FeedbackRenZiJia.Server
//虽然稳定了,但已经被人加热了,无法启动对位模式 //虽然稳定了,但已经被人加热了,无法启动对位模式
AutoONoStatus = AutoONoStatusEnum.Fail; AutoONoStatus = AutoONoStatusEnum.Fail;
AutoONoMsg = "加热不为0,无法启动对位模式"; AutoONoMsg = "加热不为0,无法启动对位模式";
AutoONoId0 = -1;
AutoONoId1 = -1;
return; return;
} }
} }
...@@ -388,11 +403,11 @@ namespace FLY.FeedbackRenZiJia.Server ...@@ -388,11 +403,11 @@ namespace FLY.FeedbackRenZiJia.Server
Offsets = offsets; Offsets = offsets;
UpdatePreHeats();//这句一定要加!!!! 不然没法平滑,没法加热 UpdatePreHeats();//这句一定要加!!!! 不然没法平滑,没法加热
Smooth();//平滑
if (!IsForbidUpDown)//禁止整体上移下降 if (!IsForbidUpDown)//禁止整体上移下降
ModifyBase();//自动整体上移下降 ModifyBase();//自动整体上移下降
Smooth();//平滑,它会导致Offset被修改,<0的都被删除掉
HeatApply();//执行加热 HeatApply();//执行加热
} }
...@@ -646,31 +661,35 @@ namespace FLY.FeedbackRenZiJia.Server ...@@ -646,31 +661,35 @@ namespace FLY.FeedbackRenZiJia.Server
} }
#region PreHeats 平滑处理 #region PreHeats 平滑处理
void UpdateHeatSigmas(int[] heats, out int[] heatsigmas) double[] GetHeatSigmas(int[] heats)
{ {
heatsigmas = new int[ChannelCnt]; var heatsigmas = new double[ChannelCnt];
for (int i = 0; i < ChannelCnt; i++) for (int i = 0; i < ChannelCnt; i++)
{ {
int[] dat = new int[3]; var dat = getSubArray(heats, i);
int index; heatsigmas[i] = dat.Sigma();
for (int j = 0; j < 3; j++)
{
index = i - 1 + j;
if (index < 0)
index += ChannelCnt;
else if (index >= ChannelCnt)
index -= ChannelCnt;
dat[j] = heats[index] * 100;
}
heatsigmas[i] = Misc.MyMath.Sigma(dat);
} }
return heatsigmas;
} }
void UpdateHeatSigmas() void UpdateHeatSigmas()
{ {
int[] heatsigmas; var heatsigmas = GetHeatSigmas(PreHeats);
UpdateHeatSigmas(PreHeats.ToArray(), out heatsigmas); MaxHeatSigma = heatsigmas.Max();
MaxHeatSigma = heatsigmas.Max() / 100.0; }
T[] getSubArray<T>(T[] array, int index) {
T[] dat = new T[3];
for (int j = 0; j < 3; j++)
{
int idx = index - 1 + j;
if (idx < 0)
idx += array.Count();
else if (idx >= array.Count())
idx -= array.Count();
dat[j] = array[idx];
}
return dat;
} }
/// <summary> /// <summary>
/// 平滑,不断修改PreHeats 直到HeatsSigma 合格 /// 平滑,不断修改PreHeats 直到HeatsSigma 合格
...@@ -679,53 +698,57 @@ namespace FLY.FeedbackRenZiJia.Server ...@@ -679,53 +698,57 @@ namespace FLY.FeedbackRenZiJia.Server
{ {
int[] heats = PreHeats.ToArray(); int[] heats = PreHeats.ToArray();
int[] heats2 = new int[ChannelCnt]; int[] heats2 = new int[ChannelCnt];
int[] heatsigmas;
bool hasChanged = false; bool hasChanged = false;
bool hasChanged2 = false; bool hasChanged2 = false;
// bool hasChanged3 = false; double[] heatsigmas;
do do
{ {
//1.更新sigma //1.更新sigma
UpdateHeatSigmas(heats, out heatsigmas); heatsigmas = GetHeatSigmas(heats);
//2.检测HeatsSigma, 哪里比较大,对该位置 滤波 //2.检测HeatsSigma, 哪里比较大,对该位置 滤波
hasChanged = false;
for (int i = 0; i < heats.Count(); i++) for (int i = 0; i < heats.Count(); i++)
{ {
if (heatsigmas[i] > (ThresholdHeatSigma * 100)) //不行,要滤波!!! if (heatsigmas[i] > (ThresholdHeatSigma)) //不行,要滤波!!!
{ {
//连续3个滤波 //连续3个滤波
int[] dat = new int[3]; int[] dat = getSubArray(heats, i);
int index; heats2[i] = (int)Math.Round(dat.Average());
for (int j = 0; j < 3; j++)
{ //if (heats2[i] == heats[i])
index = i - 1 + j; //{
if (index < 0) // //居然一样,修改旁边的两个的值
index += ChannelCnt; // if (i > 0) {
else if (index >= ChannelCnt) // int idx = i-1;
index -= ChannelCnt; // dat = getSubArray(heats, idx);
// heats2[idx] = (int)Math.Round(dat.Average());
dat[j] = heats[index]; // }
}
heats2[i] = (int)Math.Round(dat[0] * 0.33 + dat[1] * 0.34 + dat[2] * 0.33); // if (i == heats.Count() - 1)
// (int)Math.Round(dat.Average()); // {
if (heats2[i] != heats[i]) // int idx = 0;
hasChanged = true; // dat = getSubArray(heats, idx);
// heats2[idx] = (int)Math.Round(dat.Average());
// }
//}
} }
else else
{ {
heats2[i] = heats[i]; heats2[i] = heats[i];
} }
} }
//3.有滤波行为,继续求循环,求sigma,判断。。。。。 //3.有滤波行为,继续求循环,求sigma,判断。。。。。
if (hasChanged) hasChanged = false;
{ for (int i = 0; i < heats.Count(); i++) {
for (int i = 0; i < ChannelCnt; i++) if (heats[i]!=heats2[i]) {
{
heats[i] = heats2[i]; heats[i] = heats2[i];
hasChanged = true;
} }
hasChanged2 = true;
} }
if(hasChanged)
hasChanged2 = true;
} while (hasChanged); } while (hasChanged);
if (hasChanged2) if (hasChanged2)
...@@ -737,7 +760,7 @@ namespace FLY.FeedbackRenZiJia.Server ...@@ -737,7 +760,7 @@ namespace FLY.FeedbackRenZiJia.Server
} }
NotifyPropertyChanged(nameof(PreHeats)); NotifyPropertyChanged(nameof(PreHeats));
NotifyPropertyChanged(nameof(Offsets)); NotifyPropertyChanged(nameof(Offsets));
MaxHeatSigma = heatsigmas.Max() / 100.0; MaxHeatSigma = heatsigmas.Max();
} }
} }
#endregion #endregion
......
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