diff --git a/全自动水压检测仪/ChartManager.cs b/全自动水压检测仪/ChartManager.cs
index b822de2..0aa8ac1 100644
--- a/全自动水压检测仪/ChartManager.cs
+++ b/全自动水压检测仪/ChartManager.cs
@@ -1,23 +1,28 @@
-using LiveCharts;
-using LiveCharts.Wpf;
+using OxyPlot;
+using OxyPlot.Axes;
+using OxyPlot.Series;
+using OxyPlot.WindowsForms;
using System;
+using System.Collections.Generic;
using System.Drawing;
-using System.Threading.Tasks;
+using System.Linq;
using System.Windows.Forms;
-using System.Windows.Forms.Integration;
namespace 全自动水压检测仪
{
///
/// 图表管理器 - 负责实时曲线图的创建和数据更新
+ /// 第一Y轴:实时压力(地址3130)
+ /// 第二Y轴:压力设定值(地址2400,对应"压力设置(PSI)")
///
public class ChartManager
{
- private ElementHost _chartHost;
- private LiveCharts.Wpf.CartesianChart _chart;
- private ChartValues _pressureValues;
- private ChartValues _temperatureValues;
- private ChartValues _timeLabels;
+ private PlotView _plotView;
+ private PlotModel _plotModel;
+ private LineSeries _pressureSeries; // 实时压力值(地址3130)
+ private LineSeries _pressureSetSeries; // 压力设定值(地址2400)
+ private List _pressureData;
+ private List _pressureSetData;
private const int MAX_DATA_POINTS = 60; // 最多显示60个数据点
///
@@ -33,132 +38,167 @@ namespace 全自动水压检测仪
// 清除占位文字
targetPanel.Text = null;
- // 初始化数据集合
- _pressureValues = new ChartValues();
- _temperatureValues = new ChartValues();
- _timeLabels = new ChartValues();
+ // 初始化数据集合
+ _pressureData = new List();
+ _pressureSetData = new List();
+ // 创建PlotModel
+ _plotModel = new PlotModel
+ {
+ Title = "",
+ Background = OxyColors.White,
+ PlotAreaBorderColor = OxyColors.Gray
+ };
+
+ // 配置图例
+ _plotModel.Legends.Add(new OxyPlot.Legends.Legend
+ {
+ LegendPosition = OxyPlot.Legends.LegendPosition.TopCenter,
+ LegendOrientation = OxyPlot.Legends.LegendOrientation.Horizontal
+ });
-
-
-
- // 创建WPF图表控件
- _chart = new LiveCharts.Wpf.CartesianChart
+ // 配置X轴(时间轴 - 使用测试时间总秒数)
+ var xAxis = new LinearAxis
+ {
+ Position = AxisPosition.Bottom,
+ Title = "测试时间",
+ TitleFontSize = 12,
+ FontSize = 10,
+ MajorGridlineStyle = LineStyle.Solid,
+ MajorGridlineColor = OxyColor.FromRgb(230, 230, 230),
+ MinorGridlineStyle = LineStyle.Dot,
+ MinorGridlineColor = OxyColor.FromRgb(240, 240, 240),
+ Minimum = 0,
+ Maximum = 60,
+ // 格式化X轴标签为HH:MM:SS格式
+ LabelFormatter = value =>
{
- Background = System.Windows.Media.Brushes.White,
- DisableAnimations = false,
- Hoverable = true,
- DataTooltip = null,
- LegendLocation = LegendLocation.Top
- };
+ int totalSec = (int)value;
+ int h = totalSec / 3600;
+ int m = (totalSec % 3600) / 60;
+ int s = totalSec % 60;
+ return $"{h:D2}:{m:D2}:{s:D2}";
+ }
+ };
+ _plotModel.Axes.Add(xAxis);
+ // 配置左Y轴(实时压力)
+ var yAxisLeft = new LinearAxis
+ {
+ Position = AxisPosition.Left,
+ Title = "压力 (PSI)",
+ TitleFontSize = 12,
+ FontSize = 10,
+ TitleColor = OxyColors.Blue,
+ TextColor = OxyColors.Blue,
+ MajorGridlineStyle = LineStyle.Solid,
+ MajorGridlineColor = OxyColor.FromRgb(230, 230, 230),
+ MinorGridlineStyle = LineStyle.Dot,
+ MinorGridlineColor = OxyColor.FromRgb(240, 240, 240),
+ StringFormat = "F2",
+ Minimum = 0,
+ Key = "LeftAxis"
+ };
+ _plotModel.Axes.Add(yAxisLeft);
- // 配置X轴(时间轴)
- _chart.AxisX.Add(new Axis
- {
- Title = "时间",
- Labels = _timeLabels,
- FontSize = 12,
- Foreground = System.Windows.Media.Brushes.Black,
- Separator = new LiveCharts.Wpf.Separator
- {
- Step = 5,
- IsEnabled = true
- }
- });
+ // 配置右Y轴(压力设定值)
+ var yAxisRight = new LinearAxis
+ {
+ Position = AxisPosition.Right,
+ Title = "压力设定值 (PSI)",
+ TitleFontSize = 12,
+ FontSize = 10,
+ TitleColor = OxyColors.Red,
+ TextColor = OxyColors.Red,
+ MajorGridlineStyle = LineStyle.None,
+ StringFormat = "F2",
+ Minimum = 0,
+ Key = "RightAxis"
+ };
+ _plotModel.Axes.Add(yAxisRight);
- // 配置Y轴(压力)
- _chart.AxisY.Add(new Axis
- {
- Title = "压力 (MPa)",
- FontSize = 12,
- Foreground = System.Windows.Media.Brushes.Blue,
- LabelFormatter = value => value.ToString("F2"),
- MinValue = 0
- });
+ // 添加实时压力曲线
+ _pressureSeries = new LineSeries
+ {
+ Title = "实时压力",
+ Color = OxyColors.Blue,
+ StrokeThickness = 2,
+ MarkerType = MarkerType.Circle,
+ MarkerSize = 4,
+ MarkerFill = OxyColors.Blue,
+ YAxisKey = "LeftAxis"
+ };
+ _plotModel.Series.Add(_pressureSeries);
- // 配置第二Y轴(压力设定值)
- _chart.AxisY.Add(new Axis
- {
- Title = "压力设定值 (MPa)",
- FontSize = 12,
- Foreground = System.Windows.Media.Brushes.Red,
- LabelFormatter = value => value.ToString("F2"),
- Position = AxisPosition.RightTop,
- MinValue = 0
- });
+ // 添加压力设定值曲线
+ _pressureSetSeries = new LineSeries
+ {
+ Title = "压力设定值",
+ Color = OxyColors.Red,
+ StrokeThickness = 2,
+ MarkerType = MarkerType.Diamond,
+ MarkerSize = 4,
+ MarkerFill = OxyColors.Red,
+ YAxisKey = "RightAxis"
+ };
+ _plotModel.Series.Add(_pressureSetSeries);
- // 添加压力曲线
- _chart.Series.Add(new LineSeries
- {
- Title = "实时压力",
- Values = _pressureValues,
- Stroke = System.Windows.Media.Brushes.Blue,
- Fill = System.Windows.Media.Brushes.Transparent,
- PointGeometry = DefaultGeometries.Circle,
- PointGeometrySize = 5,
- StrokeThickness = 2,
- LineSmoothness = 0.3,
- ScalesYAt = 0
- });
+ // 创建PlotView控件
+ _plotView = new PlotView
+ {
+ Model = _plotModel,
+ Dock = DockStyle.Fill,
+ BackColor = System.Drawing.Color.White
+ };
- // 添加压力设定值曲线
- _chart.Series.Add(new LineSeries
- {
- Title = "压力设定值",
- Values = _temperatureValues,
- Stroke = System.Windows.Media.Brushes.Red,
- Fill = System.Windows.Media.Brushes.Transparent,
- PointGeometry = DefaultGeometries.Diamond,
- PointGeometrySize = 5,
- StrokeThickness = 2,
- LineSmoothness = 0.3,
- ScalesYAt = 1
- });
-
- // 创建ElementHost以承载WPF控件
- _chartHost = new ElementHost
- {
- Dock = DockStyle.Fill,
- Child = _chart
- };
-
-
-
-
-
- // 添加到目标面板
- targetPanel.Controls.Add(_chartHost);
- }));
+ // 添加到目标面板
+ targetPanel.Controls.Add(_plotView);
}
///
/// 添加新的数据点
///
/// 实时压力值
- /// 压力设定值
- /// 时间标签(可选,默认使用当前时间)
- public void AddDataPoint(double pressure, double temperature, string time = null)
+ /// 压力设定值(来自"压力设置(PSI)",地址2400)
+ /// 测试时间(总秒数)
+ public void AddDataPoint(double pressure, double pressureSetValue, int totalSeconds)
{
- if (_pressureValues == null || _temperatureValues == null || _timeLabels == null)
+ if (_pressureSeries == null || _pressureSetSeries == null || _plotModel == null)
return;
- // 使用当前时间作为默认标签
- if (string.IsNullOrEmpty(time))
- time = DateTime.Now.ToString("HH:mm:ss");
-
- // 添加数据点
- _pressureValues.Add(pressure);
- _temperatureValues.Add(temperature);
- _timeLabels.Add(time);
+ // 添加数据点(使用测试时间总秒数作为X轴值)
+ _pressureData.Add(new DataPoint(totalSeconds, pressure));
+ _pressureSetData.Add(new DataPoint(totalSeconds, pressureSetValue));
// 限制数据点数量,保持图表流畅
- if (_pressureValues.Count > MAX_DATA_POINTS)
+ if (_pressureData.Count > MAX_DATA_POINTS)
{
- _pressureValues.RemoveAt(0);
- _temperatureValues.RemoveAt(0);
- _timeLabels.RemoveAt(0);
+ _pressureData.RemoveAt(0);
+ _pressureSetData.RemoveAt(0);
}
+
+ // 更新系列数据
+ _pressureSeries.Points.Clear();
+ _pressureSeries.Points.AddRange(_pressureData);
+
+ _pressureSetSeries.Points.Clear();
+ _pressureSetSeries.Points.AddRange(_pressureSetData);
+
+ // 动态调整X轴范围
+ if (_pressureData.Count > 0)
+ {
+ var xAxis = _plotModel.Axes.FirstOrDefault(a => a.Position == AxisPosition.Bottom);
+ if (xAxis != null)
+ {
+ double minX = _pressureData.Min(p => p.X);
+ double maxX = _pressureData.Max(p => p.X);
+ xAxis.Minimum = minX;
+ xAxis.Maximum = maxX + 5; // 留一点余量
+ }
+ }
+
+ // 刷新图表
+ _plotModel.InvalidatePlot(true);
}
///
@@ -166,9 +206,28 @@ namespace 全自动水压检测仪
///
public void ClearData()
{
- _pressureValues?.Clear();
- _temperatureValues?.Clear();
- _timeLabels?.Clear();
+ _pressureData?.Clear();
+ _pressureSetData?.Clear();
+
+ if (_pressureSeries != null)
+ {
+ _pressureSeries.Points.Clear();
+ }
+
+ if (_pressureSetSeries != null)
+ {
+ _pressureSetSeries.Points.Clear();
+ }
+
+ // 重置X轴范围
+ var xAxis = _plotModel?.Axes.FirstOrDefault(a => a.Position == AxisPosition.Bottom);
+ if (xAxis != null)
+ {
+ xAxis.Minimum = 0;
+ xAxis.Maximum = 60;
+ }
+
+ _plotModel?.InvalidatePlot(true);
}
///
@@ -177,21 +236,26 @@ namespace 全自动水压检测仪
/// 是否为高温模式
public void UpdateChartMode(bool isHighTemperatureMode)
{
- if (_chart == null || _chart.Series.Count < 2)
+ if (_plotModel == null || _plotModel.Series.Count < 2)
return;
// 压力设定值曲线标题保持不变
- var pressureSetSeries = _chart.Series[1] as LineSeries;
- if (pressureSetSeries != null)
+ if (_pressureSetSeries != null)
{
- pressureSetSeries.Title = "压力设定值";
+ _pressureSetSeries.Title = "压力设定值";
}
// 可以根据模式调整Y轴范围(压力设定值范围)
- if (_chart.AxisY.Count > 1)
+ foreach (var axis in _plotModel.Axes)
{
- _chart.AxisY[1].MaxValue = 10; // 压力设定值通常不超过10MPa
+ if (axis.Key == "RightAxis")
+ {
+ axis.Maximum = 10; // 压力设定值通常不超过10MPa
+ break;
+ }
}
+
+ _plotModel.InvalidatePlot(true);
}
///
@@ -199,11 +263,12 @@ namespace 全自动水压检测仪
///
public void Dispose()
{
- _chartHost?.Dispose();
- _chart = null;
- _pressureValues = null;
- _temperatureValues = null;
- _timeLabels = null;
+ _plotView?.Dispose();
+ _plotModel = null;
+ _pressureSeries = null;
+ _pressureSetSeries = null;
+ _pressureData = null;
+ _pressureSetData = null;
}
}
}
diff --git a/全自动水压检测仪/NormalTemperatureMode.cs b/全自动水压检测仪/NormalTemperatureMode.cs
index 128b707..4661ddc 100644
--- a/全自动水压检测仪/NormalTemperatureMode.cs
+++ b/全自动水压检测仪/NormalTemperatureMode.cs
@@ -516,13 +516,13 @@ namespace 全自动水压检测仪
var pressure = c.UshortToFloat(modbusData.Real1[1], modbusData.Real1[0]);
var pressureSetValue = c.UshortToFloat(modbusData.Real12[1], modbusData.Real12[0]);
- // 获取测试时间(从PLC读取的时分秒)
+ // 获取测试时间(从PLC读取的时分秒)并计算总秒数
int seconds = (modbusData.Real6 != null && modbusData.Real6.Length >= 1) ? modbusData.Real6[0] : 0;
int minutes = (modbusData.Real7 != null && modbusData.Real7.Length >= 1) ? modbusData.Real7[0] : 0;
int hours = (modbusData.Real8 != null && modbusData.Real8.Length >= 1) ? modbusData.Real8[0] : 0;
- string testTime = $"{hours:D2}:{minutes:D2}:{seconds:D2}";
+ int totalSeconds = hours * 3600 + minutes * 60 + seconds;
- _chartManager?.AddDataPoint(pressure, pressureSetValue, testTime);
+ _chartManager?.AddDataPoint(pressure, pressureSetValue, totalSeconds);
}
catch (Exception chartEx)
{
diff --git a/全自动水压检测仪/packages.config b/全自动水压检测仪/packages.config
index 2c0a813..26df6df 100644
--- a/全自动水压检测仪/packages.config
+++ b/全自动水压检测仪/packages.config
@@ -7,11 +7,14 @@
-
-
+
+
+
+
+
diff --git a/全自动水压检测仪/全自动水压检测仪.csproj b/全自动水压检测仪/全自动水压检测仪.csproj
index 7b5d820..4917aed 100644
--- a/全自动水压检测仪/全自动水压检测仪.csproj
+++ b/全自动水压检测仪/全自动水压检测仪.csproj
@@ -12,6 +12,8 @@
512
true
true
+
+
AnyCPU
@@ -59,11 +61,15 @@
..\packages\K4os.Hash.xxHash.1.0.8\lib\net462\K4os.Hash.xxHash.dll
-
- ..\packages\LiveCharts.0.9.7\lib\net45\LiveCharts.dll
+
+ ..\packages\OxyPlot.Core.2.2.0\lib\net462\OxyPlot.dll
+ True
+ True
-
- ..\packages\LiveCharts.Wpf.0.9.7\lib\net45\LiveCharts.Wpf.dll
+
+ ..\packages\OxyPlot.WindowsForms.2.2.0\lib\net462\OxyPlot.WindowsForms.dll
+ True
+ False
..\packages\Microsoft.Bcl.AsyncInterfaces.9.0.1\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll
@@ -74,8 +80,6 @@
..\packages\NModbus4.2.1.0\lib\net40\NModbus4.dll
-
-
..\packages\SunnyUI.3.9.1\lib\net472\SunnyUI.dll
@@ -121,9 +125,6 @@
-
-
-
..\packages\ZstdSharp.Port.0.8.6\lib\net462\ZstdSharp.dll
@@ -284,4 +285,11 @@
+
+
+
+ 这台计算机上缺少此项目引用的 NuGet 程序包。使用“NuGet 程序包还原”可下载这些程序包。有关更多信息,请参见 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 {0}。
+
+
+
\ No newline at end of file