181 lines
6.8 KiB
C#
181 lines
6.8 KiB
C#
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();
|
||
}
|
||
}
|