Программа определения места повреждения на воздушной линии электропередачи, страница 17

if (AddMPforY(NumMPDam, -YMPNonDamaged)/=0) then; end if

          if (AddMPforY(NumMPDam, YMPDamaged)==0) then; end if

Рассчитываем узловые напряжения при заданных узловых токах. Для чего обращаемся к процедуре UfromYandI, описание которой приведено ниже.

          call UfromYandI 

Находим токи поврежденного многополюсника для этого обращаемся к процедуре FindI.

          call FindI(NumMPDam,mpb,YMPDamaged,I)

Формируем целевую функцию, для этого находим разность токов рассчи­танных и замеренных и затем умножаем ее на сопряженную разность токов

          I=I-IEtalon  

          F = Sum(Conjg(I)*I)   Целевая функция.

return

end subroutine

Процедура расчёта узловых напряжений при заданных узловых токах

subroutine UfromYandI

Для расчета узловых напряжений используем следующий алгоритм:

-  копируем матрицу Y сети в матрицу Z, то есть Z=Y, для этого воспользу­емся процедурой CopyY.

call CopyY (DiagZ,Zn,Zv,AnbZ,IbsZ,NextZ,AnsZ,kIbsZ) 

-  затем обратим матрицу Z (то есть Y) с помощью процедуры DfakBU. Ре­зультатом данной процедуры будет матрицы Z сети и код ошибки, ежели не удалось обратить матрицу Z (то есть Y).

call DfakBU (DiagZ,Zn,Zv,AnbZ,IbsZ,NextZ,AnsZ,AnbD,ier) -  Z^-1

if (ier/=0) then

  if (ier<0) then

    call AbortDlg('Не удалось обратить матрицу Y сети:')

  else

    write (Msg,'(a,i6,a)')  &

      'Не удалось обратить матрицу Y сети: опорный блок для узла', &

      Uzel(ier),' оказался вырожденным.'

   call AbortDlg(Msg)

  end if

  goto 99

end if

-  так как процедура SetEuz0 заслала узловые токи в Euz, то узловые на­пряжения определяются по формуле Euz=Z*Euz. Для вычисления узловых напряжений воспользуемся процедурой UBFMS. 

call UBFMS (kuz,DiagZ, Zn,Zv,AnbZ,IbsZ,NextZ,AnbD,AnsZ,Kfuz, EUz, Anb,1_2)

99 end subroutine

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

subroutine FindI(NumMPDam,mpb,Y,Im)

Входными параметрами процедуры FindI являются: схемный номер повре­жденного многополюсника NumMPDam, банковский номер поврежденного мно­гополюсника mpb, матрица проводимостей поврежденного многополюсника Y. Выходным парметром является   вектор токов поврежденного многополюсника.

  integer*2::kf,kfm,kfmp,Mask,mp,mpb,p,Pack,NumMPDam,Kfp(npmp)

  complex:: U(nphmp),I(nphmp),Im(nphmp),Y(neymp)

  Automatic U,I,Kfp

Определяем внутренний номер многополюсника mp и формируем вектор полюсных напряжений U для чего обращаемся к процедуре UMP1

  call UMP1(NumMPDam,U,Kfp,kfmp,2,mp)

Определяем токи поврежденного многополюсника по следующей формуле I= Y * U где Y – матрица узловых проводимостей данного многополюсника, U – вектор полюсных напряжений. Для этого обращаемся к процедуре CoMPRd.

  call CoMPRd(Y,U,I,kfmp,kfmp,1)  !  

Определим токи многополюсника с учетом разъемов.

Определяем внутренний Pack и пользовательский uPack номера пакета ма­сок для поврежденного многополюсника.

  Pack=CoctYm(mpb,4)

  kf=1    - счетчик фаз многополюсника

  do p=1,Cxema.Kpol(mp)   -   цикл по полюсам

          if (Pack/=0) then  -  маскировка токов полюса

      Mask=PlugPack(CocPack(Pack,2)-1+p)

Маскируем ток I(kf) с помощью процедуры MaskV

     call MaskV (Mask,I(kf),Kfp(p),Im,kfm)

     else   - маскировка токов полюса не требуется

      Mask=0

      kfm=Kfp(p)

      end if

      if (Mask/=0) then

        Mask=MatrD(Mask).numb - пользовательский номер маски

     Если маскировка не требуется, то обращаемся к процедуре копирования CopyC комплексного вектора токов I размерности kfm в вектор Im: Im=I

Else

        call CopyC(I(kf),Im,kfm)

      end if

            kf=kf+Kfp(p)

    end do

 еnd subroutine

end module

Итак, процедура ОМП в качестве компоненты комплекса «Маскарад», реа­лизована.

2.4 Отладка и апробация программы ОМП

Отладка и апробация программы ОМП в качестве компоненты комплекса «Маскарад» проводилась на следующем примере сети.