提交一次值计算的更新

This commit is contained in:
root 2026-06-12 13:32:58 +08:00
parent 6083aed1a4
commit be669ab6f2
3 changed files with 102 additions and 23 deletions

View File

@ -117,11 +117,17 @@ class AlarmRule(BaseModel):
enabled: bool = True enabled: bool = True
class TransformerChangeItem(BaseModel):
category: str
value: float = 1.0
enabled: bool = False
class LineAlarmSettingIn(BaseModel): class LineAlarmSettingIn(BaseModel):
line_no: int line_no: int
over_limit_alarm: List[AlarmRule] = Field(default_factory=list) over_limit_alarm: List[AlarmRule] = Field(default_factory=list)
fault_alarm: List[AlarmRule] = Field(default_factory=list) fault_alarm: List[AlarmRule] = Field(default_factory=list)
transformer_change: List[AlarmRule] = Field(default_factory=list) transformer_change: List[TransformerChangeItem] = Field(default_factory=list)
class AiAlarmSettingIn(BaseModel): class AiAlarmSettingIn(BaseModel):

View File

@ -34,11 +34,67 @@ class PlatformService:
self.device_client = MockDeviceClient() if settings.use_mock_device else CDeviceClient() self.device_client = MockDeviceClient() if settings.use_mock_device else CDeviceClient()
def _safe_ratio(self, primary: float, secondary: float, default: float = 1.0) -> float: def _safe_ratio(self, primary: float, secondary: float, default: float = 1.0) -> float:
"""安全计算变比。
secondary 接近 0 时返回默认值避免除 0
"""
if abs(float(secondary)) < 1e-9: if abs(float(secondary)) < 1e-9:
return default return default
return float(primary) / float(secondary) return float(primary) / float(secondary)
def _get_config_transformer_ratios(self, line_no: int) -> Dict[str, float]:
"""从配置文件读取 PT/CT 变比。
来源setting.json -> line_alarm_setting[].transformer_change[]
当前约定category PT变化/CT变化兼容旧的PT变比/CT变比 value兼容旧 limit字段
"""
try:
current = self.config_repo.read_setting_section("line_alarm_setting")
except Exception:
current = None
line_alarm_list = self._normalize_line_alarm_settings(current)
for item in line_alarm_list:
if item.get("line_no") != line_no:
continue
transformer_list = item.get("transformer_change")
if not isinstance(transformer_list, list):
return {}
pt_ratio: Optional[float] = None
ct_ratio: Optional[float] = None
for transformer in transformer_list:
if not isinstance(transformer, dict):
continue
category = str(transformer.get("category", "")).strip()
raw_value = transformer.get("value", transformer.get("limit", 1.0))
try:
value = float(raw_value)
except (TypeError, ValueError):
value = 1.0
if value <= 0:
value = 1.0
if category in {"PT变化", "PT变比"}:
pt_ratio = value
if category in {"CT变化", "CT变比"}:
ct_ratio = value
result: Dict[str, float] = {}
if pt_ratio is not None:
result["pt_ratio"] = pt_ratio
if ct_ratio is not None:
result["ct_ratio"] = ct_ratio
return result
return {}
def _get_line_transformer_ratios(self, line: LineData) -> Dict[str, float]: def _get_line_transformer_ratios(self, line: LineData) -> Dict[str, float]:
"""确定当前线路使用的 PT/CT 变比。
优先级
1) 配置文件中指定的变比若存在
2) 由设备返回的 pri/sec 数据反算得到的变比兜底
"""
config_ratios = self._get_config_transformer_ratios(line.line_no)
if config_ratios.get("pt_ratio") is not None and config_ratios.get("ct_ratio") is not None:
return {"pt_ratio": float(config_ratios["pt_ratio"]), "ct_ratio": float(config_ratios["ct_ratio"])}
pri = line.pri_val pri = line.pri_val
sec = line.sec_val sec = line.sec_val
@ -58,9 +114,22 @@ class PlatformService:
pt_ratio = next((ratio for ratio in pt_ratio_candidates if ratio > 0), 1.0) pt_ratio = next((ratio for ratio in pt_ratio_candidates if ratio > 0), 1.0)
ct_ratio = next((ratio for ratio in ct_ratio_candidates if ratio > 0), 1.0) ct_ratio = next((ratio for ratio in ct_ratio_candidates if ratio > 0), 1.0)
if config_ratios.get("pt_ratio") is not None:
pt_ratio = float(config_ratios["pt_ratio"])
if config_ratios.get("ct_ratio") is not None:
ct_ratio = float(config_ratios["ct_ratio"])
return {"pt_ratio": pt_ratio, "ct_ratio": ct_ratio} return {"pt_ratio": pt_ratio, "ct_ratio": ct_ratio}
def _build_primary_from_secondary(self, secondary: ValueGroup, pt_ratio: float, ct_ratio: float) -> ValueGroup: def _build_primary_from_secondary(self, secondary: ValueGroup, pt_ratio: float, ct_ratio: float) -> ValueGroup:
"""根据二次值和变比计算一次值。
规则
- 电压一次值 = 电压二次值 * PT
- 电流一次值 = 电流二次值 * CT
- 功率一次值 = 功率二次值 * PT * CT
- 频率一次值 = 频率二次值
- 功率因数一次值 = 功率因数二次值
"""
power_ratio = pt_ratio * ct_ratio power_ratio = pt_ratio * ct_ratio
return ValueGroup( return ValueGroup(
Ua=secondary.Ua * pt_ratio, Ua=secondary.Ua * pt_ratio,
@ -130,6 +199,7 @@ class PlatformService:
return ValueGroup(**group_data) return ValueGroup(**group_data)
def _normalize_realtime_precision(self, realtime: RealtimeData) -> RealtimeData: def _normalize_realtime_precision(self, realtime: RealtimeData) -> RealtimeData:
"""实时数据归一化:按配置变比计算一次值,并按界面要求控制小数位。"""
line_list = [] line_list = []
for line in realtime.line_list: for line in realtime.line_list:
ratios = self._get_line_transformer_ratios(line) ratios = self._get_line_transformer_ratios(line)
@ -332,8 +402,8 @@ class PlatformService:
], ],
"fault_alarm": [{"category": "PT断线", "delay": 180, "output_node": "开出1", "enabled": True}], "fault_alarm": [{"category": "PT断线", "delay": 180, "output_node": "开出1", "enabled": True}],
"transformer_change": [ "transformer_change": [
{"category": "PT变化", "limit": 0.0, "delay": 0, "output_node": "", "enabled": False}, {"category": "PT变化", "value": 1.0, "enabled": False},
{"category": "CT变化", "limit": 0.0, "delay": 0, "output_node": "", "enabled": False}, {"category": "CT变化", "value": 1.0, "enabled": False},
], ],
} }
@ -387,6 +457,19 @@ class PlatformService:
for key in ("over_limit_alarm", "fault_alarm", "transformer_change"): for key in ("over_limit_alarm", "fault_alarm", "transformer_change"):
if not isinstance(merged.get(key), list): if not isinstance(merged.get(key), list):
merged[key] = self._default_line_alarm_setting(line_no)[key] merged[key] = self._default_line_alarm_setting(line_no)[key]
normalized_transformer: List[Dict[str, Any]] = []
for transformer in merged.get("transformer_change", []):
if not isinstance(transformer, dict):
continue
category = transformer.get("category", "")
enabled = bool(transformer.get("enabled", False))
raw_value = transformer.get("value", transformer.get("limit", 1.0))
try:
value = float(raw_value)
except (TypeError, ValueError):
value = 1.0
normalized_transformer.append({"category": category, "value": value, "enabled": enabled})
merged["transformer_change"] = normalized_transformer
return merged return merged
return self._default_line_alarm_setting(line_no) return self._default_line_alarm_setting(line_no)

View File

@ -7,15 +7,15 @@
"category": "电压", "category": "电压",
"limit": 0.0, "limit": 0.0,
"delay": 0, "delay": 0,
"output_node": "开出1", "output_node": "",
"enabled": true "enabled": false
}, },
{ {
"category": "电流", "category": "电流",
"limit": 0.0, "limit": 0.0,
"delay": 0, "delay": 0,
"output_node": "开出2", "output_node": "",
"enabled": true "enabled": false
}, },
{ {
"category": "差流", "category": "差流",
@ -57,18 +57,12 @@
], ],
"transformer_change": [ "transformer_change": [
{ {
"category": "PT变化", "category": "PT变比",
"limit": 0.0, "value": 104.0
"delay": 0,
"output_node": "",
"enabled": false
}, },
{ {
"category": "CT变化", "category": "CT变比",
"limit": 0.0, "value": 11.0
"delay": 0,
"output_node": "",
"enabled": false
} }
] ]
}, },
@ -130,16 +124,12 @@
"transformer_change": [ "transformer_change": [
{ {
"category": "PT变化", "category": "PT变化",
"limit": 0.0, "value": 10,
"delay": 0,
"output_node": "",
"enabled": false "enabled": false
}, },
{ {
"category": "CT变化", "category": "CT变化",
"limit": 0.0, "value": 10,
"delay": 0,
"output_node": "",
"enabled": false "enabled": false
} }
] ]