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; } // 双目视野面积
}
///
/// RecordPage.xaml 的交互逻辑
///
public partial class RecordPage : Page
{
// 表格数据源(ObservableCollection增删会自动更新UI)
private ObservableCollection _recordList = new ObservableCollection();
// 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;
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();
}
}