snifer

[原创]电站AGC机组最小及最大功率以避免跨越震动区程序设计

0
阅读(5081)

我们这个小地方有个全国第二大水电站,最近接了个活,就是调试他们的一个设备,超级豪华,米米多多,羡慕啊。

先扫个盲,在电力系统中,频率质量对社会和电力企业的影响非常重大。众所周知,电网频率是电能质量三大指标之一,电网的频率反映了发电有功功率和负荷之间的平衡关系,是电力系统运行的重要控制参数,与广大用户的电力设备以及发供电设备本身的安全和效率有着密切的关系。
(1) 频率波动对发电厂设备的影响:频率的波动可以造成水轮机导叶破坏严重,调速器使用寿命的下降等问题。

(2) 频率波动对用户设备的影响:
尽管许多用户设备能在较宽的频率范围内正常工作,但随着科学技术的发展,一些新的电子设备及精密加工设备对电网频率提出了更高的要求,频率的波动,会使产品质量下降或设备损坏。
(3) 频率质量改善对经济效益的影响:
频率偏差反映了发电与负荷间的不平衡,特别是频率偏高,反映发电量超出了用电的需求量,造成了用户电费的额外支出,以及能源的浪费。频率质量改善避免了这种能源的浪费。

针对这些问题,出路只有一个,即采用自动发电控制(AGC)的技术手段,对电力系统中的大部分发电机组,根据其本身的调节性能及在电网中的地位,分类进行控制,自动地维持电力系统中发供电功率的平衡,从而保证电力系统频率的质量。
 

我负责其中的一个小模块的代码设计,先讲一下硬件系统:

负荷优化控制系统(应用工作站)包括了AGC和AVC的联合控制功能。该系统通过TCP/IP网络接入电厂的ABB  ADVANT控制系统。
应用工作站由一台PC机和OLC(AGC/AVC)软件组成。应用工作站中的软件安装AGC/AVC软件。应用工作站使用Windows操作系统并通过TCP/IP网络和11LPU及调度中心通信。
应用工作站技术数据如下:
19英寸机架安装于11LPU柜内

继电保护:ADI 公司生产的ADF7012:  Multichannel ISM Band FSK/GFSK/OOK/GOOK/ASK Transmitter 
 

1 x Pentium 4, 1.20 GHz
512 MB PC133 SDRAM
1 x 20 GB EIDE-Disk, ATA-100
1 x 10/100 Mbps 以太网适配器
15寸显示器, 键盘, 鼠标
Windows 2000操作系统
在ADVANT控制器11LPU(AC450)将增加一块TCP/IP接口板用于与应用工作站通讯。该控制器被称作应用控制器,用于电厂的公共应用比如模拟屏控制和AGC/AVC与Advant系统的通讯。

AGC系统实现的主要功能包括有:站内总负荷设点控制,自动频率控制,站内调度曲线控制,省调总负荷设点控制,省调调度曲线控制。为了实现上述功能,本文作者对AGC进行模块化编程,主要涉及以下几个方面:
(1)计算机组最小及最大功率以避免跨越震动区,核心程序如下:
 

void SetUnitVibMinMax(int UnitPos)
{
  int PowerZone,UnitType;
  int i1;
  float min_var,max_var,LL,HL,DX,UnitPower;
  UnitType = UNIT[UnitPos].Type;
  UnitPower = UNIT[UnitPos].XAP_Setp;
  min_var = 0;
  max_var = AGC_Unit_Data[UnitType].MaxPower;
  LL = min_var;
  HL = max_var;
  DX = 0;
  i1 = 0;
  PowerZone = 0;
  if ((UnitType>0) && (UnitType<=MaxUnitTypes)) {
    while ((i1<MaxVibZones) && (PowerZone==0)) {
      i1++;
      if (AGC_Unit_Vibr[UnitType].Vibration[i1].Used==true) {
        max_var = AGC_Unit_Vibr[UnitType].Vibration[i1].AP_Begin;
        DX = (AGC_Unit_Vibr[UnitType].Vibration[i1].AP_End -
              AGC_Unit_Vibr[UnitType].Vibration[i1].AP_Begin) / 2;
        HL = AGC_Unit_Vibr[UnitType].Vibration[i1].AP_Begin + DX;
      } else {
        max_var = AGC_Unit_Data[UnitType].MaxPower;
        HL = max_var;
      }
      if ((UnitPower>=LL) && (UnitPower<=HL)) {
        PowerZone = i1;
      } else {
        if (AGC_Unit_Vibr[UnitType].Vibration[i1].Used==true) {
          min_var = AGC_Unit_Vibr[UnitType].Vibration[i1].AP_End;
          LL = min_var - DX;
        }
      }
    }
  }
  if (PowerZone==0) {
    min_var = UNIT[UnitPos].XAP_MIN;
    max_var = UNIT[UnitPos].XAP_MAX;
  }
  if (min_var<UNIT[UnitPos].XAP_MIN) min_var = UNIT[UnitPos].XAP_MIN;
  if (max_var>UNIT[UnitPos].XAP_MAX) max_var = UNIT[UnitPos].XAP_MAX;
  UNIT[UnitPos].XVibMinPow = min_var;
  UNIT[UnitPos].XVibMaxPow = max_var;
}
这个部分我负责的,写了很久,今天才通过,马上开始下一个模块的设计,骄阳似火。。。。。