2026-04-18 18:14:12 +08:00
|
|
|
|
using Modbus.Device;
|
|
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Collections.ObjectModel;
|
|
|
|
|
|
using System.ComponentModel;
|
|
|
|
|
|
using System.IO;
|
|
|
|
|
|
using System.Net.Sockets;
|
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
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.Navigation;
|
|
|
|
|
|
using System.Windows.Shapes;
|
|
|
|
|
|
using System.Windows.Threading;
|
|
|
|
|
|
using OfficeOpenXml;
|
|
|
|
|
|
using 头罩视野.Services.Data;
|
|
|
|
|
|
|
|
|
|
|
|
namespace 头罩视野.Views
|
|
|
|
|
|
{
|
|
|
|
|
|
public class RecordList
|
|
|
|
|
|
{
|
|
|
|
|
|
public int Id { get; set; } // 编号
|
|
|
|
|
|
public string Time { get; set; } = string.Empty; // 时间
|
|
|
|
|
|
public string Date { get; set; } = string.Empty; // 日期
|
|
|
|
|
|
public double LeftEyeArea { get; set; } // 左目视野面积
|
|
|
|
|
|
public double RightEyeArea { get; set; } // 右目视野面积
|
|
|
|
|
|
public double BinocularArea { get; set; } // 双目视野面积
|
|
|
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// RecordPage.xaml 的交互逻辑
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public partial class RecordPage : Page
|
|
|
|
|
|
{
|
|
|
|
|
|
// 表格数据源(ObservableCollection增删会自动更新UI)
|
|
|
|
|
|
private ObservableCollection<RecordList> _recordList = new ObservableCollection<RecordList>();
|
|
|
|
|
|
|
|
|
|
|
|
// Modbus通信对象(从你的全局单例获取)
|
|
|
|
|
|
private TcpClient _tcpClient => ModbusResourceManager.Instance.TcpClient;
|
|
|
|
|
|
private IModbusMaster _modbusMaster => ModbusResourceManager.Instance.ModbusMaster;
|
|
|
|
|
|
|
|
|
|
|
|
public RecordPage()
|
|
|
|
|
|
{
|
|
|
|
|
|
InitializeComponent();
|
|
|
|
|
|
// 绑定表格数据源
|
|
|
|
|
|
RecordDataGrid.ItemsSource = _recordList;
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
//#region 1. 从设备读取数据并添加到表格
|
|
|
|
|
|
public async System.Threading.Tasks.Task AddRecordFromDeviceAsync()
|
|
|
|
|
|
{
|
|
|
|
|
|
if (_modbusMaster == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
MessageBox.Show("设备未连接,无法读取数据!");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
|
{
|
|
|
|
|
|
// 1. 从设备读取数据(替换成你实际的寄存器地址)
|
|
|
|
|
|
ushort[] leftReg = await _modbusMaster.ReadHoldingRegistersAsync(1, 100, 2);
|
|
|
|
|
|
ushort[] rightReg = await _modbusMaster.ReadHoldingRegistersAsync(1, 102, 2);
|
|
|
|
|
|
ushort[] binocularReg = await _modbusMaster.ReadHoldingRegistersAsync(1, 104, 2);
|
|
|
|
|
|
|
|
|
|
|
|
// 2. 把寄存器数据转成float
|
|
|
|
|
|
float leftEye = ConvertRegistersToFloat(leftReg);
|
|
|
|
|
|
float rightEye = ConvertRegistersToFloat(rightReg);
|
|
|
|
|
|
float binocularEye = ConvertRegistersToFloat(binocularReg);
|
|
|
|
|
|
|
|
|
|
|
|
// 3. 新增一条记录
|
|
|
|
|
|
var now = DateTime.Now;
|
|
|
|
|
|
var newRecord = new RecordList
|
|
|
|
|
|
{
|
|
|
|
|
|
Id = _recordList.Count + 1,
|
|
|
|
|
|
Date = now.ToString("yyyy-MM-dd"),
|
|
|
|
|
|
Time = now.ToString("HH:mm:ss"),
|
|
|
|
|
|
LeftEyeArea = leftEye,
|
|
|
|
|
|
RightEyeArea = rightEye,
|
|
|
|
|
|
BinocularArea = binocularEye
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
// 4. 添加到表格(UI自动更新)
|
|
|
|
|
|
_recordList.Add(newRecord);
|
|
|
|
|
|
|
|
|
|
|
|
MessageBox.Show("数据读取成功,已添加到表格!");
|
|
|
|
|
|
}
|
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
|
{
|
|
|
|
|
|
MessageBox.Show($"读取设备数据失败:{ex.Message}");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 工具方法:Modbus寄存器转float
|
|
|
|
|
|
private float ConvertRegistersToFloat(ushort[] registers)
|
|
|
|
|
|
{
|
|
|
|
|
|
byte[] bytes = new byte[4];
|
|
|
|
|
|
bytes[0] = (byte)(registers[0] >> 8);
|
|
|
|
|
|
bytes[1] = (byte)(registers[0] & 0xFF);
|
|
|
|
|
|
bytes[2] = (byte)(registers[1] >> 8);
|
|
|
|
|
|
bytes[3] = (byte)(registers[1] & 0xFF);
|
|
|
|
|
|
return BitConverter.ToSingle(bytes, 0);
|
|
|
|
|
|
}
|
|
|
|
|
|
//#endregion
|
|
|
|
|
|
//#region 2. 清除表格数据
|
|
|
|
|
|
private void btnClear_Click(object sender, RoutedEventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
// 确认清除
|
|
|
|
|
|
if (MessageBox.Show("确定要清除所有记录吗?", "确认", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
|
|
|
|
|
|
{
|
|
|
|
|
|
_recordList.Clear();
|
|
|
|
|
|
MessageBox.Show("数据已清除!");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
//#endregion
|
|
|
|
|
|
//#region 3. 保存为Excel
|
|
|
|
|
|
private void btnSave_Click(object sender, RoutedEventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
// 你表格的数据源 👇
|
|
|
|
|
|
var dataList = RecordDataGrid.ItemsSource as IEnumerable<RecordList>;
|
|
|
|
|
|
|
|
|
|
|
|
if (dataList == null || !dataList.Any())
|
|
|
|
|
|
{
|
|
|
|
|
|
MessageBox.Show("没有数据可保存!");
|
|
|
|
|
|
return;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Microsoft.Win32.SaveFileDialog save = new Microsoft.Win32.SaveFileDialog();
|
|
|
|
|
|
save.Filter = "Excel 文件|*.xlsx";
|
|
|
|
|
|
save.FileName = "测试记录_" + DateTime.Now.ToString("yyyyMMddHHmmss");
|
|
|
|
|
|
|
|
|
|
|
|
if (save.ShowDialog() != true) return;
|
|
|
|
|
|
|
|
|
|
|
|
using (ExcelPackage package = new ExcelPackage())
|
|
|
|
|
|
{
|
|
|
|
|
|
ExcelWorksheet sheet = package.Workbook.Worksheets.Add("测试记录");
|
|
|
|
|
|
|
|
|
|
|
|
// 表头
|
|
|
|
|
|
sheet.Cells["A1"].Value = "编号";
|
|
|
|
|
|
sheet.Cells["B1"].Value = "时间";
|
|
|
|
|
|
sheet.Cells["C1"].Value = "日期";
|
|
|
|
|
|
sheet.Cells["D1"].Value = "左目视野面积";
|
|
|
|
|
|
sheet.Cells["E1"].Value = "右目视野面积";
|
|
|
|
|
|
sheet.Cells["F1"].Value = "双目视野面积";
|
|
|
|
|
|
|
|
|
|
|
|
// 写入数据
|
|
|
|
|
|
int row = 2;
|
|
|
|
|
|
foreach (var item in dataList)
|
2026-04-20 14:03:01 +08:00
|
|
|
|
|
|
|
|
|
|
|
2026-04-18 18:14:12 +08:00
|
|
|
|
{
|
|
|
|
|
|
sheet.Cells[row, 1].Value = item.Id;
|
|
|
|
|
|
sheet.Cells[row, 2].Value = item.Time;
|
|
|
|
|
|
sheet.Cells[row, 3].Value = item.Date;
|
|
|
|
|
|
sheet.Cells[row, 4].Value = item.LeftEyeArea;
|
|
|
|
|
|
sheet.Cells[row, 5].Value = item.RightEyeArea;
|
|
|
|
|
|
sheet.Cells[row, 6].Value = item.BinocularArea;
|
|
|
|
|
|
row++;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 保存
|
|
|
|
|
|
File.WriteAllBytes(save.FileName, package.GetAsByteArray());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
MessageBox.Show("保存成功!");
|
|
|
|
|
|
}
|
|
|
|
|
|
//#endregion
|
|
|
|
|
|
|
|
|
|
|
|
private void Page_Loaded(object sender, RoutedEventArgs e)
|
|
|
|
|
|
{
|
|
|
|
|
|
//InitializeModbusTcp();
|
|
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private void GoHome(object s, RoutedEventArgs e) => NavigationService.Content = null;
|
|
|
|
|
|
private void GoTest(object s, RoutedEventArgs e) => NavigationService.Content = new Views.PageTest();
|
|
|
|
|
|
private void GoRecord(object s, RoutedEventArgs e) => NavigationService.Content = new Views.RecordDate();
|
|
|
|
|
|
private void GoView(object s, RoutedEventArgs e) => NavigationService.Content = new Views.RecordPage();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|