using Modbus.Device; using Sunny.UI; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Net.Sockets; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using 鲁尔圆锥接头测试仪.Data; namespace 鲁尔圆锥接头测试仪 { public partial class TestScreen : UIForm { TestScreen testScreen; private main _main; private TestScreen _TestScreen; private DebugScreen _DebugScreen; private CoefficientSetting _CoefficientSetting; private WeepingTest _WeepingTest; private LeakageTest _LeakageTest; private SeparatTest _SeparartTest; private UnsrewtorqueTest _UnsrewtorqueTest; private EasyassemblyTest _EasyassembleTest; private OverloadresTest _OverloadresTest; private StresscrackTest _StresscrackTest; private UncrewseptorqueTest _UncrewseptorqueTest; private TcpClient _tcpClient => ModbusResourceManager.Instance.TcpClient; private IModbusMaster _modbusMaster => ModbusResourceManager.Instance.ModbusMaster; Function ma; DataChange c; Timer timeTimer; public TestScreen() { InitializeComponent(); InitTimer(); InitComboBoxPattern(); } private void InitTimer() { Timer timeTimer = new Timer(); timeTimer.Interval = 300; timeTimer.Tick += TimeTimer_Tick; timeTimer.Start(); } private void TimeTimer_Tick(object sender, EventArgs e) { Lab_time.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); } private void TestScreen_Load(object sender, EventArgs e) { string plcIp = "192.168.1.10"; bool initSuccess = Data.ModbusResourceManager.Instance.Init(plcIp, 502); if (!initSuccess) { MessageBox.Show("连接Modbus服务器失败!", "错误"); this.Close(); return; } // 检查连接状态 if (_tcpClient == null || !_tcpClient.Connected) { MessageBox.Show("Modbus连接异常!", "错误"); this.Close(); return; } ma = new Function(_modbusMaster); c = new DataChange(); ushort[] value = _modbusMaster.ReadHoldingRegisters(1, 50, 1); Combox_pattern.SelectedIndex = value[0]; } private bool TryReconnect() { try { string plcIp = "192.168.1.10"; bool initSuccess = Data.ModbusResourceManager.Instance.Init(plcIp, 502); if (initSuccess) { ma = new Function(_modbusMaster); return true; } } catch (Exception ex) { //ShowErrorMsg($"重新连接失败:{ex.Message}"); } return false; } private void SwitchWindow(ref T windowInstance, Func createFunc) where T : UIForm { //1.停止当前窗口的定时器(不释放资源) timeTimer?.Stop(); // 2. 检查资源是否可用(添加重连机制) if (_tcpClient == null || !_tcpClient.Connected || _modbusMaster == null) { //尝试重新连接 bool reconnectSuccess = TryReconnect(); if (!reconnectSuccess) { MessageBox.Show("TCP连接已断开,请重新连接!", "提示"); return; } } // 3. 复用窗口实例:不存在则创建,存在则激活 if (windowInstance == null) { windowInstance = createFunc(); // 添加窗口关闭事件处理 windowInstance.Closed += (s, args) => { // 窗口关闭时重新启动定时器并显示当前窗口 //_readTimer?.Start(); //this.Show(); this.Activate(); }; } else { // 激活已存在的窗口(前置显示) windowInstance.Activate(); return; } // 4. 切换窗口:隐藏当前窗口,显示目标窗口(非模态) this.Hide(); windowInstance.Show(); // 使用 Show() 而不是 ShowDialog() } private void Btn_home_Click(object sender, EventArgs e) { SwitchWindow(ref _main, () => new main()); } //测试实验 private void Btn_testscreen_Click(object sender, EventArgs e) { } private void Btn_debug_Click(object sender, EventArgs e) { SwitchWindow(ref _DebugScreen, () => new DebugScreen()); } private void uiButton1_Click(object sender, EventArgs e) { SwitchWindow(ref _CoefficientSetting, () => new CoefficientSetting()); } private void Btn_weepingtest_Click(object sender, EventArgs e) { _modbusMaster.WriteSingleCoil(1, 30, true); //ma?.BtnClickFunctionForNew(Function.ButtonType.置位型 ,30); SwitchWindow(ref _WeepingTest, () => new WeepingTest()); } private void Btn_leakagetest_Click(object sender, EventArgs e) { _modbusMaster.WriteSingleCoil(1, 31, true); SwitchWindow(ref _LeakageTest, () => new LeakageTest()); } private void Btn_separattest_Click(object sender, EventArgs e) { _modbusMaster.WriteSingleCoil(1, 32, true); SwitchWindow(ref _SeparartTest, () => new SeparatTest()); } private void Btn_unscrewsetorquetest_Click(object sender, EventArgs e) { _modbusMaster.WriteSingleCoil(1, 33, true); SwitchWindow(ref _UnsrewtorqueTest, () => new UnsrewtorqueTest()); } private void Btn_easyassemblytest_Click(object sender, EventArgs e) { _modbusMaster.WriteSingleCoil(1, 34, true); SwitchWindow(ref _EasyassembleTest, () => new EasyassemblyTest()); } private void Btn_overloadrestest_Click(object sender, EventArgs e) { _modbusMaster.WriteSingleCoil(1, 35, true); SwitchWindow(ref _OverloadresTest, () => new OverloadresTest()); } private void Btn_stresscracktest_Click(object sender, EventArgs e) { _modbusMaster.WriteSingleCoil(1, 36, true); SwitchWindow(ref _StresscrackTest, () => new StresscrackTest()); } private void Btn_Uncrewseptorquetest_Click(object sender, EventArgs e) { _modbusMaster.WriteSingleCoil(1, 37, true); SwitchWindow(ref _UncrewseptorqueTest, () => new UncrewseptorqueTest()); } private void TestScreen_FormClosed(object sender, FormClosedEventArgs e) { _TestScreen?.Close(); } private void TestScreen_FormClosing(object sender, FormClosingEventArgs e) { // 停止定时器 timeTimer?.Stop(); timeTimer?.Dispose(); // 释放主定时器 // 释放Modbus资源 ModbusResourceManager.Instance?.Dispose(); // 确保应用程序完全退出 Application.Exit(); } private void InitComboBoxPattern() { // 清空原有选项(可选,避免重复添加) //Combox_pattern.Items.Clear(); // 定义需要添加的选项数组 string[] options = { "GB/T 1962.1", "GB/T 1962.2", "YY/T 0916.20", "ISO 80369", "自定义" }; Combox_pattern.Items.AddRange(options); if (Combox_pattern.Items.Count > 0) { //Combox_pattern.SelectedIndex = 0; } } private void Combox_pattern_SelectedIndexChanged(object sender, EventArgs e) { ushort selectedIndex = ushort.Parse(Combox_pattern.SelectedIndex.ToString()); _modbusMaster?.WriteSingleRegister(1, 50, selectedIndex); //switch (selectedIndex) //{ // case 0: // Combox_pattern.Text = "GB/T 1962.1"; // //break; // case 1: // //Combox_pattern.Text = "GB/T 1962.2"; // break; // case 2: // //Combox_pattern.Text = "YY/T 0916.20"; // break; // case 3: // //Combox_pattern.Text = "ISO 80369"; // break; // case 4: // //Combox_pattern.Text = "自定义"; // break; //} } } }