На главную страницу
Русский English
 

RastrWin

Программа
Последние изменения
Часто задаваемые вопросы
Аннотация
Лицензирование и защита от копирования
Права Windows для пользователя RastrWin
Курсы
Компонентная архитектура
Интерфейс
Инструкция по установке
Документация, видео, презентации
Свидетельство о регистрации
RastrKZ
RastrMDP
Архив

Авторизация

Запомнить меня на этом компьютере
  Забыли свой пароль?
  Регистрация



Поиск по сайту


Подписка

Изменение параметров

Hits 19685183
7972
Hosts 974199
569
Visitors 13979319
7651

45


Главная / Программа

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

Версия для печати Версия для печати

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

Скрипты предоставлены В. Г. Неуйминым.




Программный комплекс «RasrWin»
Программный комплекс «RastrWin»
© «RastrWin», 1988-2011