using System; using System.IO.Ports; using System.Linq; using System.Net; using System.Net.NetworkInformation; using System.Net.Sockets; using System.Windows.Forms; using APS7100TestTool.Models; using APS7100TestTool.Services; namespace APS7100TestTool.Forms { public partial class SettingsForm : Form { private ConfigService _configService; private AppSettings _settings; public SettingsForm() { InitializeComponent(); _configService = new ConfigService(); LoadSettings(); } private void LoadSettings() { _settings = _configService.LoadAppSettings(); // 刷新串口列表 RefreshComPorts(); // 刷新本地IP列表 RefreshLocalIpAddresses(); // APS7100 设置 chkAutoConnectAPS7100.Checked = _settings.AutoConnectAPS7100; rbAPS7100Serial.Checked = _settings.APS7100ConnectionType == "Serial"; rbAPS7100Ethernet.Checked = _settings.APS7100ConnectionType == "Ethernet"; SelectComPort(cmbAPS7100ComPort, _settings.APS7100ComPort); cmbAPS7100BaudRate.Text = _settings.APS7100BaudRate.ToString(); txtAPS7100IpAddress.Text = _settings.APS7100IpAddress; numAPS7100Port.Value = _settings.APS7100Port; // PSW250 设置 chkAutoConnectPSW250.Checked = _settings.AutoConnectPSW250; rbPSW250Serial.Checked = _settings.PSW250ConnectionType == "Serial"; rbPSW250Ethernet.Checked = _settings.PSW250ConnectionType == "Ethernet"; SelectComPort(cmbPSW250ComPort, _settings.PSW250ComPort); cmbPSW250BaudRate.Text = _settings.PSW250BaudRate.ToString(); txtPSW250IpAddress.Text = _settings.PSW250IpAddress; numPSW250Port.Value = _settings.PSW250Port; // Modbus 设置 chkAutoStartModbus.Checked = _settings.AutoStartModbus; numModbusPort.Value = _settings.ModbusPort; SelectBindIpAddress(_settings.ModbusBindIpAddress); // 启动行为设置 chkStartMinimized.Checked = _settings.StartMinimized; UpdateUI(); } private void RefreshLocalIpAddresses() { cmbModbusBindIp.Items.Clear(); cmbModbusBindIp.Items.Add("0.0.0.0 (所有接口)"); try { // 获取所有网络接口 foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces()) { // 只获取已连接的接口 if (ni.OperationalStatus != OperationalStatus.Up) continue; // 获取 IPv4 地址 foreach (UnicastIPAddressInformation ip in ni.GetIPProperties().UnicastAddresses) { if (ip.Address.AddressFamily == AddressFamily.InterNetwork) { string displayText = $"{ip.Address} ({ni.Name})"; cmbModbusBindIp.Items.Add(displayText); } } } } catch (Exception) { // 忽略获取网络接口失败 } if (cmbModbusBindIp.Items.Count > 0) cmbModbusBindIp.SelectedIndex = 0; } private void SelectBindIpAddress(string ipAddress) { if (string.IsNullOrEmpty(ipAddress) || ipAddress == "0.0.0.0") { cmbModbusBindIp.SelectedIndex = 0; return; } // 查找匹配的 IP for (int i = 0; i < cmbModbusBindIp.Items.Count; i++) { string item = cmbModbusBindIp.Items[i].ToString(); if (item.StartsWith(ipAddress + " ") || item == ipAddress) { cmbModbusBindIp.SelectedIndex = i; return; } } // 如果没找到,选择第一项 cmbModbusBindIp.SelectedIndex = 0; } private string GetSelectedBindIpAddress() { if (cmbModbusBindIp.SelectedItem == null) return "0.0.0.0"; string selected = cmbModbusBindIp.SelectedItem.ToString(); // 提取 IP 地址部分(在括号之前) int spaceIndex = selected.IndexOf(' '); if (spaceIndex > 0) return selected.Substring(0, spaceIndex); return selected; } private void RefreshComPorts() { string[] ports = SerialPort.GetPortNames(); cmbAPS7100ComPort.Items.Clear(); cmbPSW250ComPort.Items.Clear(); cmbAPS7100ComPort.Items.AddRange(ports); cmbPSW250ComPort.Items.AddRange(ports); } private void SelectComPort(ComboBox cmb, string portName) { if (!string.IsNullOrEmpty(portName)) { int index = cmb.Items.IndexOf(portName); if (index >= 0) cmb.SelectedIndex = index; } } private void UpdateUI() { // APS7100 连接类型 UI bool isAPS7100Serial = rbAPS7100Serial.Checked; cmbAPS7100ComPort.Visible = isAPS7100Serial; lblAPS7100ComPort.Visible = isAPS7100Serial; cmbAPS7100BaudRate.Visible = isAPS7100Serial; lblAPS7100BaudRate.Visible = isAPS7100Serial; txtAPS7100IpAddress.Visible = !isAPS7100Serial; lblAPS7100IpAddress.Visible = !isAPS7100Serial; numAPS7100Port.Visible = !isAPS7100Serial; lblAPS7100Port.Visible = !isAPS7100Serial; // PSW250 连接类型 UI bool isPSW250Serial = rbPSW250Serial.Checked; cmbPSW250ComPort.Visible = isPSW250Serial; lblPSW250ComPort.Visible = isPSW250Serial; cmbPSW250BaudRate.Visible = isPSW250Serial; lblPSW250BaudRate.Visible = isPSW250Serial; txtPSW250IpAddress.Visible = !isPSW250Serial; lblPSW250IpAddress.Visible = !isPSW250Serial; numPSW250Port.Visible = !isPSW250Serial; lblPSW250Port.Visible = !isPSW250Serial; } private void rbAPS7100_CheckedChanged(object sender, EventArgs e) => UpdateUI(); private void rbPSW250_CheckedChanged(object sender, EventArgs e) => UpdateUI(); private void btnRefreshPorts_Click(object sender, EventArgs e) { RefreshComPorts(); MessageBox.Show("串口列表已刷新", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } private void btnSave_Click(object sender, EventArgs e) { try { // APS7100 设置 _settings.AutoConnectAPS7100 = chkAutoConnectAPS7100.Checked; _settings.APS7100ConnectionType = rbAPS7100Serial.Checked ? "Serial" : "Ethernet"; _settings.APS7100ComPort = cmbAPS7100ComPort.SelectedItem?.ToString() ?? ""; _settings.APS7100BaudRate = int.TryParse(cmbAPS7100BaudRate.Text, out int br1) ? br1 : 9600; _settings.APS7100IpAddress = txtAPS7100IpAddress.Text.Trim(); _settings.APS7100Port = (int)numAPS7100Port.Value; // PSW250 设置 _settings.AutoConnectPSW250 = chkAutoConnectPSW250.Checked; _settings.PSW250ConnectionType = rbPSW250Serial.Checked ? "Serial" : "Ethernet"; _settings.PSW250ComPort = cmbPSW250ComPort.SelectedItem?.ToString() ?? ""; _settings.PSW250BaudRate = int.TryParse(cmbPSW250BaudRate.Text, out int br2) ? br2 : 9600; _settings.PSW250IpAddress = txtPSW250IpAddress.Text.Trim(); _settings.PSW250Port = (int)numPSW250Port.Value; // Modbus 设置 _settings.AutoStartModbus = chkAutoStartModbus.Checked; _settings.ModbusPort = (int)numModbusPort.Value; _settings.ModbusBindIpAddress = GetSelectedBindIpAddress(); // 启动行为设置 _settings.StartMinimized = chkStartMinimized.Checked; _configService.SaveAppSettings(_settings); MessageBox.Show("设置已保存!\n\n自动连接设置将在下次启动程序时生效。", "保存成功", MessageBoxButtons.OK, MessageBoxIcon.Information); this.DialogResult = DialogResult.OK; this.Close(); } catch (Exception ex) { MessageBox.Show($"保存失败: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void btnCancel_Click(object sender, EventArgs e) { this.DialogResult = DialogResult.Cancel; this.Close(); } } }