На главную страницу RastrWin

Автоматизация


Все приведенные макросы могут быть использованы для решения конкретных задач путем копирования в окно диалога Макро. Макросы состоят собственно из тела макроса ( от строки 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 имя-таблицы, имя-параметра, выборка, формула

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

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  'Потребление в районе 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

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  'Изменить мощность сечения 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