Главная / Программа
Все приведенные макросы могут быть использованы для решения конкретных задач путем копирования в окно диалога Макро. Макросы состоят собственно из тела макроса ( от строки Sub до строки End Sub) и его вызова (имя макроса и параметры через запятую). Для использования макроса параметры заменяются на нужные в конкретной задаче.
1. Групповая коррекция.
При проведении коррекции в больших объемах, или однотипной коррекции в разных файлах удобно сделать следующий макрос:
r=setlocale("en-us")
Sub GrCor(tabl,param,viborka,formula)
Set ptabl=Rastr.Tables(tabl)
Set pparam=ptabl.Cols(param)
ptabl.SetSel(viborka)
pparam.Calc(formula)
End Sub
GrCor "node","pn","na=1","pn*1.15"
GrCor "node","qn","na=1","pn*1.15"
GrCor "node","pq","na=2","pn*0.95"
GrCor "node","qg","na=2","pn*0.95"
GrCor "node","nsx","na=3","3"
Если нужно только корректировать нагрузку района на заданный коэффициент (активную и реактивную пропорционально), то можно сделать следующий макрос:
r=setlocale("en-us")
Sub CorPQN(raion,koeff)
Set ptabl=Rastr.Tables("node")
Set ppn=ptabl.Cols("pn")
Set pqn=ptabl.Cols("qn")
ptabl.SetSel("na="&raion)
ppn.Calc("pn*"&koeff)
pqn.Calc("qn*"&koeff)
End Sub
CorPQN 1,1.15
CorPQN 3,0.9
Макрос легко адаптировать к изменению и генерации и нагрузки:
r=setlocale("en-us")
Sub CorPQ(ng,raion,koeff)
Set ptabl=Rastr.Tables("node")
Set ppn=ptabl.Cols("p"&ng)
Set pqn=ptabl.Cols("q" &ng)
ptabl.SetSel("na="&raion)
ppn.Calc("pn*"&koeff)
pqn.Calc("qn*"&koeff)
End Sub
CorPQ "n",1,1.15
CorPQ "g",2,0.95
2. Задание нужного потребления района.
Изменить нагрузку района таким образом, чтобы выдержать заданное потребление (потребление - это нагрузка плюс потери). Реактивная нагрузка изменяется пропорционально активной:
r=setlocale("en-us")
Sub CorPotr(raion,potr)
max_it=10
eps=0.001
reac_p=True
Set pnode=Rastr.Tables("node")
pnode.SetSel("na="&raion)
Set pn=pnode.Cols("pn")
Set qn=pnode.Cols("qn")
Rastr.printp "Район=" & raion
Rastr.printp "Задано потребление=" & potr
for i=1 to max_it
pop=Rastr.Calc("val","area","pop","na="&raion)
koef=potr/pop
Rastr.printp "Текущее потребление =" & pop
Rastr.printp "Отношение заданное/текущее =" & koef
if( abs(koef -1) > eps) then
pn.Calc("pn*"&koef)
if(reac_p) then qn.Calc("qn*"&koef)
kod=Rastr.rgm("")
if(kod <> 0) then
Rastr.printp "---------Аварийное завершение расчета режима----------- "
exit sub
end if
else exit sub
end if
next
end Sub
CorPotr 1,2000
CorPotr 7,17000
Так как потери в районе меняются нелинейно, используется итерационная процедура. Задается максимальное число итераций (10 ) и точность расчета (0.001 - отношение заданного к расчетному потреблению). Мощности узлов в районе изменяются пропорционально отношению заданного и расчетного потребления. Производится расчет режима. Результаты выполнения макро для тестовой схемы:
Район=1
Задано потребление=2000
Текущее потребление =2219.1337961166
Отношение заданное/текущее =0.901252553361102
Ит Max.неб. Узел >V Узел <V Узел Угол Линия
0 26.5 1440 1.07 1605 0.87 1203 24.5 812-811 48.7
1 14.6 1418 1.07 1605 0.87 1203 24.5 812-811 42.1
2 3.7 802 1.07 1605 0.88 1203 24.3 812-811 2.4
3 72.6 4 1.07 1605 0.88 1203 24.3 812-811 0.0
4 0.9 4 1.07 1605 0.89 1203 24.3 812-811 0.2
Текущее потребление =2004.12509379647
Отношение заданное/текущее =0.997941698445252
Ит Max.неб. Узел >V Узел <V Узел Угол Линия
0 0.9 4 1.07 1605 0.89 1203 24.3 812-811 0.9
Текущее потребление =2000.15714284794
Отношение заданное/текущее =0.999921434749013
Диалоговая версия этого макроса находится в меню Выполнить. Она отличается вызовом макроса :
n=Rastr.SendCommandMain(8,"Введите номер района","",0)
pop=Rastr.SendCommandMain(8,"Введите новое потребление","",0)
CorPotr n+0,pop+0
3. Разгрузка заданного сечения на требуемую величину.
При разгрузке используются только генераторные узлы ( tip >1). В целях упрощения пределы (P_min и P_max ) не контролируются. Разгрузка осуществляется по критерию - минимальное изменение мощности генерации. Исходная генерация запоминается в массиве pg_nom.
r=setlocale("en-us")
Sub KorSech(ns,newp)
viborka="tip>1 &!sta & abs(dr_p) >0.01"
eps=1
Set grline=Rastr.Tables("grline")
Set node=Rastr.Tables("node")
Set pg=node.Cols("pg")
Set pg_nom=node.Cols("pg_nom")
Set ip=grline.Cols("ip")
Set iq=grline.Cols("iq")
pg_nom.Calc("pg")
For inini=1 to 10
ps=Rastr.Calc("sum","sechen","psech","ns="&ns)
Rastr.printp " Мощность сечения = " & ps
if ( abs(ps-newp) < eps ) then exit sub
Rastr.sensiv_start ""
grline.SetSel("ns="&ns)
k=grline.FindNextSel(-1)
While k <>-1
i=ip.Z(k)
j=iq.Z(k)
Rastr.sensiv_back 4,1.,i,j,0
k=grline.FindNextSel(k)
Wend
Rastr.sensiv_write ""
Rastr.sensiv_end
Set dr_p=node.Cols("dr_p")
db=Rastr.Calc("sum","node","dr_p",viborka)
if ( abs(db) < 0.000001 ) then
Rastr.printp "Невозможно изменить мощность по сечению"
exit sub
end if
rd=(ps-newp)/db
node.SetSel(viborka)
pg.Calc("pg + dr_p*"&rd)
kod=Rastr.rgm("")
if(kod <> 0) then
Rastr.printp "---------Аварийное завершение расчета режима----------- "
exit sub
end if
next
End Sub
KorSech 1,1500
Аналогично вызов макроса через диалог:
n=Rastr.SendCommandMain(8,"Введите номер сечения","",0)
pop=Rastr.SendCommandMain(8,"Введите новую мощность сечения","",0)
KorSech n+0,pop+0
В макросе используется расчет коэффициентов влияния. Изменения мощностей узлов происходят в соответствии с ними. При необходимости выборку
viborka="tip>1 &!sta & abs(dr_p) >0.01"
можно изменить желаемым образом, например:
viborka="sel &!sta & abs(dr_p) >0.01"
в этом случае в регулировании мощности сечения принимают только отмеченные узлы. При необходимости более детального анализа можно создать форму (на базе Узлы или Ген узлы), на которую вывести исходную генерацию (pg_nom) и коэффициенты влияния (dr_p, dr_q, dr_v).
Скрипты предоставлены В. Г. Неуйминым.
|