Files
hoodFieldOfView/头罩视野slove/头罩视野/Views/RecordPage.xaml.cs
2026-04-18 18:38:54 +08:00

181 lines
6.8 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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)
{
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();
}
}