|
|
@@ -190,49 +190,63 @@ public partial class AlarmService : ObservableObject, IDisposable
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
- /// 从项目档案检查报警
|
|
|
+ /// 从项目档案检查报警(根据 AlarmSource 配置决定检查来源)
|
|
|
/// </summary>
|
|
|
private void CheckAlarmsFromProfile(ProjectProfile profile, PlcDataModel data, DateTime now)
|
|
|
{
|
|
|
var thresholds = profile.AlarmThresholds;
|
|
|
+ var source = thresholds?.AlarmSource ?? "PLC";
|
|
|
|
|
|
- // 液位报警(从动态寄存器读取)
|
|
|
- foreach (var tank in profile.Tanks)
|
|
|
- {
|
|
|
- var level = data.GetAnalogRegister($"{tank.Name}.Level");
|
|
|
- CheckLevelAlarm(tank.Name, level, now);
|
|
|
- }
|
|
|
+ // PLC 模式:只信任 PLC 的 DI 开关量报警
|
|
|
+ // Host 模式:只走上位机模拟量阈值判断
|
|
|
+ // Both 模式:两套都检查(向后兼容)
|
|
|
+ bool checkAnalog = source == "Host" || source == "Both";
|
|
|
+ bool checkDI = source == "PLC" || source == "Both";
|
|
|
|
|
|
- // 仪表报警(压力/流量等)
|
|
|
- foreach (var gauge in profile.Gauges)
|
|
|
+ // ① 模拟量阈值检查(液位 + 仪表)— Host/Both 模式
|
|
|
+ if (checkAnalog)
|
|
|
{
|
|
|
- var value = data.GetAnalogRegister($"{gauge.Name}.Value");
|
|
|
- if (thresholds?.PressureHigh.HasValue == true && value > thresholds.PressureHigh.Value)
|
|
|
- CheckCondition($"Pressure_{gauge.Name}_High", $"{gauge.Name}过高: {value:F2} {gauge.Unit}", 2, now);
|
|
|
- else
|
|
|
- ClearCondition($"Pressure_{gauge.Name}_High");
|
|
|
+ // 液位报警(从动态寄存器读取)
|
|
|
+ foreach (var tank in profile.Tanks)
|
|
|
+ {
|
|
|
+ var level = data.GetAnalogRegister($"{tank.Name}.Level");
|
|
|
+ CheckLevelAlarm(tank.Name, level, now);
|
|
|
+ }
|
|
|
|
|
|
- if (thresholds?.PressureLow.HasValue == true && value < thresholds.PressureLow.Value)
|
|
|
- CheckCondition($"Pressure_{gauge.Name}_Low", $"{gauge.Name}过低: {value:F2} {gauge.Unit}", 2, now);
|
|
|
- else
|
|
|
- ClearCondition($"Pressure_{gauge.Name}_Low");
|
|
|
- }
|
|
|
+ // 仪表报警(压力/流量等)
|
|
|
+ foreach (var gauge in profile.Gauges)
|
|
|
+ {
|
|
|
+ var value = data.GetAnalogRegister($"{gauge.Name}.Value");
|
|
|
+ if (thresholds?.PressureHigh.HasValue == true && value > thresholds.PressureHigh.Value)
|
|
|
+ CheckCondition($"Pressure_{gauge.Name}_High", $"{gauge.Name}过高: {value:F2} {gauge.Unit}", 2, now);
|
|
|
+ else
|
|
|
+ ClearCondition($"Pressure_{gauge.Name}_High");
|
|
|
+
|
|
|
+ if (thresholds?.PressureLow.HasValue == true && value < thresholds.PressureLow.Value)
|
|
|
+ CheckCondition($"Pressure_{gauge.Name}_Low", $"{gauge.Name}过低: {value:F2} {gauge.Unit}", 2, now);
|
|
|
+ else
|
|
|
+ ClearCondition($"Pressure_{gauge.Name}_Low");
|
|
|
+ }
|
|
|
|
|
|
- // 泵故障报警
|
|
|
- foreach (var pump in profile.Pumps)
|
|
|
- {
|
|
|
- var fault = data.GetDigitalRegister($"{pump.Name}.Fault");
|
|
|
- CheckPumpFault(pump.Name, fault, now);
|
|
|
+ // 泵故障报警(寄存器读取)
|
|
|
+ foreach (var pump in profile.Pumps)
|
|
|
+ {
|
|
|
+ var fault = data.GetDigitalRegister($"{pump.Name}.Fault");
|
|
|
+ CheckPumpFault(pump.Name, fault, now);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
- // 通用 DI 报警(变频器故障等)
|
|
|
- foreach (var di in profile.DigitalInputs)
|
|
|
+ // ② PLC DI 报警 — PLC/Both 模式
|
|
|
+ if (checkDI)
|
|
|
{
|
|
|
- var isActive = data.GetDigitalRegister($"DI.{di.Name}");
|
|
|
- if (isActive)
|
|
|
- CheckCondition($"DI_{di.Name}", $"{di.Name} 触发", 2, now);
|
|
|
- else
|
|
|
- ClearCondition($"DI_{di.Name}");
|
|
|
+ foreach (var di in profile.DigitalInputs)
|
|
|
+ {
|
|
|
+ var isActive = data.GetDigitalRegister($"DI.{di.Name}");
|
|
|
+ if (isActive)
|
|
|
+ CheckCondition($"DI_{di.Name}", $"{di.Name} 触发", 2, now);
|
|
|
+ else
|
|
|
+ ClearCondition($"DI_{di.Name}");
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|