Files
hoodFieldOfView/头罩视野slove/头罩视野/Views/VisiData.xaml.cs
2026-04-20 09:17:02 +08:00

256 lines
9.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
{
/// <summary>
/// VisiData.xaml 的交互逻辑
/// </summary>
public partial class VisiData : Page
{
private TcpClient _tcpClient => ModbusResourceManager.Instance.TcpClient;
private IModbusMaster _modbusMaster => ModbusResourceManager.Instance.ModbusMaster;
DataChange c = new DataChange();
Function ma;
public VisiData()
{
InitializeComponent();
}
//复位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);
}
//反转
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 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<Task>
{
ReadAndUpdateFloatAsync(350, 1, sdtsj1, "F2", ""),
ReadAndUpdateFloatAsync(351, 1, sdtsj2, "F2", ""),
ReadAndUpdateFloatAsync(352, 1, sdtsj3, "F2", ""),
ReadAndUpdateFloatAsync(353, 1, sdtsj4, "F2", ""),
ReadAndUpdateFloatAsync(354, 1, sdtsj5, "F2", ""),
ReadAndUpdateFloatAsync(212, 2, zymjxs, "F2", ""),
ReadAndUpdateFloatAsync(214, 2, yymjxs, "F2", ""),
ReadAndUpdateFloatAsync(428, 2, bcjzxs, "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", " "),
ReadAndUpdateFloatAsync(340,2, fwbc, "F2", " "),
ReadAndUpdateFloatAsync(330,2, djxw, "F2", " "),
};
await Task.WhenAll(tasks);
}
catch (Exception ex)
{
ShowError($"读取数据失败:{ex.Message}");
}
}
// 地址, 根据格式显示字符长度 322 161 绑定页面的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 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();
}
}
}