直流配用电系统可靠性评估软件开发
2020-11-04郝向军李胜文侯采彤
郝向军,赵 军,李胜文,侯采彤,李 祺
(1.国网山西省电力公司,山西 太原 030013;2.国网山西省电力公司电力科学研究院,山西 太原 030001;3.国网山西送变电工程有限公司,山西 太原 030001;4.国网山西省电力公司输电检修分公司,山西 太原 030001)
0 引言
目前,配电系统的可靠性评估手段主要有解析法和模拟法,关于可靠性评估方法的论述,大多都是理论方法结合算例分析,而在实际工程应用中,还需要另外一步工作,即可靠性评估软件开发。本文使用的软件编译平台是VS(Visual Studio),VS 是一个相当全面的开发工具集,包括了整个软件生命周期中所需要的大部分工具,整个软件用C++进行编译。无论是什么样的软件开发,在编译之前都要有一个整体的架构观,具体到本文介绍的可靠性评估软件,在设计阶段,规划了3 个模块,包括数据库模块、直流潮流模块以及可靠性评估模块。下面将依次介绍这3 个模块的设计理念及其编译、功能实现的过程。
1 数据库模块设计
1.1 类中对象的设定
在一个复杂直流配用电系统的可靠性评估过程中涉及大量的数据存取,而在主函数中去定义、输入数据,会使得函数主体冗杂,降低编程的可读性,不利于后期程序的维护,所以在进行主函数的编译之前,建立一个数据库模块,主要承担数据的输入、输出功能,主函数部分需要的数据可以直接从数据库模块获取,这样就可以使得函数主体更加明确。
数据库模块的建立,考虑使用C++中类的功能来实现。类在本质上也属于数据类型,只不过不是编译器内置的数据类型,是用户根据自己需要的功能,自定义的一种数据类型。类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。对于包含内容较多的类,一般会考虑分文件编写,即在头文件中定义一个类,在类中定义所需要的对象,具体的实现转到相应的源文件中进行。分文件编写是为了让类中实现的功能可以更加清晰地展现出来,既方便程序员检查自己的程序,进行修改和维护,又可以使读者更加直观地理解编程的功能。本文所介绍的可靠性评估软件,其数据库模块的类里包含诸多函数作为对象,下面将依次介绍类中的对象定义以及各个函数的功能、实现过程。
先在头文件中定义一个类,在该类的public 作用域下,定义几个非函数型对象,分别是网络中的设备个数、网络中的节点数,将这些数据作为原始数据进行输入。然后需要定义一些指针,指针的作用是维护数组,该软件需要开辟存储故障率(包括设备故障率和线路故障率) 的数组、存储平均故障持续时间的数组以及存储年平均故障持续时间的数组,数据类型为double 类型,所以开辟的数组也是double 类型的数组,相应地,维护数组的指针也是double 类型的指针。
1.2 类中函数对象的实现
首先介绍类中必不可少的构造函数。该软件需要用户自己声明有参构造函数,因为需要对整型数据以及数组做初始化的操作。有参构造中的参数即为网络中的设备个数以及节点数,将传入的参数赋值给类中定义的整型对象。1.1 节提到的几个数组,需开辟在堆区,在堆区开辟的空间由程序员手动开辟、手动释放,维护数据比较方便,而数组的长度即为有参构造中传入的节点数。
下一个函数的功能是获取文件中的原始数据,这个文件一般由实际工程方提供,编程需要读取该文件来获得所需要的原始数据,读取的方法一般按行读取,以空格为分隔符,把软件编程所需要的原始数据读取完毕,存放到由指针维护的对应数组中即可。
C++运行完毕后,在堆区开辟的数组中的数据会被释放掉,软件计算得到的数据就会消失,所以需要在堆区数组释放之前,将计算得到的数据由数组输入文件中保存,该操作需要用到C++中的写文件函数,无论是文字信息还是数字信息,都可以通过C++的输出流函数,由左移运算符写入到文件中,这样软件计算得出的数据就可以永久地保存。
当所需原始数据或是计算得到的各项指标输入到数组以后,还需要提供1 个可以查看数组中数据的函数:使用while 语句生成1 个菜单,显示用户能够查看的数据种类并按顺序进行编号,然后使用switch 语句,将对应编号的数组进行遍历,供用户查询,方便用户查看输入的原始数据是否正确,判断是否需要修正代码。
最后需要编译析构函数,上文曾提及,在堆区开辟的数组需要程序员手动释放,释放的代码就可以放在析构函数中。
2 直流潮流模块设计
直流潮流模块依然采用C++中类与对象的功能进行实现。首先要明确类中的非函数型对象,在该模块中需要定义整型数据,如网络中的节点数、支路数以及平衡节点的编号,需要在堆区开辟double 型和int 型的数组,其中属于double 型的数组有存放各节点注入功率的数组、存放各条支路阻抗值的数组、存放各条支路潮流的数组,属于int 型的数组有存放发生停电故障的节点编号的数组、存放支路编号的数组等。
在有参构造函数中,需要传入网络中的节点数、支路数、平衡节点的编号,来给类中的非函数型对象赋初值,数组的开辟仍然选择在堆区,用对应数据类型的指针进行维护,数组的长度可以用网络中的节点数、支路数等数据进行定义。在构造函数中将原始数据存放到对应数组中,包括各个节点的注入功率、各条支路的阻抗值。
2.1 系统正常运行时的潮流计算
计算系统在正常运行状态下的潮流分布情况,需要在类中定义一个函数。潮流计算函数涉及很多矩阵方面的计算,需要用到C++的矩阵库Eigen。Eigen 是一个基于C++模板的线性代数库,其接口清晰、运行稳定且效率较高,直接将库下载后放在项目目录下,包含头文件就能使用。计算系统的潮流分布,首先需要定义一个行数为系统的支路数,列数为4 的矩阵,该矩阵第一、二列存放支路的首、末节点编号,第三列存放各支路的电纳值,第四列存放各节点的相角,其中前三列的数据可以直接输入,第四列的数据需要经过计算进行赋值[1]。接下来生成系统的节点电纳矩阵,该矩阵的赋值分为两部分,第一部分为主对角线元素的赋值,位于主对角线上的元素,在数值上等于各个节点的自电纳;第二部分为非对角元素的赋值,由于节点电纳矩阵为对称稀疏矩阵,只对矩阵的上三角或是下三角部分赋值即可。该位置上的元素,在数值上等于节点之间的互电纳[2]。这两部分的赋值操作,使用for 循环语句,借助之前定义的支路信息矩阵便可实现。
接下来需要借助节点电纳矩阵,求取各节点的相角,计算公式为
其中,P 为各节点注入功率的列向量,B0为节点电纳矩阵;δ 为各节点相角的列向量[3]。
为求取各节点的相角,需要求取节点电纳矩阵的逆矩阵。在Eigen 库中,有专门求取逆矩阵的函数inverse(),求出的相角对应存放入上文定义的支路信息矩阵中。最后一步就是计算各条支路的潮流分布,计算公式为
其中,i、j 表示首、末节点的编号;P、x 是由首末节点确定的支路潮流、支路阻抗;δ 为各节点的相角[4]。
将支路信息矩阵中的相角信息和支路信息带入式(2) 中,就可以依次求出各条支路的潮流分布。
2.2 系统开断一条线路时的潮流计算
利用枚举法使系统中的线路依次断开一条,求对应状态下的系统潮流分布[5]。该部分编程的目的是确定节点的故障信息。先要寻找出系统中与其他部分只有1 条支路连通的特殊节点,这些节点所在支路如果断开,会导致节点电纳矩阵降阶,必须做特殊处理。然后利用for 循环,遍历支路信息矩阵的前两列,只出现一次的节点,即为特殊节点,将该节点的编号以及所在支路编号存放进相应的数组中;出现多次的节点,说明所在支路不止1 条,断开1 条支路并不会导致节点电纳矩阵降维,正常处理即可。正常节点所在支路断路,需重新生成支路信息矩阵,其中断路的支路,电纳置为零,然后按正常状态下系统潮流计算的步骤进行即可;特殊节点所在支路断路,也需重新生成支路信息矩阵,因节点电纳矩阵要降一维,所以该支路信息矩阵也要减少1 行,将断路支路的信息删除,相应地,存放各节点注入功率的列向量以及存放各支路相角的列向量,也要把对应节点的信息删除[6]。
编程中潮流计算的目的是为了确定节点故障信息,具体通过追踪平衡节点发出的功率来实现。平衡节点本质上是负荷节点,不存在功率输出,而在潮流计算过程中,通常需要平衡节点向系统中输入功率,这一部分输入功率就可以看作系统中缺乏的功率,这些功率输入到哪些节点,就说明哪些节点会因为实际功率供给不足而停电。
先要建立辅助矩阵存放各条支路的潮流信息,矩阵的阶数和系统中的节点数保持一致,矩阵的行数代表支路的首节点,列数代表支路的末节点。位于对角线上的元素,代表各个节点注入功率的绝对值,位于非对角线上的元素,代表各条支路之间的潮流分布,潮流的方向由正负号和首末节点来确定。然后借助该矩阵追踪平衡节点发出的功率,对平衡节点所在列进行遍历,找出其中的负值,即为该平衡节点向其他节点输出的功率,当追踪到平衡节点的功率输入到某一个节点时,要判断该节点是否会停电,此时就要转到该节点所在列,将该列中的正值遍历出来,这些正值即代表了其他节点向该节点输入的功率,将遍历到的数值相加,和自身的注入功率比较,如果该节点从其他负荷节点(平衡节点除外) 获取的功率足够支撑自身的消耗,该节点就不会停电,反之就会出现停电故障。判断完该节点是否会停电后,重复上述步骤,继续由该节点追踪平衡节点发出的功率。由于平衡节点输出的功率一般只能传递到附近的几个节点,所以该追踪过程持续5 次,基本可以追踪到所有的停电节点。
3 可靠性评估模块设计
由直流潮流模块的计算可以得知某条线路故障时,对应负荷的停电信息,计算这些负荷的可靠性指标。首先,在对应系统中的设备产生随机数,通过比较随机数的大小来确定哪个设备最先发生故障[7],找出该设备所在支路,该支路发生故障时,对应负荷点的停电情况就可以通过直流潮流模块确定,对发生故障的负荷点进行可靠性指标计算;然后重新生成随机数,进行第二次的随机数大小比较,确定第二个发生故障的设备;重复上述步骤,直到超出模拟时限为止[8]。将各节点的可靠性指标累加并取平均值,即可得到各负荷点的可靠性指标,再根据设备在系统中的连接方式,选择不同的公式,计算出整个系统的各项可靠性指标。如果设备为串联方式,可以采用式(3) ~式(5) 进行计算;如果设备为并联方式,可以采用式 (6) ~式 (8) 进行计算。
其中,λ 为负荷点故障率,次/a;r 为负荷点每次故障平均停电持续时间,h/次;U 为负荷点的年平均停电时间,h/a。
4 结束语
直流潮流求解线性方程组的速度快,不存在收敛问题,适用于需要大量计算或运行条件不十分理想的场合。本文所介绍的软件编程涉及大量的计算,而计算的目的是故障定位,因此不需要计算精确潮流,直流潮流正好可以满足此次软件设计的要求[9]。使用直流潮流计算出系统潮流后,创造性地使用追踪平衡节点发出功率的方法,实现了系统的故障定位,提高了系统可靠性的计算效率。