一、PSAPAC
简介: 由美国EPRI开发,是一个全面分析电力系统静态和动态性能的软件工具。
功能:DYNRED(Dynamic Reduction Program):网络化简与系统的动态等值,保留需要的节点。
二、EMTP/ATP
简介: EMTP是加拿大H.W.Dommel教授首创正袜的电磁暂态分析软件,它具有分析功能多、元件模型全和运算结果精确等优点,对于电网的稳态和暂态都可做仿真分析,它的典型应用是预测电力系统在某个扰动(如开关投切或故障)之后感兴趣的变量随时间变化的规律,将EMTP的稳态分析和暂态分析相结合,可以作为电力系统谐波分析的有力工具。ATP(The Alternative Transients Program)是EMTP的免费独立版本,是目前世界上电磁暂态分析程序最广泛使用的一个版本, 它可以模拟复杂网络和任意结构的控制系统,数学模型广泛,除用于暂态计算,还有许多其它重要的特性。 ATP程序正式诞生于1984年,由Drs. W. Scott Meyer 和Tsu-huei Liu,所组成的世界各地的用户组不断地发展。ATP还配备有比TACS更灵活、功能更强的通用描述语言MODELS及图形输入程序ATPDraw。
三、PSCAD/EMTDC
Dennis Woodford博士于1976年在加拿大曼尼托巴水电局开发完成了EMTDC的初版,是一种世 界各国广泛使用的电力系统仿真软件, PSCAD是其用户界面,PSCAD的开发成功,使得用户能更方便地使用EMTDC进行电力系统分析,使电力系统复杂部分可视化成为可能,而且软件可以作为实时数字仿真器的前置端。可模拟任意大小的交直流系统。 *** 作环境为:UNIX OS, Windows95, 98,NT;Fortran 编辑器;浏览器和TCP/IP协议。
四、电力系统分析软件BPA
中国版的BPA程序是由中国电力科学院引进、消化、吸收美国BPA程序开发而成。从1984年开始在我国推广应用以来,已在我国电力系统规划部门、调度运行部门、试验研究部门得到了广泛的应用,成为我国电力系统分析计算的重要工具之一。程序中包括详细的发电机模型和各种励磁模型,主要由潮流和暂态稳定程序构成,具有计算规模大、计算速度快、数值稳定性好、功能强等特点。 *** 作系统为DOS及Windows 9X/NT/2000版。
五、电力系统分析软件NETOMAC
简介: 德国西门子公司在上个世纪70年代开发的电力系统分析软件,经过多年的发展,该软件不断完善,功能日益强大,具有良好的开放性,可嵌入用户自行编制的 FORTRAN语言子程序、数学表达式等,用户遍及世界各地。该软件元件模型全,仿真频带宽,运行与Windows环境下。
六、PSASP
《电力系统分析综合程序》(Power System Analysis Software Package,PSASP)是一套历史长久、功能强大、使用方便的电力系统分析程序,它具有我国自主知识产权,是资源共享,使用方便,高度集成和开放的大型软件包
PSASP是电力系统规划设计人员确定经济合理、技术可行的规划设计方案的重要工具;是运行调度人员确定系统运行方式、分析系统事故、寻求反事故措施的有效手段;是科研人员研究新设备、新元件投入系统等新问题的得力助手;是高等院校用于教学和研究的软件设施。
PSASP基于电网基础数据库、固定模型库以及用户自定义模型库的支持,可进行电力系统(输电、供电和配电系统)的各种计算分析。
七、PSS/E OPF 简介租清纯
PIT美国电力技术咨询公司在电力系统分析领域居世界之首,其PSS/E OPF(用于电力系统工程的仿真器的优化潮流)是个功能强大,使用方便的电力网络分析工具。它突破了常规的潮流分析,为用户提 供了全面优弊咐化和调整输电系统运行的能力。PSS/E OPF完全嵌入在PSS/E的潮流程序中,使得这种优化 和调整更为容易。PSS/E OPF把职能融入潮流求解过程中,大大提高了分析电力系统性能的效率。常规的潮流依赖于工程师系统地研究各个解后才能找到一个满意的“良好”解,而PSS/E OPF直接改变各种控制从而迅速地确定“最优”解。几乎对于任何一个合理的初始点,OPF肯定能求得唯一的全局最优解,并同时满足系统 约束,使成本减少到最小或使系统性能最佳。
,
供电系统传输的电能本质上是以电磁波的形式传播,将电压加在传输导线上,带点粒子定向移动,在输电线路上产生电流,进而建立电场和磁场。而目前供电系统传输的主要是交流电,电场和磁场交替变化向前传播。当线路发生异常时,波在不同的介质分界面发生反射和折射,可以通过这些波(电压、电流波)的相关信息进行故障定位以及判断线路的故障类型。
如图1所示,在F点输电线路发生短路故障, 、 为前行波,在F点产生反射波 、 和折射波 、 ,通过检测两次反射波到达母线的时间差来确定故障点的位置 ( 注意反射波第一次到达母线后变为前行波,到达F点时候产生反射波,反射波再到达母线,两次波走过的路程为两倍的故障点距离 )。
(1)
其中 为反射波第一次到达母线处的时间, 为反射波第二次到达母线的时间, 为波速由介质特性决定, 。
输电线路在发生故障时,互感器采集的信息仍然为电压、电流信息,而行波则隐藏在电压、电流波形中,如何提取行波成为故障定位的关键。
输电线路在发生单相接地故障时的故障相产生行波,而非故障相由于互感因素的影响也会产生行波。为此,需要从三相电压、电流波形中提取行波信息。常用的做法是通过 相模变换 的形式获取行波信息:将三相电压、电流乘以凯伦贝尔变换矩阵或者 矩阵,转变为线模分量 分量、 分量以及零模分量 分量。其中线模分量是以导线为回路 , 波速比较大接近于光速,波阻抗比零模分量的波阻抗 小,并且在传播过程中波速不容易受外界因素的影响,较为稳定。而零模分量是 以大地为回路,其波速较线模分量的波猜春猜速小, 而波阻抗较线模分量的波阻抗大。对于线模 、 和零模这三个分量,消除了相互之间的耦合影响。
本文采用凯伦贝尔变换矩:
行波经过相模变换之后分解得到的三个模分量,由于线模分量的波速(由线路正序参数决定)大于零模分量的波速(由线森樱路零序参数决定),因此零模分量比线模分量后到达母 线端,并且只有当线路发生接地故障的时候才会产生零模分量,而非接地故障时不会产生模分量,这一特性可以用来作为故障判相中判别是否为接地故障的重要判据。
(1)在发生单相接地短路故障情况下,I0≠0( )
A相接地故障,Iα=lβ,lγ=0
B相接地故障,lα=lγ,lβ=0
C相接地故障穗型,lβ=lγ,lα=0
(2)发生两相接地短路故障情况下,I0≠0
AB相接地故障,lβ>Iα,lγ>Iα
BC相接地故障,lα>lγ,lβ>lγ
AC相接地故障,Iα>lβ,lγ>lβ
(3)发生两相相间短路故障情况下,I0=0
AB相相间短路故障,|Iα|=|2lβ|,|Iα|=|2lγ|
BC相相间短路故障,|lγ|=|2lβ|,|lγ|=|2Iα|
AC相相间短路故障,|lβ|=|2Iα|,|Iβ|=|2lγ|
(4)发生三相短路
获取两次反射波的时间点,需要利用小波变换实现,找到反射波的突变点。本文利用db8小波变换对线模分量进行分解,获取高频分量。
在simulink库中建立双侧电源输电系统,系统结构如下图所示,线路总长 ,故障点距EM侧为 。仿真时长 ,故障发生时间 。
电源参数如下
利用该仿真系统产生相应的故障电压、电流波形,再通过模相变换和小波分析进行故障选相和故障定位。
设置A相接地故障,发生时间为0.035s,选取0.004s内数据进行分析。三相故障电流如下图所示。
故障选相结果如下图所示,故障设置为A相接地,matlab工作窗口输出为A相接地,实现选相功能。
行波
对正向行波进行db8分解,结果如下图所示
d1信号第一次出现在 ,第二次出现在 ,如下图所示,波速为 。
定位点 ,设定的故障点位置为 。
参考文献
#include"reg52.h"#include"intrins.h"
#define uchar unsigned char//无符号8位
#define uint unsigned int//无符号16位
#define ulong unsigned long//无符号32位
sbit K1=P1^0 //按下K1后,开始测距
sbit LEDRed=P1^1//测距指示灯,亮表示正在测距,灭表示测距完成
//sbit BEEP=P1^2 //报警测量超出范围
sbit Trig=P2^5 //HC-SR04触发信号输入
sbit Echo=P2^6 //HC-SR04回响信号输出
float xdata DistanceValue=0.0//测量的距离值
float xdata SPEEDSOUND //声速
float xdata XTALTIME //单片机计数周期
uchar xdata stringBuf[6] //数值转字符串缓冲
//LCD1602提示信息
uchar code Prompts[][16]=
{
{"Measure Distance"}, //测量距离
{"- Out of Range -"}, //超出测量范围
{"MAX range 400cm "}, //测距最大值400cm
{"MIN range 2cm "}, //测距最小值2cm
{""}, //清屏
{" Press K1 Start "} //按键开始测量
}
uchar xdata DistanceText[]="Range: " //行亩测量结果字符串
uchar xdata TemperatureText[]="Temperature:"//测量温度值
extern void LCD_Initialize() //LCD初始化
extern void LCD_Display_String(uchar *, uchar)//字符串显示
extern void ReadTemperatureFromDS18B20() //从DS18B20读取温度值
extern int xdata CurTempInteger
//毫秒延时函数
void DelayMS(uint ms)
//20微秒延时函数
void Delay20us()
//HCSR04初始化
void HCSR04_Initialize()
//测量距亏差离
float MeasuringDistance()
//测距的数值排序求平均
float DistanceStatistics()
//输出距离值到LCD1602上
void DisplayDistanceValue(float dat)
//将无符号的整数转成字符串,返回字符串长度,不包括'\0'结束符
uchar UnsigedIntToString(uint value)
//蜂鸣器
//void Beep(uchar time)
//显示温度值
void DisplayTemperatureValue()
void main()
{
LCD_Initialize()//LCD1602初始化
LCD_Display_String(Prompts[0],0x00)
LCD_Display_String(Prompts[5],0x40)
ReadTemperatureFromDS18B20() //测温度
HCSR04_Initialize()//HC-SR04初始化
while(1)
{
if(K1==0)
{
DelayMS(5)
if(K1==0)
{
//Beep(1)
while(K1==0)
LEDRed=0
ReadTemperatureFromDS18B20()/销带皮/测温度
DisplayTemperatureValue()
if(CurTempInteger<14)
CurTempInteger=14
else if(CurTempInteger>26)
CurTempInteger=26
SPEEDSOUND=334.1+CurTempInteger*0.61//计算声速
DistanceValue=DistanceStatistics() //测距并返回距离值
DisplayDistanceValue(DistanceValue)//显示距离值
LEDRed=1
}
}
}
}
//测距的数值排序求平均
float DistanceStatistics()
{
uchar i,j
float disData[7],t
//连续测距
for(i=0i<7i++)
{
disData=MeasuringDistance()
DelayMS(80)
}
//排序
for(j=0j<=6j++)
{
for(i=0i<7-ji++)
{
if(disData>disData[i+1])
{
t=disData
disData=disData[i+1]
disData[i+1]=t
}
}
}
return (disData[2]+disData[3]+disData[4])/3
}
//测量距离
float MeasuringDistance()
{
//最大定时时间约65ms
TH0=0
TL0=0
//生成20us的脉冲宽度的触发信号
Trig=1
Delay20us()
Trig=0
//等待回响信号变高电平
while(!Echo)
TR0=1 //启动定时器0
//等待回响信号变低电平
while(Echo)
TR0=0 //关闭定时器0
//返回距离值(mm)
return (SPEEDSOUND*XTALTIME*((float)TH0*256+(float)TL0))/2000
}
//HCSR04初始化
void HCSR04_Initialize()
{
//计算单片机计数周期 晶振=11.953M 单位us
XTALTIME=12/11.953
//温度25度时声速的值
SPEEDSOUND=334.1+25*0.61
Trig=0
Echo=0
TMOD=0x01
}
//输出距离值到LCD1602上
void DisplayDistanceValue(float dat)
{
uchar i=0,j=0,len
uint value
value=(uint)dat
//范围检查大于4000mm和小于20mm都为超出测量范围
if(value>4000)
{
LCD_Display_String(Prompts[1],0x00)
LCD_Display_String(Prompts[2],0x40)
//Beep(2)
}
else if(value<20)
{
LCD_Display_String(Prompts[1],0x00)
LCD_Display_String(Prompts[3],0x40)
//Beep(2)
}
else
{
//将数值转换成字符串
len=UnsigedIntToString(value)
//保留1位小数
while(stringBuf!='\0')
{
if(len-j==1)
{
DistanceText[6+j]='.'
j++
}else
{
DistanceText[6+j]=stringBuf
i++
j++
}
}
DistanceText[6+j]='c'
j++
DistanceText[6+j]='m'
i=7+j
//剩余位置补空格
while(i<16)
{
DistanceText=' '
i++
}
//LCD_Display_String(Prompts[0],0x00)
LCD_Display_String(DistanceText,0x40)
}
}
//显示温度值
void DisplayTemperatureValue()
{
TemperatureText[13]=CurTempInteger/10+'0'
TemperatureText[14]=CurTempInteger+'0'
TemperatureText[15]='C'
LCD_Display_String(TemperatureText,0x00)
}
//将无符号的整数转成字符串,返回字符串长度
uchar UnsigedIntToString(uint value)
{
uchar i=0,t,length
//从个位开始转换
do
{
stringBuf='0'+value
value=value/10
i++
}while(value!=0)
length=i
//将字符串颠倒顺序
for(i=0i<(length/2)i++)
{
t=stringBuf
stringBuf=stringBuf[length-i-1]
stringBuf[length-i-1]=t
}
stringBuf[length]='\0'
return length
}
//蜂鸣器
//延时函数 毫秒 @12.000MHz
void DelayMS(uint ms)
{
uchar i, j
while(ms--)
{
_nop_()
i = 2
j = 239
do
{
while (--j)
}while (--i)
}
}
//延时函数 20微秒 @12.000MHz
void Delay20us()
{
uchar i
_nop_()
i = 7
while (--i)
}
//定时器0中断
void Timer0() interrupt 1
{
}
//DS18B20代码:
#include
#include
#define uchar unsigned char //无符号8位
#define uint unsigned int //无符号16位
//定义DS18B20端口DS18B20_DQ
sbit DS18B20_DQ = P2^7
//当前采集的温度值整数部分
int xdata CurTempInteger
//当前采集的温度值小数部分
int xdata CurTempDecimal
void Delayus(uint count)
{
while (--count)
}
uchar Reset_DS18B20()
{
uchar status
DS18B20_DQ=1
Delayus(1)
//开始复位过程
DS18B20_DQ=0 //数据线拉低
Delayus(100) //延时480us-960us
DS18B20_DQ=1 //数据线拉高
Delayus(10) //延时15us-60us
status=DS18B20_DQ//读取数据线上的状态
Delayus(120)
return status
}
void WriteByteToDS18B20(uchar dat)
{
uchar i
for(i=0i<8i++)
{
DS18B20_DQ=0
DS18B20_DQ=dat&0x01 //发送1位数据
Delayus(15) //延时60us以上
DS18B20_DQ=1 //释放总线,等待总线恢复
dat>>=1 //准备下一位数据
}
}
uchar ReadByteFromDS18B20()
{
uchar i,dat=0
for(i=0i<8i++)
{
DS18B20_DQ=0 //拉低总线,产生读信号
dat>>=1
DS18B20_DQ=1//释放总线,准备读1位数据
Delayus(2)//延时4us
if(DS18B20_DQ) dat|=0x80//合并每位数据
Delayus(15)//延时60us
DS18B20_DQ=1//拉高总线,准备读下1位数据
}
return dat
}
void ReadTemperatureFromDS18B20()
{
uchar flag=0//正负符号标志
//存储当前采集的温度值
uchar TempValue[]={0,0}
if(Reset_DS18B20())
{
CurTempInteger=255
CurTempDecimal=0
}
else
{
WriteByteToDS18B20(0xCC)//跳过ROM命令
WriteByteToDS18B20(0x44)//温度转换命令
Reset_DS18B20()//复位
WriteByteToDS18B20(0xCC)//跳过ROM命令
WriteByteToDS18B20(0xBE)//读取温度暂存器命令
TempValue[0]=ReadByteFromDS18B20()//先读低字节温度值
TempValue[1]=ReadByteFromDS18B20()//后读高字节温度值
Reset_DS18B20()//复位
//计算温度值
//先进行正温度与负温度判断,高5位全为1(0xF8)则为负数
if((TempValue[1]&0xF8)==0xF8)
{
//负温度计算:取反加1,低字节为0时,高字节取反加1,否则不需要。
TempValue[1]=~TempValue[1]
TempValue[0]=~TempValue[0]+1
if(TempValue[0]==0x00) TempValue[1]++
flag=1//负数标志
}
//将温度值分为整数和小数两部分存储(默认为12位精度)
CurTempInteger=((TempValue[1]&0x07)<<4)|((TempValue[0]&0xF0)>>4) if(flag) CurTempInteger=-CurTempInteger
CurTempDecimal=(TempValue[0]&0x0F)*625
}
}
//LCD1602程序代码:
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define Delay4us(){_nop_()_nop_()_nop_()_nop_()}
sbit LCD_RS=P2^0
sbit LCD_RW=P2^1
sbit LCD_EN=P2^2
void LCDDelay(uint ms)
{
uchar i, j
while(ms--)
{
_nop_()
i = 2
j = 239
do
{
while (--j)
}while (--i)
}
}
bit LCD_Busy_Check()
{
bit result
LCD_RS=0LCD_RW=1LCD_EN=1
Delay4us()
result=(bit)(P0&0x80)
LCD_EN=0
return result
}
void Write_LCD_Command(uchar cmd)
{
while(LCD_Busy_Check())
LCD_RS=0LCD_RW=0 LCD_EN=0_nop_()_nop_()
P0=cmdDelay4us()
LCD_EN=1Delay4us()LCD_EN=0
}
void Write_LCD_Data(uchar dat)
{
while(LCD_Busy_Check())
LCD_RS=1LCD_RW=0LCD_EN=0
P0=datDelay4us()
LCD_EN=1Delay4us()LCD_EN=0
}
void LCD_Set_POS(uchar pos)
{
Write_LCD_Command(pos|0x80)
}
void LCD_Initialize()
{
Write_LCD_Command(0x01)LCDDelay(5)
Write_LCD_Command(0x38)LCDDelay(5)
Write_LCD_Command(0x0C)LCDDelay(5)
Write_LCD_Command(0x06)LCDDelay(5)
}
void LCD_Display_String(uchar *str, uchar LineNo)
{
uchar k
LCD_Set_POS(LineNo)
for(k=0k<16k++)
{
Write_LCD_Data(str[k])
}
}
void LCD_Display_OneChar(uchar Dat, uchar X, uchar Y)
{
Y &= 0x01//限制Y不能大于1(2行,0-1)
X &= 0x0F //限制X不能大于15(16个字符,0-15)
if(Y) {X |= 0x40} //当要在第二行显示时地址码+0x40
X |= 0x80//算出指令码
Write_LCD_Command(X)
Write_LCD_Data(Dat)
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)