Files
hoodFieldOfView/头罩视野slove/头罩视野/Views/VisiData.xaml.cs

317 lines
12 KiB
C#
Raw Normal View History

2026-04-18 18:14:12 +08:00

using System;
using System.Collections.Generic;
using Modbus.Device;
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
{
public partial class VisiData : Page
{
2026-04-21 10:39:07 +08:00
2026-04-18 18:14:12 +08:00
private IModbusMaster _modbusMaster => ModbusResourceManager.Instance.ModbusMaster;
2026-04-20 14:03:01 +08:00
DispatcherTimer _timer;
2026-04-18 18:14:12 +08:00
DataChange c = new DataChange();
Function ma;
public VisiData()
{
InitializeComponent();
2026-04-21 10:39:07 +08:00
2026-04-20 14:03:01 +08:00
_timer = InitDispatcherTimer();
2026-04-21 13:36:09 +08:00
// 判断连接
if (!ModbusHelper.IsConnected)
{
MessageBox.Show("未连接");
return;
}
// 获取客户端
var client = ModbusHelper.TcpClient;
2026-04-18 18:14:12 +08:00
}
//复位btn
private void Button_Click_Reset(object sender, RoutedEventArgs e)
{
ma.BtnClickFunction(Function.ButtonType., 90);
}
//左开眼
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);
}
2026-04-20 14:03:01 +08:00
2026-04-18 18:14:12 +08:00
//反转
2026-04-20 14:03:01 +08:00
private bool _isPressing = false;
private async void Button_Click_ResDown(object sender, MouseButtonEventArgs e)
{
((Button)sender).CaptureMouse();
_isPressing = true;
await Task.Run(() => {
//重新占位写入
_modbusMaster.WriteSingleCoilAsync(1, 10, true);
Task.Delay(100);
System.Diagnostics.Debug.WriteLine("stard1111");
});
}
private void Button_Click_ResUp(object sender, MouseButtonEventArgs e)
2026-04-18 18:14:12 +08:00
{
2026-04-20 14:03:01 +08:00
((Button)sender).ReleaseMouseCapture();
_isPressing = false;
System.Diagnostics.Debug.WriteLine("end1111");
2026-04-18 18:14:12 +08:00
}
//正转
2026-04-20 14:03:01 +08:00
private bool _isPressing1 = false;
private async void Button_Click_ForDown(object sender, MouseButtonEventArgs e)
{
((Button)sender).CaptureMouse();
_isPressing1 = true;
await Task.Run(() => {
//重新占位写入
_modbusMaster.WriteSingleCoilAsync(1, 11, true);
System.Diagnostics.Debug.WriteLine("正传start");
Task.Delay(100);
});
}
2026-04-18 18:14:12 +08:00
2026-04-20 14:03:01 +08:00
private void Button_Click_ForUp(object sender, MouseButtonEventArgs e)
2026-04-18 18:14:12 +08:00
{
2026-04-20 14:03:01 +08:00
((Button)sender).ReleaseMouseCapture();
_isPressing1 = false;
System.Diagnostics.Debug.WriteLine("正传end");
2026-04-18 18:14:12 +08:00
}
2026-04-20 14:03:01 +08:00
2026-04-18 18:14:12 +08:00
//测试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);
}
//读取
2026-04-20 14:03:01 +08:00
//读取数据
2026-04-18 18:14:12 +08:00
private DispatcherTimer InitDispatcherTimer()
{
var timer = new DispatcherTimer
{
2026-04-21 16:39:29 +08:00
Interval = TimeSpan.FromMilliseconds(500)
2026-04-18 18:14:12 +08:00
};
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<Task>
{
2026-04-21 16:39:29 +08:00
//ReadAndUpdateFloatAsync(350, 1, c, "F2", ""),
//ReadAndUpdateFloatAsync(351, 1, sdtsj2, "F2", ""),
//ReadAndUpdateFloatAsync(352, 1, sdtsj3, "F2", ""),
//ReadAndUpdateFloatAsync(353, 1, sdtsj4, "F2", ""),
//ReadAndUpdateFloatAsync(354, 1, sdtsj5, "F2", ""),
//ReadAndUpdateFloatAsync(355, 1, xdtsj1, "F2", " "),
//ReadAndUpdateFloatAsync(356, 1, xdtsj2, "F2", " "),
//ReadAndUpdateFloatAsync(357, 1, xdtsj3, "F2", " "),
//ReadAndUpdateFloatAsync(358, 1, xdtsj4, "F2", " "),
//ReadAndUpdateFloatAsync(359, 1, xdtsj5, "F2", " "),
//ReadAndUpdateFloatAsync(360, 1, zdtsj1, "F2", " "),
//ReadAndUpdateFloatAsync(361, 1, zdtsj2, "F2", " "),
//ReadAndUpdateFloatAsync(362, 1, zdtsj3, "F2", " "),
//ReadAndUpdateFloatAsync(363, 1, zdtsj4, "F2", " "),
//ReadAndUpdateFloatAsync(364, 1, zdtsj5, "F2", " "),
2026-04-18 18:14:12 +08:00
ReadAndUpdateFloatAsync(212, 2, zymjxs, "F2", ""),
ReadAndUpdateFloatAsync(214, 2, yymjxs, "F2", ""),
2026-04-20 09:17:02 +08:00
ReadAndUpdateFloatAsync(428, 2, bcjzxs, "F2", ""),
2026-04-21 16:39:29 +08:00
ReadAndUpdateFloatAsync(340,2, fwbc, "F2", " "),
2026-04-18 18:14:12 +08:00
ReadAndUpdateFloatAsync(330,2, djxw, "F2", " "),
2026-04-21 16:39:29 +08:00
ReadAndUpdateFloatRangeAsync(350, 15, "F2", ""),
2026-04-18 18:14:12 +08:00
};
await Task.WhenAll(tasks);
}
catch (Exception ex)
{
ShowError($"读取数据失败:{ex.Message}");
}
}
2026-04-21 16:39:29 +08:00
private async Task ReadAndUpdateFloatRangeAsync(int address, int length, 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)
{
var controls = new TextBox[]
{
sdtsj1, sdtsj2, sdtsj3, sdtsj4, sdtsj5,
xdtsj1, xdtsj2, xdtsj3, xdtsj4, xdtsj5,
zdtsj1, zdtsj2, zdtsj3, zdtsj4, zdtsj5
};
2026-04-22 08:44:19 +08:00
// 一次在UI线程批量更新避免多次Invoke阻塞0
2026-04-21 16:39:29 +08:00
await Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
for (int i = 0; i < controls.Length; i++)
{
// 因为你这里是1个寄存器=1个值所以直接用registers[i]
controls[i].Text = registers[i].ToString(format);
}
}), DispatcherPriority.Background);
}
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine($"读取地址{address}失败:{ex.Message}");
}
}
2026-04-20 14:03:01 +08:00
// 地址, 根据格式显示字符长度 322 161 绑定页面的name 值F2 保留两位小数,单位
2026-04-18 18:14:12 +08:00
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 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();
2026-04-21 10:39:07 +08:00
2026-04-18 18:14:12 +08:00
private void Page_Loaded(object sender, RoutedEventArgs e)
{
2026-04-21 13:36:09 +08:00
2026-04-20 14:03:01 +08:00
_timer.Start();
2026-04-18 18:14:12 +08:00
2026-04-20 14:03:01 +08:00
ma = new Function(_modbusMaster);
c = new DataChange();
2026-04-18 18:14:12 +08:00
}
2026-04-21 16:39:29 +08:00
private void Page_Unloaded(object sender, RoutedEventArgs e)
{
_timer?.Stop();
}
2026-04-18 18:14:12 +08:00
}
}