AnyMath 文档
Notebook

伴电流饱和的瞬态模式下的电力线继电保护装置的测试。 GOST70358-2022型号A4.2

导言

本例展示了一个500kv电力系统的模型,该系统旨在测试继电保护装置是否符合GOST70358-2022的要求。"该模型已根据指定标准的附录A4.2开发。

该示例还包括按照用于继电保护装置的测试程序以编程方式编辑模型的脚本。 测试程序在GOST的a4.3段中给出。 该示例演示了基本多重性和非周期分量的每个测试的一个实验。

继电保护装置在实时仿真装置上进行测试。 但是为了熟悉这个例子,你可以在Engee和KPM节奏中运行模型,并与被测设备的连接和配置。

模型描述

模型的参数和方案取自标准附录A第4.2段。

Снимок экрана 2026-01-19 162936.png Снимок экрана 2026-01-19 163056.png

让我们打开能源系统的模型:

In [ ]:
model_name = "gost_70358_model_A4.engee"
engee.open(model_name); # 打开模型
model = engee.load(model_name); # 下载模型以快速访问
path = engee.gcm().name; # 模型名称

初始化模型参数

该标准要求根据基本参数和变化进行测试:

*源的非周期分量的恒定衰减时间(.)
*来自源的短路电流分量的多重性()

首先,我们初始化模型的基本参数。

In [ ]:
# 采样周期
SampleTime = 50e-6;
# 基本VAH
V_base = [0 25 50 75 80 85 90 95 99 100 108];
I_base = [0 0.00215 0.0043 0.00675 0.0075 0.00868 0.011 0.02 0.044 0.05 10];
# 电流互感器参数(TT)
I1 = 1000
I2 = 1
R2 = 5
# 到短路点的相对距离
k_line = 0.0001

# 系统的基本有源电阻
R1s1_base = 0.229;
R0s1_base = 0.574;
R1s2_base = 0.18;
R0s2_base = 0.403;
# 系统的基本电感电阻
X1s1_base = 28.87;
X0s1_base = 72.16;
X1s2_base = 22.7;
X0s2_base = 50.59;

# 以COMTRADE格式保存结果的方法
results_path = "COMTRADE/测试1.1/A相饱和";
# 创建目录
mkpath(results_path);
results_path = results_path * "/AG";

下面的代码允许您根据标准的说明更改电力系统的参数。 现在代码根据基本模型设置参数:multiplicity .

In [ ]:
# ---系统参数的变化和转移到模型 ---
kl = 1; # 多重性
# 电流多重性与C1的变化
R1s1 = R1s1_base * kl;
X1s1 = X1s1_base * kl;
R0s1 = R0s1_base * kl;
X0s1 = X0s1_base * kl;
# 电流多重性与C2的变化
R1s2 = R1s2_base * kl;
X1s2 = X1s2_base * kl;
R0s2 = R0s2_base * kl;
X0s2 = X0s2_base * kl;
In [ ]:
# ---非周期分量相对于基本模型的变化 ---
Tp = 400e-3;
kTp = 400e-3 / Tp;
w = 2 * pi * 50;

R1s1 = X1s1_base / (w * Tp);
R0s1 = X0s1_base / (w * Tp);
R1s2 = X1s2_base / (w * Tp);
R0s2 = X0s2_base / (w * Tp);

完成上面的单元格后,模型就可以运行了。

创建脚本

为了方便按照测试程序创建场景,实现了一组收集在文件中的辅助方法。 ScenarioModule.jl. 同一个文件定义了专门用于存储模型参数的结构的构造函数。

下面是创建这些结构的实例的示例:

In [ ]:
# 加载模块
include("ScenarioModule.jl")
# 创建结构的实例
# Saturation_Characteristic存储参数以重新计算每个体验的VAC
satur = ScenarioModule.Saturation_Characteristic(V_base, I_base, I1, I2, R2, 0.025);
# 方案存储有关当前方案的信息。
# 在初始化期间,它需要一个Saturation_Characteristic实例来登录。
scenario = ScenarioModule.Scenario(engee.gcs().path, "RITM 1", satur);

由于短路发生在相同的时间间隔 (取决于电压通过零时的瞬间),使用这些方法允许您在未模拟电流互感器饱和的相位中自动设置剩余磁化。

因此,在a相短路的情况下,其余两相具有等于 ,具有与非周期分量相反的符号。

该模块包含所有方法的文档。 要阅读任何方法的描述,请直接从代码中调用帮助。:

In [ ]:
? ScenarioModule.set_fault_type!
Out[0]:

? ScenarioModule.set_fault_type!

方法从 ScenarioModule.jl 它们将在创建测试场景期间使用。

为了将情景的参数和重新计算的伏安特性(VAX)转移到模型中,提供了一种方法 save_mode!(). 该方法接受编辑的结构作为输入 Scenario 并将相应的参数保存到模型中。

In [ ]:
function save_mode!(s::ScenarioModule.Scenario)
    # 传输短路点的参数
    engee.set_param!(s.path * "/K1", "type" => s.K1)
    engee.set_param!(s.path * "/K2_4", "type" => s.K2_4)
    engee.set_param!(s.path * "/K_delayed", "type" => s.K_delayed)
    # 发送短路延迟
    if s.delay == 0
        engee.set_param!(s.path * "/K1_delay", "time_delay_off" => 2)
    else
        engee.set_param!(s.path * "/K1_delay", "time_delay_off" => s.delay)
    end
    engee.set_param!(s.path * "/K2_4_delay", "time_delay_on" => s.delay)
    # 经校正的VAH传送
    engee.set_param!(s.path * "/CT", "V" => s.Vabc, 
                    "I" => s.Iabc, "V_strt" => s.V_strt)
    # 电压跳变控制相位通过0
    engee.set_param!(s.path * "/U_control/ctrl_phase", "Value" => s.controlled_phase)
    # 相位传送到饱和时间检测单元
    engee.set_param!(s.path * "/饱和时间的确定", "phase" => s.controlled_phase)
end;

在KPM节奏或Engee环境中启动模型

该模型已准备在KPM节奏推出。 如果您在KPM RHYTHM上运行模型,那么您必须首先安装用于建模的软件管理的软件包。 然后,在测试期间,不要在Engee中运行模型,而是在连接的节奏机器上运行模型。 有关更多信息:[入门](https://engee.com/helpcenter/stable/ru/ritm/getting-started.html )和[使用软件管理与KPM"节奏"一起工作的一个例子](https://engee.com/helpcenter/stable/ru/ritm/working-with-RITM.html)。

要启用节奏,请取消注释模型中的节奏块并运行下面的代码:

In [ ]:
# #如果需要,安装节奏块支持和外部硬件支持包:
# engee.package.install("RITM-Engee-Blocks");
# engee.package.install("Engee-Device-Manager");
# engee.package.start("Engee-Device-Manager")
In [ ]:
# using Main.EngeeDeviceManager.Targets
# using Main.EngeeDeviceManager.Targets.RITM
# using Main.EngeeDeviceManager.Targets.RITM_API
# ritm = Targets.RITM.Ritm();
# ritm.set_url("http://192.168.56.3:8000/")

要在节奏上运行模拟,请将cEngee计算环境更改为目标硬件并运行计算。 仿真结果将显示在数据检查器信号可视化选项卡中。

如果在显示仿真结果时遇到错误,请减少记录信号的数量,并在更大的计算步骤通过速率转换块进行记录。 您可以随时通过[上传结果]获得准确的结果(https://engee.com/helpcenter/stable/ru/ritm/ritm-functions.html#EngeeDeviceManager ...目标。RITM_API。COMTRADE格式的GetFile-Tuple%7bany,%20string%7D)。

您还可以使用软件控制运行模拟,例如,按顺序运行所有测试。 为此,请使用下面的命令。 论点 is_external_mode = true 允许您在交互式执行模式中执行计算。 详细了解执行模式

In [ ]:
# Targets.build_deploy_start(ritm, engee.gcm(), is_external_mode=true)

如果您没有连接节奏,那么您可以使用Engee环境测试模型。

进行测试

测试1

测试1中,短路的位置是点-K2。 在参数中设置到短路的适当距离 k_line:

In [ ]:
k_line =  0.0001;
测试1.1

该测试旨在检查所有类型短路的保护操作。 在没有瞬态阻力的情况下对损坏进行建模。 在测试期间,依次迭代所有短路点,以及为其提供电流互感器饱和建模的所有相。

调用该方法时重新计算电流互感器的伏安特性 set_controlled_phase!() 有必要传输恒定非周期分量的值**** 和短路电流的周期分量的值**** . 对于标准模型,这些值是预先计算的。 电流互感器上的负载为5欧姆。 目标相位的残余磁化被假定为

In [ ]:
# 我们将仿真结果保存在相应的目录中。
results_path = "COMTRADE/测试1.1/A相饱和"
# 创建目录
mkpath(results_path)
# 包含目录路径的变量将传递到To COMTRADE块。
results_path = results_path * "/AG"

# 在点K2设置短路类型
ScenarioModule.set_fault_type!(scenario, "K2_4", "AG");
# 设置受控相位(饱和相位)
ScenarioModule.set_controlled_phase!(scenario, 6675, 0.4, phase='A', Rn=5, Kr=0.0);
# 此测试没有延迟(您不必指定)
ScenarioModule.set_delay!(scenario, 0);
# 保存接收到的脚本
save_mode!(scenario)

在KPM节奏上模拟时,需要传输完整的文件路径,例如,

results_path = joinpath("/home/ritm/build", engee.gcm().name, "build/AG")

创建并将脚本传输到模型后,我们可以运行模拟。

In [ ]:
results = engee.run(model);

在本例中给出的后续测试中,模型计算可以使用软件控制或手动运行。

获得的结果可以通过Visualization或*Data Inspector在模型本身中查看。*模拟结果也以COMTRADE格式记录并存储在与测试参数相对应的目录中。

In [ ]:
gr()
plot(
    results["I_TT"].time,
    reduce(hcat, results["I_TT"].value)',
    label = ["A阶段" "B阶段" "C期"],
    xlabel = "t, c",
    ylabel = "我,和",
    title = "试验1.1;a相饱和;短路类型:AG",
    color = ["goldenrod" "green" "red"],
    size  = (1100, 400),
    xlimits = (0.95, 1.2),
    legend = :bottomright
)
Out[0]:
No description has been provided for this image
测试1.2

发展短期条件。 第二个短路出现在点K_delayed处延迟10ms。

由于第二个短路出现在第一个短路后的半个周期,因此第二个损坏点的相位的残余磁化值需要镜像(因为残余磁化必须与非周期分量的符号相反)。

In [ ]:
# 我们将仿真结果保存在相应的目录中。
results_path = "COMTRADE/测试1.2/b相饱和"
mkpath(results_path)
results_path = results_path * "/BG + CAG"

ScenarioModule.set_delay!(scenario, 10);
# 两点短路
ScenarioModule.set_fault_type!(scenario, "K2_4", "BG", "K_delayed", "CAG");
ScenarioModule.set_controlled_phase!(scenario, 6675, 0.157, phase='B');
# 镜像完整的阶段
scenario.V_strt = [-scenario.V_strt[1], scenario.V_strt[2], -scenario.V_strt[3]];
# 保存脚本
save_mode!(scenario)
In [ ]:
engee.run(model); # 运行模拟
测试1.3

不对称短路。 两个短路同时发生。

让我们通过瞬态电阻进行短路实验。 为此,我们另外将瞬态电阻的值(按照标准-2欧姆)转移到第二个短路点。

In [ ]:
# 我们将仿真结果保存在相应的目录中。
results_path = "COMTRADE/测试1.3/C相饱和"
mkpath(results_path)
results_path = results_path * "/CG + ABG"

# 重置延迟
ScenarioModule.set_delay!(scenario, 0);
# 两点短路
ScenarioModule.set_fault_type!(scenario, "K2_4", "CG", "K_delayed", "ABG");
ScenarioModule.set_controlled_phase!(scenario, 9875, 0.292, phase='C');
# 保存脚本
save_mode!(scenario)
engee.set_param!(scenario.path * "/K_delayed", 
                "R_pn" => Dict("unit" => "Ohm", "value" => 2),
                "R_ng" => Dict("unit" => "Ohm", "value" => 2))
In [ ]:
engee.run(model); # 运行模拟

测试结束后,我们将返回瞬态电阻的初始值。:

In [ ]:
engee.set_param!(scenario.path * "/K_delayed", 
                "R_pn" => Dict("unit" => "Ohm", "value" => 1e-3),
                "R_ng" => Dict("unit" => "Ohm", "value" => 1e-3))

测试2

测试2中,短路的位置是点-K3.2。 实验类似于试验1.1。 预计将触发DZ,并正确确定相位。

In [ ]:
# 点K3.2
k_line = 0.85 * 0.9;

# 我们将仿真结果保存在相应的目录中。
results_path = "COMTRADE/测试2/A相饱和"
mkpath(results_path)
results_path = results_path * "/CAG"

# 在点K2_4设置短路类型
ScenarioModule.set_fault_type!(scenario, "K2_4", "CAG");
# 设置受控相位(饱和相位)
ScenarioModule.set_controlled_phase!(scenario, 7559, 0.147, phase='A');
# 保存接收到的脚本
save_mode!(scenario)
In [ ]:
engee.run(model); # 运行模拟

试验3

在试验3中,检查TNNP的操作。 该组实验类似于试验2。 KZ点为**K3.1,**其位置由TNN设置的结果确定。

试验4

测试 4 KZ位置是KZ点-K4。 预计第一阶段DZ不会被触发,TU DZ会被触发。

测试4.1

实验类似于试验1.1。

In [ ]:
# 点K4
k_line = 0.85 * 1.1;

# 我们将仿真结果保存在相应的目录中。
results_path = "COMTRADE/测试4.1/C相饱和"
mkpath(results_path)
results_path = results_path * "/CA"

# 在点K2_4设置短路类型
ScenarioModule.set_fault_type!(scenario, "K2_4", "CA");
# 设置受控相位(饱和相位)
ScenarioModule.set_controlled_phase!(scenario, 6921, 0.136, phase='C');
# 保存接收到的脚本
save_mode!(scenario)
In [ ]:
engee.run(model); # 运行模拟
测试4.2

DCZ+OCZ,在DCZ的其中一个相位饱和。

In [ ]:
# 我们将仿真结果保存在相应的目录中。
results_path = "COMTRADE/测试4.2/b相饱和"
mkpath(results_path)
results_path = results_path * "/BC + AG"

# 在点K2_4设置短路类型
ScenarioModule.set_fault_type!(scenario, "K2_4", "BC", "K_delayed", "AG");
# 设置受控相位(饱和相位)
ScenarioModule.set_controlled_phase!(scenario, 6921, 0.136, phase='B');
# 保存接收到的脚本
save_mode!(scenario)
In [ ]:
engee.run(model); # 运行模拟

试验5

测试5中,短路的位置是点-K1。 预期将不存在保护操作并且将触发TU DZ和TU TNZNP的反向逻辑。

测试在单独的模型中进行,其中在点K1处有两个短路单元。

短路在100毫秒后由开关Q1关闭。Q1开关常数块的值为1.0,用于将切换器开关切换到内部关闭信号。

打开模型:

In [ ]:
engee.open("test_5.engee"); # 打开模型
scenario.path = engee.gcs().path; # 在脚本中,我们更新模型名称
测试5.1

实验类似于试验1.1。 短路瞬间后100毫秒,Q1被触发。

In [ ]:
# 我们将仿真结果保存在相应的目录中。
results_path = "COMTRADE/5.1测试/A相饱和"
mkpath(results_path)
results_path = results_path * "/ABC"

# 在K1点设置短路类型
ScenarioModule.set_fault_type!(scenario, "K1", "ABC");
# 设置受控相位(饱和相位)
ScenarioModule.set_controlled_phase!(scenario, 10000, 0.118, phase='A');
# 后面短路(反向功率),因此,残差的值
# 磁化必须是镜像的。
# 饱和度建模的相位保持不变
scenario.V_strt = [scenario.V_strt[1], -scenario.V_strt[2], -scenario.V_strt[3]];
# 保存接收到的脚本
save_mode!(scenario)
In [ ]:
engee.run("test_5"); # 运行模拟
试验5.2

不平衡短路在同一时间. 短路瞬间后100毫秒,Q1被触发。

OKZ+DCZ通过一个瞬态电阻与饱和在OKZ阶段接地。

Dkz+OKZ具有与在该相的饱和的dkz的一个相中相同的损伤。

In [ ]:
# 我们将仿真结果保存在相应的目录中。
results_path = "COMTRADE/测试5.2/A相饱和"
mkpath(results_path)
results_path = results_path * "/AB + AG"

# 两点短路
ScenarioModule.set_fault_type!(scenario, "K1", "AB", "K1_add", "AG");
ScenarioModule.set_controlled_phase!(scenario, 9113, 0.109, phase='A');
# 后面短路(反向功率),因此,残差的值
# 磁化必须是镜像的。
# 饱和度建模的相位保持不变
scenario.V_strt = [scenario.V_strt[1], -scenario.V_strt[2], -scenario.V_strt[3]];
# 保存脚本
save_mode!(scenario)
# 附加点的访问控制将单独保存
engee.set_param!(scenario.path * "/K1_add", "type" => scenario.K1_add)
In [ ]:
engee.run("test_5"); # 运行模拟

测试结束后,我们切换到主模型。

In [ ]:
engee.open(model_name); # 切换到主模型
scenario.path = engee.gcs().path; # 在脚本中,我们更新模型名称

审判6

测试6涉及两个短程点-K1****和K2。 外部短路通入内部短路。 保护激活预计在不到60毫秒和正确检测损坏的阶段.

当将短路从k1切换到K2时,k1中的短路被禁用。 为此,切换切换器Start KZ以发送Start_KZ_add信号,该信号在设定的时间延迟后禁用短路。

In [ ]:
engee.set_param!(scenario.path * "/KZ Switch", "Value" => 0.0)
测试6.1

OKZ从外部到内部的过渡。

In [ ]:
# 我们将仿真结果保存在相应的目录中。
results_path = "COMTRADE/测试6.1/b相饱和"
mkpath(results_path)
results_path = results_path * "/BG"

ScenarioModule.set_delay!(scenario, 100);
# 两点短路
ScenarioModule.set_fault_type!(scenario, "K1", "BG", "K_delayed", "BG");
ScenarioModule.set_controlled_phase!(scenario, 6675, 0.087, phase='B');
# 保存脚本
save_mode!(scenario)
In [ ]:
engee.run(model); # 运行模拟
测试6.2

OKZ从外部到内部的转换与短路在另一个阶段。

第一短路(外部)以与内部短路的相位不同的相位发生。 饱和为内部短路阶段建模。 因此,针对外部短路的相位监控零跃迁,并且残余磁化被假定为针对内部短路,针对非周期分量的符号进行调整。

对于相C中的内部短路,相B的残余磁化的符号(外部短路)被反转。

对于测试6.2和随后的测试,子系统饱和时间检测不起作用。

In [ ]:
# 我们将仿真结果保存在相应的目录中。
results_path = "COMTRADE/测试6.2/C相饱和"
mkpath(results_path)
results_path = results_path * "/BG + CG"

ScenarioModule.set_delay!(scenario, 35);
# 两点短路
ScenarioModule.set_fault_type!(scenario, "K1", "BG", "K_delayed", "CG");
ScenarioModule.set_controlled_phase!(scenario, 6675, 0.087, phase='C');
# U通过零点的控制相位为外部短路的损坏相位
scenario.controlled_phase = 2;
scenario.V_strt = [scenario.V_strt[1], -scenario.V_strt[2], scenario.V_strt[3]];
# 保存脚本
save_mode!(scenario)
In [ ]:
engee.run(model); # 运行模拟

测试后参数的反向编辑:

In [ ]:
engee.set_param!(scenario.path * "/KZ Switch", "Value" => 1.0)

审判7

在测试7中,涉及两个短程点-K1和K2。 外部的背景上的内部短路。 保护激活预计在不到60毫秒和正确检测损坏的阶段.

K2中的短路发生在k1之后的延迟之后。

第一短路(外部)以与内部短路的相位不同的相位发生。 饱和为内部短路阶段建模。 因此,针对外部短路的相位监视零转变,并且残余磁化被假定为针对内部短路,针对非周期分量的符号进行调整。

In [ ]:
# 我们将仿真结果保存在相应的目录中。
results_path = "COMTRADE/测试7/b相饱和"
mkpath(results_path)
results_path = results_path * "/AG + BG"

ScenarioModule.set_delay!(scenario, 105);
# 两点短路
ScenarioModule.set_fault_type!(scenario, "K1", "AG", "K_delayed", "BG");
ScenarioModule.set_controlled_phase!(scenario, 6675, 0.087, phase='B');
# U通过零点的控制相位为外部短路的损坏相位
scenario.controlled_phase = 1;
scenario.V_strt = [-scenario.V_strt[1], scenario.V_strt[2], -scenario.V_strt[3]];
# 保存脚本
save_mode!(scenario)
In [ ]:
engee.run(model); # 运行模拟

审判8

测试8短路点是K1。 完整相中TT饱和的外部短路。 防御预计会失败。

对于测试,您需要对模型进行以下更改:

*在快门速度为100毫秒后,将切换器的位置更改为关闭

*打开TT零线中的电阻

*在S1中将a相的角度设置为零度

In [ ]:
engee.set_param!(scenario.path * "/Q1 Switch", "Value" => 1.0)
engee.set_param!(scenario.path * "/CT", "use_R0" => true)
engee.set_param!(scenario.path * "/S1", "shift" => Dict("unit" => "deg", "value" => 0.0))
In [ ]:
# 我们将仿真结果保存在相应的目录中。
results_path = "COMTRADE/测试8/A相饱和"
mkpath(results_path)
results_path = results_path * "/BCG"

ScenarioModule.set_delay!(scenario, 0);
# 在K1点设置短路类型
ScenarioModule.set_fault_type!(scenario, "K1", "BCG");
# 设置受控相位(饱和相位)
ScenarioModule.set_controlled_phase!(scenario, 8923, 0.108, phase='A', Kr=0.86);
# 保存脚本
save_mode!(scenario)
In [ ]:
engee.run(model); # 运行模拟

测试后参数的反向编辑:

In [ ]:
engee.set_param!(scenario.path * "/Q1 Switch", "Value" => 0.0)
engee.set_param!(scenario.path * "/CT", "use_R0" => false)
engee.set_param!(scenario.path * "/S1", "shift" => Dict("unit" => "deg", "value" => 6.86))

结论

在示例中,考虑了测试继电保护装置是否符合附录A4模型中GOST-70358的要求的过程。2.

此外,您还可以自动执行饱和相位、短路类型、电流倍数和非周期分量变化的测试程序。 为了模拟饱和度,您首先需要收集数据以重新计算TT的伏安特性。

接下来,将所有测试组装到一个脚本中,该脚本使用循环遍历测试中的模型参数,并通过软件控制运行节奏模拟。

该标准要求以COMTRADE格式记录测试结果,该模型还提供了记录模拟结果的工具。