📄 processwbs.cpp
字号:
RTUPARA far *rtupara;
YXDATA far *yxdata;
BYTE rtuyxdata;
static CTime tBack = CTime::GetCurrentTime ();
STATION *station = GetStationPt(Addr,0);
if (!station)
return;
for (BYTE l = 0; l<station->yxnum ; l++ )
{
{
WORD i = l;
char yxname[10];
sprintf(yxname,"yx%05d",i);
yxpara = GetYxParaPt(Addr,yxname);//Addr->YxPara_addr + i;
if (!yxpara) continue;
yxdata = GetYxDataPt(Addr,yxname);//Addr->YxData_addr + i;
if (!yxdata) continue;
if (yxpara->validf && !yxpara->setinf )
{
LINEPARA *linepara = GetLineParaPt(Addr,yxpara->linename );
if (linepara)
{
if (yxpara->xljxflag != linepara->xljxflag )
{
yxpara->xljxflag = linepara->xljxflag ;
yxpara->modified = 1;
}
if (linepara->haveplflag && linepara->pltdflag )
{
LINEPARA *linepara1 = GetLineParaPt(Addr,linepara->pllinename );//得到旁路线路
if (linepara1)
{
for (WORD j = 0;j < station->yxnum;j++)
{
char yxname1[10];
sprintf(yxname1,"yx%05d",j);
YXPARA *yxpara1 = GetYxParaPt(Addr,yxname1);//Addr->YxPara_addr + station->yxstart + j;
if (yxpara1)
{//比较遥信和旁路对应的线路名称是否相等,相等置遥信相关旁路标志
if ((strcmp(yxpara1->linename,linepara1->name ) == 0) && yxpara->type == yxpara1->type )
{
yxpara->pltdflag = 1;
strcpy(yxpara->pltdyxname ,yxpara1->name );
}
}
}
}
}
else//否则不置标志
{
yxpara->pltdflag = 0;
yxpara->pltdyxname [0] = 0;
}
}
if(!yxpara->calcflag)//是否计算量
{
if (yxpara->rtuno > Addr->SysPara_addr->rtumaxnum)
continue;
rtupara = GetRtuParaPt(Addr,yxpara->rtuno );//Addr->RtuPara_addr + yxpara->rtuno ;
if (rtupara)
{
if ( rtupara->useflag && (yxpara->yxno < rtupara->yxnum))//遥信没有超过该节点所对应的遥信数
{
rtuyxdata = rtupara->YxValue[yxpara->yxno] ;
if (!yxpara->pltdflag )//没有旁路线路
{
BYTE t = 0;
if (yxpara->notflag )//遥信取反
t = !(rtuyxdata & 0x1);
else
t = (rtuyxdata & 0x1);
if ((yxdata->value & 0x1) != (t & 0x1))//遥信对应的数值和RTU对应的不一致
{
BYTE temp = 0;
temp = (yxdata->value & 0x1) * 2;
yxdata->value = 0;
yxdata->value = (t & 0x1) + temp;
if (rtupara->RecFullYx == 1 ) //产生遥信和SOE报警
{
//gen local yx change event and soe event
YxEvent(yxpara->rtuno,yxpara->yxno,(t & 0x1));
Alarm_DiOrLing(yxpara);
}
}
}
else//有旁路线路
{
CString str1 = yxpara->pltdyxname ;
WORD yxno = atoi(str1.Right (str1.GetLength () - 2));
if (yxno < Addr->SysPara_addr->allyxmaxnum )
{
YXPARA *yxpara1 = Addr->YxPara_addr + yxno;
YXDATA *yxdata1 = Addr->YxData_addr + yxno;
yxdata->value = yxdata1->value;
}
}
}
else//没有使用该节点或超过节点定义的遥信数目
{
yxdata->value = 0;
}
}
else//的到的RTU指针为空
yxdata->value = 0;
}
else//遥信为计算量
{
CString str = yxpara->formula ;//char formula[10]
BYTE val = MyLogic(Addr,yxpara->formula);//???得到公式的值
if (yxpara->notflag )//遥信取反
val = !(val & 0x1);
if ((yxdata->value & 0x1) != (val & 0x1))//确定YXDATA的值
{
BYTE temp = 0;
temp = (yxdata->value & 0x1) * 2;
yxdata->value = 0;
yxdata->value = (val & 0x1) + temp;
if (rtupara->RecFullYx == 1 )//产生遥信变位报警和SOE事项
{
//gen local yx change event and soe event
YxEvent(yxpara->rtuno,yxpara->yxno,(val & 0x1));
Alarm_DiOrLing(yxpara);
}
}
}
if (yxpara->glflag && (yxpara->type == BREAK || yxpara->type == SWITCH) )//关联有效,遥信为开关,刀闸
{
YCPARA *ycpara1 = GetYcParaPt(Addr,yxpara->glycname );//Addr->YcPara_addr + ycno;
YCDATA *ycdata1 = GetYcDataPt(Addr,yxpara->glycname );//Addr->YcData_addr + ycno;
if (ycpara1 && ycdata1)
{
if (!(yxdata->value & 0x1))//如果YXDATA的值为0
{
if (ycpara1->lpflag == 1)//YCPARA零漂有效
{
if (fabs(ycdata1->value) > fabs(ycpara1->lpvalve) )
{
yxdata->value = 0x3;
}
}
else
{
if (fabs(ycdata1->value) > 0.5 )
{
yxdata->value = 0x3;
}
}
}
}
}
}
}
}
BACKAUTORUNPARA *para = Addr->BackAutoRunPara_addr;
if (para->validf)
{
YXPARA *yxpara = GetYxParaPt(Addr,para->break0);
YXDATA *yxdata = GetYxDataPt(Addr,para->break0);
YXPARA *yxpara1 = GetYxParaPt(Addr,para->break1);
YXDATA *yxdata1 = GetYxDataPt(Addr,para->break1);
YXPARA *yxpara2 = GetYxParaPt(Addr,para->break2);
YXDATA *yxdata2 = GetYxDataPt(Addr,para->break2);
YCPARA *ycpara1 = GetYcParaPt(Addr,para->v1);
YCDATA *ycdata1 = GetYcDataPt(Addr,para->v1);
YCPARA *ycpara2 = GetYcParaPt(Addr,para->v2);
YCDATA *ycdata2 = GetYcDataPt(Addr,para->v2);
if (yxpara != NULL || yxpara1 != NULL || yxpara2 != NULL || ycpara1 != NULL || ycpara2 != NULL)
{
CTime t1 = CTime::GetCurrentTime ();
time_t lTBack = tBack.GetTime();
time_t lT1 = t1.GetTime();
if ((lT1 - lTBack ) > para->delaytime)
{
if ((yxdata->value & 0x01) == 0)//分段开关分开
{
if ((((yxdata1->value & 0x01) == 0) && (ycdata1->value < 1)) || (((yxdata2->value & 0x01) == 0) && (ycdata2->value < 1)))
{
int iNodeNo = yxpara->rtuno;
RTUPARA *rtupara = Addr->RtuPara_addr + iNodeNo;
rtupara->SetCommand[0] = 1;//local
rtupara->SetCommand[1] = YK;
rtupara->SetCommand[2] = 0x22;
rtupara->SetCommand[3] = iNodeNo;
rtupara->SetCommand[4] = 0xcc;//close
rtupara->SetCommand[5] = 255;
rtupara->CommandSendFlag[8] = true;
}
}
else if ((yxdata->value & 0x01) == 1)//分段开关合上
{
if ((((yxdata1->value & 0x01) == 1) && (ycdata1->value > 1)) && (((yxdata2->value & 0x01) == 1) && (ycdata2->value > 1)))
{
int iNodeNo = yxpara->rtuno;
RTUPARA *rtupara = Addr->RtuPara_addr + iNodeNo;
rtupara->SetCommand[0] = 1;//local
rtupara->SetCommand[1] = YK;
rtupara->SetCommand[2] = 0x22;
rtupara->SetCommand[3] = iNodeNo;
rtupara->SetCommand[4] = 0x33;//open
rtupara->SetCommand[5] = 255;
rtupara->CommandSendFlag[8] = true;
}
}
tBack = CTime::GetCurrentTime ();
}
}
else
tBack = CTime::GetCurrentTime ();
}
else
tBack = CTime::GetCurrentTime ();
}
//************************************************************************
void HandleRealKwh(void *addr)
{
ADDR *Addr = (ADDR *)addr;
BYTE sec;
if ( Addr->RUN->lastsec <= Addr->RUN->Today.wSecond )
sec = Addr->RUN->Today.wSecond - Addr->RUN->lastsec;
else
sec = Addr->RUN->Today.wSecond + 60 - Addr->RUN->lastsec;
Addr->RUN->lastsec = (BYTE)Addr->RUN->Today.wSecond;
KWHDATA *kwhdata = Addr->KwhData_addr;
KWHPARA *kwhpara = Addr->KwhPara_addr;
double value = 0;
BYTE state = 0;
STATION *station = GetStationPt(Addr,0);
if (!station)
return;
for ( BYTE l=0; l < station->kwhnum ; l++ )
{ // 处理电度
value = 0;
WORD i = l;
char kwhname[10];
sprintf(kwhname,"kwh%05d",i);
kwhpara = GetKwhParaPt(Addr,kwhname);
if (!kwhpara) continue;
kwhdata = GetKwhDataPt(Addr,kwhname);
if (!kwhdata) continue;
if (!kwhpara->validf)
continue;
if (!kwhpara->jfkwhflag && !kwhpara->calcf)//非计算量和积分电度量
{
RTUPARA *rtupara = GetRtuParaPt(Addr,kwhpara->rtuno );
if (rtupara)
{
if ( (rtupara->useflag) && (kwhpara->kwhno < rtupara->kwhnum))//
{
long rtukwhdata = rtupara->KwhValue[kwhpara->kwhno];
if (!kwhpara->pltdflag)//没有旁路
{
kwhdata->value = ( kwhpara->coef * rtukwhdata + kwhpara->base );//乘以系数加上基值
}
else//有旁路
{
KWHDATA *kwhdata1 = GetKwhDataPt(Addr,kwhpara->pltdkwhname );
if (kwhdata1)
kwhdata->value = kwhdata1->value;//赋旁路遥测
else
kwhdata->value = 0;
}
}
else
kwhdata->value = 0;
}
else
kwhdata->value = 0;
value = kwhdata->value - kwhdata->temp;// double value
kwhdata->temp = kwhdata->value;//??
}
else if (kwhpara->calcf )
{
CString str = kwhpara->formula ;
kwhdata->value = MyCalc(Addr,str);
value = float(kwhdata->value - kwhdata->temp );
kwhdata->temp = kwhdata->value ;//??
}
else
{
CString str1 = kwhpara->jfycname;
float fTemp = 0;
int iRet = GetAYc(Addr,kwhpara->jfycname,0,fTemp,state);
if (iRet == 0)
{
value = fTemp * (float)(sec/(float)3600) * kwhpara->coef;
kwhdata->value += value;//
}
}
SYSTEMTIME st;
GetLocalTime(&st);
kwhdata->hourvalue[st.wHour] = kwhdata->value; //+= value; modified by yl 2002.4.28
kwhdata->dayvalue += value;
kwhdata->monthvalue += value;
kwhdata->yearvalue += value;
kwhdata->totalvalue += value;
switch (Addr->SysPara_addr->GetTimeType(st.wHour,st.wMinute ))
{
case 0://toptop
kwhdata->toptopvalue += value;
break;
case 1:
kwhdata->topvalue += value;
break;
case 2:
kwhdata->normalvalue += value;
break;
case 3:
kwhdata->bottomvalue += value;
default:
break;
}
}
}
//iType -- 0-请求遥控;1-发送全遥信;iNodeNo-节点号
bool SendDataToWf (int iNodeNo,int iType)
{
COPYDATASTRUCT cp;
STATION *station = Addr->Station_addr;
int iYxNum = station->yxnum;
cp.dwData = 1;
BYTE SendData[20] ;//= (BYTE *)pData->lpData;
SendData[0] = 0x90;
SendData[1] = 0xeb;
SendData[2] = 0x90;
SendData[3] = 0xeb;
SendData[4] = 0x90;
SendData[5] = 0xeb;
if (iType == 0)
{
for (int i = 0;i < iYxNum;i++)
{
YXPARA *yxpara = Addr->YxPara_addr + i;
if ((yxpara->rtuno == iNodeNo) && (yxpara->type == BREAK))
break;
}
if (i == iYxNum)
return false;
YXDATA *yxdata = Addr->YxData_addr + i;
cp.cbData = 20;
SendData[6] = 0x0c;
SendData[7] = 0x00;
SendData[8] = 0x00;
SendData[9] = 0x00;
SendData[10] = 0x00;
SendData[11] = 0x02;
SendData[12] = 0x00;
SendData[13] = 0x00;
SendData[14] = 0x03;
SendData[15] = 0x00;
SendData[16] = i % 256;
SendData[17] = i / 256;
// SendData[18] = yxdata->value;
if (yxdata->value == 0)
SendData[18] = 1;
else
SendData[18] = 0;
long sum = 0;
for (i = 0;i < 19;i++)
sum += SendData[i];
SendData[19] = sum % 256;
}
else if (iType == 1)
{
cp.cbData = 19;
SendData[6] = 10;
SendData[7] = 0;
SendData[8] = 0x00;
SendData[9] = 0x00;
SendData[10] = 0x00;
SendData[11] = 0x01;
SendData[12] = 0x00;
SendData[13] = 0x00;
SendData[14] = 2;
SendData[15] = 0;
for (int j = 0;j < 2;j++)
{
SendData[16+j] = 0;
}
for (j = 0;j < 2;j++)
{
for (int k = 0;k < 8;k++)
{
YXDATA *yxdata = Addr->YxData_addr + j * 8 + k;
SendData[16+j] |= ((yxdata->value & 0x1) << k);
}
}
long sum = 0;
for (int i = 0;i < 18;i++)
sum += SendData[i];
SendData[18] = sum % 256;
}
cp.lpData = SendData;
CString title;
title = "WCOM";
HWND hPre = ::FindWindow(NULL,title);//如果有五防系统运行
HWND hMe = (HWND)AfxGetMainWnd();
if ( hPre )
{
::SendMessage(hPre,WM_COPYDATA,(WPARAM)hMe,(LPARAM)(&cp));
}
return true;
}
void Alarm_DiOrLing(YXPARA *yxpara)
{
STATION *station = Addr->Station_addr;
if (station->havecenterunit & 0x1)
{
if (yxpara->deviceflag == 1)//鸣笛事件
{
for (int l = 0;l < station->rtunum;l++)
{
RTUPARA *para = Addr->RtuPara_addr + l;
if (para->rtuaddr == 31 && para->rtutype == 3)
para->CommandSendFlag [18] = 1;
}
}
else if (yxpara->deviceflag == 2)//鸣铃事件
{
for (int l = 0;l < station->rtunum;l++)
{
RTUPARA *para = Addr->RtuPara_addr + l;
if (para->rtuaddr == 31 && para->rtutype == 3)
para->CommandSendFlag [19] = 1;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -