📄 mx.cpp
字号:
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 + -