diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/PgHeatAnalyse.xaml b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/PgHeatAnalyse.xaml
index 371aaad2e8b307c9f75a84d829b6b3e499949cc2..655d2941ffd096eccfba1430de9e5bb33423e39b 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/PgHeatAnalyse.xaml
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/PgHeatAnalyse.xaml
@@ -12,8 +12,7 @@
       xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
       xmlns:lvc1="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Feng.Wpf"
       mc:Ignorable="d" 
-      d:DesignWidth="1024"
-      Background="#E6E6E6" >
+      d:DesignWidth="1024">
     <Page.Resources>
         <ResourceDictionary>
             <ResourceDictionary.MergedDictionaries>
@@ -27,16 +26,25 @@
         </ResourceDictionary>
 
     </Page.Resources>
-    <Grid d:DataContext="{StaticResource viewModel}" >
+    <Grid d:DataContext="{StaticResource viewModel}" Background="{StaticResource Brushes.Card.Background}">
         <Grid.RowDefinitions>
             <RowDefinition Height="auto" />
             <RowDefinition />
         </Grid.RowDefinitions>
-        <StackPanel Orientation="Horizontal" Background="{StaticResource Background_Title}" >
-            <Button Style="{StaticResource ButtonStyle_back2}" Command="BrowseBack"/>
+        <StackPanel Orientation="Horizontal" Background="{StaticResource Brushes.TitleBar.Background}" >
+            <Button Style="{StaticResource Styles.TitleBar.BackButton2}" Command="BrowseBack"/>
             <StackPanel Orientation="Horizontal" VerticalAlignment="Center">
-                <TextBlock Style="{StaticResource TextBlockStyle_Title}"  Text="对位分析"/>
-                <TextBlock Text="加热与厚度" FontSize="30" VerticalAlignment="Bottom" Margin="5,0" Foreground="LightGray"/>
+                <TextBlock Style="{StaticResource Styles.TitleBar.Text}"  Text="对位分析"/>
+                <StackPanel>
+                    <StackPanel Orientation="Horizontal" >
+                        <TextBlock Style="{StaticResource Styles.TitleBar.Text.Sub}" Text="有效数据" />
+                        <ToggleButton Style="{StaticResource Styles.ToggleButton.Check}" IsChecked="{Binding IsMoveByTakeEffect}" Width="30" Height="auto"  Foreground="White" />
+                    </StackPanel>
+                    <StackPanel Orientation="Horizontal" >
+                        <TextBlock Style="{StaticResource Styles.TitleBar.Text.Sub}" Text="加热改变" />
+                        <ToggleButton Style="{StaticResource Styles.ToggleButton.Check}" IsChecked="{Binding IsMoveByDiffCTime}" Width="30" Height="auto"  Foreground="White" />
+                    </StackPanel>
+                </StackPanel>
             </StackPanel>
 
         </StackPanel>
@@ -45,7 +53,7 @@
             <StackPanel>
                 <local:UcThickHeat x:Name="ucThickHeat0"/>
                 <local:UcThickHeat x:Name="ucThickHeat1"/>
-                <Border Style="{StaticResource Card.Border}" >
+                <Border Style="{StaticResource Styles.Card.Border}" >
                     <StackPanel>
 
                         <Grid Margin="48,0,0,-20" Panel.ZIndex="10">
@@ -83,7 +91,7 @@
                                            Visibility="{Binding IsError,Converter={StaticResource visbilityconv}}"/>
                             </Grid>
                             
-                            <TextBlock Grid.Column="1" Style="{StaticResource Card.Title}" Text="偏差" />
+                            <TextBlock Grid.Column="1" Style="{StaticResource Styles.Card.Title}" Text="偏差" />
                         </Grid>
                         <lvc:CartesianChart Height="300" Margin="5,2,2,2" 
                                     DisableAnimations="True" Hoverable="False" DataTooltip="{x:Null}"  >
@@ -154,71 +162,71 @@
 
                             <WrapPanel Orientation="Horizontal">
                                 <StackPanel Margin="{StaticResource ControlMargin}" >
-                                    <TextBlock Style="{StaticResource Text.FieldHeaderEditable2}" Text="加热效果" />
+                                    <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="加热效果" />
                                     <StackPanel Orientation="Horizontal">
-                                        <TextBox Style="{StaticResource Text.FieldContentInput}" 
+                                        <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" 
                                              Text="{Binding HeatEffectCurve,Converter={StaticResource heconv}}"/>
                                     </StackPanel>
                                 </StackPanel>
                                 <StackPanel Margin="{StaticResource ControlMargin}" >
-                                    <TextBlock Style="{StaticResource Text.FieldHeaderEditable2}" Text="图反向" />
-                                    <ToggleButton Style="{StaticResource ToggleButtonStyle1}" HorizontalAlignment="Left" IsChecked="{Binding IsReversed}"/>
+                                    <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="图反向" />
+                                    <ToggleButton Style="{StaticResource Styles.ToggleButton.YESNO}" HorizontalAlignment="Left" IsChecked="{Binding IsReversed}"/>
                                 </StackPanel>
                                 <StackPanel Margin="{StaticResource ControlMargin}" x:Name="stackpanel_isUsedBoltMap">
-                                    <TextBlock Style="{StaticResource Text.FieldHeaderEditable2}" Text="使用分区表" />
-                                    <ToggleButton Style="{StaticResource ToggleButtonStyle1}" HorizontalAlignment="Left" IsChecked="{Binding IsUsedMap}"/>
+                                    <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="使用分区表" />
+                                    <ToggleButton Style="{StaticResource Styles.ToggleButton.YESNO}" HorizontalAlignment="Left" IsChecked="{Binding IsUsedMap}"/>
                                 </StackPanel>
                                 <WrapPanel Orientation="Horizontal">
                                     <StackPanel Orientation="Horizontal">
                                         <StackPanel Margin="{StaticResource ControlMargin}" >
-                                            <TextBlock Style="{StaticResource Text.FieldHeaderEditable2}" Text="比例因子" />
+                                            <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="比例因子" />
                                             <StackPanel Orientation="Horizontal">
-                                                <TextBox Style="{StaticResource Text.FieldContentInput}" Text="{Binding Kp, StringFormat={}{0:F1}}"/>
-                                                <TextBlock Style="{StaticResource Text.FieldContentMm2}" Text="输出/厚度" />
+                                                <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding Kp, StringFormat={}{0:F1}}"/>
+                                                <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" Text="输出/厚度" />
                                             </StackPanel>
                                         </StackPanel>
-                                        <Button Style="{StaticResource ButtonStyle_RectangleIcon}" Command="{Binding KpCollapseCmd}" >
+                                        <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Command="{Binding KpCollapseCmd}" >
                                             <iconPacks:PackIconMaterial Kind="ArrowCollapseVertical" />
                                         </Button>
-                                        <Button Style="{StaticResource ButtonStyle_RectangleIcon}" Command="{Binding KpExpandCmd}" >
+                                        <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Command="{Binding KpExpandCmd}" >
                                             <iconPacks:PackIconMaterial Kind="ArrowExpandVertical" />
                                         </Button>
                                     </StackPanel>
 
                                     <StackPanel Orientation="Horizontal">
-                                        <StackPanel Margin="5">
-                                            <TextBlock Style="{StaticResource Text.FieldHeaderEditable2}" Text="复位区号" />
+                                        <StackPanel Margin="{StaticResource ControlMargin}" >
+                                            <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="复位区号" />
 
                                             <StackPanel Orientation="Horizontal">
-                                                <TextBox Style="{StaticResource Text.FieldContentInput}" Text="{Binding OrgBoltNo}"  />
+                                                <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding OrgBoltNo}"  />
                                             </StackPanel>
                                         </StackPanel>
 
-                                        <Button Style="{StaticResource ButtonStyle_RectangleIcon}" Command="{Binding LeftCmd}" >
+                                        <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Command="{Binding LeftCmd}" >
                                             <iconPacks:PackIconMaterial Kind="ArrowLeft" />
                                         </Button>
-                                        <Button Style="{StaticResource ButtonStyle_RectangleIcon}" Command="{Binding RightCmd}" >
+                                        <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Command="{Binding RightCmd}" >
                                             <iconPacks:PackIconMaterial Kind="ArrowRight" />
                                         </Button>
                                     </StackPanel>
                                     <StackPanel Orientation="Horizontal" Visibility="{Binding BType, Converter={StaticResource e2visconv_collapsed}, ConverterParameter={x:Static blowing:BlowingType.Fix}}">
-                                        <StackPanel Margin="5">
-                                            <TextBlock Style="{StaticResource Text.FieldHeaderEditable2}" Text="旋转角度" />
+                                        <StackPanel Margin="{StaticResource ControlMargin}" >
+                                            <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="旋转角度" />
 
                                             <StackPanel Orientation="Horizontal">
-                                                <TextBox Style="{StaticResource Text.FieldContentInput}" Text="{Binding RAngle}"  />
-                                                <TextBlock Style="{StaticResource Text.FieldContentMm}" Text="°" VerticalAlignment="Top" />
+                                                <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding RAngle}"  />
+                                                <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" Text="°" VerticalAlignment="Top" />
                                             </StackPanel>
                                         </StackPanel>
-                                        <Button Style="{StaticResource ButtonStyle_RectangleIcon}" Command="{Binding CollapseCmd}" >
+                                        <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Command="{Binding CollapseCmd}" >
                                             <iconPacks:PackIconMaterial Kind="ArrowCollapseHorizontal" />
                                         </Button>
-                                        <Button Style="{StaticResource ButtonStyle_RectangleIcon}" Command="{Binding ExpandCmd}" >
+                                        <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Command="{Binding ExpandCmd}" >
                                             <iconPacks:PackIconMaterial Kind="ArrowExpandHorizontal" />
                                         </Button>
                                     </StackPanel>
                                     <Button 
-                                        Style="{StaticResource ButtonStyle_icon}" Margin="30,5" 
+                                        Style="{StaticResource Styles.Button.Icon}" Margin="30,5" 
                                         Command="{Binding AutoCmd}" >
                                         <StackPanel>
                                             <iconPacks:PackIconMaterial Kind="AutoFix" />
@@ -237,20 +245,20 @@
                     </StackPanel>
 
                 </Border>
-                <Border Style="{StaticResource Card.Border}" Visibility="{Binding IsUsedMap,Converter={StaticResource visbilityconv}}">
+                <Border Style="{StaticResource Styles.Card.Border}" Visibility="{Binding IsUsedMap,Converter={StaticResource visbilityconv}}">
                     <StackPanel>
-                        <TextBlock Grid.Column="1" Style="{StaticResource Card.Title}" Text="分区表"/>
+                        <TextBlock Grid.Column="1" Style="{StaticResource Styles.Card.Title}" Text="分区表"/>
                         <StackPanel>
                             <StackPanel Orientation="Horizontal">
 
-                                <Button Style="{StaticResource ButtonStyle_icon}" Margin="{StaticResource ControlMargin}" 
+                                <Button Style="{StaticResource Styles.Button.Icon}" Margin="{StaticResource ControlMargin}" 
                                         Command="{Binding TestMapCmd}" >
                                     <StackPanel>
                                         <iconPacks:PackIconMaterial Kind="PlayCircle" />
                                         <TextBlock Text="测试" HorizontalAlignment="Center" />
                                     </StackPanel>
                                 </Button>
-                                <Button Style="{StaticResource ButtonStyle_icon}" Margin="{StaticResource ControlMargin}" 
+                                <Button Style="{StaticResource Styles.Button.Icon}" Margin="{StaticResource ControlMargin}" 
                                         Command="{Binding DelMapCmd}" >
                                     <StackPanel>
                                         <iconPacks:PackIconMaterial Kind="DeleteCircle" />
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/PgHeatAnalyseVm.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/PgHeatAnalyseVm.cs
index 73d96b3a4bbca9e6311eac394e29a5911d803e11..bb97b8bf14934829d3e70f868795e40c17be1929 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/PgHeatAnalyseVm.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/PgHeatAnalyseVm.cs
@@ -47,7 +47,8 @@ namespace FLY.FeedbackRenZiJia.UI.Client
         /// </summary>
         public double Kp { get; set; } = 3;
 
-
+        public bool IsMoveByTakeEffect { get; set; } = true;
+        public bool IsMoveByDiffCTime { get; set; } = true;
 
         /// <summary>
         /// 复位区号
@@ -233,6 +234,8 @@ namespace FLY.FeedbackRenZiJia.UI.Client
                 ucThickHeatVms[i] = new UcThickHeatVm();
                 ucThickHeatVms[i].Init($"记录{i+1}", bulkDbService, 0-i, Kp);
                 Misc.BindingOperations.SetBinding(this, nameof(Kp), ucThickHeatVms[i], nameof(UcThickHeatVm.Kp));
+                Misc.BindingOperations.SetBinding(this, nameof(IsMoveByTakeEffect), ucThickHeatVms[i], nameof(UcThickHeatVm.IsMoveByTakeEffect));
+                Misc.BindingOperations.SetBinding(this, nameof(IsMoveByDiffCTime), ucThickHeatVms[i], nameof(UcThickHeatVm.IsMoveByDiffCTime));
                 ucThickHeatVms[i].FrameUpdated += PgHeatAnalyseVm_FrameUpdated;
             }
 
@@ -276,18 +279,19 @@ namespace FLY.FeedbackRenZiJia.UI.Client
                 return false;
             if (feedback.NBolts != ucThickHeatVms[0].frame.Thicks.Count())
                 return false;
-            
-            if (ucThickHeatVms[0].frame.FilmLength != ucThickHeatVms[1].frame.FilmLength)
-                return false;//膜距离不同不能比较
 
-            if (BType != BlowingType.Fix) {
-                
-                if (ucThickHeatVms[0].frame.RAngle != ucThickHeatVms[1].frame.RAngle)
-                    return false;//扫描架,追边360,  旋转角度不能改变
-            }
+            //if (Math.Abs(ucThickHeatVms[0].frame.FilmLength - ucThickHeatVms[1].frame.FilmLength) > 1) 
+            //{
+            //    //偏差大于1m
+            //    return false;//膜距离不同不能比较
+            //}
 
+            //if (Math.Abs(ucThickHeatVms[0].frame.RAngle - ucThickHeatVms[1].frame.RAngle) > 20)
+            //{
+            //    //偏差大于20°
+            //    return false;//膜距离不同不能比较
+            //}
 
-            
             return true;
         }
         class CallDiffResult
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/UcThickHeat.xaml b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/UcThickHeat.xaml
index 914c095c02b2d622e741a090f93fef5893b96b97..8999c687e1d685ce05169a7278b05f6823063a11 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/UcThickHeat.xaml
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/UcThickHeat.xaml
@@ -21,7 +21,7 @@
         </ResourceDictionary>
     </UserControl.Resources>
     <Grid d:DataContext="{StaticResource viewModel}">
-        <Border Style="{StaticResource Card.Border}" >
+        <Border Style="{StaticResource Styles.Card.Border}" >
             <StackPanel>
                 <Grid>
                     <Grid.RowDefinitions>
@@ -103,7 +103,7 @@
 
                                     <StackPanel Orientation="Horizontal" Margin="5,0">
                                         <TextBlock Style="{StaticResource Text.FieldHeaderEditable2}" Text="ID:" />
-                                        <TextBox Style="{StaticResource Text.FieldContentInput2}" Text="{Binding Number}"/>
+                                        <TextBox Style="{StaticResource Text.FieldContentInput2}" Text="{Binding Number}" MinWidth="100"/>
                                     </StackPanel>
                                     <StackPanel Orientation="Horizontal" Visibility="{Binding IsVaild,Converter={StaticResource visbilityconv}}">
                                         <StackPanel Orientation="Horizontal" Margin="{StaticResource Badges.Margin}" VerticalAlignment="Bottom" >
@@ -169,7 +169,7 @@
                                 </StackPanel>
                             </StackPanel>
                             
-                            <TextBlock Style="{StaticResource Card.Title}" Text="{Binding Title}"/>
+                            <TextBlock Style="{StaticResource Styles.Card.Title}" Text="{Binding Title}"/>
                         </StackPanel>
                         <Grid
                   Margin="10,0" 
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/UcThickHeatVm.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/UcThickHeatVm.cs
index 4ba3eb9a9c3f6de9ed536816209faff5a433250f..9f6743c6fff6ed87d6657ee89e257c8dd686b2be 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/UcThickHeatVm.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgHeatAnalyse/UcThickHeatVm.cs
@@ -18,7 +18,7 @@ using IBulkDbService = FLY.FeedbackRenZiJia.IService.IBulkDbService;
 
 namespace FLY.FeedbackRenZiJia.UI.Client
 {
-    public class UcThickHeatVm: INotifyPropertyChanged
+    public class UcThickHeatVm : INotifyPropertyChanged
     {
         const int MARKNO_UPDATEFRAME = 1;
 
@@ -53,9 +53,17 @@ namespace FLY.FeedbackRenZiJia.UI.Client
 
         public long LastId { get; set; }
 
-        public long Number { get; set; } 
+        public long Number { get; set; }
+
+        /// <summary>
+        /// 急速移动,功能: 移动到下一个数据有效
+        /// </summary>
+        public bool IsMoveByTakeEffect { get; set; } = true;
+        /// <summary>
+        /// 急速移动,功能: 移动到下一个加热不同
+        /// </summary>
+        public bool IsMoveByDiffCTime { get; set; }
 
-        
         /// <summary>
         /// 有效
         /// </summary>
@@ -122,8 +130,9 @@ namespace FLY.FeedbackRenZiJia.UI.Client
 
         public Lc_ThickHeat frame;
         IBulkDbService bulkDbService;
-
-        public UcThickHeatVm() 
+        bool IsSkipNumberChanged;
+        public event Action FrameUpdated;
+        public UcThickHeatVm()
         {
             YFormatter = (y) =>
             {
@@ -148,7 +157,7 @@ namespace FLY.FeedbackRenZiJia.UI.Client
                 })
                 .Y((value) =>
                 {
-                    return value * Kp+50;
+                    return value * Kp + 50;
                 });
 
             PreCmd = new RelayCommand(Pre);
@@ -160,9 +169,9 @@ namespace FLY.FeedbackRenZiJia.UI.Client
 
 
 
-        public void Init(string title, 
+        public void Init(string title,
             IBulkDbService bulkDbService,
-            int number, double kp) 
+            int number, double kp)
         {
             this.bulkDbService = bulkDbService;
             Title = title;
@@ -170,7 +179,7 @@ namespace FLY.FeedbackRenZiJia.UI.Client
             Misc.BindingOperations.SetBinding(bulkDbService, nameof(bulkDbService.LastId), this, nameof(LastId));
             Number = number;
             UpdateFrame();
-            
+
 
             this.PropertyChanged += UcThickHeatVm_PropertyChanged;
 
@@ -179,139 +188,92 @@ namespace FLY.FeedbackRenZiJia.UI.Client
 
         private void UcThickHeatVm_PropertyChanged(object sender, PropertyChangedEventArgs e)
         {
-            if (e.PropertyName == nameof(Number)) {
+            if (e.PropertyName == nameof(Number))
+            {
                 if (IsSkipNumberChanged)
-                    return; 
+                    return;
                 UpdateFrame();
             }
         }
-        public event Action FrameUpdated;
-        public void UpdateFrame() {
+
+        public void UpdateFrame()
+        {
             PollModule.Current.Poll_JustOnce(() => {
-                _updateFrame();
+                bulkDbService.GetFrame(Number, my_GetFrameReponse, null);
             }, this, MARKNO_UPDATEFRAME);
-           
+
         }
 
-        void _updateFrame()
+        void my_GetFrameReponse(object asyncContext, object retData)
         {
-            if (IsGetStableFrame)
-            {
-                IsGetStableFrame = false;
-                bulkDbService.GetStableFrame(Number, IsPre,(asyncContext, retData) =>
-                {
-                    var reponce = retData as GetStableFrameReponse;
-
-                    if (reponce.thickHeat != null)
-                    {
-                        frame = reponce.thickHeat;
-                        Id = frame.ID;
-                        Time = frame.Time;
-                        EndTime = frame.EndTime;
-                        IsBackw = frame.IsBackw;
-                        RPeriod = frame.RPeriod;
-                        OrgBoltNo = frame.OrgBoltNo;
-                        RAngle = frame.RAngle;
-                        FilmLength = frame.FilmLength;
-                        Average = frame.Thicks.AverageNoNull();
-                        Sigma2Percent = frame.Thicks.Sigma() / Average * 2;
-
-                        Heats.Clear();
-                        Heats.AddRange(frame.Heats);
-                        XMax = frame.Heats.Count() + 1;
-
-                        double[] thickPercents = GetThickPercents();
-                        ThickPercents.Clear();
-                        ThickPercents.AddRange(thickPercents);
-
-                        IsStable = frame.IsStable;
-                        HTime = frame.HTime;
-
-
-                        IsVaild = true;
-                        IsSkipNumberChanged = true;
-                        Number = Id;
-                        IsSkipNumberChanged = false;
-                    }
-                    else
-                    {
-                        IsVaild = false;
-                    }
-
-                    FrameUpdated?.Invoke();
-                }, null);
-            }
+            var reponse = retData as GetFrameReponse;
+            if (reponse.thickHeat != null)
+                SetFrame(reponse.thickHeat);
             else
-            {
-                bulkDbService.GetFrame(Number, (asyncContext, retData) =>
-                {
-                    var reponce = retData as GetFrameReponse;
-
-                    if (reponce.thickHeat != null)
-                    {
-                        frame = reponce.thickHeat;
-                        Id = frame.ID;
-                        Time = frame.Time;
-                        EndTime = frame.EndTime;
-                        IsBackw = frame.IsBackw;
-                        RPeriod = frame.RPeriod;
-                        OrgBoltNo = frame.OrgBoltNo;
-                        RAngle = frame.RAngle;
-                        FilmLength = frame.FilmLength;
-                        Average = frame.Thicks.AverageNoNull();
-                        Sigma2Percent = frame.Thicks.Sigma() / Average * 2;
-
-                        Heats.Clear();
-                        Heats.AddRange(frame.Heats);
-                        XMax = frame.Heats.Count() + 1;
-
-                        double[] thickPercents = GetThickPercents();
-                        ThickPercents.Clear();
-                        ThickPercents.AddRange(thickPercents);
-
-                        IsStable = frame.IsStable;
-                        HTime = frame.HTime;
-
-
-
-                        IsVaild = true;
-                    }
-                    else
-                    {
-                        IsVaild = false;
-                    }
-
-                    FrameUpdated?.Invoke();
-                }, null);
-            }
+                IsVaild = false;
+
+            FrameUpdated?.Invoke();
+        }
+        void SetFrame(Lc_ThickHeat _frame)
+        {
+            frame = _frame;
+            Id = frame.ID;
+            Time = frame.Time;
+            EndTime = frame.EndTime;
+            IsBackw = frame.IsBackw;
+            RPeriod = frame.RPeriod;
+            OrgBoltNo = frame.OrgBoltNo;
+            RAngle = frame.RAngle;
+            FilmLength = frame.FilmLength;
+            Average = frame.Thicks.AverageNoNull();
+            Sigma2Percent = frame.Thicks.Sigma() / Average * 2;
+
+            Heats.Clear();
+            Heats.AddRange(frame.Heats);
+            XMax = frame.Heats.Count() + 1;
+
+            double[] thickPercents = GetThickPercents();
+            ThickPercents.Clear();
+            ThickPercents.AddRange(thickPercents);
+
+            IsStable = frame.IsStable;
+            HTime = frame.HTime;
+
+
+            IsVaild = true;
+            IsSkipNumberChanged = true;
+            Number = Id;
+            IsSkipNumberChanged = false;
         }
+
         private void Next()
         {
-            if(Number < bulkDbService.LastId)
+            if (Number < bulkDbService.LastId)
                 Number++;
         }
         private void Pre()
         {
             Number--;
         }
-        bool IsGetStableFrame;
-        bool IsPre;
-        bool IsSkipNumberChanged;
+
+
         private void NextStable()
         {
-            IsGetStableFrame = true;
-            IsPre = false;
-            Number++;
+            PollModule.Current.Poll_JustOnce(() =>
+            {
+                bulkDbService.GetFrameAdv(Number, false, IsMoveByTakeEffect, IsMoveByDiffCTime, my_GetFrameReponse, null);
+            }, this, MARKNO_UPDATEFRAME);
         }
-        private void Newest() 
+        private void Newest()
         {
             Number = bulkDbService.LastId;
         }
         private void PreStable()
         {
-            IsGetStableFrame = true;
-            IsPre = true;
-            Number--;
+            PollModule.Current.Poll_JustOnce(() =>
+            {
+                bulkDbService.GetFrameAdv(Number, true, IsMoveByTakeEffect, IsMoveByDiffCTime, my_GetFrameReponse, null);
+            }, this, MARKNO_UPDATEFRAME);
         }
         /// <summary>
         /// 以指定复位区号, 分区表 导出厚度%
@@ -319,7 +281,7 @@ namespace FLY.FeedbackRenZiJia.UI.Client
         /// <param name="orgBoltNo"></param>
         /// <param name="boltmap"></param>
         /// <returns></returns>
-        public double[] GetThickPercents(int orgBoltNo, double rAngle, IEnumerable<BoltMapCell> boltmap, bool isReversed) 
+        public double[] GetThickPercents(int orgBoltNo, double rAngle, IEnumerable<BoltMapCell> boltmap, bool isReversed)
         {
             if (frame == null)
                 return null;
@@ -328,7 +290,7 @@ namespace FLY.FeedbackRenZiJia.UI.Client
             {
                 //原数据有分区表, 先还原!!
                 Dictionary<int, int> map = new Dictionary<int, int>();
-                
+
                 IEnumerable<BoltMapCell> maps = frame.Boltmap;
                 for (int i = 0; i < maps.Count(); i++)
                     map.Add(maps.ElementAt(i).NewNo - 1, maps.ElementAt(i).OldNo - 1);
@@ -349,7 +311,7 @@ namespace FLY.FeedbackRenZiJia.UI.Client
 
 
             //平移
-            if(orgBoltNo != frame.OrgBoltNo) 
+            if (orgBoltNo != frame.OrgBoltNo)
             {
                 thks = FLY.FeedbackRenZiJia.Common.MyMath.Move(thks, orgBoltNo - frame.OrgBoltNo);
             }
@@ -362,7 +324,7 @@ namespace FLY.FeedbackRenZiJia.UI.Client
 
                 IEnumerable<BoltMapCell> maps = boltmap;
                 for (int i = 0; i < maps.Count(); i++)
-                    map.Add(maps.ElementAt(i).OldNo - 1,maps.ElementAt(i).NewNo - 1);
+                    map.Add(maps.ElementAt(i).OldNo - 1, maps.ElementAt(i).NewNo - 1);
                 thks = Misc.MyMath.Map(thks, map);
             }
 
@@ -373,17 +335,20 @@ namespace FLY.FeedbackRenZiJia.UI.Client
             thks = FLY.FeedbackRenZiJia.Common.MyMath.ZoomOut(thks, bpc);
             double[] thickpercents = new double[thks.Count()];
             double avg = thks.AverageNoNull();
-            if (!double.IsNaN(avg)) {
-                for (int i = 0; i < thks.Count(); i++) {
+            if (!double.IsNaN(avg))
+            {
+                for (int i = 0; i < thks.Count(); i++)
+                {
                     thickpercents[i] = (thks[i] - avg) / avg * 100;
                 }
             }
             return thickpercents;
         }
-        public double[] GetThickPercents() {
+        public double[] GetThickPercents()
+        {
             return GetThickPercents(frame.OrgBoltNo, frame.RAngle, frame.Boltmap, false);
         }
-        public int[] GetHeats() 
+        public int[] GetHeats()
         {
             return frame.Heats.ToArray();
         }
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgSetup.xaml b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgSetup.xaml
index 38c49f2a9b03fefbdd9aff398f2dd7b04e35aaec..7ef1a4c280a15a4d4f450864dacd1c17eb5bf0d4 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgSetup.xaml
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgSetup.xaml
@@ -55,21 +55,22 @@
                             <StackPanel Margin="{StaticResource ControlMargin}">
                                 <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="控制线" />
                                 <StackPanel Orientation="Horizontal">
-                                    <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding CtrlLine}"/>
+                                    <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding CtrlLine,StringFormat={}{0:0.#}}"/>
                                     <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" Text="%" />
                                 </StackPanel>
                             </StackPanel>
                             <StackPanel Margin="{StaticResource ControlMargin}" >
                                 <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="Kp" />
                                 <StackPanel Orientation="Horizontal">
-                                    <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding Kp, StringFormat={}{0:F1}}"/>
+                                    <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding Kp, StringFormat={}{0:0.#}}"/>
                                     <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" Text="加热/厚度" />
                                 </StackPanel>
                             </StackPanel>
                             <StackPanel Margin="{StaticResource ControlMargin}" >
                                 <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="平滑阀值" />
                                 <StackPanel Orientation="Horizontal">
-                                    <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding ThresholdHeatSigma, StringFormat={}{0:F1}}" />
+                                    <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding ThresholdHeatSigma, StringFormat={}{0:0.#}}" />
+                                    
                                 </StackPanel>
                             </StackPanel>
                             <StackPanel Margin="{StaticResource ControlMargin}" DataContext="{Binding HeatCell}">
@@ -78,6 +79,13 @@
                                     <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding MaxHeatSigma, StringFormat={}{0:F1}}"  HorizontalAlignment="Left"/>
                                 </StackPanel>
                             </StackPanel>
+                            <StackPanel Margin="{StaticResource ControlMargin}" >
+                                <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="偏差图Y轴比例" />
+                                <StackPanel Orientation="Horizontal">
+                                    <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding OffsetGraphYRangePercent, StringFormat={}{0:0.#}}" />
+                                    <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" Text="倍" />
+                                </StackPanel>
+                            </StackPanel>
                         </StackPanel >
                     </StackPanel>
 
@@ -89,7 +97,7 @@
                             <StackPanel Margin="{StaticResource ControlMargin}">
                                 <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="相关性阀值" />
                                 <StackPanel Orientation="Horizontal">
-                                    <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding ThresholdR,StringFormat={}{0:F2}}"/>
+                                    <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding ThresholdR,StringFormat={}{0:0.##}}"/>
                                 </StackPanel>
                             </StackPanel>
                             <StackPanel Margin="{StaticResource ControlMargin}">
@@ -103,13 +111,8 @@
                                 <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="查找范围" />
                                 <StackPanel Orientation="Horizontal">
                                     <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" Text="±" />
-                                    <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding SearchAngleRange}"/>
-                                    <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" VerticalAlignment="Top" Text="°" />
-                                    <TextBlock Style="{StaticResource Text.FieldContentMmInterval}" VerticalAlignment="Top" Text="|" />
-                                    <StackPanel VerticalAlignment="Bottom">
-                                        <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" Text="最小:±10°" />
-                                        <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" Text="最大:±180°" />
-                                    </StackPanel>
+                                    <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding SearchRange}"/>
+                                    <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" Text="区" />
                                 </StackPanel>
                             </StackPanel>
                             <StackPanel Orientation="Horizontal">
@@ -118,6 +121,18 @@
                                     <ToggleButton Style="{StaticResource Styles.ToggleButton.YESNO}" HorizontalAlignment="Left" IsChecked="{Binding IsAutoONo}"/>
                                 </StackPanel>
                             </StackPanel>
+                            <StackPanel Margin="{StaticResource ControlMargin}" >
+                                <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="最大Kp" />
+                                <StackPanel Orientation="Horizontal">
+                                    <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding MaxKp, StringFormat={}{0:0.#}}"/>
+                                </StackPanel>
+                            </StackPanel>
+                            <StackPanel Margin="{StaticResource ControlMargin}" >
+                                <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="最小Kp" />
+                                <StackPanel Orientation="Horizontal">
+                                    <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding MinKp, StringFormat={}{0:0.#}}"/>
+                                </StackPanel>
+                            </StackPanel>
                         </StackPanel>
                         <StackPanel Visibility="{Binding MaxR,Converter={StaticResource maxR2VisConv}}" DataContext="{Binding HeatBuf}">
                             <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Margin="{StaticResource ControlMargin}" FontSize="{StaticResource FontSize.FieldContent.Small}" Text="{Binding MaxR_Time, StringFormat={}{0:MM-dd HH:mm}}" Padding="2" Background="#FFC107"/>
@@ -128,38 +143,38 @@
                                 <StackPanel Margin="{StaticResource ControlMargin}">
                                     <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="ID0" />
                                     <StackPanel Orientation="Horizontal">
-                                        <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding MaxR_Id0}" />
+                                        <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding MaxR_Id0}" />
                                     </StackPanel>
                                 </StackPanel>
                                 <StackPanel Margin="{StaticResource ControlMargin}">
                                     <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="ID1" />
                                     <StackPanel Orientation="Horizontal">
-                                        <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding MaxR_Id1}" />
+                                        <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding MaxR_Id1}" />
                                     </StackPanel>
                                 </StackPanel>
                                 <StackPanel Margin="{StaticResource ControlMargin}">
                                     <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="相关性" />
                                     <StackPanel Orientation="Horizontal">
-                                        <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding MaxR,StringFormat={}{0:F2}}" />
+                                        <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding MaxR,StringFormat={}{0:F2}}" />
                                     </StackPanel>
                                 </StackPanel>
                                 <StackPanel Margin="{StaticResource ControlMargin}">
                                     <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="极差" />
                                     <StackPanel Orientation="Horizontal">
-                                        <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding MaxMin}" />
+                                        <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding MaxMin}" />
                                         <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" Text="%" />
                                     </StackPanel>
                                 </StackPanel>
                                 <StackPanel Margin="{StaticResource ControlMargin}">
                                     <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="最佳复位号" />
                                     <StackPanel Orientation="Horizontal">
-                                        <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding BestOrgBoltNo}" />
+                                        <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding BestOrgBoltNo}" />
                                     </StackPanel>
                                 </StackPanel>
                                 <StackPanel Margin="{StaticResource ControlMargin}">
                                     <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="最佳Kp" />
                                     <StackPanel Orientation="Horizontal">
-                                        <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding BestKp,StringFormat={}{0:F1}}" />
+                                        <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding BestKp,StringFormat={}{0:F1}}" />
                                         <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" Text="加热/厚度" />
                                     </StackPanel>
                                 </StackPanel>
@@ -169,35 +184,22 @@
                             </StackPanel>
 
                         </StackPanel>
-
-                        <StackPanel Orientation="Horizontal" DataContext="{Binding HeatCell}" Visibility="{Binding ElementName=grid_viewModel,Path=DataContext.IsAutoONo,Converter={StaticResource visbilityconv},ConverterParameter=Collapsed}">
-                            <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 Styles.Button.Square2}" Command="{Binding AutoONoImageCmd}"/>
-                                </StackPanel>
-                                <StackPanel Margin="{StaticResource ControlMargin}">
-                                    <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="对位前ID" />
-                                    <StackPanel Orientation="Horizontal">
-                                        <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding AutoONoId0}" />
-                                    </StackPanel>
-                                </StackPanel>
-                                <StackPanel Margin="{StaticResource ControlMargin}">
-                                    <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="对位后ID" />
-                                    <StackPanel Orientation="Horizontal">
-                                        <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding AutoONoId1}" />
-                                    </StackPanel>
-                                </StackPanel>
-                            </StackPanel>
-                            <StackPanel Margin="{StaticResource ControlMargin}">
-                                <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="对位结果" />
-                                <StackPanel Orientation="Horizontal">
-                                    <TextBlock Style="{StaticResource Text.FieldContent2}" Text="{Binding AutoONoMsg}" />
-                                </StackPanel>
-                            </StackPanel>
-                        </StackPanel>
                     </StackPanel >
                 </Border>
+                <Border Style="{StaticResource Styles.Card.Border}" >
+                    <StackPanel>
+                        <TextBlock Grid.Column="1" Style="{StaticResource Styles.Card.Title}" Text="分级控制"/>
+                        <StackPanel>
+                            <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding LvCtrlLines}" MinWidth="204" MinHeight="100" TextBlock.FontSize="18" TextBlock.FontWeight="Normal">
+                                <DataGrid.Columns>
+                                    <DataGridTextColumn Header="控制线%" Binding="{Binding CtrlLine}" Width="150"/>
+                                    <DataGridTextColumn Header="厚度混合数" Binding="{Binding Mix}" Width="150"/>
+                                </DataGrid.Columns>
+                            </DataGrid>
+                        </StackPanel>
+                    </StackPanel>
 
+                </Border>
                 <Border Style="{StaticResource Styles.Card.Border}">
 
                     <StackPanel >
@@ -230,7 +232,7 @@
                                 <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="电流" />
                                 <TextBlock>
                                     <TextBlock.Style>
-                                        <Style TargetType="TextBlock" BasedOn="{StaticResource Text.FieldContent}">
+                                        <Style TargetType="TextBlock" BasedOn="{StaticResource Styles.Text.FieldContent}">
                                             <Setter Property="Text" Value="Off"/>
                                             <Style.Triggers>
                                                 <DataTrigger Binding="{Binding HasElectricity}" Value="True">
@@ -246,7 +248,7 @@
                                 <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="风机" />
                                 <TextBlock>
                                     <TextBlock.Style>
-                                        <Style TargetType="TextBlock" BasedOn="{StaticResource Text.FieldContent}">
+                                        <Style TargetType="TextBlock" BasedOn="{StaticResource Styles.Text.FieldContent}">
                                             <Setter Property="Text" Value="Off"/>
                                             <Style.Triggers>
                                                 <DataTrigger Binding="{Binding HasFan}" Value="True">
@@ -263,7 +265,7 @@
                             <StackPanel Margin="{StaticResource ControlMargin}" DataContext="{Binding HeatBuf}">
                                 <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="测量时间" />
                                 <StackPanel Orientation="Horizontal">
-                                    <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding CurrTime,StringFormat={}{0:HH:mm:ss}}" />
+                                    <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding CurrTime,StringFormat={}{0:HH:mm:ss}}" />
                                 </StackPanel>
                             </StackPanel>
                             <StackPanel Margin="{StaticResource ControlMargin}" >
@@ -276,14 +278,14 @@
                             <StackPanel Margin="{StaticResource ControlMargin}" DataContext="{Binding HeatBuf}">
                                 <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="总起效时间" />
                                 <StackPanel Orientation="Horizontal">
-                                    <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding Delay, Converter={StaticResource ts2secconv}}"/>
+                                    <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding Delay, Converter={StaticResource ts2secconv}}"/>
                                     <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" Text="秒" />
                                 </StackPanel>
                             </StackPanel>
                             <StackPanel Margin="{StaticResource ControlMargin}" DataContext="{Binding Feedback}">
                                 <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="加热修改时间" />
                                 <StackPanel Orientation="Horizontal">
-                                    <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding LastChangedTime,StringFormat={}{0:HH:mm:ss}}" />
+                                    <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding LastChangedTime,StringFormat={}{0:HH:mm:ss}}" />
                                 </StackPanel>
                             </StackPanel>
                         </StackPanel>
@@ -297,10 +299,16 @@
                                 </StackPanel>
                                 <StackPanel Margin="{StaticResource ControlMargin}" DataContext="{Binding HeatBuf}">
                                     <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="2σ当前值" />
-                                    <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding Curr2Sigma, StringFormat={}{0:F1}}"/>
+                                    <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding Curr2Sigma, StringFormat={}{0:F1}}"/>
                                 </StackPanel>
 
-
+                                <StackPanel Margin="{StaticResource ControlMargin}">
+                                    <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="厚度横向平滑直径" />
+                                    <StackPanel Orientation="Horizontal">
+                                        <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding ThickSmoothRange}"/>
+                                        <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" Text="分区" />
+                                    </StackPanel>
+                                </StackPanel>
                                 <StackPanel Margin="{StaticResource ControlMargin}">
                                     <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="稳定范围" />
                                     <StackPanel Orientation="Horizontal">
@@ -321,13 +329,13 @@
                             <StackPanel Margin="{StaticResource ControlMargin}">
                                 <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="稳定性" />
                                 <StackPanel Orientation="Horizontal">
-                                    <TextBlock Style="{StaticResource Text.FieldContent}" Text="{Binding CurrR, StringFormat={}{0:F2}}" />
+                                    <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding CurrR, StringFormat={}{0:F2}}" />
                                 </StackPanel>
                             </StackPanel>
                             <StackPanel Margin="{StaticResource ControlMargin}">
                                 <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="稳定状态" />
                                 <StackPanel Orientation="Horizontal">
-                                    <TextBlock Style="{StaticResource Text.FieldContent}"  Text="{Binding Stability, Converter={StaticResource stableconv}}"  />
+                                    <TextBlock Style="{StaticResource Styles.Text.FieldContent}"  Text="{Binding Stability, Converter={StaticResource stableconv}}"  />
                                 </StackPanel>
                             </StackPanel>
                         </StackPanel>
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgSetup.xaml.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgSetup.xaml.cs
index 811a3d086b9faa6957ad6fa0e6ec1965eab045a2..30e602de1c584fbef16570f406a86ea344ce6b73 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgSetup.xaml.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/PgSetup.xaml.cs
@@ -18,6 +18,7 @@ using FLY.FeedbackRenZiJia.IService;
 using System.ComponentModel;
 using Unity;
 using GalaSoft.MvvmLight.Command;
+using System.Collections.ObjectModel;
 
 namespace FLY.FeedbackRenZiJia.UI.Client
 {
@@ -62,13 +63,22 @@ namespace FLY.FeedbackRenZiJia.UI.Client
         public bool HasCheck { get; set; }
         public int Delay { get; set; }
         public int ThresholdSigmaMax { get; set; }
-        public int SearchAngleRange { get; set; }
+        public int SearchRange { get; set; }
         public int StableRange { get; set; }
         public int[] HeatEffectCurve { get; set; }
         public bool IsForbidUpDown { get; set; }
 
-        public int CtrlLine { get; set; }
+        public double CtrlLine { get; set; }
         public double Kp { get; set; }
+        /// <summary>
+        /// 自动计算时,Kp最大值
+        /// </summary>
+        public double MaxKp { get; set; } = 5;
+
+        /// <summary>
+        /// 自动计算时,Kp最大值
+        /// </summary>
+        public double MinKp { get; set; } = 1;
 
         /// <summary>
         /// 自动对位
@@ -89,6 +99,18 @@ namespace FLY.FeedbackRenZiJia.UI.Client
         /// 最大功率
         /// </summary>
         public int MaxHeat { get; set; }
+
+        public double OffsetGraphYRangePercent { get; set; }
+
+        /// <summary>
+        /// 分级控制
+        /// </summary>
+        public ObservableCollection<LvCtrlLine> LvCtrlLines { get; } = new ObservableCollection<LvCtrlLine>();
+
+        /// <summary>
+        /// 对厚度数据横向平滑 单位加热棒数。 特别的当Smooth = ChannelCnt/2 就是膜泡的偏心度
+        /// </summary>
+        public int ThickSmoothRange { get; set; }
         #endregion
 
         #region Command
@@ -96,7 +118,6 @@ namespace FLY.FeedbackRenZiJia.UI.Client
         public RelayCommand ApplyCmd { get; }
 
         public RelayCommand BestImageCmd { get; }
-        public RelayCommand AutoONoImageCmd { get; }
         #endregion
 
         public IFeedbackHeatService Feedback{ get; private set; }
@@ -113,7 +134,6 @@ namespace FLY.FeedbackRenZiJia.UI.Client
             ApplyCmd = new RelayCommand(Apply);
 
             BestImageCmd = new RelayCommand(BestImage);
-            AutoONoImageCmd = new RelayCommand(AutoONoImage);
         }
         [InjectionMethod]
         public void Init(
@@ -133,14 +153,31 @@ namespace FLY.FeedbackRenZiJia.UI.Client
             Misc.BindingOperations.SetBinding(this.HeatCell, nameof(IHeatCellService.IsForbidUpDown), this, nameof(IsForbidUpDown));
             Misc.BindingOperations.SetBinding(this.HeatCell, nameof(IHeatCellService.CtrlLine), this, nameof(CtrlLine));
             Misc.BindingOperations.SetBinding(this.HeatCell, nameof(IHeatCellService.Kp), this, nameof(Kp));
+            Misc.BindingOperations.SetBinding(this.HeatCell, nameof(IHeatCellService.MaxKp), this, nameof(MaxKp));
+            Misc.BindingOperations.SetBinding(this.HeatCell, nameof(IHeatCellService.MinKp), this, nameof(MinKp));
+            
             Misc.BindingOperations.SetBinding(this.HeatCell, nameof(IHeatCellService.MaxHeat), this, nameof(MaxHeat));
             Misc.BindingOperations.SetBinding(this.HeatCell, nameof(IHeatCellService.IsAutoONo), this, nameof(IsAutoONo));
 
+            Misc.BindingOperations.SetBinding(this.HeatCell, nameof(IHeatCellService.LvCtrlLines), () => {
+                LvCtrlLines.Clear();
+                if (this.HeatCell.LvCtrlLines == null)
+                    return;
+                if (this.HeatCell.LvCtrlLines.Count() == 0)
+                    return;
+                foreach (var lvCtrlLine in this.HeatCell.LvCtrlLines)
+                {
+                    LvCtrlLines.Add(new LvCtrlLine() { CtrlLine = lvCtrlLine.CtrlLine, Mix = lvCtrlLine.Mix });
+                }
+            });
+            Misc.BindingOperations.SetBinding(this.HeatCell, nameof(IHeatCellService.ThickSmoothRange), this, nameof(ThickSmoothRange));
+
+
             Misc.BindingOperations.SetBinding(this.Feedback, nameof(IFeedbackHeatService.Step), this, nameof(Step));
             Misc.BindingOperations.SetBinding(this.Feedback, nameof(IFeedbackHeatService.HasCheck), this, nameof(HasCheck));
             Misc.BindingOperations.SetBinding(this.Feedback, nameof(IFeedbackHeatService.Delay), this, nameof(Delay));
             Misc.BindingOperations.SetBinding(this.Feedback, nameof(IFeedbackHeatService.HasCheckFilmVelocity), this, nameof(HasCheckFilmVelocity));
-
+            Misc.BindingOperations.SetBinding(this.Feedback, nameof(IFeedbackHeatService.OffsetGraphYRangePercent), this, nameof(OffsetGraphYRangePercent));
 
             Misc.BindingOperations.SetBinding(this.HeatBuf, nameof(IHeatBufService.ThresholdSigmaMax), this, nameof(ThresholdSigmaMax));
             Misc.BindingOperations.SetBinding(this.HeatBuf, nameof(IHeatBufService.StableRange), this, nameof(StableRange));
@@ -154,7 +191,7 @@ namespace FLY.FeedbackRenZiJia.UI.Client
             Misc.BindingOperations.SetBinding(this.HeatBuf, nameof(IHeatBufService.ThresholdR), this, nameof(ThresholdR));
             Misc.BindingOperations.SetBinding(this.HeatBuf, nameof(IHeatBufService.ThresholdMaxMin), this, nameof(ThresholdMaxMin));
 
-            Misc.BindingOperations.SetBinding(this.HeatBuf, nameof(IHeatBufService.SearchAngleRange), this, nameof(SearchAngleRange));
+            Misc.BindingOperations.SetBinding(this.HeatBuf, nameof(IHeatBufService.SearchRange), this, nameof(SearchRange));
             #endregion
         }
 
@@ -215,15 +252,34 @@ namespace FLY.FeedbackRenZiJia.UI.Client
             HeatCell.IsForbidUpDown = this.IsForbidUpDown;
             HeatCell.CtrlLine = this.CtrlLine;
             HeatCell.Kp = this.Kp;
+            HeatCell.MaxKp = this.MaxKp;
+            HeatCell.MinKp = this.MinKp;
+
             HeatCell.MaxHeat = this.MaxHeat;
             HeatCell.IsAutoONo = this.IsAutoONo;
+            if (LvCtrlLines.Count() > 0)
+            {
+                var lvCtrlLines = new LvCtrlLine[LvCtrlLines.Count()];
+
+                for (int i = 0; i < LvCtrlLines.Count(); i++)
+                {
+                    var lvCtrlLine = LvCtrlLines[i];
+                    lvCtrlLines[i] = new LvCtrlLine() { CtrlLine = lvCtrlLine.CtrlLine, Mix = lvCtrlLine.Mix };
+                }
+                HeatCell.LvCtrlLines = lvCtrlLines;
+            }
+            else
+            {
+                HeatCell.LvCtrlLines = null;
+            }
+            HeatCell.ThickSmoothRange = ThickSmoothRange;
 
 
             Feedback.Step=this.Step;
             Feedback.HasCheckFilmVelocity=this.HasCheckFilmVelocity;
             Feedback.HasCheck=this.HasCheck;
             Feedback.Delay=this.Delay;
-
+            Feedback.OffsetGraphYRangePercent = this.OffsetGraphYRangePercent;
 
 
 
@@ -232,7 +288,7 @@ namespace FLY.FeedbackRenZiJia.UI.Client
             HeatBuf.HeatEffectCurve=this.HeatEffectCurve;
             HeatBuf.ThresholdR = this.ThresholdR;
             HeatBuf.ThresholdMaxMin = this.ThresholdMaxMin;
-            HeatBuf.SearchAngleRange = this.SearchAngleRange;
+            HeatBuf.SearchRange = this.SearchRange;
 
             HeatCell.Apply();
             HeatBuf.Apply();
@@ -240,15 +296,6 @@ namespace FLY.FeedbackRenZiJia.UI.Client
             FLY.ControlLibrary.Window_Tip.Show("参数设置", "成功", TimeSpan.FromSeconds(2));
         }
 
-        private void AutoONoImage()
-        {
-            var p = container.Resolve<PgHeatAnalyse>();
-            //if (HeatCell.AutoONoStatus == AutoONoStatusEnum.Success)
-            {
-                p.SetNumber(HeatCell.AutoONoId0, HeatCell.AutoONoId1);
-            }
-            MultiLayout.FlyLayoutManager.NavigationService.Navigate(p);
-        }
 
         private void BestImage()
         {
@@ -354,8 +401,6 @@ namespace FLY.FeedbackRenZiJia.UI.Client
                     return "等待:相关性不够";
                 case STABILITY.OK_CORREL:
                     return "稳定:相关性高";
-                case STABILITY.OK_HEAT_AND_THICK_CORREL:
-                    return "稳定:加热相关性高";
                 default:
                     return "???";
             }
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/Properties/AssemblyInfo.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/Properties/AssemblyInfo.cs
index c6947a39379632c64dd5d521a2f069fe367c9900..aa1bbf36cea86cbb397984d28433b86febccec90 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/Properties/AssemblyInfo.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/Properties/AssemblyInfo.cs
@@ -12,7 +12,7 @@ using System.Windows;
 [assembly: AssemblyConfiguration("")]
 [assembly: AssemblyCompany("佛山枫莱尔自动化技术有限公司")]
 [assembly: AssemblyProduct("自动风环")]
-[assembly: AssemblyCopyright("Copyright © 2020  FLYAutoamtion")]
+[assembly: AssemblyCopyright("Copyright © 2022 FLYAutoamtion")]
 [assembly: AssemblyTrademark("")]
 [assembly: AssemblyCulture("")]
 
@@ -51,7 +51,7 @@ using System.Windows;
 // 可以指定所有这些值,也可以使用“内部版本号”和“修订号”的默认值,
 // 方法是按如下所示使用“*”:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("6.0.0.0")]
-[assembly: AssemblyFileVersion("6.0.0.0")]
+[assembly: AssemblyVersion("7.4.0.0")]
+[assembly: AssemblyFileVersion("7.4.0.0")]
 [assembly: Guid("18607932-ECBC-4292-A3DE-5864B7FB14DB")]
 
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/Themes/Styles.xaml b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/Themes/Styles.xaml
index f9f0132830e3a3a9b9028cb4723052c989d95265..d55cd43786f7657ab8348ff98924acc0536dc1ce 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/Themes/Styles.xaml
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/Themes/Styles.xaml
@@ -7,75 +7,26 @@
         <ResourceDictionary Source="pack://application:,,,/FLY.ControlLibrary;component/Converter/Dictionary_MyConv.xaml"/>
         <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Base.UI;component/Converter/Dictionary_MyConv.xaml"/>
         <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Base.UI;component/Themes/Styles.xaml"/>
+        <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Base.UI;component/Themes/GraphStyle.xaml"/>
         <ResourceDictionary Source="pack://application:,,,/FLY.FeedbackRenZiJia.UI.Client;component/Themes/Colors.xaml"/>
     </ResourceDictionary.MergedDictionaries>
 
-    <Style x:Key="Button.AccentedSquare2" TargetType="Button" BasedOn="{StaticResource MahApps.Styles.Button.Square.Accent}">
-        <Setter Property="FontSize" Value="18"/>
-        <Setter Property="Width" Value="120"/>
-        <Setter Property="Height" Value="40"/>
-        <Setter Property="Margin" Value="5"/>
-    </Style>
-    <Style x:Key="Button.Square2" TargetType="Button" BasedOn="{StaticResource MahApps.Styles.Button.Square}">
-        <Setter Property="FontSize" Value="18"/>
-        <Setter Property="Width" Value="120"/>
-        <Setter Property="Height" Value="40"/>
-        <Setter Property="Margin" Value="5"/>
-    </Style>
-    <Style x:Key="Button.HighlightedSquare2" TargetType="Button" BasedOn="{StaticResource MahApps.Styles.Button.Square.Highlight}">
-        <Setter Property="FontSize" Value="18"/>
-        <Setter Property="Width" Value="120"/>
-        <Setter Property="Height" Value="40"/>
-        <Setter Property="Margin" Value="5"/>
-    </Style>
-
-    <DropShadowEffect x:Key="Card.Shadow" Color="#303030" Opacity=".25" BlurRadius="5" ShadowDepth="3"/>
-
-    <Style x:Key="Card.Title" TargetType="TextBlock">
-        <Setter Property="Background" Value="#FFC107"/>
-        <Setter Property="FontSize" Value="18"/>
-        <Setter Property="HorizontalAlignment" Value="Right"/>
-        <Setter Property="Padding" Value="20 5"/>
-        <Setter Property="FontWeight" Value="Bold"/>
-        <Setter Property="VerticalAlignment" Value="Top"/>
-    </Style>
 
-    <Style x:Key="Card.Border" TargetType="Border">
-        <Setter Property="Margin" Value="5"/>
-        <Setter Property="Background" Value="White"/>
-        <Setter Property="CornerRadius" Value="3"/>
-        <Setter Property="Padding" Value="5"/>
-        <Setter Property="BorderThickness" Value="1"/>
-        <Setter Property="BorderBrush" Value="#EBEBEB"/>
-        <Setter Property="Effect" Value="{StaticResource Card.Shadow}"/>
-    </Style>
-
-
-    <Style TargetType="TextBlock" BasedOn="{StaticResource TextBlockStyle_FieldHeader}" x:Key="Text.FieldHeader2">
+    <Style TargetType="TextBlock" BasedOn="{StaticResource Styles.Text.FieldHeader}" x:Key="Text.FieldHeader2">
         <Setter Property="FontSize" Value="15" />
     </Style>
-    <Style TargetType="TextBlock" BasedOn="{StaticResource TextBlockStyle_FieldHeaderEditable}" x:Key="Text.FieldHeaderEditable2">
+    <Style TargetType="TextBlock" BasedOn="{StaticResource Styles.Text.FieldHeader.Editable}" x:Key="Text.FieldHeaderEditable2">
         <Setter Property="FontSize" Value="15" />
     </Style>
-    <Style TargetType="TextBlock" BasedOn="{StaticResource TextBlockStyle_FieldHeaderEditable}" x:Key="Text.FieldHeaderEditable"/>
-
-    <Style TargetType="TextBox" BasedOn="{StaticResource TextBoxStyle_FieldContent}" x:Key="Text.FieldContentInput">
-        <Setter Property="Background"  Value="WhiteSmoke"/>
-    </Style>
 
-    <Style TargetType="TextBox" BasedOn="{StaticResource TextBoxStyle_FieldContent}" x:Key="Text.FieldContentInput2">
+    <Style TargetType="TextBox" BasedOn="{StaticResource Styles.Text.FieldContent.Input.Card}" x:Key="Text.FieldContentInput2">
         <Setter Property="FontSize" Value="20" />
-        <Setter Property="Background"  Value="WhiteSmoke"/>
-        <Setter Property="MinWidth"  Value="100"/>
     </Style>
-    <Style TargetType="TextBlock" BasedOn="{StaticResource TextBlockStyle_FieldContent}" x:Key="Text.FieldContent2">
+    <Style TargetType="TextBlock" BasedOn="{StaticResource Styles.Text.FieldContent}" x:Key="Text.FieldContent2">
         <Setter Property="FontSize" Value="15" />
     </Style>
-    <Style TargetType="TextBlock" BasedOn="{StaticResource TextBlockStyle_FieldContent}" x:Key="Text.FieldContent"/>
 
-    <Style TargetType="TextBlock" BasedOn="{StaticResource TextBlockStyle_FieldContent_mm}" x:Key="Text.FieldContentMm"/>
-    <Style TargetType="TextBlock" BasedOn="{StaticResource TextBlockStyle_FieldContent_mm_interval}" x:Key="Text.FieldContentMmInterval"/>
-    <Style TargetType="TextBlock" BasedOn="{StaticResource TextBlockStyle_FieldContent_mm}" x:Key="Text.FieldContentMm2">
+    <Style TargetType="TextBlock" BasedOn="{StaticResource Styles.Text.FieldContent.Unit}" x:Key="Text.FieldContentMm2">
         <Setter Property="FontSize" Value="15" />
     </Style>
     <Style x:Key="AxisSectionStyle" TargetType="lvc:AxisSection" >
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraph.xaml b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraph.xaml
index f94f64878e400bf10e91c1ae4df604f691841353..30e125f6ef38aad9be4e271ba418c9566bc9f74c 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraph.xaml
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraph.xaml
@@ -4,7 +4,9 @@
       xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
       xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
       xmlns:local="clr-namespace:FLY.FeedbackRenZiJia.UI.Client.UiModule"
-      xmlns:ed="http://schemas.microsoft.com/expression/2010/drawing" xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf" xmlns:lvc1="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Feng.Wpf"
+      xmlns:ed="http://schemas.microsoft.com/expression/2010/drawing" 
+    xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf" 
+    xmlns:lvc1="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Feng.Wpf"
       mc:Ignorable="d" 
       d:DesignHeight="400" d:DesignWidth="980"
 	 >
@@ -42,11 +44,6 @@
                 <Setter Property="DataLabel" Value="False"/>
             </Style>
             <local:AirRingGraphVmUt x:Key="viewModel"/>
-
-            <Geometry x:Key="Geometry.Close">
-        M15.59,7L12,10.59L8.41,7L7,8.41L10.59,12L7,15.59L8.41,17L12,13.41L15.59,17L17,15.59L13.41,12L17,8.41L15.59,7Z
-            </Geometry>
-
         </ResourceDictionary>
     </UserControl.Resources>
     <Border Style="{StaticResource BorderStyle_module}" >
@@ -90,8 +87,8 @@
                         <TextBlock Text="设置" />
                     </StackPanel>
                 </Button>
-
-                <StackPanel Orientation="Horizontal" Grid.Column="1" Visibility="{Binding CheckEnable, Converter={StaticResource visbilityconv},ConverterParameter=HiddenWhenTrue}" >
+                <!--正在检测时,把手动按钮全部隐藏-->
+                <StackPanel Orientation="Horizontal" Grid.Column="1" Visibility="{Binding FeedbackHeat.CheckEnable, Converter={StaticResource visbilityconv},ConverterParameter=HiddenWhenTrue}" >
                     <Button Command="{Binding BaseUpCmd}" >
                         <StackPanel>
                             <Image Source="/FLY.FeedbackRenZiJia.UI.Client;component/Images/up.png"/>
@@ -209,6 +206,7 @@
                                                 <Style.Triggers>
                                                     <DataTrigger Binding="{Binding CheckEnable}" Value="False">
                                                         <Setter Property="Source" Value="/FLY.FeedbackRenZiJia.UI.Client;component/Images/nurse_gray.png"/>
+                                                        <Setter Property="Opacity" Value="0.7"/>
                                                     </DataTrigger>
                                                 </Style.Triggers>
                                             </Style>
@@ -271,13 +269,6 @@
                         Fill="Transparent"
                         Values="{Binding ThickPercents}"
                         Configuration="{Binding MapperThickPercents}"/>
-                        <!--<lvc:ScatterSeries
-                        PointGeometry="{StaticResource Geometry.Close}"
-                        StrokeThickness ="1"
-                        Stroke="{StaticResource Brushes.Thick}"
-                        Fill="{StaticResource WhiteBrush}"
-                        Values="{Binding ThickPercents}"
-                        Configuration="{Binding MapperThickPercentsWithIsStable}"/>-->
                     </lvc:CartesianChart.Series>
                     <lvc:CartesianChart.AxisX>
                         <lvc:Axis Foreground="{StaticResource Brushes.AxisLabel}" 
@@ -297,13 +288,73 @@
                     <lvc:CartesianChart.AxisY>
                         <lvc:Axis Foreground="{StaticResource Brushes.AxisLabel}" 
                               LabelFormatter="{Binding YFormatter}"  
-                              MinValue="-50" MaxValue="50" FontFamily="Courier New" >
+                              MinValue="{Binding OffsetGraphYMin}" MaxValue="{Binding OffsetGraphYMax}" FontFamily="Courier New" >
                             <lvc:Axis.Separator>
-                                <lvc:Separator Stroke="{StaticResource Brushes.AxisSeparator}" Step="10"/>
+                                <lvc:Separator Stroke="{StaticResource Brushes.AxisSeparator}" Step="{Binding OffsetGraphStep}"/>
                             </lvc:Axis.Separator>
                         </lvc:Axis>
                     </lvc:CartesianChart.AxisY>
                 </lvc:CartesianChart>
+                <Grid>
+                    <Grid.RowDefinitions>
+                        <RowDefinition Height="auto"/>
+                        <RowDefinition/>
+                    </Grid.RowDefinitions>
+                    <Grid.ColumnDefinitions>
+                        <ColumnDefinition Width="auto"/>
+                        <ColumnDefinition Width="400*"/>
+                        <ColumnDefinition Width="280*"/>
+                    </Grid.ColumnDefinitions>
+                    <Grid Grid.Column="2" Grid.RowSpan="2" Panel.ZIndex="1" 
+                  Margin="10,0" VerticalAlignment="Top" HorizontalAlignment="Right">
+                        <Viewbox MaxHeight="25">
+                            <StackPanel Margin="{StaticResource ControlMargin}">
+                                <StackPanel.Resources>
+                                    <Style TargetType="Viewbox">
+                                        <Setter Property="Height" Value="25"/>
+                                        <Setter Property="Width" Value="120"/>
+                                        <Setter Property="HorizontalAlignment" Value="Left"/>
+                                        <Setter Property="VerticalAlignment" Value="Top"/>
+                                    </Style>
+                                </StackPanel.Resources>
+                                <StackPanel Orientation="Horizontal">
+                                    <Viewbox >
+                                        <StackPanel Orientation="Horizontal">
+                                            <TextBlock Style="{StaticResource TitleStyle}" 
+                                           Foreground="{StaticResource WhiteBrush}"
+                                           Background="{StaticResource TextBrush}"
+                                           Opacity="0.8"
+                                           Text="混合: "
+                                           />
+                                            <TextBlock Style="{StaticResource ValueStyle}" 
+                                           Foreground="{StaticResource WhiteBrush}"
+                                           Background="{StaticResource TextBrush}"
+                                           Text="{Binding CurrMix,Mode=OneWay}" 
+                                           />
+                                        </StackPanel>
+                                    </Viewbox>
+                                    <Viewbox>
+                                        <StackPanel Orientation="Horizontal" >
+                                            <TextBlock Style="{StaticResource TitleStyle}" 
+                                               Foreground="{StaticResource WhiteBrush}"
+                                            Background="{StaticResource TextBrush}"
+                                           Text="  2σ: " 
+                                           />
+                                            <TextBlock Style="{StaticResource ValueStyle}" 
+                                           Foreground="{StaticResource WhiteBrush}"
+                                           Background="{StaticResource TextBrush}"
+                                           >
+                                                <Run Text="{Binding CurrSigma2,Mode=OneWay, StringFormat={}{0:F1}}"/>%
+                                            </TextBlock>
+                                        </StackPanel>
+                                    </Viewbox>
+                                </StackPanel>
+
+                            </StackPanel>
+                        </Viewbox>
+
+                    </Grid>
+                </Grid>
                 <lvc:CartesianChart Grid.Row="1" Hoverable="False" DisableAnimations="True" DataTooltip="{x:Null}" Margin="5,2,2,2"
                                 MouseMove="UIElement_OnMouseMove" MouseDown="UIElement_MouseDown" MouseUp="UIElement_MouseUp">
                     <lvc:CartesianChart.Series>
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraph.xaml.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraph.xaml.cs
index ab3f918fe14494a0abd2ca9634b6bbfec7048ddc..a5f3847ed33e549431b845d4d352944f4d61014c 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraph.xaml.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraph.xaml.cs
@@ -47,11 +47,13 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule
             IUnityContainer container,
             IFeedbackHeatService feedback,
             IHeatBufService heatBuf,
-            IHeatCellService heatCell)
+            IHeatCellService heatCell,
+            FLY.Thick.Blowing.IService.IBlowingFixProfileService profileService
+            )
         {
             this.container = container;
             viewModel = new AirRingGraphVm();
-            viewModel.Init(feedback, heatBuf, heatCell, btnClearH);
+            viewModel.Init(feedback, heatBuf, heatCell, btnClearH, profileService);
             this.DataContext = viewModel;
         }
 
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraphVm.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraphVm.cs
index 33662c7331ca1d7e3c50bb7b33a3c383ec87867f..fa7a05ba823d9df1b5de3bd0eedce472193bd48b 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraphVm.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraphVm.cs
@@ -3,6 +3,7 @@ using FLY.FeedbackRenZiJia.IService;
 using GalaSoft.MvvmLight.Command;
 using LiveCharts;
 using LiveCharts.Configurations;
+using Misc;
 using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
 using System;
 using System.Collections.Generic;
@@ -24,7 +25,16 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule
 
         #region 图表控制
         public Func<double, string> YFormatter { get; private set; }
-        public int XMax { get; private set; }
+        public int XMax { get; protected set; }
+
+        public int OffsetGraphYMax { get; protected set; } = 50;
+        public int OffsetGraphYMin { get; protected set; } = -50;
+
+        public int OffsetGraphStep { get; protected set; } = 10;
+        /// <summary>
+        /// Y轴倍数
+        /// </summary>
+        public double YRangePercent { get; set; } = 3;
         #endregion
 
         /// <summary>
@@ -36,18 +46,14 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule
         public ChartValues<int> HeatOffsets { get; } = new ChartValues<int>();
 
         public ChartValues<bool> Bads { get; } = new ChartValues<bool>();
-        public ChartValues<bool> IsStables { get; } = new ChartValues<bool>();
         public object MapperPreHeats { get; private set; }
 
         [PropertyChanged.DependsOn(nameof(Kp))]
         public object MapperThickPercents { get; private set; }
 
-
-        [PropertyChanged.DependsOn(nameof(Kp))]
-        public object MapperThickPercentsWithIsStable { get; private set; }
         public object Mapper { get; private set; }
 
-        public double Kp { get; private set; } = 3;
+        public double Kp { get; protected set; } = 3;
         /// <summary>
         /// 当前选择加热通道
         /// </summary>
@@ -56,19 +62,37 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule
         /// 当前选择加热通道数量
         /// </summary>
         public int SelectBoltNoWidth { get; set; } = 0;
+
+        public int CurrMix { get; protected set; } = 1;
+        public double CurrSigma2 { get; protected set; } = 0;
         /// <summary>
         /// 长按驱动器
         /// </summary>
         public LongPress LPress { get; } = new LongPress();
         public IFeedbackHeatService FeedbackHeat { get; private set; }
 
+        public RelayCommand AddCmd { get; }
+        public RelayCommand SubCmd { get; }
+
+        public RelayCommand UndoCmd { get; }
+        public RelayCommand CalCmd { get; }
+        public RelayCommand BaseUpCmd { get; }
+        public RelayCommand BaseDownCmd { get; }
+        public RelayCommand ApplyCmd { get; }
+        public RelayCommand SaveCmd { get; }
+        public RelayCommand LoadCmd { get; }
+        public RelayCommand EnableCmd { get; }
+        public RelayCommand CheckCmd { get; }
+        public RelayCommand SmoothCmd { get; }
+        public RelayCommand ClearCmd { get; }
+
         IFeedbackHeatService mFeedback;
         IHeatBufService mHeatBuf;
         IHeatCellService mHeatCell;
         Button btnClearH;
-        Brush BadsBrush;
-        Brush PreHeatsBrush;
-
+        protected Brush BadsBrush;
+        protected Brush PreHeatsBrush;
+        FLY.Thick.Blowing.Common.BlowingFixProfileParam profileParam;
         public AirRingGraphVm()
         {
             #region 与数据无关界面参数
@@ -120,24 +144,6 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule
                 {
                     return value * Kp;
                 });
-
-            MapperThickPercentsWithIsStable = Mappers.Xy<double>()
-                .X((value, index) =>
-                {
-                    return index + 1;
-                })
-                .Y((value,index) =>
-                {
-                    if (index < IsStables.Count() && index >= 0)
-                    {
-                        if (!IsStables[index])
-                        {
-                            return value * Kp;
-                        }
-                    }
-                    return double.NaN;
-                });
-
             
             Mapper = Mappers.Xy<int>()
                 .X((value, index) =>
@@ -166,53 +172,28 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule
             ClearCmd = new RelayCommand(Clear);
         }
 
-        private void Apply()
-        {
-            SelectBoltNo = -1;
-            SelectBoltNoWidth = 0;
-            mHeatCell.HeatApply();
-        }
-
-        private void Sub()
-        {
-            for (int i = 0; i < SelectBoltNoWidth; i++)
-            {
-                int index = SelectBoltNo - 1 + i;
-                if (index >= 0 && index < mFeedback.ChannelCnt)
-                {
-                    mHeatCell.ModifyOffset(index, -mFeedback.Step);
-                }
-            }
-        }
 
-        private void Add()
-        {
-            for (int i = 0; i < SelectBoltNoWidth; i++)
-            {
-                int index = SelectBoltNo - 1 + i;
-                if (index >= 0 && index < mFeedback.ChannelCnt)
-                {
-                    mHeatCell.ModifyOffset(index, mFeedback.Step);
-                }
-            }
-        }
 
         public void Init(
             IFeedbackHeatService feedback,
             IHeatBufService heatBuf,
             IHeatCellService heatCell,
-            Button button_clear_h)
+            Button button_clear_h,
+            FLY.Thick.Blowing.IService.IBlowingFixProfileService profileService )
         {
             //把 FeedbackHeat 共享。 1个程序,只能有一个 FeedbackHeat
-            mFeedback = feedback;
-            mHeatBuf = heatBuf;
-            mHeatCell = heatCell;
+            this.mFeedback = feedback;
+            this.mHeatBuf = heatBuf;
+            this.mHeatCell = heatCell;
+            this.profileParam = profileService.Param;
+
+
 
             FeedbackHeat = mFeedback;
 
             mFeedback.PropertyChanged += mFeedbackHeatService_PropertyChanged;
             mHeatCell.PropertyChanged += MHeatCell_PropertyChanged;
-            mHeatBuf.PropertyChanged += MHeatBuf_PropertyChanged;
+            this.profileParam.PropertyChanged += ProfileParam_PropertyChanged;
             UpdateAxisX();
             DataBindAll_Thicks();
             DataBindAll_HeatOffsets();
@@ -221,6 +202,7 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule
             
 
             Misc.BindingOperations.SetBinding(mHeatCell, nameof(mHeatCell.Kp), this, nameof(Kp));
+            Misc.BindingOperations.SetBinding(mHeatCell, nameof(mHeatCell.CurrMix), this, nameof(CurrMix));
 
 
             this.btnClearH = button_clear_h;
@@ -230,18 +212,36 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule
                 mHeatCell.ClearPreHeats();
             };
 
-        }
 
+            updateOffsetGraphRange();
+        }
 
 
-        private void MHeatBuf_PropertyChanged(object sender, PropertyChangedEventArgs e)
+        private void ProfileParam_PropertyChanged(object sender, PropertyChangedEventArgs e)
         {
-            if (e.PropertyName == nameof(mHeatBuf.BoltIsStable))
+            if (e.PropertyName == nameof(profileParam.TolerancePercent)) 
             {
-                DataBindAll_IsStables();
+                updateOffsetGraphRange();
             }
         }
 
+
+        /// <summary>
+        /// 刷新偏移量图的Y轴范围
+        /// </summary>
+        void updateOffsetGraphRange() 
+        {
+            int range = (int)(this.profileParam.TolerancePercent * 100 * mHeatCell.Kp * mFeedback.OffsetGraphYRangePercent);
+            if (range < 10)
+                range = 10;
+
+            OffsetGraphStep = range / 5;
+
+            OffsetGraphYMax = range;
+            OffsetGraphYMin = -range;
+
+        }
+
         private void MHeatCell_PropertyChanged(object sender, PropertyChangedEventArgs e)
         {
             if (e.PropertyName == nameof(mHeatCell.ThickPercents))
@@ -259,30 +259,45 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule
                 DataBindAll_HeatOffsets();
 
             }
-            else if (e.PropertyName == nameof(mHeatCell.PreHeats)) 
+            else if (e.PropertyName == nameof(mHeatCell.PreHeats))
             {
                 DataBindAll_PreHeats();
             }
+            else if (e.PropertyName == nameof(mHeatCell.Kp)) 
+            {
+                updateOffsetGraphRange();
+            }
         }
 
         void mFeedbackHeatService_PropertyChanged(object sender, PropertyChangedEventArgs e)
         {
-            if ((e.PropertyName == nameof(mFeedback.ChannelCnt)))
+            if (e.PropertyName == nameof(mFeedback.ChannelCnt))
             {
                 UpdateAxisX();
             }
-            if (e.PropertyName == nameof(mFeedback.Bads))
+            else if (e.PropertyName == nameof(mFeedback.Bads))
             {
                 DataBindAll_Bads();
             }
+            else if (e.PropertyName == nameof(mFeedback.OffsetGraphYRangePercent)) 
+            {
+                updateOffsetGraphRange();
+            }
         }
 
 
         void DataBindAll_Thicks()
         {
             ThickPercents.Clear();
-            if(mHeatCell.ThickPercents!=null)
+            if (mHeatCell.ThickPercents != null)
+            {
                 ThickPercents.AddRange(mHeatCell.ThickPercents);
+                CurrSigma2 = mHeatCell.ThickPercents.Sigma() * 2;
+            }
+            else 
+            {
+                CurrSigma2 = 0;
+            }
         }
 
         void DataBindAll_Heats() 
@@ -312,72 +327,93 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule
         }
         void DataBindAll_IsStables()
         {
-            IsStables.Clear();
-            if (mHeatBuf.BoltIsStable != null)
-                IsStables.AddRange(mHeatBuf.BoltIsStable);
-            NotifyPropertyChanged(nameof(MapperThickPercentsWithIsStable));
+
         }
         void UpdateAxisX()
         {
             XMax = mFeedback.ChannelCnt + 1;
         }
 
-        public RelayCommand AddCmd { get; }
-        public RelayCommand SubCmd { get; }
-
-        public RelayCommand UndoCmd { get; }
-        public RelayCommand CalCmd { get; }
-        public RelayCommand BaseUpCmd { get; }
-        public RelayCommand BaseDownCmd { get; }
-        public RelayCommand ApplyCmd { get; }
-        public RelayCommand SaveCmd { get; }
-        public RelayCommand LoadCmd { get; }
-        public RelayCommand EnableCmd { get; }
-        public RelayCommand CheckCmd { get; }
-        public RelayCommand SmoothCmd { get; }
-        public RelayCommand ClearCmd { get; }
-
-        private void Save()
+        private void Apply()
         {
-            WdSaveHeatsFile w = new WdSaveHeatsFile();
-            w.Owner = FLY.ControlLibrary.COMMON.GetWindow(btnClearH);
-            w.FileName = mFeedback.HeatsProductName;
+            SelectBoltNo = -1;
+            SelectBoltNoWidth = 0;
+            mHeatCell.HeatApply();
+        }
 
-            if (w.ShowDialog() == true)
+        private void Sub()
+        {
+            for (int i = 0; i < SelectBoltNoWidth; i++)
             {
-                if (string.IsNullOrEmpty(w.FileName))
+                int index = SelectBoltNo - 1 + i;
+                if (index >= 0 && index < mFeedback.ChannelCnt)
                 {
-                    FLY.ControlLibrary.Window_WarningTip.Show("异常",
-                        "产品名称 为空",
-                        TimeSpan.FromSeconds(2));
-                    return;
+                    mHeatCell.ModifyOffset(index, -mFeedback.Step);
                 }
-                char[] invalids = System.IO.Path.GetInvalidFileNameChars();
+            }
+        }
 
-                foreach (char invalidChar in invalids)
+        private void Add()
+        {
+            for (int i = 0; i < SelectBoltNoWidth; i++)
+            {
+                int index = SelectBoltNo - 1 + i;
+                if (index >= 0 && index < mFeedback.ChannelCnt)
                 {
-                    if (w.FileName.Contains(invalidChar))
-                    {
-                        FLY.ControlLibrary.Window_WarningTip.Show("异常",
-                            "产品名称 含有非法字符 " + invalidChar,
-                            TimeSpan.FromSeconds(2));
-                        return;
-                    }
+                    mHeatCell.ModifyOffset(index, mFeedback.Step);
                 }
+            }
+        }
+
+
+        private void Save()
+        {
+            string txt = mFeedback.HeatsProductName;
+            if (!FLY.ControlLibrary.Prompt.Show("请输出产品名称", ref txt))
+                return;
+
+            //WdSaveHeatsFile w = new WdSaveHeatsFile();
+            //w.Owner = FLY.ControlLibrary.COMMON.GetWindow(btnClearH);
+            //w.FileName = mFeedback.HeatsProductName;
+
+            //if (w.ShowDialog() != true)
+            //    return;
+
+            //string txt = w.FileName;
+
+            if (string.IsNullOrEmpty(txt))
+            {
+                FLY.ControlLibrary.Window_WarningTip.Show("异常",
+                    "产品名称 为空",
+                    TimeSpan.FromSeconds(2));
+                return;
+            }
+            char[] invalids = System.IO.Path.GetInvalidFileNameChars();
 
-                if (w.FileName.Length > 30)
+            foreach (char invalidChar in invalids)
+            {
+                if (txt.Contains(invalidChar))
                 {
                     FLY.ControlLibrary.Window_WarningTip.Show("异常",
-                       "产品名称 > 30字符",
-                       TimeSpan.FromSeconds(2));
+                        "产品名称 含有非法字符 " + invalidChar,
+                        TimeSpan.FromSeconds(2));
                     return;
                 }
+            }
 
-                mFeedback.SaveHeats(w.FileName);
-                FLY.ControlLibrary.Window_Tip.Show("加载成功",
-                    w.FileName,
+            if (txt.Length > 30)
+            {
+                FLY.ControlLibrary.Window_WarningTip.Show("异常",
+                    "产品名称 > 30字符",
                     TimeSpan.FromSeconds(2));
+                return;
             }
+
+            mFeedback.SaveHeats(txt);
+            FLY.ControlLibrary.Window_Tip.Show("加载成功",
+                txt,
+                TimeSpan.FromSeconds(2));
+            
         }
 
         private void Load()
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraphVmUt.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraphVmUt.cs
index 031a9abe37d3e50807211c8e271d11a211450500..eb0aa937e8660d161390a39fc30cc5d7c05fdd1a 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraphVmUt.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/AirRingGraph/AirRingGraphVmUt.cs
@@ -9,106 +9,14 @@ using System.Windows.Media;
 
 namespace FLY.FeedbackRenZiJia.UI.Client.UiModule
 {
-    public class AirRingGraphVmUt : INotifyPropertyChanged
+    public class AirRingGraphVmUt : AirRingGraphVm
     {
         public event PropertyChangedEventHandler PropertyChanged;
 
-        /// <summary>
-        /// 长按驱动器
-        /// </summary>
-        public LongPress LPress { get; } = new LongPress();
-
-
-        #region 图表控制
-        public Func<double, string> YFormatter { get; private set; }
-        public int XMax { get; private set; }
-        #endregion
-
-        /// <summary>
-        /// 经过Kp 转换后的 厚度%
-        /// </summary>
-        public ChartValues<double> ThickPercents { get; } = new ChartValues<double>();
-        public ChartValues<int> PreHeats { get; } = new ChartValues<int>();
-        public ChartValues<int> Heats { get; } = new ChartValues<int>();
-        public ChartValues<int> HeatOffsets { get; } = new ChartValues<int>();
-        public ChartValues<bool> Bads { get; } = new ChartValues<bool>();
-        public object MapperPreHeats { get; private set; }
-        public object MapperThickPercents { get; private set; }
-        public object Mapper { get; private set; }
-
-        public double Kp { get; private set; } = 3;
+        
 
-        /// <summary>
-        /// 当前选择加热通道
-        /// </summary>
-        public int SelectBoltNo { get; set; } = 40;
-        /// <summary>
-        /// 当前选择加热通道数量
-        /// </summary>
-        public int SelectBoltNoWidth { get; set; } = 3;
-
-        Brush BadsBrush;
-        Brush PreHeatsBrush;
         public AirRingGraphVmUt()
         {
-            #region 与数据无关界面参数
-
-            var resourceDictionary = new ResourceDictionary() { Source = new Uri("pack://application:,,,/FLY.FeedbackRenZiJia.UI.Client;component/Themes/Colors.xaml") };
-            BadsBrush = resourceDictionary["Brushes.Bad"] as Brush;
-            PreHeatsBrush = resourceDictionary["Brushes.PreHeat"] as Brush;
-
-            YFormatter = (y) =>
-            {
-                string text = y + "%";
-                return $"{text,6}";
-            };
-
-            MapperPreHeats = Mappers.Xy<int>()
-                .X((value, index) =>
-                {
-                    return index + 1;
-                })
-                .Y((value, index) =>
-                {
-                    if (index < Bads.Count() && index >= 0)
-                    {
-                        if (Bads[index])
-                        {
-                            if (value == 0)
-                                return 100;
-                        }
-                    }
-                    return value;
-                })
-                .Fill((value, index) =>
-                {
-                    if (index < Bads.Count() && index >= 0)
-                    {
-                        if (Bads[index])
-                        {
-                            return BadsBrush;
-                        }
-                    }
-                    return PreHeatsBrush;
-                });
-            MapperThickPercents = Mappers.Xy<double>()
-                .X((value, index) =>
-                {
-                    return index + 1;
-                })
-                .Y((value) =>
-                {
-                    return value * Kp;
-                });
-
-            Mapper = Mappers.Xy<int>()
-                .X((value, index) =>
-                {
-                    return index + 1;
-                });
-
-            #endregion
-
 
             #region 数据
             double target = 150;
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/DynAreaAirRing.xaml b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/DynAreaAirRing.xaml
index 5dbc89fc7aa9811b37c5d6733f614ee242c869e4..9778af90b729bba6674d56a6bd4b4660f03e092d 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/DynAreaAirRing.xaml
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/DynAreaAirRing.xaml
@@ -16,9 +16,30 @@
             </ResourceDictionary.MergedDictionaries>
 
             <client:StableConverter x:Key="stableconv"/>
-            <local:DynAreaAirRingVmUt x:Key="airRingVmUt" Msg="0123" IsONoDiff="True" BestOrgBoltNo="10" OrgBoltNo="1" CurrR="0.8" LastChangedTime="12:30"/>
+            <local:DynAreaAirRingVmUt x:Key="airRingVmUt" Msg="0123" IsONoDiff="True" IsKpDiff="True" BestOrgBoltNo="10" OrgBoltNo="1" CurrR="0.8" LastChangedTime="12:30" 
+                                      IsShowBestOrgBoltNo="True" BestKp="3.4" Kp="2.2"/>
             <baseUiModule:DynAreaErrorVm2 x:Key="errorVm" IsError="False" ErrMsg="枫莱尔控制器连接断开 枫莱尔控制器连接断开"/>
 
+            <Style TargetType="TextBlock" x:Key="FlashText" BasedOn="{StaticResource Styles.Module.Text.ItemValue}">
+                <Setter Property="Visibility" Value="Hidden"/>
+                <Setter Property="Background" Value="{StaticResource Brushes.Highlight}"/>
+                <Setter Property="Foreground" Value="{StaticResource Brushes.ThemeBackground}"/>
+                <Style.Triggers>
+                    <DataTrigger Binding="{Binding Tag,RelativeSource={RelativeSource Mode=Self}}" Value="True">
+                        <DataTrigger.EnterActions>
+                            <BeginStoryboard>
+                                <Storyboard RepeatBehavior="Forever" >
+                                    <DoubleAnimation BeginTime="0:0:0" Storyboard.TargetProperty="Opacity" From="1" To="0" Duration="00:00:01" />
+                                    <DoubleAnimation BeginTime="0:0:1" Storyboard.TargetProperty="Opacity" From="0" To="1" Duration="00:00:01" />
+                                </Storyboard>
+                            </BeginStoryboard>
+                        </DataTrigger.EnterActions>
+                        <Setter Property="Visibility" Value="Visible"/>
+                    </DataTrigger>
+                </Style.Triggers>
+            </Style>
+           
+            
         </ResourceDictionary>
 
     </UserControl.Resources>
@@ -35,99 +56,53 @@
                         <StackPanel >
                             <StackPanel Orientation="Horizontal">
                                 <StackPanel Margin="2" >
-                                    <TextBlock Text="稳定性" FontSize="12" FontWeight="Bold" FontFamily="YouYuan" TextAlignment="Left"  Foreground="#FF3B3B3B" />
-                                    <TextBlock   FontWeight="Bold" FontFamily="Microsoft Sans Serif" Foreground="{StaticResource Color_theme_activity}" Text="{Binding CurrR, StringFormat={}{0:F1}}" FontSize="24" VerticalAlignment="Center" />
+                                    <TextBlock Style="{StaticResource Styles.Module.Text.ItemHeader}" Text="稳定性" />
+                                    <TextBlock Style="{StaticResource Styles.Module.Text.ItemValue}" Foreground="{StaticResource Brushes.Activity}" 
+                                               Text="{Binding CurrR, StringFormat={}{0:F2}}"/>
                                 </StackPanel>
                                 <Grid  Visibility="{Binding IsShowBest,Converter={StaticResource visbilityconv}}">
                                     <StackPanel Orientation="Horizontal" Visibility="{Binding IsShowBestOrgBoltNo,Converter={StaticResource visbilityconv}}">
-                                        <StackPanel Margin="2,0" >
-                                            <TextBlock FontSize="12" FontWeight="Bold" FontFamily="YouYuan" TextAlignment="Left"  Foreground="#FF3B3B3B" Text="最佳复位号" Margin="0,2"/>
+                                        <StackPanel Margin="2">
+                                            <TextBlock Style="{StaticResource Styles.Module.Text.ItemHeader}" Foreground="{StaticResource Brushes.NoAct}" 
+                                                       Text="复位号"/>
+                                            <TextBlock Style="{StaticResource Styles.Module.Text.ItemValue}" FontSize="18"
+                                                       Text="{Binding OrgBoltNo}"  />
+                                        </StackPanel>
+                                        <StackPanel Margin="2" >
+                                            <TextBlock Style="{StaticResource Styles.Module.Text.ItemHeader}" Text="最佳" />
                                             <Grid>
-                                                <TextBlock FontWeight="Bold" FontFamily="Microsoft Sans Serif" FontSize="24" VerticalAlignment="Center" Foreground="{StaticResource Color_theme_activity}" >
-                                                    <Run Text="{Binding BestOrgBoltNo }"/>
-                                                </TextBlock>
-                                                <TextBlock FontWeight="Bold" FontFamily="Microsoft Sans Serif" FontSize="24" VerticalAlignment="Center" Background="Red" Foreground="Yellow">
-                                                    <Run Text="{Binding BestOrgBoltNo }"/>
-
-                                                    <TextBlock.Style>
-                                                        <Style TargetType="TextBlock">
-                                                            <Setter Property="Visibility" Value="Hidden"/>
-                                                            <Setter Property="Foreground" Value="{StaticResource Color_theme_activity}"/>
-                                                            <Style.Triggers>
-                                                                <DataTrigger Binding="{Binding IsONoDiff}" Value="True">
-                                                                    <DataTrigger.EnterActions>
-                                                                        <BeginStoryboard>
-                                                                            <Storyboard RepeatBehavior="Forever" >
-                                                                                <DoubleAnimation BeginTime="0:0:0" Storyboard.TargetProperty="Opacity" From="1" To="0" Duration="00:00:01" />
-                                                                                <DoubleAnimation BeginTime="0:0:1" Storyboard.TargetProperty="Opacity" From="0" To="1" Duration="00:00:01" />
-                                                                            </Storyboard>
-                                                                        </BeginStoryboard>
-                                                                    </DataTrigger.EnterActions>
-                                                                    <Setter Property="Visibility" Value="Visible"/>
-                                                                </DataTrigger>
-                                                            </Style.Triggers>
-                                                        </Style>
-
-                                                    </TextBlock.Style>
-                                                </TextBlock>
+                                                <TextBlock Style="{StaticResource Styles.Module.Text.ItemValue}" Foreground="{StaticResource Brushes.Activity}" 
+                                                           Text="{Binding BestOrgBoltNo}"/>
+                                                <TextBlock Style="{StaticResource FlashText}" 
+                                                           Text="{Binding BestOrgBoltNo}" Tag="{Binding IsONoDiff}"/>
                                             </Grid>
-
-
-                                        </StackPanel>
-
-                                        <StackPanel Margin="2" VerticalAlignment="Bottom" >
-                                            <TextBlock FontSize="12" FontWeight="Bold" FontFamily="YouYuan" TextAlignment="Left"  Foreground="#FF8B8B8B" Text="当前"/>
-                                            <TextBlock FontWeight="Bold" FontFamily="Microsoft Sans Serif" Foreground="{StaticResource Brushes.Static}" Text="{Binding OrgBoltNo }" FontSize="18" VerticalAlignment="Center" />
                                         </StackPanel>
-
                                     </StackPanel>
                                     <StackPanel Orientation="Horizontal" Visibility="{Binding IsShowBestOrgBoltNo,Converter={StaticResource visbilityconv},ConverterParameter=HiddenWhenTrue}">
-                                        <StackPanel Margin="2,0" >
-                                            <TextBlock FontSize="12" FontWeight="Bold" FontFamily="YouYuan" TextAlignment="Left"  Foreground="{StaticResource Brushes.Static}" Text="最佳Kp" Margin="0,2"/>
+                                        <StackPanel Margin="2">
+                                            <TextBlock Style="{StaticResource Styles.Module.Text.ItemHeader}" Foreground="{StaticResource Brushes.NoAct}" 
+                                                       Text="Kp"/>
+                                            <TextBlock Style="{StaticResource Styles.Module.Text.ItemValue}" FontSize="18"
+                                                       Text="{Binding Kp,StringFormat={}{0:F1}}"  />
+                                        </StackPanel>
+                                        <StackPanel Margin="2" >
+                                            <TextBlock Style="{StaticResource Styles.Module.Text.ItemHeader}" Text="最佳" />
                                             <Grid>
-                                                <TextBlock FontWeight="Bold" FontFamily="Microsoft Sans Serif" FontSize="24" VerticalAlignment="Center" Foreground="{StaticResource Brushes.Activity}" >
-                                                <Run Text="{Binding BestKp,StringFormat={}{0:F1} }"/>
-                                                </TextBlock>
-                                                <TextBlock FontWeight="Bold" FontFamily="Microsoft Sans Serif" FontSize="24" VerticalAlignment="Center" Background="Red" Foreground="Yellow">
-                                                    <Run Text="{Binding BestKp,StringFormat={}{0:F1} }"/>
-                                                    <TextBlock.Style>
-                                                        <Style TargetType="TextBlock">
-                                                            <Setter Property="Visibility" Value="Hidden"/>
-                                                            <Setter Property="Foreground" Value="{StaticResource Color_theme_activity}"/>
-                                                            <Style.Triggers>
-                                                                <DataTrigger Binding="{Binding IsKpDiff}" Value="True">
-                                                                    <DataTrigger.EnterActions>
-                                                                        <BeginStoryboard>
-                                                                            <Storyboard RepeatBehavior="Forever" >
-                                                                                <DoubleAnimation BeginTime="0:0:0" Storyboard.TargetProperty="Opacity" From="1" To="0" Duration="00:00:01" />
-                                                                                <DoubleAnimation BeginTime="0:0:1" Storyboard.TargetProperty="Opacity" From="0" To="1" Duration="00:00:01" />
-                                                                            </Storyboard>
-                                                                        </BeginStoryboard>
-                                                                    </DataTrigger.EnterActions>
-                                                                    <Setter Property="Visibility" Value="Visible"/>
-                                                                </DataTrigger>
-                                                            </Style.Triggers>
-                                                        </Style>
-
-                                                    </TextBlock.Style>
-                                                </TextBlock>
+                                                <TextBlock Style="{StaticResource Styles.Module.Text.ItemValue}" Foreground="{StaticResource Brushes.Activity}" 
+                                                           Text="{Binding BestKp, StringFormat={}{0:F1}}"/>
+                                                <TextBlock Style="{StaticResource FlashText}" 
+                                                           Text="{Binding BestKp,StringFormat={}{0:F1}}" Tag="{Binding IsKpDiff}"/>
                                             </Grid>
-
-
                                         </StackPanel>
-
-                                        <StackPanel Margin="2" VerticalAlignment="Bottom" >
-                                            <TextBlock FontSize="12" FontWeight="Bold" FontFamily="YouYuan" TextAlignment="Left"  Foreground="#FF8B8B8B" Text="当前"/>
-                                            <TextBlock FontWeight="Bold" FontFamily="Microsoft Sans Serif" Foreground="{StaticResource Color_theme_static}" Text="{Binding Kp,StringFormat={}{0:F1}}" FontSize="18" VerticalAlignment="Center" />
-                                        </StackPanel>
-
                                     </StackPanel>
                                 </Grid>
 
                             </StackPanel>
                             <StackPanel Margin="2" >
-                                <TextBlock Text="加热时间" FontSize="10" FontWeight="Bold" FontFamily="YouYuan" TextAlignment="Left" Foreground="#FF3B3B3B" Margin="0,2"/>
-                                <TextBlock Text="{Binding LastChangedTime,StringFormat={}{0:HH:mm:ss}}" FontSize="24" FontFamily="Microsoft Sans Serif" TextAlignment="Center" Foreground="White" Background="Black" Padding="5,0" />
+                                <TextBlock Style="{StaticResource Styles.Module.Text.ItemHeader}" Text="加热时间" />
+                                <TextBlock Style="{StaticResource Styles.Module.Text.ItemValue}" Foreground="White" Background="Black" Padding="5,0" 
+                                           Text="{Binding LastChangedTime,StringFormat={}{0:HH:mm:ss}}" 
+                                           TextAlignment="Center" />
                             </StackPanel>
                         </StackPanel>
 
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/DynAreaAirRing.xaml.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/DynAreaAirRing.xaml.cs
index 7fa1cf335a0c3ab545ab6f52633bee9d0b9ccae3..438a761586f9622ca8e4f18e4755fffa6a4ee58b 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/DynAreaAirRing.xaml.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Client/UiModule/DynAreaAirRing.xaml.cs
@@ -62,12 +62,14 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule
     {
         public event PropertyChangedEventHandler PropertyChanged;
 
+
         public int BestOrgBoltNo { get; set; }
         public int OrgBoltNo { get; set; }
 
         public bool IsONoDiff { get; set; }
 
         public double BestKp { get; set; }
+
         public double Kp { get; set; }
 
         public bool IsKpDiff { get; set; }
@@ -79,13 +81,13 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule
 
         public string Msg { get; set; }
 
-        public bool IsShowBestOrgBoltNo { get; private set; } = true;
+        public bool IsShowBestOrgBoltNo { get; set; } = true;
 
         public bool IsShowBest => IsKpDiff || IsONoDiff;
 
+        
         public RelayCommand OpenRecordCmd { get; }
 
-
         IBlowingService blowingService;
         IHeatBufService heatBufService;
         IUnityContainer container;
@@ -115,13 +117,13 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule
             this.heatCellService = heatCellService;
             this.blowingService = blowingService;
 
-            Misc.BindingOperations.SetBinding(blowingService, nameof(blowingService.OrgBoltNo), this, nameof(OrgBoltNo));
+            Misc.BindingOperations.SetBinding(this.blowingService, nameof(this.blowingService.OrgBoltNo), this, nameof(OrgBoltNo));
 
-            Misc.BindingOperations.SetBinding(heatBufService, nameof(heatBufService.CurrR), this, nameof(CurrR));
+            Misc.BindingOperations.SetBinding(this.heatBufService, nameof(this.heatBufService.CurrR), this, nameof(CurrR));
 
-            Misc.BindingOperations.SetBinding(feedbackHeatService, nameof(feedbackHeatService.LastChangedTime), this, nameof(LastChangedTime));
+            Misc.BindingOperations.SetBinding(this.feedbackHeatService, nameof(this.feedbackHeatService.LastChangedTime), this, nameof(LastChangedTime));
 
-            Misc.BindingOperations.SetBinding(heatCellService, nameof(heatCellService.Kp), this, nameof(Kp));
+            Misc.BindingOperations.SetBinding(this.heatCellService, nameof(this.heatCellService.Kp), this, nameof(Kp));
 
 
             UpdateBestOrgBoltNo();
@@ -156,7 +158,7 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule
             else if (e.PropertyName == nameof(OrgBoltNo))
             {
                 UpdateBestOrgBoltNo();
-                UpdateIsONoDiff();
+                IsONoDiff = false;
             }
             else if (e.PropertyName == nameof(BestKp))
             {
@@ -165,7 +167,7 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule
             else if (e.PropertyName == nameof(Kp))
             {
                 UpdateBestKp();
-                UpdateIsKpDiff();
+                IsKpDiff = false;
             }
         }
 
@@ -175,11 +177,6 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule
             {
                 UpdateMsg();
             }
-            else if (e.PropertyName == nameof(heatBufService.MaxR))
-            {
-                UpdateBestOrgBoltNo();
-                UpdateBestKp();
-            }
             else if (e.PropertyName == nameof(heatBufService.BestOrgBoltNo))
             {
                 UpdateBestOrgBoltNo();
@@ -212,7 +209,7 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule
                 IsONoDiff = false;
             }
         }
-        void UpdateBestKp()
+        bool UpdateBestKp()
         {
             if (heatBufService.MaxR > 0)
             {
@@ -222,12 +219,18 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule
             {
                 BestKp = Kp;
             }
+            return false;
         }
         void UpdateIsKpDiff()
         {
-            double p = Kp / BestKp;
-            if ((p > 1.5)) 
+            if (BestKp < Kp * 0.4)
+            {
+                //这个需要严重警告, Kp设得太大
+                IsKpDiff = true;
+            }
+            else if (BestKp > Kp * 3)
             {
+                //这个Kp太小了, 提示一次吧,不然很慢
                 IsKpDiff = true;
             }
             else
@@ -256,28 +259,8 @@ namespace FLY.FeedbackRenZiJia.UI.Client.UiModule
         }
     }
 
-    public class DynAreaAirRingVmUt : INotifyPropertyChanged
+    public class DynAreaAirRingVmUt : DynAreaAirRingVm
     {
-        public event PropertyChangedEventHandler PropertyChanged;
-        public int BestOrgBoltNo { get; set; }
-        public int OrgBoltNo { get; set; }
-
-        public bool IsONoDiff { get; set; }
-
-        public int BestKp { get; set; }
-        public int Kp { get; set; }
-
-        public bool IsKpDiff { get; set; }
-
-        public bool IsShowBest => IsKpDiff || IsONoDiff;
-        public double CurrR { get; set; }
-
-        public DateTime LastChangedTime { get; set; }
-
-        public string Msg { get; set; }
-
-        public bool IsShowBestOrgBoltNo { get; set; }
-        public RelayCommand OpenRecordCmd { get; }
 
     }
 
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Server/Properties/AssemblyInfo.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Server/Properties/AssemblyInfo.cs
index 03977f91e33c578b7a5051c0c2ae0848906de2ad..db66530dd4e1ef72039a317c7dab3146adbed894 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Server/Properties/AssemblyInfo.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.UI.Server/Properties/AssemblyInfo.cs
@@ -51,7 +51,7 @@ using System.Windows;
 // 可以指定所有这些值,也可以使用“内部版本号”和“修订号”的默认值,
 // 方法是按如下所示使用“*”:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("7.0.1.0")]
-[assembly: AssemblyFileVersion("7.0.1.0")]
+[assembly: AssemblyVersion("7.4.0.0")]
+[assembly: AssemblyFileVersion("7.4.0.0")]
 [assembly: Guid("32104657-86E9-4380-9113-606589E6D812")]
 
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/BulkDbServiceClient.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/BulkDbServiceClient.cs
index d65fdf83e21603775de3b98738e758e31794de48..b58cec3ae2401604f11948e86524fc0fd8cd254e 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/BulkDbServiceClient.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/BulkDbServiceClient.cs
@@ -33,6 +33,21 @@ namespace FLY.FeedbackRenZiJia.Client
         {
             Call(nameof(GetStableFrame), new { id, isPre }, asyncDelegate, asyncContext);
         }
+
+        /// <summary>
+        /// 以Id为起始点, 向前或者向后获取最近通道改变时间不相同的数据 或 起效数据
+        /// </summary>
+        /// <param name="id"></param>
+        /// <param name="isPre">向前</param>
+        /// <param name="isTakeEffect">数据起效</param>
+        /// <param name="isDiffHTime">加热不同</param>
+        /// <param name="asyncDelegate"></param>
+        /// <param name="asyncContext"></param>
+        [Call(typeof(GetFrameReponse))]
+        public void GetFrameAdv(long id, bool isPre, bool isTakeEffect, bool isDiffHTime, AsyncCBHandler asyncDelegate, object asyncContext)
+        {
+            Call(nameof(GetFrameAdv), new { id, isPre, isTakeEffect, isDiffHTime }, asyncDelegate, asyncContext);
+        }
     }
 }
 
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/FeedbackHeatServiceClient.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/FeedbackHeatServiceClient.cs
index a24b365933ae82cb67e4886f6e2a8bd945e3284f..d16ea271aec5ab7d1e31de0a2af08623812f0aca 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/FeedbackHeatServiceClient.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/FeedbackHeatServiceClient.cs
@@ -42,7 +42,10 @@ namespace FLY.FeedbackRenZiJia.Client
         /// </summary>
         public int Step { get; set; } = 5;
 
-
+        /// <summary>
+        /// 偏移量图, Y轴显示比例
+        /// </summary>
+        public double OffsetGraphYRangePercent { get; set; } = 3;
         #endregion
 
 
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/HeatBufServiceClient.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/HeatBufServiceClient.cs
index 626ba0e6bcbac252b138a149c475fe0e0930e16c..06e61559ed5968984c269d59b2c90592e1b763eb 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/HeatBufServiceClient.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/HeatBufServiceClient.cs
@@ -69,7 +69,7 @@ namespace FLY.FeedbackRenZiJia.Client
         /// <summary>
         /// 对位查找范围 默认 ±120°, 最大值 180°,最小值 50°
         /// </summary>
-        public int SearchAngleRange { get; set; } = 120;
+        public int SearchRange { get; set; } = 120;
         /// <summary>
         /// 计算的最佳复位区号
         /// </summary>
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/HeatCellServiceClient.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/HeatCellServiceClient.cs
index 29cda6d75f4bf84bcc38c79a6059be1bbc87c21a..116fe1e546ce6dcb2303f87d85575740221c8db1 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/HeatCellServiceClient.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Client/HeatCellServiceClient.cs
@@ -21,6 +21,17 @@ namespace FLY.FeedbackRenZiJia.Client
         /// </summary>
         public double Kp { get; set; } = 3;
 
+
+        /// <summary>
+        /// 自动计算时,Kp最大值
+        /// </summary>
+        public double MaxKp { get; set; } = 5;
+
+        /// <summary>
+        /// 自动计算时,Kp最大值
+        /// </summary>
+        public double MinKp { get; set; } = 1;
+
         /// <summary>
         /// 平滑的阀值,只有超出阀值,才平滑
         /// </summary>
@@ -36,36 +47,28 @@ namespace FLY.FeedbackRenZiJia.Client
         /// <summary>
         /// 厚度控制线 , 厚度% 大于 厚度控制线 自动才会加热控制  
         /// </summary>
-        public int CtrlLine { get; set; }
+        public double CtrlLine { get; set; }
 
         /// <summary>
         /// 最大加热量 默认100%
         /// </summary>
         public int MaxHeat { get; set; }
-        #endregion
-        #region 对位
-        /// <summary>
-        /// 自动对位
-        /// </summary>
-        public bool IsAutoONo { get; set; }
-
 
         /// <summary>
-        /// 当前正在自动对位模式
-        /// </summary>
-        public AutoONoStatusEnum AutoONoStatus { get; set; }
-        /// <summary>
-        /// 自动对位模式 信息
+        /// 分级控制线
         /// </summary>
-        public string AutoONoMsg { get; set; }
+        public LvCtrlLine[] LvCtrlLines { get; set; }
+
         /// <summary>
-        /// 自动对位 那幅空的图
+        /// 对厚度数据横向平滑 单位加热棒数。 特别的当Smooth = ChannelCnt/2 就是膜泡的偏心度
         /// </summary>
-        public long AutoONoId0 { get; set; }
+        public int ThickSmoothRange { get; set; }
+        #endregion
+        #region 对位
         /// <summary>
-        /// 自动对位 加热后生效的图
+        /// 自动对位
         /// </summary>
-        public long AutoONoId1 { get; set; }
+        public bool IsAutoONo { get; set; }
 
         #endregion
 
@@ -76,6 +79,10 @@ namespace FLY.FeedbackRenZiJia.Client
         /// </summary>
         public double[] ThickPercents { get; set; }
 
+        /// <summary>
+        /// 当前 thickPercents 混合数
+        /// </summary>
+        public int CurrMix { get; set; }
 
         /// <summary>
         /// 当前方向的加热策略,必须保证 0~100
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Common/FlyData_FeedbackHeat.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Common/FlyData_FeedbackHeat.cs
index 8c2cc83622b52b432fe36d829ab99647eae25a88..7de503b991ae7e44375365a62128e102d30a85cd 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Common/FlyData_FeedbackHeat.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Common/FlyData_FeedbackHeat.cs
@@ -2,18 +2,19 @@
 using FLY.Thick.Blowing.IService;
 using System;
 using System.Collections.Generic;
+using System.Linq;
 
 namespace FLY.FeedbackRenZiJia.Common
 {
 
-    public class FlyData_FeedbackHeat
+    public class ThickHeat2
     {
         public Lc_ThickHeat thickHeat;
 
         /// <summary>
-        /// 稳定状态
+        /// 以前的数据
         /// </summary>
-        public STABILITY Stability = STABILITY.IDLE;
+        public List<Lc_ThickHeat> thickHeats = new List<Lc_ThickHeat>();
 
         /// <summary>
         /// 厚度均值
@@ -29,6 +30,47 @@ namespace FLY.FeedbackRenZiJia.Common
         /// 大小 ChannelCnt, 均值为0
         /// </summary>
         public double[] HeatPercents;
+
+        public void Mix(ThickHeat2 older) 
+        {
+            thickHeats.AddRange(older.thickHeats);
+            thickHeats.Add(thickHeat);
+
+            //æ›´æ–°ThickPercents
+            
+            int z = thickHeat.Thicks.Count() / ThickPercents.Count();
+            double[] thickPercents_last;
+            //当两幅图复位区号不一致时,移动以前的数据,使之一致
+            if (older.thickHeat.OrgBoltNo != thickHeat.OrgBoltNo)
+            {
+                int move = (thickHeat.OrgBoltNo - older.thickHeat.OrgBoltNo) / z;
+                thickPercents_last = Common.MyMath.Move(older.ThickPercents, move);
+            }
+            else
+            {
+                thickPercents_last = older.ThickPercents;
+            }
+
+            for (int i = 0; i < ThickPercents.Count(); i++)
+            {
+                double old_v = thickPercents_last[i];
+                double v = ThickPercents[i];
+                int cnt = older.MixCnt;
+                if (!double.IsNaN(old_v)) 
+                {
+                    if (!double.IsNaN(v))
+                    {
+                        ThickPercents[i] = (v + old_v * cnt) / (cnt + 1);
+                    }
+                    else 
+                    {
+                        ThickPercents[i] = old_v;
+                    }
+                }
+            }
+        }
+
+        public int MixCnt => thickHeats.Count() + 1;
     }
 
 
@@ -41,42 +83,42 @@ namespace FLY.FeedbackRenZiJia.Common
         /// 待定,不知道!!
         /// </summary>
         IDLE = 0,
+        
         /// <summary>
         /// 加热点,还没到达测厚仪。  其它状态都是加热已经起效了,顶多不稳定而已。
         /// </summary>
         ERROR_NO_ARRIVE = -1,
+        
         /// <summary>
         /// 旋转次数太少,位置不能确定
         /// </summary>
         ERROR_POSITION_NOTSURE = -2,
+        
         /// <summary>
         /// 一副数据,Sigma > 15% : 不稳定,变化太大,超出控制范围 
         /// </summary>
         ERROR_SIGMA_OVERSIZE = -3,
+        
         /// <summary>
         /// 连续两幅图旋转时间变化 > 10%:不稳定,旋转速度波动大,测量不准确
         /// </summary>
         ERROR_ROTATE_CHANGED = -4,
+        
         /// <summary>
         /// 连续两幅图厚度均值变化 > 10%: 不稳定,厚度波动大
         /// </summary>
         ERROR_THICK_CHANGED = -5,
+
         /// <summary>
         /// 膜距离,旋转角度被改变,无法判断
         /// </summary>
         ERROR_PARAM_CHANGED = -7,
         
-
-
         /// <summary>
         /// 不稳定,不相关
         /// </summary>
         ERROR_CORREL = -6,
 
-        /// <summary>
-        /// 加热与厚度差,相关性很高
-        /// </summary>
-        OK_HEAT_AND_THICK_CORREL = 3,
         /// <summary>
         /// 加热为0,加热与厚度差,相关性很高
         /// </summary>
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Common/MyMath.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Common/MyMath.cs
index 02237469169356f4156f870521d0fc0b3d32a813..ceb26aaaf78f0182243f4bd8383e903e149cb388 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Common/MyMath.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Common/MyMath.cs
@@ -494,6 +494,56 @@ namespace FLY.FeedbackRenZiJia.Common
             data2_move = mi;
         }
 
+        /// <summary>
+        /// 通过data2 平移,找到与 data1 最相似的位置, data1 与 data2 必须大小一致
+        /// </summary>
+        /// <param name="data1"></param>
+        /// <param name="data2"></param>
+        /// <param name="range_percent">0~1</param>
+        /// <param name="offset"></param>
+        /// <param name="r"></param>
+        public static void CalBestMove(double[] data1, double[] data2, int range, out int data2_move, out double max_r)
+        {
+            if (data1.Length != data2.Length)
+            {
+                throw new Exception("CalBestMove() 参数错误 (data1.Length = " + data1.Length.ToString() + ")!=(data2.Length =" + data2.Length.ToString() + ")");
+            }
+
+            if (range > data1.Length / 2)
+                range = data1.Length / 2;
+
+            if (range <= 0)
+                range = 1;
+
+
+            double mr = 0;
+            int mi = -1;
+            for (int i = -range; i <= range; i++)
+            {
+                var data22 = Move(data2, i);
+                double r = Misc.MyMath.Correl(data1, data22);
+                if (mi == -1)
+                {
+                    mr = r;
+                    mi = i;
+                }
+                else
+                {
+                    if (r > mr)
+                    {
+                        mr = r;
+                        mi = i;
+                    }
+                }
+
+            }
+
+            //找到了!!!
+
+            max_r = mr;
+            data2_move = mi;
+        }
+
         /// <summary>
         /// 平移
         /// </summary>
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.csproj b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.csproj
index d2e0893ab2391af7fcfae50bfc93514359fd3cbe..fe1818058e6b997da23f408b6a59dfd7131866cb 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.csproj
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia.csproj
@@ -57,6 +57,7 @@
     <Compile Include="IService\IBulkDbService.cs" />
     <Compile Include="IService\IHeatBufService.cs" />
     <Compile Include="IService\IFeedbackHeatService.cs" />
+    <Compile Include="IService\IPlcLinkExt.cs" />
     <Compile Include="OBJ_INTERFACE\OBJ_INTERFACE_ID.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Server.OBJProxy\OBJProxy.cs" />
@@ -75,6 +76,7 @@
     <Compile Include="Server\Model\LcTable.cs" />
     <Compile Include="Server\Model\Lc_AutoMapperProfile.cs" />
     <Compile Include="Server\PLCLink.cs" />
+    <Compile Include="Server\PlcLinkExt.cs" />
     <Compile Include="Server\SysParam.cs" />
     <Compile Include="Server\TDGage.cs" />
   </ItemGroup>
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IBulkDbService.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IBulkDbService.cs
index fcd889ba686e14148c36774222a5e6905d7e9865..5d0dab3cde8b762deae23baee9d29d234d75f3e0 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IBulkDbService.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IBulkDbService.cs
@@ -34,10 +34,22 @@ namespace FLY.FeedbackRenZiJia.IService
         /// <param name="asyncContext"></param>
         [Call(typeof(GetStableFrameReponse))]
         void GetStableFrame(long id, bool isPre, AsyncCBHandler asyncDelegate, object asyncContext);
+
+        /// <summary>
+        /// 以Id为起始点, 向前或者向后获取最近通道改变时间不相同的数据 或 起效数据
+        /// </summary>
+        /// <param name="id"></param>
+        /// <param name="isPre">向前</param>
+        /// <param name="isTakeEffect">数据起效</param>
+        /// <param name="isDiffHTime">加热不同</param>
+        /// <param name="asyncDelegate"></param>
+        /// <param name="asyncContext"></param>
+        [Call(typeof(GetFrameReponse))]
+        void GetFrameAdv(long id, bool isPre, bool isTakeEffect, bool isDiffHTime, AsyncCBHandler asyncDelegate, object asyncContext);
     }
     public class GetFrameReponse
     {
-        public long Id;
+        public long id;
         public Lc_ThickHeat thickHeat;
     }
     public class GetStableFrameReponse
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IFeedbackHeatService.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IFeedbackHeatService.cs
index 75a9b15f1fafa8bfcf4d9b926386a0937f58486d..410b7c222f014a60516511d2cc1a152193fd83a3 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IFeedbackHeatService.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IFeedbackHeatService.cs
@@ -41,6 +41,10 @@ namespace FLY.FeedbackRenZiJia.IService
         /// </summary>
         int Step { get; set; }
 
+        /// <summary>
+        /// 偏移量图, Y轴显示比例
+        /// </summary>
+        double OffsetGraphYRangePercent { get; set; }
         #endregion
         #region 动态数据
 
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IHeatBufService.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IHeatBufService.cs
index b470b1a0906f174520c3b4b4864ea27a429e1a0f..fd9fbd7eff2b516fcb3888a3e3f89aabf386e932 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IHeatBufService.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IHeatBufService.cs
@@ -49,9 +49,9 @@ namespace FLY.FeedbackRenZiJia.IService
 
         #region 对位 
         /// <summary>
-        /// 对位查找范围 默认 ±120°, 最大值 180°,最小值 10°
+        /// 对位查找范围 默认 ±10个分区号, 最大值 总分区号的一半,最小值 5个分区号
         /// </summary>
-        int SearchAngleRange { get; set; }
+        int SearchRange { get; set; }
         /// <summary>
         /// 计算的最佳复位区号
         /// </summary>
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IHeatCellService.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IHeatCellService.cs
index 7375f2d76149ce36ed2c104ab612719ce8bddb06..6cde24bfe5d125ed2f38bf495e2a396dfd16cb2f 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IHeatCellService.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IHeatCellService.cs
@@ -14,6 +14,15 @@ namespace FLY.FeedbackRenZiJia.IService
         /// HeatOffset = ThickPercent * Kp
         /// </summary>
         double Kp { get; set; }
+        /// <summary>
+        /// 自动计算时,Kp最大值
+        /// </summary>
+        double MaxKp { get; set; }
+
+        /// <summary>
+        /// 自动计算时,Kp最大值
+        /// </summary>
+        double MinKp { get; set; }
 
         /// <summary>
         /// 输出平滑的阀值,只有超出阀值,才平滑
@@ -28,37 +37,28 @@ namespace FLY.FeedbackRenZiJia.IService
         /// <summary>
         /// 厚度控制线 , 厚度% 大于 厚度控制线 自动才会加热控制  
         /// </summary>
-        int CtrlLine { get; set; }
+        double CtrlLine { get; set; }
 
         /// <summary>
         /// 最大加热量 默认100%
         /// </summary>
         int MaxHeat { get; set; }
 
-        #endregion
-        #region 对位
         /// <summary>
-        /// 自动对位
+        /// 分级控制线
         /// </summary>
-        bool IsAutoONo { get; set; }
-
+        LvCtrlLine[] LvCtrlLines { get; set; }
 
         /// <summary>
-        /// 当前正在自动对位模式
-        /// </summary>
-        AutoONoStatusEnum AutoONoStatus { get; }
-        /// <summary>
-        /// 自动对位模式 信息
+        /// 对厚度数据横向平滑 单位加热棒数。 特别的当Smooth = ChannelCnt/2 就是膜泡的偏心度
         /// </summary>
-        string AutoONoMsg { get; }
-        /// <summary>
-        /// 自动对位 那幅空的图
-        /// </summary>
-        long AutoONoId0 { get; }
+        int ThickSmoothRange { get; set; }
+        #endregion
+        #region 对位
         /// <summary>
-        /// 自动对位 加热后生效的图
+        /// 自动对位
         /// </summary>
-        long AutoONoId1 { get; }
+        bool IsAutoONo { get; set; }
 
         #endregion
         #region 状态
@@ -67,6 +67,13 @@ namespace FLY.FeedbackRenZiJia.IService
         /// </summary>
         double[] ThickPercents { get; }
 
+        /// <summary>
+        /// 当前 thickPercents 混合数
+        /// </summary>
+        int CurrMix { get; }
+
+        
+
         /// <summary>
         /// 当前方向的加热策略,必须保证 0~100
         /// </summary>
@@ -87,6 +94,7 @@ namespace FLY.FeedbackRenZiJia.IService
         /// </summary>
         double MaxHeatSigma { get; }
 
+
         #endregion
 
         #region 功能
@@ -135,23 +143,13 @@ namespace FLY.FeedbackRenZiJia.IService
         #endregion
     }
 
-    public enum AutoONoStatusEnum
+    /// <summary>
+    /// 分级控制线
+    /// </summary>
+    public class LvCtrlLine : INotifyPropertyChanged
     {
-        /// <summary>
-        /// 等待 没有加热,厚度稳定
-        /// </summary>
-        Init,
-        /// <summary>
-        /// 厚度已经稳定,对位加热, 等待结果
-        /// </summary>
-        Step2,
-        /// <summary>
-        /// 成功找到准确的复位区号与Kp
-        /// </summary>
-        Success,
-        /// <summary>
-        /// 失败,对位过程有大波动
-        /// </summary>
-        Fail
+        public event PropertyChangedEventHandler PropertyChanged;
+        public double CtrlLine { get; set; }
+        public int Mix { get; set; }
     }
 }
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IPLCLink.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IPLCLink.cs
index 14ac47255cad590a6478fc5f6fddc5e656336d07..cad09d3875f057bc021ed851146793ea5f0e9aef 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IPLCLink.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IPLCLink.cs
@@ -8,17 +8,11 @@ using System.Collections.ObjectModel;
 namespace FLY.FeedbackRenZiJia.Server
 {
 
-    public interface IPLCLink:INotifyPropertyChanged
+    public interface IPLCLink : INotifyPropertyChanged
     {
         #region 输出
-        /// <summary>
-        /// 加热通道数
-        /// </summary>
-        UInt16 ChannelCnt { get; set; }
-        /// <summary>
-        /// 加热量更新 写
-        /// </summary>
-        UInt16 HeatUpdate { get; set; }
+        void SetChannelCnt(UInt16 channelCnt);
+        void SetHeatUpdate(UInt16 heatUpdate);
         /// <summary>
         /// 设置加热量
         /// </summary>
@@ -43,8 +37,7 @@ namespace FLY.FeedbackRenZiJia.Server
         #endregion
 
         #region 状态
-        int Errno { get; set; }
+        bool IsConnected { get; }
         #endregion
-
     }
 }
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IPlcLinkExt.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IPlcLinkExt.cs
new file mode 100644
index 0000000000000000000000000000000000000000..f45860ed188e24401d77cd2230b6fa9d1c940750
--- /dev/null
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/IService/IPlcLinkExt.cs
@@ -0,0 +1,38 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FLY.FeedbackRenZiJia.IService
+{
+    public interface IPlcLinkExt : INotifyPropertyChanged
+    {
+        #region 当前值
+        /// <summary>
+        /// 当前电流 有没?
+        /// </summary>
+        bool HasElectricity { get; }
+        /// <summary>
+        /// 风机是否启动?
+        /// </summary>
+        bool HasFan { get; }
+
+        bool IsConnected { get; }
+        #endregion
+
+        #region 输出
+
+        void SetChannelCnt(int channelCnt);
+        /// <summary>
+        /// 设置加热量
+        /// </summary>
+        /// <param name="values"></param>
+        void SetHeats(IEnumerable<double> values);
+
+        #endregion
+
+
+    }
+}
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/FeedbackHeat.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/FeedbackHeat.cs
index d3c99e9203ca83faf86de4772842e064c913f5fe..38a639bfb031f5fb963a27b2115eaf6bbd1cb5cb 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/FeedbackHeat.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/FeedbackHeat.cs
@@ -47,19 +47,22 @@ namespace FLY.FeedbackRenZiJia.Server
         /// <summary>
         /// 加热后起效延时(s)
         /// </summary>
-        public int Delay { get; set; } = 10;
+        public int Delay { get; set; } = 60;
 
         /// <summary>
         /// 检测功能使能
         /// </summary>
-        public bool HasCheck { get; set; }
+        public bool HasCheck { get; set; } = true;
 
         /// <summary>
         /// 手动加热步进
         /// </summary>
         public int Step { get; set; } = 5;
 
-
+        /// <summary>
+        /// 偏移量图, Y轴显示比例
+        /// </summary>
+        public double OffsetGraphYRangePercent { get; set; } =3;
         #endregion
         #region 动态数据
         /// <summary>
@@ -116,7 +119,7 @@ namespace FLY.FeedbackRenZiJia.Server
         /// <summary>
         /// 检测线速度 使能
         /// </summary>
-        public bool HasCheckFilmVelocity { get; set; }
+        public bool HasCheckFilmVelocity { get; set; } = true;
 
 
         /// <summary>
@@ -128,7 +131,7 @@ namespace FLY.FeedbackRenZiJia.Server
         /// <summary>
         /// 正在检测中
         /// </summary>
-        public bool CheckEnable { get; set; } = false;
+        public bool CheckEnable { get; set; }
 
         /// <summary>
         /// 1块加热控制板 接多少路加热
@@ -141,7 +144,7 @@ namespace FLY.FeedbackRenZiJia.Server
 
 
 
-        private IPLCLink plc;
+        private IPlcLinkExt plc;
         FLY.Thick.Blowing.IService.IBlowingService blowingService;
         FLY.Thick.Blowing.IService.IBulkDbService bulkDbService;
         private FLY.Thick.Blowing.IService.IBlowingDetectService bDetect;
@@ -165,14 +168,25 @@ namespace FLY.FeedbackRenZiJia.Server
         public FeedbackHeat()
         {
             PLCep = "192.168.50.60:502";
+
+
             Load();
+
+            IPLCLink plclink;
             if (IsClient)
-                plc = new PLCLink(Misc.StringConverter.ToIPEndPoint(PLCep));
+            {
+                plclink = new PLCLink(Misc.StringConverter.ToIPEndPoint(PLCep));
+                ((PLCLink)plclink).Start();
+            }
             else
-                plc = new HMI();
+                plclink = new HMI();
 
-            plc.PropertyChanged += new PropertyChangedEventHandler(hmi_PropertyChanged);
-            HasCheckFilmVelocity = plc.HasElectricity;
+            var plc = new PlcLinkExt();
+            plc.Init(plclink);
+            this.plc = plc;
+
+            this.plc.PropertyChanged += new PropertyChangedEventHandler(hmi_PropertyChanged);
+            HasElectricity = plc.HasElectricity;
             HasFan = plc.HasFan;
 
 
@@ -259,10 +273,7 @@ namespace FLY.FeedbackRenZiJia.Server
             Misc.BindingOperations.SetBinding(mHeatCheck, nameof(mHeatCheck.CheckNo), this, nameof(CheckNo));
             Misc.BindingOperations.SetBinding(mHeatCheck, nameof(mHeatCheck.Bads), this, nameof(Bads));
             Misc.BindingOperations.SetBinding(this, nameof(HeatsOfGroup), mHeatCheck, nameof(mHeatCheck.HeatsOfGroup));
-            if (plc is PLCLink)
-            {
-                ((PLCLink)plc).Start();
-            }
+           
         }
 
         void mHeatCheck_PropertyChanged(object sender, PropertyChangedEventArgs e)
@@ -294,18 +305,17 @@ namespace FLY.FeedbackRenZiJia.Server
         void InitError()
         {
             //--------------------------------------------------------------------------------
-            //连接断开事件
+            //连接断开事件, 3秒后再绑定
             FObjBase.PollModule.Current.Poll_Config(PollModule.POLL_CONFIG.ADD,
                 () =>
                 {
                     Misc.BindingOperations.SetBinding(this, nameof(IsConnectedWithPLC), () =>
                     {
-                        bool b = !IsConnectedWithPLC;
-
-                        ERR_STATE state = b ? ERR_STATE.ON : ERR_STATE.OFF;
-
                         ERRNO errno = ERRNOs.ERRNO_PLC_DISCONNECTED;
-                        mWarning.Add(errno.Code, errno.Descrption, state);
+                        if (!IsConnectedWithPLC)
+                            mWarning.Add(errno, canReset: false);//PLC连接断开,不能被复位
+                        else
+                            mWarning.Remove(errno);
                     });
                 }, TimeSpan.FromSeconds(3), true, false, this, MARKNO_DELAY_ISCONNECTED, true);
 
@@ -314,7 +324,7 @@ namespace FLY.FeedbackRenZiJia.Server
             //检测功能的结果
             this.PropertyChanged += (s, e) =>
             {
-                if (e.PropertyName == "HasCheck")
+                if (e.PropertyName == nameof(HasCheck))
                 {
                     if (!HasCheck)
                     {
@@ -326,19 +336,21 @@ namespace FLY.FeedbackRenZiJia.Server
                         };
                         foreach (ERRNO eRRNO in eRRNOs)
                         {
-                            mWarning.Add(eRRNO.Code, eRRNO.Descrption, ERR_STATE.OFF);
+                            mWarning.Remove(eRRNO);
                         }
                     }
                     return;
                 }
-                else if (e.PropertyName == "HasFan")
+                else if (e.PropertyName == nameof(HasFan))
                 {
                     if (HasCheck)
                     {
-                        ERR_STATE state = (!HasFan) ? ERR_STATE.ON : ERR_STATE.OFF;
-
                         ERRNO errno = ERRNOs.ERRNO_NO_FAN;
-                        mWarning.Add(errno.Code, errno.Descrption, state);
+
+                        if (!HasFan)
+                            mWarning.Add(errno, canReset:false);
+                        else
+                            mWarning.Remove(errno);
                     }
                 }
             };
@@ -346,9 +358,9 @@ namespace FLY.FeedbackRenZiJia.Server
             //------------------------------------------------------------------------
             //检测功能的结果
             Dictionary<string, ERRNO> error_property = new Dictionary<string, ERRNO>();
-            error_property.Add("OpenCircuit", ERRNOs.ERRNO_OPEN_CIRCUIT);
-            error_property.Add("ShortCircuit", ERRNOs.ERRNO_SHORT_CIRCUIT);
-            error_property.Add("PowerOff", ERRNOs.ERRNO_POWER_OFF);
+            error_property.Add(nameof(mHeatCheck.OpenCircuit), ERRNOs.ERRNO_OPEN_CIRCUIT);
+            error_property.Add(nameof(mHeatCheck.ShortCircuit), ERRNOs.ERRNO_SHORT_CIRCUIT);
+            error_property.Add(nameof(mHeatCheck.PowerOff), ERRNOs.ERRNO_POWER_OFF);
             mHeatCheck.PropertyChanged += (s, e) =>
             {
                 if (HasCheck)
@@ -356,11 +368,13 @@ namespace FLY.FeedbackRenZiJia.Server
                     if (error_property.ContainsKey(e.PropertyName))
                     {
                         bool b = (bool)Misc.PropertiesManager.GetValue(mHeatCheck, e.PropertyName);
-                        
-                        ERR_STATE state = b ? ERR_STATE.ON : ERR_STATE.OFF;
-
+                       
                         ERRNO errno = error_property[e.PropertyName];
-                        mWarning.Add(errno.Code, errno.Descrption, state);
+
+                        if (b)
+                            mWarning.Add(errno);
+                        else
+                            mWarning.Remove(errno);
                     }
                 }
             };
@@ -369,21 +383,24 @@ namespace FLY.FeedbackRenZiJia.Server
             //线速度异常
             this.PropertyChanged += (s, e) =>
             {
-                if (e.PropertyName == "HasCheckFilmVelocity")
+                if (e.PropertyName == nameof(HasCheckFilmVelocity))
                 {
                     if (!HasCheckFilmVelocity)
                     {
                         ERRNO eRRNO = ERRNOs.ERRNO_NO_VELOCITY;
-                        mWarning.Add(eRRNO.Code, eRRNO.Descrption, ERR_STATE.OFF);
+                        mWarning.Remove(eRRNO);
                     }
                 }
-                else if (e.PropertyName == "HasFilmVelocity")
+                else if (e.PropertyName == nameof(HasFilmVelocity))
                 {
                     if (HasCheckFilmVelocity)
                     {
-                        ERR_STATE b = (!HasFilmVelocity) ? ERR_STATE.ON : ERR_STATE.OFF;
                         ERRNO eRRNO = ERRNOs.ERRNO_NO_VELOCITY;
-                        mWarning.Add(eRRNO.Code, eRRNO.Descrption, b);
+                        if (!HasFilmVelocity)
+                            mWarning.Add(eRRNO, canReset: false);
+                        else
+                            mWarning.Remove(eRRNO);
+
                     }
                 }
             };
@@ -393,8 +410,7 @@ namespace FLY.FeedbackRenZiJia.Server
 
         void InitBuf()
         {
-            plc.ChannelCnt = (UInt16)ChannelCnt;
-            //Currs = new int[ChannelCnt];
+            plc.SetChannelCnt(ChannelCnt);
             mHeatChanged.Init(ChannelCnt);
             mHeatBuf.Init(NBolts, ChannelCnt);
             mHeatCell.Init2(NBolts, ChannelCnt);
@@ -407,19 +423,10 @@ namespace FLY.FeedbackRenZiJia.Server
             FObjBase.PollModule.Current.Dispatcher.Invoke(
                 new PropertyChangedEventHandler(
                 (sender, e)=> {
-                    if (e.PropertyName == nameof(plc.Errno))
+                    
+                    if (e.PropertyName == nameof(plc.IsConnected))
                     {
-                        if (plc.Errno == -1)
-                        {
-                            IsConnectedWithPLC = false;
-                        }
-                        else
-                        {
-                            IsConnectedWithPLC = true;
-                            //刚成功连接上
-                            //重新复制数据到 PLC
-                            RecoverPLC();
-                        }
+                        IsConnectedWithPLC = plc.IsConnected;
                     }
                     else if (e.PropertyName == nameof(plc.HasElectricity))
                     {
@@ -634,11 +641,9 @@ namespace FLY.FeedbackRenZiJia.Server
             
         }
 
-        UInt16[] last_heat;
-        UInt16 last_heatupdate;
         void Output(int[] heats)
         {
-            List<UInt16> list = new List<UInt16>();
+            List<double> list = new List<double>();
             for (int i = 0; i < ChannelCnt; i++)
             {
                 UInt16 heat = (UInt16)heats[i];
@@ -648,30 +653,7 @@ namespace FLY.FeedbackRenZiJia.Server
                     heat = 100;
                 list.Add(heat);
             }
-            plc.SetHeat(list);
-            last_heat = list.ToArray();
-
-            UInt16 heatupdate = (UInt16)(plc.HeatUpdate_R + 1);
-            if (heatupdate >100)
-                heatupdate = 1;
-            plc.HeatUpdate = heatupdate;
-            last_heatupdate = heatupdate;
-        }
-        void RecoverPLC()
-        {
-            plc.ChannelCnt = (UInt16)ChannelCnt;
-            if (last_heat != null)
-            {
-                plc.SetHeat(last_heat);
-                plc.HeatUpdate = last_heatupdate;
-            }
-            else
-            {
-
-                //设置全部0进去
-                plc.SetHeat(new UInt16[ChannelCnt]);
-                plc.HeatUpdate = plc.HeatUpdate;
-            }
+            plc.SetHeats(list);
         }
 
 
@@ -763,7 +745,7 @@ namespace FLY.FeedbackRenZiJia.Server
                 return;
             }
 
-            mHeatCell.SetThickPercents(mHeatBuf.ThickPercents);
+            mHeatCell.SetThickPercents(mHeatBuf.ThickPercents, mHeatBuf.MixCnt);
 
             if (IsAuto)//如果自控中!!! 
             {
@@ -973,12 +955,12 @@ namespace FLY.FeedbackRenZiJia.Server
         /// <summary>
         /// 加热后起效延时(s)
         /// </summary>
-        public int Delay= 10;
+        public int Delay= 60;
 
         /// <summary>
         /// 检测功能使能
         /// </summary>
-        public bool HasCheck;
+        public bool HasCheck = true;
 
         /// <summary>
         /// 手动加热步进
@@ -992,12 +974,16 @@ namespace FLY.FeedbackRenZiJia.Server
         /// <summary>
         /// 检测线速度 使能
         /// </summary>
-        public bool HasCheckFilmVelocity;
+        public bool HasCheckFilmVelocity = true;
 
         /// <summary>
         /// 1块加热控制板 接多少路加热
         /// </summary>
         public int HeatsOfGroup = 12;
+        /// <summary>
+        /// 偏移量图, Y轴显示比例
+        /// </summary>
+        public double OffsetGraphYRangePercent = 3; 
         #endregion
     }
 
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HMI.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HMI.cs
index bc78133998e2e4d92b2d098d21fd830b2a906bef..e5ad62448d2047cc42dc84ff2de91f5241dc4226 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HMI.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HMI.cs
@@ -83,12 +83,12 @@ namespace FLY.FeedbackRenZiJia.Server
         /// </summary>
         void RegToPropertyNameInit() 
         {
-            rpn.Add(new RegToPropertyName(PLCRegister.RegChangedEventArgs.REG_TYPE.COIL, ADDR_M_HasElectricCurrent, 1, "HasElectricity"));
-            rpn.Add(new RegToPropertyName(PLCRegister.RegChangedEventArgs.REG_TYPE.COIL, ADDR_M_HasFan, 1, "HasFan"));
+            rpn.Add(new RegToPropertyName(PLCRegister.RegChangedEventArgs.REG_TYPE.COIL, ADDR_M_HasElectricCurrent, 1, nameof(HasElectricity)));
+            rpn.Add(new RegToPropertyName(PLCRegister.RegChangedEventArgs.REG_TYPE.COIL, ADDR_M_HasFan, 1, nameof(HasFan)));
 
-            rpn.Add(new RegToPropertyName(PLCRegister.RegChangedEventArgs.REG_TYPE.REG, ADDR_D_ChannelCnt, 1, "ChannelCnt"));
-            rpn.Add(new RegToPropertyName(PLCRegister.RegChangedEventArgs.REG_TYPE.REG, ADDR_D_HeatUpdate, 1, "HeatUpdate_R"));
-            rpn.Add(new RegToPropertyName(PLCRegister.RegChangedEventArgs.REG_TYPE.REG, ADDR_D_CurrUpdate, 1, "CurrUpdate"));        
+            rpn.Add(new RegToPropertyName(PLCRegister.RegChangedEventArgs.REG_TYPE.REG, ADDR_D_ChannelCnt, 1, nameof(ChannelCnt)));
+            rpn.Add(new RegToPropertyName(PLCRegister.RegChangedEventArgs.REG_TYPE.REG, ADDR_D_HeatUpdate, 1, nameof(HeatUpdate_R)));
+            rpn.Add(new RegToPropertyName(PLCRegister.RegChangedEventArgs.REG_TYPE.REG, ADDR_D_CurrUpdate, 1, nameof(CurrUpdate)));        
         }
 
         public void OnPoll()
@@ -97,23 +97,19 @@ namespace FLY.FeedbackRenZiJia.Server
                 if (DateTime.Now.Subtract(modbusserver.LastCommDT).TotalSeconds > 3)
                 {
                     //有3秒没通讯
-                    Errno = -1;
+                    IsConnected = false;
                 }
                 else
                 {
-                    Errno = 0;
+                    IsConnected = true;
                 }
         }
 
         #region PLCLink 成员
         #region 状态
 
-        /// <summary>
-        /// -1 HMI 没有连接到 本服务器; -2 串口打开异常
-        /// </summary>
-        public int Errno { get; set; } = -1;
 
-        public int RetCode { get; set; }
+        public bool IsConnected { get; private set; }
 
         #endregion
 
@@ -137,6 +133,18 @@ namespace FLY.FeedbackRenZiJia.Server
                 return mPLCRegs.GetBool(ADDR_M_HasFan);
             }
         }
+
+
+        public void SetChannelCnt(UInt16 channelCnt)
+        {
+            ChannelCnt = channelCnt;
+        }
+        public void SetHeatUpdate(UInt16 heatUpdate)
+        {
+            HeatUpdate = heatUpdate;
+
+        }
+
         public ushort ChannelCnt
         {
             get
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HeatBuf.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HeatBuf.cs
index 16947a7601edab83867f0a390559aeefefa28223..f512cbba467af46a4fe72cdbc7b5efc4e1971336 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HeatBuf.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HeatBuf.cs
@@ -31,13 +31,13 @@ namespace FLY.FeedbackRenZiJia.Server
         /// <summary>
         /// 加热生效曲线,允许为空,则不生效
         /// </summary>
-        public int[] HeatEffectCurve { get; set; } = new int[] { 3, 4, 5, 6, 5, 4, 3 };
+        public int[] HeatEffectCurve { get; set; } = new int[] { 3, 4, 7, 4, 3 };
 
 
         /// <summary>
         /// 厚度稳定范围 %, 偏差在范围内,都是稳定的 
         /// </summary>
-        public int StableRange { get; set; } = 2;
+        public int StableRange { get; set; } = 4;
 
 
 
@@ -46,7 +46,7 @@ namespace FLY.FeedbackRenZiJia.Server
         /// <summary>
         /// 对位模式, 加热与厚度相关性阀值, 相关性 >=0.7
         /// </summary>
-        public double ThresholdR { get; set; } = 0.7;
+        public double ThresholdR { get; set; } = 0.75;
 
 
         /// <summary>
@@ -74,10 +74,11 @@ namespace FLY.FeedbackRenZiJia.Server
 
         #region 对位
 
+
         /// <summary>
-        /// 对位查找范围 默认 ±120°, 最大值 180°,最小值 50°
+        /// 对位查找范围 默认 ±30°, 最大值 90°,最小值 10°
         /// </summary>
-        public int SearchAngleRange { get; set; } = 120;
+        public int SearchRange { get; set; } = 10;
 
         /// <summary>
         /// 计算的最佳复位区号
@@ -176,13 +177,17 @@ namespace FLY.FeedbackRenZiJia.Server
         /// </summary>
         int BufSize = 60;
 
-        public List<FlyData_FeedbackHeat> mData;
+        public List<ThickHeat2> mData;
 
         /// <summary>
         /// 最后一幅数据,单位 channelcnt, 可以有double.NaN
         /// </summary>
         public double[] ThickPercents=null;
         /// <summary>
+        /// 最后一幅数据的混合次数
+        /// </summary>
+        public int MixCnt = 1;
+        /// <summary>
         /// 最后一幅数据的复位区号
         /// </summary>
         public int OrgBoltNo = 1;
@@ -192,14 +197,14 @@ namespace FLY.FeedbackRenZiJia.Server
         /// </summary>
         public int LastHeatDiffMaxMin = 0;
 
-
+        public bool HasMaxR = false;
         static HeatBuf()
         {
 
         }
         public HeatBuf()
         {
-            mData = new List<FlyData_FeedbackHeat>();
+            mData = new List<ThickHeat2>();
             
             if (!Load())
                 Save();
@@ -224,6 +229,7 @@ namespace FLY.FeedbackRenZiJia.Server
                 ThresholdMaxMin = 40;
             }
         }
+
         public void SetToBestThickPercents()
         {
             MoveThickPercents(BestOrgBoltNo);
@@ -280,6 +286,7 @@ namespace FLY.FeedbackRenZiJia.Server
         /// </summary>
         public bool Add(Lc_ThickHeat thickHeat)
         {
+            HasMaxR = false;
             //thicks 的数据量一定要是 BoltCnt
             //heats 的数据量一定要是 ChannelCnt
             //不是返回 false
@@ -305,9 +312,10 @@ namespace FLY.FeedbackRenZiJia.Server
 
 
             CurrTime = thickHeat.Time;
-            ThickPercents = thkpercents; 
+            ThickPercents = thkpercents;
+            MixCnt = 1;
             OrgBoltNo = thickHeat.OrgBoltNo;
-            Curr2Sigma = thkpercents.Sigma();
+            Curr2Sigma = thkpercents.Sigma() * 2;
 
 
 
@@ -331,27 +339,25 @@ namespace FLY.FeedbackRenZiJia.Server
                 return true;
             }
 
-
-
-            FlyData_FeedbackHeat d = new FlyData_FeedbackHeat()
+            ThickHeat2 d = new ThickHeat2()
             {
-                //thickHeat = thickHeat,
-                Stability = STABILITY.IDLE,
+                thickHeat = Lc_ThickHeat_Clone(thickHeat),
                 ThickAvg = thkavg,//肯定有数据
                 ThickPercents = thkpercents,
                 HeatPercents = heatPercents
             };
-            string json = Newtonsoft.Json.JsonConvert.SerializeObject(thickHeat);
-            d.thickHeat = Newtonsoft.Json.JsonConvert.DeserializeObject<Lc_ThickHeat>(json);
-                
-            
+
             //更新每个分区的稳定状态
             UpdateStable3(d);
             return true;
         }
+        Lc_ThickHeat Lc_ThickHeat_Clone(Lc_ThickHeat thickHeat) 
+        {
+            string json = Newtonsoft.Json.JsonConvert.SerializeObject(thickHeat);
+            return Newtonsoft.Json.JsonConvert.DeserializeObject<Lc_ThickHeat>(json);
+        }
 
-
-        void DataAdd(FlyData_FeedbackHeat d)
+        void DataAdd(ThickHeat2 d)
         {
             if (mData.Count == BufSize)
             {
@@ -368,7 +374,7 @@ namespace FLY.FeedbackRenZiJia.Server
         /// </summary>
         /// <param name="d"></param>
         /// <returns></returns>
-        void UpdateStable3(FlyData_FeedbackHeat d)
+        void UpdateStable3(ThickHeat2 d)
         {
             if (mData.Count() == 0)//没有以前的数据
             {
@@ -377,6 +383,16 @@ namespace FLY.FeedbackRenZiJia.Server
             }
 
             var d_last = mData.Last();
+            {
+                double sec_delta = Math.Abs(d.thickHeat.RPeriod.TotalSeconds - d_last.thickHeat.RPeriod.TotalSeconds);
+                if (sec_delta / d_last.thickHeat.RPeriod.TotalSeconds > 0.1)
+                {
+                    //旋转时间不同,无法比较
+                    Stability = STABILITY.ERROR_ROTATE_CHANGED;
+                    goto _error;
+                }
+            }
+
             if (d.thickHeat.RAngle != d_last.thickHeat.RAngle)
             {
                 //旋转角度不同,无法比较
@@ -412,29 +428,54 @@ namespace FLY.FeedbackRenZiJia.Server
             GetPercentDatas3(d, d_last,
                 out double[] thickpercents_diff, out double[] heatpercents_diff);
 
+
+
             //通过简单的范围比较计算稳定性
             //当Kp, 错位,就会另 稳定性的值很低
             bool[] isStables = CalStable(thickpercents_diff, heatpercents_diff);
             double currR = 1.0 * isStables.Count(b => b) / isStables.Count();
-            double currR2 = Misc.MyMath.Correl(thickpercents_diff, heatpercents_diff);
-            if (double.IsNaN(currR2))
-                currR2 = -1;
-
-            CurrR = Math.Max( currR, currR2 );
             BoltIsStable = isStables;
-            LastHeatDiffMaxMin = (int)Common.MyMath.CalMaxMin(heatpercents_diff);
-
-            if (CurrR >= ThresholdR)
+            if (heatpercents_diff.All(h => h == 0))
             {
-                Stability = STABILITY.OK_CORREL;
+                //加热没有变化, 
+                CurrR = currR;
+                if (CurrR >= ThresholdR)
+                {
+                    Stability = STABILITY.OK_CORREL;
+
+                    //把 d 合并到 d_last
+                    mData.RemoveAt(mData.Count() - 1);
+                    d.Mix(d_last);
 
+                    //更新图
+                    ThickPercents = d.ThickPercents;
+                    MixCnt = d.MixCnt;
+                    Curr2Sigma = ThickPercents.Sigma() * 2;
+                }
+                else
+                {
+                    Stability = STABILITY.ERROR_CORREL;
+                }
             }
             else
             {
-                Stability = STABILITY.ERROR_CORREL;
-            }
+                double currR2 = Misc.MyMath.Correl(thickpercents_diff, heatpercents_diff);
+                if (double.IsNaN(currR2))
+                    currR2 = -1;
+
+                CurrR = Math.Max(currR, currR2);
 
+                if (CurrR >= ThresholdR)
+                {
+                    Stability = STABILITY.OK_CORREL;
+                }
+                else
+                {
+                    Stability = STABILITY.ERROR_CORREL;
+                }
+            }
 
+            LastHeatDiffMaxMin = (int)Common.MyMath.CalMaxMin(heatpercents_diff);
 
 
             //通过平移 达到最大 加热厚度相关性
@@ -478,11 +519,8 @@ namespace FLY.FeedbackRenZiJia.Server
                 if (maxMin >= ThresholdMaxMin)
                 {
                     //通过平移找最大相关性
-                    double range_percent =  1.0 * SearchAngleRange / 360;
-                    if (range_percent < 0.1 || range_percent > 0.5)
-                        range_percent = 0.3;
                     //计算平移
-                    Common.MyMath.CalBestMove(heatpercents_diff, thickpercents_diff, range_percent, out int offset, out double heatThickR);
+                    Common.MyMath.CalBestMove(heatpercents_diff, thickpercents_diff, SearchRange, out int offset, out double heatThickR);
 
 
                     if (heatThickR > maxOffsetHeatThickR)
@@ -515,6 +553,7 @@ namespace FLY.FeedbackRenZiJia.Server
                     MaxR_Id0 = maxOffsetHeatThickR_id;
                     MaxR_Id1 = d.thickHeat.ID;
                     MaxR_Time = DateTime.Now;
+                    HasMaxR = true;
                 }
             }
 
@@ -540,7 +579,7 @@ namespace FLY.FeedbackRenZiJia.Server
             return orgBoltNo;
         }
         void GetPercentDatas3(
-            FlyData_FeedbackHeat d, FlyData_FeedbackHeat d_last,
+            ThickHeat2 d, ThickHeat2 d_last,
             out double[] thickpercents_diff, out double[] heatpercents_diff)
         {
             //厚度%偏差
@@ -548,12 +587,9 @@ namespace FLY.FeedbackRenZiJia.Server
             //当两幅图复位区号不一致时,移动以前的数据,使之一致
             if (d.thickHeat.OrgBoltNo != d_last.thickHeat.OrgBoltNo)
             {
-                var thks_last = Common.MyMath.Move(d_last.thickHeat.Thicks, d.thickHeat.OrgBoltNo - d_last.thickHeat.OrgBoltNo);
-
-                //转为 加热棒数量
-                thks_last = Common.MyMath.ZoomOut(thks_last, BoltCnt / ChannelCnt);
-
-                thickpercents_last = Common.MyMath.GetPercent(thks_last);
+                int z = d.thickHeat.Thicks.Count() / d.ThickPercents.Count();
+                int move = (d.thickHeat.OrgBoltNo - d_last.thickHeat.OrgBoltNo) / z;
+                thickpercents_last = Common.MyMath.Move(d_last.ThickPercents, move);
             }
             else {
                 thickpercents_last = d_last.ThickPercents;
@@ -660,14 +696,14 @@ namespace FLY.FeedbackRenZiJia.Server
         #region 参数
 
         /// <summary>
-        /// 对位查找范围 默认 ±120°, 最大值 180°,最小值 50°
+        /// 对位查找范围 默认 ±10区
         /// </summary>
-        public int SearchAngleRange = 120;
+        public int SearchRange = 10;
 
         /// <summary>
         /// 加热生效曲线,允许为空,则不生效
         /// </summary>
-        public int[] HeatEffectCurve;
+        public int[] HeatEffectCurve = new int[] { 3, 4, 7, 4, 3 };
 
 
         /// <summary>
@@ -678,13 +714,13 @@ namespace FLY.FeedbackRenZiJia.Server
         /// <summary>
         /// 对位模式, 加热与厚度相关性阀值, 相关性 >=0.7
         /// </summary>
-        public double ThresholdR = 0.7;
+        public double ThresholdR = 0.75;
 
 
         /// <summary>
         /// 对位模式 厚度%差 的极差 >= +4%-4%=8%, 单位%
         /// </summary>
-        public int ThresholdMaxMin = 20;
+        public int ThresholdMaxMin = 30;
 
 
         /// <summary>
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HeatCell.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HeatCell.cs
index 7abe84f23bf7c1d5e821be23578e537f8a976f6d..bbf3a53c7f7530a6e23637d7b57d9921e08709f7 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HeatCell.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HeatCell.cs
@@ -28,13 +28,22 @@ namespace FLY.FeedbackRenZiJia.Server
         /// <summary>
         /// HeatOffset = ThickPercent * Kp
         /// </summary>
-        public double Kp { get; set; } = 3;
+        public double Kp { get; set; } = 2;
 
+        /// <summary>
+        /// 自动计算时,Kp最大值
+        /// </summary>
+        public double MaxKp { get; set; } = 5;
+
+        /// <summary>
+        /// 自动计算时,Kp最大值
+        /// </summary>
+        public double MinKp { get; set; } = 1;
 
         /// <summary>
         /// 平滑的阀值,只有超出阀值,才平滑
         /// </summary>
-        public double ThresholdHeatSigma { get; set; } = 10;
+        public double ThresholdHeatSigma { get; set; } = 7;
 
 
         /// <summary>
@@ -47,13 +56,22 @@ namespace FLY.FeedbackRenZiJia.Server
         /// <summary>
         /// 厚度控制线 , 厚度% 大于 厚度控制线 自动才会加热控制  
         /// </summary>
-        public int CtrlLine { get; set; } = 2;
+        public double CtrlLine { get; set; } = 2;
 
         /// <summary>
         /// 最大加热量 默认100%
         /// </summary>
         public int MaxHeat { get; set; } = 100;
 
+        /// <summary>
+        /// 分级控制线
+        /// </summary>
+        public LvCtrlLine[] LvCtrlLines { get; set; }
+
+        /// <summary>
+        /// 对厚度数据横向平滑 单位加热棒数。 特别的当Smooth = ChannelCnt/2 就是膜泡的偏心度
+        /// </summary>
+        public int ThickSmoothRange { get; set; } = 5;
         #endregion
 
         #region 状态
@@ -65,7 +83,10 @@ namespace FLY.FeedbackRenZiJia.Server
         [DoNotCheckEquality]
         public double[] ThickPercents { get; set; }
 
-
+        /// <summary>
+        /// 当前 thickPercents 混合数
+        /// </summary>
+        public int CurrMix { get; set; }
 
         /// <summary>
         /// 当前方向的加热策略,必须保证 0~100
@@ -111,24 +132,8 @@ namespace FLY.FeedbackRenZiJia.Server
         /// <summary>
         /// 自动对位
         /// </summary>
-        public bool IsAutoONo { get; set; } = true;
+        public bool IsAutoONo { get; set; } = false;
 
-        /// <summary>
-        /// 当前正在自动对位模式
-        /// </summary>
-        public AutoONoStatusEnum AutoONoStatus { get; private set; }
-        /// <summary>
-        /// 自动对位模式 信息
-        /// </summary>
-        public string AutoONoMsg { get; private set; }
-        /// <summary>
-        /// 自动对位 那幅空的图
-        /// </summary>
-        public long AutoONoId0 { get; private set; } = -1;
-        /// <summary>
-        /// 自动对位 加热后生效的图
-        /// </summary>
-        public long AutoONoId1 { get; private set; } = -1;
         #endregion
         #endregion
 
@@ -159,7 +164,7 @@ namespace FLY.FeedbackRenZiJia.Server
 
             if (ThresholdHeatSigma < 1 || ThresholdHeatSigma > 50)
             {
-                ThresholdHeatSigma = 10;
+                ThresholdHeatSigma = 7;
             }
 
             if (CtrlLine < 0 || CtrlLine > 10)
@@ -182,7 +187,7 @@ namespace FLY.FeedbackRenZiJia.Server
             //当复位区号改变了,同时也修改heatCell 的 thickPercents
             if (e.PropertyName == nameof(this.blowingService.OrgBoltNo)) {
                 if (mHeatBuf.MoveThickPercents(this.blowingService.OrgBoltNo))
-                    SetThickPercents(mHeatBuf.ThickPercents);
+                    SetThickPercents(mHeatBuf.ThickPercents, mHeatBuf.MixCnt);
             }
         }
 
@@ -198,235 +203,321 @@ namespace FLY.FeedbackRenZiJia.Server
             Heats = new int[ChannelCnt];
             PreHeats = new int[ChannelCnt];
             Offsets = new int[ChannelCnt];
-
-            ResetAuto();
         }
 
-        /// <summary>
-        /// 复位自动状态
-        /// </summary>
-        public void ResetAuto()
+        bool IsKpDiff()
         {
-            AutoONoStatus = AutoONoStatusEnum.Init;
-            AutoONoMsg = "等待 加热=0,厚度稳定";
-            AutoONoId0 = -1;
-            AutoONoId1 = 0;
-        }
-
-        void checkResetAuto() {
-            if (mHeatBuf.Stability != STABILITY.OK_CORREL)
-                return;
-
-            if (Heats.All(h => h == 0))
+            if (mHeatBuf.BestKp < Kp * 0.4)
             {
-                //加热全部为0
-                //复位状态
-                ResetAuto();
+                //这个需要严重警告, Kp设得太大
+                return true;
+            }
+            else if (mHeatBuf.BestKp > Kp * 3)
+            {
+                //这个Kp太小了, 提示一次吧,不然很慢
+                return true;
+            }
+            else
+            {
+
+                return false;
             }
         }
-        void AutoONoOnPoll()
+        bool IsONoDiff()
         {
-            checkResetAuto();
+            if (Math.Abs(mHeatBuf.BestOrgBoltNo - blowingService.OrgBoltNo) > 0)
+            {
+                return true;
+            }
+            else
+            {
+                return false;
+            }
+        }
 
+        /// <summary>
+        /// 自动模式!!!!!
+        /// </summary>
+        public void Auto()
+        {
+            if (mHeatBuf.mData.Count() == 0)
+                return;
 
-            switch (AutoONoStatus)
+           
+            if (IsAutoONo) 
             {
-                case AutoONoStatusEnum.Init:
+                if (mHeatBuf.HasMaxR) 
+                {
+                    if(IsONoDiff())
                     {
-                        if (mHeatBuf.Stability != STABILITY.OK_CORREL)
-                            break;
-
-                        if (Heats.All(h => h == 0))
-                        {
-                            //判断当前加热全部为空, 且稳定性大于>0.7
-
-                            //转为 加热棒数量
-                            double[] thickPercents = ThickPercents;
+                        this.blowingService.PropertyChanged -= BlowingService_PropertyChanged;
+                        blowingService.OrgBoltNo = mHeatBuf.BestOrgBoltNo;
+                        //不保存
 
-                            double autoONoKp = Kp;
-                            if (autoONoKp < 1)
-                                autoONoKp = 1;
-
-                            int[] offsets = new int[ChannelCnt];
-                            while (true)
-                            {
-                                for (int i = 0; i < ChannelCnt; i++)
-                                {
-                                    double percent = thickPercents[i];
-                                    offsets[i] = (int)Math.Round(percent * autoONoKp);
-                                }
-
-                                int[] heatPercents = offsets;//放大数量为分区量
-                                heatPercents = Common.MyMath.Filter(heatPercents, mHeatBuf.HeatEffectCurve);//平滑
-                                int maxMin = Common.MyMath.CalMaxMin(heatPercents);
-
-                                if (maxMin >= mHeatBuf.ThresholdMaxMin)
-                                {
-                                    AutoONoStatus = AutoONoStatusEnum.Step2;
-                                    AutoONoMsg = "厚度已经稳定,对位加热,等待结果";
-                                    AutoONoId0 = mHeatBuf.mData.Last().thickHeat.ID;
-                                    AutoONoId1 = -1;
-                                    break;
-                                }
-                                else {
-                                    if (maxMin < 2) {
-                                        //肯定是厚度太好
-                                        AutoONoStatus = AutoONoStatusEnum.Fail;
-                                        AutoONoMsg = "失败,加热变化量太小,转到正常模式";
-                                        AutoONoId0 = -1;
-                                        AutoONoId1 = -1;
-                                        return;
-                                    }
-                                    //加热变化不够多, 变大Kp
-                                    double k = autoONoKp * mHeatBuf.ThresholdMaxMin / maxMin - autoONoKp;
-                                    if (k < 0.5)
-                                        k = 0.5;
-                                    autoONoKp += k;
-                                }
-                            }
+                        this.blowingService.PropertyChanged += BlowingService_PropertyChanged;
 
-                            Offsets = offsets;
-
-                            UpdatePreHeats();//这句一定要加!!!! 不然没法平滑,没法加热
-
-                            //上面已经有平滑,不需要再执行 Smooth()
-
-                            ModifyBase();
+                        mHeatBuf.SetToBestThickPercents();
+                        SetThickPercents(mHeatBuf.ThickPercents, mHeatBuf.MixCnt);
+                        
+                    }
 
-                            HeatApply();
-                        }
+                    if(IsKpDiff())
+                    {
+                        if (mHeatBuf.BestKp > MaxKp)
+                            Kp = MaxKp;
+                        else if (mHeatBuf.BestKp < MinKp)
+                            Kp = MinKp;
                         else
-                        {
-                            //虽然稳定了,但已经被人加热了,无法启动对位模式
-                            AutoONoStatus = AutoONoStatusEnum.Fail;
-                            AutoONoMsg = "加热不为0,无法启动对位模式";
-                            return;
-                        }
+                            Kp = mHeatBuf.BestKp;
+                        //不保存
                     }
-                    break;
-                case AutoONoStatusEnum.Step2:
-                    {
-                        //不需要等 STABILITY.OK_CORREL
-                        if (mHeatBuf.MaxR_Id1 == mHeatBuf.mData.Last().thickHeat.ID)//算出结果
-                        {
-                            string msg = "对位完成";
-                            msg += $",[相关性]{mHeatBuf.MaxR:F2}";
-                            msg += $",[极差]{mHeatBuf.MaxMin}%";
-                            if (blowingService.OrgBoltNo != mHeatBuf.BestOrgBoltNo)
-                            {
-                                //调节 mHeatBuf.ThickPercents 移动到 mHeatBuf.BestOrgBoltNo
-                                //使mHeatBuf状态为稳定
-                                mHeatBuf.SetToBestThickPercents();
-                                SetThickPercents(mHeatBuf.ThickPercents);
+                }
+            }
 
+            if (mHeatBuf.Stability == STABILITY.OK_CORREL)//稳定 与 待定时 加热
+            {
+                
 
-                                msg += $",[复位号]{blowingService.OrgBoltNo}->{mHeatBuf.BestOrgBoltNo}";
-                                blowingService.OrgBoltNo = mHeatBuf.BestOrgBoltNo;
-                                blowingService.Apply();
-                            }
-                            else
-                            {
-                                msg += $",[复位号]正确";
-                            }
+                int[] offsets;
+                bool toAutoONoHeat = false;
+                if (IsAutoONo && Heats.All(h => h == Heats[0]))
+                {
+                    //全部为相同, 对位加热!!!
+                    offsets = SetHeatForAutoONo();
+                    toAutoONoHeat = true;
+                }
+                else
+                { 
+                    var thickPercents = ThickPercents;//肯定没有 double.NaN
+                    double ctrlLine = getCtrlLine(CurrMix);
+                    offsets = new int[ChannelCnt];
 
-                            if (Math.Abs(Kp - mHeatBuf.BestKp) > 0.2)
-                            {
-                                msg += $",[Kp]{Kp:F1}->{mHeatBuf.BestKp:F1}";
-                                Kp = mHeatBuf.BestKp;
-                                Apply();
-                            }
-                            else
-                            {
-                                msg += $",[Kp]正确";
-                            }
-                            //对位完成
-                            AutoONoStatus = AutoONoStatusEnum.Success;
-                            AutoONoMsg = msg;
-                            AutoONoId0 = mHeatBuf.MaxR_Id0;
-                            AutoONoId1 = mHeatBuf.MaxR_Id1;
-                            return;
-                        }
-                        else
-                        {
-                            if (AutoONoId0 < mHeatBuf.mData.First().thickHeat.ID)
-                            {
-                                //失败,对位过程有大波动, 全部数据被清除?
-                                AutoONoStatus = AutoONoStatusEnum.Fail;
-                                AutoONoMsg = "失败,对位过程有大波动";
-                                return;
-                            }
+                    //获取目标线。 正常全部都是0
+                    var targets = getTargets(thickPercents, ctrlLine);
 
-                            //数据稳定了,且加热变化量为0
-                            if (mHeatBuf.Stability == STABILITY.OK_CORREL && mHeatBuf.LastHeatDiffMaxMin == 0)
+                    int range5 = 5;
+                    for (int i = 0; i < ChannelCnt; i++)
+                    {
+                        double delta = (thickPercents[i] - targets[i]);
+                        
+                        if (Math.Abs(delta) > ctrlLine) 
+                        {
+                            //这个点,及附近,都需要调节, 附近为±2
+                            for (int j = 0; j < range5; j++) 
                             {
-                                //数据稳定了, 但没有出结果!!!!!
-                                AutoONoStatus = AutoONoStatusEnum.Fail;
-                                AutoONoMsg = "失败,对位加热相关性不够";
-                                return;
+                                int index = i - range5 / 2 + j;
+                                if (index < 0) index += ChannelCnt;
+                                else if (index >= ChannelCnt) index -= ChannelCnt;
+                                offsets[index] = (int)calOffset(delta, ctrlLine, Kp);
                             }
                         }
                     }
-                    break;
+                }
+
+                Offsets = offsets;
+                UpdatePreHeats();//这句一定要加!!!! 不然没法平滑,没法加热
+
+                if (toAutoONoHeat)
+                {
+
+                }
+                else
+                {
+                    if (!IsForbidUpDown)//禁止整体上移下降
+                        ModifyBase();//自动整体上移下降
+                    
+                    Smooth();//平滑,它会导致Offset被修改,<0的都被删除掉
+                }
+                HeatApply();//执行加热
             }
         }
 
-        /// <summary>
-        /// 自动模式!!!!!
-        /// </summary>
-        public void Auto()
+        List<Range> getSignList(double[] thickPercents) 
         {
-            if (mHeatBuf.mData.Count() == 0)
-                return;
-            //&& mHeatBuf.IsStable()
+            List<Range> signList = new List<Range>();
+            bool sign0 = thickPercents[0] > 0;
+            bool last_sign = sign0;
+            signList.Add(new Range() { Begin = 0, End = 0 });
 
-
-            if (IsAutoONo)
+            for (int i = 1; i < ChannelCnt; i++)
             {
-                AutoONoOnPoll();
+                bool sign = thickPercents[i] > 0;
+                if (sign == last_sign)
+                    signList.Last().End = i;
+                else
+                {
+                    signList.Add(new Range() { Begin = i, End = i });
+                }
+                last_sign = sign;
+            }
+            if (last_sign == sign0)
+            {
+                //最后一个,与第1个,可以合体
+                signList.First().Begin = signList.Last().Begin - ChannelCnt;
+                signList.RemoveAt(signList.Count() - 1);
             }
 
+            return signList;
+        }
 
+        void setTargets(double[] targets, double target, int index, int range) 
+        {
+            for (int j = 0; j < range; j++)
+            {
+                int idx = index - range / 2 + j;
+                if (idx < 0) idx += ChannelCnt;
+                else if (idx >= ChannelCnt) idx -= ChannelCnt;
+                targets[idx] = target;
+            }
+        }
+        double[] getTargets(double[] thickPercents, double ctrlLine) 
+        {
+            int range6 = 6;
+            int range3 = 3;
+            var signList = getSignList(thickPercents);
+            signList = signList.FindAll(s => s.Width >= range6);
 
-            if (
-                (!IsAutoONo)
-                || ((IsAutoONo) && (AutoONoStatus == AutoONoStatusEnum.Fail || AutoONoStatus == AutoONoStatusEnum.Success))
-                )
+            double[] targets = new double[ChannelCnt];
+            foreach (var r in signList)
             {
-                if (mHeatBuf.Stability == STABILITY.OK_CORREL)//稳定 与 待定时 加热
+                int i = r.Mid;
+                if (i < 0)//第0段,Begin 为负数。 所以需要判断
+                    i += ChannelCnt;
+                if (thickPercents[i] > 0)
+                {
+                    setTargets(targets, -ctrlLine, i, range3);
+                }
+                else
                 {
-                    //转为 加热棒数量
-                    var thickPercents = ThickPercents;
+                    setTargets(targets, ctrlLine, i, range3);
+                }
+            }
+            return targets;
+        }
+        bool IsLvCtrlLinesValid()
+        {
+            if (LvCtrlLines != null && LvCtrlLines.Count() > 0 && LvCtrlLines.All(lv => lv != null))
+            {
+                return true;
+            }
+            return false;
+        }
+        double calOffset(double delta, double ctrlLine, double kp)
+        {
+            double d = Math.Abs(delta);
 
-                    int[] offsets = new int[ChannelCnt];
-                    for (int i = 0; i < ChannelCnt; i++)
+            if (d >= ctrlLine)
+            {
+
+            }
+            else if (d >= ctrlLine * 2 / 3)
+            {
+                d = (d - ctrlLine * 2 / 3) * 2 + (ctrlLine * 1 / 3);
+            }
+            else if (d >= ctrlLine * 1 / 3)
+            {
+                d = (d - ctrlLine * 1 / 3) * 1 + (ctrlLine * 0 / 3);
+            }
+            else
+            {
+                d = 0;
+            }
+            double offset = d * kp;
+            return delta >= 0 ? offset : -offset;
+        }
+        double getCtrlLine(int currMix)
+        {
+            double ctrlLine = CtrlLine;
+            if (IsLvCtrlLinesValid())
+            {
+                for (int i = 0; i < LvCtrlLines.Count(); i++)
+                {
+                    int index = LvCtrlLines.Count() - 1 - i;
+                    if (currMix >= LvCtrlLines[index].Mix)
                     {
-                        if (mHeatBuf.BoltIsStable[i] && //稳定
-                            (Math.Abs(thickPercents[i]) > CtrlLine))//在控制线已外
-                        {
-                            offsets[i] = (int)Math.Round(thickPercents[i] * Kp);
-                        }
+                        ctrlLine = LvCtrlLines[index].CtrlLine;
+                        break;
                     }
+                }
+            }
+            return ctrlLine;
+        }
+        int[] SetHeatForAutoONo()
+        {
+            //转为 加热棒数量
+            var thickPercents = ThickPercents;
+            var offsets = new int[ChannelCnt];
+            //找到最厚的点,加热为 最小加热量极差, 这个点可能小于控制线,不管它
+            int max_i = -1;
+            double max_thkP = -1;
 
-                    Offsets = offsets;
-                    UpdatePreHeats();//这句一定要加!!!! 不然没法平滑,没法加热
-                    
-                    if (!IsForbidUpDown)//禁止整体上移下降
-                        ModifyBase();//自动整体上移下降
-                    
-                    Smooth();//平滑,它会导致Offset被修改,<0的都被删除掉
+            for (int i = 0; i < ChannelCnt; i++)
+            {
+                if (max_i == -1 || thickPercents[i] > Math.Abs(max_thkP))
+                {
+                    max_thkP = thickPercents[i];
+                    max_i = i;
+                }
+            }
+
+            int range_i = 2;//最少也要5个加热棒, 最多 9
+
+            //把 max_i 范围 大于 控制线 的 都设置为 最小加热量极差
+            for (int i = range_i + 1; i < 5; i++)
+            {
+                int begin_i = max_i - i;
+                if (begin_i < 0) begin_i += ChannelCnt;
+
+                int end_i = max_i + i;
+                if (end_i >= ChannelCnt) end_i -= ChannelCnt;
 
-                    HeatApply();//执行加热
+                if ((thickPercents[begin_i] > CtrlLine) && (thickPercents[end_i] > CtrlLine))
+                {
+                    //继续
+                    range_i = i;
+                }
+                else
+                {
+                    break;
                 }
             }
-        }
 
+            //offsets[max_i] = mHeatBuf.ThresholdMaxMin;
+            for (int i = 0; i < range_i * 2 + 1; i++)
+            {
+                int index = max_i - range_i + i;
+                if (index < 0) index += ChannelCnt;
+                else if (index >= ChannelCnt) index -= ChannelCnt;
 
-        public void SetThickPercents(double[] thkpercents)
+                offsets[index] = mHeatBuf.ThresholdMaxMin + 10;
+            }
+            return offsets;
+        }
+        public void SetThickPercents(double[] thkpercents, int mix)
         {
+            CurrMix = mix;
             thkpercents = MakeThickPercentsFull(thkpercents);
-            for (int i = 0; i < thkpercents.Count(); i++)
-                thkpercents[i] = Math.Round(thkpercents[i], 2);
-            ThickPercents = thkpercents;
+
+            //数据横向平滑
+            double[] thkpercents2 = new double[ChannelCnt];
+            for (int i = 0; i < ChannelCnt; i++) 
+            {
+                double sum = 0;
+                for (int j = 0;  j < ThickSmoothRange; j++) 
+                {
+                    int idx = i - ThickSmoothRange / 2 + j;
+                    if (idx < 0)
+                        idx += ChannelCnt;
+                    else if (idx >= ChannelCnt)
+                        idx -= ChannelCnt;
+
+                    sum += thkpercents[idx];
+                }
+                sum /=ThickSmoothRange;
+                thkpercents2[i] = Math.Round(sum, 2);
+            }
+
+            ThickPercents = thkpercents2;
         }
 
         #region IHeatCell 接口 成员函数
@@ -801,8 +892,8 @@ namespace FLY.FeedbackRenZiJia.Server
                 Heats[i] = heat;
 
             }
-            NotifyPropertyChanged("Offsets");
-            NotifyPropertyChanged("Heats");
+            NotifyPropertyChanged(nameof(Offsets));
+            NotifyPropertyChanged(nameof(Heats));
             Base = 0;
 
             AfterHeatApplyEvent?.Invoke(this);
@@ -894,23 +985,43 @@ namespace FLY.FeedbackRenZiJia.Server
         /// <summary>
         /// HeatOffset = ThickPercent * Kp
         /// </summary>
-        public double Kp= 3;
+        public double Kp = 2;
 
 
+        /// <summary>
+        /// 自动计算时,Kp最大值
+        /// </summary>
+        public double MaxKp= 5;
+
+        /// <summary>
+        /// 自动计算时,Kp最大值
+        /// </summary>
+        public double MinKp  = 1;
+
         /// <summary>
         /// 自动对位
         /// </summary>
-        public bool IsAutoONo = true;
+        public bool IsAutoONo = false;
 
         /// <summary>
         /// 最大加热量
         /// </summary>
         public int MaxHeat = 100;
 
+        /// <summary>
+        /// 分级控制线
+        /// </summary>
+        public LvCtrlLine[] LvCtrlLines;
+
+        /// <summary>
+        /// 对厚度数据横向平滑 单位加热棒数。 特别的当Smooth = ChannelCnt/2 就是膜泡的偏心度
+        /// </summary>
+        public int ThickSmoothRange = 5;
+
         /// <summary>
         /// 平滑的阀值,只有超出阀值,才平滑
         /// </summary>
-        public double ThresholdHeatSigma= 10;
+        public double ThresholdHeatSigma= 7;
 
 
         /// <summary>
@@ -923,7 +1034,7 @@ namespace FLY.FeedbackRenZiJia.Server
         /// <summary>
         /// 厚度控制线 , 厚度% 大于 厚度控制线 自动才会加热控制  
         /// </summary>
-        public int CtrlLine= 2;
+        public double CtrlLine= 2;
 
 
 
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HeatCheck.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HeatCheck.cs
index fcf702a26595da82364b4e18c0d63d5ee0bfdc32..456473c43bd0024e963a6f71a2af3c069111bced 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HeatCheck.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/HeatCheck.cs
@@ -203,7 +203,7 @@ namespace FLY.FeedbackRenZiJia.Server
 
         private void HeatCheck_PropertyChanged(object sender, PropertyChangedEventArgs e)
         {
-            if (e.PropertyName == "Enable")
+            if (e.PropertyName == nameof(Enable))
             {
                 if (Enable)
                     Start();
@@ -214,7 +214,7 @@ namespace FLY.FeedbackRenZiJia.Server
 
         void mHeatCell_PropertyChanged(object sender, PropertyChangedEventArgs e)
         {
-            if (e.PropertyName == "ChannelCnt") 
+            if (e.PropertyName == nameof(mHeatCell.ChannelCnt)) 
             {
                 Init();
                 Load();
@@ -236,7 +236,7 @@ namespace FLY.FeedbackRenZiJia.Server
             CheckStep = 0;
             counter = 0;
             Array.Clear(Bads, 0, Bads.Count());
-            NotifyPropertyChanged("Bads");
+            NotifyPropertyChanged(nameof(Bads));
             OpenCircuit = false;
             PowerOff = false;
             ShortCircuit = false;
@@ -269,7 +269,7 @@ namespace FLY.FeedbackRenZiJia.Server
                     else
                         Bads[i] = false;
                 }
-                NotifyPropertyChanged("Bads");
+                NotifyPropertyChanged(nameof(Bads));
 
                 OpenCircuit = Bads.Any(b => b);
             }
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/Model/HistoryDB.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/Model/HistoryDB.cs
index 83ccb35691fb01c246a74edd169669e224d1b5d8..feecb69fd83b3bfd5efc2b60915a13c69768252b 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/Model/HistoryDB.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/Model/HistoryDB.cs
@@ -54,7 +54,7 @@ namespace FLY.FeedbackRenZiJia.Server.Model
         public void GetFrame(long Id, AsyncCBHandler asyncDelegate, object asyncContext)
         {
             GetFrameReponse reponse = new GetFrameReponse();
-            reponse.Id = Id;
+            reponse.id = Id;
 
             Task.Factory.StartNew(() =>
             {
@@ -139,5 +139,88 @@ namespace FLY.FeedbackRenZiJia.Server.Model
 
             asyncDelegate(asyncContext, reponse);
         }
+
+        /// <summary>
+        /// 以Id为起始点, 向前或者向后获取最近通道改变时间不相同的数据 或 起效数据
+        /// </summary>
+        /// <param name="id"></param>
+        /// <param name="isPre">向前</param>
+        /// <param name="isTakeEffect">数据起效</param>
+        /// <param name="isDiffHTime">加热不同</param>
+        /// <param name="asyncDelegate"></param>
+        /// <param name="asyncContext"></param>
+        //[Call(typeof(GetFrameReponse))]
+        public async void GetFrameAdv(long id, bool isPre, bool isTakeEffect, bool isDiffHTime, AsyncCBHandler asyncDelegate, object asyncContext)
+        {
+            var reponse = new GetFrameReponse();
+            reponse.id = id;
+
+            //会慢,需要分个线程独立做这事
+            await Task.Factory.StartNew(() =>
+            {
+                if (id <= 0)
+                {
+                    //先获取真实ID
+                    string sql =
+                        $"SELECT {nameof(Db_ThickHeat.ID)} FROM { dbModel.TbThickHeat.TableName}" +
+                        $" ORDER BY {nameof(Db_ThickHeat.ID)} DESC" +
+                        $" LIMIT 1 OFFSET {-id}";
+                    var ret = dbModel.sqliteHelper.ExecuteScalar(sql);
+                    if (ret == DBNull.Value)
+                        return;
+
+                    id = Convert.ToInt32(ret);
+                }
+
+                string ctime_str = "";
+                if (isDiffHTime)
+                {
+                    DateTime ctime;
+                    //获取对应ID 的 通道改变时间
+                    {
+                        string sql =
+                            $"SELECT {nameof(Db_ThickHeat.HTime)} FROM { dbModel.TbThickHeat.TableName}" +
+                            $" WHERE {nameof(Db_ThickHeat.ID)} = {id}";
+                        var ret = dbModel.sqliteHelper.ExecuteScalar(sql);
+                        if (ret == DBNull.Value)
+                            return;
+
+                        ctime = Convert.ToDateTime(ret);
+                    }
+                    ctime_str = ctime.ToStringOfSQLiteFieldType();
+                }
+
+                List<Db_ThickHeat> db_thickHeats = null;
+                {
+                    string condition = "";
+                    string symbol = isPre ? "<" : ">";
+                    condition += $"WHERE {nameof(Db_ThickHeat.ID)}{symbol}{id}";
+                    if (isDiffHTime)
+                        condition += $" AND {nameof(Db_ThickHeat.HTime)}<>{ctime_str}";
+
+                    if (isTakeEffect)
+                        condition += $" AND {nameof(Db_ThickHeat.IsStable)}=TRUE";
+
+                    condition += $" ORDER BY {nameof(Db_ThickHeat.ID)}";
+                    if (isPre)
+                        condition += " DESC";
+
+                    condition += " LIMIT 1";
+
+                    db_thickHeats = dbModel.TbThickHeat.Find(condition);
+                }
+
+                if (db_thickHeats.Count() == 0)
+                {
+                    return;
+                }
+
+                var lc_thickHeat = Lc_AutoMapperProfile.Mapper.Map<Lc_ThickHeat>(db_thickHeats.First());
+
+                reponse.thickHeat = lc_thickHeat;
+            });
+
+            asyncDelegate(asyncContext, reponse);
+        }
     }
 }
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/PLCLink.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/PLCLink.cs
index 10328815b561a66cfada361254b0c4e77e1cc131..594d741b377557cc6174bdaa7d10dc7ea5dfe8ea 100644
--- a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/PLCLink.cs
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/PLCLink.cs
@@ -40,17 +40,6 @@ namespace FLY.FeedbackRenZiJia.Server
         /// </summary>
         public TimeSpan ActUpdateInterval { get; private set; }
 
- 
-        /// <summary>
-        /// 加热通道数
-        /// </summary>
-        [DoNotCheckEquality]
-        public UInt16 ChannelCnt { get; set; }
-        /// <summary>
-        /// 加热量更新
-        /// </summary>
-        [DoNotCheckEquality]
-        public UInt16 HeatUpdate { get; set; }
 
         /// <summary>
         /// 当前电流 有没?
@@ -65,8 +54,7 @@ namespace FLY.FeedbackRenZiJia.Server
         /// </summary>
         public UInt16 HeatUpdate_R { get; private set; }
 
-        public int Errno { get; set; } = -1;
-
+        public bool IsConnected { get; private set; }
 
         public event PropertyChangedEventHandler PropertyChanged;
 
@@ -84,7 +72,6 @@ namespace FLY.FeedbackRenZiJia.Server
         public PLCLink(IPEndPoint ep)
         {
             mclient = new Modbus.WithThread.ClientTCP(ep);
-            this.PropertyChanged += PLCLink_PropertyChanged;
         }
 
         class RegWrite
@@ -102,30 +89,31 @@ namespace FLY.FeedbackRenZiJia.Server
         }
         List<RegWrite> rws = new List<RegWrite>();
 
-
-        private void PLCLink_PropertyChanged(object sender, PropertyChangedEventArgs e)
+        public void SetChannelCnt(UInt16 channelCnt)
         {
-            if (e.PropertyName == "ChannelCnt")
+            if (!IsConnected)
+                return;
+
+            //D200	4x201	通道数量
+            RegWrite regWrite = new RegWrite(PLCAddressArea.Register, 200, new UInt16[] { channelCnt });
+            lock (rws)
             {
-                //D200	4x201	通道数量
-                RegWrite regWrite = new RegWrite(PLCAddressArea.Register, 200, new UInt16[] { ChannelCnt });
-                lock (rws)
-                {
-                    rws.Add(regWrite);
-                }
+                rws.Add(regWrite);
             }
-            else if (e.PropertyName == "HeatUpdate")
+        }
+        public void SetHeatUpdate(UInt16 heatUpdate)
+        {
+            if (!IsConnected)
+                return;
+
+            //D201	4x202	设置值 更新
+            RegWrite regWrite = new RegWrite(PLCAddressArea.Register, 201, new UInt16[] { heatUpdate });
+            lock (rws)
             {
-                //D201	4x202	设置值 更新
-                RegWrite regWrite = new RegWrite(PLCAddressArea.Register, 201, new UInt16[] { HeatUpdate });
-                lock (rws)
-                {
-                    rws.Add(regWrite);
-                }
+                rws.Add(regWrite);
             }
         }
 
-
         public void Start()
         {
             lock (this)
@@ -196,9 +184,9 @@ namespace FLY.FeedbackRenZiJia.Server
 
                         goto _error;//连接断开,终止更新线程
                     }
-                    
+                    IsConnected = true;
                 }
-                
+
                 //输出写入数据
                 if (!UpdateWriteData())
                 {
@@ -207,18 +195,18 @@ namespace FLY.FeedbackRenZiJia.Server
 
                     goto _error;//连接断开,终止更新线程
                 }
-                Errno = 0;
+
                 Thread.Sleep(30);
             }
 
         _error:
-            Errno = -1;
+            IsConnected = false;
             ErrorCnt++;
             goto _connect;
 
         _end:
             mclient.Close();
-            Errno = -1;
+            IsConnected = true;
             IsRunning = false;
         }
 
@@ -236,7 +224,7 @@ namespace FLY.FeedbackRenZiJia.Server
                 return false;
 
             HeatUpdate_R = values2.ElementAt(0);
-            
+
             return true;
         }
 
@@ -270,6 +258,9 @@ namespace FLY.FeedbackRenZiJia.Server
         /// <param name="values"></param>
         public void SetHeat(IEnumerable<UInt16> values)
         {
+            if (!IsConnected)
+                return;
+
             UInt16[] buf = values.ToArray();
             List<RegWrite> writes = new List<RegWrite>();
             //D400	4x401	设置值 160个
@@ -285,7 +276,7 @@ namespace FLY.FeedbackRenZiJia.Server
                     cnt1 = MaxRegsOfOneRead;
                 UInt16[] buf1 = new UInt16[cnt1];
                 Array.Copy(buf, offset, buf1, 0, cnt1);
-                RegWrite rw = new RegWrite(PLCAddressArea.Register, addr+offset, buf1);
+                RegWrite rw = new RegWrite(PLCAddressArea.Register, addr + offset, buf1);
                 writes.Add(rw);
                 offset += cnt1;
                 cnt -= cnt1;
diff --git a/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/PlcLinkExt.cs b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/PlcLinkExt.cs
new file mode 100644
index 0000000000000000000000000000000000000000..3123ee75fa17a5d04e7b3d60a8c90154dc1f509b
--- /dev/null
+++ b/Project.FLY.FeedbackRenZiJia/FLY.FeedbackRenZiJia/Server/PlcLinkExt.cs
@@ -0,0 +1,176 @@
+using FLY.FeedbackRenZiJia.IService;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Threading;
+
+namespace FLY.FeedbackRenZiJia.Server
+{
+    /// <summary>
+    /// PlcLink 只有 1~100, 最小单位1,  扩展它, 1~100, 最小单位 0.1
+    /// </summary>
+    public class PlcLinkExt : IPlcLinkExt
+    {
+        /// <summary>
+        /// 每颗粒时间 5s
+        /// </summary>
+        const int CellSec = 3;
+
+        /// <summary>
+        /// 占空比,总颗粒数
+        /// </summary>
+        const int DutyCount = 10;
+
+        int channelCnt = 96;
+        double[] heats;
+
+
+        /// <summary>
+        /// 当前电流 有没?
+        /// </summary>
+        public bool HasElectricity { get; private set; }
+        /// <summary>
+        /// 风机是否启动?
+        /// </summary>
+        public bool HasFan { get; private set; }
+
+        public bool IsConnected { get; private set; }
+
+        public event PropertyChangedEventHandler PropertyChanged;
+
+        IPLCLink plcLink;
+        DispatcherTimer timer;
+        Stopwatch stopwatch;
+        int dutyIndex = 0;
+        public PlcLinkExt()
+        {
+
+        }
+        public void Init(IPLCLink plcLink)
+        {
+            this.plcLink = plcLink;
+
+            Misc.BindingOperations.SetBinding(plcLink, nameof(plcLink.IsConnected), this, nameof(IsConnected));
+            Misc.BindingOperations.SetBinding(plcLink, nameof(plcLink.HasElectricity), this, nameof(HasElectricity));
+            Misc.BindingOperations.SetBinding(plcLink, nameof(plcLink.HasFan), this, nameof(HasFan));
+
+
+
+            this.PropertyChanged += PlcLinkExt_PropertyChanged;
+            timer = new DispatcherTimer();
+            timer.Interval = TimeSpan.FromSeconds(1);
+            timer.Tick += Timer_Tick;
+
+            stopwatch = new Stopwatch();
+
+            if (plcLink.IsConnected)
+            {
+                //刚连上,把 之前的数据都重新发给它。
+                plcLink.SetChannelCnt((UInt16)channelCnt);
+                DutyStart();
+            }
+        }
+
+        void DutyStart()
+        {
+            stopwatch.Restart();
+            timer.Start();
+            dutyIndex = 0;
+            setHeats();
+        }
+        void DutyStop()
+        {
+            stopwatch.Stop();
+            timer.Stop();
+        }
+        void setHeats()
+        {
+            if (!plcLink.IsConnected)
+                return;
+            if (heats == null)
+                return;
+
+            UInt16[] plcHeats = heats.Select(h =>
+            {
+                int h_int = (int)h;
+                int v = (int)((h - h_int) * DutyCount);
+                if (v > dutyIndex)
+                {
+                    return (UInt16)(h_int + 1);
+                }
+                else
+                {
+                    return (UInt16)h_int;
+                }
+
+            }).ToArray();
+
+            plcLink.SetHeat(plcHeats);
+
+            UInt16 heatupdate = (UInt16)(plcLink.HeatUpdate_R + 1);
+            if (heatupdate > 100)
+                heatupdate = 1;
+            plcLink.SetHeatUpdate(heatupdate);
+        }
+
+        private void Timer_Tick(object sender, EventArgs e)
+        {
+            if (stopwatch.Elapsed < TimeSpan.FromSeconds(CellSec))
+            {
+                return;
+            }
+
+            stopwatch.Restart();
+
+            setHeats();
+            dutyIndex++;
+            if (dutyIndex > DutyCount)
+                dutyIndex = 0;
+        }
+
+        private void PlcLinkExt_PropertyChanged(object sender, PropertyChangedEventArgs e)
+        {
+            if (e.PropertyName == nameof(plcLink.IsConnected))
+            {
+                if (plcLink.IsConnected)
+                {
+                    //刚连上,把 之前的数据都重新发给它。
+                    plcLink.SetChannelCnt((UInt16)channelCnt);
+                    DutyStart();
+                }
+                else
+                {
+                    DutyStop();
+                }
+            }
+        }
+
+        public void SetChannelCnt(int channelCnt)
+        {
+            this.channelCnt = channelCnt;
+            plcLink.SetChannelCnt((UInt16)channelCnt);
+        }
+
+        /// <summary>
+        /// 设置加热量
+        /// </summary>
+        /// <param name="values"></param>
+        public void SetHeats(IEnumerable<double> values)
+        {
+            heats = values.Select(h =>
+            {
+                if (h < 0) h = 0;
+                else if (h > 100) h = 100;
+                return h;
+            }).ToArray();
+
+            setHeats();
+        }
+
+
+    }
+}
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI.Fix.Client/Properties/AssemblyInfo.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI.Fix.Client/Properties/AssemblyInfo.cs
index cb9666c28f869b7c8aefccd1a546cb4e7f2b043e..21c28197acf2d4f283fc55ab2e24c1accea16277 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI.Fix.Client/Properties/AssemblyInfo.cs
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI.Fix.Client/Properties/AssemblyInfo.cs
@@ -51,6 +51,6 @@ using System.Windows;
 //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
 //通过使用 "*",如下所示:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("7.0.7")]
-[assembly: AssemblyFileVersion("7.0.7")]
+[assembly: AssemblyVersion("7.4.0")]
+[assembly: AssemblyFileVersion("7.4.0")]
 [assembly: Guid("D12087A7-EEC4-4D9F-9269-8F20324F4B04")]
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI.Fix.Server/Properties/AssemblyInfo.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI.Fix.Server/Properties/AssemblyInfo.cs
index 11b34f890ad5c66a2de76efd03407d6adbffc66f..04de182f8d2ba160d969d5baa78109f36b8c9f2b 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI.Fix.Server/Properties/AssemblyInfo.cs
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI.Fix.Server/Properties/AssemblyInfo.cs
@@ -51,6 +51,6 @@ using System.Windows;
 // 可以指定所有这些值,也可以使用“内部版本号”和“修订号”的默认值,
 // 方法是按如下所示使用“*”:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("7.0.9")]
-[assembly: AssemblyFileVersion("7.0.9")]
+[assembly: AssemblyVersion("7.1.0")]
+[assembly: AssemblyFileVersion("7.1.0")]
 [assembly: Guid("72FBA808-FA10-43BF-8504-C6E814E031E7")]
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/FLY.Thick.Blowing.UI.csproj b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/FLY.Thick.Blowing.UI.csproj
index af3ffcf563d385409b531a9a45f6cf9215cd5934..202adc034757eff6ab7fbeb977f793f256f78ff1 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/FLY.Thick.Blowing.UI.csproj
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/FLY.Thick.Blowing.UI.csproj
@@ -176,14 +176,22 @@
     <Compile Include="UiModule\TrendGraph2\TrendGraph2.xaml.cs">
       <DependentUpon>TrendGraph2.xaml</DependentUpon>
     </Compile>
-    <Compile Include="UiModule\TrendGraph2\TrendGraphConfig2.xaml.cs">
-      <DependentUpon>TrendGraphConfig2.xaml</DependentUpon>
+    <Compile Include="UiModule\TrendGraph2\TrendGraph2Config.xaml.cs">
+      <DependentUpon>TrendGraph2Config.xaml</DependentUpon>
     </Compile>
-    <Compile Include="UiModule\TrendGraph2\TrendGraphItemParam2.cs" />
-    <Compile Include="UiModule\TrendGraph2\TrendGraphParam2s.cs" />
-    <Compile Include="UiModule\TrendGraph2\TrendGraphVm2.cs" />
-    <Compile Include="UiModule\TrendGraph2\TrendGraphVm2Ut.cs" />
-    <Compile Include="UiModule\TrendGraph2\UiModule2_TrendGraph.cs" />
+    <Compile Include="UiModule\TrendGraph2\TrendGraph2Vm.cs" />
+    <Compile Include="UiModule\TrendGraph2\UiModule2_TrendGraph2.cs" />
+    <Compile Include="UiModule\TrendGraph\TrendGraph.xaml.cs">
+      <DependentUpon>TrendGraph.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="UiModule\TrendGraph\TrendGraphConfig.xaml.cs">
+      <DependentUpon>TrendGraphConfig.xaml</DependentUpon>
+    </Compile>
+    <Compile Include="UiModule\TrendGraph\TrendGraphItemParam.cs" />
+    <Compile Include="UiModule\TrendGraph\TrendGraphParams.cs" />
+    <Compile Include="UiModule\TrendGraph\TrendGraphVm.cs" />
+    <Compile Include="UiModule\TrendGraph\TrendGraphVmUt.cs" />
+    <Compile Include="UiModule\TrendGraph\UiModule2_TrendGraph.cs" />
     <Page Include="App.xaml">
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
@@ -268,7 +276,15 @@
       <SubType>Designer</SubType>
       <Generator>MSBuild:Compile</Generator>
     </Page>
-    <Page Include="UiModule\TrendGraph2\TrendGraphConfig2.xaml">
+    <Page Include="UiModule\TrendGraph2\TrendGraph2Config.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="UiModule\TrendGraph\TrendGraph.xaml">
+      <SubType>Designer</SubType>
+      <Generator>MSBuild:Compile</Generator>
+    </Page>
+    <Page Include="UiModule\TrendGraph\TrendGraphConfig.xaml">
       <Generator>MSBuild:Compile</Generator>
       <SubType>Designer</SubType>
     </Page>
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/Themes/Colors.xaml b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/Themes/Colors.xaml
index 6f28dc0460c7d4b34ff7a6691e5debb6ec385eec..98d114019dba93c4db23ade590a48d1e617710eb 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/Themes/Colors.xaml
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/Themes/Colors.xaml
@@ -17,10 +17,12 @@
     <!--MahApps.Brushes.Accent-->
     <SolidColorBrush x:Key="Brushes.ChartArea0" Color="#CC60A917" />
     <!--MahApps.Brushes.ValidationSummary4-->
-    <SolidColorBrush x:Key="Brushes.ChartArea1" Color="#CCFDC8C8"/>
+    <SolidColorBrush x:Key="Brushes.ChartArea1" Color="#cce5004f"/>
+    <!--#cceb6100"-->
+
     <!--MahApps.Brushes.ValidationSummary2-->
-    <SolidColorBrush x:Key="Brushes.ChartArea2" Color="#CCCA000C" />
-    
+    <SolidColorBrush x:Key="Brushes.ChartArea2" Color="#CCa40000" /> 
+
     <SolidColorBrush x:Key="Brushes.ChartArea3" Color="#CCA59F93" />
     <SolidColorBrush x:Key="Brushes.ChartArea4" Color="#22000000" />
 
@@ -28,9 +30,9 @@
     <!--MahApps.Brushes.Accent-->
     <SolidColorBrush x:Key="Brushes.ChartAxisLabel0" Color="#FF60A917" />
     <!--MahApps.Brushes.ValidationSummary5-->
-    <SolidColorBrush x:Key="Brushes.ChartAxisLabel1" Color="#FFFD7070"/>
+    <SolidColorBrush x:Key="Brushes.ChartAxisLabel1" Color="#FFe5004f"/> <!--#FFFD7070-->
     <!--MahApps.Brushes.ValidationSummary2-->
-    <SolidColorBrush x:Key="Brushes.ChartAxisLabel2" Color="#FFCA000C" />
+    <SolidColorBrush x:Key="Brushes.ChartAxisLabel2" Color="#FFa40000" /> <!--#FFCA000C-->
     <SolidColorBrush x:Key="Brushes.ChartAxisLabel3" Color="#FFA59F93" />
     
     
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/Themes/Styles.xaml b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/Themes/Styles.xaml
index 2dd166a6c55fe328a4ad10163c95d9039e2f45a6..8c301d6a30bcc07bd301fc59462404ece58bb005 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/Themes/Styles.xaml
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/Themes/Styles.xaml
@@ -3,17 +3,10 @@
                     xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
                     >
     <ResourceDictionary.MergedDictionaries>
-        <ResourceDictionary Source="pack://application:,,,/FLY.ControlLibrary;component/Themes/Dictionary_MyStyle.xaml"/>
-        <ResourceDictionary Source="pack://application:,,,/FLY.ControlLibrary;component/Converter/Dictionary_MyConv.xaml"/>
+        <!--<ResourceDictionary Source="pack://application:,,,/FLY.ControlLibrary;component/Themes/Dictionary_MyStyle.xaml"/>
+        <ResourceDictionary Source="pack://application:,,,/FLY.ControlLibrary;component/Converter/Dictionary_MyConv.xaml"/>-->
+        <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Base.UI;component/Themes/Styles.xaml"/>
+        <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Base.UI;component/Themes/GraphStyle.xaml"/>
     </ResourceDictionary.MergedDictionaries>
 
-    <!--扫描图,纵向趋势图Y轴 标签-->
-    <Style x:Key="AxisSectionStyle" TargetType="lvc:AxisSection" >
-        <Setter Property="StrokeThickness" Value="1"/>
-        <Setter Property="DataLabel" Value="True"/>
-        <Setter Property="DisableAnimations" Value="True"/>
-        <Setter Property="DataLabelForeground" Value="White"/>
-        <Setter Property="Opacity" Value="0.5"/>
-        <Setter Property="Panel.ZIndex" Value="1"/>
-    </Style>
 </ResourceDictionary>
\ No newline at end of file
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraph.xaml b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraph.xaml
index b49af440420c0a8b0221897e9d597af5c5e45620..0dbabf93b2681d4cadde14d35b2bb48f7f578502 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraph.xaml
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraph.xaml
@@ -17,39 +17,10 @@
                 <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Blowing.UI;component/Themes/Styles.xaml"/>
                 <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Blowing.UI;component/Themes/Colors.xaml"/>
             </ResourceDictionary.MergedDictionaries>
-
             <local:ScanGraphVmUt x:Key="viewmodel"/>
-            <SolidColorBrush x:Key="TextBrush" Color="#4C4949" />
-            <SolidColorBrush x:Key="GrayBrush1" Color="#FF727272"/>
-            <SolidColorBrush x:Key="GrayBrush2" Color="#FF858484" />
-            <SolidColorBrush x:Key="SemiTransparentGreyBrush" Color="#99F0F0F0"/>
-            <SolidColorBrush x:Key="SemiTransparentActiveBrush" Color="#50008BE5"/>
-            <SolidColorBrush x:Key="WhiteBrush" Color="White"/>
-            <Style x:Key="TitleStyle" TargetType="TextBlock">
-                <Setter Property="Width" Value="50"/>
-                <Setter Property="Foreground" Value="{StaticResource GrayBrush1}"/>
-                <Setter Property="FontSize" Value="16"/>
-                <Setter Property="TextAlignment" Value="Right"/>
-            </Style>
-            <Style x:Key="ValueStyle" TargetType="TextBlock">
-                <Setter Property="Foreground" Value="{StaticResource TextBrush}"/>
-                <Setter Property="FontSize" Value="20"/>
-                <Setter Property="Padding" Value="5,0"/>
-            </Style>
-            <Style x:Key="ValueStyle2" TargetType="TextBlock">
-                <Setter Property="Foreground" Value="{StaticResource WhiteBrush}"/>
-                <Setter Property="Background" Value="{StaticResource TextBrush}"/>
-                <Setter Property="FontSize" Value="26"/>
-                <Setter Property="Padding" Value="5,0"/>
-            </Style>
-            <Style x:Key="UnitStyle" TargetType="TextBlock">
-                <Setter Property="Foreground" Value="{StaticResource GrayBrush2}"/>
-                <Setter Property="FontSize" Value="15"/>
-                <Setter Property="VerticalAlignment" Value="Bottom"/>
-            </Style>
         </ResourceDictionary>
     </UserControl.Resources>
-    <Border Style="{StaticResource BorderStyle_module}" >
+    <Border Style="{StaticResource Styles.Module.Border}" >
         <Grid d:DataContext="{StaticResource viewmodel}">
             <Grid.RowDefinitions>
                 <RowDefinition Height="auto"/>
@@ -71,7 +42,7 @@
                             <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" Step ="{Binding XStep}"/>
                         </lvc:Axis.Separator>
                         <lvc:Axis.Sections>
-                            <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" StrokeThickness="0" Stroke="{StaticResource Color_theme_activity}"
+                            <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" StrokeThickness="0" Stroke="{StaticResource Brushes.Activity}"
                                 Value="{Binding OrgBoltNo}" 
                             />
                         </lvc:Axis.Sections>
@@ -111,70 +82,69 @@
                             />
                         </lvc:Axis.Sections>
                         <lvc:Axis.Separator>
-                            <lvc:Separator Stroke="Transparent" />
+                            <lvc:Separator Visibility="Collapsed" />
                         </lvc:Axis.Separator>
                     </lvc:Axis>
 
                 </lvc:CartesianChart.AxisY>
             </lvc:CartesianChart>
 
-            <Button Style="{StaticResource ButtonStyle_icon}" Margin="48,0,0,-20"
+            <Button Style="{StaticResource Styles.Button.Icon}" Margin="48,0,0,-20"
                         Click="Button_info_click" >
-                <Grid Style="{StaticResource GridStyle_ButtonShadow}" >
+                <Grid Style="{StaticResource Styles.Shadow}" >
                     <TextBlock  Padding="10,5" VerticalAlignment="Top"
-                                    FontSize="24" Foreground="White" Background="{StaticResource Color_theme_activity}" 
+                                    FontSize="24" Foreground="{StaticResource Brushes.ThemeBackground}" Background="{StaticResource Brushes.Activity}" 
                                     Text="扫描图" />
                 </Grid>
             </Button>
-            <Grid Grid.Column="1" Grid.RowSpan="2" Panel.ZIndex="2" 
-                  VerticalAlignment="Top" HorizontalAlignment="Left" >
-                <Viewbox MaxHeight="50">
-                    <StackPanel Orientation="Horizontal">
-                        <StackPanel>
-                            <StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" Margin="5">
-                                
-                                <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Time,StringFormat={}{0:MM-dd HH:mm:ss}}"/>
-                                <StackPanel Orientation="Horizontal" Margin="5,0">
-                                    <TextBlock Style="{StaticResource TitleStyle}" Text="ID:" />
-                                    <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Id}"/>
-                                </StackPanel>
+            <StackPanel Grid.Column="1" Grid.RowSpan="2" Panel.ZIndex="2" VerticalAlignment="Top" HorizontalAlignment="Left" 
+                        Margin="{StaticResource ControlMargin}">
+                <Viewbox MaxHeight="{StaticResource FontSize.Value}" HorizontalAlignment="Left" Margin="2">
+                    <StackPanel Orientation="Horizontal" >
 
-                            </StackPanel>
-                            <StackPanel Orientation="Horizontal">
-                                <StackPanel Orientation="Horizontal" Margin="5,0">
-                                    <TextBlock >
-                                        <TextBlock.Style>
-                                            <Style TargetType="TextBlock" BasedOn="{StaticResource ValueStyle}">
-                                                <Setter Property="Background" Value="#99000000"/>
-                                                <Setter Property="Foreground" Value="White"/>
-                                                <Setter Property="Text" Value="逆"/>
-                                                <Style.Triggers>
-                                                    <DataTrigger Binding="{Binding IsBackw}" Value="True">
-                                                        <Setter Property="Background" Value="#99008BE5"/>
-                                                        <Setter Property="Text" Value="顺"/>
-                                                    </DataTrigger>
-                                                </Style.Triggers>
-                                            </Style>
-                                        </TextBlock.Style>
-                                    </TextBlock>
-                                </StackPanel>
-                                <StackPanel Orientation="Horizontal" Background="#99FFFFFF">
-                                    <StackPanel Orientation="Horizontal" Margin="5,0">
-                                        <TextBlock Style="{StaticResource ValueStyle}" 
+                        <TextBlock Style="{StaticResource ValueStyle}" >
+                            <Run Text="{Binding Time,Mode=OneWay,StringFormat={}{0:MM-dd HH:mm:ss}}"/>~<Run Text="{Binding EndTime,Mode=OneWay,StringFormat={}{0:HH:mm:ss}}"/>
+                        </TextBlock>
+
+                        <StackPanel Orientation="Horizontal" Margin="{StaticResource TextMargin}">
+                            <TextBlock Style="{StaticResource TitleStyle}" Text="ID:" />
+                            <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Id}"/>
+                        </StackPanel>
+
+                    </StackPanel>
+                </Viewbox>
+                <Viewbox MaxHeight="{StaticResource FontSize.Value}" HorizontalAlignment="Left" Margin="2">
+                    <StackPanel Orientation="Horizontal">
+                        <StackPanel Orientation="Horizontal" Margin="{StaticResource TextMargin}">
+                            <TextBlock >
+                                <TextBlock.Style>
+                                    <Style TargetType="TextBlock" BasedOn="{StaticResource ValueStyle}">
+                                        <Setter Property="Background" Value="#99000000"/>
+                                        <Setter Property="Foreground" Value="White"/>
+                                        <Setter Property="Text" Value="逆"/>
+                                        <Style.Triggers>
+                                            <DataTrigger Binding="{Binding IsBackw}" Value="True">
+                                                <Setter Property="Background" Value="#99008BE5"/>
+                                                <Setter Property="Text" Value="顺"/>
+                                            </DataTrigger>
+                                        </Style.Triggers>
+                                    </Style>
+                                </TextBlock.Style>
+                            </TextBlock>
+                        </StackPanel>
+                        <StackPanel Orientation="Horizontal" Background="#99FFFFFF">
+                            <StackPanel Orientation="Horizontal" Margin="5,0">
+                                <TextBlock Style="{StaticResource ValueStyle}" 
                                                    Text="{Binding RPeriod, Converter={StaticResource timespanconv}}" 
                                                     />
-                                        <TextBlock Style="{StaticResource TitleStyle}" Width="auto" VerticalAlignment="Bottom"
+                                <TextBlock Style="{StaticResource TitleStyle}" Width="auto" VerticalAlignment="Bottom"
                                                    Text="min/R" />
-                                    </StackPanel>
-                                </StackPanel>
-
                             </StackPanel>
                         </StackPanel>
-
-
                     </StackPanel>
                 </Viewbox>
-            </Grid>
+            </StackPanel>
+
             <Grid Grid.Column="2" Grid.RowSpan="2" Panel.ZIndex="1" 
                   Margin="10,0" VerticalAlignment="Top" HorizontalAlignment="Right"
                   Background="{StaticResource SemiTransparentGreyBrush}" >
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraph.xaml.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraph.xaml.cs
index 06689e982d4eec38ed015bf87e93c6e753c74888..5cb84e4755675d02e2b4f9679dad06d712fad52a 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraph.xaml.cs
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraph.xaml.cs
@@ -48,7 +48,7 @@ namespace FLY.Thick.Blowing.UI.UiModule
                 return;
 
             WdScanGraphConfig window = new WdScanGraphConfig();
-            window.Init(graphparam);
+            window.Init(graphparam,viewModel);
             window.Owner = FLY.ControlLibrary.COMMON.GetWindow(this);
             window.ShowDialog();
         }
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraphItemParam.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraphItemParam.cs
index ba9565151d9a989049644657244e01a376238bbd..df35798c49a32da996e4ca2fea55837172da46ec 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraphItemParam.cs
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraphItemParam.cs
@@ -18,7 +18,7 @@ namespace FLY.Thick.Blowing.UI.UiModule
         /// </summary>
         public double YRangePercent { get; set; } = 3;
 
-        private int mix = 2;
+        private int mix = 1;
         /// <summary>
         /// 混合数
         /// </summary>
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraphVm.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraphVm.cs
index dc21bbe288ac3122f21ee5d805c578215bedaf70..83ad1d6d728c55593adc4a3e64977a82526c5938 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraphVm.cs
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraphVm.cs
@@ -14,13 +14,19 @@ using System.Linq;
 using System.Runtime.InteropServices;
 using System.Windows.Data;
 using System.Windows.Media;
+using System.Windows.Threading;
 
 namespace FLY.Thick.Blowing.UI.UiModule
 {
-    public class ScanGraphVm : INotifyPropertyChanged
+    public class ScanGraphVm : IScanGraphVm,INotifyPropertyChanged
     {
         const int MARKNO_TEXTUP = 1;
-        const int MARKNO_TARGET_DELAY = 2;
+
+        /// <summary>
+        /// 自动切换为 DefaultNumber 倒计时 初始值
+        /// </summary>
+        const int AutoKeepTotalSec = 60;
+
         #region 图表控制
         public double YMax { get; set; } = double.NaN;
         public double YMin { get; set; } = double.NaN;
@@ -75,13 +81,18 @@ namespace FLY.Thick.Blowing.UI.UiModule
         /// <summary>
         /// 混合数
         /// </summary>
-        public int Mix { get; private set; } = 2;
+        public int Mix { get; protected set; } = 1;
 
         /// <summary>
         /// 测量时间
         /// </summary>
         public DateTime Time { get; private set; }
 
+        /// <summary>
+        /// 测量结束时间
+        /// </summary>
+        public DateTime EndTime { get; private set; }
+
         /// <summary>
         /// 旋转方向 是反向
         /// </summary>
@@ -99,6 +110,32 @@ namespace FLY.Thick.Blowing.UI.UiModule
         public long Id { get; private set; } = 1231221;
         public int OrgBoltNo { get; private set; } = -100;
 
+
+        /// <summary>
+        /// 只要 Number被改变,且不为0, AutoKeepNewestTimeRemaining就会被设为10s.
+        /// 当 AutoKeepNewestTimeRemaining = 0, Number就会被设置为0
+        /// </summary>
+        public int AutoKeepNewestTimeRemaining { get; protected set; }
+
+        /// <summary>
+        /// Number == graphparam.Number
+        /// </summary>
+        public bool IsNewest { get; protected set; } = true;
+
+        /// <summary>
+        /// 锁上, Number 不会 自动变回 DefaultNumber,且 Number = Id
+        /// </summary>
+        public bool IsLocked { get; set; }
+
+        /// <summary>
+        /// 记录点, 与 graphparam.Number 分离
+        /// </summary>
+        public long Number { get; set; }
+        /// <summary>
+        /// 记录点 变化步进
+        /// </summary>
+        public int NumberStep { get; set; } = 1;
+
         #endregion
 
         [PropertyChanged.AlsoNotifyFor(nameof(XFormatter),nameof(XStep))]
@@ -109,13 +146,14 @@ namespace FLY.Thick.Blowing.UI.UiModule
         ChartValues<double> Values = new ChartValues<double>();
 
         object Mapper;
-        BlowingFixProfileParam profileParam;
-        ScanGraphItemParam graphparam;
-        IBulkDbService bulkDb;
-        Lc_ScanData scanData;
+        protected BlowingFixProfileParam profileParam;
+        protected ScanGraphItemParam graphparam;
+        protected IBulkDbService bulkDb;
+        protected Lc_ScanData scanData;
         Db_Profile profile;
-        IBlowingService blowingService;
+        protected IBlowingService blowingService;
         ParamDictionary paramDictionary;
+        protected DispatcherTimer timer;
         public ScanGraphVm()
         {
             #region 与数据无关界面参数
@@ -233,7 +271,6 @@ namespace FLY.Thick.Blowing.UI.UiModule
         }
         void Init()
         {
-            Misc.BindingOperations.SetBinding(graphparam, nameof(graphparam.Mix), this, nameof(Mix));
             Misc.BindingOperations.SetBinding(blowingService, nameof(blowingService.BPC), this, nameof(BPC));
             paramDictionary.SetBinding(this, nameof(XStepOrg), nameof(XStep), 5);
 
@@ -243,6 +280,8 @@ namespace FLY.Thick.Blowing.UI.UiModule
 
             Values.Clear();
 
+
+            init_autoKeep();
             Id = -1;
             UpdateId();
 
@@ -252,7 +291,61 @@ namespace FLY.Thick.Blowing.UI.UiModule
             this.PropertyChanged += ScanGraphVm_PropertyChanged;
         }
 
+        void init_autoKeep()
+        {
 
+            ResetNumber();
+
+            timer = new DispatcherTimer();
+            timer.Interval = TimeSpan.FromSeconds(1);
+            timer.Tick += (s, e) =>
+            {
+                if (Number == graphparam.Number)
+                {
+                    timer.Stop();
+                    return;
+                }
+
+                if (IsLocked)
+                {
+                    return;
+                }
+
+                if (AutoKeepNewestTimeRemaining > 0)
+                    AutoKeepNewestTimeRemaining--;
+                if (AutoKeepNewestTimeRemaining <= 0)
+                {
+                    ResetNumber();
+                    timer.Stop();
+                    return;
+                }
+            };
+            this.graphparam.PropertyChanged += (s, e) =>
+            {
+                if (e.PropertyName == nameof(graphparam.Number))
+                {
+                    ResetNumber();
+                    timer.IsEnabled = false;
+                    IsNewest = true;
+                    AutoKeepNewestTimeRemaining = AutoKeepTotalSec;
+                }
+            };
+            this.PropertyChanged += (s, e) => {
+                if (e.PropertyName == nameof(IsLocked))
+                {
+                    if (Id >= 0)
+                    {
+                        Number = Id;
+                    }
+                }
+                else if (e.PropertyName == nameof(Number))
+                {
+                    timer.IsEnabled = Number != graphparam.Number;
+                    IsNewest = !timer.IsEnabled;
+                    AutoKeepNewestTimeRemaining = AutoKeepTotalSec;
+                }
+            };
+        }
 
         static string[] propertyname_updateMaxMinText = new string[] { 
             nameof(Average),nameof(Max),nameof(Min),nameof(Sigma2)};
@@ -267,9 +360,13 @@ namespace FLY.Thick.Blowing.UI.UiModule
                     NotifyPropertyChanged(nameof(YFormatter));
                 }
             }
-            
-            if(propertyname_updateMaxMinText.Contains(e.PropertyName))
-                UpdateMaxMinText();
+            else if (e.PropertyName == nameof(Number))
+            {
+                UpdateId();
+            }
+
+            if (propertyname_updateMaxMinText.Contains(e.PropertyName))
+                UpdateMaxMinText_delay();
             
         }
 
@@ -302,11 +399,7 @@ namespace FLY.Thick.Blowing.UI.UiModule
 
         private void Graphparam_PropertyChanged(object sender, PropertyChangedEventArgs e)
         {
-            if (e.PropertyName == nameof(graphparam.Number))
-            {
-                UpdateId();
-            }
-            else if (e.PropertyName == nameof(graphparam.Mix))
+            if (e.PropertyName == nameof(graphparam.Mix))
             {
                 UpdateId();
             }
@@ -329,7 +422,7 @@ namespace FLY.Thick.Blowing.UI.UiModule
 
 
 
-        void UpdateY()
+        protected void UpdateY()
         {
             //if (this.profile != null)
             //{
@@ -394,7 +487,7 @@ namespace FLY.Thick.Blowing.UI.UiModule
             YMin = target - tolerance * graphparam.YRangePercent;
         }
         
-        void UpdateX()
+        protected void UpdateX()
         {
             XMin = 0;
             XMax = this.blowingService.NBolts + 1;
@@ -405,7 +498,7 @@ namespace FLY.Thick.Blowing.UI.UiModule
             Update4IdChanged();
         }
 
-        void UpdateMaxMinText()
+        void UpdateMaxMinText_delay()
         {
             PollModule.Current.Poll_JustOnce(() =>
             {
@@ -423,11 +516,27 @@ namespace FLY.Thick.Blowing.UI.UiModule
                 }
             }, this, MARKNO_TEXTUP);
         }
+        protected void UpdateMaxMinText()
+        {
+            if (graphparam.IsPercent && (Average > 0))
+            {
+                MaxText = $"+{((Max - Average) / Average) * 100.0:F1}%";
+                MinText = $"-{((Average - Min) / Average) * 100.0:F1}%";
+                Sigma2Text = $"{(Sigma2 / Average) * 100.0:F1}%";
+            }
+            else
+            {
+                MaxText = $"{Max:F1}";
+                MinText = $"{Min:F1}";
+                Sigma2Text = $"{Sigma2:F1}";
+            }
+        }
 
-        void UpdateAverage() {
+        protected void UpdateAverage() {
             if (this.scanData == null)
             {
                 Time = DateTime.MinValue;
+                EndTime = DateTime.MinValue;
                 Id = -1;
                 OrgBoltNo = -100;
                 return;
@@ -435,6 +544,7 @@ namespace FLY.Thick.Blowing.UI.UiModule
             else
             {
                 Time = this.scanData.Time;
+                EndTime = this.scanData.EndTime;
                 Id = this.scanData.ID;
                 OrgBoltNo = this.scanData.OrgBoltNo;
                 IsBackw = this.scanData.IsBackw;
@@ -467,6 +577,7 @@ namespace FLY.Thick.Blowing.UI.UiModule
             if (this.scanData == null)
             {
                 Time = DateTime.MinValue;
+                EndTime = DateTime.MinValue;
                 Id = -1;
                 OrgBoltNo = -100;
                 return;
@@ -474,6 +585,7 @@ namespace FLY.Thick.Blowing.UI.UiModule
             else
             {
                 Time = this.scanData.Time;
+                EndTime = this.scanData.EndTime;
                 Id = this.scanData.ID;
                 OrgBoltNo = this.scanData.OrgBoltNo;
             }
@@ -504,21 +616,43 @@ namespace FLY.Thick.Blowing.UI.UiModule
 
 
         }
-        void Update4IdChanged()
+
+        bool IsNeedToGetFrame()
         {
-            if (graphparam.Number > 0
-                && bulkDb.LastScanDataId == Id
-                && Mix == graphparam.Mix)
+            if (Mix != graphparam.Mix)
             {
-                //不需要更新!!!!!!!
-                return;
+                return true;
+            }
+
+            if (Number > 0)
+            {
+                //绝对位置模式
+                if (Number != Id)
+                    return true;
+                else
+                    return false;
             }
+            //相对位置模式
+
+            if (Number == Id - bulkDb.LastScanDataId)
+            {
+                //已经是需要查找的记录
+                return false;
+            }
+
+            return true;
+        }
+        void Update4IdChanged()
+        {
+            if (!IsNeedToGetFrame())
+                return;
+
             bulkDb.GetFrame(
-                new Pack_GetFrameRequest() { Id = graphparam.Number, Mix = graphparam.Mix },
+                new Pack_GetFrameRequest() { Id = Number, Mix = graphparam.Mix },
                 (object AsyncContext, object retData) =>
                 {
                     Pack_GetFrameReponse reponse = retData as Pack_GetFrameReponse;
-
+                    Mix = reponse.Request.Mix;
                     //if (reponse.scanData != null)
                     {
                         this.scanData = reponse.scanData;
@@ -544,7 +678,28 @@ namespace FLY.Thick.Blowing.UI.UiModule
                 }, this);
         }
 
-        void NotifyPropertyChanged(string propertyName) {
+
+        public void PreView()
+        {
+            Number -= NumberStep;
+        }
+
+        public void NextView()
+        {
+            Number += NumberStep;
+        }
+
+        public void ChangeLock()
+        {
+            IsLocked = !IsLocked;
+        }
+
+        public void ResetNumber()
+        {
+            Number = graphparam.Number;
+        }
+
+        protected void NotifyPropertyChanged(string propertyName) {
             PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
         }
         public event PropertyChangedEventHandler PropertyChanged;
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraphVmUt.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraphVmUt.cs
index 354113cb278f2270d81820eed38b7aafce032967..3477e1777d7081989611a3d4287485b5ee5baed3 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraphVmUt.cs
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/ScanGraphVmUt.cs
@@ -11,138 +11,10 @@ using System.Windows.Media;
 
 namespace FLY.Thick.Blowing.UI.UiModule
 {
-    public class ScanGraphVmUt : INotifyPropertyChanged
+    public class ScanGraphVmUt : ScanGraphVm
     {
-        #region 图表控制
-        public double YMax { get; set; }
-        public double YMin { get; set; }
-        public double Target { get; set; }
-        public double Tolerance2YMax { get; set; }
-        public double Tolerance2YMin { get; set; }
-        public double ToleranceYMax { get; set; }
-        public double ToleranceYMin { get; set; }
-        public double XMax { get; set; }
-        public double XMin { get; set; }
-
-        public int XStep { get; set; } = 5;
-
-        public Func<double, string> YFormatter { get; set; }
-
-        public SeriesCollection Series { get; set; }
-
-        #endregion
-
-        #region 颜色
-        List<Brush> AreaColors;
-        #endregion
-
-
-        #region 界面统计值
-
-        public double Average { get; set; }
-
-
-        public string Sigma2Text { get; set; }
-        public string MaxText { get; set; }
-        public string MinText { get; set; }
-
-        /// <summary>
-        /// 混合数
-        /// </summary>
-        public int Mix { get; set; }
-
-        /// <summary>
-        /// 旋转方向 是反向
-        /// </summary>
-        public bool IsBackw { get; set; }
-
-        /// <summary>
-        /// 旋转1周的时间
-        /// </summary>
-        public TimeSpan RPeriod { get; set; }
-
-
-        /// <summary>
-        /// 测量时间
-        /// </summary>
-        public DateTime Time { get; set; }
-        /// <summary>
-        /// 数据库中的ID标示
-        /// </summary>
-        public int Id { get; set; }
-
-        /// <summary>
-        /// 复位区号
-        /// </summary>
-        public int OrgBoltNo { get; set; }
-
-        public bool IsPercent { get; set; }
-        public bool IsAutoTarget { get; set; }
-
-
-        #endregion
-
-
-
-        ChartValues<double> Values { get; } = new ChartValues<double>();
-        object Mapper { get; set; }
-
-
-
         public ScanGraphVmUt()
         {
-
-            #region 与数据无关界面参数
-            AreaColors = FLY.Thick.Blowing.UI.Themes.Colors.AreaColors;
-            YFormatter = (y) =>
-            {
-                if (IsPercent)
-                {
-                    if (y == Average)
-                    {
-                        return y.ToString("F1");
-                    }
-                    else
-                    {
-                        double percent = 100.0 * (y - Average) / Average;
-                        if (percent > 0)
-                        {
-                            return $"+{Math.Abs(percent):F1}%";
-                        }
-                        else {
-                            return $"-{Math.Abs(percent):F1}%";
-                        }
-                        
-                    }
-                }
-                else {
-                    return y.ToString("F1");
-                }
-            };
-
-
-            Mapper = Mappers.Xy<double>()
-                .X((value, index) =>
-                {
-                    return index + 1;
-                })
-                .Y(value => value)
-                .Fill((value) =>
-                {
-                    if ((value > Tolerance2YMax) || (value < Tolerance2YMin))
-                    {
-                        return AreaColors[2];
-                    }
-                    else if ((value > ToleranceYMax) || (value < ToleranceYMin))
-                    {
-                        return AreaColors[1];
-                    }
-                    else
-                    {
-                        return AreaColors[0];
-                    }
-                });
-            #endregion
             #region 数据
             double target = 150;
             double tolerance = target * 0.02;
@@ -155,78 +27,58 @@ namespace FLY.Thick.Blowing.UI.UiModule
                 datas[i] = (Math.Sin(i * Math.PI / nbolts) * 3) * tolerance + target + (random.NextDouble() - 0.5) * 1 - 6;
             }
 
-            #endregion
-            #region 界面数据
-
+            profileParam = new Common.BlowingFixProfileParam()
+            {
+                Target = target,
+                TolerancePercent = 0.02,
+                K = 1,
+                PName = "abc",
+                OrderNo = "12313121",
+                Number = "2"
+            };
 
+            graphparam = new ScanGraphItemParam()
+            {
+                IsPercent = true,
+                IsAutoTarget = true,
+                YRangePercent = yrangepercent,
+                Number = -1,
+                Mix = 2
+            };
 
-            XMin = 0;
-            XMax = nbolts + 1;
-            XStep = 5;
-            Mix = 2;
-            Time = DateTime.Now;
-            Id = 312312;
-            OrgBoltNo = 31;
-            IsPercent = true;
-            IsAutoTarget = true;
-            Values.Clear();
-            Values.Add(double.NaN);
-            Values.AddRange(datas);
-            Average = datas.AverageNoNull();
 
-            IsBackw = false;
-            RPeriod = TimeSpan.FromSeconds(60 * 6.5);
+            scanData = new Server.Model.Lc_ScanData()
+            {
+                Time = DateTime.Now.AddSeconds(-30),
+                EndTime = DateTime.Now,
+                ID = 1234567,
+                K = 2,
+                Thicks = datas,
+                IsBackw = false,
+                FilmLength = 23.3,
+                FilmVelocity = 53.1,
+                OrgBoltNo = 41,
+                RAngle = 355,
+                RCnt = 6,
+                RPeriod = TimeSpan.FromMinutes(6.7)
+            };
 
-            double Max = datas.Max();
-            double Min = datas.Min();
-            double Sigma2 = datas.Sigma() * 2;
+            #endregion
+            #region 界面数据
 
+            Mix = graphparam.Mix;
+            XStepOrg = 5;
 
-            if (IsPercent)
-            {
-                MaxText = $"+{((Max - Average) / Average)*100.0:F1}%";
-                MinText = $"-{((Average - Min) / Average) * 100.0:F1}%";
-                Sigma2Text = $"{(Sigma2 / Average) * 100.0:F1}%";
-            }
-            else
-            {
-                MaxText = $"{Max:F1}";
-                MinText = $"{Min:F1}";
-                Sigma2Text = $"{Sigma2:F1}";
-            }
 
-            if (IsPercent || IsAutoTarget)
-            {
-                Target = Average;
-            }
-            else {
-                Target = target;
-            }
+            UpdateAverage();
+            UpdateMaxMinText();
+            UpdateY();
 
-            ToleranceYMax = Target + tolerance;
-            ToleranceYMin = Target - tolerance;
-            Tolerance2YMax = Target + tolerance * 2;
-            Tolerance2YMin = Target - tolerance * 2;
-            YMax = Target + tolerance * yrangepercent;
-            YMin = Target - tolerance * yrangepercent;
+            //UpdateX();
+            XMax = nbolts + 1;
 
             #endregion
-
-            Series = new SeriesCollection
-            {
-                new Column2Series
-                {
-                    Title = "扫描图",
-                    Values = Values,
-                    StrokeThickness = 1,
-                    Stroke = new SolidColorBrush(Colors.Black),
-                    PointGeometry = null,
-                    Configuration = Mapper
-                }
-            };
-            ((Series)Series[0]).SetBinding(Column2Series.YAxisCrossingProperty, new Binding("Target") { Source = this });
         }
 
-        public event PropertyChangedEventHandler PropertyChanged;
     }
 }
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/WdScanGraphConfig.xaml b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/WdScanGraphConfig.xaml
index 93415fd8a63e316e2ebe69ce8ed5e7e15a2d56cc..df9496e5a28057e2d1cb91a94bed071b5583d721 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/WdScanGraphConfig.xaml
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/WdScanGraphConfig.xaml
@@ -7,85 +7,121 @@
       xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks"
                            mc:Ignorable="d" 
             xmlns:uiModule="clr-namespace:FLY.Thick.Blowing.UI.UiModule"
-        Title="ScanGraphConfig" SizeToContent="WidthAndHeight" d:DataContext="{d:DesignInstance uiModule:ScanGraphItemParam}" 
+        Title="ScanGraphConfig" SizeToContent="WidthAndHeight" d:DataContext="{d:DesignInstance uiModule:ScanGraphItemParam}"   MinHeight="450" MinWidth="450" 
                            >
     <Window.Resources>
         <ResourceDictionary>
             <ResourceDictionary.MergedDictionaries>
-                <ResourceDictionary Source="pack://application:,,,/FLY.ControlLibrary;component/Themes/Dictionary_MyStyle.xaml"/>
-                <ResourceDictionary Source="pack://application:,,,/FLY.ControlLibrary;component/Converter/Dictionary_MyConv.xaml"/>
                 <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Blowing.UI;component/Themes/Styles.xaml"/>
-
             </ResourceDictionary.MergedDictionaries>
-
         </ResourceDictionary>
     </Window.Resources>
 
-    <Grid TextBlock.FontSize="24" TextBlock.FontStyle="Normal" Background="WhiteSmoke">
-        <StackPanel Margin="5,20">
-            <Grid >
-                <Grid.ColumnDefinitions>
-                    <ColumnDefinition/>
-                    <ColumnDefinition Width="auto"/>
-                </Grid.ColumnDefinitions>
-            </Grid>
-            <StackPanel Orientation="Horizontal">
-
-                <StackPanel Orientation="Horizontal">
-                    <StackPanel Margin="5">
-                        <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="混合数" />
-                        <StackPanel Orientation="Horizontal">
-                            <TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding Mix}"  />
-                        </StackPanel>
-                    </StackPanel>
-                    <StackPanel Margin="5">
-                        <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="记录点" />
+    <StackPanel Margin="{StaticResource ControlMargin}" >
+        <Grid Height="20" x:Name="grid_scanGraphVm"/>
+        <Grid Height="20" x:Name="grid_graphParam"/>
+        <TabControl >
+            <TabItem Header="浏览">
+                <StackPanel>
+                    <StackPanel Orientation="Horizontal" DataContext="{Binding ElementName=grid_scanGraphVm,Path=DataContext}">
                         <StackPanel Orientation="Horizontal">
-                            <TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding Number}"  />
+                            <Button Style="{StaticResource Styles.Button.Icon}" Click="btnLockClick" >
+                                <iconPacks:PackIconMaterial >
+                                    <iconPacks:PackIconMaterial.Style>
+                                        <Style TargetType="iconPacks:PackIconMaterial" BasedOn="{StaticResource Styles.Icon.Base}">
+                                            <Setter Property="Kind" Value="Lock"/>
+                                            <Style.Triggers>
+                                                <DataTrigger Binding="{Binding IsLocked}" Value="False">
+                                                    <Setter Property="Foreground" Value="Gray"/>
+                                                    <Setter Property="Kind" Value="LockOff"/>
+                                                </DataTrigger>
+                                            </Style.Triggers>
+                                        </Style>
+                                    </iconPacks:PackIconMaterial.Style>
+                                </iconPacks:PackIconMaterial>
+                            </Button>
+                            <StackPanel Margin="{StaticResource ControlMargin}">
+                                <Grid HorizontalAlignment="Left">
+                                    <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="记录点" />
+                                    <!--当不是最新, 弹出 自动按[最新] 倒计时-->
+                                    <Button Style="{StaticResource Styles.Button.Empty}" Click="btnResetNumberClick" 
+                                            VerticalAlignment="Bottom" HorizontalAlignment="Right" Margin="0,0,-10,-10" 
+                                            Visibility="{Binding IsNewest, Converter={StaticResource visbilityconv}, ConverterParameter=HiddenWhenTrue}">
+                                        <Grid Width="20" Height="20" >
+                                            <Ellipse  Fill="{StaticResource Brushes.Highlight}" />
+                                            <TextBlock Text="{Binding AutoKeepNewestTimeRemaining}" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White"/>
+                                        </Grid>
+                                    </Button>
+                                </Grid>
+                                <StackPanel Orientation="Horizontal">
+                                    <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding Number}"  />
+                                    <TextBlock Style="{StaticResource Styles.Text.FieldContent.Separator}"/>
+                                    <Button Style="{StaticResource Styles.Button.Empty}" Click="btnResetNumberClick">
+                                        <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" DataContext="{Binding ElementName=grid_graphParam,Path=DataContext}">
+                                        默认值:<Run Text="{Binding Number}"/>
+                                        </TextBlock>
+                                    </Button>
+                                </StackPanel>
+                            </StackPanel>
+                            <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Click="btnPreClick">
+                                <iconPacks:PackIconMaterial Kind="ArrowLeft" />
+                            </Button>
+                            <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Click="btnNextClick">
+                                <iconPacks:PackIconMaterial Kind="ArrowRight" />
+                            </Button>
+                            <StackPanel Margin="{StaticResource ControlMargin}" >
+                                <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="步进" />
+                                <StackPanel Orientation="Horizontal">
+                                    <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding NumberStep}"  />
+                                </StackPanel>
+                            </StackPanel>
                         </StackPanel>
                     </StackPanel>
-                    <Button Style="{StaticResource ButtonStyle_largeIcon}" Click="btnPreClick">
-                        <Grid>
-                            <Ellipse Fill="White" Margin="2"/>
-                            <iconPacks:PackIconMaterial Kind="ArrowLeftBoldCircle" />
-                        </Grid>
-                        
-                    </Button>
-                    <Button Style="{StaticResource ButtonStyle_largeIcon}" Click="btnNextClick">
-                        <Grid>
-                            <Ellipse Fill="White" Margin="2"/>
-                            <iconPacks:PackIconMaterial Kind="ArrowRightBoldCircle" />
-                        </Grid>
-                    </Button>
-                </StackPanel>
-            </StackPanel>
-            <StackPanel Orientation="Horizontal" >
-
 
-                <StackPanel Orientation="Horizontal" Visibility="{Binding ElementName=togglebutton_adv, Path=IsChecked,Converter={StaticResource visbilityconv},ConverterParameter=Collapsed}">
-                    <StackPanel Margin="5">
-                        <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="Y轴倍数" />
-                        <StackPanel Orientation="Horizontal">
-                            <TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding YRangePercent}" />
+                </StackPanel>
+            </TabItem>
+            <TabItem Header="视图">
+                <StackPanel>
+                    <StackPanel Orientation="Horizontal">
+                        <StackPanel Margin="{StaticResource ControlMargin}" >
+                            <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="默认记录点" />
+                            <StackPanel Orientation="Horizontal">
+                                <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding Number}"  />
+                            </StackPanel>
                         </StackPanel>
                     </StackPanel>
-                    <StackPanel Margin="5">
-                        <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="%显示" />
-                        <StackPanel Orientation="Horizontal">
-                            <ToggleButton Style="{StaticResource ToggleButtonStyle1}" IsChecked="{Binding IsPercent}"/>
+                    <StackPanel Orientation="Horizontal" >
+                        <StackPanel Margin="{StaticResource ControlMargin}">
+                            <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="混合数" />
+                            <StackPanel Orientation="Horizontal">
+                                <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding Mix}"  />
+                            </StackPanel>
+                        </StackPanel>
+                        <StackPanel Margin="{StaticResource ControlMargin}">
+                            <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="Y轴倍数" />
+                            <StackPanel Orientation="Horizontal">
+                                <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding YRangePercent}" />
+                            </StackPanel>
                         </StackPanel>
                     </StackPanel>
-                    <StackPanel Margin="5">
-                        <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="自动目标值" />
-                        <StackPanel Orientation="Horizontal">
-                            <ToggleButton Style="{StaticResource ToggleButtonStyle1}" IsChecked="{Binding IsAutoTarget}"/>
+                    <StackPanel Orientation="Horizontal">
+                        <StackPanel Margin="{StaticResource ControlMargin}">
+                            <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="%显示" />
+                            <StackPanel Orientation="Horizontal">
+                                <ToggleButton Style="{StaticResource Styles.ToggleButton.YESNO}" IsChecked="{Binding IsPercent}"/>
+                            </StackPanel>
+                        </StackPanel>
+                        <StackPanel Margin="{StaticResource ControlMargin}" >
+                            <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="自动目标值" />
+                            <StackPanel Orientation="Horizontal">
+                                <ToggleButton Style="{StaticResource Styles.ToggleButton.YESNO}" IsChecked="{Binding IsAutoTarget}"/>
+                            </StackPanel>
                         </StackPanel>
                     </StackPanel>
+                    <Button Style="{StaticResource Styles.Button.Apply}" Click="btnOkClick"/>
                 </StackPanel>
-
-            </StackPanel>
-            <Button Style="{StaticResource ButtonStyle_apply}" Click="btnOkClick"/>
-        </StackPanel>
-    </Grid>
+            </TabItem>
+        </TabControl>
+    </StackPanel>
 
 </flyctrllib:WindowBigClose>
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/WdScanGraphConfig.xaml.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/WdScanGraphConfig.xaml.cs
index 05837aa87d4e43a8afdf7200fd856ffb64929b7d..500cf7c3bb624519bc84dd6ce8ae06a8ca38f241 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/WdScanGraphConfig.xaml.cs
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph/WdScanGraphConfig.xaml.cs
@@ -20,32 +20,55 @@ namespace FLY.Thick.Blowing.UI.UiModule
     public partial class WdScanGraphConfig : FLY.ControlLibrary.WindowBigClose
     {
         ScanGraphItemParam graphparam;
-
+        IScanGraphVm scanGraphVm;
         public WdScanGraphConfig()
         {
             InitializeComponent();
         }
 
-        public void Init(ScanGraphItemParam graphparam)
+        public void Init(ScanGraphItemParam graphparam, IScanGraphVm scanGraphVm)
         {
-            this.DataContext = graphparam;
+            this.scanGraphVm = scanGraphVm;
             this.graphparam = graphparam;
+
+            this.grid_scanGraphVm.DataContext = scanGraphVm;
+            this.DataContext = graphparam;
         }
 
 
         private void btnPreClick(object sender, RoutedEventArgs e)
         {
-            graphparam.Number--;
+            scanGraphVm.PreView();
         }
 
         private void btnNextClick(object sender, RoutedEventArgs e)
         {
-            graphparam.Number++;
+            scanGraphVm.NextView();
         }
 
         private void btnOkClick(object sender, RoutedEventArgs e)
         {
             ScanGraphParams.Current.Save();
         }
+
+        private void btnLockClick(object sender, RoutedEventArgs e)
+        {
+            scanGraphVm.ChangeLock();
+        }
+
+        private void btnResetNumberClick(object sender, RoutedEventArgs e)
+        {
+            scanGraphVm.ResetNumber();
+        }
+    }
+    public interface IScanGraphVm 
+    {
+        void PreView();
+        void NextView();
+        void ChangeLock();
+
+        void ResetNumber();
+
+
     }
 }
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2.xaml b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2.xaml
index e13f765440e86eeb1b3f2e9c4afc0e8f9a728098..69886cd9b860ab6d5ea7a53b468ed551ad7afd82 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2.xaml
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2.xaml
@@ -6,7 +6,7 @@
              xmlns:local="clr-namespace:FLY.Thick.Blowing.UI.UiModule"
              xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf" xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks"
              mc:Ignorable="d" 
-             d:DesignHeight="250" d:DesignWidth="600" 
+             d:DesignHeight="300" d:DesignWidth="800" 
              >
     <UserControl.Resources>
 
@@ -19,37 +19,9 @@
             </ResourceDictionary.MergedDictionaries>
 
             <local:ScanGraph2VmUt x:Key="viewmodel"/>
-            <SolidColorBrush x:Key="TextBrush" Color="#4C4949" />
-            <SolidColorBrush x:Key="GrayBrush1" Color="#FF727272"/>
-            <SolidColorBrush x:Key="GrayBrush2" Color="#FF858484" />
-            <SolidColorBrush x:Key="SemiTransparentGreyBrush" Color="#30909090"/>
-            <SolidColorBrush x:Key="SemiTransparentActiveBrush" Color="#50008BE5"/>
-            <SolidColorBrush x:Key="WhiteBrush" Color="White"/>
-            <Style x:Key="TitleStyle" TargetType="TextBlock">
-                <Setter Property="Width" Value="50"/>
-                <Setter Property="Foreground" Value="{StaticResource GrayBrush1}"/>
-                <Setter Property="FontSize" Value="16"/>
-                <Setter Property="TextAlignment" Value="Right"/>
-            </Style>
-            <Style x:Key="ValueStyle" TargetType="TextBlock">
-                <Setter Property="Foreground" Value="{StaticResource TextBrush}"/>
-                <Setter Property="FontSize" Value="20"/>
-                <Setter Property="Padding" Value="5,0"/>
-            </Style>
-            <Style x:Key="ValueStyle2" TargetType="TextBlock">
-                <Setter Property="Foreground" Value="{StaticResource WhiteBrush}"/>
-                <Setter Property="Background" Value="{StaticResource TextBrush}"/>
-                <Setter Property="FontSize" Value="26"/>
-                <Setter Property="Padding" Value="5,0"/>
-            </Style>
-            <Style x:Key="UnitStyle" TargetType="TextBlock">
-                <Setter Property="Foreground" Value="{StaticResource GrayBrush2}"/>
-                <Setter Property="FontSize" Value="15"/>
-                <Setter Property="VerticalAlignment" Value="Bottom"/>
-            </Style>
         </ResourceDictionary>
     </UserControl.Resources>
-    <Border Style="{StaticResource BorderStyle_module}" >
+    <Border Style="{StaticResource Styles.Module.Border}" >
         <Grid d:DataContext="{StaticResource viewmodel}">
             <Grid.RowDefinitions>
                 <RowDefinition Height="auto"/>
@@ -118,62 +90,65 @@
 
                 </lvc:CartesianChart.AxisY>
             </lvc:CartesianChart>
-            <Button Style="{StaticResource ButtonStyle_icon}" Margin="48,0,0,-20"
+            <Button Style="{StaticResource Styles.Button.Icon}" Margin="48,0,0,-20"
                         Click="Button_info_click" >
-                <Grid Style="{StaticResource GridStyle_ButtonShadow}" >
+                <Grid Style="{StaticResource Styles.Shadow}" >
                     <TextBlock  Padding="10,5" VerticalAlignment="Top"
-                                    FontSize="24" Foreground="White" Background="{StaticResource Color_theme_activity}" 
+                                    FontSize="24" Foreground="{StaticResource Brushes.ThemeBackground}" Background="{StaticResource Brushes.Activity}" 
                                     Text="对比图" />
                 </Grid>
             </Button>
-            <Grid Grid.Column="1" Grid.RowSpan="2" Panel.ZIndex="2" 
-                  VerticalAlignment="Top" HorizontalAlignment="Left" >
-                <Viewbox MaxHeight="50">
-                    <StackPanel Orientation="Horizontal">
-                        <StackPanel>
-                            <StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" Margin="5">
-
-                                <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Time,StringFormat={}{0:MM-dd HH:mm:ss}}"/>
-                                <StackPanel Orientation="Horizontal" Margin="5,0">
-                                    <TextBlock Style="{StaticResource TitleStyle}" Text="ID:" />
-                                    <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Id}"/>
-                                </StackPanel>
+            <Grid Grid.Column="1" Grid.RowSpan="2" Panel.ZIndex="2" VerticalAlignment="Top" HorizontalAlignment="Left" 
+                        Margin="{StaticResource ControlMargin}">
+                <Grid.ColumnDefinitions>
+                    <ColumnDefinition/>
+                    <ColumnDefinition Width="auto"/>
+                </Grid.ColumnDefinitions>
+                <StackPanel>
+                    <Viewbox MaxHeight="{StaticResource FontSize.Value}" HorizontalAlignment="Left" Margin="2">
+                        <StackPanel Orientation="Horizontal">
+                            <TextBlock Style="{StaticResource ValueStyle}" >
+                            <Run Text="{Binding Time,Mode=OneWay,StringFormat={}{0:MM-dd HH:mm:ss}}"/>~<Run Text="{Binding EndTime,Mode=OneWay,StringFormat={}{0:HH:mm:ss}}"/>
+                            </TextBlock>
+                            <StackPanel Orientation="Horizontal" Margin="{StaticResource TextMargin}">
+                                <TextBlock Style="{StaticResource TitleStyle}" Text="ID:" />
+                                <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Id}"/>
+                            </StackPanel>
 
+                        </StackPanel>
+                    </Viewbox>
+                    <Viewbox MaxHeight="{StaticResource FontSize.Value}" HorizontalAlignment="Left" Margin="2">
+                        <StackPanel Orientation="Horizontal">
+                            <StackPanel Orientation="Horizontal" Margin="{StaticResource TextMargin}">
+                                <TextBlock >
+                                    <TextBlock.Style>
+                                        <Style TargetType="TextBlock" BasedOn="{StaticResource ValueStyle}">
+                                            <Setter Property="Background" Value="#99000000"/>
+                                            <Setter Property="Foreground" Value="White"/>
+                                            <Setter Property="Text" Value="逆"/>
+                                            <Style.Triggers>
+                                                <DataTrigger Binding="{Binding IsBackw}" Value="True">
+                                                    <Setter Property="Background" Value="#99008BE5"/>
+                                                    <Setter Property="Text" Value="顺"/>
+                                                </DataTrigger>
+                                            </Style.Triggers>
+                                        </Style>
+                                    </TextBlock.Style>
+                                </TextBlock>
                             </StackPanel>
-                            <StackPanel Orientation="Horizontal">
-                                <StackPanel Orientation="Horizontal" Margin="5,0">
-                                    <TextBlock >
-                                        <TextBlock.Style>
-                                            <Style TargetType="TextBlock" BasedOn="{StaticResource ValueStyle}">
-                                                <Setter Property="Background" Value="#99000000"/>
-                                                <Setter Property="Foreground" Value="White"/>
-                                                <Setter Property="Text" Value="逆"/>
-                                                <Style.Triggers>
-                                                    <DataTrigger Binding="{Binding IsBackw}" Value="True">
-                                                        <Setter Property="Background" Value="#99008BE5"/>
-                                                        <Setter Property="Text" Value="顺"/>
-                                                    </DataTrigger>
-                                                </Style.Triggers>
-                                            </Style>
-                                        </TextBlock.Style>
-                                    </TextBlock>
-                                </StackPanel>
-                                <StackPanel Orientation="Horizontal" Background="#99FFFFFF">
-                                    <StackPanel Orientation="Horizontal" Margin="5,0">
-                                        <TextBlock Style="{StaticResource ValueStyle}" 
+                            <StackPanel Orientation="Horizontal" Background="#99FFFFFF">
+                                <StackPanel Orientation="Horizontal" Margin="{StaticResource TextMargin}">
+                                    <TextBlock Style="{StaticResource ValueStyle}" 
                                                    Text="{Binding RPeriod, Converter={StaticResource timespanconv}}" 
                                                     />
-                                        <TextBlock Style="{StaticResource TitleStyle}" Width="auto" VerticalAlignment="Bottom"
+                                    <TextBlock Style="{StaticResource TitleStyle}" Width="auto" VerticalAlignment="Bottom"
                                                    Text="min/R" />
-                                    </StackPanel>
                                 </StackPanel>
-
                             </StackPanel>
-                        </StackPanel>
-
 
-                    </StackPanel>
-                </Viewbox>
+                        </StackPanel>
+                    </Viewbox>
+                </StackPanel>
             </Grid>
             <Grid Grid.Column="2" Grid.RowSpan="2" Panel.ZIndex="1" 
                   Margin="10,0" VerticalAlignment="Top" HorizontalAlignment="Right"
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2.xaml.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2.xaml.cs
index ff490d7a7b7f2e0cd439dc98b7d9f02f247fa173..12d96377420803a6675cf2cc88dfe6f9c717c653 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2.xaml.cs
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2.xaml.cs
@@ -47,7 +47,7 @@ namespace FLY.Thick.Blowing.UI.UiModule
                 return;
 
             WdScanGraphConfig window = new WdScanGraphConfig();
-            window.Init(graphparam);
+            window.Init(graphparam, viewModel);
             window.Owner = FLY.ControlLibrary.COMMON.GetWindow(this);
             window.ShowDialog();
         }
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2Vm.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2Vm.cs
index 40ecd2de54ca439fcb7deb93f801162427bd36d5..3339a7cb2a38d8d4f4232ef93b130ee916d6e8be 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2Vm.cs
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2Vm.cs
@@ -2,6 +2,7 @@
 using FLY.Thick.Blowing.IService;
 using FLY.Thick.Blowing.Server.Model;
 using FObjBase;
+using GalaSoft.MvvmLight.Command;
 using LiveCharts;
 using LiveCharts.Configurations;
 using LiveCharts.Wpf;
@@ -12,14 +13,21 @@ using System.ComponentModel;
 using System.Linq;
 using System.Windows.Data;
 using System.Windows.Media;
+using System.Windows.Threading;
 
 namespace FLY.Thick.Blowing.UI.UiModule
 {
-    public class ScanGraph2Vm : INotifyPropertyChanged
+    public class ScanGraph2Vm : IScanGraphVm, INotifyPropertyChanged
     {
         const int MARKNO_TEXT = 1;
         const int MARKNO_Y = 2;
         const int MARKNO_TARGET = 3;
+
+        /// <summary>
+        /// 自动切换为 DefaultNumber 倒计时 初始值
+        /// </summary>
+        const int AutoKeepTotalSec = 60;
+
         #region 图表控制
         public double YMax { get; set; } = double.NaN;
         public double YMin { get; set; } = double.NaN;
@@ -87,13 +95,16 @@ namespace FLY.Thick.Blowing.UI.UiModule
         /// <summary>
         /// 混合数
         /// </summary>
-        public int Mix { get; private set; } = 2;
+        public int Mix { get; protected set; } = 1;
 
         /// <summary>
         /// 测量时间
         /// </summary>
         public DateTime Time { get; private set; }
-
+        /// <summary>
+        /// 测量结束时间
+        /// </summary>
+        public DateTime EndTime { get; private set; }
         /// <summary>
         /// 旋转方向 是反向
         /// </summary>
@@ -109,24 +120,55 @@ namespace FLY.Thick.Blowing.UI.UiModule
         public long Id { get; private set; } = 1231221;
         public int OrgBoltNo { get; private set; } = -100;
 
+        /// <summary>
+        /// 只要 Number被改变,且不为0, AutoKeepNewestTimeRemaining就会被设为10s.
+        /// 当 AutoKeepNewestTimeRemaining = 0, Number就会被设置为0
+        /// </summary>
+        public int AutoKeepNewestTimeRemaining { get; protected set; }
+
+        /// <summary>
+        /// Number == graphparam.Number
+        /// </summary>
+        public bool IsNewest { get; protected set; } = true;
+
+        /// <summary>
+        /// 锁上, Number 不会 自动变回 DefaultNumber,且 Number = Id
+        /// </summary>
+        public bool IsLocked { get; set; }
+
+        /// <summary>
+        /// 记录点1, 与 graphparam.Number 分离
+        /// </summary>
+        public long Number { get; set; }
+
+
+
+
+        /// <summary>
+        /// 记录点 变化步进
+        /// </summary>
+        public int NumberStep { get; set; } = 1;
+
         #endregion
 
         [PropertyChanged.AlsoNotifyFor(nameof(XFormatter), nameof(XStep))]
         public int BPC { get; set; } = 1;
 
-        List<Brush> AreaColors;
+        protected List<Brush> AreaColors;
 
-        ChartValues<double> Values = new ChartValues<double>();
-        ChartValues<double> Values2 = new ChartValues<double>();
+        protected ChartValues<double> Values = new ChartValues<double>();
+        protected ChartValues<double> Values2 = new ChartValues<double>();
 
+        public RelayCommand AutoLockCmd { get; private set; }
 
-        BlowingFixProfileParam profileParam;
-        ScanGraphItemParam graphparam;
-        IBulkDbService bulkDb;
-        Lc_ScanData scanData;
-        Db_Profile profile;
-        IBlowingService blowingService;
-        ParamDictionary paramDictionary;
+        protected BlowingFixProfileParam profileParam;
+        protected ScanGraphItemParam graphparam;
+        protected IBulkDbService bulkDb;
+        protected Lc_ScanData scanData;
+        protected Db_Profile profile;
+        protected IBlowingService blowingService;
+        protected ParamDictionary paramDictionary;
+        protected DispatcherTimer timer;
         public ScanGraph2Vm()
         {
             #region 与数据无关界面参数
@@ -242,6 +284,8 @@ namespace FLY.Thick.Blowing.UI.UiModule
                 }
             };
             ((Series)Series[0]).SetBinding(Column2Series.YAxisCrossingProperty, new Binding("Target") { Source = this });
+
+            AutoLockCmd = new RelayCommand(ChangeAutoLock);
         }
 
         public void Init(
@@ -261,7 +305,6 @@ namespace FLY.Thick.Blowing.UI.UiModule
         }
         void Init()
         {
-            Misc.BindingOperations.SetBinding(graphparam, nameof(graphparam.Mix), this, nameof(Mix));
             Misc.BindingOperations.SetBinding(blowingService, nameof(blowingService.BPC), this, nameof(BPC));
             paramDictionary.SetBinding(this, nameof(XStepOrg), nameof(XStep), 5);
             UpdateY();
@@ -269,6 +312,8 @@ namespace FLY.Thick.Blowing.UI.UiModule
 
             Values.Clear();
 
+            init_autoKeep();
+
             Id = -1;
             UpdateId();
 
@@ -280,8 +325,62 @@ namespace FLY.Thick.Blowing.UI.UiModule
 
             UpdateTemp();
         }
+        void init_autoKeep()
+        {
+
+            ResetNumber();
+
+            timer = new DispatcherTimer();
+            timer.Interval = TimeSpan.FromSeconds(1);
+            timer.Tick += (s, e) =>
+            {
+                if (Number == graphparam.Number)
+                {
+                    timer.Stop();
+                    return;
+                }
+
+                if (IsLocked)
+                {
+                    return;
+                }
 
-        private void BulkDb_TempFrameChanged(object sender, EventArgs _e)
+                if (AutoKeepNewestTimeRemaining > 0)
+                    AutoKeepNewestTimeRemaining--;
+                if (AutoKeepNewestTimeRemaining <= 0)
+                {
+                    ResetNumber();
+                    timer.Stop();
+                    return;
+                }
+            };
+            this.graphparam.PropertyChanged += (s, e) =>
+            {
+                if (e.PropertyName == nameof(graphparam.Number))
+                {
+                    ResetNumber();
+                    timer.IsEnabled = false;
+                    IsNewest = true;
+                    AutoKeepNewestTimeRemaining = AutoKeepTotalSec;
+                }
+            };
+            this.PropertyChanged += (s, e) => {
+                if (e.PropertyName == nameof(IsLocked))
+                {
+                    if (Id >= 0)
+                    {
+                        Number = Id;
+                    }
+                }
+                else if (e.PropertyName == nameof(Number))
+                {
+                    timer.IsEnabled = Number != graphparam.Number;
+                    IsNewest = !timer.IsEnabled;
+                    AutoKeepNewestTimeRemaining = AutoKeepTotalSec;
+                }
+            };
+        }
+        protected void BulkDb_TempFrameChanged(object sender, EventArgs _e)
         {
             BulkDbTempFrameChangedEventArgs e = (BulkDbTempFrameChangedEventArgs)_e;
 
@@ -316,16 +415,16 @@ namespace FLY.Thick.Blowing.UI.UiModule
         {
             if (e.PropertyName == nameof(Average))
             {
-                UpdateTarget();
-                UpdateMaxMinText();
+                UpdateTarget_delay();
+                UpdateMaxMinText_delay();
             }
             else if ((e.PropertyName == nameof(Max)) || (e.PropertyName == nameof(Min)) || (e.PropertyName == nameof(Sigma2)))
             {
-                UpdateMaxMinText();
+                UpdateMaxMinText_delay();
             }
             else if (e.PropertyName == nameof(Average2))
             {
-                UpdateTarget();
+                UpdateTarget_delay();
             }
             else if (e.PropertyName == nameof(Target))
             {
@@ -333,11 +432,15 @@ namespace FLY.Thick.Blowing.UI.UiModule
                 {
                     NotifyPropertyChanged(nameof(YFormatter));
                 }
-                UpdateY2();
+                UpdateY2_delay();
             }
             else if (e.PropertyName == nameof(TolerancePercent))
             {
-                UpdateY2();
+                UpdateY2_delay();
+            }
+            else if (e.PropertyName == nameof(Number))
+            {
+                UpdateId();
             }
         }
 
@@ -373,28 +476,24 @@ namespace FLY.Thick.Blowing.UI.UiModule
         {
             if (e.PropertyName == nameof(graphparam.YRangePercent))
             {
-                UpdateTarget();
-                UpdateY2();
+                UpdateTarget_delay();
+                UpdateY2_delay();
             }
-            else if (e.PropertyName == nameof(graphparam.Number))
-            {
-                UpdateId();
-            }
-            else if (e.PropertyName == nameof(graphparam.IsPercent))
+            if (e.PropertyName == nameof(graphparam.IsPercent))
             {
                 NotifyPropertyChanged(nameof(YFormatter));
-                UpdateTarget();
-                UpdateMaxMinText();
+                UpdateTarget_delay();
+                UpdateMaxMinText_delay();
 
             }
             else if (e.PropertyName == nameof(graphparam.IsAutoTarget))
             {
-                UpdateTarget();
+                UpdateTarget_delay();
             }
         }
 
 
-        void UpdateOrgTarget()
+        protected void UpdateOrgTarget()
         {
             //if (this.profile != null)
             //{
@@ -423,71 +522,82 @@ namespace FLY.Thick.Blowing.UI.UiModule
         void UpdateY()
         {
             UpdateOrgTarget();
-            UpdateTarget();
-            UpdateY2();
+            UpdateTarget_delay();
+            UpdateY2_delay();
         }
 
-        void UpdateTarget()
+        void UpdateTarget_delay() 
         {
 
             PollModule.Current.Poll_JustOnce(() =>
             {
-                double target = OrgTarget;
-                if (graphparam.IsPercent || graphparam.IsAutoTarget)
-                {
-                    if (!double.IsNaN(Average))
-                        target = Average;
-                }
+                UpdateTarget();
+            }, this, MARKNO_TARGET);
+        }
+        protected void UpdateTarget()
+        {
 
-                double tolerance = TolerancePercent * target;
+            double target = OrgTarget;
+            if (graphparam.IsPercent || graphparam.IsAutoTarget)
+            {
+                if (!double.IsNaN(Average))
+                    target = Average;
+            }
 
-                if (tolerance < 0.1)
-                    tolerance = 0.1;
+            double tolerance = TolerancePercent * target;
 
-                if (!double.IsNaN(Average2))
+            if (tolerance < 0.1)
+                tolerance = 0.1;
+
+            if (!double.IsNaN(Average2))
+            {
+                //tempdata 不在显示范围内, 调整 target 为 Average2
+                if (Math.Abs(Average2 - target) > tolerance * graphparam.YRangePercent)
                 {
-                    //tempdata 不在显示范围内, 调整 target 为 Average2
-                    if (Math.Abs(Average2 - target) > tolerance * graphparam.YRangePercent)
+                    target = Target;
+                    if (!double.IsNaN(target))
                     {
-                        target = Target;
-                        if (!double.IsNaN(target))
-                        {
-                            //tempdata 也不在 当前视图 内 
-                            if (Math.Abs(Average2 - target) > tolerance * graphparam.YRangePercent)
-                            {
-                                target = Average2;
-                            }
-                        }
-                        else
+                        //tempdata 也不在 当前视图 内 
+                        if (Math.Abs(Average2 - target) > tolerance * graphparam.YRangePercent)
                         {
-                            //视图还没初始化。。。
                             target = Average2;
                         }
                     }
+                    else
+                    {
+                        //视图还没初始化。。。
+                        target = Average2;
+                    }
                 }
+            }
 
-                Target = target;
-            }, this, MARKNO_TARGET);
+            Target = target;
         }
 
-        void UpdateY2()
+
+
+        protected void UpdateY2()
         {
-            PollModule.Current.Poll_JustOnce(() =>
-            {
-                double target = Target;
-                double tolerancePercent = TolerancePercent;
+            double target = Target;
+            double tolerancePercent = TolerancePercent;
 
-                double tolerance = target * tolerancePercent;
-                if (tolerance < 0.1)
-                    tolerance = 0.1;
+            double tolerance = target * tolerancePercent;
+            if (tolerance < 0.1)
+                tolerance = 0.1;
 
-                ToleranceYMax = target + tolerance;
-                ToleranceYMin = target - tolerance;
-                Tolerance2YMax = target + tolerance * 2;
-                Tolerance2YMin = target - tolerance * 2;
+            ToleranceYMax = target + tolerance;
+            ToleranceYMin = target - tolerance;
+            Tolerance2YMax = target + tolerance * 2;
+            Tolerance2YMin = target - tolerance * 2;
 
-                YMax = target + tolerance * graphparam.YRangePercent;
-                YMin = target - tolerance * graphparam.YRangePercent;
+            YMax = target + tolerance * graphparam.YRangePercent;
+            YMin = target - tolerance * graphparam.YRangePercent;
+        }
+        void UpdateY2_delay()
+        {
+            PollModule.Current.Poll_JustOnce(() =>
+            {
+                UpdateY2();
             }, this, MARKNO_Y);
         }
         void UpdateX()
@@ -508,33 +618,37 @@ namespace FLY.Thick.Blowing.UI.UiModule
         {
             Update4IdChanged();
         }
-
-        void UpdateMaxMinText()
+        void UpdateMaxMinText_delay() 
         {
             PollModule.Current.Poll_JustOnce(() =>
             {
-                if (graphparam.IsPercent && (Average > 0))
-                {
-                    MaxText = $"+{((Max - Average) / Average) * 100.0:F1}%";
-                    MinText = $"-{((Average - Min) / Average) * 100.0:F1}%";
-                    Sigma2Text = $"{(Sigma2 / Average) * 100.0:F1}%";
-                }
-                else
-                {
-                    MaxText = $"{Max:F1}";
-                    MinText = $"{Min:F1}";
-                    Sigma2Text = $"{Sigma2:F1}";
-                }
+                UpdateMaxMinText();
             }, this, MARKNO_TEXT);
         }
+        protected void UpdateMaxMinText()
+        {
+            if (graphparam.IsPercent && (Average > 0))
+            {
+                MaxText = $"+{((Max - Average) / Average) * 100.0:F1}%";
+                MinText = $"-{((Average - Min) / Average) * 100.0:F1}%";
+                Sigma2Text = $"{(Sigma2 / Average) * 100.0:F1}%";
+            }
+            else
+            {
+                MaxText = $"{Max:F1}";
+                MinText = $"{Min:F1}";
+                Sigma2Text = $"{Sigma2:F1}";
+            }
+        }
 
 
-        void Update4IdChanged2()
+        protected void Update4IdChanged2()
         {
             Values.Clear();
             if (this.scanData == null)
             {
                 Time = DateTime.MinValue;
+                EndTime = DateTime.MinValue;
                 Id = -1;
                 OrgBoltNo = -100;
                 return;
@@ -542,6 +656,7 @@ namespace FLY.Thick.Blowing.UI.UiModule
             else
             {
                 Time = this.scanData.Time;
+                EndTime = this.scanData.EndTime;
                 Id = this.scanData.ID;
                 OrgBoltNo = this.scanData.OrgBoltNo;
                 IsBackw = this.scanData.IsBackw;
@@ -568,19 +683,45 @@ namespace FLY.Thick.Blowing.UI.UiModule
                 Sigma2 = double.NaN;
             }
         }
-        void Update4IdChanged()
+
+        bool IsNeedToGetFrame()
         {
-            if (graphparam.Number > 0 && bulkDb.LastScanDataId == Id)
+            if (Mix != graphparam.Mix)
+            {
+                return true;
+            }
+
+            if (Number > 0)
             {
-                //不需要更新!!!!!!!
+                //绝对位置模式
+                if (Number != Id)
+                    return true;
+                else
+                    return false;
             }
+            //相对位置模式
+
+            if (Number == Id - bulkDb.LastScanDataId)
+            {
+                //已经是需要查找的记录
+                return false;
+            }
+
+            return true;
+        }
+
+        void Update4IdChanged()
+        {
+            if (!IsNeedToGetFrame())
+                return;
 
             bulkDb.GetFrame(
-                new Pack_GetFrameRequest() { Id = graphparam.Number, Mix = graphparam.Mix },
+                new Pack_GetFrameRequest() { Id = Number, Mix = graphparam.Mix },
                 (object AsyncContext, object retData) =>
                 {
                     Pack_GetFrameReponse reponse = retData as Pack_GetFrameReponse;
 
+                    Mix = reponse.Request.Mix;
                     //if (reponse.scanData != null)
                     {
                         this.scanData = reponse.scanData;
@@ -594,7 +735,35 @@ namespace FLY.Thick.Blowing.UI.UiModule
                 }, this);
         }
 
-        void NotifyPropertyChanged(string propertyName)
+        public void PreView()
+        {
+            Number -= NumberStep;
+        }
+
+        public void NextView()
+        {
+            Number += NumberStep;
+        }
+
+        public void ChangeLock()
+        {
+            IsLocked = !IsLocked;
+        }
+
+        public void ResetNumber()
+        {
+            Number = graphparam.Number;
+        }
+        public void ChangeAutoLock()
+        {
+            ChangeLock();
+            if (!IsLocked)
+            {
+                ResetNumber();
+            }
+        }
+
+        protected void NotifyPropertyChanged(string propertyName)
         {
             PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
         }
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2VmUt.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2VmUt.cs
index aaccb678b5ef05207bcd5a5947fff84451890340..79340ddbabb49f1789db25c8f5f53f5ff65963fb 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2VmUt.cs
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraph2/ScanGraph2VmUt.cs
@@ -1,4 +1,5 @@
-using LiveCharts;
+using FLY.Thick.Blowing.IService;
+using LiveCharts;
 using LiveCharts.Configurations;
 using LiveCharts.Wpf;
 using Misc;
@@ -11,154 +12,10 @@ using System.Windows.Media;
 
 namespace FLY.Thick.Blowing.UI.UiModule
 {
-    public class ScanGraph2VmUt : INotifyPropertyChanged
+    public class ScanGraph2VmUt : ScanGraph2Vm
     {
-        #region 图表控制
-        public double YMax { get; set; }
-        public double YMin { get; set; }
-        public double Target { get; set; }
-        public double Tolerance2YMax { get; set; }
-        public double Tolerance2YMin { get; set; }
-        public double ToleranceYMax { get; set; }
-        public double ToleranceYMin { get; set; }
-        public double XMax { get; set; }
-        public double XMin { get; set; }
-
-        public int XStep { get; set; } = 5;
-
-        public Func<double, string> YFormatter { get; set; }
-
-        public SeriesCollection Series { get; set; }
-
-        #endregion
-
-        #region 颜色
-        List<Brush> AreaColors;
-        #endregion
-
-
-        #region 界面统计值
-
-        public double Average { get; set; }
-
-
-        public string Sigma2Text { get; set; }
-        public string MaxText { get; set; }
-        public string MinText { get; set; }
-
-        /// <summary>
-        /// 混合数
-        /// </summary>
-        public int Mix { get; set; }
-
-        /// <summary>
-        /// 测量时间
-        /// </summary>
-        public DateTime Time { get; set; }
-
-        /// <summary>
-        /// 旋转方向 是反向
-        /// </summary>
-        public bool IsBackw { get; private set; }
-
-        /// <summary>
-        /// 旋转1周的时间
-        /// </summary>
-        public TimeSpan RPeriod { get; private set; }
-
-
-        public DateTime Time2 { get; set; }
-        /// <summary>
-        /// 数据库中的ID标示
-        /// </summary>
-        public int Id { get; set; }
-
-        /// <summary>
-        /// 复位区号
-        /// </summary>
-        public int OrgBoltNo { get; set; }
-
-        public bool IsPercent { get; set; }
-        public bool IsAutoTarget { get; set; }
-
-
-        #endregion
-
-
-
-        ChartValues<double> Values { get; } = new ChartValues<double>();
-        ChartValues<double> Values2 { get; } = new ChartValues<double>();
-        object Mapper { get; set; }
-        object Mapper2 { get; set; }
-
-
         public ScanGraph2VmUt()
         {
-
-            #region 与数据无关界面参数
-            AreaColors = new List<Brush>();
-            for (int i = 0; i < 5; i++)
-                AreaColors.Add(FLY.ControlLibrary.Themes.Styles.AreaColors[i]);
-
-            
-            YFormatter = (y) =>
-            {
-                if (IsPercent)
-                {
-                    if (y == Average)
-                    {
-                        return y.ToString("F1");
-                    }
-                    else
-                    {
-                        double percent = 100.0 * (y - Average) / Average;
-                        if (percent > 0)
-                        {
-                            return $"+{Math.Abs(percent):F1}%";
-                        }
-                        else {
-                            return $"-{Math.Abs(percent):F1}%";
-                        }
-                        
-                    }
-                }
-                else {
-                    return y.ToString("F1");
-                }
-            };
-
-            Mapper = Mappers.Xy<double>()
-                .X((value, index) => index+1)
-                .Y(value => value)
-                .Fill((value) =>
-                {
-                    if (value > Tolerance2YMax)
-                    {
-                        return AreaColors[0];
-                    }
-                    else if (value > ToleranceYMax)
-                    {
-                        return AreaColors[1];
-                    }
-                    else if (value >= ToleranceYMin)
-                    {
-                        return AreaColors[2];
-                    }
-                    else if (value >= Tolerance2YMin)
-                    {
-                        return AreaColors[1];
-                    }
-                    else
-                    {
-                        return AreaColors[0];
-                    }
-                });
-            
-            Mapper2 = Mappers.Xy<double>()
-                .X((value, index) => index + 1)
-                .Y(value => value);
-
-            #endregion
             #region 数据
             double target = 150;
             double tolerance = target * 0.02;
@@ -177,91 +34,64 @@ namespace FLY.Thick.Blowing.UI.UiModule
                 datas2[i] = (Math.Sin(i * Math.PI / nbolts) * 3) * tolerance + target + (random.NextDouble() - 0.5) * 1 - 6;
             }
 
-            #endregion
-            #region 界面数据
-
-
+            profileParam = new Common.BlowingFixProfileParam()
+            {
+                Target = target,
+                TolerancePercent = 0.02,
+                K = 1,
+                PName = "abc",
+                OrderNo = "12313121",
+                Number = "2"
+            };
 
-            XMin = 0;
-            XMax = nbolts + 1;
-            XStep = 5;
-            Mix = 2;
-            Time = DateTime.Now;
-            Time2 = DateTime.Now - TimeSpan.FromMinutes(10);
+            graphparam = new ScanGraphItemParam()
+            {
+                IsPercent = true,
+                IsAutoTarget = true,
+                YRangePercent = 3,
+                Number = -1,
+                Mix = 2
+            };
 
-            IsBackw = true;
-            RPeriod = TimeSpan.FromMinutes(10.1);
-            Id = 312312;
+            scanData = new Server.Model.Lc_ScanData()
+            {
+                Time = DateTime.Now.AddSeconds(-60),
+                EndTime = DateTime.Now.AddSeconds(-30),
+                ID = 1234567,
+                K = 2,
+                Thicks = datas
+            };
+            BulkDbTempFrameChangedEventArgs e = new BulkDbTempFrameChangedEventArgs()
+            {
+                Time = DateTime.Now.AddSeconds(-25),
+                EndTime = DateTime.Now,
+                StartIndex = 0,
+                D = datas2
+            };
+            #endregion
+            #region 界面数据
 
-            OrgBoltNo = 31;
-            IsPercent = true;
-            IsAutoTarget = true;
-            Values.AddRange(datas);
-            Values2.AddRange(datas2);
-            Average = datas.AverageNoNull();
 
 
+            Mix = graphparam.Mix;
+            XStepOrg = 5;
 
-            double Max = datas.Max();
-            double Min = datas.Min();
-            double Sigma2 = datas.Sigma() * 2;
 
+            BulkDb_TempFrameChanged(null, e);
 
-            if (IsPercent)
-            {
-                MaxText = $"+{((Max - Average) / Average)*100.0:F1}%";
-                MinText = $"-{((Average - Min) / Average) * 100.0:F1}%";
-                Sigma2Text = $"{(Sigma2 / Average) * 100.0:F1}%";
-            }
-            else
-            {
-                MaxText = $"{Max:F1}";
-                MinText = $"{Min:F1}";
-                Sigma2Text = $"{Sigma2:F1}";
-            }
+            Update4IdChanged2();
+            UpdateOrgTarget();
 
-            if (IsPercent || IsAutoTarget)
-            {
-                Target = Average;
-            }
-            else {
-                Target = target;
-            }
+            UpdateTarget();
+            UpdateY2();
+            UpdateMaxMinText();
 
-            ToleranceYMax = Target + tolerance;
-            ToleranceYMin = Target - tolerance;
-            Tolerance2YMax = Target + tolerance * 2;
-            Tolerance2YMin = Target - tolerance * 2;
-            YMax = Target + tolerance * yrangepercent;
-            YMin = Target - tolerance * yrangepercent;
+            //UpdateX();
+            XMax = nbolts + 1;
 
             #endregion
 
-            Series = new SeriesCollection
-            {
-                new Column2Series
-                {
-                    Title = "扫描图",
-                    Values = Values,
-                    StrokeThickness = 1,
-                    Stroke = new SolidColorBrush(Colors.Black),
-                    PointGeometry = null,
-                    Configuration = Mapper
-                },
-                new LineSeries
-                {
-                    Title = "曲线图",
-                    Values = Values2,
-                    StrokeThickness = 3,
-                    Stroke = new SolidColorBrush(Colors.DarkBlue),
-                    Fill = new SolidColorBrush(Colors.Transparent),
-                    PointGeometry = null,
-                    Configuration = Mapper2
-                }
-            };
-            ((Series)Series[0]).SetBinding(Column2Series.YAxisCrossingProperty, new Binding("Target") { Source = this });
-        }
 
-        public event PropertyChangedEventHandler PropertyChanged;
+        }
     }
 }
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircular.xaml b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircular.xaml
index 3aba04e11f8aabdf0f2f6dc731c29dbd0f64bb33..1ba41cabadcc25d0c90e95350a295511c0b47b72 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircular.xaml
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircular.xaml
@@ -6,7 +6,7 @@
              xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks"
              mc:Ignorable="d" 
              xmlns:local="clr-namespace:FLY.Thick.Blowing.UI.UiModule"
-             d:DesignHeight="300" d:DesignWidth="300">
+             d:DesignHeight="400" d:DesignWidth="400">
     <UserControl.Resources>
 
 
@@ -14,10 +14,11 @@
             <ResourceDictionary.MergedDictionaries>
                 <ResourceDictionary Source="pack://application:,,,/FLY.ControlLibrary;component/Converter/Dictionary_MyConv.xaml"/>
                 <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Blowing.UI;component/Themes/Styles.xaml"/>
+                <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Blowing.UI;component/Themes/Colors.xaml"/>
             </ResourceDictionary.MergedDictionaries>
 
             <local:ScanGraphCircularVmUt x:Key="viewmodel"/>
-            <SolidColorBrush x:Key="TextBrush" Color="#4C4949" />
+            <!--<SolidColorBrush x:Key="TextBrush" Color="#4C4949" />
             <SolidColorBrush x:Key="GrayBrush1" Color="#FF727272"/>
             <SolidColorBrush x:Key="GrayBrush2" Color="#FF858484" />
             <SolidColorBrush x:Key="SemiTransparentGreyBrush" Color="#99F0F0F0"/>
@@ -44,10 +45,10 @@
                 <Setter Property="Foreground" Value="{StaticResource GrayBrush2}"/>
                 <Setter Property="FontSize" Value="15"/>
                 <Setter Property="VerticalAlignment" Value="Bottom"/>
-            </Style>
+            </Style>-->
         </ResourceDictionary>
     </UserControl.Resources>
-    <Border Style="{StaticResource BorderStyle_module}" >
+    <Border Style="{StaticResource Styles.Module.Border}" >
         <Grid d:DataContext="{StaticResource viewmodel}">
             <Grid.RowDefinitions>
                 <RowDefinition Height="auto"/>
@@ -60,11 +61,11 @@
             </Grid.ColumnDefinitions>
             <local:PolarChart x:Name="graph" Grid.Row="1" Grid.ColumnSpan="3" />
 
-            <Button Style="{StaticResource ButtonStyle_icon}" Margin="0,0,0,-20"
+            <Button Style="{StaticResource Styles.Button.Icon}" Margin="0,0,0,-20"
                         Click="Button_info_click" >
-                <Grid Style="{StaticResource GridStyle_ButtonShadow}" >
+                <Grid Style="{StaticResource Styles.Shadow}" >
                     <TextBlock  Padding="10,5" VerticalAlignment="Top"
-                                    FontSize="24" Foreground="White" Background="{StaticResource Color_theme_activity}" 
+                                    FontSize="24" Foreground="White" Background="{StaticResource Brushes.Activity}" 
                                     Text="环型图" />
                 </Grid>
             </Button>
@@ -75,7 +76,9 @@
                         <StackPanel>
                             <StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" Margin="5">
 
-                                <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Time,StringFormat={}{0:MM-dd HH:mm:ss}}"/>
+                                <TextBlock Style="{StaticResource ValueStyle}" >
+                            <Run Text="{Binding Time,Mode=OneWay,StringFormat={}{0:MM-dd HH:mm:ss}}"/>~<Run Text="{Binding EndTime,Mode=OneWay,StringFormat={}{0:HH:mm:ss}}"/>
+                                </TextBlock>
                                 <StackPanel Orientation="Horizontal" Margin="5,0">
                                     <TextBlock Style="{StaticResource TitleStyle}" Text="ID:" />
                                     <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Id}"/>
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircular.xaml.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircular.xaml.cs
index 9ecb0745cb650fd8e2d893b35d4b232d89d05925..bb80ae4a3e45d28b2d2cd5dfe35073b86f99772e 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircular.xaml.cs
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircular.xaml.cs
@@ -14,7 +14,6 @@ namespace FLY.Thick.Blowing.UI.UiModule
     {
         ScanGraphCircularVm viewModel;
         ScanGraphCircularParam graphparam;
-        ParamDictionary paramDictionary;
         public ScanGraphCircular()
         {
             InitializeComponent();
@@ -24,7 +23,6 @@ namespace FLY.Thick.Blowing.UI.UiModule
         public void Init(int id, IUnityContainer container,
             IBulkDbService bulkDbService, IBlowingService blowingService, IBlowingFixProfileService blowingProfileService, ParamDictionary paramDictionary)
         {
-            this.paramDictionary = paramDictionary;
             //查找参数
             graphparam = ScanGraphCircularParams.Current.Items.Find(p => p.ID == id);
             if (graphparam == null)
@@ -49,7 +47,7 @@ namespace FLY.Thick.Blowing.UI.UiModule
                 return;
 
             WdScanGraphCircularConfig window = new WdScanGraphCircularConfig();
-            window.Init(graphparam, paramDictionary);
+            window.Init(graphparam, viewModel);
             window.Owner = FLY.ControlLibrary.COMMON.GetWindow(this);
             window.ShowDialog();
         }
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircularVm.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircularVm.cs
index 27eaf60a2394df52e96f7cd553e315997f84e61e..fc3125f6e17ff7d839ebe734f850507d86934807 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircularVm.cs
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircularVm.cs
@@ -3,6 +3,7 @@ using FLY.Thick.Blowing.Common;
 using FLY.Thick.Blowing.IService;
 using FLY.Thick.Blowing.Server.Model;
 using FObjBase;
+using GalaSoft.MvvmLight.Command;
 using Misc;
 using System;
 using System.Collections.Generic;
@@ -13,12 +14,19 @@ using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using System.Windows.Data;
+using System.Windows.Threading;
 
 namespace FLY.Thick.Blowing.UI.UiModule
 {
     public class ScanGraphCircularVm : INotifyPropertyChanged
     {
         const int MARKNO_TEXTUP = 1;
+
+        /// <summary>
+        /// 自动切换为 DefaultNumber 倒计时 初始值
+        /// </summary>
+        const int AutoKeepTotalSec = 60;
+
         public event PropertyChangedEventHandler PropertyChanged;
 
         #region 界面统计值
@@ -44,13 +52,16 @@ namespace FLY.Thick.Blowing.UI.UiModule
         /// <summary>
         /// 混合数
         /// </summary>
-        public int Mix { get; private set; } = 2;
+        public int Mix { get; protected set; } = 1;
 
         /// <summary>
         /// 测量时间
         /// </summary>
         public DateTime Time { get; private set; }
-
+        /// <summary>
+        /// 测量结束时间
+        /// </summary>
+        public DateTime EndTime { get; private set; }
         /// <summary>
         /// 旋转方向 是反向
         /// </summary>
@@ -68,21 +79,51 @@ namespace FLY.Thick.Blowing.UI.UiModule
         public long Id { get; private set; } = 1231221;
         public int OrgBoltNo { get; private set; } = -100;
 
+        /// <summary>
+        /// 只要 Number被改变,且不为0, AutoKeepNewestTimeRemaining就会被设为10s.
+        /// 当 AutoKeepNewestTimeRemaining = 0, Number就会被设置为0
+        /// </summary>
+        public int AutoKeepNewestTimeRemaining { get; protected set; }
+
+        /// <summary>
+        /// Number == graphparam.Number
+        /// </summary>
+        public bool IsNewest { get; protected set; } = true;
+
+        /// <summary>
+        /// 锁上, Number 不会 自动变回 DefaultNumber,且 Number = Id
+        /// </summary>
+        public bool IsLocked { get; set; }
+
+        /// <summary>
+        /// 记录点, 与 graphparam.Number 分离
+        /// </summary>
+        public long Number { get; set; }
+        /// <summary>
+        /// 记录点 变化步进
+        /// </summary>
+        public int NumberStep { get; set; } = 1;
+
         #endregion
         public int XStep { get; set; } = 5;
 
-        ScanGraphCircularParam graphparam;
+        ObservableCollection<double> Values { get; } = new ObservableCollection<double>();
+        ObservableCollection<double> Values2 { get; } = new ObservableCollection<double>();
+
+        public RelayCommand AutoLockCmd { get; private set; }
+
+        protected ScanGraphCircularParam graphparam;
         IBulkDbService bulkDb;
-        Lc_ScanData scanData;
+        protected Lc_ScanData scanData;
         Db_Profile profile;
         IBlowingService blowingService;
-        BlowingFixProfileParam profileParam;
+        protected BlowingFixProfileParam profileParam;
+        protected DispatcherTimer timer;
+        protected PolarChart graph;
 
-        ObservableCollection<double> Values { get; } = new ObservableCollection<double>();
-        ObservableCollection<double> Values2 { get; } = new ObservableCollection<double>();
         public ScanGraphCircularVm()
         {
-
+            AutoLockCmd = new RelayCommand(ChangeAutoLock);
         }
 
 
@@ -99,7 +140,7 @@ namespace FLY.Thick.Blowing.UI.UiModule
             this.bulkDb = bulkDb;
             this.blowingService = blowingService;
             this.profileParam = profileParam;
-
+            this.graph = graph;
 
             graph.SetBinding(PolarChart.TolerancePercentProperty, new Binding(nameof(profileParam.TolerancePercent)) { Source = profileParam });
             graph.SetBinding(PolarChart.TargetProperty, new Binding(nameof(profileParam.Target)) { Source = profileParam });
@@ -130,8 +171,9 @@ namespace FLY.Thick.Blowing.UI.UiModule
 
             graph.Values = Values;
             graph.LineValues = Values2;
-            Misc.BindingOperations.SetBinding(graphparam, nameof(graphparam.Mix), this, nameof(Mix));
-            
+
+            init_autoKeep();
+
             Id = -1;
             UpdateId();
 
@@ -142,8 +184,62 @@ namespace FLY.Thick.Blowing.UI.UiModule
 
             UpdateTemp();
         }
+        void init_autoKeep()
+        {
+
+            ResetNumber();
+
+            timer = new DispatcherTimer();
+            timer.Interval = TimeSpan.FromSeconds(1);
+            timer.Tick += (s, e) =>
+            {
+                if (Number == graphparam.Number)
+                {
+                    timer.Stop();
+                    return;
+                }
+
+                if (IsLocked)
+                {
+                    return;
+                }
 
-        private void BulkDb_TempFrameChanged(object sender, EventArgs _e)
+                if (AutoKeepNewestTimeRemaining > 0)
+                    AutoKeepNewestTimeRemaining--;
+                if (AutoKeepNewestTimeRemaining <= 0)
+                {
+                    ResetNumber();
+                    timer.Stop();
+                    return;
+                }
+            };
+            this.graphparam.PropertyChanged += (s, e) =>
+            {
+                if (e.PropertyName == nameof(graphparam.Number))
+                {
+                    ResetNumber();
+                    timer.IsEnabled = false;
+                    IsNewest = true;
+                    AutoKeepNewestTimeRemaining = AutoKeepTotalSec;
+                }
+            };
+            this.PropertyChanged += (s, e) => {
+                if (e.PropertyName == nameof(IsLocked))
+                {
+                    if (Id >= 0)
+                    {
+                        Number = Id;
+                    }
+                }
+                else if (e.PropertyName == nameof(Number))
+                {
+                    timer.IsEnabled = Number != graphparam.Number;
+                    IsNewest = !timer.IsEnabled;
+                    AutoKeepNewestTimeRemaining = AutoKeepTotalSec;
+                }
+            };
+        }
+        protected void BulkDb_TempFrameChanged(object sender, EventArgs _e)
         {
             BulkDbTempFrameChangedEventArgs e = (BulkDbTempFrameChangedEventArgs)_e;
 
@@ -183,7 +279,11 @@ namespace FLY.Thick.Blowing.UI.UiModule
         private void ScanGraphCircularVm_PropertyChanged(object sender, PropertyChangedEventArgs e)
         {
             if (propertyname_updateMaxMinText.Contains(e.PropertyName))
-                UpdateMaxMinText();
+                UpdateMaxMinText_delay();
+            else if (e.PropertyName == nameof(Number))
+            {
+                UpdateId();
+            }
         }
 
         private void Graphparam_PropertyChanged(object sender, PropertyChangedEventArgs e)
@@ -192,10 +292,7 @@ namespace FLY.Thick.Blowing.UI.UiModule
             {
                 UpdateId();
             }
-            else if (e.PropertyName == nameof(graphparam.Number))
-            {
-                UpdateId();
-            }
+
         }
         private void BulkDb_PropertyChanged(object sender, PropertyChangedEventArgs e)
         {
@@ -224,29 +321,34 @@ namespace FLY.Thick.Blowing.UI.UiModule
         {
             Update4IdChanged();
         }
-        void UpdateMaxMinText()
+        void UpdateMaxMinText_delay()
         {
             PollModule.Current.Poll_JustOnce(() =>
             {
-                if (Average > 0)
-                {
-                    MaxText = $"+{((Max - Average) / Average) * 100.0:F1}%";
-                    MinText = $"-{((Average - Min) / Average) * 100.0:F1}%";
-                    Sigma2Text = $"{(Sigma2 / Average) * 100.0:F1}%";
-                }
-                else
-                {
-                    MaxText = $"{Max:F1}";
-                    MinText = $"{Min:F1}";
-                    Sigma2Text = $"{Sigma2:F1}";
-                }
+                UpdateMaxMinText();
             }, this, MARKNO_TEXTUP);
         }
-        void UpdateAverage()
+        protected void UpdateMaxMinText()
+        {
+            if (Average > 0)
+            {
+                MaxText = $"+{((Max - Average) / Average) * 100.0:F1}%";
+                MinText = $"-{((Average - Min) / Average) * 100.0:F1}%";
+                Sigma2Text = $"{(Sigma2 / Average) * 100.0:F1}%";
+            }
+            else
+            {
+                MaxText = $"{Max:F1}";
+                MinText = $"{Min:F1}";
+                Sigma2Text = $"{Sigma2:F1}";
+            }
+        }
+        protected void UpdateAverage()
         {
             if (this.scanData == null)
             {
                 Time = DateTime.MinValue;
+                EndTime = DateTime.MinValue;
                 Id = -1;
                 OrgBoltNo = -100;
                 return;
@@ -254,6 +356,7 @@ namespace FLY.Thick.Blowing.UI.UiModule
             else
             {
                 Time = this.scanData.Time;
+                EndTime = this.scanData.EndTime;
                 Id = this.scanData.ID;
                 OrgBoltNo = this.scanData.OrgBoltNo;
                 IsBackw = this.scanData.IsBackw;
@@ -280,22 +383,45 @@ namespace FLY.Thick.Blowing.UI.UiModule
             }
 
         }
-        void Update4IdChanged()
+
+        bool IsNeedToGetFrame()
         {
-            if (graphparam.Number > 0 
-                && bulkDb.LastScanDataId == Id 
-                && Mix == graphparam.Mix)
+            if (Mix != graphparam.Mix)
             {
-                //不需要更新!!!!!!!
-                return;
+                return true;
+            }
+
+            if (Number > 0)
+            {
+                //绝对位置模式
+                if (Number != Id)
+                    return true;
+                else
+                    return false;
             }
+            //相对位置模式
+
+            if (Number == Id - bulkDb.LastScanDataId)
+            {
+                //已经是需要查找的记录
+                return false;
+            }
+
+            return true;
+        }
+
+        void Update4IdChanged()
+        {
+            if (!IsNeedToGetFrame())
+                return;
 
             bulkDb.GetFrame(
-                new Pack_GetFrameRequest() { Id = graphparam.Number, Mix = graphparam.Mix },
+                new Pack_GetFrameRequest() { Id = Number, Mix = graphparam.Mix },
                 (object AsyncContext, object retData) =>
                 {
                     Pack_GetFrameReponse reponse = retData as Pack_GetFrameReponse;
 
+                    Mix = reponse.Request.Mix;
                     if (reponse.scanData != null)
                     {
                         this.scanData = reponse.scanData;
@@ -306,7 +432,7 @@ namespace FLY.Thick.Blowing.UI.UiModule
 
                 }, this);
         }
-        void Update4IdChanged2()
+        protected void Update4IdChanged2()
         {
             //清除全部数据
             Values.Clear();
@@ -321,8 +447,35 @@ namespace FLY.Thick.Blowing.UI.UiModule
             }
         }
 
+        public void PreView()
+        {
+            Number -= NumberStep;
+        }
+
+        public void NextView()
+        {
+            Number += NumberStep;
+        }
+
+        public void ChangeLock()
+        {
+            IsLocked = !IsLocked;
+        }
+
+        public void ResetNumber()
+        {
+            Number = graphparam.Number;
+        }
+        public void ChangeAutoLock()
+        {
+            ChangeLock();
+            if (!IsLocked)
+            {
+                ResetNumber();
+            }
+        }
 
-        void NotifyPropertyChanged(string propertyName)
+        protected void NotifyPropertyChanged(string propertyName)
         {
             PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
         }
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircularVmUt.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircularVmUt.cs
index 6d6d4fd63b2469a6bc55cc0ff4f526015b987470..8ef0102ae43e4b693394405b623ab9098085b0b0 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircularVmUt.cs
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/ScanGraphCircularVmUt.cs
@@ -15,101 +15,110 @@ using System.Windows.Data;
 
 namespace FLY.Thick.Blowing.UI.UiModule
 {
-    public class ScanGraphCircularVmUt : INotifyPropertyChanged
+    public class ScanGraphCircularVmUt : ScanGraphCircularVm
     {
-        public event PropertyChangedEventHandler PropertyChanged;
+        public ScanGraphCircularVmUt()
+        {
 
+            #region 数据
+            double target = 150;
+            double tolerance = target * 0.02;
+            double yrangepercent = 3;
+            int nbolts = 80;
+            double[] datas = new double[nbolts];
+            Random random = new Random();
+            for (int i = 0; i < nbolts; i++)
+            {
+                datas[i] = (Math.Sin(i * Math.PI / nbolts) * 3) * tolerance + target + (random.NextDouble() - 0.5) * 1 - 6;
+            }
 
-        #region 界面统计值
-        /// <summary>
-        /// 平均值
-        /// </summary>
-        public double Average { get; private set; } = double.NaN;
+            double[] datas2 = new double[nbolts];
+            for (int i = 0; i < nbolts; i++)
+            {
+                datas2[i] = (Math.Sin(i * Math.PI / nbolts) * 3) * tolerance + target + (random.NextDouble() - 0.5) * 1 - 6;
+            }
 
-        public double Sigma2 { get; private set; } = double.NaN;
-        /// <summary>
-        /// 最大值
-        /// </summary>
-        public double Max { get; private set; } = double.NaN;
-        /// <summary>
-        /// 最小值
-        /// </summary>
-        public double Min { get; private set; } = double.NaN;
+            profileParam = new Common.BlowingFixProfileParam()
+            {
+                Target = target,
+                TolerancePercent = 0.02,
+                K = 1,
+                PName = "abc",
+                OrderNo = "12313121",
+                Number = "2"
+            };
+
+            graphparam = new ScanGraphCircularParam()
+            {
+                IsPercent = true,
+                IsAutoTarget = true,
+                YRangePercent = yrangepercent,
+                Number = -1,
+                Mix = 2
+            };
 
-        public string Sigma2Text { get; private set; }
-        public string MaxText { get; private set; }
-        public string MinText { get; private set; }
 
-        /// <summary>
-        /// 混合数
-        /// </summary>
-        public int Mix { get; private set; } = 2;
+            scanData = new Server.Model.Lc_ScanData()
+            {
+                Time = DateTime.Now.AddSeconds(-30),
+                EndTime = DateTime.Now,
+                ID = 1234567,
+                K = 2,
+                Thicks = datas,
+                IsBackw = false,
+                FilmLength = 23.3,
+                FilmVelocity = 53.1,
+                OrgBoltNo = 41,
+                RAngle = 355,
+                RCnt = 6,
+                RPeriod = TimeSpan.FromMinutes(6.7)
+            };
+
+            BulkDbTempFrameChangedEventArgs e = new BulkDbTempFrameChangedEventArgs()
+            {
+                Time = DateTime.Now.AddSeconds(-25),
+                EndTime = DateTime.Now,
+                StartIndex = 0,
+                D = datas2
+            };
+            #endregion
 
-        /// <summary>
-        /// 测量时间
-        /// </summary>
-        public DateTime Time { get; private set; }
+            #region 界面数据
 
-        /// <summary>
-        /// 旋转方向 是反向
-        /// </summary>
-        public bool IsBackw { get; private set; }
 
-        /// <summary>
-        /// 旋转1周的时间
-        /// </summary>
-        public TimeSpan RPeriod { get; private set; }
+            Mix = graphparam.Mix;
+            XStep = 5;
 
+            BulkDb_TempFrameChanged(null, e);
 
-        /// <summary>
-        /// 数据库中的序号
-        /// </summary>
-        public long Id { get; private set; } = 1231221;
-        public int OrgBoltNo { get; private set; } = -100;
+            Update4IdChanged2();
 
-        #endregion
 
+            UpdateMaxMinText();
 
-        ObservableCollection<double> Values { get; }= new ObservableCollection<double>();
 
-        public ScanGraphCircularVmUt()
-        {
 
-            #region 数据
-            double target = 100;
-            double tolerancePercent = 0.02;
-            double yrangepercent = 3;
-            int nbolts = 80;
-            double[] datas = new double[nbolts];
-            Random random = new Random();
-            for (int i = 0; i < nbolts; i++)
-            {
-                datas[i] = (Math.Sin(i * Math.PI / nbolts) * 3) * (target*tolerancePercent) + target + (random.NextDouble() - 0.5) * 1 - 6;
-            }
+            //graph.SetBinding(PolarChart.TolerancePercentProperty, new Binding(nameof(profileParam.TolerancePercent)) { Source = profileParam });
+            //graph.SetBinding(PolarChart.TargetProperty, new Binding(nameof(profileParam.Target)) { Source = profileParam });
 
-            #endregion
 
-            #region 界面数据
-            Mix = 2;
-            Time = DateTime.Now;
-            Id = 312312;
-            OrgBoltNo = 31;
-            Values.Clear();
-            foreach(var data in datas)
-                Values.Add(data);
-            Average = datas.AverageNoNull();
-
-            IsBackw = false;
-            RPeriod = TimeSpan.FromSeconds(60 * 6.5);
-
-            double Max = datas.Max();
-            double Min = datas.Min();
-            double Sigma2 = datas.Sigma() * 2;
-
-            MaxText = $"+{((Max - Average) / Average) * 100.0:F1}%";
-            MinText = $"-{((Average - Min) / Average) * 100.0:F1}%";
-            Sigma2Text = $"{(Sigma2 / Average) * 100.0:F1}%";
+            //graph.SetBinding(PolarChart.YRangePercentProperty, new Binding(nameof(graphparam.YRangePercent)) { Source = graphparam });
+
+            //graph.SetBinding(PolarChart.IsPercentProperty, new Binding(nameof(graphparam.IsPercent)) { Source = graphparam });
+            //graph.SetBinding(PolarChart.IsAutoTargetProperty, new Binding(nameof(graphparam.IsAutoTarget)) { Source = graphparam });
+            //graph.SetBinding(PolarChart.HasAlianZoneProperty, new Binding(nameof(graphparam.HasAlianZone)) { Source = graphparam });
+            //graph.SetBinding(PolarChart.AlianZoneBoltNoOf3oClockProperty, new Binding(nameof(graphparam.AlianZoneBoltNoOf3oClock)) { Source = graphparam });
+            //graph.SetBinding(PolarChart.AlianZoneBoltCntProperty, new Binding(nameof(graphparam.AlianZoneBoltCnt)) { Source = graphparam });
+            //graph.SetBinding(PolarChart.AlianZoneIsCCWProperty, new Binding(nameof(graphparam.AlianZoneIsCCW)) { Source = graphparam });
+            //graph.SetBinding(PolarChart.AlianZoneIsShowXStepProperty, new Binding(nameof(graphparam.AlianZoneIsShowXStep)) { Source = graphparam });
+
 
+            //graph.BoltCnt = nbolts;
+            //graph.BPC = 1;
+            //graph.OrgBoltNo = scanData.OrgBoltNo;
+            //graph.MPIsRight = true;
+            //graph.IsForwCW = false;
+            //graph.XStep = XStep;
 
             #endregion
         }
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/WdScanGraphCircularConfig.xaml b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/WdScanGraphCircularConfig.xaml
index a33678ed5852198f50eaefb0ae3ccc763340dfa7..f51de709acf1c078de5b775678803d2ba6e3b8b8 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/WdScanGraphCircularConfig.xaml
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/WdScanGraphCircularConfig.xaml
@@ -7,118 +7,166 @@
                            xmlns:uiModule="clr-namespace:FLY.Thick.Blowing.UI.UiModule" xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks"
                            mc:Ignorable="d" 
 
-        SizeToContent="WidthAndHeight" >
+        SizeToContent="WidthAndHeight" MinHeight="450" MinWidth="450" >
     <Window.Resources>
         <ResourceDictionary>
             <ResourceDictionary.MergedDictionaries>
-                <ResourceDictionary Source="pack://application:,,,/FLY.ControlLibrary;component/Themes/Dictionary_MyStyle.xaml"/>
                 <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Blowing.UI;component/Themes/Styles.xaml"/>
             </ResourceDictionary.MergedDictionaries>
             <uiModule:ScanGraphCircularParam x:Key="ScanGraphCircularParam"/>
         </ResourceDictionary>
     </Window.Resources>
-
-    <Grid TextBlock.FontSize="24" TextBlock.FontStyle="Normal" Background="WhiteSmoke" >
-        <Grid x:Name="grid_viewModel" />
-        <StackPanel Margin="5,20" DataContext="{Binding GraphParam}" d:DataContext="{StaticResource ScanGraphCircularParam}">
-
-            <StackPanel>
-                <StackPanel Orientation="Horizontal">
-                    <StackPanel Margin="5">
-                        <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="混合数" />
+    <StackPanel Margin="{StaticResource ControlMargin}" >
+        <Grid Height="20" x:Name="grid_scanGraphVm"/>
+        <Grid Height="20" x:Name="grid_graphParam"/>
+        <TabControl >
+            <TabItem Header="浏览">
+                <StackPanel>
+                    <StackPanel Orientation="Horizontal" DataContext="{Binding ElementName=grid_scanGraphVm,Path=DataContext}">
                         <StackPanel Orientation="Horizontal">
-                            <TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding Mix}" />
-                        </StackPanel>
-                    </StackPanel>
-                    <StackPanel Orientation="Horizontal">
-                        <StackPanel Margin="5">
-                            <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="记录点" />
-                            <StackPanel Orientation="Horizontal">
-                                <TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding Number}"  />
-                            </StackPanel>
-                        </StackPanel>
-                        <StackPanel Orientation="Horizontal" DataContext="{Binding ElementName=grid_viewModel,Path=DataContext}">
-                            <Button Style="{StaticResource ButtonStyle_largeIcon}" Command="{Binding PreCmd}">
-                                <Grid>
-                                    <Ellipse Fill="White" Margin="2"/>
-                                    <iconPacks:PackIconMaterial Kind="ArrowLeftBoldCircle" />
-                                </Grid>
+                            <Button Style="{StaticResource Styles.Button.Icon}" Click="btnLockClick" >
+                                <iconPacks:PackIconMaterial >
+                                    <iconPacks:PackIconMaterial.Style>
+                                        <Style TargetType="iconPacks:PackIconMaterial" BasedOn="{StaticResource Styles.Icon.Base}">
+                                            <Setter Property="Kind" Value="Lock"/>
+                                            <Style.Triggers>
+                                                <DataTrigger Binding="{Binding IsLocked}" Value="False">
+                                                    <Setter Property="Foreground" Value="Gray"/>
+                                                    <Setter Property="Kind" Value="LockOff"/>
+                                                </DataTrigger>
+                                            </Style.Triggers>
+                                        </Style>
+                                    </iconPacks:PackIconMaterial.Style>
+                                </iconPacks:PackIconMaterial>
                             </Button>
-                            <Button Style="{StaticResource ButtonStyle_largeIcon}" Command="{Binding NextCmd}">
-                                <Grid>
-                                    <Ellipse Fill="White" Margin="2"/>
-                                    <iconPacks:PackIconMaterial Kind="ArrowRightBoldCircle" />
+                            <StackPanel Margin="{StaticResource ControlMargin}">
+                                <Grid HorizontalAlignment="Left">
+                                    <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="记录点" />
+                                    <!--当不是最新, 弹出 自动按[最新] 倒计时-->
+                                    <Button Style="{StaticResource Styles.Button.Empty}" Click="btnResetNumberClick" 
+                                            VerticalAlignment="Bottom" HorizontalAlignment="Right" Margin="0,0,-10,-10" 
+                                            Visibility="{Binding IsNewest, Converter={StaticResource visbilityconv}, ConverterParameter=HiddenWhenTrue}">
+                                        <Grid Width="20" Height="20" >
+                                            <Ellipse  Fill="{StaticResource Brushes.Highlight}" />
+                                            <TextBlock Text="{Binding AutoKeepNewestTimeRemaining}" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White"/>
+                                        </Grid>
+                                    </Button>
                                 </Grid>
+                                <StackPanel Orientation="Horizontal">
+                                    <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding Number}"  />
+                                    <TextBlock Style="{StaticResource Styles.Text.FieldContent.Separator}"/>
+                                    <Button Style="{StaticResource Styles.Button.Empty}" Click="btnResetNumberClick">
+                                        <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" DataContext="{Binding ElementName=grid_graphParam,Path=DataContext}">
+                                        默认值:<Run Text="{Binding Number}"/>
+                                        </TextBlock>
+                                    </Button>
+                                </StackPanel>
+                            </StackPanel>
+                            <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Click="btnPreClick">
+                                <iconPacks:PackIconMaterial Kind="ArrowLeft" />
                             </Button>
+                            <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Click="btnNextClick">
+                                <iconPacks:PackIconMaterial Kind="ArrowRight" />
+                            </Button>
+                            <StackPanel Margin="{StaticResource ControlMargin}" >
+                                <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="步进" />
+                                <StackPanel Orientation="Horizontal">
+                                    <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding NumberStep}"  />
+                                </StackPanel>
+                            </StackPanel>
                         </StackPanel>
-
                     </StackPanel>
+
                 </StackPanel>
-                <StackPanel Orientation="Horizontal">
-                    <StackPanel Margin="{StaticResource ControlMargin}">
-                        <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="Y轴倍数" />
-                        <StackPanel Orientation="Horizontal">
-                            <TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding YRangePercent}" />
-                        </StackPanel>
-                    </StackPanel>
-                    <StackPanel Margin="{StaticResource ControlMargin}" DataContext="{Binding ElementName=grid_viewModel,Path=DataContext}">
-                        <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="Xè½´é—´éš”" />
-                        <StackPanel Orientation="Horizontal">
-                            <TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding XStep}" />
+            </TabItem>
+            <TabItem Header="视图">
+                <StackPanel>
+                    <StackPanel Orientation="Horizontal">
+                        <StackPanel Margin="{StaticResource ControlMargin}" >
+                            <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="默认记录点" />
+                            <StackPanel Orientation="Horizontal">
+                                <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding Number}"  />
+                            </StackPanel>
                         </StackPanel>
                     </StackPanel>
-                    <StackPanel Margin="{StaticResource ControlMargin}">
-                        <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="%显示" />
-                        <StackPanel Orientation="Horizontal">
-                            <ToggleButton Style="{StaticResource ToggleButtonStyle1}" IsChecked="{Binding IsPercent}"/>
+                    <StackPanel Orientation="Horizontal" >
+                        <StackPanel Margin="{StaticResource ControlMargin}">
+                            <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="混合数" />
+                            <StackPanel Orientation="Horizontal">
+                                <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding Mix}"  />
+                            </StackPanel>
                         </StackPanel>
-                    </StackPanel>
-                    <StackPanel Margin="{StaticResource ControlMargin}">
-                        <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="自动目标值" />
-                        <StackPanel Orientation="Horizontal">
-                            <ToggleButton Style="{StaticResource ToggleButtonStyle1}" IsChecked="{Binding IsAutoTarget}"/>
+                        <StackPanel Margin="{StaticResource ControlMargin}">
+                            <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="Y轴倍数" />
+                            <StackPanel Orientation="Horizontal">
+                                <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding YRangePercent}" />
+                            </StackPanel>
                         </StackPanel>
-                    </StackPanel>
-                </StackPanel>
-                <StackPanel Orientation="Horizontal">
-                    <StackPanel Margin="{StaticResource ControlMargin}">
-                        <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="额外分区" />
-                        <StackPanel Orientation="Horizontal">
-                            <ToggleButton Style="{StaticResource ToggleButtonStyle1}" IsChecked="{Binding HasAlianZone}"/>
+                        <StackPanel Margin="{StaticResource ControlMargin}" DataContext="{Binding ElementName=grid_scanGraphVm,Path=DataContext}">
+                            <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="Xè½´é—´éš”" />
+                            <StackPanel Orientation="Horizontal">
+                                <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding XStep}" />
+                            </StackPanel>
                         </StackPanel>
                     </StackPanel>
-                </StackPanel>
-                <GroupBox Header="额外分区" Visibility="{Binding HasAlianZone,Converter={StaticResource visbilityconv}}">
                     <StackPanel Orientation="Horizontal">
                         <StackPanel Margin="{StaticResource ControlMargin}">
-                            <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="3点对应" />
+                            <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="%显示" />
                             <StackPanel Orientation="Horizontal">
-                                <TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding AlianZoneBoltNoOf3oClock}" />
+                                <ToggleButton Style="{StaticResource Styles.ToggleButton.YESNO}" IsChecked="{Binding IsPercent}"/>
                             </StackPanel>
                         </StackPanel>
-                        <StackPanel Margin="{StaticResource ControlMargin}">
-                            <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="分区数" />
+                        <StackPanel Margin="{StaticResource ControlMargin}" >
+                            <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="自动目标值" />
                             <StackPanel Orientation="Horizontal">
-                                <TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding AlianZoneBoltCnt}" />
+                                <ToggleButton Style="{StaticResource Styles.ToggleButton.YESNO}" IsChecked="{Binding IsAutoTarget}"/>
                             </StackPanel>
                         </StackPanel>
+                    </StackPanel>
+                    <StackPanel Orientation="Horizontal">
                         <StackPanel Margin="{StaticResource ControlMargin}">
-                            <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="逆时针" />
+                            <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="额外分区" />
                             <StackPanel Orientation="Horizontal">
-                                <ToggleButton Style="{StaticResource ToggleButtonStyle1}" IsChecked="{Binding AlianZoneIsCCW}"/>
+                                <ToggleButton Style="{StaticResource Styles.ToggleButton.YESNO}" IsChecked="{Binding HasAlianZone}"/>
                             </StackPanel>
                         </StackPanel>
-                        <StackPanel Margin="{StaticResource ControlMargin}">
-                            <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="X轴线为额外分区" />
-                            <StackPanel Orientation="Horizontal">
-                                <ToggleButton Style="{StaticResource ToggleButtonStyle1}" IsChecked="{Binding AlianZoneIsShowXStep}"/>
+                    </StackPanel>
+                    <GroupBox Visibility="{Binding HasAlianZone,Converter={StaticResource visbilityconv}}">
+                        <GroupBox.Header>
+                            <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Comment}" Text="额外分区"/>
+                        </GroupBox.Header>
+                        <StackPanel Orientation="Horizontal">
+                            <StackPanel Margin="{StaticResource ControlMargin}">
+                                <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="3点对应" />
+                                <StackPanel Orientation="Horizontal">
+                                    <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding AlianZoneBoltNoOf3oClock}" />
+                                </StackPanel>
+                            </StackPanel>
+                            <StackPanel Margin="{StaticResource ControlMargin}">
+                                <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="分区数" />
+                                <StackPanel Orientation="Horizontal">
+                                    <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding AlianZoneBoltCnt}" />
+                                </StackPanel>
+                            </StackPanel>
+                            <StackPanel Margin="{StaticResource ControlMargin}">
+                                <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="逆时针" />
+                                <StackPanel Orientation="Horizontal">
+                                    <ToggleButton Style="{StaticResource Styles.ToggleButton.YESNO}" IsChecked="{Binding AlianZoneIsCCW}"/>
+                                </StackPanel>
+                            </StackPanel>
+                            <StackPanel Margin="{StaticResource ControlMargin}">
+                                <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="X轴线为额外分区" />
+                                <StackPanel Orientation="Horizontal">
+                                    <ToggleButton Style="{StaticResource Styles.ToggleButton.YESNO}" IsChecked="{Binding AlianZoneIsShowXStep}"/>
+                                </StackPanel>
                             </StackPanel>
                         </StackPanel>
-                    </StackPanel>
-                </GroupBox>
-            </StackPanel>
-            <Button Style="{StaticResource ButtonStyle_apply}" Command="{Binding ApplyCmd}" DataContext="{Binding ElementName=grid_viewModel,Path=DataContext}"/>
-        </StackPanel>
-    </Grid>
+                    </GroupBox>
+                    <Button Style="{StaticResource Styles.Button.Apply}" Click="btnOkClick"/>
+                </StackPanel>
+            </TabItem>
+        </TabControl>
+    </StackPanel>
+
 
     </flyctrllib:WindowBigClose>
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/WdScanGraphCircularConfig.xaml.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/WdScanGraphCircularConfig.xaml.cs
index 3471b4fa1a260b2ccff6e830f3382abb7f23ecc9..0e3fde32ee7dc51f5fbc5a84244c9d53a73d9f78 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/WdScanGraphCircularConfig.xaml.cs
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/ScanGraphCircular/WdScanGraphCircularConfig.xaml.cs
@@ -1,6 +1,7 @@
 using GalaSoft.MvvmLight.Command;
 using Misc;
 using System.ComponentModel;
+using System.Windows;
 
 namespace FLY.Thick.Blowing.UI.UiModule
 {
@@ -9,7 +10,8 @@ namespace FLY.Thick.Blowing.UI.UiModule
     /// </summary>
     public partial class WdScanGraphCircularConfig : FLY.ControlLibrary.WindowBigClose
     {
-        WdScanGraphCircularConfigVm viewModel;
+        ScanGraphCircularParam graphparam;
+        ScanGraphCircularVm scanGraphVm;
 
         public WdScanGraphCircularConfig()
         {
@@ -17,60 +19,38 @@ namespace FLY.Thick.Blowing.UI.UiModule
 
 
         }
-        public void Init(ScanGraphCircularParam graphparam, ParamDictionary paramDictionary)
+        public void Init(ScanGraphCircularParam graphparam, ScanGraphCircularVm scanGraphVm)
         {
-            viewModel = new WdScanGraphCircularConfigVm();
-            viewModel.Init(graphparam, paramDictionary);
-            this.DataContext = viewModel;
-        }
-    }
-
-    public class WdScanGraphCircularConfigVm : INotifyPropertyChanged
-    {
-        public event PropertyChangedEventHandler PropertyChanged;
-
-        public ScanGraphCircularParam GraphParam { get; private set; }
-
-
-        #region CMD
-        public RelayCommand PreCmd { get; private set; }
-        public RelayCommand NextCmd { get; private set; }
-        public RelayCommand ApplyCmd { get; private set; }
-        #endregion
+            this.scanGraphVm = scanGraphVm;
+            this.graphparam = graphparam;
 
+            this.grid_scanGraphVm.DataContext = scanGraphVm;
+            this.DataContext = graphparam;
+        }
 
-        public int XStep { get; set; } = 5;
-
-        public WdScanGraphCircularConfigVm()
+        private void btnPreClick(object sender, RoutedEventArgs e)
         {
-            PreCmd = new RelayCommand(Pre);
-            NextCmd = new RelayCommand(Next);
-            ApplyCmd = new RelayCommand(Apply);
+            scanGraphVm.PreView();
         }
 
-
-
-        public void Init(ScanGraphCircularParam graphparam, ParamDictionary paramDictionary)
+        private void btnNextClick(object sender, RoutedEventArgs e)
         {
-            GraphParam = graphparam;
-            paramDictionary.SetBinding(this, nameof(XStep), 5);
+            scanGraphVm.NextView();
         }
 
-        private void Next()
+        private void btnOkClick(object sender, RoutedEventArgs e)
         {
-            GraphParam.Number--;
+            ScanGraphCircularParams.Current.Save();
         }
 
-        private void Pre()
+        private void btnLockClick(object sender, RoutedEventArgs e)
         {
-            GraphParam.Number++;
+            scanGraphVm.ChangeLock();
         }
 
-        private void Apply()
+        private void btnResetNumberClick(object sender, RoutedEventArgs e)
         {
-
-            //比较,再应用
-            ScanGraphCircularParams.Current.Save();
+            scanGraphVm.ResetNumber();
         }
 
     }
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraph.xaml b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraph.xaml
new file mode 100644
index 0000000000000000000000000000000000000000..d890155fe8097396ef1c03dee3ab89917e1818bd
--- /dev/null
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraph.xaml
@@ -0,0 +1,195 @@
+<UserControl x:Class="FLY.Thick.Blowing.UI.UiModule.TrendGraph"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:FLY.Thick.Blowing.UI.UiModule"
+             xmlns:lvc="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Wpf"
+             xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" 
+             xmlns:lvc1="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Feng.Wpf"
+             mc:Ignorable="d" 
+             d:DesignHeight="300" d:DesignWidth="800" >
+    <UserControl.Resources>
+        <ResourceDictionary>
+            <ResourceDictionary.MergedDictionaries>
+                <ResourceDictionary Source="pack://application:,,,/FLY.ControlLibrary;component/Converter/Dictionary_MyConv.xaml"/>
+                <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Blowing.UI;component/Themes/Styles.xaml"/>
+                <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Blowing.UI;component/Themes/Colors.xaml"/>
+            </ResourceDictionary.MergedDictionaries>
+
+            <local:TrendGraphVmUt x:Key="viewmodel"/>
+        </ResourceDictionary>
+    </UserControl.Resources>
+    <Border Style="{StaticResource BorderStyle_module}" >
+        <Grid d:DataContext="{StaticResource viewmodel}">
+            <Grid.RowDefinitions>
+                <RowDefinition Height="auto"/>
+                <RowDefinition Height="100*"/>
+                <RowDefinition Height="70*"/>
+            </Grid.RowDefinitions>
+            <Grid.ColumnDefinitions>
+                <ColumnDefinition Width="auto"/>
+                <ColumnDefinition Width="400*"/>
+                <ColumnDefinition Width="350*"/>
+            </Grid.ColumnDefinitions>
+            <lvc:CartesianChart Grid.Row="1" Grid.ColumnSpan="3" 
+                                Hoverable="False" DisableAnimations="True" DataTooltip="{x:Null}" Margin="5,-5,2,2">
+                <lvc:CartesianChart.Resources>
+                    <Style TargetType="lvc1:Column2Series">
+                        <Setter Property="PointGeometry" Value="{x:Null}"/>
+                        <Setter Property="StrokeThickness" Value="0" />
+                    </Style>
+                </lvc:CartesianChart.Resources>
+                <lvc:CartesianChart.Series>
+                    <lvc1:Column2Series 
+                        Values="{Binding Values}"
+                        Configuration="{Binding MapperPositive}"/>
+                    <lvc1:Column2Series  
+                        Values="{Binding Values}"
+                        Configuration="{Binding MapperNegative}"/>
+                </lvc:CartesianChart.Series>
+                <lvc:CartesianChart.AxisX>
+                    <lvc:Axis Foreground="Black" 
+                              LabelFormatter="{Binding XFormatter}" 
+                              MinValue="0" MaxValue="{Binding XMax}"
+                              >
+                        <lvc:Axis.Separator>
+                            <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" Step ="10"/>
+                        </lvc:Axis.Separator>
+                    </lvc:Axis>
+                </lvc:CartesianChart.AxisX>
+                <lvc:CartesianChart.AxisY>
+                    <lvc:Axis LabelFormatter="{Binding YFormatter}"  Foreground="Transparent" 
+                              MinValue="{Binding YMin}" MaxValue="{Binding YMax}" FontFamily="Courier New" >
+                       
+                        <lvc:Axis.Sections>
+                            <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding YMax}" Stroke="{StaticResource Brushes.ChartAxisLabel3}"/>
+                            <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding YMin}" Stroke="{StaticResource Brushes.ChartAxisLabel3}"/>
+                            <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding Tolerance2YMax}" Stroke="{StaticResource Brushes.ChartAxisLabel2}"/>
+                            <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding Tolerance2YMin}" Stroke="{StaticResource Brushes.ChartAxisLabel2}"/>
+                            <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding ToleranceYMax}" Stroke="{StaticResource Brushes.ChartAxisLabel1}"/>
+                            <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding ToleranceYMin}" Stroke="{StaticResource Brushes.ChartAxisLabel1}"/>
+                            <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="0" Stroke="{StaticResource Brushes.ChartAxisLabel0}" />
+                        </lvc:Axis.Sections>
+                        <lvc:Axis.Separator>
+                            <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" />
+                        </lvc:Axis.Separator>
+                    </lvc:Axis>
+                </lvc:CartesianChart.AxisY>
+            </lvc:CartesianChart>
+            <lvc:CartesianChart Grid.Row="2" Grid.ColumnSpan="3" 
+                                Hoverable="False" DisableAnimations="True" DataTooltip="{x:Null}" Margin="5,-5,2,2">
+                <lvc:CartesianChart.Resources>
+                    <Style TargetType="lvc:LineSeries">
+                        <Setter Property="PointGeometry" Value="{x:Null}"/>
+                        <Setter Property="StrokeThickness" Value="3" />
+                        <Setter Property="Fill" Value="{StaticResource Brushes.ChartArea4}"/>
+                        <Setter Property="Stroke" Value="{StaticResource Brushes.ChartArea0}"/>
+                    </Style>
+                </lvc:CartesianChart.Resources>
+                <lvc:CartesianChart.Series>
+                    <lvc:LineSeries 
+                        Values="{Binding Values}"
+                        Configuration="{Binding MapperValue}"/>
+                </lvc:CartesianChart.Series>
+                <lvc:CartesianChart.AxisX>
+                    <lvc:Axis Foreground="{StaticResource Brushes.ChartAxisLabel}" 
+                              LabelFormatter="{Binding XFormatter}" 
+                              MinValue="0" MaxValue="{Binding XMax}"
+                              >
+                        <lvc:Axis.Separator>
+                            <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" Step ="10"/>
+                        </lvc:Axis.Separator>
+                    </lvc:Axis>
+                </lvc:CartesianChart.AxisX>
+                <lvc:CartesianChart.AxisY>
+                    <lvc:Axis LabelFormatter="{Binding YFormatter2}"  Foreground="{StaticResource Brushes.ChartAxisLabel}" MinRange="1" 
+                              FontFamily="Courier New" >
+                        <lvc:Axis.Separator>
+                            <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" />
+                        </lvc:Axis.Separator>
+                    </lvc:Axis>
+                </lvc:CartesianChart.AxisY>
+            </lvc:CartesianChart>
+            <Button Style="{StaticResource ButtonStyle_icon}" Margin="48,0,0,-20"
+                        Click="Button_info_click" >
+                <Grid Style="{StaticResource GridStyle_ButtonShadow}" >
+                    <TextBlock  Padding="10,5" VerticalAlignment="Top"
+                                    FontSize="24" Foreground="White" Background="{StaticResource Brushes.Activity}" 
+                                    Text="趋势图" />
+                </Grid>
+            </Button>
+            <StackPanel Grid.Column="1" Grid.RowSpan="2" Panel.ZIndex="2" VerticalAlignment="Top" HorizontalAlignment="Left" 
+                        Margin="{StaticResource ControlMargin}">
+                <Viewbox MaxHeight="{StaticResource FontSize.Value}" HorizontalAlignment="Left" Margin="2">
+                    <StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" >
+                        <TextBlock Style="{StaticResource ValueStyle}" >
+                                <Run Text="{Binding BeginTime,Mode=OneWay,StringFormat={}{0:MM-dd HH:mm}}"/>
+                                至
+                                <Run Text="{Binding EndTime,Mode=OneWay,StringFormat={}{0:MM-dd HH:mm}}"/>
+                        </TextBlock>
+                    </StackPanel>
+                </Viewbox>
+                <Viewbox MaxHeight="{StaticResource FontSize.Value}" HorizontalAlignment="Left" Margin="2">
+                    <StackPanel Orientation="Horizontal" Margin="{StaticResource Margin.Text}"
+                                Background="{StaticResource SemiTransparentGreyBrush2}">
+                        <TextBlock Style="{StaticResource TitleStyle}" Text="ID:" />
+                        <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Id}"/>
+                    </StackPanel>
+                </Viewbox>
+            </StackPanel>
+            <Grid Grid.Column="2" Grid.RowSpan="2" Panel.ZIndex="1" 
+                  Margin="10,0" VerticalAlignment="Top" HorizontalAlignment="Right"
+                  Background="{StaticResource SemiTransparentGreyBrush}" >
+                <Viewbox MaxHeight="50">
+                    <StackPanel Margin="5">
+                        <StackPanel.Resources>
+                            <Style TargetType="Viewbox">
+                                <Setter Property="Height" Value="25"/>
+                                <Setter Property="Width" Value="120"/>
+                                <Setter Property="HorizontalAlignment" Value="Left"/>
+                                <Setter Property="VerticalAlignment" Value="Top"/>
+                            </Style>
+                        </StackPanel.Resources>
+                        <StackPanel Orientation="Horizontal">
+                            <Viewbox >
+                                <StackPanel Orientation="Horizontal">
+                                    <TextBlock Style="{StaticResource TitleStyle}" 
+                                           Foreground="{StaticResource  WhiteBrush}"
+                                           Background="{StaticResource  TextBrush}"
+                                           Opacity="0.8"
+                                           Text="平均: "
+                                           />
+                                    <TextBlock Style="{StaticResource ValueStyle}" 
+                                           Foreground="{StaticResource  WhiteBrush}"
+                                           Background="{StaticResource  TextBrush}"
+                                           Text="{Binding Average,Mode=OneWay,StringFormat={}{0:P1}}"
+                                           >
+                                    </TextBlock>
+                                </StackPanel>
+                            </Viewbox>
+                        </StackPanel>
+                        <StackPanel Orientation="Horizontal">
+                            <Viewbox >
+                                <StackPanel Orientation="Horizontal">
+                                    <TextBlock Style="{StaticResource TitleStyle}" Text="最大: "/>
+                                    <TextBlock Style="{StaticResource ValueStyle}" 
+                                               Text="{Binding Max,Mode=OneWay,StringFormat={}{0:P1}}"/>
+                                </StackPanel>
+                            </Viewbox>
+                            <Viewbox >
+                                <StackPanel Orientation="Horizontal" >
+                                    <TextBlock Style="{StaticResource TitleStyle}" 
+                                               Text="最小: " />
+                                    <TextBlock Style="{StaticResource ValueStyle}" 
+                                               Text="{Binding Min,Mode=OneWay,StringFormat={}{0:P1}}"/>
+                                </StackPanel>
+                            </Viewbox>
+                        </StackPanel>
+
+                    </StackPanel>
+                </Viewbox>
+            </Grid>
+        </Grid>
+    </Border>
+</UserControl>
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraph.xaml.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraph.xaml.cs
new file mode 100644
index 0000000000000000000000000000000000000000..f3f1092f22cd783f455b5fbfe5d50afdbd1a4d0a
--- /dev/null
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraph.xaml.cs
@@ -0,0 +1,51 @@
+using FLY.Thick.Base.UI;
+using FLY.Thick.Blowing.IService;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Forms;
+using Unity;
+
+namespace FLY.Thick.Blowing.UI.UiModule
+{
+    /// <summary>
+    /// TrendGraph2.xaml 的交互逻辑
+    /// </summary>
+    public partial class TrendGraph : System.Windows.Controls.UserControl
+    {
+        TrendGraphVm viewModel;
+        TrendGraphItemParam graphparam;
+        public TrendGraph()
+        {
+            InitializeComponent();
+        }
+
+        [InjectionMethod]
+        public void Init(int id,
+            IBulkDbService bulkDb,
+            IBlowingFixProfileService profileService)
+        {
+
+            graphparam = TrendGraphParams.Current.Items.Find(p => p.ID == id);
+            if (graphparam == null)
+            {
+                graphparam = new TrendGraphItemParam() { ID = id };
+                TrendGraphParams.Current.Items.Add(graphparam);
+                TrendGraphParams.Current.Save();
+            }
+            viewModel = new TrendGraphVm();
+            viewModel.Init(graphparam, bulkDb, profileService.Param);
+            this.DataContext = viewModel;
+        }
+
+        private void Button_info_click(object sender, RoutedEventArgs e)
+        {
+            if (!WdPassword.Authorize("GraphConfig"))
+                return;
+
+            TrendGraphConfig window = new TrendGraphConfig();
+            window.Init(graphparam,viewModel);
+            window.Owner = FLY.ControlLibrary.COMMON.GetWindow(this);
+            window.ShowDialog();
+        }
+    }
+}
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphConfig2.xaml b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphConfig.xaml
similarity index 57%
rename from Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphConfig2.xaml
rename to Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphConfig.xaml
index a94233ad46c5efbe5201ed6da971b02c749a4cd4..b219728df1f4f643553ead011090d6b5e9c3161c 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphConfig2.xaml
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphConfig.xaml
@@ -1,12 +1,13 @@
-<flyctrllib:WindowBigClose  x:Class="FLY.Thick.Blowing.UI.UiModule.TrendGraphConfig2"
+<flyctrllib:WindowBigClose  x:Class="FLY.Thick.Blowing.UI.UiModule.TrendGraphConfig"
         xmlns:flyctrllib="clr-namespace:FLY.ControlLibrary;assembly=FLY.ControlLibrary"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         mc:Ignorable="d" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks"
-        Background="WhiteSmoke"
-        SizeToContent="WidthAndHeight"      
+                            xmlns:controls="http://metro.mahapps.com/winfx/xaml/controls"
+
+        SizeToContent="WidthAndHeight" MinHeight="450" MinWidth="450"     
         >
     <Window.Resources>
         <ResourceDictionary>
@@ -17,19 +18,41 @@
         </ResourceDictionary>
     </Window.Resources>
 
-    <Grid Width="400">
+    <Grid Background="White">
         <Grid x:Name="grid_trend"/>
-        <StackPanel Margin="5,20">
+        <StackPanel Margin="{StaticResource ControlMargin}">
+            <Grid Height="20"/>
+            <StackPanel Orientation="Horizontal" Margin="{StaticResource ControlMargin}" DataContext="{Binding DataContext,ElementName=grid_trend}">
+                <DatePicker 
+                            Width="200"
+                            Margin="{StaticResource ControlMargin}"
+                            Height="auto"
+                            HorizontalAlignment="Center"
+                            HorizontalContentAlignment="Stretch"
+                            controls:TextBoxHelper.UseFloatingWatermark="True"
+                            controls:TextBoxHelper.Watermark="开始日期"
+                            controls:TextBoxHelper.WatermarkAlignment="Right" 
+                                        SelectedDate="{Binding SearchTime}"/>
+                <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Click="btnSeachClick">
+                    <iconPacks:PackIconMaterial Kind="Magnify" />
+                </Button>
+            </StackPanel>
             <StackPanel Orientation="Horizontal" DataContext="{Binding DataContext,ElementName=grid_trend}">
 
-                <Button Style="{StaticResource ButtonStyle_RectangleIcon}" Click="btnPreClick">
-                    <Grid>
-                        <iconPacks:PackIconMaterial Kind="ArrowLeft" />
-                    </Grid>
+                <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Click="btnPreClick">
+                    <iconPacks:PackIconMaterial Kind="ArrowLeft" />
                 </Button>
+                <StackPanel VerticalAlignment="Center">
+                    <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" >
+                        <Run Text="最新ID:"/><Run Text="{Binding NewestId,Mode=OneWay}"/>
+                    </TextBlock>
+                    <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" >
+                        <Run Text="当前ID:"/><Run Text="{Binding Id,Mode=OneWay}"/>
+                    </TextBlock>
+                </StackPanel>
                 <Button Click="btnNextClick">
                     <Button.Style>
-                        <Style TargetType="Button" BasedOn="{StaticResource ButtonStyle_RectangleIcon}">
+                        <Style TargetType="Button" BasedOn="{StaticResource Styles.Button.Icon.Rectangle}">
                             <Style.Triggers>
                                 <DataTrigger Binding="{Binding IsNewest}" Value="True">
                                     <Setter Property="Foreground" Value="Gray"/>
@@ -38,13 +61,11 @@
                             </Style.Triggers>
                         </Style>
                     </Button.Style>
-                    <Grid>
-                        <iconPacks:PackIconMaterial Kind="ArrowRight" />
-                    </Grid>
+                    <iconPacks:PackIconMaterial Kind="ArrowRight" />
                 </Button>
                 <Button Click="btnNewestClick">
                     <Button.Style>
-                        <Style TargetType="Button" BasedOn="{StaticResource ButtonStyle_RectangleIcon}">
+                        <Style TargetType="Button" BasedOn="{StaticResource Styles.Button.Icon.Rectangle}">
                             <Style.Triggers>
                                 <DataTrigger Binding="{Binding IsNewest}" Value="True">
                                     <Setter Property="Foreground" Value="Gray"/>
@@ -71,31 +92,31 @@
                         </Grid>
                     </Grid>
                 </Button>
-                <TextBlock Style="{StaticResource TextBlockStyle_FieldContent}" Text="更新中" Visibility="{Binding IsLoading,Converter={StaticResource visbilityconv}}"/>
+                <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="更新中" Visibility="{Binding IsLoading,Converter={StaticResource visbilityconv}}"/>
             </StackPanel>
             <StackPanel Orientation="Horizontal" >
 
                 <StackPanel Margin="5">
-                    <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="混合数" />
+                    <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="混合数" />
                     <StackPanel Orientation="Horizontal">
-                        <TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding Mix}" />
+                        <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding Mix}" />
                     </StackPanel>
                 </StackPanel>
                 <StackPanel Margin="5">
-                    <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="Y轴倍数" />
+                    <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="Y轴倍数" />
                     <StackPanel Orientation="Horizontal">
-                        <TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding YRangePercent}" />
+                        <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding YRangePercent}" />
                     </StackPanel>
                 </StackPanel>
                 <StackPanel Margin="5">
-                    <TextBlock Style="{StaticResource TextBlockStyle_FieldHeaderEditable}" Text="é—´éš”" />
+                    <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="é—´éš”" />
                     <StackPanel Orientation="Horizontal">
-                        <TextBox Style="{StaticResource TextBoxStyle_FieldContent}" Text="{Binding Interval}"  />
+                        <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding Interval}"  />
                     </StackPanel>
                 </StackPanel>
             </StackPanel>
 
-            <Button Style="{StaticResource ButtonStyle_apply}" Click="btnOkClick"/>
+            <Button Style="{StaticResource Styles.Button.Apply}" Click="btnOkClick"/>
         </StackPanel>
     </Grid>
 
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphConfig2.xaml.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphConfig.xaml.cs
similarity index 61%
rename from Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphConfig2.xaml.cs
rename to Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphConfig.xaml.cs
index d3ee8662596fcab199ce1acdddf84f4cc60e51f2..197d97fd8290019d9453a09c5d5b2a4e0bb4e78e 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphConfig2.xaml.cs
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphConfig.xaml.cs
@@ -19,43 +19,49 @@ namespace FLY.Thick.Blowing.UI.UiModule
     /// <summary>
     /// Window_graphtrend.xaml 的交互逻辑
     /// </summary>
-    public partial class TrendGraphConfig2 : FLY.ControlLibrary.WindowBigClose    
+    public partial class TrendGraphConfig : FLY.ControlLibrary.WindowBigClose    
     {
-        TrendGraphItemParam2 graphparam;
-        TrendGraphVm2 trendGraphVm2;
-        public TrendGraphConfig2()
+        TrendGraphItemParam graphparam;
+        TrendGraphVm trendGraphVm;
+        public TrendGraphConfig()
         {
             InitializeComponent();
         }
 
-        public void Init(TrendGraphItemParam2 graphparam, TrendGraphVm2 trendGraphVm2)
+        public void Init(TrendGraphItemParam graphparam, TrendGraphVm trendGraphVm)
         {
             this.graphparam = graphparam;
-            this.trendGraphVm2 = trendGraphVm2;
+            this.trendGraphVm = trendGraphVm;
             this.DataContext = graphparam;
-            this.grid_trend.DataContext = trendGraphVm2;
+            this.grid_trend.DataContext = trendGraphVm;
 
         }
         private void btnPreClick(object sender, RoutedEventArgs e)
         {
-            trendGraphVm2.PreView();
+            trendGraphVm.PreView();
             
         }
 
         private void btnNextClick(object sender, RoutedEventArgs e)
         {
-            trendGraphVm2.NextView();
+            trendGraphVm.NextView();
         }
 
 
         private void btnOkClick(object sender, RoutedEventArgs e)
         {
-            TrendGraphParam2s.Current.Save();
+            TrendGraphParams.Current.Save();
         }
 
         private void btnNewestClick(object sender, RoutedEventArgs e)
         {
-            trendGraphVm2.ToNewest();
+            trendGraphVm.ToNewest();
         }
+
+        private void btnSeachClick(object sender, RoutedEventArgs e)
+        {
+            trendGraphVm.Search(trendGraphVm.SearchTime);
+        }
+
     }
 }
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphItemParam2.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphItemParam.cs
similarity index 96%
rename from Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphItemParam2.cs
rename to Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphItemParam.cs
index 982ed3ac13cbfd706403a9ce734592739033f0eb..8035cb8bdcc430e454aa6ca938f7f3bffac3cb1a 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphItemParam2.cs
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphItemParam.cs
@@ -10,7 +10,7 @@ namespace FLY.Thick.Blowing.UI.UiModule
     /// <summary>
     /// 纵向图的参数
     /// </summary>
-    public class TrendGraphItemParam2 : UIModuleParam
+    public class TrendGraphItemParam : UIModuleParam
     {
         private int interval = 1;
         /// <summary>
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphParam2s.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphParams.cs
similarity index 68%
rename from Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphParam2s.cs
rename to Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphParams.cs
index 74ff99e4cfb5b319ab9fceb4c4da8894b54e37f6..cf301d048009091d38f4de642e4978a64df22a2a 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphParam2s.cs
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphParams.cs
@@ -11,23 +11,23 @@ namespace FLY.Thick.Blowing.UI.UiModule
     /// <summary>
     /// 全部扫描图的参数
     /// </summary>
-    public class TrendGraphParam2s : UIModuleParams<TrendGraphItemParam2>
+    public class TrendGraphParams : UIModuleParams<TrendGraphItemParam>
     {
 
-        public TrendGraphParam2s()
+        public TrendGraphParams()
         {
-            string path = System.IO.Path.Combine(FlyLayout.BasePath, "trendgraph2.json");
+            string path = System.IO.Path.Combine(FlyLayout.BasePath, "trendgraph.json");
             FilePath = path;
         }
 
-        static TrendGraphParam2s current = null;
-        public static TrendGraphParam2s Current
+        static TrendGraphParams current = null;
+        public static TrendGraphParams Current
         {
             get
             {
                 if (current == null)
                 {
-                    current = new TrendGraphParam2s();
+                    current = new TrendGraphParams();
                     current.Load();
                 }
                 return current;
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphVm2.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphVm.cs
similarity index 82%
rename from Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphVm2.cs
rename to Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphVm.cs
index 0cacaa71bd21eb84aca840f9fecea5bcbea1ec18..d9c888b2c9f314e96992b1a9973fc46f681d23cb 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphVm2.cs
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphVm.cs
@@ -14,14 +14,21 @@ using System.Windows.Threading;
 
 namespace FLY.Thick.Blowing.UI.UiModule
 {
-    public class TrendGraphVm2 : ITrendGraphVm2
+    public class TrendGraphVm : ITrendGraphVm
     {
-        const int MARKNO_TEXTUP = 1;
         /// <summary>
         /// 自动切换为 最新视图模式 倒计时 初始值
         /// </summary>
         const int AutoKeepTotalSec = 60;
-        const int Len = 100;
+        protected const int Len = 100;
+        /// <summary>
+        /// Y轴%显示,最小的中值
+        /// </summary>
+        const int MIN_PERCENT_TARGET = 5;
+        /// <summary>
+        /// Y轴最小公差范围
+        /// </summary>
+        const double MIN_TOLERANCE = 0.01;
 
         public event PropertyChangedEventHandler PropertyChanged;
 
@@ -56,21 +63,31 @@ namespace FLY.Thick.Blowing.UI.UiModule
         /// <summary>
         /// 混合数
         /// </summary>
-        public int Mix { get; private set; } = 2;
+        public int Mix { get; protected set; } = 1;
 
         /// <summary>
         /// Values.First().Time
         /// </summary>
-        public DateTime BeginTime { get; private set; }
+        public DateTime BeginTime { get; protected set; }
         /// <summary>
         /// Values.Last().Time
         /// </summary>
-        public DateTime EndTime { get; private set; }
+        public DateTime EndTime { get; protected set; }
 
         /// <summary>
         /// Values.Last().Id
         /// </summary>
-        public long Id { get; private set; } = -1;
+        public long Id { get; protected set; } = -1;
+
+        /// <summary>
+        /// 最新的Id
+        /// </summary>
+        public long NewestId { get; protected set; } = -1;
+
+        /// <summary>
+        /// 查找时间
+        /// </summary>
+        public DateTime SearchTime { get; set; }
 
         #endregion
 
@@ -100,11 +117,11 @@ namespace FLY.Thick.Blowing.UI.UiModule
         public object MapperNegative { get; private set; }
         public object MapperValue { get; private set; }
 
-        TrendGraphItemParam2 graphparam;
+        protected TrendGraphItemParam graphparam;
         IBulkDbService bulkDb;
-        BlowingFixProfileParam profileParam;
+        protected BlowingFixProfileParam profileParam;
         DispatcherTimer timer;
-        public TrendGraphVm2()
+        public TrendGraphVm()
         {
             #region 与数据无关界面参数
 
@@ -183,8 +200,8 @@ namespace FLY.Thick.Blowing.UI.UiModule
 
             #endregion
         }
-        public void Init(
-            TrendGraphItemParam2 graphparam,
+        public virtual void Init(
+            TrendGraphItemParam graphparam,
             IBulkDbService bulkDb,
             BlowingFixProfileParam profileParam)
         {
@@ -208,6 +225,8 @@ namespace FLY.Thick.Blowing.UI.UiModule
             Id = -1;
             IsNewest = true;
 
+            Misc.BindingOperations.SetBinding(bulkDb, nameof(bulkDb.LastScanDataId), this, nameof(NewestId));
+
             ToNewest();
 
             bulkDb.PropertyChanged += BulkDb_PropertyChanged;
@@ -261,9 +280,13 @@ namespace FLY.Thick.Blowing.UI.UiModule
                 UpdateY();
             }
         }
-        void UpdateY()
+        protected void UpdateY()
         {
             double tolerance = this.profileParam.TolerancePercent;
+            if (tolerance < MIN_TOLERANCE)
+            {
+                tolerance = MIN_TOLERANCE;
+            }
 
             ToleranceYMax = tolerance;
             ToleranceYMin = -tolerance;
@@ -273,7 +296,7 @@ namespace FLY.Thick.Blowing.UI.UiModule
             YMax = tolerance * graphparam.YRangePercent;
             YMin = -tolerance * graphparam.YRangePercent;
         }
-        void UpdateX()
+        protected void UpdateX()
         {
             XMax = Len;
         }
@@ -296,9 +319,25 @@ namespace FLY.Thick.Blowing.UI.UiModule
                 }
             }
         }
-        void UpdateAverage()
+
+        double ToSigma2Percent(TrendValue v)
+        {
+            if (double.IsNaN(v.Value))
+            {
+                return double.NaN;
+            }
+            else if (v.Value < MIN_PERCENT_TARGET)
+            {
+                return double.NaN;
+            }
+            else
+            {
+                return 2 * v.Sigma / v.Value;
+            }
+        }
+        protected void UpdateAverage()
         {
-            var sigma2s = this.Values.Select(v => 2*v.Sigma / v.Value);
+            var sigma2s = this.Values.Select(v => ToSigma2Percent(v));
 
             var list = from v in sigma2s where !double.IsNaN(v) select v;
 
@@ -366,22 +405,50 @@ namespace FLY.Thick.Blowing.UI.UiModule
             {
                 //从尾向前排的!!!!
                 reponse.Values.Reverse();
+
+                bool isAdd = true;
                 if (Values.Count() > 0)
                 {
-                    if (reponse.Values.First().Time <= Values.Last().Time)
+
+                    if (reponse.Values.First().Time > Values.Last().Time)
+                    {
+                        //Values 的后面接
+                    }
+                    else if (reponse.Values.Last().Time < Values.First().Time)
+                    {
+                        //Values 的前面接
+                        isAdd = false;
+                    }
+                    else
                     {
                         //不能接上
                         Values.Clear();
                     }
                 }
-                Values.AddRange(reponse.Values);
-                //限制Values长度
-                int remove_cnt = Values.Count() - Len;
-                for (int i = 0; i < remove_cnt; i++)
-                    Values.RemoveAt(0);
+
+                if (isAdd)
+                {
+                    Values.AddRange(reponse.Values);
+
+                    //限制Values长度
+                    int remove_cnt = Values.Count() - Len;
+                    for (int i = 0; i < remove_cnt; i++)
+                        Values.RemoveAt(0);
+                }
+                else
+                {
+                    //Values 的前面接
+                    Values.InsertRange(0, reponse.Values);
+
+                    //限制Values长度
+                    int remove_cnt = Values.Count() - Len;
+                    for (int i = 0; i < remove_cnt; i++)
+                        Values.RemoveAt(Values.Count() - 1);
+                }
 
 
-                Id = reponse.ScanDataId;
+                Id = Values.Last().ScanDataID;
+                SearchTime = Values.Last().Time;
 
                 BeginTime = Values.First().Time;
                 EndTime = Values.Last().Time;
@@ -433,7 +500,7 @@ namespace FLY.Thick.Blowing.UI.UiModule
                 return (bulkDb as FObjBase.FObjServiceClient).IsConnected;
             }
         }
-        public void Seatch(DateTime lastTime)
+        public void Search(DateTime lastTime)
         {
             if (!IsConnected)
                 return;
@@ -487,7 +554,7 @@ namespace FLY.Thick.Blowing.UI.UiModule
         }
     }
 
-    public interface ITrendGraphVm2 : INotifyPropertyChanged
+    public interface ITrendGraphVm : INotifyPropertyChanged
     {
 
         #region 查询模式
@@ -523,7 +590,7 @@ namespace FLY.Thick.Blowing.UI.UiModule
         /// WHERE Time 小于 lastTime AND ID % graphparam.Interval == 0 ORDER BY ID DESC LIMIT graphparam.Len
         /// </summary>
         /// <param name="lastId"></param>
-        void Seatch(DateTime lastTime);
+        void Search(DateTime lastTime);
 
         /// <summary>
         /// 下一页
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphVmUt.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphVmUt.cs
new file mode 100644
index 0000000000000000000000000000000000000000..40410ee085a005347a62ba802f815f69070d897a
--- /dev/null
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/TrendGraphVmUt.cs
@@ -0,0 +1,72 @@
+using FLY.Thick.Blowing.Common;
+using FLY.Thick.Blowing.IService;
+using LiveCharts;
+using LiveCharts.Configurations;
+using Misc;
+using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Media;
+
+namespace FLY.Thick.Blowing.UI.UiModule
+{
+    public class TrendGraphVmUt : TrendGraphVm
+    {
+        public TrendGraphVmUt()
+        {
+            #region 数据
+            double target = 150;
+
+            double tolerancePercent = 0.05;
+            double yRangePercent = 3;
+            int len = Len;
+            DateTime startTime = DateTime.Now;
+            TimeSpan tsInterval = TimeSpan.FromSeconds(30);
+            DateTime time = startTime;
+            int id = 312456;
+            Random random = new Random();
+
+            List<TrendValue> tvs = new List<TrendValue>();
+            for (int i = 0; i < len; i++, time += tsInterval)
+            {
+                TrendValue tv = new TrendValue();
+                tv.Time = time;
+                tv.Value = target + (random.NextDouble() - 0.5) * target * tolerancePercent * 0.5;
+                tv.Sigma = (Math.Sin(i * Math.PI / len) * 3) * target * tolerancePercent * random.NextDouble();
+
+                tvs.Add(tv);
+
+            }
+            Values.AddRange(tvs);
+
+            #endregion
+
+            profileParam = new BlowingFixProfileParam()
+            {
+                Target = target,
+                TolerancePercent = tolerancePercent
+            };
+            graphparam = new TrendGraphItemParam()
+            {
+                YRangePercent = yRangePercent,
+                Mix = 2
+            };
+
+            #region 界面数据
+            UpdateX();
+
+            Mix = 2;
+            BeginTime = Values.First().Time;
+            EndTime = Values.Last().Time;
+            Id = id;
+
+            UpdateAverage();
+            UpdateY();
+            #endregion
+        }
+    }
+}
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/UiModule2_TrendGraph.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/UiModule2_TrendGraph.cs
similarity index 90%
rename from Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/UiModule2_TrendGraph.cs
rename to Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/UiModule2_TrendGraph.cs
index 62bd642906fd8855c221afd7ae22b76b9265b41e..88a2daa91d02fe1226422ffb92ac1f35ce592674 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/UiModule2_TrendGraph.cs
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph/UiModule2_TrendGraph.cs
@@ -32,7 +32,7 @@ namespace FLY.Thick.Blowing.UI.UiModule
         /// <returns></returns>
         public FrameworkElement GetComponent(int id, IUnityContainer container)
         {
-            return container.Resolve<TrendGraph2>(new Unity.Resolution.ParameterOverride("id", id));
+            return container.Resolve<TrendGraph>(new Unity.Resolution.ParameterOverride("id", id));
         }
 
 
@@ -53,7 +53,7 @@ namespace FLY.Thick.Blowing.UI.UiModule
         /// <param name="IDs"></param>
         public void MatchParam(int[] IDs)
         {
-            TrendGraphParam2s.Current.MatchParam(IDs);
+            TrendGraphParams.Current.MatchParam(IDs);
         }
     }
 }
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2.xaml b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2.xaml
index 54f03ca89146cfce93d0cf242ca55e9661db5491..50376a39606db3d3ae7b765cd60421afa01ea25a 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2.xaml
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2.xaml
@@ -8,7 +8,7 @@
              xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks" 
              xmlns:lvc1="clr-namespace:LiveCharts.Wpf;assembly=LiveCharts.Feng.Wpf"
              mc:Ignorable="d" 
-             d:DesignHeight="300" d:DesignWidth="800" >
+             d:DesignHeight="600" d:DesignWidth="800" >
     <UserControl.Resources>
         <ResourceDictionary>
             <ResourceDictionary.MergedDictionaries>
@@ -16,212 +16,380 @@
                 <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Blowing.UI;component/Themes/Styles.xaml"/>
                 <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Blowing.UI;component/Themes/Colors.xaml"/>
             </ResourceDictionary.MergedDictionaries>
-
-            <local:TrendGraphVm2Ut x:Key="viewmodel"/>
-            <SolidColorBrush x:Key="TextBrush" Color="#4C4949" />
-            <SolidColorBrush x:Key="GrayBrush1" Color="#FF727272"/>
-            <SolidColorBrush x:Key="GrayBrush2" Color="#FF858484" />
-            <SolidColorBrush x:Key="SemiTransparentGreyBrush" Color="#99F0F0F0"/>
-            <SolidColorBrush x:Key="SemiTransparentActiveBrush" Color="#50008BE5"/>
-            <SolidColorBrush x:Key="WhiteBrush" Color="White"/>
-            
-            <Style x:Key="TitleStyle" TargetType="TextBlock">
-                <Setter Property="Width" Value="50"/>
-                <Setter Property="Foreground" Value="{StaticResource  GrayBrush1}"/>
-                <Setter Property="FontSize" Value="16"/>
-                <Setter Property="TextAlignment" Value="Right"/>
-            </Style>
-            <Style x:Key="ValueStyle" TargetType="TextBlock">
-                <Setter Property="Foreground" Value="{StaticResource  TextBrush}"/>
-                <Setter Property="FontSize" Value="20"/>
-                <Setter Property="Padding" Value="5,0"/>
-            </Style>
-            <Style x:Key="ValueStyle2" TargetType="TextBlock">
-                <Setter Property="Foreground" Value="{StaticResource  WhiteBrush}"/>
-                <Setter Property="Background" Value="{StaticResource  TextBrush}"/>
-                <Setter Property="FontSize" Value="26"/>
-                <Setter Property="Padding" Value="5,0"/>
-            </Style>
-            <Style x:Key="UnitStyle" TargetType="TextBlock">
-                <Setter Property="Foreground" Value="{StaticResource  GrayBrush2}"/>
-                <Setter Property="FontSize" Value="15"/>
-                <Setter Property="VerticalAlignment" Value="Bottom"/>
-            </Style>
+            <local:TrendGraphVmUt x:Key="trendVm"/>
+            <local:ScanGraphVmUt x:Key="scanGraphVm"/>
         </ResourceDictionary>
     </UserControl.Resources>
-    <Border Style="{StaticResource BorderStyle_module}" >
-        <Grid d:DataContext="{StaticResource viewmodel}">
-            <Grid.RowDefinitions>
-                <RowDefinition Height="auto"/>
-                <RowDefinition Height="100*"/>
-                <RowDefinition Height="70*"/>
-            </Grid.RowDefinitions>
-            <Grid.ColumnDefinitions>
-                <ColumnDefinition Width="auto"/>
-                <ColumnDefinition Width="400*"/>
-                <ColumnDefinition Width="350*"/>
-            </Grid.ColumnDefinitions>
-            <lvc:CartesianChart Grid.Row="1" Grid.ColumnSpan="3" 
-                                Hoverable="False" DisableAnimations="True" DataTooltip="{x:Null}" Margin="5,-5,2,2">
-                <lvc:CartesianChart.Resources>
-                    <Style TargetType="lvc1:Column2Series">
-                        <Setter Property="PointGeometry" Value="{x:Null}"/>
-                        <Setter Property="StrokeThickness" Value="0" />
-                    </Style>
-                </lvc:CartesianChart.Resources>
-                <lvc:CartesianChart.Series>
-                    <lvc1:Column2Series 
+    <Grid>
+        <Grid.RowDefinitions>
+            <RowDefinition Height="170*"/>
+            <RowDefinition Height="100*"/>
+        </Grid.RowDefinitions>
+        <Border Style="{StaticResource Styles.Module.Border}" >
+            <Grid x:Name="grid_trend" d:DataContext="{StaticResource trendVm}">
+                <Grid.RowDefinitions>
+                    <RowDefinition Height="auto"/>
+                    <RowDefinition Height="100*"/>
+                    <RowDefinition Height="70*"/>
+                </Grid.RowDefinitions>
+                <Grid.ColumnDefinitions>
+                    <ColumnDefinition Width="auto"/>
+                    <ColumnDefinition Width="400*"/>
+                    <ColumnDefinition Width="280*"/>
+                </Grid.ColumnDefinitions>
+                <lvc:CartesianChart Grid.Row="1" Grid.ColumnSpan="3" 
+                                Hoverable="False" DisableAnimations="True" DataTooltip="{x:Null}" Margin="5,-5,2,2"
+                                    MouseDown="UIElement_MouseDown">
+                    <lvc:CartesianChart.Resources>
+                        <Style TargetType="lvc1:Column2Series">
+                            <Setter Property="PointGeometry" Value="{x:Null}"/>
+                            <Setter Property="StrokeThickness" Value="0" />
+                        </Style>
+                    </lvc:CartesianChart.Resources>
+                    <lvc:CartesianChart.Series>
+                        <lvc1:Column2Series 
                         Values="{Binding Values}"
                         Configuration="{Binding MapperPositive}"/>
-                    <lvc1:Column2Series  
+                        <lvc1:Column2Series  
                         Values="{Binding Values}"
                         Configuration="{Binding MapperNegative}"/>
-                </lvc:CartesianChart.Series>
-                <lvc:CartesianChart.AxisX>
-                    <lvc:Axis Foreground="Black" 
+                    </lvc:CartesianChart.Series>
+                    <lvc:CartesianChart.AxisX>
+                        <lvc:Axis Foreground="Black" 
                               LabelFormatter="{Binding XFormatter}" 
                               MinValue="0" MaxValue="{Binding XMax}"
                               >
-                        <lvc:Axis.Separator>
-                            <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" Step ="10"/>
-                        </lvc:Axis.Separator>
-                    </lvc:Axis>
-                </lvc:CartesianChart.AxisX>
-                <lvc:CartesianChart.AxisY>
-                    <lvc:Axis LabelFormatter="{Binding YFormatter}"  Foreground="Transparent" 
+                            <lvc:Axis.Separator>
+                                <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" Step ="10"/>
+                            </lvc:Axis.Separator>
+                            <lvc:Axis.Sections>
+                                <lvc:AxisSection Style="{StaticResource Styles.Axis.Section.Selected}" DataLabel="True" Value="{Binding SelectedIndex}" />
+                            </lvc:Axis.Sections>
+                        </lvc:Axis>
+                    </lvc:CartesianChart.AxisX>
+                    <lvc:CartesianChart.AxisY>
+                        <lvc:Axis LabelFormatter="{Binding YFormatter}"  Foreground="Transparent" 
                               MinValue="{Binding YMin}" MaxValue="{Binding YMax}" FontFamily="Courier New" >
-                       
-                        <lvc:Axis.Sections>
-                            <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding YMax}" Stroke="{StaticResource Brushes.ChartAxisLabel3}"/>
-                            <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding YMin}" Stroke="{StaticResource Brushes.ChartAxisLabel3}"/>
-                            <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding Tolerance2YMax}" Stroke="{StaticResource Brushes.ChartAxisLabel2}"/>
-                            <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding Tolerance2YMin}" Stroke="{StaticResource Brushes.ChartAxisLabel2}"/>
-                            <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding ToleranceYMax}" Stroke="{StaticResource Brushes.ChartAxisLabel1}"/>
-                            <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding ToleranceYMin}" Stroke="{StaticResource Brushes.ChartAxisLabel1}"/>
-                            <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="0" Stroke="{StaticResource Brushes.ChartAxisLabel0}" />
-                        </lvc:Axis.Sections>
-                        <lvc:Axis.Separator>
-                            <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" />
-                        </lvc:Axis.Separator>
-                    </lvc:Axis>
-                </lvc:CartesianChart.AxisY>
-            </lvc:CartesianChart>
-            <lvc:CartesianChart Grid.Row="2" Grid.ColumnSpan="3" 
-                                Hoverable="False" DisableAnimations="True" DataTooltip="{x:Null}" Margin="5,-5,2,2">
-                <lvc:CartesianChart.Resources>
-                    <Style TargetType="lvc:LineSeries">
-                        <Setter Property="PointGeometry" Value="{x:Null}"/>
-                        <Setter Property="StrokeThickness" Value="3" />
-                        <Setter Property="Fill" Value="{StaticResource Brushes.ChartArea4}"/>
-                        <Setter Property="Stroke" Value="{StaticResource Brushes.ChartArea0}"/>
-                    </Style>
-                </lvc:CartesianChart.Resources>
-                <lvc:CartesianChart.Series>
-                    <lvc:LineSeries 
+
+                            <lvc:Axis.Sections>
+                                <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding YMax}" Stroke="{StaticResource Brushes.ChartAxisLabel3}"/>
+                                <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding YMin}" Stroke="{StaticResource Brushes.ChartAxisLabel3}"/>
+                                <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding Tolerance2YMax}" Stroke="{StaticResource Brushes.ChartAxisLabel2}"/>
+                                <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding Tolerance2YMin}" Stroke="{StaticResource Brushes.ChartAxisLabel2}"/>
+                                <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding ToleranceYMax}" Stroke="{StaticResource Brushes.ChartAxisLabel1}"/>
+                                <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="{Binding ToleranceYMin}" Stroke="{StaticResource Brushes.ChartAxisLabel1}"/>
+                                <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" Value="0" Stroke="{StaticResource Brushes.ChartAxisLabel0}" />
+                            </lvc:Axis.Sections>
+                            <lvc:Axis.Separator>
+                                <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" />
+                            </lvc:Axis.Separator>
+                        </lvc:Axis>
+                    </lvc:CartesianChart.AxisY>
+                </lvc:CartesianChart>
+                <lvc:CartesianChart Grid.Row="2" Grid.ColumnSpan="3" 
+                                Hoverable="False" DisableAnimations="True" DataTooltip="{x:Null}" Margin="5,-5,2,2"
+                                    MouseDown="UIElement_MouseDown">
+                    <lvc:CartesianChart.Resources>
+                        <Style TargetType="lvc:LineSeries">
+                            <Setter Property="StrokeThickness" Value="3" />
+                            <Setter Property="Fill" Value="{StaticResource Brushes.ChartArea4}"/>
+                            <Setter Property="Stroke" Value="{StaticResource Brushes.ChartArea0}"/>
+                        </Style>
+                    </lvc:CartesianChart.Resources>
+                    <lvc:CartesianChart.Series>
+                        <lvc:LineSeries 
                         Values="{Binding Values}"
                         Configuration="{Binding MapperValue}"/>
-                </lvc:CartesianChart.Series>
-                <lvc:CartesianChart.AxisX>
-                    <lvc:Axis Foreground="{StaticResource Brushes.ChartAxisLabel}" 
+                    </lvc:CartesianChart.Series>
+                    <lvc:CartesianChart.AxisX>
+                        <lvc:Axis Foreground="{StaticResource Brushes.ChartAxisLabel}" 
                               LabelFormatter="{Binding XFormatter}" 
                               MinValue="0" MaxValue="{Binding XMax}"
                               >
-                        <lvc:Axis.Separator>
-                            <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" Step ="10"/>
-                        </lvc:Axis.Separator>
-                    </lvc:Axis>
-                </lvc:CartesianChart.AxisX>
-                <lvc:CartesianChart.AxisY>
-                    <lvc:Axis LabelFormatter="{Binding YFormatter2}"  Foreground="{StaticResource Brushes.ChartAxisLabel}" MinRange="1" 
+                            <lvc:Axis.Separator>
+                                <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" Step ="10"/>
+                            </lvc:Axis.Separator>
+                            <lvc:Axis.Sections>
+                                <lvc:AxisSection Style="{StaticResource Styles.Axis.Section.Selected}" Value="{Binding SelectedIndex}" />
+                            </lvc:Axis.Sections>
+                        </lvc:Axis>
+                    </lvc:CartesianChart.AxisX>
+                    <lvc:CartesianChart.AxisY>
+                        <lvc:Axis LabelFormatter="{Binding YFormatter2}"  Foreground="{StaticResource Brushes.ChartAxisLabel}" MinRange="1" 
                               FontFamily="Courier New" >
-                        <lvc:Axis.Separator>
-                            <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" />
-                        </lvc:Axis.Separator>
-                    </lvc:Axis>
-                </lvc:CartesianChart.AxisY>
-            </lvc:CartesianChart>
-            <Button Style="{StaticResource ButtonStyle_icon}" Margin="48,0,0,-20"
-                        Click="Button_info_click" >
-                <Grid Style="{StaticResource GridStyle_ButtonShadow}" >
-                    <TextBlock  Padding="10,5" VerticalAlignment="Top"
-                                    FontSize="24" Foreground="White" Background="{StaticResource Color_theme_activity}" 
+                            <lvc:Axis.Separator>
+                                <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" />
+                            </lvc:Axis.Separator>
+                        </lvc:Axis>
+                    </lvc:CartesianChart.AxisY>
+                </lvc:CartesianChart>
+                <Button Style="{StaticResource Styles.Button.Icon}" Margin="48,0,0,-20"
+                        Click="btnTrendInfoClick" >
+                    <Grid Style="{StaticResource Styles.Shadow}" >
+                        <TextBlock  Padding="10,5" VerticalAlignment="Top"
+                                    FontSize="24" Foreground="White" Background="{StaticResource Brushes.Activity}" 
                                     Text="趋势图" />
-                </Grid>
-            </Button>
-            <Grid Grid.Column="1" Grid.RowSpan="2" Panel.ZIndex="2" 
-                  VerticalAlignment="Top" HorizontalAlignment="Left" >
-                <Viewbox MaxHeight="50">
-                    <StackPanel>
-                        <StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" Margin="5">
-
+                    </Grid>
+                </Button>
+                <StackPanel Grid.Column="1" Grid.RowSpan="2" Panel.ZIndex="2" VerticalAlignment="Top" HorizontalAlignment="Left" 
+                        Margin="{StaticResource ControlMargin}">
+                    <Viewbox MaxHeight="{StaticResource FontSize.Value}" HorizontalAlignment="Left" Margin="2">
+                        <StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" >
                             <TextBlock Style="{StaticResource ValueStyle}" >
                                 <Run Text="{Binding BeginTime,Mode=OneWay,StringFormat={}{0:MM-dd HH:mm}}"/>
                                 至
                                 <Run Text="{Binding EndTime,Mode=OneWay,StringFormat={}{0:MM-dd HH:mm}}"/>
                             </TextBlock>
-
                         </StackPanel>
-                        <StackPanel Orientation="Horizontal">
-                            <StackPanel Orientation="Horizontal" Margin="5,0">
-                                <TextBlock Style="{StaticResource TitleStyle}" Text="ID:" />
-                                <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Id}"/>
-                            </StackPanel>
+                    </Viewbox>
+                    <Viewbox MaxHeight="{StaticResource FontSize.Value}" HorizontalAlignment="Left" Margin="2">
+                        <StackPanel Orientation="Horizontal" Margin="{StaticResource Margin.Text}"
+                                Background="{StaticResource SemiTransparentGreyBrush2}">
+                            <TextBlock Style="{StaticResource TitleStyle}" Text="ID:" />
+                            <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Id}"/>
                         </StackPanel>
-                    </StackPanel>
-                </Viewbox>
-            </Grid>
-            <Grid Grid.Column="2" Grid.RowSpan="2" Panel.ZIndex="1" 
+                    </Viewbox>
+                </StackPanel>
+                <Grid Grid.Column="2" Grid.RowSpan="2" Panel.ZIndex="1" 
                   Margin="10,0" VerticalAlignment="Top" HorizontalAlignment="Right"
                   Background="{StaticResource SemiTransparentGreyBrush}" >
-                <Viewbox MaxHeight="50">
-                    <StackPanel Margin="5">
-                        <StackPanel.Resources>
-                            <Style TargetType="Viewbox">
-                                <Setter Property="Height" Value="25"/>
-                                <Setter Property="Width" Value="120"/>
-                                <Setter Property="HorizontalAlignment" Value="Left"/>
-                                <Setter Property="VerticalAlignment" Value="Top"/>
-                            </Style>
-                        </StackPanel.Resources>
-                        <StackPanel Orientation="Horizontal">
-                            <Viewbox >
-                                <StackPanel Orientation="Horizontal">
-                                    <TextBlock Style="{StaticResource TitleStyle}" 
+                    <Viewbox MaxHeight="50">
+                        <StackPanel Margin="5">
+                            <StackPanel.Resources>
+                                <Style TargetType="Viewbox">
+                                    <Setter Property="Height" Value="25"/>
+                                    <Setter Property="Width" Value="120"/>
+                                    <Setter Property="HorizontalAlignment" Value="Left"/>
+                                    <Setter Property="VerticalAlignment" Value="Top"/>
+                                </Style>
+                            </StackPanel.Resources>
+                            <StackPanel Orientation="Horizontal">
+                                <Viewbox >
+                                    <StackPanel Orientation="Horizontal">
+                                        <TextBlock Style="{StaticResource TitleStyle}" 
                                            Foreground="{StaticResource  WhiteBrush}"
                                            Background="{StaticResource  TextBrush}"
                                            Opacity="0.8"
                                            Text="平均: "
                                            />
-                                    <TextBlock Style="{StaticResource ValueStyle}" 
+                                        <TextBlock Style="{StaticResource ValueStyle}" 
                                            Foreground="{StaticResource  WhiteBrush}"
                                            Background="{StaticResource  TextBrush}"
                                            Text="{Binding Average,Mode=OneWay,StringFormat={}{0:P1}}"
                                            >
-                                    </TextBlock>
-                                </StackPanel>
-                            </Viewbox>
-                        </StackPanel>
-                        <StackPanel Orientation="Horizontal">
-                            <Viewbox >
-                                <StackPanel Orientation="Horizontal">
-                                    <TextBlock Style="{StaticResource TitleStyle}" Text="最大: "/>
-                                    <TextBlock Style="{StaticResource ValueStyle}" 
+                                        </TextBlock>
+                                    </StackPanel>
+                                </Viewbox>
+                            </StackPanel>
+                            <StackPanel Orientation="Horizontal">
+                                <Viewbox >
+                                    <StackPanel Orientation="Horizontal">
+                                        <TextBlock Style="{StaticResource TitleStyle}" Text="最大: "/>
+                                        <TextBlock Style="{StaticResource ValueStyle}" 
                                                Text="{Binding Max,Mode=OneWay,StringFormat={}{0:P1}}"/>
-                                </StackPanel>
-                            </Viewbox>
-                            <Viewbox >
-                                <StackPanel Orientation="Horizontal" >
-                                    <TextBlock Style="{StaticResource TitleStyle}" 
+                                    </StackPanel>
+                                </Viewbox>
+                                <Viewbox >
+                                    <StackPanel Orientation="Horizontal" >
+                                        <TextBlock Style="{StaticResource TitleStyle}" 
                                                Text="最小: " />
-                                    <TextBlock Style="{StaticResource ValueStyle}" 
+                                        <TextBlock Style="{StaticResource ValueStyle}" 
                                                Text="{Binding Min,Mode=OneWay,StringFormat={}{0:P1}}"/>
+                                    </StackPanel>
+                                </Viewbox>
+                            </StackPanel>
+
+                        </StackPanel>
+                    </Viewbox>
+                </Grid>
+            </Grid>
+        </Border>
+        <Border Grid.Row="1" Style="{StaticResource Styles.Module.Border}" >
+            <Grid x:Name="grid_scan" d:DataContext="{StaticResource scanGraphVm}">
+                <Grid.RowDefinitions>
+                    <RowDefinition Height="auto"/>
+                    <RowDefinition/>
+                </Grid.RowDefinitions>
+                <Grid.ColumnDefinitions>
+                    <ColumnDefinition Width="auto"/>
+                    <ColumnDefinition Width="400*"/>
+                    <ColumnDefinition Width="280*"/>
+                </Grid.ColumnDefinitions>
+                <lvc:CartesianChart Grid.Row="1" Grid.ColumnSpan="3" 
+                                Series="{Binding Series}" Hoverable="False" DisableAnimations="True" DataTooltip="{x:Null}" Margin="5,-5,2,2">
+                    <lvc:CartesianChart.AxisX>
+                        <lvc:Axis LabelFormatter="{Binding XFormatter}" 
+                              Foreground="{StaticResource Brushes.ChartAxisLabel}"
+                              MaxValue="{Binding XMax}" MinValue="0"
+                              >
+                            <lvc:Axis.Separator>
+                                <lvc:Separator Stroke="{StaticResource Brushes.ChartSeparator}" Step ="{Binding XStep}"/>
+                            </lvc:Axis.Separator>
+                            <lvc:Axis.Sections>
+                                <lvc:AxisSection Style="{StaticResource AxisSectionStyle}" StrokeThickness="0" Stroke="{StaticResource Brushes.Activity}"
+                                Value="{Binding OrgBoltNo}" 
+                            />
+                            </lvc:Axis.Sections>
+                        </lvc:Axis>
+                    </lvc:CartesianChart.AxisX>
+                    <lvc:CartesianChart.AxisY>
+                        <lvc:Axis LabelFormatter="{Binding YFormatter}" MaxValue="{Binding YMax}" MinValue="{Binding YMin}" Panel.ZIndex="0" Foreground="Transparent" FontFamily="Courier New">
+                            <lvc:Axis.Sections>
+                                <lvc:AxisSection Style="{StaticResource AxisSectionStyle}"
+                            Value="{Binding YMax}"  
+                            Stroke="{StaticResource Brushes.ChartAxisLabel3}"
+                            />
+                                <lvc:AxisSection Style="{StaticResource AxisSectionStyle}"
+                            Value="{Binding YMin}"  
+                            Stroke="{StaticResource Brushes.ChartAxisLabel3}"
+                            />
+                                <lvc:AxisSection Style="{StaticResource AxisSectionStyle}"
+                            Value="{Binding Tolerance2YMax}"  
+                            Stroke="{StaticResource Brushes.ChartAxisLabel2}"
+                            />
+                                <lvc:AxisSection Style="{StaticResource AxisSectionStyle}"
+                            Value="{Binding Tolerance2YMin}"  
+                            Stroke="{StaticResource Brushes.ChartAxisLabel2}"
+                            />
+                                <lvc:AxisSection Style="{StaticResource AxisSectionStyle}"
+                            Value="{Binding ToleranceYMax}"  
+                            Stroke="{StaticResource Brushes.ChartAxisLabel1}"
+                            />
+                                <lvc:AxisSection Style="{StaticResource AxisSectionStyle}"
+                            Value="{Binding ToleranceYMin}"  
+                            Stroke="{StaticResource Brushes.ChartAxisLabel1}"
+                            />
+
+                                <lvc:AxisSection Style="{StaticResource AxisSectionStyle}"
+                                Value="{Binding Target}" 
+                                Stroke="{StaticResource Brushes.ChartAxisLabel0}"
+                            />
+                            </lvc:Axis.Sections>
+                            <lvc:Axis.Separator>
+                                <lvc:Separator Stroke="Transparent" />
+                            </lvc:Axis.Separator>
+                        </lvc:Axis>
+
+                    </lvc:CartesianChart.AxisY>
+                </lvc:CartesianChart>
+
+                <Button Style="{StaticResource Styles.Button.Icon}" Margin="48,0,0,-20"
+                        Click="btnScanInfoClick" >
+                    <Grid Style="{StaticResource Styles.Shadow}" >
+                        <TextBlock  Padding="10,5" VerticalAlignment="Top"
+                                    FontSize="24" Foreground="{StaticResource Brushes.ThemeBackground}" Background="{StaticResource Brushes.Activity}" 
+                                    Text="扫描图" />
+                    </Grid>
+                </Button>
+                <StackPanel Grid.Column="1" Grid.RowSpan="2" Panel.ZIndex="2" VerticalAlignment="Top" HorizontalAlignment="Left" 
+                        Margin="{StaticResource ControlMargin}">
+                    <Viewbox MaxHeight="{StaticResource FontSize.Value}" HorizontalAlignment="Left" Margin="2">
+                        <StackPanel Orientation="Horizontal" >
+
+                            <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Time,StringFormat={}{0:MM-dd HH:mm:ss}}"/>
+                            <StackPanel Orientation="Horizontal" Margin="{StaticResource TextMargin}">
+                                <TextBlock Style="{StaticResource TitleStyle}" Text="ID:" />
+                                <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding Id}"/>
+                            </StackPanel>
+
+                        </StackPanel>
+                    </Viewbox>
+                    <Viewbox MaxHeight="{StaticResource FontSize.Value}" HorizontalAlignment="Left" Margin="2">
+                        <StackPanel Orientation="Horizontal">
+                            <StackPanel Orientation="Horizontal" Margin="{StaticResource TextMargin}">
+                                <TextBlock >
+                                    <TextBlock.Style>
+                                        <Style TargetType="TextBlock" BasedOn="{StaticResource ValueStyle}">
+                                            <Setter Property="Background" Value="#99000000"/>
+                                            <Setter Property="Foreground" Value="White"/>
+                                            <Setter Property="Text" Value="逆"/>
+                                            <Style.Triggers>
+                                                <DataTrigger Binding="{Binding IsBackw}" Value="True">
+                                                    <Setter Property="Background" Value="#99008BE5"/>
+                                                    <Setter Property="Text" Value="顺"/>
+                                                </DataTrigger>
+                                            </Style.Triggers>
+                                        </Style>
+                                    </TextBlock.Style>
+                                </TextBlock>
+                            </StackPanel>
+                            <StackPanel Orientation="Horizontal" Background="#99FFFFFF">
+                                <StackPanel Orientation="Horizontal" Margin="5,0">
+                                    <TextBlock Style="{StaticResource ValueStyle}" 
+                                                   Text="{Binding RPeriod, Converter={StaticResource timespanconv}}" 
+                                                    />
+                                    <TextBlock Style="{StaticResource TitleStyle}" Width="auto" VerticalAlignment="Bottom"
+                                                   Text="min/R" />
                                 </StackPanel>
-                            </Viewbox>
+                            </StackPanel>
                         </StackPanel>
+                    </Viewbox>
+                </StackPanel>
+
+                <Grid Grid.Column="2" Grid.RowSpan="2" Panel.ZIndex="1" 
+                  Margin="10,0" VerticalAlignment="Top" HorizontalAlignment="Right"
+                  Background="{StaticResource SemiTransparentGreyBrush}" >
+                    <Viewbox MaxHeight="50">
+                        <StackPanel Margin="5">
+                            <StackPanel.Resources>
+                                <Style TargetType="Viewbox">
+                                    <Setter Property="Height" Value="25"/>
+                                    <Setter Property="Width" Value="120"/>
+                                    <Setter Property="HorizontalAlignment" Value="Left"/>
+                                    <Setter Property="VerticalAlignment" Value="Top"/>
+                                </Style>
+                            </StackPanel.Resources>
+                            <StackPanel Orientation="Horizontal">
+                                <Viewbox >
+                                    <StackPanel Orientation="Horizontal">
+                                        <TextBlock Style="{StaticResource TitleStyle}" 
+                                           Foreground="{StaticResource WhiteBrush}"
+                                           Background="{StaticResource TextBrush}"
+                                           Opacity="0.8"
+                                           Text="平均: "
+                                           />
+                                        <TextBlock Style="{StaticResource ValueStyle}" 
+                                           Foreground="{StaticResource WhiteBrush}"
+                                           Background="{StaticResource TextBrush}"
+                                           Text="{Binding Average,StringFormat={}{0:F1}}" 
+                                           />
+                                    </StackPanel>
+                                </Viewbox>
+                                <Viewbox>
+                                    <StackPanel Orientation="Horizontal" Background="#99000000">
+                                        <TextBlock Style="{StaticResource TitleStyle}" Foreground="White"
+                                           Text="  2σ: " 
+                                           />
+                                        <TextBlock Style="{StaticResource ValueStyle}" 
+                                           Foreground="{StaticResource WhiteBrush}"
+                                           Background="{StaticResource TextBrush}"
+                                           Text="{Binding Sigma2Text}"  
+                                           />
+                                    </StackPanel>
+                                </Viewbox>
+                            </StackPanel>
+                            <StackPanel Orientation="Horizontal">
+                                <Viewbox >
+                                    <StackPanel Orientation="Horizontal">
+                                        <TextBlock Style="{StaticResource TitleStyle}" Text="最大: "/>
+                                        <TextBlock Style="{StaticResource ValueStyle}" Text="{Binding MaxText}"/>
+                                    </StackPanel>
+                                </Viewbox>
+                                <Viewbox >
+                                    <StackPanel Orientation="Horizontal" >
+                                        <TextBlock Style="{StaticResource TitleStyle}" 
+                                               Text="最小: " />
+                                        <TextBlock Style="{StaticResource ValueStyle}" 
+                                               Text="{Binding MinText}"/>
+                                    </StackPanel>
+                                </Viewbox>
+                            </StackPanel>
 
-                    </StackPanel>
-                </Viewbox>
+                        </StackPanel>
+                    </Viewbox>
+                </Grid>
             </Grid>
-        </Grid>
-    </Border>
+        </Border>
+    </Grid>
+
 </UserControl>
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2.xaml.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2.xaml.cs
index 98c7e2a0a601e80e7cd11061758954ec613645b6..009d82d3caf7ad2fdf2ae48084a03a701e0f7fc2 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2.xaml.cs
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2.xaml.cs
@@ -1,8 +1,23 @@
 using FLY.Thick.Base.UI;
 using FLY.Thick.Blowing.IService;
+using LiveCharts;
+using LiveCharts.Helpers;
+using LiveCharts.Wpf;
+using Misc;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
 using System.Windows;
 using System.Windows.Controls;
-using System.Windows.Forms;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
 using Unity;
 
 namespace FLY.Thick.Blowing.UI.UiModule
@@ -12,8 +27,11 @@ namespace FLY.Thick.Blowing.UI.UiModule
     /// </summary>
     public partial class TrendGraph2 : System.Windows.Controls.UserControl
     {
-        TrendGraphVm2 viewModel;
-        TrendGraphItemParam2 graphparam;
+        TrendGraph2Vm trendGraphVm;
+        TrendGraphItemParam trendGraphParam;
+
+        ScanGraphVm scanGraphVm;
+        ScanGraphItemParam scanGraphParam;
         public TrendGraph2()
         {
             InitializeComponent();
@@ -22,30 +40,105 @@ namespace FLY.Thick.Blowing.UI.UiModule
         [InjectionMethod]
         public void Init(int id,
             IBulkDbService bulkDb,
-            IBlowingFixProfileService profileService)
+            IBlowingService blowingService,
+            ParamDictionary paramDictionary,
+            IBlowingFixProfileService profileService
+            )
         {
 
-            graphparam = TrendGraphParam2s.Current.Items.Find(p => p.ID == id);
-            if (graphparam == null)
+            trendGraphParam = TrendGraphParams.Current.Items.Find(p => p.ID == id);
+            if (trendGraphParam == null)
+            {
+                trendGraphParam = new TrendGraphItemParam() { ID = id };
+                TrendGraphParams.Current.Items.Add(trendGraphParam);
+                TrendGraphParams.Current.Save();
+            }
+            trendGraphVm = new TrendGraph2Vm();
+            trendGraphVm.Init(trendGraphParam, bulkDb, profileService.Param);
+            this.grid_trend.DataContext = trendGraphVm;
+
+
+
+
+            scanGraphParam = ScanGraphParams.Current.Items.Find(p => p.ID == id);
+            if (scanGraphParam == null)
+            {
+                scanGraphParam = new ScanGraphItemParam() { ID = id };
+                ScanGraphParams.Current.Items.Add(scanGraphParam);
+                ScanGraphParams.Current.Save();
+            }
+            scanGraphVm = new ScanGraphVm();
+            scanGraphVm.Init(scanGraphParam, bulkDb, blowingService, paramDictionary, profileService.Param);
+            this.grid_scan.DataContext = scanGraphVm;
+
+
+
+            this.trendGraphVm.PropertyChanged += TrendGraphVm_PropertyChanged;
+            this.scanGraphVm.PropertyChanged += ScanGraphVm_PropertyChanged;
+
+        }
+
+        private void TrendGraphVm_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
+        {
+            if (e.PropertyName == nameof(trendGraphVm.SelectedId))
+            {
+                scanGraphVm.Number = trendGraphVm.SelectedId;
+            }
+        }
+
+        private void ScanGraphVm_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
+        {
+            if (e.PropertyName == nameof(scanGraphVm.Number))
             {
-                graphparam = new TrendGraphItemParam2() { ID = id };
-                TrendGraphParam2s.Current.Items.Add(graphparam);
-                TrendGraphParam2s.Current.Save();
+                if (scanGraphVm.Number != trendGraphVm.SelectedId)
+                {
+                    trendGraphVm.ClearSelected();
+                }
             }
-            viewModel = new TrendGraphVm2();
-            viewModel.Init(graphparam, bulkDb, profileService.Param);
-            this.DataContext = viewModel;
         }
 
-        private void Button_info_click(object sender, RoutedEventArgs e)
+        private void btnTrendInfoClick(object sender, RoutedEventArgs e)
         {
             if (!WdPassword.Authorize("GraphConfig"))
                 return;
 
-            TrendGraphConfig2 window = new TrendGraphConfig2();
-            window.Init(graphparam,viewModel);
+            TrendGraph2Config window = new TrendGraph2Config();
+            window.Init(trendGraphParam, trendGraphVm);
             window.Owner = FLY.ControlLibrary.COMMON.GetWindow(this);
             window.ShowDialog();
         }
+
+        private void btnScanInfoClick(object sender, RoutedEventArgs e)
+        {
+            if (!WdPassword.Authorize("GraphConfig"))
+                return;
+
+            WdScanGraphConfig window = new WdScanGraphConfig();
+            window.Init(scanGraphParam, scanGraphVm);
+            window.Owner = FLY.ControlLibrary.COMMON.GetWindow(this);
+            window.ShowDialog();
+        }
+
+        private void UIElement_MouseDown(object sender, MouseButtonEventArgs e)
+        {
+
+            var vm = trendGraphVm;
+
+            var chart = (LiveCharts.Wpf.CartesianChart)sender;
+            var series = chart.Series[0];
+
+
+            var mouseCoordinate = e.GetPosition(chart);
+            var p = chart.ConvertToChartValues(mouseCoordinate);
+
+
+            //var series = chart.Series[0];
+            var closetsPoint = series.ClosestPointTo(p.X, AxisOrientation.X);
+            if (closetsPoint == null)
+            {
+                return;
+            }
+            vm.SetSelected((int)(closetsPoint.X));
+        }
     }
 }
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2Config.xaml b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2Config.xaml
new file mode 100644
index 0000000000000000000000000000000000000000..e3f57d8c4c503226e9ff5c93a3273e3802e0e3bb
--- /dev/null
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2Config.xaml
@@ -0,0 +1,167 @@
+<flyctrllib:WindowBigClose  x:Class="FLY.Thick.Blowing.UI.UiModule.TrendGraph2Config"
+        xmlns:flyctrllib="clr-namespace:FLY.ControlLibrary;assembly=FLY.ControlLibrary"
+        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+        mc:Ignorable="d" 
+        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+        xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks"
+        xmlns:controls="http://metro.mahapps.com/winfx/xaml/controls"
+        SizeToContent="WidthAndHeight"  MinHeight="450" MinWidth="450"
+        >
+    <Window.Resources>
+        <ResourceDictionary>
+            <ResourceDictionary.MergedDictionaries>
+                <ResourceDictionary Source="pack://application:,,,/FLY.ControlLibrary;component/Themes/Dictionary_MyStyle.xaml"/>
+                <ResourceDictionary Source="pack://application:,,,/FLY.Thick.Base.UI;component/Converter/Dictionary_MyConv.xaml"/>
+            </ResourceDictionary.MergedDictionaries>
+        </ResourceDictionary>
+    </Window.Resources>
+
+    <Grid Background="White">
+        <Grid x:Name="grid_trend"/>
+        <StackPanel Margin="{StaticResource ControlMargin}">
+            <Grid Height="20"/>
+            <GroupBox>
+                <GroupBox.Header>
+                    <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="纵向图"/>
+                </GroupBox.Header>
+                <StackPanel>
+                    <StackPanel Orientation="Horizontal" Margin="{StaticResource ControlMargin}" DataContext="{Binding DataContext,ElementName=grid_trend}">
+                        <DatePicker 
+                            Width="200"
+                            Margin="{StaticResource ControlMargin}"
+                            Height="auto"
+                            HorizontalAlignment="Center"
+                            HorizontalContentAlignment="Stretch"
+                            controls:TextBoxHelper.UseFloatingWatermark="True"
+                            controls:TextBoxHelper.Watermark="开始日期"
+                            controls:TextBoxHelper.WatermarkAlignment="Right" 
+                                        SelectedDate="{Binding SearchTime}"/>
+                        <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Click="btnSeachClick">
+                            <iconPacks:PackIconMaterial Kind="Magnify" />
+                        </Button>
+                    </StackPanel>
+                    <StackPanel Orientation="Horizontal" DataContext="{Binding DataContext,ElementName=grid_trend}">
+
+                        <Button Style="{StaticResource Styles.Button.Icon.Rectangle}" Click="btnPreClick">
+                            <iconPacks:PackIconMaterial Kind="ArrowLeft" />
+                        </Button>
+                        <StackPanel VerticalAlignment="Center">
+                            <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" >
+                        <Run Text="最新ID:"/><Run Text="{Binding NewestId,Mode=OneWay}"/>
+                            </TextBlock>
+                            <TextBlock Style="{StaticResource Styles.Text.FieldContent.Unit}" >
+                        <Run Text="当前ID:"/><Run Text="{Binding Id,Mode=OneWay}"/>
+                            </TextBlock>
+                        </StackPanel>
+                        <Button Click="btnNextClick">
+                            <Button.Style>
+                                <Style TargetType="Button" BasedOn="{StaticResource Styles.Button.Icon.Rectangle}">
+                                    <Style.Triggers>
+                                        <DataTrigger Binding="{Binding IsNewest}" Value="True">
+                                            <Setter Property="Foreground" Value="Gray"/>
+                                            <Setter Property="IsEnabled" Value="False"/>
+                                        </DataTrigger>
+                                    </Style.Triggers>
+                                </Style>
+                            </Button.Style>
+                            <iconPacks:PackIconMaterial Kind="ArrowRight" />
+                        </Button>
+                        <Button Click="btnNewestClick">
+                            <Button.Style>
+                                <Style TargetType="Button" BasedOn="{StaticResource Styles.Button.Icon.Rectangle}">
+                                    <Style.Triggers>
+                                        <DataTrigger Binding="{Binding IsNewest}" Value="True">
+                                            <Setter Property="Foreground" Value="Gray"/>
+                                            <Setter Property="IsEnabled" Value="False"/>
+                                        </DataTrigger>
+                                    </Style.Triggers>
+                                </Style>
+                            </Button.Style>
+                            <Grid>
+                                <iconPacks:PackIconMaterial Kind="ArrowCollapseRight" />
+                                <!--当不是最新, 弹出 自动按[最新] 倒计时-->
+                                <Grid Width="20" Height="20" VerticalAlignment="Bottom" HorizontalAlignment="Right" Margin="0,0,-5,-5" >
+                                    <Grid.Style>
+                                        <Style TargetType="Grid">
+                                            <Style.Triggers>
+                                                <DataTrigger Binding="{Binding IsNewest}" Value="True">
+                                                    <Setter Property="Visibility" Value="Hidden"/>
+                                                </DataTrigger>
+                                            </Style.Triggers>
+                                        </Style>
+                                    </Grid.Style>
+                                    <Ellipse  Fill="#FFFF3535" />
+                                    <TextBlock Text="{Binding AutoKeepNewestTimeRemaining}" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="White"/>
+                                </Grid>
+                            </Grid>
+                        </Button>
+                        <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="更新中" Visibility="{Binding IsLoading,Converter={StaticResource visbilityconv}}"/>
+                    </StackPanel>
+                </StackPanel>
+            </GroupBox>
+
+            <StackPanel Orientation="Horizontal" >
+
+                <StackPanel Margin="{StaticResource ControlMargin}">
+                    <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="混合数" />
+                    <StackPanel Orientation="Horizontal">
+                        <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding Mix}" />
+                    </StackPanel>
+                </StackPanel>
+                <StackPanel Margin="{StaticResource ControlMargin}">
+                    <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="Y轴倍数" />
+                    <StackPanel Orientation="Horizontal">
+                        <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding YRangePercent}" />
+                    </StackPanel>
+                </StackPanel>
+                <StackPanel Margin="{StaticResource ControlMargin}">
+                    <TextBlock Style="{StaticResource Styles.Text.FieldHeader.Editable}" Text="é—´éš”" />
+                    <StackPanel Orientation="Horizontal">
+                        <TextBox Style="{StaticResource Styles.Text.FieldContent.Input.Card}" Text="{Binding Interval}"  />
+                    </StackPanel>
+                </StackPanel>
+            </StackPanel>
+
+            <Button Style="{StaticResource Styles.Button.Apply}" Click="btnOkClick"/>
+            <GroupBox>
+                <GroupBox.Header>
+                    <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="扫描图"/>
+                </GroupBox.Header>
+                <StackPanel Orientation="Horizontal" DataContext="{Binding DataContext,ElementName=grid_trend}">
+
+                    <Button Click="btnPreSelectedClick">
+                        <Button.Style>
+                            <Style TargetType="Button" BasedOn="{StaticResource Styles.Button.Icon.Rectangle}">
+                                <Style.Triggers>
+                                    <DataTrigger Binding="{Binding CanSelested}" Value="False">
+                                        <Setter Property="Foreground" Value="Gray"/>
+                                        <Setter Property="IsEnabled" Value="False"/>
+                                    </DataTrigger>
+                                </Style.Triggers>
+                            </Style>
+                        </Button.Style>
+                        <iconPacks:PackIconMaterial Kind="ArrowLeft" />
+                    </Button>
+                    <Button Click="btnNextSelectedClick">
+                        <Button.Style>
+                            <Style TargetType="Button" BasedOn="{StaticResource Styles.Button.Icon.Rectangle}">
+                                <Style.Triggers>
+                                    <DataTrigger Binding="{Binding CanSelested}" Value="False">
+                                        <Setter Property="Foreground" Value="Gray"/>
+                                        <Setter Property="IsEnabled" Value="False"/>
+                                    </DataTrigger>
+                                </Style.Triggers>
+                            </Style>
+                        </Button.Style>
+                        <iconPacks:PackIconMaterial Kind="ArrowRight" />
+                    </Button>
+                </StackPanel>
+            </GroupBox>
+
+
+        </StackPanel>
+    </Grid>
+
+    </flyctrllib:WindowBigClose >
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2Config.xaml.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2Config.xaml.cs
new file mode 100644
index 0000000000000000000000000000000000000000..9f20aac36ac6f5722b4fd1580e376c4bda2ad93f
--- /dev/null
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2Config.xaml.cs
@@ -0,0 +1,74 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Shapes;
+
+namespace FLY.Thick.Blowing.UI.UiModule
+{
+    /// <summary>
+    /// Window_graphtrend.xaml 的交互逻辑
+    /// </summary>
+    public partial class TrendGraph2Config : FLY.ControlLibrary.WindowBigClose
+    {
+        TrendGraphItemParam graphparam;
+        TrendGraph2Vm trendGraphVm;
+        public TrendGraph2Config()
+        {
+            InitializeComponent();
+        }
+
+        public void Init(TrendGraphItemParam graphparam, TrendGraph2Vm trendGraphVm)
+        {
+            this.graphparam = graphparam;
+            this.trendGraphVm = trendGraphVm;
+            this.DataContext = graphparam;
+            this.grid_trend.DataContext = trendGraphVm;
+
+        }
+        private void btnPreClick(object sender, RoutedEventArgs e)
+        {
+            trendGraphVm.PreView();
+
+        }
+
+        private void btnNextClick(object sender, RoutedEventArgs e)
+        {
+            trendGraphVm.NextView();
+        }
+
+
+        private void btnOkClick(object sender, RoutedEventArgs e)
+        {
+            TrendGraphParams.Current.Save();
+        }
+
+        private void btnNewestClick(object sender, RoutedEventArgs e)
+        {
+            trendGraphVm.ToNewest();
+        }
+
+        private void btnSeachClick(object sender, RoutedEventArgs e)
+        {
+            trendGraphVm.Search(trendGraphVm.SearchTime);
+        }
+
+        private void btnNextSelectedClick(object sender, RoutedEventArgs e)
+        {
+            trendGraphVm.NextSelected();
+        }
+
+        private void btnPreSelectedClick(object sender, RoutedEventArgs e)
+        {
+            trendGraphVm.PreSelected();
+        }
+    }
+}
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2Vm.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2Vm.cs
new file mode 100644
index 0000000000000000000000000000000000000000..0af82fde92511cc052d1c33272bce3a442941b9c
--- /dev/null
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraph2Vm.cs
@@ -0,0 +1,104 @@
+using FLY.Thick.Blowing.Common;
+using FLY.Thick.Blowing.IService;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FLY.Thick.Blowing.UI.UiModule 
+{
+    public class TrendGraph2Vm : TrendGraphVm
+    {
+        const int NULL_VALUE = -100000;
+
+        #region 界面统计值
+
+        /// <summary>
+        /// 选择的位置 单位:分区序号
+        /// </summary>
+        public int SelectedIndex { get; private set; } = NULL_VALUE;
+
+        public long SelectedId { get; private set; }
+
+        public bool CanSelected { get; private set; }
+        #endregion
+
+
+        public override void Init(
+            TrendGraphItemParam graphparam,
+            IBulkDbService bulkDb,
+            BlowingFixProfileParam profileParam)
+        {
+            base.Init(graphparam, bulkDb, profileParam);
+
+            this.PropertyChanged += TrendGraph2Vm_PropertyChanged;
+        }
+
+        private void TrendGraph2Vm_PropertyChanged(object sender, PropertyChangedEventArgs e)
+        {
+            if (e.PropertyName == nameof(Id))
+            {
+
+                CanSelected = Values.Count() > 0;
+
+                //画面被更新,移动SelectedIndex
+                if (SelectedIndex >= 0 && SelectedIndex < Values.Count())
+                {
+                    //找到对应的Id
+                    for (int i = 0; i < Values.Count(); i++)
+                    {
+                        if (Values[i].ScanDataID == SelectedId)
+                        {
+                            SelectedIndex = i;
+                            break;
+                        }
+                    }
+                    //找不到,只能清除
+                    ClearSelected();
+                }
+            }
+        }
+
+        public void SetSelected(int index)
+        {
+            SelectedIndex = index;
+
+            if (SelectedIndex >= 0 && SelectedIndex < Values.Count())
+            {
+                //找到对应的Id
+                SelectedId = Values[SelectedIndex].ScanDataID;
+            }
+        }
+        public void ClearSelected()
+        {
+            SelectedIndex = NULL_VALUE;
+        }
+
+        public void PreSelected()
+        {
+            if (SelectedIndex > 0 && SelectedIndex <= Values.Count() - 1)
+            {
+                SetSelected(SelectedIndex - 1);
+            }
+            else
+            {
+                if (Values.Count() > 0)
+                    SetSelected(Values.Count() - 1);
+            }
+        }
+        public void NextSelected()
+        {
+            if (SelectedIndex >= 0 && SelectedIndex < Values.Count() - 1)
+            {
+                SetSelected(SelectedIndex + 1);
+            }
+            else
+            {
+                if (Values.Count() > 0)
+                    SetSelected(0);
+            }
+        }
+    }
+}
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphVm2Ut.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphVm2Ut.cs
deleted file mode 100644
index 9fe6662a4b83786398caf1e75ba46b7e2dd155ae..0000000000000000000000000000000000000000
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/TrendGraphVm2Ut.cs
+++ /dev/null
@@ -1,235 +0,0 @@
-using FLY.Thick.Blowing.IService;
-using LiveCharts;
-using LiveCharts.Configurations;
-using Misc;
-using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-using System.Windows.Media;
-
-namespace FLY.Thick.Blowing.UI.UiModule
-{
-    public class TrendGraphVm2Ut : INotifyPropertyChanged
-    {
-        public event PropertyChangedEventHandler PropertyChanged;
-
-        #region 图表控制
-        public double YMax { get; set; } = double.NaN;
-        public double YMin { get; set; } = double.NaN;
-        public double ToleranceYMax { get; set; } = double.NaN;
-        public double ToleranceYMin { get; set; } = double.NaN;
-        public double Tolerance2YMax { get; set; } = double.NaN;
-        public double Tolerance2YMin { get; set; } = double.NaN;
-        
-        public double XMax { get; set; } = double.NaN;
-        public Func<double, string> YFormatter { get; private set; }
-        public Func<double, string> XFormatter { get; private set; }
-        #endregion
-
-        #region 界面统计值
-
-        /// <summary>
-        /// 平均值
-        /// </summary>
-        public double Average { get; private set; } = double.NaN;
-
-        /// <summary>
-        /// 最大值
-        /// </summary>
-        public double Max { get; private set; } = double.NaN;
-
-        /// <summary>
-        /// 最小值
-        /// </summary>
-        public double Min { get; private set; } = double.NaN;
-
-        /// <summary>
-        /// 混合数
-        /// </summary>
-        public int Mix { get; private set; } = 2;
-
-        /// <summary>
-        /// Values.First().Time
-        /// </summary>
-        public DateTime BeginTime { get; private set; }
-        /// <summary>
-        /// Values.Last().Time
-        /// </summary>
-        public DateTime EndTime { get; private set; }
-
-        /// <summary>
-        /// Values.Last().Id
-        /// </summary>
-        public long Id { get; private set; } = 1231221;
-
-        #endregion
-
-        #region 查询模式
-        /// <summary>
-        /// 只要 Number被改变,且不为0, AutoKeepNewestTimeRemaining就会被设为10s.
-        /// 当 AutoKeepNewestTimeRemaining = 0, Number就会被设置为0
-        /// </summary>
-        public int AutoKeepNewestTimeRemaining { get; private set; }
-
-        /// <summary>
-        /// 当前就是最新的视图
-        /// </summary>
-        public bool IsNewest { get; private set; }
-
-        /// <summary>
-        /// 视图加载中
-        /// </summary>
-        public bool IsLoading { get; private set; }
-
-
-        #endregion
-
-        List<Brush> AreaColors;
-
-        public ChartValues<TrendValue> Values { get; } = new ChartValues<TrendValue>();
-
-        public object MapperPositive { get; private set; }
-        public object MapperNegative { get; private set; }
-        public object MapperValue { get; private set; }
-
-        public TrendGraphVm2Ut()
-        {
-            #region 与数据无关界面参数
-
-
-            AreaColors = new List<Brush>();
-            AreaColors.AddRange(FLY.ControlLibrary.Themes.Styles.AreaColors);
-
-            YFormatter = (y) =>
-            {
-                double percent = y * 100;
-                string text = "";
-                if (percent == 0d)
-                {
-                    text = "0.0%";
-                }
-                else if (percent > 0)
-                {
-                    text =$"+{Math.Abs(percent):F1}%";
-                }
-                else
-                {
-                    text =$"-{Math.Abs(percent):F1}%";
-                }
-                return $"{text,6}";
-            };
-            XFormatter = (x) => {
-                int index = (int)x;
-                if (index < Values.Count() && index >= 0)
-                    return Values[index].Time.ToString("HH:mm");
-                else
-                    return "";
-            };
-
-            MapperPositive = Mappers.Xy<TrendValue>()
-                .X((value, index) =>
-                {
-                    return index;
-                })
-                .Y(value => value.Sigma / value.Value)
-                .Fill((value) =>
-                {
-                    double percent = value.Sigma / value.Value;
-                    if ((percent > Tolerance2YMax) || (percent < -Tolerance2YMax))
-                    {
-                        return AreaColors[0];
-                    }
-                    else if ((percent > ToleranceYMax) || (percent < -ToleranceYMax))
-                    {
-                        return AreaColors[1];
-                    }
-                    else
-                    {
-                        return AreaColors[2];
-                    }
-                });
-
-            MapperNegative = Mappers.Xy<TrendValue>()
-                .X((value, index) =>
-                {
-                    return index;
-                })
-                .Y(value => -value.Sigma / value.Value)
-                .Fill((value) =>
-                {
-                    double percent = value.Sigma / value.Value;
-                    if ((percent > Tolerance2YMax) || (percent < -Tolerance2YMax))
-                    {
-                        return AreaColors[0];
-                    }
-                    else if ((percent > ToleranceYMax) || (percent < -ToleranceYMax))
-                    {
-                        return AreaColors[1];
-                    }
-                    else
-                    {
-                        return AreaColors[2];
-                    }
-                });
-
-            MapperValue = Mappers.Xy<TrendValue>()
-                .X((value, index) =>
-                {
-                    return index;
-                })
-                .Y(value => value.Value);
-
-            #endregion
-
-            Values.Clear();
-
-            #region 数据
-            double target = 150;
-            
-            double tolerancePercent = 0.05;
-            double yRangePercent = 3;
-            int len = 200;
-            DateTime startTime = DateTime.Now;
-            TimeSpan tsInterval = TimeSpan.FromSeconds(30);
-            DateTime time = startTime;
-            int id = 312456;
-            Random random = new Random();
-            for (int i = 0; i < len; i++, time+=tsInterval)
-            {
-                TrendValue tv = new TrendValue();
-                tv.Time = time;
-                tv.Value = target + (random.NextDouble() - 0.5) * target * tolerancePercent * 0.5;
-                tv.Sigma = (Math.Sin(i * Math.PI / len) * 3) * target * tolerancePercent * random.NextDouble();
-
-                Values.Add(tv);
-            }
-
-
-            #endregion
-
-            #region 界面数据
-            XMax = len;
-            Mix = 2;
-            BeginTime = Values.First().Time;
-            EndTime = Values.Last().Time;
-            Id = id;
-            var sigma2Percent = Values.Select(v => 2 * v.Sigma / v.Value);
-            Average = sigma2Percent.AverageNoNull();
-            Max = sigma2Percent.Max();
-            Min = sigma2Percent.Min();
-
-            ToleranceYMax = tolerancePercent;
-            ToleranceYMin = -ToleranceYMax;
-            Tolerance2YMax = ToleranceYMax * 2;
-            Tolerance2YMin = -Tolerance2YMax;
-            YMax = ToleranceYMax * yRangePercent;
-            YMin = -YMax;
-
-            #endregion
-        }
-    }
-}
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/UiModule2_TrendGraph2.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/UiModule2_TrendGraph2.cs
new file mode 100644
index 0000000000000000000000000000000000000000..ea2bd10b7a3eda584cf4c19e033a2be14066cc99
--- /dev/null
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing.UI/UiModule/TrendGraph2/UiModule2_TrendGraph2.cs
@@ -0,0 +1,59 @@
+using MultiLayout.UiModule;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using Unity;
+
+namespace FLY.Thick.Blowing.UI.UiModule
+{
+    /// <summary>
+    /// 扫描图控件模块
+    /// </summary>
+    public class UiModule2_TrendGraph2 : IUiModule2
+    {
+
+        /// <summary>
+        /// 控件标题
+        /// 它的值取决于culture
+        /// </summary>
+        public string Title => "测厚.纵向图2";
+        public ComponentType Type => ComponentType.Graph;
+        public bool IsUnique => false;
+
+        /// <summary>
+        /// 控件
+        /// 创建时,需要给它唯一ID,让加载自己的数据
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        public FrameworkElement GetComponent(int id, IUnityContainer container)
+        {
+            return container.Resolve<TrendGraph2>(new Unity.Resolution.ParameterOverride("id", id));
+        }
+
+
+        /// <summary>
+        /// 控件缩略图,用于编辑界面时,大致看看
+        /// 创建时,需要给它唯一ID,让加载自己的数据
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        public FrameworkElement GetThumbnail()
+        {
+            return new Grid();
+        }
+
+        /// <summary>
+        /// 给出全部控件ID, 控件自行删除没有的参数
+        /// </summary>
+        /// <param name="IDs"></param>
+        public void MatchParam(int[] IDs)
+        {
+            TrendGraphParams.Current.MatchParam(IDs);
+        }
+    }
+}
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/FLY.Thick.Blowing.csproj b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/FLY.Thick.Blowing.csproj
index e513d8fe7bf6a633a6b402d991f0689f124d948a..5c381ececde38ce78370014eae1b1d228c841c75 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/FLY.Thick.Blowing.csproj
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/FLY.Thick.Blowing.csproj
@@ -88,6 +88,7 @@
     <Compile Include="Server\Model\OrgDbModel.cs" />
     <Compile Include="Server\ScanWarning.cs" />
     <Compile Include="Server\TDGage.cs" />
+    <Compile Include="Server\ThickPlcModbusTcpServer.cs" />
   </ItemGroup>
   <ItemGroup>
     <Content Include="FodyWeavers.xml">
@@ -111,6 +112,10 @@
       <Project>{5ee61ac6-5269-4f0f-b8fa-4334fe4a678f}</Project>
       <Name>Misc</Name>
     </ProjectReference>
+    <ProjectReference Include="..\..\thick_public\Project.FLY.ModbusMapper\FLY.ModbusMapper\FLY.ModbusMapper.csproj">
+      <Project>{6d4b9bda-2a66-4583-b244-758bc4213d9f}</Project>
+      <Name>FLY.ModbusMapper</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\thick_public\Project.FLY.OBJComponents\OBJComponents\FLY.OBJComponents.csproj">
       <Project>{a539505d-9ac0-426b-a9a0-197df50598b0}</Project>
       <Name>FLY.OBJComponents</Name>
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/IService/IBulkDBService.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/IService/IBulkDBService.cs
index c59fcd07f5c412d0ad98d389f01f600aaebfffef..3dc8594bbed8c0fc5873eff09102ad08ba74fd5d 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/IService/IBulkDBService.cs
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/IService/IBulkDBService.cs
@@ -177,6 +177,7 @@ namespace FLY.Thick.Blowing.IService
 
     public class TrendValue
     {
+        public long ScanDataID { get; set; }
         public double Sigma { get; set; }
         public double Value { get; set; }
         public DateTime Time { get; set; }
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/Server/Model/BulkDB.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/Server/Model/BulkDB.cs
index a06f12dc90ef674816d52fe0a2a659aa87995be3..f3f2074751d73f0cb66d8ce63ae4f16b427198e2 100644
--- a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/Server/Model/BulkDB.cs
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/Server/Model/BulkDB.cs
@@ -58,6 +58,18 @@ namespace FLY.Thick.Blowing.Server.Model
         /// </summary>
         public bool IsFinished { get; private set; }
 
+        /// <summary>
+        /// 混合数据,时间范围
+        /// 大于 TimeSpan.Zero 起作用
+        /// </summary>
+        public TimeSpan MixDataTimeRange { get; set; } = TimeSpan.FromMinutes(5);
+
+        /// <summary>
+        /// 混合数据,均值波动范围
+        /// 大于 0 起作用
+        /// </summary>
+        public double MixDataAvgRange { get; set; } = 5;
+
         /// <summary>
         /// 
         /// </summary>
@@ -249,7 +261,7 @@ namespace FLY.Thick.Blowing.Server.Model
                 if (lc_scanDatas.Count() > 1)
                 {
                     //求均值
-                    lc_scanData.Thicks = GetMixScanData(lc_scanDatas, 0, lc_scanDatas.Count());
+                    lc_scanData.Thicks = GetMixScanData(lc_scanDatas);
                 }
 
                 reponse.scanData = lc_scanData;
@@ -273,16 +285,15 @@ namespace FLY.Thick.Blowing.Server.Model
         /// 获取纵向趋势图
         /// </summary>
         /// <param name="request"></param>
-        /// <param name="asyncDelegate"></param>
-        /// <param name="asyncContext"></param>
+        /// <param name="AsyncDelegate"></param>
+        /// <param name="AsyncContext"></param>
         public async void GetTrend(Pack_GetTrendRequest request, AsyncCBHandler asyncDelegate, object asyncContext)
         {
-            //TODO 需要异步
             Pack_GetTrendReponse reponse = new Pack_GetTrendReponse();
             reponse.Request = request;
 
-            if (request.Count > 400)//数量限制,避免死机
-                request.Count = 400;
+            if (request.Count > 200)//数量限制,避免死机
+                request.Count = 200;
             else if (request.Count < 1)
                 request.Count = 1;
 
@@ -295,112 +306,241 @@ namespace FLY.Thick.Blowing.Server.Model
                 request.Interval = 1;
 
 
-                await Task.Factory.StartNew(() =>
+            await Task.Factory.StartNew(() =>
+            {
+                List<Db_ScanData> db_scandatas = null;
+
+                if (request.Interval <= request.Mix)
                 {
-                    List<Db_ScanData> db_scandatas=null;
+                    //间隔<=混合,全部数据连续获取
+                    int cnt = request.Count * request.Interval + request.Mix - 1;
                     if (!request.IsSearchByTime)
                     {
                         if (request.Id <= 0)
                             db_scandatas = dbModel.TbScanData.Find(
-                                $"WHERE {nameof(Db_ScanData.ID)} % {request.Interval} = 0" +
-                                $" ORDER BY {nameof(Db_ScanData.ID)} DESC" +
-                                $" LIMIT {request.Mix + request.Count - 1} OFFSET {-request.Id}");
+                                $" ORDER BY ID DESC" +
+                                $" LIMIT {cnt} OFFSET {-request.Id}");
                         else
                             db_scandatas = dbModel.TbScanData.Find(
-                                $"WHERE ({nameof(Db_ScanData.ID)} <= {request.Id})" +
-                                $" AND ({nameof(Db_ScanData.ID)} % {request.Interval} = 0)" +
-                                $" ORDER BY {nameof(Db_ScanData.ID)} DESC" +
-                                $" LIMIT {request.Mix + request.Count - 1}");
+                                $"WHERE (ID <= {request.Id})" +
+                                $" ORDER BY ID DESC" +
+                                $" LIMIT {cnt}");
                     }
-                    else 
+                    else
                     {
                         db_scandatas = dbModel.TbScanData.Find(
                                 $"WHERE ({nameof(Db_ScanData.Time)} <= {request.Time.ToStringOfSQLiteFieldType()})" +
-                                $" AND ({nameof(Db_ScanData.ID)} % {request.Interval} = 0)" +
-                                $" ORDER BY {nameof(Db_ScanData.ID)} DESC" +
-                                $" LIMIT {request.Mix + request.Count - 1}");
+                                $" ORDER BY ID DESC" +
+                                $" LIMIT {cnt}");
                     }
+                }
+                else
+                {
+                    //间隔>混合 隔段获取
+                    int cnt = request.Count * request.Mix;
+                    if (!request.IsSearchByTime)
+                    {
+                        if (request.Id <= 0)
+                            db_scandatas = dbModel.TbScanData.Find(
+                                $"WHERE ID % {request.Interval} < {request.Mix}" +
+                                $" ORDER BY ID DESC" +
+                                $" LIMIT {cnt} OFFSET {-request.Id}");
+                        else
+                            db_scandatas = dbModel.TbScanData.Find(
+                                $"WHERE (ID <= {request.Id})" +
+                                $" AND ( ID % {request.Interval} < {request.Mix})" +
+                                $" ORDER BY ID DESC" +
+                                $" LIMIT {cnt}");
+                    }
+                    else
+                    {
+                        db_scandatas = dbModel.TbScanData.Find(
+                                $"WHERE ({nameof(Db_ScanData.Time)} <= {request.Time.ToStringOfSQLiteFieldType()})" +
+                                $" AND ( ID % {request.Interval} < {request.Mix})" +
+                                $" ORDER BY ID DESC" +
+                                $" LIMIT {cnt}");
+                    }
+                }
 
-
-                    if (db_scandatas.Count() == 0)
-                        return;
+                if (db_scandatas.Count() == 0)
+                    return;
 
                 //从尾向前排的!!!!
                 var lc_scanDatas = Lc_AutoMapperProfile.Mapper.Map<List<Db_ScanData>, List<Lc_ScanData>>(db_scandatas);
 
-                    reponse.Values = ToTrend(lc_scanDatas, request.Count, request.Mix);
+                reponse.Values = ToTrend2(lc_scanDatas, request.Count, request.Mix, request.Interval);
 
-                    var lc_scanData = lc_scanDatas.First();
-                    reponse.ScanDataId = lc_scanData.ID;
+                var lc_scanData = lc_scanDatas.First();
+                reponse.ScanDataId = lc_scanData.ID;
 
 
-                });
-            
+            });
+
             asyncDelegate(asyncContext, reponse);
         }
 
-        double[] GetMixScanData(List<Lc_ScanData> lc_scanDatas, int offset, int mix)
+        double[] GetMixScanData(List<Lc_ScanData> lc_scanDatas)
         {
 
-            var lc_scanData = lc_scanDatas[offset];
+            var lc_scanData = lc_scanDatas[0];
             //求均值
             double[] thks = new double[lc_scanData.Thicks.Count()];
-            int cnt = 0;
-            for (int j = offset; j < offset + mix && j < lc_scanDatas.Count(); j++)
+            int[] cnt = new int[thks.Count()];
+            for (int j = 0; j < lc_scanDatas.Count(); j++)
             {
                 int index = j;
                 if (lc_scanDatas[index].Thicks.Count() != thks.Count())
                 {
-                    //结束
+                    //结束,异常
                     break;
                 }
 
                 for (int i = 0; i < thks.Count(); i++)
                 {
-                    thks[i] += lc_scanDatas[index].Thicks[i];
+                    var v = lc_scanDatas[index].Thicks[i];
+                    if (!double.IsNaN(v))
+                    {
+                        thks[i] += v;
+                        cnt[i]++;
+                    }
                 }
-                cnt++;
             }
             for (int i = 0; i < thks.Count(); i++)
             {
-                thks[i] /= cnt;
+                if (cnt[i] > 0)
+                    thks[i] /= cnt[i];
+                else
+                    thks[i] = double.NaN;
             }
 
             return thks;
         }
-        List<TrendValue> ToTrend(List<Lc_ScanData> lc_scanDatas, int count, int mix)
+
+        double[] GetMixScanData(List<Lc_ScanData> lc_scanDatas, int offset, int mix, out int realMix)
         {
+            //lc_scanDatas[0] 是最新的数据!!
+
+            List<Lc_ScanData> lc_scanDatas2 = new List<Lc_ScanData>();
+            for (int i = 0; i < mix; i++)
+            {
+                int index = offset + i;
+                if (index >= lc_scanDatas.Count())
+                    break;
+                lc_scanDatas2.Add(lc_scanDatas[offset + i]);
+            }
 
-            if (mix == 1)
+            //连续两幅图时间间隔 大于 MixDataTimeRange 删除
+            if (MixDataTimeRange > TimeSpan.Zero)
             {
-                return lc_scanDatas.Select(sd =>
+                for (int i = 1; i < lc_scanDatas2.Count(); i++)
                 {
-                    double avg = sd.Thicks.AverageNoNull();
-                    double sigma = sd.Thicks.Sigma();
-                    return new TrendValue()
+                    var scanData0 = lc_scanDatas2[i - 1];
+                    var scanData1 = lc_scanDatas2[i];
+                    if (scanData0.Time - scanData1.Time > MixDataTimeRange)
                     {
-                        Sigma = sigma,
-                        Value = avg,
-                        Time = sd.Time
-                    };
-                }).ToList();
+                        lc_scanDatas2.RemoveRange(i, lc_scanDatas2.Count() - i);
+                        break;
+                    }
+                }
             }
 
-            List<TrendValue> trendValues = new List<TrendValue>();
+            //把 均值与 最新的一幅图 的均值 偏差 大于 MixDataAvgRange 删除
+            if (MixDataAvgRange > 0)
+            {
+                var newest_scanData = lc_scanDatas2[0];
+
+                //注意数据是没有剔除的, 计算平均值时,要明确范围
+                var newest_avg = Misc.MyMath.Avg(newest_scanData.Thicks);
+
+                if (!double.IsNaN(newest_avg))
+                {
+                    for (int i = 1; i < lc_scanDatas2.Count(); i++)
+                    {
+                        var scanData = lc_scanDatas2[i];
+
+                        var avg = Misc.MyMath.Avg(scanData.Thicks);
+                        if (double.IsNaN(avg))//一幅数据异常,全部删除
+                        {
+                            lc_scanDatas2.RemoveRange(i, lc_scanDatas2.Count() - i);
+                            break;
+                        }
+
+                        //变化太大
+                        if (Math.Abs(newest_avg - avg) > MixDataAvgRange)
+                        {
+                            lc_scanDatas2.RemoveRange(i, lc_scanDatas2.Count() - i);
+                            break;
+                        }
+                    }
+                }
+                else
+                {
+                    lc_scanDatas2.RemoveRange(1, lc_scanDatas2.Count() - 1);
+                }
+            }
+
+            realMix = lc_scanDatas2.Count();
 
-            for (int i = 0; i < lc_scanDatas.Count() && i < count; i++)
+            if (lc_scanDatas2.Count() > 1)
             {
                 //求均值
-                double[] thks = GetMixScanData(lc_scanDatas, i, mix);
-                double avg = thks.AverageNoNull();
-                double sigma = thks.Sigma();
+                return GetMixScanData(lc_scanDatas2);
+            }
+            else
+            {
+                return lc_scanDatas2.First().Thicks.ToArray();
+            }
+
+
+        }
+
+
+        List<TrendValue> ToTrend2(List<Lc_ScanData> lc_scanDatas, int count, int mix, int interval)
+        {
+            // lc_scanDatas.First() 是ID最大的数据
+
+            //if (mix == 1)
+            //{
+            //    return lc_scanDatas.Select(sd =>
+            //    {
+            //        double avg = sd.Thicks.AverageNoNull();
+            //        double sigma = sd.Thicks.Sigma();
+            //        return new TrendValue()
+            //        {
+            //            ScanDataID = sd.ID,
+            //            ProfileID = sd.ProfileID,
+            //            Sigma = sigma,
+            //            Value = avg,
+            //            Time = sd.Time
+            //        };
+            //    }).ToList();
+            //}
+
+            List<TrendValue> trendValues = new List<TrendValue>();
 
-                trendValues.Add(new TrendValue()
+            for (int i = 0; i < lc_scanDatas.Count(); i++)
+            {
+                var sd = lc_scanDatas[i];
+                if (sd.ID % interval == 0)
                 {
-                    Sigma = sigma,
-                    Value = avg,
-                    Time = lc_scanDatas[i].Time
-                });
+                    //它是数据点
+                    double[] thks = GetMixScanData(lc_scanDatas, i, mix, out int _m);
+
+                    //求均值
+                    double avg = thks.AverageNoNull();
+                    double sigma = thks.Sigma();
+
+                    trendValues.Add(new TrendValue()
+                    {
+                        ScanDataID = sd.ID,
+                        Sigma = sigma,
+                        Value = avg,
+                        Time = lc_scanDatas[i].Time
+                    });
+                    if (trendValues.Count() >= count)
+                        break;//完成
+                }
+
             }
             return trendValues;
         }
diff --git a/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/Server/ThickPlcModbusTcpServer.cs b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/Server/ThickPlcModbusTcpServer.cs
new file mode 100644
index 0000000000000000000000000000000000000000..150ec7e2323991461176a445278721ec979990ac
--- /dev/null
+++ b/Project.FLY.Thick.Blowing/FLY.Thick.Blowing/Server/ThickPlcModbusTcpServer.cs
@@ -0,0 +1,210 @@
+using FLY.Thick.Blowing.IService;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using Misc;
+using System.IO;
+using Newtonsoft.Json;
+
+namespace FLY.Thick.Blowing.Server
+{
+    public class ThickPlcModbusTcpServer:INotifyPropertyChanged
+    {
+        const int ADDR_ID = 0;
+        const int ADDR_DateTimeYear = 1;
+        const int ADDR_DateTimeMonth = 2;
+        const int ADDR_DateTimeDay = 3;
+        const int ADDR_DateTimeHour = 4;
+        const int ADDR_DateTimeMinute = 5;
+        const int ADDR_DateTimeSecond = 6;
+        const int ADDR_Average = 7;
+        const int ADDR_Sigma2 = 8;
+        const int ADDR_Sigma2Percent = 9;
+        const int ADDR_Count = 10;
+        const int ADDR_Datas = 11;
+        const int DatasCap = 199 - 11 + 1;
+
+        FLY.Modbus.WithThread.ServerTCP server;
+        IBulkDbService bulkDbService;
+
+        public event PropertyChangedEventHandler PropertyChanged;
+
+        public string ServerAddr { get; set; } = "0.0.0.0:1502";
+        public FLY.Modbus.WithThread.ServerTCP ModbusTcpServer => server;
+        UInt16[] regs = new UInt16[200];
+        UInt16[] regs2 = new UInt16[200];
+
+        public ThickPlcModbusTcpServer() 
+        {
+            if (!Load()) 
+            {
+                Save();
+            }
+        }
+        public void Init(IBulkDbService bulkDbService) 
+        {
+            this.bulkDbService = bulkDbService;
+            server = new FLY.Modbus.WithThread.ServerTCP(Misc.StringConverter.ToIPEndPoint(ServerAddr),
+                GetValue, SetValue);
+            server.Start();
+
+            this.bulkDbService.PropertyChanged += BulkDbService_PropertyChanged;
+            updateDatas();
+        }
+
+        private void BulkDbService_PropertyChanged(object sender, PropertyChangedEventArgs e)
+        {
+            if (e.PropertyName == nameof(bulkDbService.LastScanDataId)) 
+            {
+                updateDatas();
+            }
+        }
+        void updateDatas() 
+        {
+            this.bulkDbService.GetFrame(new Pack_GetFrameRequest() { Id = 0, Mix = 1 },
+            (object asyncContext, object retData) =>
+            {
+                
+                var reponse = retData as Pack_GetFrameReponse;
+                if (reponse.scanData == null) {
+                    //没有数据
+                    return;
+                }
+
+                var scanData = reponse.scanData;
+
+                regs2[ADDR_ID] = (UInt16)scanData.ID;
+                regs2[ADDR_DateTimeYear] = (UInt16)scanData.Time.Year;
+                regs2[ADDR_DateTimeMonth] = (UInt16)scanData.Time.Month;
+                regs2[ADDR_DateTimeDay] = (UInt16)scanData.Time.Day;
+                regs2[ADDR_DateTimeHour] = (UInt16)scanData.Time.Hour;
+                regs2[ADDR_DateTimeMinute] = (UInt16)scanData.Time.Minute;
+                regs2[ADDR_DateTimeSecond] = (UInt16)scanData.Time.Second;
+
+                if (scanData.Thicks != null)
+                {
+                    double avg = scanData.Thicks.AverageNoNull();
+                    if (!double.IsNaN(avg))
+                    {
+                        regs2[ADDR_Average] = (UInt16)(avg * 10);
+                        double sigma2 = scanData.Thicks.Sigma() * 2;
+                        regs2[ADDR_Sigma2] = (UInt16)(sigma2 * 10);
+                        double sigma2Percent = sigma2 / avg * 100;
+                        regs2[ADDR_Sigma2Percent] = (UInt16)(sigma2Percent * 10);
+                        regs2[ADDR_Count] = (UInt16)scanData.Thicks.Count();
+                        for (int i = 0; i < scanData.Thicks.Count() && i < DatasCap; i++)
+                        {
+                            var d = scanData.Thicks[i];
+                            if (!double.IsNaN(avg))
+                            {
+                                regs2[ADDR_Datas + i] = (UInt16)(d * 10);
+                            }
+                            else
+                            {
+                                regs2[ADDR_Datas + i] = 0;
+                            }
+                        }
+                    }
+                    else
+                    {
+                        clearDatas(regs2);
+                    }
+                }
+                else
+                {
+                    clearDatas(regs2);
+                }
+
+
+                lock (regs) 
+                {
+                    Array.Copy(regs2, regs, regs.Count());
+                }
+            },
+            null);
+        }
+        void clearDatas(UInt16[] regs2)
+        {
+            for (int i = ADDR_Average; i < regs2.Count(); i++)
+            {
+                regs2[i] = 0;
+            }
+        }
+        void GetValue(int addr, object values) 
+        {
+            if (addr < 0)
+                return;
+
+            if (values is UInt16[]) {
+                var uint16s = values as UInt16[];
+                int sourceIndex = addr;
+                int len = uint16s.Count();
+                if (sourceIndex >= regs.Count())
+                    return;
+
+                if(sourceIndex +len > regs.Count()) 
+                {
+                    len = regs.Count() - sourceIndex;
+                }
+
+                lock (regs)
+                {
+                    Array.Copy(regs, addr, uint16s, 0, len);
+                }
+            }
+        }
+        void SetValue(int addr, object values) 
+        {
+            
+        }
+
+
+        string file_path = "thickplc.json";
+        bool Load()
+        {
+            try
+            {
+                if (File.Exists(file_path))
+                {
+                    string json = File.ReadAllText(file_path);
+                    var jsonDb = JsonConvert.DeserializeObject<ThickPlcModbusTcpServerJsonDb>(json);
+                    this.ServerAddr = jsonDb.ServerAddr;
+                    return true;
+                }
+            }
+            catch
+            {
+                //异常,没有json 解码失败
+
+            }
+            return false;
+        }
+
+        public bool Save()
+        {
+            try
+            {
+                var jsonDb = new ThickPlcModbusTcpServerJsonDb() { ServerAddr = ServerAddr };
+                string json = JsonConvert.SerializeObject(jsonDb, Formatting.Indented);
+                File.WriteAllText(file_path, json);
+                return true;
+            }
+            catch
+            {
+                //异常,没有json 编码失败
+
+            }
+            return false;
+        }
+    }
+    public class ThickPlcModbusTcpServerJsonDb
+    {
+        public string ServerAddr = "0.0.0.0:1502";
+
+
+
+    }
+}
diff --git a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Client/Properties/AssemblyInfo.cs b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Client/Properties/AssemblyInfo.cs
index e0a0f6d13fa7fa7578935688d9504f6b91c8b7db..f3cf7e4664cf98a5f358a2f6943b5a4067e8b947 100644
--- a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Client/Properties/AssemblyInfo.cs
+++ b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Client/Properties/AssemblyInfo.cs
@@ -51,6 +51,6 @@ using System.Windows;
 //可以指定所有这些值,也可以使用“生成号”和“修订号”的默认值
 //通过使用 "*",如下所示:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("7.0.8")]
-[assembly: AssemblyFileVersion("7.0.8")]
+[assembly: AssemblyVersion("7.4.0.0")]
+[assembly: AssemblyFileVersion("7.4.0.0")]
 [assembly: Guid("38E0D8EC-4D1C-49FF-AB08-6289294C5BD4")]
diff --git a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/FLY.Thick.BlowingScan.UI.Server.csproj b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/FLY.Thick.BlowingScan.UI.Server.csproj
index bab6048726fe690421938038900f4d8448e922e1..6acab576365aa82d01fee9f67785539e03a52ec7 100644
--- a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/FLY.Thick.BlowingScan.UI.Server.csproj
+++ b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/FLY.Thick.BlowingScan.UI.Server.csproj
@@ -165,6 +165,10 @@
       <Project>{5ee61ac6-5269-4f0f-b8fa-4334fe4a678f}</Project>
       <Name>Misc</Name>
     </ProjectReference>
+    <ProjectReference Include="..\..\thick_public\Project.FLY.ModbusMapper\FLY.ModbusMapper\FLY.ModbusMapper.csproj">
+      <Project>{6d4b9bda-2a66-4583-b244-758bc4213d9f}</Project>
+      <Name>FLY.ModbusMapper</Name>
+    </ProjectReference>
     <ProjectReference Include="..\..\thick_public\Project.FLY.Thick.Base\FLY.Thick.Base\FLY.Thick.Base.csproj">
       <Project>{91a1aafe-a528-4c2e-a48a-9259e780255a}</Project>
       <Name>FLY.Thick.Base</Name>
diff --git a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/MainWindow.xaml.cs b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/MainWindow.xaml.cs
index 399800f7d077f31b92d3b2b3e1486555cb23ee6e..b439b54788c27df1ba109ec874555bf0b58afbb5 100644
--- a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/MainWindow.xaml.cs
+++ b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/MainWindow.xaml.cs
@@ -10,7 +10,7 @@ using System.Text;
 using System.Threading.Tasks;
 using System.Windows;
 using System.Windows.Navigation;
-
+using ThickPlcModbusTcpServer = FLY.Thick.Blowing.Server.ThickPlcModbusTcpServer;
 namespace FLY.Thick.BlowingScan.UI.Server
 {
     /// <summary>
@@ -21,6 +21,7 @@ namespace FLY.Thick.BlowingScan.UI.Server
         FLY.AppHelper.WindowNotifyIconHelper notifyiconhelper;
         TDGage mGage;
         OBJProxys mOBJProxy;
+        ThickPlcModbusTcpServer thickPlcModbusTcpServer;
         public MainWindow()
         {
             InitializeComponent();
@@ -40,12 +41,15 @@ namespace FLY.Thick.BlowingScan.UI.Server
 
             mOBJProxy = new OBJProxys(0, mGage);
 
+            thickPlcModbusTcpServer = new ThickPlcModbusTcpServer();
+            thickPlcModbusTcpServer.Init(mGage.bulkDb);
+
             FObjBase.PollModule.Current.Start();
 
 
             this.Hide();
             PgMain p = new PgMain();
-            p.Init(mGage);
+            p.Init(mGage,thickPlcModbusTcpServer);
             this.Navigate(p);
             this.NavigationService.RemoveBackEntry();
 
diff --git a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/PgMain.xaml b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/PgMain.xaml
index 871382d726f9dfb103f96123b9fa850c244dd038..2f786f3366a8122877a64c7ac412ccc9df6c9169 100644
--- a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/PgMain.xaml
+++ b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/PgMain.xaml
@@ -58,6 +58,34 @@
                     <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding Position}"/>
                 </StackPanel>
             </StackPanel>
+            <StackPanel Orientation="Horizontal" Margin="{StaticResource ControlMargin}" DataContext="{Binding ModbusTcpServer}">
+                <StackPanel Margin="{StaticResource ControlMargin}">
+                    <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="ModbusTcp服务地址"/>
+                    <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding LocalEP}"/>
+                </StackPanel>
+                <StackPanel Margin="{StaticResource ControlMargin}">
+                    <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="状态"/>
+                    <TextBlock>
+                        <TextBlock.Style>
+                            <Style TargetType="TextBlock" BasedOn="{StaticResource Styles.Text.FieldContent}">
+                                <Setter Property="Foreground" Value="Red"/>
+                                <Setter Property="Text" Value="停止"/>
+                                <Style.Triggers>
+                                    <DataTrigger Binding="{Binding IsRunning}" Value="True">
+                                        <Setter Property="Foreground" Value="Green"/>
+                                        <Setter Property="Text" Value="工作中"/>
+                                    </DataTrigger>
+                                </Style.Triggers>
+                            </Style>
+                        </TextBlock.Style>
+                    </TextBlock>
+                </StackPanel>
+                <StackPanel Margin="{StaticResource ControlMargin}">
+                    <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="当前连接数"/>
+                    <TextBlock Style="{StaticResource Styles.Text.FieldContent}" Text="{Binding ConnectedCnt}"/>
+                </StackPanel>
+            </StackPanel>
+
         </StackPanel>
     </Grid>
 </Page>
diff --git a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/PgMain.xaml.cs b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/PgMain.xaml.cs
index abf3b2df06f77cc3c528be77e14be73e7387ae2d..fb5c9d83543b9decd1c8f3c7a201de09521339f4 100644
--- a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/PgMain.xaml.cs
+++ b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/PgMain.xaml.cs
@@ -13,6 +13,7 @@ using System.Text;
 using System.Threading.Tasks;
 using System.Windows.Controls;
 using System.Windows.Data;
+using ThickPlcModbusTcpServer = FLY.Thick.Blowing.Server.ThickPlcModbusTcpServer;
 
 namespace FLY.Thick.BlowingScan.UI.Server
 {
@@ -26,10 +27,10 @@ namespace FLY.Thick.BlowingScan.UI.Server
         {
             InitializeComponent();
         }
-        public void Init(TDGage mGage) 
+        public void Init(TDGage mGage, ThickPlcModbusTcpServer thickPlcModbusTcpServer) 
         {
             viewModel = new PgMainVm();
-            viewModel.Init(mGage);
+            viewModel.Init(mGage, thickPlcModbusTcpServer);
             this.DataContext = viewModel;
             
         }
@@ -46,7 +47,10 @@ namespace FLY.Thick.BlowingScan.UI.Server
         public RelayCommand SaveDebugCmd { get; private set; }
 
         public RelayCommand DebugCmd { get; private set; }
+
+        public FLY.Modbus.WithThread.ServerTCP ModbusTcpServer{get;set;}
         TDGage mGage;
+        ThickPlcModbusTcpServer thickPlcModbusTcpServer;
         public PgMainVm()
         {
             SetupCmd = new RelayCommand(Setup);
@@ -56,11 +60,13 @@ namespace FLY.Thick.BlowingScan.UI.Server
 
 
 
-        public void Init(TDGage mGage)
+        public void Init(TDGage mGage, ThickPlcModbusTcpServer thickPlcModbusTcpServer)
         {
             this.mGage = mGage;
+            this.thickPlcModbusTcpServer = thickPlcModbusTcpServer;
             SysParam = mGage.sysParam;
             FlyAd = mGage.flyAd;
+            ModbusTcpServer = thickPlcModbusTcpServer.ModbusTcpServer;
         }
 
         private void OpenWdDebug()
@@ -74,7 +80,7 @@ namespace FLY.Thick.BlowingScan.UI.Server
             //打开设置页面
 
             WdSetup w = new WdSetup();
-            w.Init(SysParam, FlyAd);
+            w.Init(SysParam, FlyAd, thickPlcModbusTcpServer);
             w.Owner = App.Current.MainWindow;
             w.ShowDialog();
         }
diff --git a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/Properties/AssemblyInfo.cs b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/Properties/AssemblyInfo.cs
index 9a2c9fbba76147f337cc0f23b4fb10d5eb0c4982..748a7259ca563ce92e0b53c03acfc9cf412bc9a5 100644
--- a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/Properties/AssemblyInfo.cs
+++ b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/Properties/AssemblyInfo.cs
@@ -51,7 +51,7 @@ using System.Windows;
 // 可以指定所有这些值,也可以使用“内部版本号”和“修订号”的默认值,
 // 方法是按如下所示使用“*”:
 // [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("7.0.9.0")]
-[assembly: AssemblyFileVersion("7.0.9.0")]
+[assembly: AssemblyVersion("7.1.1.0")]
+[assembly: AssemblyFileVersion("7.1.1.0")]
 [assembly: Guid("A2277244-BCD4-485B-85F4-AAE96DA235B5")]
 
diff --git a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/WdSetup.xaml b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/WdSetup.xaml
index 2f30b100fdb29ae3411f8c9791e97d87d1a1ec70..f875748b5000de975fbbecaab530e97f11c19ac2 100644
--- a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/WdSetup.xaml
+++ b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/WdSetup.xaml
@@ -24,6 +24,10 @@
                     <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="AD盒地址"/>
                     <TextBox Style="{StaticResource Styles.Text.FieldContent.Input}" Text="{Binding FlyAdAddr}"/>
                 </StackPanel>
+                <StackPanel Margin="{StaticResource ControlMargin}">
+                    <TextBlock Style="{StaticResource Styles.Text.FieldHeader}" Text="ModbusTcp地址"/>
+                    <TextBox Style="{StaticResource Styles.Text.FieldContent.Input}" Text="{Binding PlcAddr}"/>
+                </StackPanel>
             </StackPanel>
             <StackPanel Orientation="Horizontal" Margin="{StaticResource ControlMargin}">
                 <Button Style="{StaticResource Styles.Button.Square.Accent2}" 
diff --git a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/WdSetup.xaml.cs b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/WdSetup.xaml.cs
index e47ff409723a21a042f0cab39ef9f02c5c0d9071..7d97083dabebefca91a478d0282bb1bd7d94952a 100644
--- a/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/WdSetup.xaml.cs
+++ b/Project.FLY.Thick.BlowingScan/FLY.Thick.BlowingScan.UI.Server/WdSetup.xaml.cs
@@ -1,4 +1,5 @@
 using FLY.Thick.Base.Server;
+using FLY.Thick.Blowing.Server;
 using FlyADBase;
 using GalaSoft.MvvmLight.Command;
 using System;
@@ -28,10 +29,10 @@ namespace FLY.Thick.BlowingScan.UI.Server
         {
             InitializeComponent();
         }
-        public void Init(SysParam sysParam,FlyAD7 flyAd) 
+        public void Init(SysParam sysParam,FlyAD7 flyAd, ThickPlcModbusTcpServer thickPlcModbusTcpServer) 
         {
             viewModel = new WdSetupVm();
-            viewModel.Init(sysParam, flyAd);
+            viewModel.Init(sysParam, flyAd, thickPlcModbusTcpServer);
             this.DataContext = viewModel;
         }
     }
@@ -40,13 +41,13 @@ namespace FLY.Thick.BlowingScan.UI.Server
         public event PropertyChangedEventHandler PropertyChanged;
         public string Addr { get; set; }
         public string FlyAdAddr { get; set; }
-        
+        public string PlcAddr { get; set; }
 
         public RelayCommand OkCmd { get; private set; }
 
         SysParam sysParam;
         FlyAD7 flyAd;
-        InitParam initParam;
+        ThickPlcModbusTcpServer thickPlcModbusTcpServer;
         public WdSetupVm() 
         {
             OkCmd = new RelayCommand(Ok);
@@ -54,12 +55,15 @@ namespace FLY.Thick.BlowingScan.UI.Server
 
 
 
-        public void Init(SysParam sysParam, FlyAD7 flyAd) 
+        public void Init(SysParam sysParam, FlyAD7 flyAd, ThickPlcModbusTcpServer thickPlcModbusTcpServer) 
         {
             this.sysParam = sysParam;
             this.flyAd = flyAd;
+            this.thickPlcModbusTcpServer = thickPlcModbusTcpServer;
+
             Addr = sysParam.Addr;
             FlyAdAddr = flyAd.Addr;
+            PlcAddr = thickPlcModbusTcpServer.ServerAddr;
         }
 
         private void Ok()
@@ -75,6 +79,9 @@ namespace FLY.Thick.BlowingScan.UI.Server
             flyAd.Addr = FlyAdAddr;
             flyAd.Save();
 
+            thickPlcModbusTcpServer.ServerAddr = PlcAddr;
+            thickPlcModbusTcpServer.Save();
+
             System.Environment.CurrentDirectory = "../";
             AppHelper.AppJustOne.Restart();
         }
diff --git "a/Resource/\346\265\213\345\216\232\344\273\252PLC\345\234\260\345\235\200\350\241\250.xlsx" "b/Resource/\346\265\213\345\216\232\344\273\252PLC\345\234\260\345\235\200\350\241\250.xlsx"
deleted file mode 100644
index 1a5d8406c1c1fc3740a5cf9487226db74f5f1f49..0000000000000000000000000000000000000000
Binary files "a/Resource/\346\265\213\345\216\232\344\273\252PLC\345\234\260\345\235\200\350\241\250.xlsx" and /dev/null differ
diff --git "a/Resource/\346\265\213\345\216\232\344\273\252PLC\345\257\204\345\255\230\345\231\250\345\234\260\345\235\200\350\241\250.xlsx" "b/Resource/\346\265\213\345\216\232\344\273\252PLC\345\257\204\345\255\230\345\231\250\345\234\260\345\235\200\350\241\250.xlsx"
new file mode 100644
index 0000000000000000000000000000000000000000..33690192c1818fdc01e1aa50613af04b4e338e09
Binary files /dev/null and "b/Resource/\346\265\213\345\216\232\344\273\252PLC\345\257\204\345\255\230\345\231\250\345\234\260\345\235\200\350\241\250.xlsx" differ
diff --git a/thick_public b/thick_public
index 2801cd820617cf33995ede1e5ff94fbb042ee460..29ac9193eae1289aebf48fbf6acbb0d632549979 160000
--- a/thick_public
+++ b/thick_public
@@ -1 +1 @@
-Subproject commit 2801cd820617cf33995ede1e5ff94fbb042ee460
+Subproject commit 29ac9193eae1289aebf48fbf6acbb0d632549979
diff --git "a/\350\204\232\346\234\254/hemeiInstallZipVersionInfo.json" "b/\350\204\232\346\234\254/hemeiInstallZipVersionInfo.json"
index c7015a3449cf7f1555f54de0d9e97d126ac52f98..a3c4eb9f7becde54ceb4f948ba26d4fd21e652e9 100644
--- "a/\350\204\232\346\234\254/hemeiInstallZipVersionInfo.json"
+++ "b/\350\204\232\346\234\254/hemeiInstallZipVersionInfo.json"
@@ -1,4 +1,4 @@
 {
-  "InstallZipVersion":"7.0.9.2",
-  "InstallZipUrl":"http://server.flyautomation.net:8889/download/和美安装包_v7.0.9.2_20220609.7z"
+  "InstallZipVersion":"7.4.0",
+  "InstallZipUrl":"http://server.flyautomation.net:8889/download/和美安装包_v7.4.0_20220628.7z"
 }
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/install/CopyExe.exe" "b/\350\204\232\346\234\254/install/CopyExe.exe"
new file mode 100644
index 0000000000000000000000000000000000000000..7de3098a99d2062f7da94c7c4188089399850d7d
Binary files /dev/null and "b/\350\204\232\346\234\254/install/CopyExe.exe" differ
diff --git "a/\350\204\232\346\234\254/install/backupConfig.json" "b/\350\204\232\346\234\254/install/backupConfig.json"
new file mode 100644
index 0000000000000000000000000000000000000000..73a202fb578959ae7f1916c84f37c35ab09ca022
--- /dev/null
+++ "b/\350\204\232\346\234\254/install/backupConfig.json"
@@ -0,0 +1,10 @@
+{
+  "ServerAddr": "private.flyautomation.net:2155",
+  "LocalFilePath": "D:\\佛山市枫莱尔自动化技术有限公司\\windows",
+  "FtpPwd": "fly:flymeasure",
+  "LpName": "fly-1234",
+  "LpPaths": [
+    "D:\\佛山市枫莱尔自动化技术有限公司\\windows\\LP3\\lp.json",
+    "D:\\佛山市枫莱尔自动化技术有限公司\\windows\\FLY.LinkProxy.UI\\lp.json"
+  ]
+}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/feedback.json" "b/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/feedback.json"
index 999a65dbfbfb9ebfd8cede51783e423d955ba4c0..a2e3e9b15d2bb7cf627d49b7aecad0191e2177a8 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/feedback.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/feedback.json"
@@ -5,6 +5,7 @@
   "HasCheck": true,
   "Step": 5,
   "HeatsProductName": "default",
-  "HasCheckFilmVelocity": false,
-  "HeatsOfGroup": 12
+  "HasCheckFilmVelocity": true,
+  "HeatsOfGroup": 12,
+  "OffsetGraphYRangePercent": 3.0
 }
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/feedbackheats/default2.xml" "b/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/feedbackheats/default2.xml"
deleted file mode 100644
index c02636f21a6a20aa8e63ffdb8b5597fa51f9a431..0000000000000000000000000000000000000000
--- "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/feedbackheats/default2.xml"
+++ /dev/null
@@ -1,111 +0,0 @@
-<?xml version="1.0"?>
-<FeedbackHeatsMark xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-  <heats>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>20</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>25</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-    <int>0</int>
-  </heats>
-</FeedbackHeatsMark>
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/feedbackheats/\346\234\200\345\220\216\350\256\260\345\275\225.xml" "b/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/feedbackheats/\346\234\200\345\220\216\350\256\260\345\275\225.xml"
deleted file mode 100644
index 92624e7d34179b8310ed5d0ebcd9980933b4c9f0..0000000000000000000000000000000000000000
--- "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/feedbackheats/\346\234\200\345\220\216\350\256\260\345\275\225.xml"
+++ /dev/null
@@ -1,93 +0,0 @@
-<?xml version="1.0"?>
-<FeedbackHeatsMark xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-  <heats>
-    <int>17</int>
-    <int>19</int>
-    <int>19</int>
-    <int>10</int>
-    <int>10</int>
-    <int>10</int>
-    <int>4</int>
-    <int>10</int>
-    <int>10</int>
-    <int>10</int>
-    <int>18</int>
-    <int>27</int>
-    <int>35</int>
-    <int>43</int>
-    <int>44</int>
-    <int>37</int>
-    <int>34</int>
-    <int>27</int>
-    <int>21</int>
-    <int>16</int>
-    <int>16</int>
-    <int>22</int>
-    <int>28</int>
-    <int>22</int>
-    <int>22</int>
-    <int>22</int>
-    <int>31</int>
-    <int>40</int>
-    <int>38</int>
-    <int>32</int>
-    <int>36</int>
-    <int>34</int>
-    <int>36</int>
-    <int>38</int>
-    <int>28</int>
-    <int>40</int>
-    <int>40</int>
-    <int>40</int>
-    <int>46</int>
-    <int>40</int>
-    <int>40</int>
-    <int>34</int>
-    <int>34</int>
-    <int>40</int>
-    <int>34</int>
-    <int>38</int>
-    <int>38</int>
-    <int>34</int>
-    <int>28</int>
-    <int>28</int>
-    <int>18</int>
-    <int>16</int>
-    <int>8</int>
-    <int>5</int>
-    <int>3</int>
-    <int>8</int>
-    <int>14</int>
-    <int>8</int>
-    <int>8</int>
-    <int>10</int>
-    <int>12</int>
-    <int>7</int>
-    <int>5</int>
-    <int>0</int>
-    <int>3</int>
-    <int>7</int>
-    <int>14</int>
-    <int>18</int>
-    <int>14</int>
-    <int>16</int>
-    <int>16</int>
-    <int>16</int>
-    <int>14</int>
-    <int>6</int>
-    <int>16</int>
-    <int>16</int>
-    <int>4</int>
-    <int>10</int>
-    <int>10</int>
-    <int>14</int>
-    <int>16</int>
-    <int>4</int>
-    <int>16</int>
-    <int>12</int>
-    <int>15</int>
-    <int>23</int>
-    <int>24</int>
-    <int>16</int>
-  </heats>
-</FeedbackHeatsMark>
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/feedbackheats/\350\226\204\346\226\2312.xml" "b/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/feedbackheats/\350\226\204\346\226\2312.xml"
deleted file mode 100644
index 42eb15b032b8823da1616cf2a9e24b9b8103d12c..0000000000000000000000000000000000000000
--- "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/feedbackheats/\350\226\204\346\226\2312.xml"
+++ /dev/null
@@ -1,49 +0,0 @@
-<?xml version="1.0"?>
-<FeedbackHeatsMark xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
-  <heats>
-    <int>23</int>
-    <int>28</int>
-    <int>27</int>
-    <int>27</int>
-    <int>24</int>
-    <int>24</int>
-    <int>25</int>
-    <int>28</int>
-    <int>28</int>
-    <int>27</int>
-    <int>27</int>
-    <int>22</int>
-    <int>13</int>
-    <int>6</int>
-    <int>2</int>
-    <int>4</int>
-    <int>4</int>
-    <int>5</int>
-    <int>2</int>
-    <int>0</int>
-    <int>4</int>
-    <int>7</int>
-    <int>8</int>
-    <int>7</int>
-    <int>6</int>
-    <int>8</int>
-    <int>11</int>
-    <int>12</int>
-    <int>11</int>
-    <int>12</int>
-    <int>17</int>
-    <int>16</int>
-    <int>15</int>
-    <int>8</int>
-    <int>4</int>
-    <int>5</int>
-    <int>13</int>
-    <int>25</int>
-    <int>30</int>
-    <int>26</int>
-    <int>22</int>
-    <int>17</int>
-    <int>15</int>
-    <int>18</int>
-  </heats>
-</FeedbackHeatsMark>
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/heatbuf.json" "b/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/heatbuf.json"
deleted file mode 100644
index ee34ad4fa36d34aa1be71c630e1a48cf196e43ec..0000000000000000000000000000000000000000
--- "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/heatbuf.json"
+++ /dev/null
@@ -1,16 +0,0 @@
-{
-  "SearchAngleRange": 120,
-  "HeatEffectCurve": [
-    3,
-    4,
-    5,
-    6,
-    5,
-    4,
-    3
-  ],
-  "StableRange": 4,
-  "ThresholdR": 0.8,
-  "ThresholdMaxMin": 40,
-  "ThresholdSigmaMax": 25
-}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/heatcell.json" "b/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/heatcell.json"
deleted file mode 100644
index 66334e178bd4e8925b73745811de2e04c3cd23cd..0000000000000000000000000000000000000000
--- "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/heatcell.json"
+++ /dev/null
@@ -1,8 +0,0 @@
-{
-  "Kp": 4.0,
-  "IsAutoONo": true,
-  "MaxHeat": 100,
-  "ThresholdHeatSigma": 7.0,
-  "IsForbidUpDown": false,
-  "CtrlLine": 2
-}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/system.json" "b/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/system.json"
deleted file mode 100644
index a203281b372137a803222fd73d3bd3e06a610980..0000000000000000000000000000000000000000
--- "a/\350\204\232\346\234\254/release_conf/FLY.FeedbackRenZiJia.UI.Server/Gage1/system.json"
+++ /dev/null
@@ -1,5 +0,0 @@
-{
-  "OBJ_Port": 20007,
-  "BlowingAddr": "127.0.0.1:20006",
-  "DBKeepMonth": 6
-}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC-\346\270\251\345\214\272/scangraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC-\346\270\251\345\214\272/scangraph.json"
index 7695cce9d7ef1169ad3252fd786c3520b51c00b9..94ba69087de475f120b26ef3060ee4a02c7cdf03 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC-\346\270\251\345\214\272/scangraph.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC-\346\270\251\345\214\272/scangraph.json"
@@ -1 +1,58 @@
-{"Items":[{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":38906193},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":28924227},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":19758347},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":42299744},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":55117723},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":28715689}]}
\ No newline at end of file
+{
+  "Items": [
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -1,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 38906193
+    },
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": 0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 28924227
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -3,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 19758347
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -2,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 42299744
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -1,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 55117723
+    },
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": 0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 28715689
+    }
+  ]
+}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC-\346\270\251\345\214\272/trendgraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC-\346\270\251\345\214\272/trendgraph.json"
index 21e5a95b15350fb62dafe42b62cebb5fec9a1e83..3b67a460069a9307fbfbac1b5cb93eb8c07562ab 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC-\346\270\251\345\214\272/trendgraph.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC-\346\270\251\345\214\272/trendgraph.json"
@@ -1 +1,16 @@
-{"Items":[{"Len":120,"BeginNo":0,"EndNo":20,"IsAll":true,"Type":1,"XType":0,"BM":0,"YRangePercent":3.0,"Title":"趋势图","Mix":1,"IsAutoTarget":false,"IsPercent":false,"ID":48220637}]}
\ No newline at end of file
+{
+  "Items": [
+    {
+      "Interval": 1,
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "ID": 48220637
+    },
+    {
+      "Interval": 1,
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "ID": 38205102
+    }
+  ]
+}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC/scangraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC/scangraph.json"
index 7695cce9d7ef1169ad3252fd786c3520b51c00b9..94ba69087de475f120b26ef3060ee4a02c7cdf03 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC/scangraph.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC/scangraph.json"
@@ -1 +1,58 @@
-{"Items":[{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":38906193},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":28924227},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":19758347},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":42299744},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":55117723},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":28715689}]}
\ No newline at end of file
+{
+  "Items": [
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -1,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 38906193
+    },
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": 0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 28924227
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -3,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 19758347
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -2,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 42299744
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -1,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 55117723
+    },
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": 0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 28715689
+    }
+  ]
+}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC/trendgraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC/trendgraph.json"
index 21e5a95b15350fb62dafe42b62cebb5fec9a1e83..3b67a460069a9307fbfbac1b5cb93eb8c07562ab 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC/trendgraph.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\344\270\255\345\277\203\346\224\266\345\215\267-IBC/trendgraph.json"
@@ -1 +1,16 @@
-{"Items":[{"Len":120,"BeginNo":0,"EndNo":20,"IsAll":true,"Type":1,"XType":0,"BM":0,"YRangePercent":3.0,"Title":"趋势图","Mix":1,"IsAutoTarget":false,"IsPercent":false,"ID":48220637}]}
\ No newline at end of file
+{
+  "Items": [
+    {
+      "Interval": 1,
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "ID": 48220637
+    },
+    {
+      "Interval": 1,
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "ID": 38205102
+    }
+  ]
+}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\346\224\266\345\215\267-IBC/scangraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\346\224\266\345\215\267-IBC/scangraph.json"
index 7695cce9d7ef1169ad3252fd786c3520b51c00b9..94ba69087de475f120b26ef3060ee4a02c7cdf03 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\346\224\266\345\215\267-IBC/scangraph.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\346\224\266\345\215\267-IBC/scangraph.json"
@@ -1 +1,58 @@
-{"Items":[{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":38906193},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":28924227},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":19758347},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":42299744},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":55117723},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":28715689}]}
\ No newline at end of file
+{
+  "Items": [
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -1,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 38906193
+    },
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": 0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 28924227
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -3,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 19758347
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -2,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 42299744
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -1,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 55117723
+    },
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": 0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 28715689
+    }
+  ]
+}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\346\224\266\345\215\267-IBC/trendgraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\346\224\266\345\215\267-IBC/trendgraph.json"
index 21e5a95b15350fb62dafe42b62cebb5fec9a1e83..3b67a460069a9307fbfbac1b5cb93eb8c07562ab 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\346\224\266\345\215\267-IBC/trendgraph.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215-\346\224\266\345\215\267-IBC/trendgraph.json"
@@ -1 +1,16 @@
-{"Items":[{"Len":120,"BeginNo":0,"EndNo":20,"IsAll":true,"Type":1,"XType":0,"BM":0,"YRangePercent":3.0,"Title":"趋势图","Mix":1,"IsAutoTarget":false,"IsPercent":false,"ID":48220637}]}
\ No newline at end of file
+{
+  "Items": [
+    {
+      "Interval": 1,
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "ID": 48220637
+    },
+    {
+      "Interval": 1,
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "ID": 38205102
+    }
+  ]
+}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/graphcustom.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/graphcustom.json"
index 3f69bf1b5219d40b7937265a7636537321e55cbc..dd01c023f53929633d62a8458e1a65c5e1abd267 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/graphcustom.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/graphcustom.json"
@@ -151,6 +151,23 @@
             false
           ],
           "Header": "定点"
+        },
+        {
+          "Graphs": [
+            {
+              "ID": 21144166,
+              "Rect": "0, 0, 1, 1"
+            }
+          ],
+          "ColumnCount": 1,
+          "RowCount": 1,
+          "RowDefinitions": [
+            false
+          ],
+          "ColumnDefinitions": [
+            false
+          ],
+          "Header": "趋势2"
         }
       ],
       "Components": [
@@ -263,6 +280,11 @@
           "ID": 28792051,
           "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_FixGraph",
           "ServiceContainerName": "gage0.service"
+        },
+        {
+          "ID": 21144166,
+          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_TrendGraph2",
+          "ServiceContainerName": "gage0.service"
         }
       ]
     }
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/scangraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/scangraph.json"
index 15e8787aa2fec76b158bf3b61cce891e8e0fb1d4..6a2afa19c600d660156e8df0daa7d1b178448e32 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/scangraph.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/scangraph.json"
@@ -1 +1,67 @@
-{"Items":[{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":48499956},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":65534206},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":53749713},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":18063994},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":21125878},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":59933635}]}
\ No newline at end of file
+{
+  "Items": [
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -1,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 48499956
+    },
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": 0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 65534206
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -3,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 53749713
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -2,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 18063994
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -1,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 21125878
+    },
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": 0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 59933635
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": 0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 21144166
+    }
+  ]
+}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/scangraphcircular.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/scangraphcircular.json"
index 9b09671e8e31e6b924b4284dfd27ee76c7dbbdb8..04cdc7db3a4e8b0b853aa3fc62c9e88bd6e11834 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/scangraphcircular.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/scangraphcircular.json"
@@ -1 +1,17 @@
-{"Items":[{"Mix":1,"Number":0,"YRangePercent":3.0,"IsPercent":true,"IsAutoTarget":true,"HasAlianZone":false,"AlianZoneBoltNoOf3oClock":1.0,"AlianZoneBoltCnt":8,"AlianZoneIsCCW":false,"AlianZoneIsShowXStep":false,"ID":59832238}]}
\ No newline at end of file
+{
+  "Items": [
+    {
+      "Mix": 1,
+      "Number": 0,
+      "YRangePercent": 3.0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "HasAlianZone": false,
+      "AlianZoneBoltNoOf3oClock": 1.0,
+      "AlianZoneBoltCnt": 8,
+      "AlianZoneIsCCW": false,
+      "AlianZoneIsShowXStep": false,
+      "ID": 59832238
+    }
+  ]
+}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/trendgraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/trendgraph.json"
index 21e5a95b15350fb62dafe42b62cebb5fec9a1e83..2bf8559b75f1f301b8ddab88d972e9d0c8fbfa2a 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/trendgraph.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/trendgraph.json"
@@ -1 +1,16 @@
-{"Items":[{"Len":120,"BeginNo":0,"EndNo":20,"IsAll":true,"Type":1,"XType":0,"BM":0,"YRangePercent":3.0,"Title":"趋势图","Mix":1,"IsAutoTarget":false,"IsPercent":false,"ID":48220637}]}
\ No newline at end of file
+{
+  "Items": [
+    {
+      "Interval": 1,
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "ID": 39249953
+    },
+    {
+      "Interval": 1,
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "ID": 21144166
+    }
+  ]
+}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257/graphcustom.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257/graphcustom.json"
index 19a37d041c70449226e65cfc66d74f421ea0d018..cd3713a6b3754ab1c714fccc8a842d4516fbadf9 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257/graphcustom.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257/graphcustom.json"
@@ -79,14 +79,13 @@
         {
           "Graphs": [
             {
-              "ID": 26380169,
+              "ID": 50447774,
               "Rect": "0, 0, 1, 1"
             }
           ],
           "ColumnCount": 1,
-          "RowCount": 2,
+          "RowCount": 1,
           "RowDefinitions": [
-            false,
             false
           ],
           "ColumnDefinitions": [
@@ -207,8 +206,8 @@
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 26380169,
-          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_TrendGraph",
+          "ID": 50447774,
+          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_TrendGraph2",
           "ServiceContainerName": "gage0.service"
         },
         {
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257/scangraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257/scangraph.json"
index d265d303386a91818194c951dabba18a71a2297a..f06d42347187f64b5ce244fc53ab71d448e6f833 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257/scangraph.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257/scangraph.json"
@@ -1 +1,67 @@
-{"Items":[{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":10616756},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":32390328},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":26933797},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":29950811},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":23426098},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":50354517}]}
\ No newline at end of file
+{
+  "Items": [
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -1,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 10616756
+    },
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": 0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 32390328
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -3,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 26933797
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -2,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 29950811
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -1,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 23426098
+    },
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": 0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 50354517
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": 0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 50447774
+    }
+  ]
+}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257/trendgraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257/trendgraph.json"
index 21e5a95b15350fb62dafe42b62cebb5fec9a1e83..a95cf617e538431938d21702761cc49c4cead474 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257/trendgraph.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/default/layout.default/\351\243\216\347\216\257/trendgraph.json"
@@ -1 +1,10 @@
-{"Items":[{"Len":120,"BeginNo":0,"EndNo":20,"IsAll":true,"Type":1,"XType":0,"BM":0,"YRangePercent":3.0,"Title":"趋势图","Mix":1,"IsAutoTarget":false,"IsPercent":false,"ID":48220637}]}
\ No newline at end of file
+{
+  "Items": [
+    {
+      "Interval": 1,
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "ID": 50447774
+    }
+  ]
+}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/layout/graphcustom.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/layout/graphcustom.json"
index 19a37d041c70449226e65cfc66d74f421ea0d018..cd3713a6b3754ab1c714fccc8a842d4516fbadf9 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/layout/graphcustom.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/layout/graphcustom.json"
@@ -79,14 +79,13 @@
         {
           "Graphs": [
             {
-              "ID": 26380169,
+              "ID": 50447774,
               "Rect": "0, 0, 1, 1"
             }
           ],
           "ColumnCount": 1,
-          "RowCount": 2,
+          "RowCount": 1,
           "RowDefinitions": [
-            false,
             false
           ],
           "ColumnDefinitions": [
@@ -207,8 +206,8 @@
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 26380169,
-          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_TrendGraph",
+          "ID": 50447774,
+          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_TrendGraph2",
           "ServiceContainerName": "gage0.service"
         },
         {
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/layout/scangraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/layout/scangraph.json"
index d265d303386a91818194c951dabba18a71a2297a..f06d42347187f64b5ce244fc53ab71d448e6f833 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/layout/scangraph.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/layout/scangraph.json"
@@ -1 +1,67 @@
-{"Items":[{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":10616756},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":32390328},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":26933797},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":29950811},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":23426098},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":50354517}]}
\ No newline at end of file
+{
+  "Items": [
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -1,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 10616756
+    },
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": 0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 32390328
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -3,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 26933797
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -2,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 29950811
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -1,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 23426098
+    },
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": 0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 50354517
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": 0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 50447774
+    }
+  ]
+}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/layout/trendgraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/layout/trendgraph.json"
index 21e5a95b15350fb62dafe42b62cebb5fec9a1e83..a95cf617e538431938d21702761cc49c4cead474 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/layout/trendgraph.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/layout/trendgraph.json"
@@ -1 +1,10 @@
-{"Items":[{"Len":120,"BeginNo":0,"EndNo":20,"IsAll":true,"Type":1,"XType":0,"BM":0,"YRangePercent":3.0,"Title":"趋势图","Mix":1,"IsAutoTarget":false,"IsPercent":false,"ID":48220637}]}
\ No newline at end of file
+{
+  "Items": [
+    {
+      "Interval": 1,
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "ID": 50447774
+    }
+  ]
+}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/unity/blowing.component.config" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/unity/blowing.component.config"
index 9fe9b207dc96dc085dfc457d85fdf1dda51f1e13..85fcbdb02d9264dc8cac590a18f2c8d893470e70 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/unity/blowing.component.config"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.Blowing.UI.Fix.Client/unity/blowing.component.config"
@@ -21,6 +21,7 @@
       <register type="IUiModule2" mapTo="UiModule2_ScanGraph2" name="blowing_sg2" />
       <register type="IUiModule2" mapTo="UiModule2_ScanGraphCircular" name="blowing_sgc" />
       <register type="IUiModule2" mapTo="UiModule2_TrendGraph" name="blowing_tg" />
+      <register type="IUiModule2" mapTo="UiModule2_TrendGraph2" name="blowing_tg2" />
     </container>
   </unity>
 </configuration>
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/flowgraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/flowgraph.json"
new file mode 100644
index 0000000000000000000000000000000000000000..9878a10011bf09a9288592ab98383adb96e4979a
--- /dev/null
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/flowgraph.json"
@@ -0,0 +1 @@
+{"Interval":6,"IsYRangeAuto":false,"IsYRangePercent":true,"YRangePercent":0.15,"YRange":20}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/graphcustom.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/graphcustom.json"
index 482545c718afb28cd5c862f377b9575230b19ada..fa9d6ac932528ac0b2e887c0698f52efbafbe41d 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/graphcustom.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/graphcustom.json"
@@ -158,6 +158,23 @@
             false
           ],
           "Header": "定点"
+        },
+        {
+          "Graphs": [
+            {
+              "ID": 37010918,
+              "Rect": "0, 0, 1, 1"
+            }
+          ],
+          "ColumnCount": 1,
+          "RowCount": 1,
+          "RowDefinitions": [
+            false
+          ],
+          "ColumnDefinitions": [
+            false
+          ],
+          "Header": "趋势2"
         }
       ],
       "Components": [
@@ -290,6 +307,11 @@
           "ID": 18036132,
           "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_FixGraph",
           "ServiceContainerName": "gage0.service"
+        },
+        {
+          "ID": 37010918,
+          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_TrendGraph2",
+          "ServiceContainerName": "gage0.service"
         }
       ]
     }
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/scangraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/scangraph.json"
index 9c6a54a6ac86bec2a7c0015352863bac7e333a60..0d21a8fd0565dca8e2efc688728131c3389a6685 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/scangraph.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/scangraph.json"
@@ -1 +1,67 @@
-{"Items":[{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":1,"Number":-5,"IsPercent":true,"IsAutoTarget":true,"ID":41709209},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":1,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":63400648},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":1,"Number":-15,"IsPercent":true,"IsAutoTarget":true,"ID":54302323},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":1,"Number":-10,"IsPercent":true,"IsAutoTarget":true,"ID":46404226},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":1,"Number":-5,"IsPercent":true,"IsAutoTarget":true,"ID":42496437},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":1,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":50443655}]}
\ No newline at end of file
+{
+  "Items": [
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -5,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 41709209
+    },
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": 0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 63400648
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -15,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 54302323
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -10,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 46404226
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -5,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 42496437
+    },
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": 0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 50443655
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": 0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 37010918
+    }
+  ]
+}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/trendgraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/trendgraph.json"
index 3bec73b8db981479d35becd5cc9da0d46a4e0979..d2fee752ccf02cd9bad017eb8fab36b47fea8665 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/trendgraph.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257-\347\247\260\351\207\215/trendgraph.json"
@@ -1 +1,16 @@
-{"Items":[{"Len":120,"BeginNo":0,"EndNo":20,"IsAll":true,"Type":0,"XType":0,"BM":0,"YRangePercent":3.0,"Title":"趋势图","Mix":1,"IsAutoTarget":true,"IsPercent":true,"ID":48220637}]}
\ No newline at end of file
+{
+  "Items": [
+    {
+      "Interval": 1,
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "ID": 26947909
+    },
+    {
+      "Interval": 1,
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "ID": 37010918
+    }
+  ]
+}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/fixgraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/fixgraph.json"
index cee31444a616753672e528250d3a97916deb2884..ea9f8d9cb827a74e48f4757df4ab0f909aae300d 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/fixgraph.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/fixgraph.json"
@@ -1 +1,15 @@
-{"Items":[{"Len":500,"Interval":1000,"Mix":1,"IsAutoTarget":true,"IsADMode":false,"IsAutoY":false,"YTarget":0.0,"YRange":10.0,"ID":28792051}]}
\ No newline at end of file
+{
+  "Items": [
+    {
+      "Len": 500,
+      "Interval": 1000,
+      "Mix": 1,
+      "IsAutoTarget": true,
+      "IsADMode": false,
+      "IsAutoY": false,
+      "YTarget": 0.0,
+      "YRange": 10.0,
+      "ID": 28792051
+    }
+  ]
+}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/graphcustom.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/graphcustom.json"
index 1409521c015843ef597bcf4efda02dbc58e514fe..803d7512ffbaad53b29d59adc0a540ee31cecc49 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/graphcustom.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/graphcustom.json"
@@ -82,14 +82,13 @@
         {
           "Graphs": [
             {
-              "ID": 52059282,
+              "ID": 19728236,
               "Rect": "0, 0, 1, 1"
             }
           ],
           "ColumnCount": 1,
-          "RowCount": 2,
+          "RowCount": 1,
           "RowDefinitions": [
-            false,
             false
           ],
           "ColumnDefinitions": [
@@ -135,108 +134,108 @@
       ],
       "Components": [
         {
-          "ID": 48662582,
-          "Module": "FLY.FeedbackRenZiJia.UI.Client.UiModule.UiModule2_GraphAirRing",
+          "ID": 44866487,
+          "Module": "FLY.FeedbackRenZiJia.UI.Client.UiModule.UiModule2_MenuSetting",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 8461910,
-          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph2",
+          "ID": 43552930,
+          "Module": "FLY.Thick.BlowingScan.UI.Client.UiModule.UiModule2_MenuSetting",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 46529701,
-          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph2",
+          "ID": 3969229,
+          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_MenuProfile",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 23403840,
-          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph",
+          "ID": 66283545,
+          "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_MenuMotion",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 21774588,
-          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph",
+          "ID": 31616714,
+          "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_DynAreaThick",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 26794676,
-          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph",
+          "ID": 31406639,
+          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_DynAreaProfile",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 41650091,
-          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph2",
+          "ID": 27935207,
+          "Module": "FLY.Thick.BlowingScan.UI.Client.UiModule.UiModule2_DynAreaFilmWidth",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 52059282,
-          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_TrendGraph",
+          "ID": 64726287,
+          "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_DynAreaSample",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 32000920,
-          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraphCircular",
+          "ID": 48687165,
+          "Module": "FLY.Thick.BlowingScan.UI.Client.UiModule.UiModule2_DynAreaBlowing",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 28792051,
-          "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_FixGraph",
+          "ID": 21215025,
+          "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_DynAreaIO",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 44866487,
-          "Module": "FLY.FeedbackRenZiJia.UI.Client.UiModule.UiModule2_MenuSetting",
+          "ID": 20387170,
+          "Module": "FLY.FeedbackRenZiJia.UI.Client.UiModule.UiModule2_DynAreaAirRing",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 43552930,
-          "Module": "FLY.Thick.BlowingScan.UI.Client.UiModule.UiModule2_MenuSetting",
+          "ID": 48662582,
+          "Module": "FLY.FeedbackRenZiJia.UI.Client.UiModule.UiModule2_GraphAirRing",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 3969229,
-          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_MenuProfile",
+          "ID": 8461910,
+          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph2",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 66283545,
-          "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_MenuMotion",
+          "ID": 46529701,
+          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph2",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 31616714,
-          "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_DynAreaThick",
+          "ID": 23403840,
+          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 31406639,
-          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_DynAreaProfile",
+          "ID": 21774588,
+          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 27935207,
-          "Module": "FLY.Thick.BlowingScan.UI.Client.UiModule.UiModule2_DynAreaFilmWidth",
+          "ID": 26794676,
+          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 64726287,
-          "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_DynAreaSample",
+          "ID": 41650091,
+          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph2",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 48687165,
-          "Module": "FLY.Thick.BlowingScan.UI.Client.UiModule.UiModule2_DynAreaBlowing",
+          "ID": 19728236,
+          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_TrendGraph2",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 21215025,
-          "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_DynAreaIO",
+          "ID": 32000920,
+          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraphCircular",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 20387170,
-          "Module": "FLY.FeedbackRenZiJia.UI.Client.UiModule.UiModule2_DynAreaAirRing",
+          "ID": 28792051,
+          "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_FixGraph",
           "ServiceContainerName": "gage0.service"
         }
       ]
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/scangraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/scangraph.json"
index 8007890ab78b8fa3f39a250b3217095240a4d4e6..e354bbee566225677a54c5e8fbe76269249f44f4 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/scangraph.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/scangraph.json"
@@ -1 +1,67 @@
-{"Items":[{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":1,"Number":-5,"IsPercent":true,"IsAutoTarget":true,"ID":8461910},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":46529701},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":1,"Number":-15,"IsPercent":true,"IsAutoTarget":true,"ID":23403840},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":1,"Number":-10,"IsPercent":true,"IsAutoTarget":true,"ID":21774588},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":1,"Number":-5,"IsPercent":true,"IsAutoTarget":true,"ID":26794676},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":1,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":41650091}]}
\ No newline at end of file
+{
+  "Items": [
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -5,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 8461910
+    },
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 2,
+      "Number": 0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 46529701
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -15,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 23403840
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -10,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 21774588
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -5,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 26794676
+    },
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": 0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 41650091
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 2,
+      "Number": 0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 19728236
+    }
+  ]
+}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/scangraphcircular.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/scangraphcircular.json"
index 7c9f9ce7a9bd8c1b2d63bde27ec22b9cf5a38a45..dc1288b6f94b2b60c8afa899682b64be8b810815 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/scangraphcircular.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/scangraphcircular.json"
@@ -1 +1,17 @@
-{"Items":[{"Mix":1,"Number":0,"YRangePercent":3.0,"IsPercent":true,"IsAutoTarget":true,"HasAlianZone":false,"AlianZoneBoltNoOf3oClock":1.0,"AlianZoneBoltCnt":8,"AlianZoneIsCCW":false,"AlianZoneIsShowXStep":false,"ID":32000920}]}
\ No newline at end of file
+{
+  "Items": [
+    {
+      "Mix": 1,
+      "Number": 0,
+      "YRangePercent": 3.0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "HasAlianZone": false,
+      "AlianZoneBoltNoOf3oClock": 1.0,
+      "AlianZoneBoltCnt": 8,
+      "AlianZoneIsCCW": false,
+      "AlianZoneIsShowXStep": false,
+      "ID": 32000920
+    }
+  ]
+}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/trendgraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/trendgraph.json"
index aa25829130ab1a40bdc010af69500ace368cd80a..ebf64e45da50bb2da20cdab18ff653ab19d1863f 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/trendgraph.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/default/layout.default/\351\243\216\347\216\257/trendgraph.json"
@@ -1 +1,10 @@
-{"Items":[{"Len":120,"BeginNo":0,"EndNo":20,"IsAll":true,"Type":0,"XType":0,"BM":0,"YRangePercent":3.0,"Title":"趋势图","Mix":1,"IsAutoTarget":true,"IsPercent":true,"ID":48220637},{"Len":120,"BeginNo":0,"EndNo":20,"IsAll":true,"Type":1,"XType":0,"BM":0,"YRangePercent":3.0,"Title":"趋势图","Mix":1,"IsAutoTarget":true,"IsPercent":true,"ID":37445257}]}
\ No newline at end of file
+{
+  "Items": [
+    {
+      "Interval": 1,
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "ID": 19728236
+    }
+  ]
+}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/fixgraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/fixgraph.json"
index cee31444a616753672e528250d3a97916deb2884..ea9f8d9cb827a74e48f4757df4ab0f909aae300d 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/fixgraph.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/fixgraph.json"
@@ -1 +1,15 @@
-{"Items":[{"Len":500,"Interval":1000,"Mix":1,"IsAutoTarget":true,"IsADMode":false,"IsAutoY":false,"YTarget":0.0,"YRange":10.0,"ID":28792051}]}
\ No newline at end of file
+{
+  "Items": [
+    {
+      "Len": 500,
+      "Interval": 1000,
+      "Mix": 1,
+      "IsAutoTarget": true,
+      "IsADMode": false,
+      "IsAutoY": false,
+      "YTarget": 0.0,
+      "YRange": 10.0,
+      "ID": 28792051
+    }
+  ]
+}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/flowgraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/flowgraph.json"
new file mode 100644
index 0000000000000000000000000000000000000000..9878a10011bf09a9288592ab98383adb96e4979a
--- /dev/null
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/flowgraph.json"
@@ -0,0 +1 @@
+{"Interval":6,"IsYRangeAuto":false,"IsYRangePercent":true,"YRangePercent":0.15,"YRange":20}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/graphcustom.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/graphcustom.json"
index 1409521c015843ef597bcf4efda02dbc58e514fe..803d7512ffbaad53b29d59adc0a540ee31cecc49 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/graphcustom.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/graphcustom.json"
@@ -82,14 +82,13 @@
         {
           "Graphs": [
             {
-              "ID": 52059282,
+              "ID": 19728236,
               "Rect": "0, 0, 1, 1"
             }
           ],
           "ColumnCount": 1,
-          "RowCount": 2,
+          "RowCount": 1,
           "RowDefinitions": [
-            false,
             false
           ],
           "ColumnDefinitions": [
@@ -135,108 +134,108 @@
       ],
       "Components": [
         {
-          "ID": 48662582,
-          "Module": "FLY.FeedbackRenZiJia.UI.Client.UiModule.UiModule2_GraphAirRing",
+          "ID": 44866487,
+          "Module": "FLY.FeedbackRenZiJia.UI.Client.UiModule.UiModule2_MenuSetting",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 8461910,
-          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph2",
+          "ID": 43552930,
+          "Module": "FLY.Thick.BlowingScan.UI.Client.UiModule.UiModule2_MenuSetting",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 46529701,
-          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph2",
+          "ID": 3969229,
+          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_MenuProfile",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 23403840,
-          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph",
+          "ID": 66283545,
+          "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_MenuMotion",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 21774588,
-          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph",
+          "ID": 31616714,
+          "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_DynAreaThick",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 26794676,
-          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph",
+          "ID": 31406639,
+          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_DynAreaProfile",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 41650091,
-          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph2",
+          "ID": 27935207,
+          "Module": "FLY.Thick.BlowingScan.UI.Client.UiModule.UiModule2_DynAreaFilmWidth",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 52059282,
-          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_TrendGraph",
+          "ID": 64726287,
+          "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_DynAreaSample",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 32000920,
-          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraphCircular",
+          "ID": 48687165,
+          "Module": "FLY.Thick.BlowingScan.UI.Client.UiModule.UiModule2_DynAreaBlowing",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 28792051,
-          "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_FixGraph",
+          "ID": 21215025,
+          "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_DynAreaIO",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 44866487,
-          "Module": "FLY.FeedbackRenZiJia.UI.Client.UiModule.UiModule2_MenuSetting",
+          "ID": 20387170,
+          "Module": "FLY.FeedbackRenZiJia.UI.Client.UiModule.UiModule2_DynAreaAirRing",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 43552930,
-          "Module": "FLY.Thick.BlowingScan.UI.Client.UiModule.UiModule2_MenuSetting",
+          "ID": 48662582,
+          "Module": "FLY.FeedbackRenZiJia.UI.Client.UiModule.UiModule2_GraphAirRing",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 3969229,
-          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_MenuProfile",
+          "ID": 8461910,
+          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph2",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 66283545,
-          "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_MenuMotion",
+          "ID": 46529701,
+          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph2",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 31616714,
-          "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_DynAreaThick",
+          "ID": 23403840,
+          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 31406639,
-          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_DynAreaProfile",
+          "ID": 21774588,
+          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 27935207,
-          "Module": "FLY.Thick.BlowingScan.UI.Client.UiModule.UiModule2_DynAreaFilmWidth",
+          "ID": 26794676,
+          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 64726287,
-          "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_DynAreaSample",
+          "ID": 41650091,
+          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraph2",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 48687165,
-          "Module": "FLY.Thick.BlowingScan.UI.Client.UiModule.UiModule2_DynAreaBlowing",
+          "ID": 19728236,
+          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_TrendGraph2",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 21215025,
-          "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_DynAreaIO",
+          "ID": 32000920,
+          "Module": "FLY.Thick.Blowing.UI.UiModule.UiModule2_ScanGraphCircular",
           "ServiceContainerName": "gage0.service"
         },
         {
-          "ID": 20387170,
-          "Module": "FLY.FeedbackRenZiJia.UI.Client.UiModule.UiModule2_DynAreaAirRing",
+          "ID": 28792051,
+          "Module": "FLY.Thick.Base.UI.UiModule.UiModule2_FixGraph",
           "ServiceContainerName": "gage0.service"
         }
       ]
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/scangraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/scangraph.json"
index 8007890ab78b8fa3f39a250b3217095240a4d4e6..e354bbee566225677a54c5e8fbe76269249f44f4 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/scangraph.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/scangraph.json"
@@ -1 +1,67 @@
-{"Items":[{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":1,"Number":-5,"IsPercent":true,"IsAutoTarget":true,"ID":8461910},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":2,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":46529701},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":1,"Number":-15,"IsPercent":true,"IsAutoTarget":true,"ID":23403840},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":1,"Number":-10,"IsPercent":true,"IsAutoTarget":true,"ID":21774588},{"UiModule":"scangraph","YRangePercent":3.0,"Mix":1,"Number":-5,"IsPercent":true,"IsAutoTarget":true,"ID":26794676},{"UiModule":"scangraph2","YRangePercent":3.0,"Mix":1,"Number":0,"IsPercent":true,"IsAutoTarget":true,"ID":41650091}]}
\ No newline at end of file
+{
+  "Items": [
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -5,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 8461910
+    },
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 2,
+      "Number": 0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 46529701
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -15,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 23403840
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -10,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 21774588
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": -5,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 26794676
+    },
+    {
+      "UiModule": "scangraph2",
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "Number": 0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 41650091
+    },
+    {
+      "UiModule": "scangraph",
+      "YRangePercent": 3.0,
+      "Mix": 2,
+      "Number": 0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "ID": 19728236
+    }
+  ]
+}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/scangraphcircular.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/scangraphcircular.json"
index 7c9f9ce7a9bd8c1b2d63bde27ec22b9cf5a38a45..dc1288b6f94b2b60c8afa899682b64be8b810815 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/scangraphcircular.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/scangraphcircular.json"
@@ -1 +1,17 @@
-{"Items":[{"Mix":1,"Number":0,"YRangePercent":3.0,"IsPercent":true,"IsAutoTarget":true,"HasAlianZone":false,"AlianZoneBoltNoOf3oClock":1.0,"AlianZoneBoltCnt":8,"AlianZoneIsCCW":false,"AlianZoneIsShowXStep":false,"ID":32000920}]}
\ No newline at end of file
+{
+  "Items": [
+    {
+      "Mix": 1,
+      "Number": 0,
+      "YRangePercent": 3.0,
+      "IsPercent": true,
+      "IsAutoTarget": true,
+      "HasAlianZone": false,
+      "AlianZoneBoltNoOf3oClock": 1.0,
+      "AlianZoneBoltCnt": 8,
+      "AlianZoneIsCCW": false,
+      "AlianZoneIsShowXStep": false,
+      "ID": 32000920
+    }
+  ]
+}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/trendgraph.json" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/trendgraph.json"
index aa25829130ab1a40bdc010af69500ace368cd80a..ebf64e45da50bb2da20cdab18ff653ab19d1863f 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/trendgraph.json"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/layout/trendgraph.json"
@@ -1 +1,10 @@
-{"Items":[{"Len":120,"BeginNo":0,"EndNo":20,"IsAll":true,"Type":0,"XType":0,"BM":0,"YRangePercent":3.0,"Title":"趋势图","Mix":1,"IsAutoTarget":true,"IsPercent":true,"ID":48220637},{"Len":120,"BeginNo":0,"EndNo":20,"IsAll":true,"Type":1,"XType":0,"BM":0,"YRangePercent":3.0,"Title":"趋势图","Mix":1,"IsAutoTarget":true,"IsPercent":true,"ID":37445257}]}
\ No newline at end of file
+{
+  "Items": [
+    {
+      "Interval": 1,
+      "YRangePercent": 3.0,
+      "Mix": 1,
+      "ID": 19728236
+    }
+  ]
+}
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/unity/blowingScan.component.config" "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/unity/blowingScan.component.config"
index 0d6aab6e8eb9aaee3210645832a383b14178e178..6f37653ce7faeeb8179656431c684112a4f7fadd 100644
--- "a/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/unity/blowingScan.component.config"
+++ "b/\350\204\232\346\234\254/release_conf/FLY.Thick.BlowingScan.UI.Client/unity/blowingScan.component.config"
@@ -19,6 +19,7 @@
       <register type="IUiModule2" mapTo="UiModule2_ScanGraph2" name="blowing_sg2" />
       <register type="IUiModule2" mapTo="UiModule2_ScanGraphCircular" name="blowing_sgc" />
       <register type="IUiModule2" mapTo="UiModule2_TrendGraph" name="blowing_tg" />
+      <register type="IUiModule2" mapTo="UiModule2_TrendGraph2" name="blowing_tg2" />
     </container>
   </unity>
 </configuration>
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/\345\222\214\347\276\216\346\211\253\346\217\217\345\256\242\346\210\267\347\253\257\345\256\271\345\231\250\346\217\217\350\277\260.unity/unity/blowingScan.component.config" "b/\350\204\232\346\234\254/\345\222\214\347\276\216\346\211\253\346\217\217\345\256\242\346\210\267\347\253\257\345\256\271\345\231\250\346\217\217\350\277\260.unity/unity/blowingScan.component.config"
index 0d6aab6e8eb9aaee3210645832a383b14178e178..6f37653ce7faeeb8179656431c684112a4f7fadd 100644
--- "a/\350\204\232\346\234\254/\345\222\214\347\276\216\346\211\253\346\217\217\345\256\242\346\210\267\347\253\257\345\256\271\345\231\250\346\217\217\350\277\260.unity/unity/blowingScan.component.config"
+++ "b/\350\204\232\346\234\254/\345\222\214\347\276\216\346\211\253\346\217\217\345\256\242\346\210\267\347\253\257\345\256\271\345\231\250\346\217\217\350\277\260.unity/unity/blowingScan.component.config"
@@ -19,6 +19,7 @@
       <register type="IUiModule2" mapTo="UiModule2_ScanGraph2" name="blowing_sg2" />
       <register type="IUiModule2" mapTo="UiModule2_ScanGraphCircular" name="blowing_sgc" />
       <register type="IUiModule2" mapTo="UiModule2_TrendGraph" name="blowing_tg" />
+      <register type="IUiModule2" mapTo="UiModule2_TrendGraph2" name="blowing_tg2" />
     </container>
   </unity>
 </configuration>
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/\345\222\214\347\276\216\350\277\275\350\276\271\345\256\242\346\210\267\347\253\257\345\256\271\345\231\250\346\217\217\350\277\260.unity/unity/blowing.component.config" "b/\350\204\232\346\234\254/\345\222\214\347\276\216\350\277\275\350\276\271\345\256\242\346\210\267\347\253\257\345\256\271\345\231\250\346\217\217\350\277\260.unity/unity/blowing.component.config"
index 9fe9b207dc96dc085dfc457d85fdf1dda51f1e13..85fcbdb02d9264dc8cac590a18f2c8d893470e70 100644
--- "a/\350\204\232\346\234\254/\345\222\214\347\276\216\350\277\275\350\276\271\345\256\242\346\210\267\347\253\257\345\256\271\345\231\250\346\217\217\350\277\260.unity/unity/blowing.component.config"
+++ "b/\350\204\232\346\234\254/\345\222\214\347\276\216\350\277\275\350\276\271\345\256\242\346\210\267\347\253\257\345\256\271\345\231\250\346\217\217\350\277\260.unity/unity/blowing.component.config"
@@ -21,6 +21,7 @@
       <register type="IUiModule2" mapTo="UiModule2_ScanGraph2" name="blowing_sg2" />
       <register type="IUiModule2" mapTo="UiModule2_ScanGraphCircular" name="blowing_sgc" />
       <register type="IUiModule2" mapTo="UiModule2_TrendGraph" name="blowing_tg" />
+      <register type="IUiModule2" mapTo="UiModule2_TrendGraph2" name="blowing_tg2" />
     </container>
   </unity>
 </configuration>
\ No newline at end of file
diff --git "a/\350\204\232\346\234\254/\347\211\210\346\234\254\346\217\217\350\277\260.md" "b/\350\204\232\346\234\254/\347\211\210\346\234\254\346\217\217\350\277\260.md"
index 9ebb80e0d10fe9a82f02e9c39c788653bbed1f61..b5f01daed615d6ca3630854b1155524837a64ae4 100644
--- "a/\350\204\232\346\234\254/\347\211\210\346\234\254\346\217\217\350\277\260.md"
+++ "b/\350\204\232\346\234\254/\347\211\210\346\234\254\346\217\217\350\277\260.md"
@@ -1,3 +1,87 @@
+
+# 和美安装包_v7.4.0-20220628
+
+## 测厚仪服务器 v7.1.0
+## 测厚仪客户端 v7.4.0
+1. 添加 自动风环增量调节界面添加sigma2,  mix显示
+2. 添加 扫描图,添加扫描结束时间
+3. 修改 布局的默认参数
+   
+## 扫描测厚仪服务器 v7.1.1
+## 扫描测厚仪客户端 v7.4.0
+1. 添加 自动风环增量调节界面添加sigma2,  mix显示
+2. 添加 扫描图,添加扫描结束时间
+   
+## 自动风环 v7.4.0
+1. 添加 多级的控制线, 每级都有对应的混合数,  原则是 混合数越大,控制线可以越小
+2. 修改 自动对位查找范围单位为分区,自动对位会在最厚点做内标,内标的高度为最小加热极差,宽度最小为3
+3. 修改 只要相关性够高,加热极差够大,任何时候都会触发自动对位。
+4. 添加 厚度%数据有横向平滑。默认为6个。 控制以横向平滑后的厚度% 计算应用
+5. 修改 那些大于控制线的位置,它附近左右2个,都会被执行计算,只是比例毕竟小。
+6. 添加 对应连续6个分区以上都在均值的某一边的。 它中间区域3个分区的目标值不再是0%,而是另一个方向的 控制线
+
+   
+## 称重 v7.0.2
+## 称重单组 v7.0.0
+## 收卷 v7.0.9
+## IBC v7.0.0
+## 下吹 v7.0.9
+## 吹膜数据库浏览器 v7.0.0
+
+<br/>
+<br/>
+<br/>
+
+# 和美安装包_v7.1.1-20220614
+
+## 测厚仪服务器 v7.1.0
+## 测厚仪客户端 v7.1.0
+## 扫描测厚仪服务器 v7.1.1
+1. 添加 支持 modbus TCP server 供HMI读取测厚值
+
+## 扫描测厚仪客户端 v7.1.0
+## 自动风环 v7.0.1
+## 称重 v7.0.2
+## 称重单组 v7.0.0
+## 收卷 v7.0.9
+## IBC v7.0.0
+## 下吹 v7.0.9
+## 吹膜数据库浏览器 v7.0.0
+
+<br/>
+<br/>
+<br/>
+
+
+# 和美安装包_v7.1.0-20220611
+
+## 测厚仪服务器 v7.1.0
+1. 修复 纵向图 先混合再间隔
+   
+## 测厚仪客户端 v7.1.0
+1. 添加 扫描图,对比图,添加自动恢复记录点功能。
+2. 添加 纵向图2, 点纵向图的某某个位置,显示对应的扫描图
+   
+## 扫描测厚仪服务器 v7.1.0
+1. 修复 纵向图 先混合再间隔
+
+## 扫描测厚仪客户端 v7.1.0
+1. 添加 扫描图,对比图,添加自动恢复记录点功能。
+2. 添加 纵向图2, 点纵向图的某个位置,显示对应的扫描图
+
+
+## 自动风环 v7.0.1
+## 称重 v7.0.2
+## 称重单组 v7.0.0
+## 收卷 v7.0.9
+## IBC v7.0.0
+## 下吹 v7.0.9
+## 吹膜数据库浏览器 v7.0.0
+
+<br/>
+<br/>
+<br/>
+
 # 和美安装包_v7.0.9.2-20220608
 
 ## 测厚仪服务器 v7.0.9