using Modbus.Device; using Sunny.UI; //using RecordDateView; using System; using System.Collections.Generic; 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 头罩视野.Services; using 头罩视野.Services.Data; namespace 头罩视野.Views { /// /// PageTest.xaml 的交互逻辑 /// public partial class PageTest : Page { private TcpClient _tcpClient => ModbusResourceManager.Instance.TcpClient; private IModbusMaster _modbusMaster => ModbusResourceManager.Instance.ModbusMaster; DispatcherTimer _timer; DataChange c = new DataChange(); Function ma; public PageTest() { InitializeComponent(); InitializeModbusTcp(); _timer = InitDispatcherTimer(); } //复位btn private void Button_Click_Reset(object sender, RoutedEventArgs e) { ma.BtnClickFunction(Function.ButtonType.复归型, 90); MessageBox.Show("数据已复位", "提示", MessageBoxButton.OK, MessageBoxImage.Information); } //左开眼 private void Button_Click_left(object sender, RoutedEventArgs e) { ma.BtnClickFunction(Function.ButtonType.切换型, 0); } //右开眼 private void Button_Click_Right(object sender, RoutedEventArgs e) { ma.BtnClickFunction(Function.ButtonType.切换型, 1); } //反转 private void Button_Click_Res(object sender, RoutedEventArgs e) { ma.BtnClickFunction(Function.ButtonType.复归型, 10); } //正转 private void Button_Click_For(object sender, RoutedEventArgs e) { ma.BtnClickFunction(Function.ButtonType.复归型, 11); } //测试btn private void Button_Click_Test(object sender, RoutedEventArgs e) { ma.BtnClickFunction(Function.ButtonType.复归型, 101); } //停止btn private void Button_Click_Stop(object sender, RoutedEventArgs e) { ma.BtnClickFunction(Function.ButtonType.复归型, 103); } //打印 private void Button_Click_Print(object sender, RoutedEventArgs e) { ma.BtnClickFunction(Function.ButtonType.复归型, 103); } //试样测试 private void RadioButton_Checked(object sender, RoutedEventArgs e) { ma.BtnClickFunction(Function.ButtonType.切换型, 41); } private void RadioButton_Unchecked(object sender, RoutedEventArgs e) { ma.BtnClickFunction(Function.ButtonType.切换型, 41); } private void Button_Click_home(object sender, RoutedEventArgs e) { NavigationService.Content = null; } //读取数据 private DispatcherTimer InitDispatcherTimer() { var timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(100) }; timer.Tick += async (s, e) => { if (_modbusMaster != null) { try { await ReadAddr262DataAsync(); } catch { } } }; return timer; } private async System.Threading.Tasks.Task ReadAddr262DataAsync() { try { // 创建任务列表 var tasks = new List { ReadAndUpdateFloatAsync(200, 2, fbspeed, "F2", "°"), ReadAndUpdateFloatAsync(202, 2, dqangle, "F2", "°"), ReadAndUpdateFloatAsync(310, 2, zdangle, "F2", "°/S"), ReadAndUpdateFloatAsync(204, 2, zmsyarea, "F2", "cm²"), ReadAndUpdateFloatAsync(208, 2, smsyarea, "F2", "cm²"), ReadAndUpdateFloatAsync(424 ,2, kbsyarea, "F2", "cm²"), ReadAndUpdateFloatAsync(210 ,2, ymsyarea, "F2", " "), ReadAndUpdateFloatAsync(206 ,2, xfsyarea, "F2", " "), ReadAndUpdateFloatAsync(430 ,2, sybhl, "F2", " "), }; await Task.WhenAll(tasks); } catch (Exception ex) { ShowError($"读取数据失败:{ex.Message}"); } } // 地址, 根据格式显示字符长度 32:2 16:1 ,绑定页面的name 值,F2 保留两位小数,单位 private async Task ReadAndUpdateFloatAsync(int address, int length, System.Windows.Controls.TextBox control, string format, string unit) { try { ushort[] registers = await Task.Run(async () => await _modbusMaster.ReadHoldingRegistersAsync(1, (ushort)address, (ushort)length) ); if (registers != null && registers.Length >= 2) { float value = c.UshortToFloat(registers[1], registers[0]); Dispatcher.Invoke(() => control.Text = value.ToString(format) + unit); } else if (registers != null && registers.Length >= 1) { int value = registers[0]; Dispatcher.Invoke(() => control.Text = value.ToString(format) + unit); } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"读取地址{address}失败:{ex.Message}"); } } private async Task ReadAndUpdateFloatAsync(int address, int length, System.Windows.Controls.TextBlock control, string format, string unit) { try { ushort[] registers = await Task.Run(async () => await _modbusMaster.ReadHoldingRegistersAsync(1, (ushort)address, (ushort)length) ); if (registers != null && registers.Length >= 2) { float value = c.UshortToFloat(registers[1], registers[0]); Dispatcher.Invoke(() => control.Text = value.ToString(format) + unit); } else if (registers != null && registers.Length >= 1) { int value = registers[0]; Dispatcher.Invoke(() => control.Text = value.ToString(format) + unit); } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"读取地址{address}失败:{ex.Message}"); } } private async Task ReadAndUpdateIntAsync(int address, int length, System.Windows.Controls.Control control, string format) { try { ushort[] registers = await Task.Run(() => _modbusMaster.ReadHoldingRegisters(1, (ushort)address, (ushort)length) ); if (registers != null && registers.Length >= 1) { int value = registers[0]; Dispatcher.Invoke(() => { if (control is System.Windows.Controls.ContentControl contentControl) contentControl.Content = value.ToString(format); else if (control is System.Windows.Controls.TextBox textBox) textBox.Text = value.ToString(format); }); } } catch (Exception ex) { System.Diagnostics.Debug.WriteLine($"读取地址{address}失败:{ex.Message}"); } } //写入 private void fbspeed_GotFocus(object sender, RoutedEventArgs e) { ma.WriteToPLCForNew(fbspeed.Text.Trim(), 200, Function.DataType.浮点型); //程序等待50s 在进行 System.Threading.Tasks.Task.Delay(50); fbspeed.Focus(); } private void dqangle_GotFocus(object sender, RoutedEventArgs e) { ma.WriteToPLCForNew(fbspeed.Text.Trim(), 202, Function.DataType.浮点型); System.Threading.Tasks.Task.Delay(50); fbspeed.Focus(); } private void zdangle_GotFocus(object sender, RoutedEventArgs e) { ma.WriteToPLCForNew(fbspeed.Text.Trim(), 310, Function.DataType.浮点型); System.Threading.Tasks.Task.Delay(50); fbspeed.Focus(); } //错误信息提示 private void ShowError(string msg) => MessageBox.Show(msg, "错误", MessageBoxButton.OK, MessageBoxImage.Error); 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(); private void InitializeModbusTcp() { try { string plcIp = "192.168.1.10"; bool initSuccess = ModbusResourceManager.Instance.Init(plcIp, 502); if (!initSuccess) { MessageBox.Show("连接Modbus服务器失败!", "错误"); //this.Close(); return; } // 检查连接状态 if (_tcpClient == null || !_tcpClient.Connected) { MessageBox.Show("Modbus连接异常!", "错误"); return; } ma = new Function(_modbusMaster); } catch (Exception ex) { ShowError($"Modbus初始化失败: {ex.Message}"); } } private void Page_Loaded(object sender, RoutedEventArgs e) { //InitializeModbusTcp(); _timer.Start(); } } }