更新状态
This commit is contained in:
@@ -54,9 +54,16 @@ namespace 全自动水压检测仪
|
|||||||
// 温度模式状态跟踪(用于防抖优化)
|
// 温度模式状态跟踪(用于防抖优化)
|
||||||
private bool _lastHighTempMode = false;
|
private bool _lastHighTempMode = false;
|
||||||
private bool _lastLowTempMode = false;
|
private bool _lastLowTempMode = false;
|
||||||
|
private Panel[] _normalTempLevelBarSegments = Array.Empty<Panel>();
|
||||||
|
private Panel[] _highTempLevelBarSegments = Array.Empty<Panel>();
|
||||||
|
|
||||||
private ConductivityRepository _repository;
|
private ConductivityRepository _repository;
|
||||||
|
|
||||||
|
private static readonly Color LevelBarOffColor = Color.FromArgb(224, 228, 232);
|
||||||
|
private static readonly Color LevelBarNormalColor = Color.FromArgb(82, 196, 26);
|
||||||
|
private static readonly Color LevelBarAlertColor = Color.FromArgb(255, 77, 79);
|
||||||
|
private static readonly Color LevelBarFaultColor = Color.FromArgb(250, 173, 20);
|
||||||
|
|
||||||
#region 报警监控相关字段和属性
|
#region 报警监控相关字段和属性
|
||||||
// 报警寄存器地址定义(根据图片内容)
|
// 报警寄存器地址定义(根据图片内容)
|
||||||
private const ushort PRESSURE_PROTECTION_ADDR = 10200; // M200 压力保护大于
|
private const ushort PRESSURE_PROTECTION_ADDR = 10200; // M200 压力保护大于
|
||||||
@@ -97,6 +104,7 @@ namespace 全自动水压检测仪
|
|||||||
public NormalTemperatureMode()
|
public NormalTemperatureMode()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
|
InitializeLiquidLevelStatusBars();
|
||||||
pressStopwatch = new Stopwatch();
|
pressStopwatch = new Stopwatch();
|
||||||
// 只创建定时器,不在构造器中启动,避免在 Load 前访问未初始化的资源
|
// 只创建定时器,不在构造器中启动,避免在 Load 前访问未初始化的资源
|
||||||
_readTimer = InitTimer(); // 保存引用
|
_readTimer = InitTimer(); // 保存引用
|
||||||
@@ -112,6 +120,150 @@ namespace 全自动水压检测仪
|
|||||||
_chartManager = new ChartManager();
|
_chartManager = new ChartManager();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void InitializeLiquidLevelStatusBars()
|
||||||
|
{
|
||||||
|
HideLegacyLiquidLevelControls();
|
||||||
|
|
||||||
|
_normalTempLevelBarSegments = CreateLiquidLevelStatusBar(uiPanel23, "normalTempLevelBar");
|
||||||
|
_highTempLevelBarSegments = CreateLiquidLevelStatusBar(uiPanel31, "highTempLevelBar");
|
||||||
|
|
||||||
|
UpdateLiquidLevelStatusBar(_normalTempLevelBarSegments, false, false, "常温液位");
|
||||||
|
UpdateLiquidLevelStatusBar(_highTempLevelBarSegments, false, false, "高温液位");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HideLegacyLiquidLevelControls()
|
||||||
|
{
|
||||||
|
Control[] legacyControls =
|
||||||
|
{
|
||||||
|
uiLight13, uiLight14, uiLight15, uiLight16,
|
||||||
|
uiLabel8, uiLabel12, uiLabel16, uiLabel27,
|
||||||
|
uiLabel17, uiLabel34
|
||||||
|
};
|
||||||
|
|
||||||
|
foreach (var control in legacyControls)
|
||||||
|
{
|
||||||
|
if (control == null || control.IsDisposed)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
control.Visible = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Panel[] CreateLiquidLevelStatusBar(Control hostPanel, string barName)
|
||||||
|
{
|
||||||
|
if (hostPanel == null || hostPanel.IsDisposed)
|
||||||
|
{
|
||||||
|
return Array.Empty<Panel>();
|
||||||
|
}
|
||||||
|
|
||||||
|
var framePanel = new Panel
|
||||||
|
{
|
||||||
|
Name = $"{barName}Frame",
|
||||||
|
Size = new Size(32, 34),
|
||||||
|
Anchor = AnchorStyles.Top | AnchorStyles.Right,
|
||||||
|
BackColor = Color.FromArgb(208, 213, 219),
|
||||||
|
Padding = new Padding(2)
|
||||||
|
};
|
||||||
|
|
||||||
|
var segmentLayout = new TableLayoutPanel
|
||||||
|
{
|
||||||
|
Name = $"{barName}Layout",
|
||||||
|
Dock = DockStyle.Fill,
|
||||||
|
Margin = Padding.Empty,
|
||||||
|
Padding = Padding.Empty,
|
||||||
|
ColumnCount = 1,
|
||||||
|
RowCount = 3,
|
||||||
|
BackColor = Color.White
|
||||||
|
};
|
||||||
|
|
||||||
|
segmentLayout.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100F));
|
||||||
|
segmentLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 33.3333F));
|
||||||
|
segmentLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 33.3333F));
|
||||||
|
segmentLayout.RowStyles.Add(new RowStyle(SizeType.Percent, 33.3334F));
|
||||||
|
|
||||||
|
var segments = new Panel[3];
|
||||||
|
for (int index = 0; index < segments.Length; index++)
|
||||||
|
{
|
||||||
|
var segment = new Panel
|
||||||
|
{
|
||||||
|
Name = $"{barName}Segment{index}",
|
||||||
|
Dock = DockStyle.Fill,
|
||||||
|
Margin = new Padding(1),
|
||||||
|
BackColor = LevelBarOffColor
|
||||||
|
};
|
||||||
|
|
||||||
|
segments[index] = segment;
|
||||||
|
segmentLayout.Controls.Add(segment, 0, 2 - index);
|
||||||
|
}
|
||||||
|
|
||||||
|
framePanel.Controls.Add(segmentLayout);
|
||||||
|
hostPanel.Controls.Add(framePanel);
|
||||||
|
framePanel.BringToFront();
|
||||||
|
|
||||||
|
void RepositionStatusBar(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
framePanel.Location = new Point(
|
||||||
|
Math.Max(110, hostPanel.ClientSize.Width - framePanel.Width - 16),
|
||||||
|
Math.Max(3, (hostPanel.ClientSize.Height - framePanel.Height) / 2));
|
||||||
|
}
|
||||||
|
|
||||||
|
hostPanel.SizeChanged += RepositionStatusBar;
|
||||||
|
RepositionStatusBar(hostPanel, EventArgs.Empty);
|
||||||
|
|
||||||
|
return segments;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static bool TryGetCoilValue(bool[] coilData, out bool value)
|
||||||
|
{
|
||||||
|
if (coilData != null && coilData.Length > 0)
|
||||||
|
{
|
||||||
|
value = coilData[0];
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
value = false;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void UpdateLiquidLevelStatusBar(Panel[] segments, bool sensorA, bool sensorB, string barName)
|
||||||
|
{
|
||||||
|
if (segments == null || segments.Length != 3)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Color[] colors;
|
||||||
|
if (!sensorA && !sensorB)
|
||||||
|
{
|
||||||
|
colors = new[] { LevelBarAlertColor, LevelBarAlertColor, LevelBarAlertColor };
|
||||||
|
}
|
||||||
|
else if (sensorA && !sensorB)
|
||||||
|
{
|
||||||
|
colors = new[] { LevelBarNormalColor, LevelBarNormalColor, LevelBarOffColor };
|
||||||
|
}
|
||||||
|
else if (sensorA && sensorB)
|
||||||
|
{
|
||||||
|
colors = new[] { LevelBarNormalColor, LevelBarNormalColor, LevelBarAlertColor };
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
colors = new[] { LevelBarFaultColor, LevelBarFaultColor, LevelBarFaultColor };
|
||||||
|
Debug.WriteLine($"[LiquidLevelStatusBar] 检测到异常液位组合: {barName}, A={sensorA}, B={sensorB}");
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int index = 0; index < segments.Length; index++)
|
||||||
|
{
|
||||||
|
if (segments[index] == null || segments[index].IsDisposed)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
segments[index].BackColor = colors[index];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private System.Windows.Forms.Timer InitAlarmMonitorTimer()
|
private System.Windows.Forms.Timer InitAlarmMonitorTimer()
|
||||||
{
|
{
|
||||||
var timer = new System.Windows.Forms.Timer()
|
var timer = new System.Windows.Forms.Timer()
|
||||||
@@ -501,59 +653,21 @@ namespace 全自动水压检测仪
|
|||||||
// if (percentage > 100) percentage = 100;
|
// if (percentage > 100) percentage = 100;
|
||||||
|
|
||||||
|
|
||||||
bool[] a = _modbusMaster?.ReadCoils(1, 10042, 1);
|
bool[] a = _modbusMaster?.ReadCoils(1, 10042, 1); // 常温低液位 0无水/1有水
|
||||||
bool[] b = _modbusMaster?.ReadCoils(1, 10043, 1);
|
bool[] b = _modbusMaster?.ReadCoils(1, 10043, 1); // 常温高液位 0无水/1有水
|
||||||
bool[] cc = _modbusMaster?.ReadCoils(1, 10040, 1);
|
bool[] cc = _modbusMaster?.ReadCoils(1, 10040, 1); // 高温低液位 0无水/1有水
|
||||||
bool[] d = _modbusMaster?.ReadCoils(1, 10041, 1);
|
bool[] d = _modbusMaster?.ReadCoils(1, 10041, 1); // 高温高液位 0无水/1有水
|
||||||
|
|
||||||
if (a != null && a.Length > 0)
|
if (TryGetCoilValue(a, out bool normalSensorA) &&
|
||||||
|
TryGetCoilValue(b, out bool normalSensorB))
|
||||||
{
|
{
|
||||||
if (a[0])
|
UpdateLiquidLevelStatusBar(_normalTempLevelBarSegments, normalSensorA, normalSensorB, "常温液位");
|
||||||
{
|
|
||||||
uiLight13.OnColor = System.Drawing.Color.Green;//有水
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else
|
if (TryGetCoilValue(cc, out bool highSensorA) &&
|
||||||
|
TryGetCoilValue(d, out bool highSensorB))
|
||||||
{
|
{
|
||||||
uiLight13.OnColor = System.Drawing.Color.Red;
|
UpdateLiquidLevelStatusBar(_highTempLevelBarSegments, highSensorA, highSensorB, "高温液位");
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (b != null && b.Length > 0)
|
|
||||||
{
|
|
||||||
if (!b[0])
|
|
||||||
{
|
|
||||||
uiLight14.OnColor = System.Drawing.Color.Green;//有水
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
uiLight14.OnColor = System.Drawing.Color.Red;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (cc != null && cc.Length > 0)
|
|
||||||
{
|
|
||||||
if (cc[0])
|
|
||||||
{
|
|
||||||
uiLight16.OnColor = System.Drawing.Color.Green;//有水
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
uiLight16.OnColor = System.Drawing.Color.Red;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (d != null && d.Length > 0)
|
|
||||||
{
|
|
||||||
if (!d[0])
|
|
||||||
{
|
|
||||||
uiLight15.OnColor = System.Drawing.Color.Green;//有水
|
|
||||||
}
|
|
||||||
|
|
||||||
else
|
|
||||||
{
|
|
||||||
uiLight15.OnColor = System.Drawing.Color.Red;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user