RastrWin |
Автоматизация |
Все приведенные макросы могут быть использованы для решения конкретных задач путем копирования в окно диалога Макро. Макросы состоят собственно из тела макроса ( от строки Sub до строки End Sub) и его вызова (имя макроса и параметры через запятую). Для использования макроса параметры заменяются на нужные в конкретной задаче.
При проведении коррекции в больших объемах, или однотипной коррекции в разных файлах удобно сделать следующий макрос:
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 имя-таблицы, имя-параметра, выборка, формула GrCor "node","pn","na=1","pn*1.15" ' увеличиваем нагрузку в районе 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 ' умножаем P и Q района 1 на 1.15 CorPQN 3,0.9 ' умножаем P и Q района 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 ' умножаем нагрузку("n") P и Q района 1 на 1.15 CorPQ "g",2,0.95 ' умножаем генерацию("g") P и Q района 2 на 0.9
Изменить нагрузку района таким образом, чтобы выдержать заданное потребление (потребление - это нагрузка плюс потери). Реактивная нагрузка изменяется пропорционально активной:
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 'Потребление в районе 1 сделать равным 2000 CorPotr 7,17000 'Потребление в районе 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
При разгрузке используются только генераторные узлы ( 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 'Изменить мощность сечения 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).
© «Битрикс», 2001-2006 |