diff --git a/backend/app/schemas/platform.py b/backend/app/schemas/platform.py index 50cfa6f..8df34d1 100644 --- a/backend/app/schemas/platform.py +++ b/backend/app/schemas/platform.py @@ -117,11 +117,17 @@ class AlarmRule(BaseModel): enabled: bool = True +class TransformerChangeItem(BaseModel): + category: str + value: float = 1.0 + enabled: bool = False + + class LineAlarmSettingIn(BaseModel): line_no: int over_limit_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): diff --git a/backend/app/services/platform_service.py b/backend/app/services/platform_service.py index 98ec2c7..e49ec93 100644 --- a/backend/app/services/platform_service.py +++ b/backend/app/services/platform_service.py @@ -34,11 +34,67 @@ class PlatformService: self.device_client = MockDeviceClient() if settings.use_mock_device else CDeviceClient() def _safe_ratio(self, primary: float, secondary: float, default: float = 1.0) -> float: + """安全计算变比。 + + secondary 接近 0 时返回默认值,避免除 0。 + """ if abs(float(secondary)) < 1e-9: return default 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]: + """确定当前线路使用的 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 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) 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} 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 return ValueGroup( Ua=secondary.Ua * pt_ratio, @@ -130,6 +199,7 @@ class PlatformService: return ValueGroup(**group_data) def _normalize_realtime_precision(self, realtime: RealtimeData) -> RealtimeData: + """实时数据归一化:按配置变比计算一次值,并按界面要求控制小数位。""" line_list = [] for line in realtime.line_list: ratios = self._get_line_transformer_ratios(line) @@ -332,8 +402,8 @@ class PlatformService: ], "fault_alarm": [{"category": "PT断线", "delay": 180, "output_node": "开出1", "enabled": True}], "transformer_change": [ - {"category": "PT变化", "limit": 0.0, "delay": 0, "output_node": "", "enabled": False}, - {"category": "CT变化", "limit": 0.0, "delay": 0, "output_node": "", "enabled": False}, + {"category": "PT变化", "value": 1.0, "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"): if not isinstance(merged.get(key), list): 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 self._default_line_alarm_setting(line_no) diff --git a/backend/config/setting.json b/backend/config/setting.json index 25fede0..e821468 100644 --- a/backend/config/setting.json +++ b/backend/config/setting.json @@ -7,15 +7,15 @@ "category": "电压", "limit": 0.0, "delay": 0, - "output_node": "开出1", - "enabled": true + "output_node": "", + "enabled": false }, { "category": "电流", "limit": 0.0, "delay": 0, - "output_node": "开出2", - "enabled": true + "output_node": "", + "enabled": false }, { "category": "差流", @@ -57,18 +57,12 @@ ], "transformer_change": [ { - "category": "PT变化", - "limit": 0.0, - "delay": 0, - "output_node": "", - "enabled": false + "category": "PT变比", + "value": 104.0 }, { - "category": "CT变化", - "limit": 0.0, - "delay": 0, - "output_node": "", - "enabled": false + "category": "CT变比", + "value": 11.0 } ] }, @@ -130,16 +124,12 @@ "transformer_change": [ { "category": "PT变化", - "limit": 0.0, - "delay": 0, - "output_node": "", + "value": 10, "enabled": false }, { "category": "CT变化", - "limit": 0.0, - "delay": 0, - "output_node": "", + "value": 10, "enabled": false } ]