feat: 添加50%击穿电压参数支持
支持用户自定义50%击穿电压值,默认-1表示自动计算 在UI中添加相关配置开关
This commit is contained in:
10
core.py
10
core.py
@@ -2,7 +2,7 @@ import math
|
|||||||
import ezdxf
|
import ezdxf
|
||||||
import numpy as np
|
import numpy as np
|
||||||
from typing import List
|
from typing import List
|
||||||
|
from loguru import logger
|
||||||
gCAD = None
|
gCAD = None
|
||||||
gMSP = None
|
gMSP = None
|
||||||
gCount = 1
|
gCount = 1
|
||||||
@@ -28,6 +28,7 @@ class Parameter:
|
|||||||
ac_or_dc: str # 交流或直流标识,"AC" 或 "DC",默认 "AC"
|
ac_or_dc: str # 交流或直流标识,"AC" 或 "DC",默认 "AC"
|
||||||
z_0: float # 雷电波阻抗,默认 300
|
z_0: float # 雷电波阻抗,默认 300
|
||||||
z_c: float # 导线波阻抗,默认 251
|
z_c: float # 导线波阻抗,默认 251
|
||||||
|
u_50: float # 50%击穿电压,-1表示自动计算
|
||||||
|
|
||||||
|
|
||||||
def rg_line_function_factory(_rg, ground_angel): # 返回一个地面捕雷线的直线方程
|
def rg_line_function_factory(_rg, ground_angel): # 返回一个地面捕雷线的直线方程
|
||||||
@@ -187,13 +188,16 @@ def solve_circle_line_intersection(
|
|||||||
return [_x, _y]
|
return [_x, _y]
|
||||||
|
|
||||||
|
|
||||||
def min_i(string_len, u_ph, altitude: float = 0, z_0: float = 300, z_c: float = 251):
|
def min_i(string_len, u_ph, altitude: float = 0, z_0: float = 300, z_c: float = 251, u_50: float = None):
|
||||||
# 海拔修正
|
# 海拔修正
|
||||||
if altitude > 1000:
|
if altitude > 1000:
|
||||||
k_a = math.exp((altitude - 1000) / 8150) # 气隙海拔修正
|
k_a = math.exp((altitude - 1000) / 8150) # 气隙海拔修正
|
||||||
else:
|
else:
|
||||||
k_a = 1
|
k_a = 1
|
||||||
u_50 = 1 / k_a * (530 * string_len + 35) # 50045 上附录的公式,实际应该用负极性电压的公式
|
# 只有在u_50未提供时才使用公式计算
|
||||||
|
if u_50 is None:
|
||||||
|
u_50 = 1 / k_a * (530 * string_len + 35) # 50045 上附录的公式,实际应该用负极性电压的公式
|
||||||
|
logger.info(f"50%击穿电压为: {u_50}kV")
|
||||||
# u_50 = 1 / k_a * (533 * string_len + 132) # 串放电路径 1000m海拔
|
# u_50 = 1 / k_a * (533 * string_len + 132) # 串放电路径 1000m海拔
|
||||||
# u_50 = 1 / k_a * (477 * string_len + 99) # 串放电路径 2000m海拔
|
# u_50 = 1 / k_a * (477 * string_len + 99) # 串放电路径 2000m海拔
|
||||||
# u_50 = 615 * string_len # 导线对塔身放电 1000m海拔
|
# u_50 = 615 * string_len # 导线对塔身放电 1000m海拔
|
||||||
|
|||||||
@@ -49,10 +49,13 @@ def read_parameter(toml_file_path) -> Parameter:
|
|||||||
para.h_arm = toml_parameter["h_arm"]
|
para.h_arm = toml_parameter["h_arm"]
|
||||||
para.altitude = toml_parameter["altitude"]
|
para.altitude = toml_parameter["altitude"]
|
||||||
para.rated_voltage = toml_parameter["rated_voltage"]
|
para.rated_voltage = toml_parameter["rated_voltage"]
|
||||||
|
para.z_0 = toml_parameter.get("z_0", 300) # 雷电波阻抗
|
||||||
|
para.z_c = toml_parameter.get("z_c", 251) # 导线波阻抗
|
||||||
toml_advance = toml_dict["advance"]
|
toml_advance = toml_dict["advance"]
|
||||||
para.ng = toml_advance["ng"] # 地闪密度
|
para.ng = toml_advance["ng"] # 地闪密度
|
||||||
para.Ip_a = toml_advance["Ip_a"] # 概率密度曲线系数a
|
para.Ip_a = toml_advance["Ip_a"] # 概率密度曲线系数a
|
||||||
para.Ip_b = toml_advance["Ip_b"] # 概率密度曲线系数b
|
para.Ip_b = toml_advance["Ip_b"] # 概率密度曲线系数b
|
||||||
|
para.u_50 = toml_advance.get("u_50", -1) # 50%击穿电压,-1表示自动计算
|
||||||
toml_optional = toml_dict["optional"]
|
toml_optional = toml_dict["optional"]
|
||||||
para.voltage_n = toml_optional["voltage_n"] # 工作电压分成多少份来计算
|
para.voltage_n = toml_optional["voltage_n"] # 工作电压分成多少份来计算
|
||||||
para.max_i = toml_optional["max_i"]
|
para.max_i = toml_optional["max_i"]
|
||||||
@@ -152,7 +155,9 @@ def egm():
|
|||||||
i_max = 0
|
i_max = 0
|
||||||
insulator_c_len = para.insulator_c_len
|
insulator_c_len = para.insulator_c_len
|
||||||
# i_min = min_i(insulator_c_len, u_ph / 1.732)
|
# i_min = min_i(insulator_c_len, u_ph / 1.732)
|
||||||
i_min = min_i(insulator_c_len, u_ph, para.altitude)
|
# u_50: -1表示自动计算,其他值表示使用提供的值
|
||||||
|
u_50_value = para.u_50 if para.u_50 > 0 else None
|
||||||
|
i_min = min_i(insulator_c_len, u_ph, para.altitude, para.z_0, para.z_c, u_50_value)
|
||||||
_min_i = i_min # 尝试的最小电流
|
_min_i = i_min # 尝试的最小电流
|
||||||
_max_i = para.max_i # 尝试的最大电流
|
_max_i = para.max_i # 尝试的最大电流
|
||||||
# cad.draw(i_min, u_ph, rs_x, rs_y, rc_x, rc_y, rg_x, rg_y, rg_type, 2)
|
# cad.draw(i_min, u_ph, rs_x, rs_y, rc_x, rc_y, rg_x, rg_y, rg_type, 2)
|
||||||
|
|||||||
7
main.py
7
main.py
@@ -56,10 +56,13 @@ def read_parameter(toml_file_path) -> Parameter:
|
|||||||
para.altitude = toml_parameter["altitude"]
|
para.altitude = toml_parameter["altitude"]
|
||||||
para.rated_voltage = toml_parameter["rated_voltage"]
|
para.rated_voltage = toml_parameter["rated_voltage"]
|
||||||
para.ac_or_dc = toml_parameter.get("ac_or_dc", "AC") # 交流或直流标识,默认AC
|
para.ac_or_dc = toml_parameter.get("ac_or_dc", "AC") # 交流或直流标识,默认AC
|
||||||
|
para.z_0 = toml_parameter.get("z_0", 300) # 雷电波阻抗
|
||||||
|
para.z_c = toml_parameter.get("z_c", 251) # 导线波阻抗
|
||||||
toml_advance = toml_dict["advance"]
|
toml_advance = toml_dict["advance"]
|
||||||
para.ng = toml_advance["ng"] # 地闪密度
|
para.ng = toml_advance["ng"] # 地闪密度
|
||||||
para.Ip_a = toml_advance["Ip_a"] # 概率密度曲线系数a
|
para.Ip_a = toml_advance["Ip_a"] # 概率密度曲线系数a
|
||||||
para.Ip_b = toml_advance["Ip_b"] # 概率密度曲线系数b
|
para.Ip_b = toml_advance["Ip_b"] # 概率密度曲线系数b
|
||||||
|
para.u_50 = toml_advance.get("u_50", -1) # 50%击穿电压,-1表示自动计算
|
||||||
toml_optional = toml_dict["optional"]
|
toml_optional = toml_dict["optional"]
|
||||||
para.voltage_n = toml_optional["voltage_n"] # 工作电压分成多少份来计算
|
para.voltage_n = toml_optional["voltage_n"] # 工作电压分成多少份来计算
|
||||||
para.max_i = toml_optional["max_i"]
|
para.max_i = toml_optional["max_i"]
|
||||||
@@ -175,7 +178,9 @@ def run_egm(para: Parameter, animation=None) -> dict:
|
|||||||
insulator_c_len = para.insulator_c_len
|
insulator_c_len = para.insulator_c_len
|
||||||
# i_min = min_i(insulator_c_len, u_ph / 1.732)
|
# i_min = min_i(insulator_c_len, u_ph / 1.732)
|
||||||
# TODO 需要考虑交、直流
|
# TODO 需要考虑交、直流
|
||||||
i_min = min_i(insulator_c_len, u_ph, para.altitude, para.z_0, para.z_c)
|
# u_50: -1表示自动计算,其他值表示使用提供的值
|
||||||
|
u_50_value = para.u_50 if para.u_50 > 0 else None
|
||||||
|
i_min = min_i(insulator_c_len, u_ph, para.altitude, para.z_0, para.z_c, u_50_value)
|
||||||
_min_i = i_min # 尝试的最小电流
|
_min_i = i_min # 尝试的最小电流
|
||||||
_max_i = para.max_i # 尝试的最大电流
|
_max_i = para.max_i # 尝试的最大电流
|
||||||
# cad.draw(i_min, u_ph, rs_x, rs_y, rc_x, rc_y, rg_x, rg_y, rg_type, 2)
|
# cad.draw(i_min, u_ph, rs_x, rs_y, rc_x, rc_y, rg_x, rg_y, rg_type, 2)
|
||||||
|
|||||||
@@ -249,6 +249,26 @@
|
|||||||
</q-input>
|
</q-input>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<!-- 50%击穿电压设置开关 -->
|
||||||
|
<div class="q-mt-md">
|
||||||
|
<q-toggle
|
||||||
|
v-model="showU50"
|
||||||
|
label="设置50%击穿电压 (U_50)"
|
||||||
|
color="primary"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
<div class="row q-col-gutter-md q-mt-sm" v-if="showU50">
|
||||||
|
<div class="col-12">
|
||||||
|
<q-input
|
||||||
|
v-model="params.advance.u_50"
|
||||||
|
type="number"
|
||||||
|
step="1"
|
||||||
|
label="50%击穿电压 U_50 (kV)"
|
||||||
|
>
|
||||||
|
<q-tooltip>自定义50%击穿电压值,默认-1表示使用公式计算</q-tooltip>
|
||||||
|
</q-input>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</q-card-section>
|
</q-card-section>
|
||||||
</q-card>
|
</q-card>
|
||||||
|
|
||||||
@@ -405,7 +425,8 @@ const defaultParams: AllParameters = {
|
|||||||
advance: {
|
advance: {
|
||||||
ng: -1,
|
ng: -1,
|
||||||
Ip_a: -1,
|
Ip_a: -1,
|
||||||
Ip_b: -1
|
Ip_b: -1,
|
||||||
|
u_50: -1
|
||||||
},
|
},
|
||||||
optional: {
|
optional: {
|
||||||
voltage_n: 3,
|
voltage_n: 3,
|
||||||
@@ -422,6 +443,8 @@ const animationRef = ref<InstanceType<typeof Animation> | null>(null)
|
|||||||
const fileInput = ref<HTMLInputElement | null>(null)
|
const fileInput = ref<HTMLInputElement | null>(null)
|
||||||
// 雷电流概率密度系数设置开关
|
// 雷电流概率密度系数设置开关
|
||||||
const showIpCoefficients = ref(false)
|
const showIpCoefficients = ref(false)
|
||||||
|
// 50%击穿电压设置开关
|
||||||
|
const showU50 = ref(false)
|
||||||
|
|
||||||
const voltageOptions = [
|
const voltageOptions = [
|
||||||
'110kV', '220kV', '330kV', '500kV', '750kV','1000kV',
|
'110kV', '220kV', '330kV', '500kV', '750kV','1000kV',
|
||||||
@@ -457,6 +480,17 @@ watch(
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// 监听50%击穿电压开关
|
||||||
|
watch(
|
||||||
|
showU50,
|
||||||
|
(show) => {
|
||||||
|
if (!show) {
|
||||||
|
// 关闭时重置为 -1(使用公式计算)
|
||||||
|
params.advance.u_50 = -1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
// 雷暴日与地闪密度相互转换,公式:ng = 0.023 * td^3
|
// 雷暴日与地闪密度相互转换,公式:ng = 0.023 * td^3
|
||||||
// 标志位避免循环更新
|
// 标志位避免循环更新
|
||||||
let isUpdatingFromWatch = false
|
let isUpdatingFromWatch = false
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ export interface AdvanceParameter {
|
|||||||
ng: number // 地闪密度 (次/(km²·a))
|
ng: number // 地闪密度 (次/(km²·a))
|
||||||
Ip_a: number // 雷电流概率密度曲线系数a
|
Ip_a: number // 雷电流概率密度曲线系数a
|
||||||
Ip_b: number // 雷电流概率密度曲线系数b
|
Ip_b: number // 雷电流概率密度曲线系数b
|
||||||
|
u_50: number // 50%击穿电压 (kV),-1表示自动计算
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface OptionalParameter {
|
export interface OptionalParameter {
|
||||||
|
|||||||
@@ -329,6 +329,7 @@ class EGMWebApp:
|
|||||||
para.ng = float(advance_data.get('ng', -1))
|
para.ng = float(advance_data.get('ng', -1))
|
||||||
para.Ip_a = float(advance_data.get('Ip_a', -1))
|
para.Ip_a = float(advance_data.get('Ip_a', -1))
|
||||||
para.Ip_b = float(advance_data.get('Ip_b', -1))
|
para.Ip_b = float(advance_data.get('Ip_b', -1))
|
||||||
|
para.u_50 = float(advance_data.get('u_50', -1))
|
||||||
|
|
||||||
para.voltage_n = int(optional_data.get('voltage_n', 3))
|
para.voltage_n = int(optional_data.get('voltage_n', 3))
|
||||||
para.max_i = float(optional_data.get('max_i', 200))
|
para.max_i = float(optional_data.get('max_i', 200))
|
||||||
|
|||||||
Reference in New Issue
Block a user