📄 dnpexplain.cpp
字号:
__int64 timeInMillSec;
SYSTEMTIME pSystemTime;
CTime baseTime(0);
CTimeSpan timeSpanTemp;
BYTE timetemp1,timetemp2,timetemp3,
timetemp4,timetemp5,timetemp6;
// pSoeRec=m_paSOE.GetAt(0);
BYTE rtuaddr1,rtuaddr2,priaddr1,priaddr2;
rtuaddr1=(BYTE)rtuaddr;
rtuaddr2=rtuaddr>>8;
priaddr1=(BYTE)priaddr;
priaddr2=priaddr>>8;
BYTE Length=14+28;//58:一个故障的数据长度
m_baOutBuffer.RemoveAll();
m_baOutBuffer.Add(0x05);
m_baOutBuffer.Add(0x64);
m_baOutBuffer.Add(Length);//Length
m_baOutBuffer.Add(0x44);
m_baOutBuffer.Add(priaddr1);
m_baOutBuffer.Add(priaddr2);
m_baOutBuffer.Add(rtuaddr1);
m_baOutBuffer.Add(rtuaddr2);
//////////////////////////////2Byte CRC reserved
/////////////////////////////
m_baOutBuffer.Add(0xca);
m_baOutBuffer.Add(0xeb);
m_baOutBuffer.Add(0x81);
//iin1
//iin2
m_baOutBuffer.Add(0x39);//object: 科汇FTU的故障对象定义
m_baOutBuffer.Add(0x00);//
m_baOutBuffer.Add(0x17);
m_baOutBuffer.Add(1);//Number
pFaultRec=(CFaultRec *)m_paFault.GetAt(0);
pSystemTime=pFaultRec->m_stTime;//获取毫秒
CTime timeFaultItem(pSystemTime);
timeSpanTemp=timeFaultItem-baseTime;
timeInMillSec=timeSpanTemp.GetTotalSeconds();
timetemp1=(BYTE)timeInMillSec;
timeInMillSec>>=8;
timetemp2=(BYTE)timeInMillSec;
timeInMillSec>>=8;
timetemp3=(BYTE)timeInMillSec;
timeInMillSec>>=8;
timetemp4=(BYTE)timeInMillSec;
timeInMillSec>>=8;
timetemp5=(BYTE)timeInMillSec;
timeInMillSec>>=8;
timetemp6=(BYTE)timeInMillSec;
m_baOutBuffer.Add(timetemp1);
m_baOutBuffer.Add(timetemp2);
m_baOutBuffer.Add(timetemp3);
m_baOutBuffer.Add(timetemp4);
m_baOutBuffer.Add(timetemp5);
m_baOutBuffer.Add(timetemp6);
m_baOutBuffer.Add(0x00);//故障源(RTU组的网络地址)
m_baOutBuffer.Add(0x00);//故障源(RTU组的网络地址)
BYTE time1=(BYTE)pFaultRec->m_wDelayTime;
BYTE time2=(pFaultRec->m_wDelayTime)>>8;
m_baOutBuffer.Add(time1);//故障持续时间
m_baOutBuffer.Add(time2);//
BYTE type1=0x00,type2=0x00;
if(pFaultRec->m_AOverCurrent)//A overcurrent
{
type1|=0x02;
}
if (pFaultRec->m_BOverCurrrent) //B overcurrent
{
type1|=0x04;
}
if (pFaultRec->m_COverCurrrent) //C overcurrent
{
type1|=0x08;
}
if (pFaultRec->m_3I0OverCurrent)//3Io overcurrent
{
type1|=0x10;
}
if (pFaultRec->m_3U0OverSetting)//3Uo over voltage set
{
type1|=0x20;
}
m_baOutBuffer.Add(type1);//line 1
m_baOutBuffer.Add(0x00);//line 2
if (pFaultRec->m_byDirection==1)
{
m_baOutBuffer.Add(0x0f);//故障方向
}
else
{
m_baOutBuffer.Add(0xf0);
}
m_baOutBuffer.Add(0x00);
m_baOutBuffer.Add(0x00);//故障距离
m_baOutBuffer.Add(0x00);
BYTE analogy1,analogy2;
WORD analogyTemp;
analogyTemp=pFaultRec->m_wFaultValueIa;//故障IA信息
analogy1=(BYTE)analogyTemp;
// analogyTemp>=8;
analogy2=analogyTemp>>8;
m_baOutBuffer.Add(analogy1);
m_baOutBuffer.Add(analogy2);
analogyTemp=pFaultRec->m_wFaultValueIb;//故障IB信息
analogy1=(BYTE)analogyTemp;
analogy2=analogyTemp>>8;
m_baOutBuffer.Add(analogy1);
m_baOutBuffer.Add(analogy2);
analogyTemp=pFaultRec->m_wFaultValueIc;//故障IC信息
analogy1=(BYTE)analogyTemp;
analogy2=analogyTemp>>8;
m_baOutBuffer.Add(analogy1);
m_baOutBuffer.Add(analogy2);
analogyTemp=pFaultRec->m_wFaultValueUa;//故障Ua信息
analogy1=(BYTE)analogyTemp;
analogy2=analogyTemp>>8;
m_baOutBuffer.Add(analogy1);
m_baOutBuffer.Add(analogy2);
analogyTemp=pFaultRec->m_wFaultValueUb;//故障Ub信息
analogy1=(BYTE)analogyTemp;
analogy2=analogyTemp>>8;
m_baOutBuffer.Add(analogy1);
m_baOutBuffer.Add(analogy2);
analogyTemp=pFaultRec->m_wFaultValueUc;//故障Uc信息
analogy1=(BYTE)analogyTemp;
analogy2=analogyTemp>>8;
m_baOutBuffer.Add(analogy1);
m_baOutBuffer.Add(analogy2);
m_paFault.RemoveAll();
HandleIInInfo();
setSendCrc();
SendRespons();
m_paSOE.RemoveAll();
return true;
}
void CDnpExplain::setSendCrc()
{
unsigned short crcPositionPoint;
BYTE crc1,crc2;
unsigned char crcCheckNum,remainder;
// crcPositionPoint=(unsigned short *)(&m_baOutBuffer[8]);
// *crcPositionPoint=send_calc_crc(&m_baOutBuffer,8);//头校验
crcPositionPoint=send_calc_crc(0,8);//头校验
crc1=(BYTE)crcPositionPoint;
crc2=crcPositionPoint>>8;
m_baOutBuffer.InsertAt(8,crc1);
m_baOutBuffer.InsertAt(9,crc2);
crcCheckNum=(m_baOutBuffer[2]-5)/16;//校验次数---USER DATA长度除16
remainder=(m_baOutBuffer[2]-5)%16;//余数
for(int k=0;k<crcCheckNum;k++)
{
// crcPositionPoint=(unsigned short *)(&m_baOutBuffer[26+18*k]);
// *crcPositionPoint=send_calc_crc(m_baOutBuffer[10+18*k],16);//校验USER DATA
crcPositionPoint=send_calc_crc(10+18*k,16);//校验USER DATA
crc1=(BYTE)crcPositionPoint;
crc2=crcPositionPoint>>8;
m_baOutBuffer.InsertAt(26+18*k,crc1);
m_baOutBuffer.InsertAt(27+18*k,crc2);
}
if(remainder)
{
// crcPositionPoint=(unsigned short *)(&m_baOutBuffer[10+18k*+remainder]);
// *crcPositionPoint=send_calc_crc(m_baOutBuffer[10+18*k],remainder);//校验最后一段USER DATA
crcPositionPoint=send_calc_crc(10+18*k,remainder);//校验最后一段USER DATA
crc1=(BYTE)crcPositionPoint;
crc2=crcPositionPoint>>8;
m_baOutBuffer.InsertAt(10+18*k+remainder,crc1);
m_baOutBuffer.InsertAt(11+18*k+remainder,crc2);
}
return;
}
unsigned short CDnpExplain::send_calc_crc(int index, unsigned short len)
{
unsigned short crc = 0;
// while (len--)
// crc = dnp_crc16(crc, (unsigned int)*byte++);
while (len--)
{
crc=dnp_crc16(crc,(unsigned int)m_baOutBuffer[index]);
index++;
}
crc ^= 0xFFFF;
return crc;
}
unsigned short CDnpExplain::dnp_crc16(unsigned short crc, unsigned int text)
{
unsigned char index = (unsigned char )(text ^ crc);
crc = ((crc & ~0xff) >> 8) ^ (dnp_crc_table[index]);
return crc;
}
int CDnpExplain::SoePtrExplain(bool onOff, BYTE DigitalNo, SYSTEMTIME &soeTime)
{
if(m_paSOE.GetSize()==0)
return 0;
return 0;
}
void CDnpExplain::DumpSoeRecord()
{
int j=m_paSOE.GetSize();
while(m_paSOE.GetSize()>0)
{
delete (CSOERec*)m_paSOE.GetAt(0);
}
m_paSOE.RemoveAll();
}
BOOL CDnpExplain::OperateTimeOut(WORD timeOut, SYSTEMTIME &doneTime)
{
WORD tsubMillSecond;
if(doneTime.wSecond>=m_tSelectOperater.wSecond)
{
tsubMillSecond=doneTime.wSecond*1000+doneTime.wMilliseconds-m_tSelectOperater.wSecond*1000-m_tSelectOperater.wMilliseconds;
if(tsubMillSecond>3000)
return false;
return true;
}
else
{
tsubMillSecond=(doneTime.wSecond+60)*1000+doneTime.wMilliseconds-m_tSelectOperater.wSecond*1000-m_tSelectOperater.wMilliseconds;
if(tsubMillSecond>3000)
return false;
return true;
}
}
void CDnpExplain::BinaryInputChange(BYTE &index, BOOL onOff)
{
if(m_baDigital.GetSize()==0)
return;
CByteArray baTmp;
baTmp.Copy(m_baDigital);
BYTE baDigital=m_baDigital.GetAt(0);
if(onOff)//trip
{
baDigital&=0xfe;
m_baDigital.RemoveAt(0);
m_baDigital.Add(baDigital);
}
else//close
{
baDigital|=0x01;
m_baDigital.RemoveAt(0);
m_baDigital.Add(baDigital);
}
CheckStateChange(baTmp, m_baDigital);
}
void CDnpExplain::ResetLink()
{
m_baOutBuffer.RemoveAll();
m_baOutBuffer.Add(0x05);
m_baOutBuffer.Add(0x64);
m_baOutBuffer.Add(0x05);
m_baOutBuffer.Add(0x20);
m_baOutBuffer.Add(0xfe);
m_baOutBuffer.Add(0x00);
m_baOutBuffer.Add((BYTE)m_wAddr);
m_baOutBuffer.Add((BYTE)m_wAddr>>8);
setSendCrc();
SendRespons();
}
BOOL CDnpExplain::SendBinaryAndAnalogy(WORD &rtuaddress, WORD &priaddress)
{
if(m_waAnalog.GetSize()==0||m_baDigital.GetSize()==0)
{
return false;
}
BYTE DigitalCount=m_baDigital.GetSize();
BYTE AnalogyCount=m_waAnalog.GetSize();
BYTE rtuaddr1,rtuaddr2,priaddr1,priaddr2;
BYTE data1,data2;
priaddr1=(BYTE)priaddress;
priaddr2=priaddress>>8;
rtuaddr1=(BYTE)rtuaddress;
rtuaddr2=rtuaddress>>8;
BYTE Length=10+5*2+DigitalCount+AnalogyCount*2;
m_baOutBuffer.RemoveAll();
m_baOutBuffer.Add(0x05);
m_baOutBuffer.Add(0x64);
m_baOutBuffer.Add(Length);//Length
m_baOutBuffer.Add(0x44);
m_baOutBuffer.Add(priaddr1);
m_baOutBuffer.Add(priaddr2);
m_baOutBuffer.Add(rtuaddr1);
m_baOutBuffer.Add(rtuaddr2);
//////////////////////////////2Byte CRC reserved
/////////////////////////////
m_baOutBuffer.Add(0xcf);
m_baOutBuffer.Add(0xc7);
m_baOutBuffer.Add(0x81);
///IIN
m_baOutBuffer.Add(0x01);//binary input
m_baOutBuffer.Add(0x01);
m_baOutBuffer.Add(0x00);
m_baOutBuffer.Add(0x00);//number
m_baOutBuffer.Add(DigitalCount*8-1);//number
for(int i=0;i<DigitalCount;i++)
{
m_baOutBuffer.Add(m_baDigital[i]);
}
////////////////////////////////////
m_baOutBuffer.Add(0x1e);//object
m_baOutBuffer.Add(0x04);
m_baOutBuffer.Add(0x00);
m_baOutBuffer.Add(0x00);//Number
m_baOutBuffer.Add(AnalogyCount-1);//Number
for(int ii=0;ii<AnalogyCount;ii++)
{
data1=(BYTE)m_waAnalog[ii];
data2=m_waAnalog[ii]>>8;
m_baOutBuffer.Add(data1);
m_baOutBuffer.Add(data2);
}
HandleIInInfo();
setSendCrc();
SendRespons();
return true;
}
BOOL CDnpExplain::SendBinaryAndCount(WORD &rtuaddress, WORD &priaddress)
{
if(m_dwaCount.GetSize()==0||m_baDigital.GetSize()==0)
{
return false;
}
BYTE DigitalCount=m_baDigital.GetSize();
BYTE CountNumber=m_dwaCount.GetSize();
BYTE rtuaddr1,rtuaddr2,priaddr1,priaddr2;
BYTE data1,data2,data3,data4;
priaddr1=(BYTE)priaddress;
priaddr2=priaddress>>8;
rtuaddr1=(BYTE)rtuaddress;
rtuaddr2=rtuaddress>>8;
BYTE Length=10+5*2+DigitalCount+CountNumber*4;
m_baOutBuffer.RemoveAll();
m_baOutBuffer.Add(0x05);
m_baOutBuffer.Add(0x64);
m_baOutBuffer.Add(Length);//Length
m_baOutBuffer.Add(0x44);
m_baOutBuffer.Add(priaddr1);
m_baOutBuffer.Add(priaddr2);
m_baOutBuffer.Add(rtuaddr1);
m_baOutBuffer.Add(rtuaddr2);
//////////////////////////////2Byte CRC reserved
/////////////////////////////
m_baOutBuffer.Add(0xcf);
m_baOutBuffer.Add(0xc7);
m_baOutBuffer.Add(0x81);
///IIN
m_baOutBuffer.Add(0x01);//binary input
m_baOutBuffer.Add(0x01);
m_baOutBuffer.Add(0x00);
m_baOutBuffer.Add(0x00);//number
m_baOutBuffer.Add(DigitalCount*8-1);//number
for(int i=0;i<DigitalCount;i++)
{
m_baOutBuffer.Add(m_baDigital[i]);
}
////////////////////////////////////
m_baOutBuffer.Add(0x14);//object count
m_baOutBuffer.Add(0x06);
m_baOutBuffer.Add(0x00);
m_baOutBuffer.Add(0x00);//Number
m_baOutBuffer.Add(CountNumber-1);//Number
for(int iii=0;iii<m_dwaCount.GetSize();iii++)
{
DWORD dwTemp=m_dwaCount[iii];
data1=(BYTE)m_dwaCount[iii];
m_dwaCount[iii]>>=8;
data2=(BYTE)m_dwaCount[iii];
m_dwaCount[iii]>>=8;
data3=(BYTE)m_dwaCount[iii];
m_dwaCount[iii]>>=8;
data4=(BYTE)m_dwaCount[iii];
m_baOutBuffer.Add(data1);
m_baOutBuffer.Add(data2);
m_baOutBuffer.Add(data3);
m_baOutBuffer.Add(data4);
}
HandleIInInfo();
setSendCrc();
SendRespons();
return true;
}
BOOL CDnpExplain::SendAnalogyAndCount(WORD &rtuaddress, WORD &priaddress)
{
if(m_dwaCount.GetSize()==0||m_waAnalog.GetSize()==0)
{
return false;
}
BYTE AnalogyCount=m_waAnalog.GetSize();
BYTE CountNumber=m_dwaCount.GetSize();
BYTE rtuaddr1,rtuaddr2,priaddr1,priaddr2;
BYTE data1,data2,data3,data4;
priaddr1=(BYTE)priaddress;
priaddr2=priaddress>>8;
rtuaddr1=(BYTE)rtuaddress;
rtuaddr2=rtuaddress>>8;
BYTE Length=10+5*2+AnalogyCount*2+CountNumber*4;
m_baOutBuffer.RemoveAll();
m_baOutBuffer.Add(0x05);
m_baOutBuffer.Add(0x64);
m_baOutBuffer.Add(Length);//Length
m_baOutBuffer.Add(0x44);
m_baOutBuffer.Add(priaddr1);
m_baOutBuffer.Add(priaddr2);
m_baOutBuffer.Add(rtuaddr1);
m_baOutBuffer.Add(rtuaddr2);
//////////////////////////////2Byte CRC reserved
/////////////////////////////
m_baOutBuffer.Add(0xcf);
m_baOutBuffer.Add(0xc7);
m_baOutBuffer.Add(0x81);
// IIN
///////////////////////////////////////////////object
m_baOutBuffer.Add(0x1e);//object analogy
m_baOutBuffer.Add(0x04);
m_baOutBuffer.Add(0x00);
m_baOutBuffer.Add(0x00);//Number
m_baOutBuffer.Add(AnalogyCount-1);//Number
for(int ii=0;ii<AnalogyCount;ii++)
{
data1=(BYTE)m_waAnalog[ii];
data2=m_waAnalog[ii]>>8;
m_baOutBuffer.Add(data1);
m_baOutBuffer.Add(data2);
}
/////////////////////////////////////
m_baOutBuffer.Add(0x14);//object
m_baOutBuffer.Add(0x06);
m_baOutBuffer.Add(0x00);
m_baOutBuffer.Add(0x00);//Number
m_baOutBuffer.Add(CountNumber-1);//Number
for(int iii=0;iii<m_dwaCount.GetSize();iii++)
{
DWORD dwTemp=m_dwaCount[iii];
data1=(BYTE)m_dwaCount[iii];
m_dwaCount[iii]>>=8;
data2=(BYTE)m_dwaCount[iii];
m_dwaCount[iii]>>=8;
data3=(BYTE)m_dwaCount[iii];
m_dwaCount[iii]>>=8;
data4=(BYTE)m_dwaCount[iii];
m_baOutBuffer.Add(data1);
m_baOutBuffer.Add(data2);
m_baOutBuffer.Add(data3);
m_baOutBuffer.Add(data4);
}
HandleIInInfo();
setSendCrc();
SendRespons();
return true;
}
void CDnpExplain::HandleIInInfo()
{
BYTE iin1=0x80,iin2=0x00;
if(m_soeState)
{
iin1|=0x04;
}//IIN 2Byte
if(m_faultState)
{
iin1|=0x08;
}
if (m_timeAnch)
{
iin1|=0x10;
}
m_baOutBuffer.InsertAt(11,iin1);
m_baOutBuffer.InsertAt(12,iin2);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -