Разработка алгоритма, составление и отладка программы на ПЭВМ для расчётов режима и потерь электроэнергии в распределительной электрической сети 6-20 кВ

Тип работы:
Курсовая
Предмет:
Программирование


Узнать стоимость

Детальная информация о работе

Выдержка из работы

Содержание

Введение

1. Основные аналитические соотношения

2. Блок схемы и алгоритм решения задачи

3. Проверка работоспособности алгоритма вручную

4. Таблица идентификации переменных

5. Формы входной и выходной печати

6. Разработка и отладка программы

7. Результаты расчёта и их анализ

8. Печать графического представления результатов расчёт

9. Инструкция для работы с программой

Список использованных источников

Введение

Интенсивное развитие технологических процессов тесно связано с применением электронной техники, преимущественно цифровых вычислительных машин. Поэтому при обучении инженеров-энергетиков особое внимание должно уделяться их компьютерной подготовке. Инженер должен уметь общаться с ЭВМ, работать на ней, знать основы программирования на алгоритмических языках электротехнических задач, уметь использовать ЭВМ в своей будущей профессиональной деятельности.

В учебном процессе знания вычислительной техники и программирования также необходимы, поскольку ряд специальных дисциплин, учебных, курсовых и дипломных проектов, учебно-исследовательских работ выполняются с применением ЭВМ или полностью на них.

Цель курсовой работы: закрепление практических навыков программирования на алгоритмических языках высокого уровня (FORTRAN, PASCAL, C/С++, JAVA или др.) на примере составления и отладки программы для решения электротехнической задачи, ознакомление со специальной терминологией, приобретение навыков написания и оформления программ. Это дает дополнительные возможности успешно применять средства вычислительной техники в процессе обучения в институте и в дальнейшем на практике.

Задание предусматривает разработку алгоритма, проверку его работоспособности, разработку блок-схемы, написание и отладку программы для определения суммарных потерь электроэнергии Wc в схеме разомкнутой электрической сети по известным аналитическим соотношениям. Программа может быть написана на одном из алгоритмических языков — FORTRAN, PASCAL, C/С++, JAVA или любом другом алгоритмическом языке высокого уровня.

1. Основные АНАЛИТИЧЕСКИЕ СООТНОШЕНИЯ

Разомкнутая электрическая сеть представляет собой схему типа дерева (см. рис. 1). В такой схеме отрезки линий, заключенные между двумя номерами, называются участками или линейными ветвями схемы. На рисунке 1 участками линий являются ветви 1−2, 2−3, 2−4, 4−5, 4−6, 6−7, 6−8, 8−9, 8−10, 10−11 (всего 10 ветвей).

Пересекающимися окружностями обозначены понижающие трансформаторы. Они также являются участками (ветвями) схемы, но трансформаторными. Над трансформаторами указаны их номинальные мощности в кВА (25, 40, 63, 100 и 630). На схеме рис. 1 пять трансформаторов. Это участки 3−101, 7−102, 11−103, 5−104 и 9−105. Нумерация участков схемы произвольная, за исключением номера начала схемы, этот номер всегда 1.

Рис. 1 — Схема разомкнутой электрической сети 10 кВ подстанции «Северная»

Электрические сети предназначены для питания потребителей электрической энергией. Часть электроэнергии при ее передаче по сетям теряется на нагрев проводов линий? Wл, обмоток? Wт и сердечников? Wхх трансформаторов.

В схеме простейшей разомкнутой электрической сети суммарные потери электроэнергии W складываются из трех составляющих и вычисляются по формуле:

,(1)

где

Wл — суммарные нагрузочные потери электроэнергии на линейных участках схемы, кВтч;

Wт — суммарные нагрузочные потери электроэнергии в трансформаторах схемы, кВтч;

Wхх — потери электроэнергии в стали трансформаторов, кВтч.

Потери электроэнергии на линейных участках определяются по формуле:

,(2)

где

Wp i — поток активной энергии на i-м линейном участке схемы, кВтч;

tg i — коэффициент реактивной мощности, о.е. ;

Uном — номинальное напряжение сети, кВ;

Т — расчетный период (месяц, квартал, год), ч;

kф i — коэффициент формы графика нагрузки, о.е. ;

ri — активное сопротивление i-о участка линии, Ом.

Величина tg i равна отношению WQi к WPi:

,(3)

где

WQi — поток реактивной электроэнергии на i-м линейном участке схемы, кВАр;

WРi — поток активной электроэнергии на участке, кВт.

Значения WQ i, WPi и tg i определяются в процессе расчета потокораспределения в схеме.

Квадрат коэффициента формы kф i вычисляется по формуле:

,(4)

где

kз i — коэффициент заполнения графика, равный относительному числу часов использования максимальной активной нагрузки Тма i:

. (5)

Значение Тма i определяется по выражениям (6) или (7):

,(6)

— общее число участков сети, подключенных к узлу i;

Pk — активная мощность участка подключенного к узлу i;

Тма k — число часов использования максимальной активной нагрузки участка k;

. (7)

Активное сопротивление участка ri равно:

,(8)

r0 i — удельное активное сопротивление участка, Ом/км (берется из справочных данных);

— длина участка в километрах (указана на схеме сети).

Нагрузочные потери электроэнергии на трансформаторных участках схемы Wт определяются аналогичным образом:

(9)

m — число трансформаторных участков в схеме;

rj — активное сопротивление трансформатора j, Ом:

,(10)

Ркз j — потери мощности короткого замыкания трансформатора j, кВт (справочные данные);

Uном j — номинальное напряжение высшей обмотки трансформатора j, кВ (принимается равным номинальному напряжению сети Uном);

Sном j — номинальная мощность трансформатора j, кВА (указана на схеме).

Постоянные потери электроэнергии в стали трансформаторов Wхх равны:

,(11)

; (12)

Рхх j — потери холостого хода трансформатора j, кВт (справочные данные).

Все искомые величины W, Wл, Wт, Wхх и сумма (Wл + Wт) должны быть рассчитаны в именованных единицах (кВт) и в процентах по отношению к потоку электроэнергии на головном участке линии Wгу:

,(13)

. (14)

Кроме потерь электрической энергии, в работе необходимо определить потери активной мощности Р:

,(15)

,(16)

,(17)

,(18)

в кВт и (19)

в процентах по отношению к потоку активной мощности на головном участке схемы Ргу:

,

,

.

Поток мощности на головном участке линии равен сумме нагрузок всех узлов УPј и суммарных потерь активной мощности? P в схеме.

. (20)

Аналогичным образом определяются потери реактивной мощности Q:

,(21)

,(22)

,(23)

,(24)

где Ixx j — ток холостого хода трансформатора j, % (справочные данные),

в кВАр и (25)

в процентах:

,

,

,.

Значение потока мощности Qгу на головном участке линии равен сумме нагрузок всех узлов УQј и суммарных потерь реактивной мощности? Q в схеме.

В формулах (22), (23):

,(26)

xi — реактивное сопротивление i-о линейного участка схемы, Ом;

x0i — удельное реактивное сопротивление, Ом/км (берется из справочных данных), а

,(27)

xj — реактивное сопротивление трансформатора j, Ом;

zj — модуль полного сопротивления трансформатора j, Ом:

; (28)

Uкз % - напряжение короткого замыкания трансформатора j, % (берется из справочных данных).

Для каждого участка схемы (линейного и трансформаторного) требуется определить потери напряжения U, кВ:

,(29)

где P, Q, r, и x — это потоки мощности (P, Q) и сопротивления (r, x) как для линейных (Pi, Qi, ri, xi), так и для трансформаторных (Pj, Qj, rj, xj) участков схемы.

Для каждого узла сети (кроме первого) необходимо вычислить напряжение Uj:

,(30)

Uип — заданное напряжение источника питания (первый узел схемы).

Uипј - суммарные потери напряжения на пути от источника питания до узла j схемы.

Первый узел служит источником питания для всей схемы сети. Значение Uип принимать равным (1,03 1,15)Uном.

После данного расчета напряжения за трансформаторами приводятся к стороне низшего напряжения по формуле:

,(31)

.

2. БлоК СХЕМЫ И АЛГОРИТМ РЕШЕНИЯ ЗАДАЧИ

В программе использовались следующие блок-схемы:

Рисунок 2 — Блок-схема программы

Рисунок 3 — Блок-схема чтения данных

Рисунок 4 — Блок-схема расчёта

Рисунок 5 — Блок-схема формирования графического представления результатов расчёта

Алгоритм программы (код программы)

import java. io. *;

import java. util. *;

import java. util. regex. *;

import java. lang. Math;

import javax. swing. JFrame;

import javax. swing. JButton;

import javax. swing. JPanel;

import java. awt. BorderLayout;

import java. awt. FlowLayout;

import javax. swing. *;

import javax. swing. border. BevelBorder;

import java. awt. Graphics2D;

import java. awt. Graphics;

import java. awt. geom. *;

import java. awt. event. ActionListener;

import java. awt. event. ActionEvent;

import java. text. DecimalFormat;

import javax. imageio. ImageIO;

import java. awt. image. BufferedImage;

import java. awt. Font;

public class GlavnProg extends JFrame{

private JPanel buttons;

private PanelRisov pic;

private JButton paint, calc;

LineMassive al;

public GlavnProg (){

buttons=new JPanel ();

buttons. setSize (200,30);

buttons. setLayout (new FlowLayout ());

pic=new PanelRisov ();

pic. setSize (700,465);

paint = new JButton («Risunok»);

calc=new JButton («Podschet»);

calc. addActionListener (new Risovanie (this)); /*new ActionListener (){

public void actionPerformed (ActionEvent e){

al=readS ();

al. calculate ();

pic. setBorder (BorderFactory. createBevelBorder (BevelBorder. LOWERED));

add (pic, BorderLayout. CENTER);

}

}); */

paint. setEnabled (false);

paint. addActionListener (new ActionListener (){

public void actionPerformed (ActionEvent e){

BufferedImage bi=(BufferedImage)pic. createImage (pic. getWidth (), pic. getHeight ());

Graphics2D g2=bi. createGraphics ();

pic. paint (g2);

g2. dispose ();

try{

ImageIO. write (bi,"jpeg", new File («ResPict. jpeg»));

}catch (Exception exc){exc. printStackTrace ();}

}

});

buttons. add (calc);

buttons. add (paint);

setLayout (new BorderLayout ());

add (buttons, BorderLayout. NORTH);

pic. setBorder (BorderFactory. createBevelBorder (BevelBorder. LOWERED));

add (pic, BorderLayout. CENTER);

setTitle («Trans and Wires»);

setSize (1000,700);

setResizable (false);

setDefaultCloseOperation (EXIT_ON_CLOSE);

setVisible (true);

}

public static void main (String[] args){

Line l;

double dd[];

GlavnProg rsd=new GlavnProg ();

}

public LineMassive readS (){

Scanner sc;

ArrayList< String> al=new ArrayList< String>();

LineMassive al1=new LineMassive ();

int nn, nk, Tmatj, Snomj;

double L, Ksj, Cosfij;

double wire[]=new double[5], trans[]=new double[10];

String wireName="";

boolean wireQ=true;

try{

RandomAccessFile raf=new RandomAccessFile («ishod. txt»,"r");

String s="", d;

while ((s=raf. readLine ())≠null){

d=new String (s. getBytes («ISO-8859−1»),"Cp1251″);

System. setOut (new PrintStream (System. out, true, «cp866»));

al. add (d);

}

raf. close ();

}catch (Exception e){

e. printStackTrace ();

}

int ii;

String temp, s;

for (int i=7; i<al. size ()-1;i++){

nn=0; nk=0;Snomj=0;Tmatj=0;

L=. 0;Ksj=. 0;Cosfij=. 0;

wire=null;

s=al. get (i);

sc=new Scanner (s). useDelimiter («:»);

temp=sc. next ();

temp=temp. trim ();

nn=Integer. valueOf (temp);

temp=sc. next ();

temp=temp. trim ();

nk=Integer. valueOf (temp);

temp=sc. next ();

temp=temp. trim ();

if (temp. lastIndexOf («-»)≠0){

wireName=temp;

wire=readWire (wireName);

wireQ=true;

}

temp=sc. next ();

temp=temp. trim ();

if (temp. lastIndexOf («-»)<0){

L=Double. valueOf (temp);

}

temp=sc. next ();

temp=temp. trim ();

if (temp. lastIndexOf («-»)<0){

Snomj=Integer. valueOf (temp);

trans=readTrans (Integer. toString (Snomj));

wireQ=false;

}

temp=sc. next ();

temp=temp. trim ();

if (temp. lastIndexOf («-»)<0){

Ksj=Double. valueOf (temp);

}

temp=sc. next ();

temp=temp. trim ();

if (temp. lastIndexOf («-»)<0){

Tmatj=Integer. valueOf (temp);

}

temp=sc. next ();

temp=temp. trim ();

if (temp. lastIndexOf («-»)<0){

Cosfij=Double. valueOf (temp);

}

if (wireQ){

al1. add (new Line (nn, nk, L, Ksj, Tmatj, Cosfij, wireName). setWire (wire));

} else {

al1. add (new Line (nn, nk, L, Ksj, Tmatj, Cosfij, wireName). setTrans (trans));

}

}

return al1;

}

public double[] readWire (String wire){

double[] date=new double[5];

Scanner sc;

double dd;

int c=0;

try{

RandomAccessFile raf=new RandomAccessFile («wires. txt»,"r");

String s="", d, temp;

while ((s=raf. readLine ())≠null){

if (s. endsWith («-----»)||c<5) {c++; continue; }

d=new String (s. getBytes («ISO-8859−1»),"Cp1251″);

if (d. indexOf (wire)>0){

int i=0;

sc=new Scanner (d). useDelimiter («:»);

sc. next ();

while (sc. hasNext ())

date[i++]=Double. valueOf (sc. next (). trim ());

date[0]=date[0]*1000. 0;

}

}

raf. close ();

}catch (Exception e){

e. printStackTrace ();

}

return date;

}

public double[] readTrans (String snom){

double[] date=new double[10];

Scanner sc;

double dd;

try{

RandomAccessFile raf=new RandomAccessFile («trans. txt»,"r");

String s="", d;

while ((s=raf. readLine ())≠null){

d=new String (s. getBytes («ISO-8859−1»),"Cp1251″);

if (d. indexOf («:"+snom)>0){

int i=0;

sc=new Scanner (d). useDelimiter («:»);

sc. next ();

while (sc. hasNext ()){

date[i++]=Double. valueOf (sc. next (). trim ());

if (i==1) date[i-1]=date[i-1]*1000. 0;

else if (i==5) date[i-1]=date[i-1]*1000. 0;

else if (i==7) date[i-1]=date[i-1]*1000. 0;

else if (i==10) date[i-1]=date[i-1]*1000. 0;

}

break;

}

}

}catch (Exception e){

e. printStackTrace ();

}

return date;

}

class Risovanie implements ActionListener{

GlavnProg rsd;

Risovanie (GlavnProg rsd){this. rsd=rsd;}

public void actionPerformed (ActionEvent e){

al=readS ();

al. calculate ();

pic. setPic ();

Graphics2D g2=(Graphics2D)pic. getGraphics ();

pic. mao=al. mao;

paint. setEnabled (true);

try{

DecimalFormat df=new DecimalFormat («0. 00»), df2=new DecimalFormat («0. 000»);

RandomAccessFile wrRes=new RandomAccessFile («result. txt»,"rw");

String res= «---------------------------------------------------------------------n"+

«HOMEP ПOTOK MOЩHOCTИ BETBИ: ПOTEPИ MOЩHOCTИ: ПOTEPИ: HAПPЯЖ. :n"+

«--------------------------------: -----------------:n"+

«HAЧAЛA: KOHЦA: AKTИBHЫЙ:PEAKTИBH.: AKTИBH.: PEAKT.: HAПPЯЖ.: УЗЛOB: n"+

": :--------:----------:--------:--------:--------:---------n"+

": BETBИ: BETBИ: KBT: KBAP: KBT: KBAP: KB: KB: n"+

«---------------------------------------------------------------------n»;

//res=new String (res. getBytes («ISO-8859−1»),"Cp1251″);

wrRes. writeChars (res);

for (int i=0; i<al. size ();i++){

res=": «+formingString (""+al. get (i). nn, 5)+»:"+formingString (««+al. get (i). nk, 5)+»:"+

formingString (df. format (al. get (i). Pj/1000), 8)+":"+formingString (df. format (al. get (i). Qj/1000), 10)+":"+

formingString (df. format (al. get (i). retdPo ()/1000), 8)+":"+formingString (df. format (al. get (i). retdQo ()/1000), 8)+":"+

formingString (df2. format (al. get (i). dUj/1000), 8)+":"+formingString (df2. format (al. get (i). Uuzl/1000), 8)+":n";

wrRes. writeChars (res);

}

wrRes. close ();

}catch (Exception ex){ex. printStackTrace ();}

}

public String formingString (String s, int n){

int len=s. length ();

for (int i=0; i<n-len;i++)

s+=" «;

return s;

}

}

class PanelRisov extends JPanel{

private int d, dt, w, x, y; ///w — width of the line, d-diameter of the dot, dt — trans

int[] mao;

public boolean pic=false;

int c1, scale=1,scl=1;

DecimalFormat df=new DecimalFormat («0. 00»);

public void paintComponent (Graphics g){

if (pic){

int ip=0,it, countT=0,countL=0,tmao[], lmao[];

super. paintComponent (g);

Graphics2D g2=(Graphics2D)g;

g2. setFont (new Font («Serif», Font. PLAIN, 10));

drawT (g2,x, y);

al. get (ip). x=x;

al. get (ip). y=y;

drawPic (g2,0);

}

}

public void drawPic (Graphics2D g2, int ip){

int x1=al. get (ip). x, y1=al. get (ip). y, count=0,countL=0,countT=0,grad=30,dgrad, templ;

ArrayList< Integer> lines=new ArrayList< Integer>(), tr=new ArrayList< Integer>();

for (int i=1; i<mao. length;i++){

if (mao[i]==ip) {

count++;

if (al. get (i). wireQ) {countL++; lines. add (i); }

if (!al. get (i). wireQ){countT++; tr. add (i); }

}

}

boolean[] vert=new boolean[count];

if (countL< 4&&countL≠0){

do{

try{

x=al. get (ip). x;

y=al. get (ip). y;

drawL (g2,x, y, countL, lines);

countL--;

al. get (lines. get (countL)). x=this. x;

al. get (lines. get (countL)). y=this. y;

g2. drawString (««+al. get (lines. get (countL)). nk, this. x+15,this. y-10);

g2. drawString (df. format (al. get (lines. get (countL)). Pj/1000)+"+j"+df. format (al. get (lines. get (countL)). Qj/1000), this. x+15,this. y-w+30);

templ=(int)lines. get (countL). floatValue ();

drawPic (g2,templ);

}catch (Exception e){e. printStackTrace ();System. exit (0);}

}while (countL≠0);

//return;

}else if (countL> =4){

dgrad=300/(countL-1);

do{

x=al. get (ip). x;

y=al. get (ip). y;

drawL (g2,x, y, grad, lines);

grad+=dgrad;

countL--;

al. get (lines. get (countL)). x=this. x;

al. get (lines. get (countL)). y=this. y;

drawPic (g2,(int)lines. get (countL). floatValue ());

}while (countL≠0);

}

if (countT≠0& &countT>2){

int nap=1,dg=0;

x=al. get (ip). x;

y=al. get (ip). y;

drawTrans (g2,x, y, countT, tr);

if (grad< 180) nap=1;

if (grad==180) nap=3;

if (grad> 180) nap=2;

countT--;

}else if (countT< 3&&countT≠0){

c1=tr. size ()-1;

do{

try{

x=al. get (ip). x;

y=al. get (ip). y;

drawTrans (g2,this. x, this. y, countT, tr);

countT--;

templ=(int)tr. get (countT). floatValue ();

}catch (Exception e){e. printStackTrace ();System. exit (0);}

}while (countT≠0);

}

return;

}

public void setPic (){pic=true; repaint (); }

public void paint (Graphics g){

g. setFont (new Font («Serif», Font. PLAIN, 5));

d=8; dt=24;w=70;x=150;y=30;scale=0;scl=1;

super. paint (g);

}

public void drawT (Graphics2D g2, int x, int y){

int i=10;

g2. drawLine (x, y, x+i, y);

g2. drawLine (x+i/2,y, x+i/2,y+w);

g2. fill (new Ellipse2D. Double (x, y+w, d, d));

g2. drawString (««+al. get (0). nn, x+i+5,y-3);

g2. drawString (df. format (al. get (0). Pj/1000)+"+j"+df. format (al. get (0). Qj/1000), x+i+5,y+w/2−3);

g2. drawString (««+al. get (0). nk, x+i/2+5,y+w-3);

this. y+=w+d/2;

this. x+=i/2;

}

public void drawTrans (Graphics2D g2, int x, int y, int naprav, ArrayList< Integer> tr){

int i=30,di=20,c=0;

if (naprav==3){

g2. drawLine (x, y, x, y+i);

g2. draw (new Ellipse2D. Double (x-dt/2,y+i, dt, dt));

g2. draw (new Ellipse2D. Double (x-dt/2,y+i+di, dt, dt));

g2. drawLine (x, y+i+di+dt, x, y+di);

g2. drawLine (x, y+i+2*di+dt-10,x, y+i+2*di+dt+20);

g2. drawString (df. format (al. get©. Pj/1000)+"+j"+df. format (al. get©. Qj/1000), x+i+5,y+w/2−3);

g2. drawString (««+al. get©. nk, x+i/2+5,y+w-3);

}else if (naprav==2){

g2. drawLine (x, y, x+i, y);

g2. draw (new Ellipse2D. Double (x+i, y-dt/2,dt, dt));

g2. draw (new Ellipse2D. Double (x+i+di, y-dt/2,dt, dt));

g2. drawLine (x+i+di+dt, y, x+i+2*di+dt, y);

g2. drawLine (x+i+2*di+dt, y-10,x+i+2*di+dt, y+10);

g2. drawString (df. format (al. get (tr. get (c1)). Pj/1000)+"+j"+df. format (al. get (tr. get (c1)). Qj/1000), x+(i+2*di-30)/2,y-dt+5);

g2. drawString (««+al. get (tr. get (c1)). nk, x+i+2*di+dt+5,y);

c1--;

return;

}else if (naprav==1){

g2. drawLine (x, y, x-i, y);

g2. draw (new Ellipse2D. Double (x-i-dt, y-dt/2,dt, dt));

g2. draw (new Ellipse2D. Double (x-i-di-dt, y-dt/2,dt, dt));

g2. drawLine (x-(i+di+dt), y, x-(i+2*di+dt), y);

g2. drawLine (x-(i+2*di+dt), y-10,x-(i+2*di+dt), y+10);

g2. drawString (df. format (al. get (tr. get (c1)). Pj/1000)+"+j"+df. format (al. get (tr. get (c1)). Qj/1000), x-(i+2*di+dt+80)/2,y-dt+5);

g2. drawString (««+al. get (tr. get (c1)). nk, x-(i+2*di+dt+25), y);

c1--;

return;

} else{

c1=tr. size ()-1;

int xn, yn, nap1=naprav/2,chet=naprav%2,gr, nap2;

nap2=nap1+chet;

chet=nap1%2;

nap1=nap½;

gr=90/(nap1+1);

do{

xn=(int)((double)(w-30)*Math. cos (gr));yn=(int)((double)(w-30)*Math. sin (gr));

g2. drawLine (x, y, x-xn, y-yn);

drawTrans (g2,x-xn, y-yn, 1, tr);

g2. drawLine (x, y, x-xn, y+yn);

drawTrans (g2,x-xn, y+yn, 1, tr);

nap1--;

gr+=gr;

}while (nap1≠0);

if (chet≠0) drawTrans (g2,x, y,1,tr);

chet=nap2%2;

nap2=nap2/2;

gr=90/(nap2+1);

do{

xn=(int)((double)(w-30)*Math. cos (gr));yn=(int)((double)(w-30)*Math. sin (gr));

g2. drawLine (x, y, x+3*xn, y-yn);

drawTrans (g2,x+3*xn, y-yn, 2, tr);

g2. drawLine (x, y, x+3*xn, y+yn);

drawTrans (g2,x+3*xn, y+yn, 2, tr);

nap2--;

gr+=gr;

}while (nap2≠0);

if (chet≠0) drawTrans (g2,x, y,2,tr);

}

}

public void drawL (Graphics2D g2, int x, int y, int naprav, ArrayList< Integer> ln){

if (naprav==1){

g2. drawLine (x, y, x, y+(int)1. 7*w);

g2. fill (new Ellipse2D. Double (x-d/2,y+(int)1. 7*w, d, d));

this. y+=(int)1. 7*w+d/2;

}else if (naprav==2){

g2. drawLine (x, y, x, y+20);

g2. drawLine (x, y+20,x+2*w+scale, y+20);

g2. drawLine (x+2*w+scale, y+20,x+2*w+scale, y+w-20+20);

g2. fill (new Ellipse2D. Double (x+2*w+scale-d/2,y+w-d/2−20+20,d, d));

this. x+=2*w+scale;//+d/2;

this. y+=w-20+20;

scale+=50*scl;

scl++;

}else if (naprav==3){

g2. drawLine (x, y, x-w, y);

g2. fill (new Ellipse2D. Double (x-w, y-d/2,d, d));

this. x-=w+d/2;

}else {

int xn, yn, nap1=naprav/2,chet=naprav%2,gr, nap2;

nap2=nap1+chet;

chet=nap1%2;

nap1=nap½;

gr=90/(nap1+1);

do{

xn=(int)((double)(w-20)*Math. cos (gr));yn=(int)((double)(w-20)*Math. sin (gr));

g2. drawLine (x, y, x-xn, y-yn);

g2. drawLine (x, y, x-xn, y+yn);

nap1--;

gr+=gr;

}while (nap1≠0);

if (chet≠0) g2. drawLine (x, y, x-w, y);

chet=nap2%2;

nap2=nap2/2;

gr=90/(nap2+1);

do{

xn=(int)((double)(w-20)*Math. cos (gr));yn=(int)((double)(w-20)*Math. sin (gr));

g2. drawLine (x, y, x+xn, y-yn);

g2. drawLine (x, y, x+xn, y+yn);

nap2--;

gr+=gr;

}while (nap2≠0);

if (chet≠0) g2. drawLine (x, y, x+w, y);

return;

}

}

}

}

class Line{

public int nn, nk, Tmatj, x, y;

private double L, Ksj, Snomj, Cosfij;

private double Unom, R0, X0,Idop, Ic; ////wire

private double Unomt, NN, Uks, dPks, Ixx, dPxx, Rtr, Xtr, dQxx; /////trans

private String wireName, transName;

public double Pj, Qj, dUj, Uuzl;

private double Sj, Wpj, Wqj, Tgfij, Kfj2, rj, xj;

private double dWlj, dWtj, dPlj, dPtj, dWxxj, dQlj, dQtj;

public boolean wireQ;

Line (int n, int k, double l, double K, int T, double Cos, String wireName){

this. nn=n;this. nk=k;this. L=l;this. Ksj=K;this. Tmatj=T;

this. Cosfij=Cos;this. wireName=wireName;

}

public Line setWire (double[] wire){

int i=0;

Unom=wire[i];

R0=wire[++i];

X0=wire[++i];

Idop=wire[++i];

Ic=wire[++i];

wireQ=true;

return this;

}

public Line setTrans (double[] trans){

int i=0;

Snomj=trans[i];

Unomt=trans[++i];

NN=trans[++i];

Uks=trans[++i];

dPks=trans[++i];

Ixx=trans[++i];

dPxx=trans[++i];

Rtr=trans[++i];

Xtr=trans[++i];

dQxx=trans[++i];

wireQ=false;

return this;

}

public void PQTrans (){

if (!wireQ){

Tgfij=(Math. sqrt (1-Cosfij*Cosfij))/Cosfij;

Sj=Snomj*Ksj;

Pj=Sj*Cosfij;

Qj=Sj*(Math. sqrt (1-Cosfij*Cosfij));

}

}

public void calculate (){

Tgfij=(Math. sqrt (1-Cosfij*Cosfij))/Cosfij;

Wpj=Tmatj*Pj;

Wqj=Wpj*((Math. sqrt (1-Cosfij*Cosfij))/Cosfij);///!!!tg

/////13−14

Kfj2=(0. 16/Ksj+0. 86)*(0. 16/Ksj+0. 86);

if (R0≠. 0){

rj=L*R0;

dWlj=(Wpj*Wpj*(1+Tgfij*Tgfij)*Kfj2*rj)/(Unom*Unom*8760);

}else

////////16

{//if (dPks≠. 0){

rj=dPks*10 000 000/(Snomj*Snomj);

dWtj=(Wpj*Wpj*(1+Tgfij*Tgfij)*Kfj2*rj)/(Unom*Unom*8760);

}

///////18

if (!wireQ)

dWxxj=dPxx*Tmatj;

///////////21

if (wireQ){

rj=L*R0;

dPlj=(Pj*Pj+Qj*Qj)*rj/10 000 000;

}else

{

rj=dPks*10 000 000/(Snomj*Snomj);

dPtj=(Pj*Pj+Qj*Qj)*rj/10 000 000;

}

if (wireQ){

xj=X0*L;

dQlj=(Pj*Pj+Qj*Qj)*xj/10 000 000;

}else{

xj=Xtr;

dQtj=(Pj*Pj+Qj*Qj)*xj/10 000 000;

}

if (wireQ){

rj=L*R0;

xj=X0*L;

}else{

rj=dPks*10 000 000/(Snomj*Snomj);

xj=Xtr*L;

}

dUj=(Pj*rj+Qj*xj)/10 000;

}

public double retdPo (){

if (wireQ){

return dPlj;

}else {return dPtj; }

}

public double retdWo (){

if (wireQ){ return dWlj; }else {return dWtj; }

}

public double retdWxxj (){

return dWxxj;

}

public double retdPxx (){

return dPxx;

}

public double retdQxx (){return dQxx; }

public double retdQo (){

if (wireQ){return dQlj;} else{ return dQtj; }

}

public double retPj (){return Pj; }

public double retQj (){return Qj; }

}

class LineMassive{

private ArrayList< Line> al=null;

private double dWlo, dWto, dWxxo, dW, dPlo, dPto, dPxxo, dP, dPlto, Pgu, sPj, sQj, dQlo, dQto, dQxxo, dQ, dQlt, Qgu;

private double dPp, dPtop, dPltop, dPlop, dPxxop, dQp, dQtop, dQltp, dQlop, dQxxop;

int n1[], n2[], mao[];

int count;

public LineMassive (){

al=new ArrayList< Line>();

}

public int size (){

return al. size ();

}

public Line get (int i){

return al. get (i);

}

public void add (Line l){

al. add (l);

}

public void calcPQ (){

for (int i=0; i<al. size ();i++){

al. get (i). PQTrans ();

}

}

private void calcdWo (){

for (int i=0; i<al. size ();i++)

if (al. get (i). wireQ){

dWlo+=al. get (i). retdWo ();}

else{ dWto+=al. get (i). retdWo ();}

}

private void calcWxx (){

for (int i=0; i<al. size ();i++)

if (!al. get (i). wireQ) dWxxo+=al. get (i). retdWxxj ();

}

private void calcdPo (){

for (int i=0; i<al. size ();i++)

if (al. get (i). wireQ){

dPlo+=al. get (i). retdPo ();}

else{ dPto+=al. get (i). retdPo ();}

}

private void calcPxx (){

for (int i=0; i<al. size ();i++)

if (!al. get (i). wireQ) dPxxo+=al. get (i). retdPxx ();

}

private void calcPgu (){

for (int i=0; i<al. size ();i++){

sPj+=al. get (i). retPj ();

sQj+=al. get (i). retQj ();

}

}

private void calcdQo (){

for (int i=0; i<al. size ();i++)

if (al. get (i). wireQ){

dQlo+=al. get (i). retdQo ();}

else{ dQto+=al. get (i). retdQo ();}

}

private void calcQxx (){

for (int i=0; i<al. size ();i++)

if (!al. get (i). wireQ) dQxxo+=al. get (i). retdQxx ();

}

public void calculate (){

calcPQ ();

VAO ();

PTR ();

for (int i=0; i<al. size ();i++)

al. get (i). calculate ();

UUzl ();

calcdWo ();

calcWxx ();

dW=dWlo+dWto+dWxxo;

calcdPo ();

calcPxx ();

dP=dPlo+dPto+dPxxo;

dPlto=dPlo+dPto;

Pgu=sPj+dP;

dPp=dP*100/Pgu;

dPtop=dPto*100/Pgu;

dPltop=dPlto*100/Pgu;

dPlop=dPlo*100/Pgu;

dPxxop=dPxxo*100/Pgu;

calcdQo ();

calcQxx ();

dQ=dQlo+dQto+dQxxo;

dQlt=dQlo+dQto;

Qgu=sQj+dQ;

dQp=dQ*100/Qgu;

dQtop=dQto*100/Qgu;

dQltp=dQlt*100/Qgu;

dQlop=dQlo*100/Qgu;

dQxxop=dQxxo*100/Qgu;

}

public void VAO (){

n1=new int[al. size ()];

n2=new int[al. size ()];

mao=new int[al. size ()];

for (int i=0; i<al. size ();i++){

n1[i]=al. get (i). nn;

n2[i]=al. get (i). nk;

}

mao[0]=0;

for (int i=0; i<al. size ();i++)

if (n1[i]≠1)

for (int j=0; j<al. size ();j++)

if (n1[i]==n2[j])

mao[i]=j;

}

public void PTR (){

int j;

double p, q;

for (int i=0; i<al. size ();i++){

if (al. get (i). wireQ)

continue;

j=i;

p=al. get (j). Pj;

q=al. get (j). Qj;

do{

count++;

j=mao[j];

al. get (j). Pj+=p;

al. get (j). Qj+=q;

}while (j≠0);

}

}

private void UUzl (){

int j;

double uOb=10 500;

for (int i=0; i<al. size ();i++){

j=mao[i];

uOb-=al. get (j). dUj;

al. get (i). Uuzl=uOb;

}

}

}

3. Проверка работоспособности алгоритма вручную

Для проверки программы были выбраны участки 2−4 и 4−113. Для трансформатора 4−113 определяем полную нагрузку в кВА:

кВА — полная нагрузка трансформатора;

кВт — активная нагрузка трансформатора;

кВар — реактивная нагрузка трансформатора;

Вт — активные потери трансформатора;

кВар — реактивные потери трансформатора;

Р2−4=Р4−6+Р4−5+Р4−113=24,00+3,60+33,60=61,20 кВт — активный поток мощности через линию;

Q2−4=Q4−6+Q4−5+Q4−113=18,00+1,74+34,28=54,02 кВт — реактивный поток мощности через линию;

— потери активной энергии;

— потери реактивной энергии;

Подводя итог можно сказать, что параметры, рассчитанные вручную, совпадают с параметрами в файле результатов. Это позволяет судить о правильности алгоритма программы.

программа блок схема алгоритм

4. Таблица идентификации переменных

Обозначения переменных представлены в таблице:

Переменная

Описание

buttons

Переменная типа JPanel, поле для размещения кнопок

pic

Переменная типа JPanel, поля для рисунка схемы

paint, calc

Переменные типа JButton, кнопки

al

Переменная типа LineArray, для хранения информации об участках

nn, nk, Tmatj, Snomj;

Переменные типа int, для записи данных об участке

L, Ksj, Cosfij;

wire[], trans[]

Переменные типа double, для данных об участке

wireQ

Переменная типа boolean, если true, значит участок является проводом, в противном случае — трансформатором.

raf

Переменная типа RandomAccessFile, для чтения/записи файла

temp, s

Переменная типа String, для хранения прочитанных из файла строк

double[] date

массив для прочитанных из файла значений

Scanner sc

экземпляр класса Scanner для разбиения строки и выбора информации между «: «

int c=0

для подсчета и корректного форматирования прочитанных строк

String s="", d, temp

для хранения прочитанных из файла строк

int i=0

для перебора массива date[]

RSDate rsd

ссылка на экземпляр основного класса

DecimalFormat df, df2

экземпляры класса для форматирования чисел

RandomAccessFile wrRes

Для чтения данных из файла

int len

хранится длина принимаемой строки s

int d, dt, w, x, y

диаметр точки, диаметр окружности трансформатора, Длина рисуемой линии, координаты начала отрисовки

boolean pic=false

флаг для разрешения отрисовки схемы

int c1, scale=1,scl=1

переменные для масштабирования длины линий при отрисовке (часть не используется)

DecimalFormat df

для форматирования чисел

Graphics2D g2

ссылка на графический контекст с помощью которого происходит отрисовка

int x1, y1,count=0,countL=0,countT=0

, grad=30,dgrad, templ

х* и у* - координаты для отрисовки count* - кол-во линийтрансф, *grad — угол поворота при отрисовке наклонных линий

ArrayList< Integer> lines, tr

коллекции для хранения информации о линияхтр-рах

int nn, nk, Tmatj,

Переменные для хранения информации об участке

int x, y

Переменные для хранения координат конца участка

double L, Ksj, Snomj, Cosfij, Unom, R0, X0,Idop, Ic, Unomt, NN, Uks, dPks, Ixx, dPxx, Rtr,

Xtr, dQxx, Pj, Qj, dUj, Uuzl, Sj, Wpj, Wqj, Tgfij, Kfj2, rj, xj, dWlj, dWtj, dPlj, dPtj,

dWxxj, dQlj, dQtj

Переменные для хранения данных об участке (как прочитанной из файла, так и рассчитанной)

String wireName, transName

Переменная для хранения имени линиитранса

boolean wireQ

Если true- значит участок линия, если false — значит трансформатор

ArrayList< Line> al

Ссылка на объект для хранения экземпляров классов участков Line

double dWlo, dWto, dWxxo, dW,

dPlo, dPto, dPxxo, dP, dPlto, Pgu,

sPj, sQj, dQlo, dQto, dQxxo,

dQ, dQlt, Qgu, dPp, dPtop, dPltop,

dPlop, dPxxop, dQp, dQtop,

dQltp, dQlop, dQxxop

Переменные для рассчитанных данных

int n1[], n2[], mao[]

Массивы для хранения номеров узлов начала линии, конца линии, для хранения связей между участками

5. Формы входной и выходной печати

Исходные данные находятся в папке программы в файле dannye. txt:

--------------------------------------------------------------------------------------

: Nн: Nк:Марка провода: L: Sномj:Кзj:Тмаj:cosфиj:Тип нагрузки:

--------------------------------------------------------------------------------------

: -:-:-:км:кВА:о.е. :ч:о.е. :-:

--------------------------------------------------------------------------------------

: 1:2:3:4:5:6:7:8:9:

--------------------------------------------------------------------------------------

: 1:2:АС-50:0. 6:-:-:-:-:-:

: 2:4:АС-50:4. 4:-:-:-:-:-:

: 4:6:А-50:2. 1:-:-:-:-:-:

: 2:3:АС-50:0. 4:-:-:-:-:-:

: 4:5:АС-25:0. 8:-:-:-:-:-:

: 6:7:АС-35:0. 2:-:-:-:-:-:

: 3:175:-:-:160:0. 25:2350:0. 9: комун. -бытовая:

: 5:112:-:-:25:0. 2:1600:0. 9: комун. -бытовая:

: 4:113:-:-:160:0. 3:2700:0. 7: производственная:

: 7:111:-:-:100:0. 3:2800:0. 8: смешанная:

Данные представлены в виде таблицы,

где Nн — номер начала участка;

Nк — номер конца участка;

L — длинна участка;

Sномj — номинальная мощность трансформатора;

Кзj — коэффициент заполнения графика;

Тмаj — число часов использования максимума нагрузки в год;

cosфиj — коэффициент мощности в максимум нагрузки;

Тип нагрузки — характер нагрузки на участке.

Форма выходной печати представлена в пункте 8 пояснительной записки. В ней представлена информация о потоках активной и реактивной мощности, потерях активной и реактивной мощности, потерях напряжения на всех участках сети и напряжении на конце участка. Также программа рассчитывает множество других параметров, которые можно при необходимости внести в результирующую таблицу. Основное количество параметров взято из пункта 2 пояснительной записки «Основные аналитические соотношения».

6. Разработка и отладка программы

Выполнение курсовой работы проводилось в следующей последовательности:

Изучил задание на курсовую работу, разобрался со схемой разомкнутой электрической сети и перечертил ее.

Определил исходные данные, промежуточные и конечные результаты расчета.

Разобрался с основными аналитическими соотношениями, проверить работоспособность алгоритма вручную.

Разработал формы входной и выходной печати.

Написал блок ввода и печати исходной информации.

Разработал блок-схему всей программы. Наибольшее внимание уделил блокам расчета потокораспределения в схеме сети и определения напряжений в узлах схемы.

Написал текст программы.

Отладил текст программы, проверил ее работоспособность, получил распечатки текста программы, файлов исходных данных и результатов расчета.

Оформил расчетно-пояснительную записку.

7. Результаты расчёта и их анализ

Результаты расчёта представлены в файле result. txt:

---------------------------------------------------------------------

HOMEP ПOTOK MOЩHOCTИ BETBИ: ПOTEPИ MOЩHOCTИ: ПOTEPИ: HAПPЯЖ. :

--------------------------------: -----------------:

HAЧAЛA: KOHЦA: AKTИBHЫЙ:PEAKTИBH.: AKTИBH.: PEAKT.: HAПPЯЖ.: УЗЛOB:

: :--------:----------:--------:--------:--------:---------

: BETBИ: BETBИ: KBT: KBAP: KBT: KBAP: KB: KB:

---------------------------------------------------------------------

: 1:2:97,20:71,46:0,53:0,31:0,005:10,495:

: 2:4:61,20:54,02:1,77:1,04:0,025:10,490:

: 4:6:24,00:18,00:0,11:0,07:0,004:10,465:

: 2:3:36,00:17,44:0,04:0,02:0,001:10,460:

: 4:5:3,60:1,74:0,00:0,00:0,000:10,436:

: 6:7:24,00:18,00:0,01:0,01:0,001:10,431:

: 3:175:36,00:17,44:0,19:4,72:0,004:10,430:

: 5:112:3,60:1,74:0,02:0,41:0,005:10,430:

: 4:113:33,60:34,28:0,28:6,80:0,004:10,405:

: 7:111:24,00:18,00:0,22:4,91:0,006:10,405:

Наибольшие потери мощности наблюдаются на участках 2−4 и 4−113. Для трансформатора это обусловлено большим числом использования максимальной мощности, а для линии, в свою очередь, потери объясняются протяжённостью линии. Для уменьшения потерь на линии можно применить кабель большего сечения.

8. печать графического представления результатов расчёта

Для печати графического представления результатов расчёта необходимо открыть файл «Risunok. jpeg» любым известным графическим редактором и отправить документ на печать. На схеме указаны номера узлов и потоки активной и реактивной мощности.

9. инструкция для работы с программой

Запустив файл start. bat открывается окно программы. Вверху окна расположены две кнопки: raschet (вычисления) и shoran_ris (рисование). Нажав левой кнопкой мыши по кнопке «raschet» программа производит необходимые вычисления, основываясь на файл исходных данных (dannye. txt) и сохраняет результаты в файле «Result. txt», при этом программа чертит схему разомкнутой электрической сети. Нажав кнопку «shoran_ris» программа сохраняет полученную схему в файле «Risunok. jpeg».

Список использованных источников

1. Фурсанов М. И. Методология и практика расчетов потерь электроэнергии в электрических сетях энергосистем. — Мн.: Тэхналогiя, 2000. — 247 с.

2. Фурсанов М. И. Алгоритмы и программы для оценки режимов, нормирования и снижения технологического расхода энергии в разомкнутых электрических сетях. Учебно-метод. пособие. Мн.: БГПА, 1995. — 178 с.

3. Вычислительная техника в инженерных и экономических расчетах. / Под ред А. В. Петрова — М.: Высш. школа, 1984.

4. Дембовский Л. М., Ковальков А. Т. Основы диалоговых режимов работы на малых ЭВМ: Учеб. Пособие, Мн.: БПИ, 1988.

5. Брич З. С. и др. Фортран 77 для ПЭВМ ЕС: Справ. изд. / З. С. Брич, Д. В. Капилевич, Н. А. Клецкова — М.: Финансы и статистика, 1991. — 288 с.

6. Соловьев П. В. Fortran для персонального компьютера. — М.: Арист, 1991 г. — 223 с.

7. Вальвачев А.H., Крисевич В. С. Программирование на языке ПАСКАЛЬ для персональных ЭВМ ЕС; справочное пособие. — Мн.: Выш. шк., 1989.

8. Офицеров Д. В., Старых В. А. Программирование в интегрированной среде Турбо-Паскаль: Справ. пособие. — Мн.: Беларусь, 1992. — 240 с.

9. Офицеров Д. В., Долгий А. В., Старых В. А. Программирование на персональных ЭВМ. / Под. ред. Д. В. Офицерова, М.: Высш. школа, 1993. — 248 с.

10. Климов Ю. С., Касаткин А. И., Мороз С. М. Программирование в среде Turbo Pascal 6. 0: Справ. пособие. — Мн.: Выш. шк., 1992. — 158 с.

11. Шилд Г. Программирование на Borland C++ для профессионалов / Перев. с англ. А. И. Панасюка, А. Н. Филимонова; Худож. обл. М. В. Драко. — Мн.: ООО «Попурри», 1998. — 800 с.

12. Страуструп Б. Язык программирования С++, спец. изд. / Пер. с англ. — М.; СПб.: «Издательство БИНОМ» — «Невский Диалект», 2002 г. — 1099 с.

13. Мейн М., Савитч У. Структуры данных и другие объекты в С++, 2-е изд.: Пер. с англ. — М.: Издательский дом «Вильямс», 2002. — 832 с.

14. Блок В. М. Электрические системы и сети: Учеб. пособие для электроэнергет. спец. вузов. — М.: Высш. школа, 1986.

15. Будзко И. А., Зуль Н. М. Электроснабжение сельского хозяйства. — М.: Агропромиздат, 1990.

16. Справочник по математике для инженеров и учащихся втузов. Бронштейн И. Н., Семендяев К. А. — М.: Наука. Главная редакция физико-математической литературы, 1981. — 718 с.

ПоказатьСвернуть
Заполнить форму текущей работой