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(); } }