This commit is contained in:
xyy
2026-03-25 19:45:13 +08:00
parent f111ec9e25
commit aa4f3e1f4c
2 changed files with 115 additions and 34 deletions

View File

@@ -52,21 +52,29 @@
BorderThickness="0" Margin="0,0,10,0" Click="BtnCurve_Click"/> BorderThickness="0" Margin="0,0,10,0" Click="BtnCurve_Click"/>
</StackPanel> </StackPanel>
<!-- 右侧PLC连接区域 + 连接状态(靠右显示) --> <!-- 右侧PLC连接区域 + 连接状态 + IP/端口 + 连接按钮 -->
<StackPanel Grid.Column="1" Orientation="Horizontal" <StackPanel Grid.Column="1" Orientation="Horizontal"
HorizontalAlignment="Right" HorizontalAlignment="Right"
VerticalAlignment="Center" VerticalAlignment="Center"
Margin="0,0,20,0" Visibility="Hidden"> Margin="0,0,20,0">
<!-- IP和端口显示 -->
<TextBlock x:Name="TxtPLCIP" Text="IP: " FontSize="12" Foreground="White" Margin="0,0,5,0" VerticalAlignment="Center"/>
<TextBlock x:Name="TxtPLCIPValue" Text="192.168.1.170" FontSize="12" Foreground="White" Margin="0,0,15,0" VerticalAlignment="Center"/>
<TextBlock x:Name="TxtPLCPort" Text="Port: " FontSize="12" Foreground="White" Margin="0,0,5,0" VerticalAlignment="Center"/>
<TextBlock x:Name="TxtPLCPortValue" Text="502" FontSize="12" Foreground="White" Margin="0,0,15,0" VerticalAlignment="Center"/>
<!-- 连接状态 --> <!-- 连接按钮 -->
<Button x:Name="BtnConnectPLC" Content="连接PLC" Width="80" Height="30"
FontSize="12" Background="#27AE60" Foreground="White"
BorderThickness="0" Margin="10,0,0,0" Click="ConnectButton_Click"/>
<!-- 连接状态指示 -->
<StackPanel Orientation="Horizontal" Margin="15,0,0,0" <StackPanel Orientation="Horizontal" Margin="15,0,0,0"
VerticalAlignment="Center"> VerticalAlignment="Center">
<Ellipse Width="18" Height="18" Fill="{Binding StatusColor}" <Ellipse Width="18" Height="18" Fill="{Binding StatusColor}"
Margin="0,0,8,0"/> Margin="0,0,8,0"/>
<TextBlock Text="{Binding ConnectionStatus}" <TextBlock Text="{Binding ConnectionStatus}"
FontSize="14" Foreground="White"/> FontSize="12" Foreground="White"/>
</StackPanel> </StackPanel>
</StackPanel> </StackPanel>
</Grid> </Grid>

View File

@@ -113,6 +113,20 @@ namespace PLCDataMonitor
{ {
_hasInsertedReport = false; // 重置插入标记 _hasInsertedReport = false; // 重置插入标记
}; };
// 设置IP和端口显示
string ip = ConfigurationManager.AppSettings["PLC_IP"];
string port = ConfigurationManager.AppSettings["PLC_PORT"];
TxtPLCIPValue.Text = string.IsNullOrEmpty(ip) ? "192.168.1.170" : ip;
TxtPLCPortValue.Text = string.IsNullOrEmpty(port) ? "502" : port;
} }
public void SetupLogging() public void SetupLogging()
@@ -220,12 +234,13 @@ namespace PLCDataMonitor
{ {
_keepReading = false; _keepReading = false;
// 使用超时等待线程结束 // 等待线程结束,最多 2 秒
if (_readThread != null && _readThread.IsAlive) if (_readThread != null && _readThread.IsAlive)
{ {
if (!_readThread.Join(500)) if (!_readThread.Join(2000))
{ {
// 如果线程未结束,强制终止(慎用)
// _readThread.Abort(); // 不推荐,此处仅为保底
} }
} }
@@ -234,7 +249,8 @@ namespace PLCDataMonitor
if (_tcpClient != null) if (_tcpClient != null)
{ {
_tcpClient.Close(); if (_tcpClient.Connected)
_tcpClient.Close();
_tcpClient.Dispose(); _tcpClient.Dispose();
_tcpClient = null; _tcpClient = null;
} }
@@ -373,9 +389,12 @@ namespace PLCDataMonitor
// 连续读取 HR504.1 ~ HR504.55个线圈起始 41265 // 连续读取 HR504.1 ~ HR504.55个线圈起始 41265
alarmsHR504 = _modbusMaster?.ReadCoils(0x01, 41265, 5); alarmsHR504 = _modbusMaster?.ReadCoils(0x01, 41265, 5);
// 连续读取 HR509.0 ~ HR509.34个线圈起始 41345 // 连续读取 HR509.0 ~ HR509.34个线圈起始 41345
alarmsHR509 = _modbusMaster?.ReadCoils(0x01, 41344, 4); alarmsHR509 = _modbusMaster?.ReadCoils(0x01, 41344, 6);
}
catch
{
} }
catch { }
string alarmMessage = ""; string alarmMessage = "";
if (alarmsHR504 != null && alarmsHR504.Length >= 5) if (alarmsHR504 != null && alarmsHR504.Length >= 5)
@@ -387,19 +406,22 @@ namespace PLCDataMonitor
// 索引2=41267=测试完成(待确认) // 索引2=41267=测试完成(待确认)
if (alarmsHR504[2]) alarmMessage += "测试完成 "; if (alarmsHR504[2]) alarmMessage += "测试完成 ";
// 索引3=41268=摩擦力过大(待确认) // 索引3=41268=摩擦力过大(待确认)
if (alarmsHR504[3]) alarmMessage += "摩擦力过大 "; //if (alarmsHR504[3]) alarmMessage += "摩擦力过大 ";
// 索引4=41269=超温95℃待确认 // 索引4=41269=超温95℃待确认
if (alarmsHR504[4]) alarmMessage += "超温95℃ "; if (alarmsHR504[4]) alarmMessage += "超温95℃ ";
} }
if (alarmsHR509 != null && alarmsHR509.Length >= 4) if (alarmsHR509 != null && alarmsHR509.Length >= 6)
{ {
if (alarmsHR509[0]) alarmMessage += "1工位低水位 "; if (alarmsHR509[0]) alarmMessage += "1工位低水位 ";
if (alarmsHR509[2]) alarmMessage += "水泵未运行 "; if (alarmsHR509[2]) alarmMessage += "水泵未运行 ";
// 索引3=41348=2工位低水位 // 索引3=41348=2工位低水位
if (alarmsHR509[3]) alarmMessage += "2工位低水位 "; if (alarmsHR509[3]) alarmMessage += "2工位低水位 ";
if (alarmsHR509[4]) alarmMessage += "摩擦力过大 ";
if (alarmsHR509[5]) alarmMessage += "伺服驱动器报警,请清除 ";
} }
if (string.IsNullOrEmpty(alarmMessage))
alarmMessage = "无报警";
@@ -476,15 +498,34 @@ namespace PLCDataMonitor
}), System.Windows.Threading.DispatcherPriority.Background); }), System.Windows.Threading.DispatcherPriority.Background);
} }
else
{
// 如果连接标志为 true 但实际未连接,主动断开
if (_isConnected)
{
Dispatcher.BeginInvoke(new Action(() => DisconnectFromPLC()));
}
}
} }
catch (Exception ex) catch (Exception ex)
{ {
// 非阻塞地报告错误到 UI // 捕获 Socket 异常
Dispatcher.BeginInvoke(new Action(() => if (ex is SocketException || (ex.InnerException is SocketException) ||
ex.Message.Contains("non-connected") || ex.Message.Contains("socket"))
{ {
StatusColor = Brushes.Orange; // 连接已丢失,触发断开
ConnectionStatus = $"读取错误:{ex.Message}"; Dispatcher.BeginInvoke(new Action(() => DisconnectFromPLC()));
}), System.Windows.Threading.DispatcherPriority.Background); }
else
{
// 其他异常正常显示
Dispatcher.BeginInvoke(new Action(() =>
{
StatusColor = Brushes.Orange;
ConnectionStatus = $"读取错误:{ex.Message}";
}), System.Windows.Threading.DispatcherPriority.Background);
}
} }
Thread.Sleep(200); // 100ms刷新一次 Thread.Sleep(200); // 100ms刷新一次
} }
@@ -556,7 +597,21 @@ namespace PLCDataMonitor
} }
catch (Exception ex) catch (Exception ex)
{ {
throw new Exception($"Modbus读取错误{ex.Message}"); //throw new Exception($"Modbus读取错误{ex.Message}");
return (
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
true
);
} }
} }
@@ -567,14 +622,27 @@ namespace PLCDataMonitor
private void Window_Loaded(object sender, RoutedEventArgs e) private void Window_Loaded(object sender, RoutedEventArgs e)
{ {
if (!_isConnected) //if (!_isConnected)
{ //{
ConnectToPLC(); // ConnectToPLC();
} // if (_isConnected)
else // {
{ // BtnConnectPLC.Content = "断开PLC";
DisconnectFromPLC(); // BtnConnectPLC.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#E67E22"));
} // }
//}
//else
//{
// DisconnectFromPLC();
// BtnConnectPLC.Content = "连接PLC";
// BtnConnectPLC.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#27AE60"));
//}
// 只做界面初始化,不自动连接
// 确保连接按钮状态正确
BtnConnectPLC.Content = "连接PLC";
BtnConnectPLC.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#27AE60"));
StatusColor = Brushes.Red;
ConnectionStatus = "未连接";
} }
private void ConnectButton_Click(object sender, RoutedEventArgs e) private void ConnectButton_Click(object sender, RoutedEventArgs e)
@@ -582,10 +650,15 @@ namespace PLCDataMonitor
if (!_isConnected) if (!_isConnected)
{ {
ConnectToPLC(); ConnectToPLC();
// 更新按钮文本
BtnConnectPLC.Content = "断开PLC";
BtnConnectPLC.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#E67E22"));
} }
else else
{ {
DisconnectFromPLC(); DisconnectFromPLC();
BtnConnectPLC.Content = "连接PLC";
BtnConnectPLC.Background = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#27AE60"));
} }
} }