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