using Microsoft.Win32;
using Modbus;
using Modbus.Device;
using OfficeOpenXml;
using OxyPlot;
using Sunny.UI;
using System;
using System.ComponentModel.DataAnnotations;
using System.Configuration;
using System.Data.SQLite;
using System.Diagnostics;
using System.Diagnostics.Metrics;
using System.IO;
using System.Net;
using System.Net.Sockets;
using System.Threading.Tasks;
using System.Timers;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using 口罩泄露定制款;
using static ShanghaiEnvironmentalTechnology.Window5;
namespace ShanghaiEnvironmentalTechnology
{
///
/// 气流压力测试窗口(Modbus通信+数据记录)
///
public partial class Window1 : Window, IDisposable
{
#region 寄存器/线圈地址定义(按功能分组)
// 压力相关地址
private readonly ushort _pressureSettingRegisterAddress = 0x0138; // 压力设置地址
private readonly ushort _pressureRegisterAddress = 1372; // 实时压力读取地址
private readonly ushort _calibrationCoilAddress = 72; // 校准线圈(M72)
private readonly ushort _settingRegisterAddress = 312; // 流量记录地址
// 流量相关地址
private readonly ushort _flowAddress = 0x0078; // 实时流量读取地址
private readonly ushort _flowRegisterAddress = 0x0170; // 流量记录地址
private readonly ushort _flow2Address = 368; // 实时流量读取地址
// 测试控制线圈
private readonly ushort _testStartAddress = 60; // 测试启动(M60)
private readonly ushort _testStatusAddress = 0x003C; // 测试状态读取(同启动地址)
private readonly ushort _testStopAddress = 62; // 测试停止(M62)
#endregion
#region 私有字段
private TcpClient _tcpClient;
private IModbusMaster _modbusMaster;
private System.Timers.Timer _pressureReadTimer; // 实时压力定时器
private System.Timers.Timer _settingReadTimer; // 设定实时压力定时器
private System.Timers.Timer _flowTimer; // 实时流量定时器
private System.Timers.Timer startTimer; // 启动状态实时定时器
#endregion
DataChange c = new DataChange();
Function fc;
public Window1()
{
InitializeComponent();
InitializeModbusTcp();
Loaded += Window_Loaded;
}
#region 初始化与资源释放
///
/// 初始化Modbus连接和定时器
///
private void InitializeModbusTcp()
{
try
{
string plcIp = ConfigurationManager.AppSettings["PLC1_IP"];
int plcPort = int.Parse(ConfigurationManager.AppSettings["PLC1_Port"]);
_tcpClient = new TcpClient(plcIp, plcPort);
_modbusMaster = ModbusIpMaster.CreateIp(_tcpClient);
_modbusMaster.Transport.ReadTimeout = 3000;
_modbusMaster.Transport.WriteTimeout = 3000;
// 初始化定时器(1秒间隔)
_pressureReadTimer = CreateTimer(1000, OnPressureTimerElapsed);
_settingReadTimer = CreateTimer(1000, OnSettingReadTimerTimerElapsed);
_flowTimer = CreateTimer(1000, OnFlowTimerElapsed);
startTimer = CreateTimer(1000, OnStartTimerElapsed);
fc = new Function(_modbusMaster);
// 初始化数据库
InitializeDatabase();
}
catch (Exception ex)
{
ShowError($"Modbus初始化失败: {ex.Message}");
}
}
///
/// 通用定时器创建方法
///
private System.Timers.Timer CreateTimer(int intervalMs, ElapsedEventHandler elapsedAction)
{
var timer = new System.Timers.Timer(intervalMs)
{
AutoReset = true,
Enabled = true
};
timer.Elapsed += elapsedAction;
return timer;
}
///
/// 释放资源(定时器、TCP连接)
///
public void Dispose()
{
_pressureReadTimer?.Dispose();
_flowTimer?.Dispose();
_tcpClient?.Close();
_tcpClient?.Dispose();
_modbusMaster = null;
}
///
/// 窗口关闭时释放资源
///
protected override void OnClosed(EventArgs e)
{
base.OnClosed(e);
Dispose();
}
#endregion
#region 定时器读取逻辑
///
/// 实时压力读取定时器
///
private void OnPressureTimerElapsed(object sender, ElapsedEventArgs e)
{
ReadAndUpdateRegister(
_pressureRegisterAddress, true,
value => UpdatePressureUI(value.ToString())
);
}
///
/// 设定实时压力读取定时器
///
private void OnSettingReadTimerTimerElapsed(object sender, ElapsedEventArgs e)
{
ReadAndUpdateRegister(
_settingRegisterAddress, true,
value => UpdateSettingUI(value.ToString())
);
}
///
/// 实时流量读取定时器
///
private void OnFlowTimerElapsed(object sender, ElapsedEventArgs e)
{
ReadAndUpdateRegister(
_flowAddress, true,
value => UpdateFlowPressureUI(value.ToString())
);
}
///
/// 实时流量读取定时器(修正跨线程访问UI问题)
///
private void OnStartTimerElapsed(object sender, ElapsedEventArgs e)
{
try
{
bool[] result = _modbusMaster?.ReadCoils(0x01, 61, 1);
bool isTestRunning = result != null && result.Length > 0 && result[0];
string testStartButtonText = "";
string ButtonStatus = "";
string currentLanguage = ConfigurationManager.AppSettings["Language"] ?? "zh-CN";
if (currentLanguage == "en-US")
{
testStartButtonText = "Test Start Success";
ButtonStatus = "Test initiation";
}
else if (currentLanguage == "zh-CN")
{
testStartButtonText = "测试启动成功";
ButtonStatus = "测试启动";
}
TestStartButton.Dispatcher.Invoke(() =>
{
if (isTestRunning)
{
btnsetting.IsEnabled = false;
btnjiaozhun.IsEnabled = false;
TestStartButton.Content = testStartButtonText;
TestStartButton.Foreground = Brushes.LightGreen;
}
else
{
btnsetting.IsEnabled = true;
btnjiaozhun.IsEnabled = true;
TestStartButton.Content = ButtonStatus;
TestStartButton.Foreground = Brushes.White;
}
});
}
catch (Exception ex)
{
Console.WriteLine($"读取线圈或更新UI失败:{ex.Message}");
}
}
///
/// 通用寄存器读取并更新UI,支持16位整数和32位浮点数
///
/// 起始地址
/// 是否为浮点型(占用2个寄存器)
/// 更新UI的回调函数
private void ReadAndUpdateRegister(ushort address, bool isFloat, Action