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
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <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", ""),
|
2026-04-20 09:17:02 +08:00
|
|
|
|
ReadAndUpdateFloatAsync(428, 2, bcjzxs, "F2", ""),
|
2026-04-18 18:14:12 +08:00
|
|
|
|
|
2026-04-20 09:17:02 +08:00
|
|
|
|
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", " "),
|
2026-04-18 18:14:12 +08:00
|
|
|
|
|
2026-04-20 09:17:02 +08:00
|
|
|
|
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(340,2, fwbc, "F2", " "),
|
|
|
|
|
|
ReadAndUpdateFloatAsync(330,2, djxw, "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 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();
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|