AnyMath 文档
Notebook

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

导言

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

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

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

模型描述

第二节.

Снимок экрана 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";

下面的代码允许您根据标准的说明更改电力系统的参数。 N.整条换热装置;多重性 和 .

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);

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

因此,在一个视频中,它是一个很好的选择 ,具有与非周期分量相反的符号。

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

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;

整条换热

开发整条换热器. "整条换热"是一个独立的爱人。 然后,在检测过程中,不需要在检测过程中进行检测,而不是在检测过程中进行检测。 男孩子男孩子(男孩子)。https://engee.com/helpcenter/stable/cn/ritm/getting-started.html )和[使用软件管理与KPM"不可"的一个示例](https://engee.com/helpcenter/stable/cn/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/")

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

如果在显示仿真结果时遇到错误,请减少记录信号的数量,并在更大的计算步骤通过速率转换块进行记录。 我是一个朋友,我是一个朋友。https://engee.com/helpcenter/stable/cn/ritm/ritm-functions.html#AnyMathDeviceManager .....目标。RITM_API。文件-元组%7bany,%20string%7D).

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

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

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

进行测试

测试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)

在这里,我们需要做一个完整的流程。,

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

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

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

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

可视化或数据检查员在整条换热。*模拟结果也以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。 八八八八八八八八八八八

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,**其基本内容。

试验4

油墨 4 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。 八仙不存在.

油墨在流路中进行加工,但在流路中进行加工。

......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的一个中部。

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毫秒和正确检测损坏的阶段.

八仙座。 为。切换器Start KZ将开始_KZ_add信号,该信号在设定的时间延迟后禁用短路。

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

奥克茨的上部.

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在同一个地方。

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

对于同一个人来说,这是一个完整的数字。

对于测试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

在测试*************** 全部。 防御预计会失败。

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

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

*必开必中的电

*八仙座

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.

此外,您还可以自动执行饱和相位、短路类型、电流倍数和非周期分量变化的测试程序。 为了满足客户的需求。

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

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