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