⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mx.cpp

📁 电力系统无功自动补偿的操作系统程序
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	wsprintf(alarmMsg, "无功:");
	if (!Q.CheckParam(&alarmMsg[strlen(alarmMsg)])) return FALSE;

	wsprintf(alarmMsg, "电容器或电抗器信号设置错!");
	if ((DRQNum<0)||(DRQNum>VQC_DRQNUM))	return FALSE;
	if ((DKQNum<0)||(DKQNum>VQC_DRQNUM))	return FALSE;
	
	for (i=0;i<DRQNum;i++){
		wsprintf(alarmMsg, "%d#电容器:", i+1);
		if (!DRQ[i].CheckParam(&alarmMsg[strlen(alarmMsg)])) return FALSE;
		drqUseOrder[i] = DRQ[i].bLarge;
	}
	for (i=0;i<DKQNum;i++){
		wsprintf(alarmMsg, "%d#电抗器:", i+1);
		if (!DKQ[i].CheckParam(&alarmMsg[strlen(alarmMsg)])) return FALSE;
		dkqUseOrder[i] = DKQ[i].bLarge;
	}

	alarmMsg[0]=0;
	return TRUE;
}

void VQCMUXI_DBS::EveryDayInitProc()
{
	int i;
	for (i=0;i<DRQNum;i++) DRQ[i].EveryDayInitProc();
	for (i=0;i<DKQNum;i++) DKQ[i].EveryDayInitProc();
	U.lastDayOverUpTime		= U.dayOverUpTime;
	U.lastDayOverDownTime	= U.dayOverDownTime;
	U.dayOverUpTime		= 0;
	U.dayOverDownTime	= 0;
	if (pGlobalDef->currTime.GetDay()==1){
		U.lastMonthOverUpTime	= U.monthOverUpTime;
		U.lastMonthOverDownTime = U.monthOverDownTime;
		U.monthOverUpTime	= 0;
		U.monthOverDownTime	= 0;
	}
	Q.lastDayOverUpTime		= Q.dayOverUpTime;
	Q.lastDayOverDownTime	= Q.dayOverDownTime;
	Q.dayOverUpTime		= 0;
	Q.dayOverDownTime	= 0;
	if (pGlobalDef->currTime.GetDay()==1){
		Q.lastMonthOverUpTime	= Q.monthOverUpTime;
		Q.lastMonthOverDownTime = Q.monthOverDownTime;
		Q.monthOverUpTime	= 0;
		Q.monthOverDownTime	= 0;
	}
}

void VQCMUXI_DBS::ClearAllManUnlockProc()
{
int i;
	CheckLock.ClearAllManUnlockProc();
	for (i=0;i<DRQNum;i++) DRQ[i].ClearAllManUnlockProc();
	for (i=0;i<DKQNum;i++) DKQ[i].ClearAllManUnlockProc();
}

float VQCMUXI_DBS::GetQUseCosLimitProc(float cosf)
{
	float pf;
	float ff;
	pf = PRec.GetYcValue();

	if (cosf==0.0f) return 0.0f;

	ff = (float)fabs((float)cosf);
	ff *= ff;
	ff = (float)(1.0/ff);
	ff -= (float)1.0;
	ff =  (float)sqrt(ff);
	ff *= pf;
	if (cosf<(float)0.0) ff =(float)(0.0-ff);
	return ff;
}

void VQCMUXI_DBS::AdjustTimeProc()
{
	UINT i;
	for (i=0;i<DRQNum;i++) DRQ[i].AdjustTimeProc();
	for (i=0;i<DKQNum;i++) DKQ[i].AdjustTimeProc();

	U.realValue		= URec.GetYcValue();
	Q.realValue		= QRec.GetYcValue();
	U.AdjustTimeProc();//取上下限值和采样值移位
	Q.AdjustTimeProc();

	sampleNum ++;
	if (sampleNum > MaxSampleNum) sampleNum = MaxSampleNum;

	//调整无功的上下限值
	if (pGlobalDef->bUseCos){   //根据功率因数下定值
		float tf,pf;
		Q.currUpLimit = GetQUseCosLimitProc(Q.currUpLimit);
		Q.currDownLimit = GetQUseCosLimitProc(Q.currDownLimit);
		if (Q.currUpLimit < Q.currDownLimit){   //上限值比下限值小
			tf = Q.currUpLimit;
			Q.currUpLimit = Q.currDownLimit;
			Q.currDownLimit = tf;
		}
		pf = PRec.GetYcValue();
		tf = (float)sqrt(pf*pf + Q.realValue*Q.realValue);
		if (tf !=0.0f) Q.cosq_realValue = (float)(pf/tf);
		else Q.cosq_realValue = 0;
	}

	U.CaculateOverLimitTime();
	Q.CaculateOverLimitTime();
}

void VQCMUXI_DBS::CheckLockProc()
{
	int i;
	float ff;

	lockReasonStatus = CheckLock.GetLockStatusProc();

	if (!LinkZbKgDevRec.GetStatus()) lockReasonStatus |= LOCK_MX_NOTLINK;
	if (!LinkZbDzDevRec.GetStatus()) lockReasonStatus |= LOCK_MX_NOTLINK;

	if (!(lockReasonStatus & LOCK_MX_NOTLINK))
		lockReasonStatus |= pFatherZB->lockReasonStatus;

	ff = URec.GetYcValue();
	if (ff>=U.LockUpLimit) lockReasonStatus |= LOCK_MX_VALUE_OVER;
	if (ff<=U.LockDownLimit) lockReasonStatus |= LOCK_MX_VALUE_OVER;

	ff = QRec.GetYcValue();
	if (ff>=Q.LockUpLimit) lockReasonStatus |= LOCK_MX_VALUE_OVER;
	if (ff<=Q.LockDownLimit) lockReasonStatus |= LOCK_MX_VALUE_OVER;

	for (i=0;i<DRQNum;i++) DRQ[i].CheckLockProc();
	for (i=0;i<DKQNum;i++) DKQ[i].CheckLockProc();

// 取母线上的电容器处于合的状态数目
	currUseDrqOnNum =0;
	for (i=0;i<DRQNum;i++){
		if (DRQ[i].lockReasonStatus & LOCK_DRQ_NOUSE) continue;
		if (DRQ[i].lockReasonStatus & LOCK_DRQ_CLOSE) currUseDrqOnNum++;
	}
// 取母线上的电抗器处于合的状态数目
	currUseDkqOnNum =0;
	for (i=0;i<DKQNum;i++){
		if (DKQ[i].lockReasonStatus & LOCK_DRQ_NOUSE) continue;
		if (DKQ[i].lockReasonStatus & LOCK_DRQ_CLOSE) currUseDkqOnNum++;
	}
//置母线左右相连状态
	if (LeftLinkDevNum){
		for (i=0;i<LeftLinkDevNum;i++)
			if (!LeftLinkDevRec[i].GetStatus()) break;
		if (i>=LeftLinkDevNum) bLeftLink = TRUE;
		else bLeftLink = FALSE;
	}

	if (RightLinkDevNum){
		for (i=0;i<RightLinkDevNum;i++)
			if (!RightLinkDevRec[i].GetStatus()) break;
		if (i>=RightLinkDevNum) bRightLink = TRUE;
		else bRightLink = FALSE;
	}
}

void VQCMUXI_DBS::GetDevLinkStatusProc()
{
	BYTE i;
	BYTE anotherMXNo;
	VQCMUXI_DBS * tm;
	BYTE tempZBNo;
	BYTE tempMXNo;
	BOOL bAnotherLink;
	
	//查找连接的母线
	linkMXNum = 1;
	linkMX[0] = this;
	//查找左连接母线
	tm =this;
	for (;;){
		if (tm->bLeftLink==FALSE) break;
		tempZBNo = tm->LeftLinkZBNo;
		tempMXNo = tm->LeftLinkMXNo;
		tm = &(pFatherZB->pFatherVQC->ZB[tempZBNo].MX[tempMXNo]);
        for (i=0;i<linkMXNum;i++) if (linkMX[i] == tm) break;
		if (i!=linkMXNum) break;  //找到重复的母线
		linkMX[linkMXNum] = tm;
		linkMXNum ++;
	}
	//查找右连接母线
	tm =this;
	for (;;){
		if (tm->bRightLink==FALSE) break;
		tempZBNo = tm->RightLinkZBNo;
		tempMXNo = tm->RightLinkMXNo;
		tm = &(pFatherZB->pFatherVQC->ZB[tempZBNo].MX[tempMXNo]);
        for (i=0;i<linkMXNum;i++) if (linkMX[i] == tm) break;
		if (i!=linkMXNum) break;  //找到重复的母线
		linkMX[linkMXNum] = tm;
		linkMXNum ++;
	}
	//找同一台主变的两个母线连接
	bAnotherLink = TRUE;
	if (pFatherZB->MXNum>1){
		if (pFatherZB->MX[0].lockReasonStatus & LOCK_MX_NOTLINK) bAnotherLink = FALSE;
		if (pFatherZB->MX[1].lockReasonStatus & LOCK_MX_NOTLINK) bAnotherLink = FALSE;
	}
	else bAnotherLink = FALSE;
	if (bAnotherLink){
		anotherMXNo = (MXNo+1)%2;
		tm = &(pFatherZB->MX[anotherMXNo]);
        for (i=0;i<linkMXNum;i++) if (linkMX[i] == tm) break;
		if (i>=linkMXNum){
			linkMX[linkMXNum] = tm;
			linkMXNum ++;
		}

		for (;;){
			if (tm->bLeftLink==FALSE) break;
			tempZBNo = tm->LeftLinkZBNo;
			tempMXNo = tm->LeftLinkMXNo;
			tm = &(pFatherZB->pFatherVQC->ZB[tempZBNo].MX[tempMXNo]);
	        for (i=0;i<linkMXNum;i++) if (linkMX[i] == tm) break;
			if (i<linkMXNum) break;  //找到重复的母线
			linkMX[linkMXNum] = tm;
			linkMXNum ++;
		}
		tm = &(pFatherZB->MX[anotherMXNo]);
		for (;;){
			if (tm->bRightLink==FALSE) break;
			tempZBNo = tm->RightLinkZBNo;
			tempMXNo = tm->RightLinkMXNo;
			tm = &(pFatherZB->pFatherVQC->ZB[tempZBNo].MX[tempMXNo]);
	        for (i=0;i<linkMXNum;i++) if (linkMX[i] == tm) break;
			if (i<linkMXNum) break;  //找到重复的母线
			linkMX[linkMXNum] = tm;
			linkMXNum ++;
		}
	}
}

void VQCMUXI_DBS::SetLockStatusForLinkDevProc()
{
	BYTE i;
	float tv;
	float tv1;
	UINT lockMask;
	tv = URec.GetYcValue();
	lockMask  = LOCK_MX_TIMES_OVER;
	lockMask |= LOCK_BH;
	lockMask |= LOCK_YX;
	lockMask |= LOCK_YC;
	lockMask |= LOCK_MX_ACTING;
	lockMask |= LOCK_MX_FORBIDUPU;
	lockMask |= LOCK_MX_FORBIDDOWNU;
	lockMask |= LOCK_MX_VALUE_OVER;
	for (i=1;i<linkMXNum;i++){
		if (linkMX[i]->lockReasonStatus & lockMask)
			lockReasonStatus |= (linkMX[i]->lockReasonStatus&lockMask);
		tv1 = linkMX[i]->URec.GetYcValue();
		if (fabs(tv+tv1)>0.00001)
		if ((fabs(tv-tv1)/fabs(tv+tv1)) > 0.01)
			lockReasonStatus |= LOCK_MX_VALUE_OVER;

		if (linkMX[i]->lockReasonStatus & LOCK_MX_NOTLINK) continue;
		if (linkMX[i]->lockReasonStatus & LOCK_MX_NOTRUN) continue;
		if (bLinkQ)	Q.realValue += linkMX[i]->Q.sampleValue[0];
	}

}

void VQCMUXI_DBS::SetLibValueProc()
{
	int i;
	for (i=0;i<DRQNum;i++) DRQ[i].SetLibValueProc();
	for (i=0;i<DKQNum;i++) DKQ[i].SetLibValueProc();
	if (lockReasonStatus&0x3fff)	LockStatRec.SetWfStatus(TRUE);
	else LockStatRec.SetWfStatus(FALSE);
}


VQCDRQ_DBS * VQCMUXI_DBS::FindDrqForCloseOnOneMxProc()
  {
    BOOL bClosed[VQC_DRQNUM];
    short k,i;

    for (i=0;i<DRQNum;i++) bClosed[i] = FALSE;

    //设置按序号使用的电容器的已合标志
  	for (k=0;k<DRQNum;k++){
    	if ((DRQ[k].lockReasonStatus & LOCK_DRQ_OPEN)==0){  //开关为合
        for (i=0;i<DRQNum;i++){
          if (bClosed[i]) continue;
          if (DRQ[k].bLarge == drqUseOrder[i]) {
			  bClosed[i] = TRUE;
			  break;
		  }
        }
      }
    }

	VQCDRQ_DBS * findDev  = NULL;
  	for (k=0;k<DRQNum;k++){
      if (bClosed[k]) continue;
      for (i=0;i<DRQNum;i++){
      	if ((DRQ[i].lockReasonStatus & LOCK_DRQ_OPEN)==0) continue;//开关为合
 	  	  if ((DRQ[i].lockReasonStatus &0x3fff)!=0) continue;
        if (DRQ[i].bLarge == drqUseOrder[k]){
          if (!findDev) findDev = &DRQ[i];
          else{  //优先级别相同,找动作过时间最远的电容器
	  			  if (findDev->lastActTime > DRQ[i].lastActTime)
  		  		findDev = &DRQ[i];
          }
        }
      }
	  if (findDev) return findDev;
    }
    return findDev;
  };


VQCDRQ_DBS * VQCMUXI_DBS::FindDkqForCloseOnOneMxProc()
{
    BOOL bClosed[VQC_DRQNUM];
    short k,i;

    for (i=0;i<DKQNum;i++) bClosed[i] = FALSE;

    //设置按序号使用的电抗器的已合标志
  	for (k=0;k<DKQNum;k++){
    	if ((DKQ[k].lockReasonStatus & LOCK_DRQ_OPEN)==0){  //开关为合
        for (i=0;i<DKQNum;i++){
          if (bClosed[i]) continue;
          if (DKQ[k].bLarge == dkqUseOrder[i]){
			  bClosed[i] = TRUE;
			  break;
		  }
        }
      }
    }

    VQCDRQ_DBS * findDev  = NULL;
  	for (k=0;k<DKQNum;k++){
      if (bClosed[k]) continue;
      for (i=0;i<DKQNum;i++){
      	if ((DKQ[i].lockReasonStatus & LOCK_DRQ_OPEN)==0) continue;//开关为合
 	  	  if ((DKQ[i].lockReasonStatus &0x3fff)!=0) continue;
        if (DKQ[i].bLarge == dkqUseOrder[k]){
          if (!findDev) findDev = &DKQ[i];
          else{  //优先级别相同,找动作过时间最远的电抗器
	  			  if (findDev->lastActTime > DKQ[i].lastActTime)
  		  		findDev = &DKQ[i];
          }
        }
      }
	  if (findDev) return findDev;
    }
    return findDev;
};


VQCDRQ_DBS * VQCMUXI_DBS::FindDrqForOpenOnOneMxProc()
{
    BOOL bClosed[VQC_DRQNUM];
    short k,i;

    for (i=0;i<DRQNum;i++) bClosed[i] = FALSE;

    //设置按序号使用的电容器的已合标志
  	for (k=0;k<DRQNum;k++){
    	if ((DRQ[k].lockReasonStatus & LOCK_DRQ_OPEN)==0){  //开关为合
        for (i=0;i<DRQNum;i++){
          if (bClosed[i]) continue;
          if (DRQ[k].bLarge ==  drqUseOrder[i]){
			  bClosed[i] = TRUE;
			  break;
		  }
        }
      }
    }

    VQCDRQ_DBS * findDev  = NULL;
  	for (k=(DRQNum-1); k>=0;k--){  //退的顺序与投的顺序相反
      if (!bClosed[k]) continue;
      for (i=0;i<DRQNum;i++){
      	if ((DRQ[i].lockReasonStatus & LOCK_DRQ_OPEN)!=0) continue;//开关为分
 	  	  if ((DRQ[i].lockReasonStatus &0x3fff)!=0) continue;
        if (DRQ[i].bLarge == drqUseOrder[k]){
          if (!findDev) findDev = &DRQ[i];
          else{
  	  			if (findDev->lastActTime > DRQ[i].lastActTime)
	  	  		findDev = &DRQ[i]; //优先级别相同,找动作过时间最远的电容器
          }
        }
      }
	  if (findDev) return findDev;
    }
    return findDev;
  };

VQCDRQ_DBS * VQCMUXI_DBS::FindDkqForOpenOnOneMxProc()
{
    BOOL bClosed[VQC_DRQNUM];
    short k,i;

    for (i=0;i<DKQNum;i++) bClosed[i] = FALSE;

    //设置按序号使用的电抗器的已合标志
  	for (k=0;k<DKQNum;k++){
    	if ((DKQ[k].lockReasonStatus & LOCK_DRQ_OPEN)==0){  //开关为合
        for (i=0;i<DKQNum;i++){
          if (bClosed[i]) continue;
          if (DKQ[k].bLarge == dkqUseOrder[i]){
			  bClosed[i] = TRUE;
			  break;
		  }
        }
      }
    }

    VQCDRQ_DBS * findDev  = NULL;
  	for (k=(DKQNum-1); k>=0;k--){  //退的顺序与投的顺序相反
      if (!bClosed[k]) continue;
      for (i=0;i<DKQNum;i++){
      	if ((DKQ[i].lockReasonStatus & LOCK_DRQ_OPEN)!=0) continue;//开关为分
 	  	  if ((DKQ[i].lockReasonStatus &0x3fff)!=0) continue;
        if (DKQ[i].bLarge == dkqUseOrder[k]){
          if (!findDev) findDev = &DKQ[i];
          else{
	  			  if (findDev->lastActTime > DKQ[i].lastActTime)
  		  		findDev = &DKQ[i]; //优先级别相同,找动作过时间最远的电抗器
          }
        }
      }
	  if (findDev) return findDev;
    }
    return findDev;
};



VQCDRQ_DBS * VQCMUXI_DBS::FindDrqOpenOrDkgClose()   //currUseDevForRiseQReduceU
{
	BYTE i,j,k;
	VQCMUXI_DBS * temp[VQC_ZBNUM*2];
	VQCMUXI_DBS * tm;
	VQCDRQ_DBS  * pq=NULL;
	VQCDRQ_DBS  * findDev;
	BYTE onCloseNum;
	//找出有合上电容器的母线
	j = 0;
	for (i=0;i<linkMXNum;i++){
		if (linkMX[i]->currUseDrqOnNum){
			temp[j] = linkMX[i];
			j++;
		}
	}
	if (j==0){//未找到
		//找出有电抗器可以合的母线
		j = 0;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -