提交一次值计算的更新
This commit is contained in:
parent
6083aed1a4
commit
be669ab6f2
@ -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):
|
||||
|
||||
@ -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)
|
||||
|
||||
|
||||
@ -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
|
||||
}
|
||||
]
|
||||
|
||||
Loading…
Reference in New Issue
Block a user