📄 cdt.cpp
字号:
*
* Modification:
* 2004-11-28:
*
*====================================================================================*/
int CCDT::GetFunType(enum FUNC_TYPE &eFunc)
{
unsigned char bFunc; //功能码
bool bResult = 1; //返回值
bFunc = m_bInfoBuf[0];
if (m_bControl==0)
{
if (bFunc >= 0x00 && bFunc < 0x80 )
{
eFunc = FUNC_YC; //遥测
}
else if (bFunc == 0x8a)
{
eFunc = FUNC_HZ; //频率
}
else if ((bFunc >=0x8d) && (bFunc<0x93))
{
eFunc = FUNC_WHITE; //水位
}
else if ((bFunc >= 0x86) && (bFunc <= 0x89))
{
eFunc = FUNC_YC_ADD; //总加遥测
}
else if ((bFunc >= 0xf0) && (bFunc <= 0xff))
{
eFunc = FUNC_YX; //遥信
}
else if (bFunc == 0xe1)
{
eFunc = FUNC_YK_UP; //遥控返校
}
else if (bFunc == 0xe5)
{
eFunc = FUNC_YT_UP; //升降返校
}
else if ((bFunc >= 0xa0) && (bFunc < 0xe0))
{
eFunc = FUNC_DD; //电能脉冲,D2帧
}
else if ((bFunc == 0x80) || (bFunc==0x81))
{
eFunc = FUNC_SOE; //事件顺序纪录
}
else
{
bResult = 0;
}
}
else
{
// if ((m_bFrameType == 0x3d) && ((eFunc>=0x00) && (eFunc< 0x40)))
// {
// eFunc = BAOHU_KIND;
// }
// else if ((m_bFrameType == 0x3d) && (eFunc ==0x96))
// {//notify
// if(m_bInfoBuf[1] ==0xa5) Fill_BaohuValueEvt(0,0,PortNo); //ok
// else Fill_BaohuValueEvt(0,1,PortNo); //fail
// return;
// }
// else return;
bResult = 0;
}
return bResult;
}
/*====================================================================================
*
* Subroutine : PutYC()
*
* Parameters :
*
*
* Called from : UnpackData()
*
* Description : 存储遥测数值,按照60870系列格式。
*
* Return :
*
* Modification:
* 2004-11-28:
*
*====================================================================================*/
void CCDT::PutYC(void)
{
unsigned short nOrder = 0; //序号
unsigned short nValue = 0; //数值
unsigned short nData = 0; //上送数据
DATAGROUP DataGroup; //存储数据结构体
memset(&DataGroup, 0x00, sizeof(DATAGROUP));
nOrder = m_bInfoBuf[0] * 2;
for (int i=0; i<2; i++)
{
nValue = m_bInfoBuf[i*2+1] + (m_bInfoBuf[i*2+2] & 0x07) * 0x100;
DataGroup.bLocal = 0;
DataGroup.eType = DATA_YC;
// DataGroup.nAddress = m_nAddr;
DataGroup.nPortNo = m_nPortNo;
DataGroup.nSerial = nOrder +i;
nData = (nValue & 0x07ff) >> 3;
//负数
if (m_bInfoBuf[i*2+2] & 0x08)
{
nData = nData | 0x80;
}
if (m_bInfoBuf[i*2+2] & 0x80)
{
nData = nData | 0x02; //无效
}
else if (m_bInfoBuf[i*2+2] & 0x40)
{
nData = nData | 0x01; //溢出
}
DataGroup.nValue = nData;
g_devdata.InsDevData(&DataGroup, 1);
}
return;
}
/*====================================================================================
*
* Subroutine : PutYX()
*
* Parameters :
*
*
* Called from : UnpackData()
*
* Description : 存储遥信值,如果与内存中的不一致就认为是遥信变位。
*
* Return :
*
* Modification:
* 2004-11-28:
*
*====================================================================================*/
void CCDT::PutYX(void)
{
int nOrder = 0; //序号
unsigned short nValue = 0; //数值
int nNumber = 0; //存储序号
int i = 0; //一般变量
int j = 0; //一般变量
SYSTEMTIME systime; //时间结构体
DATAGROUP DataGroup; //存储数据结构体
SOE_STATUS SoeStatus; //事件结构体
memset(&SoeStatus, 0, sizeof(SOE_STATUS));
memset(&DataGroup, 0x00, sizeof(DATAGROUP));
GetLocalTime(&systime);
nOrder = (m_bInfoBuf[0] - 0xf0) * 32;
for (i=0; i<4; i++)
{
unsigned char m = 0;
for (j=0; j<8; j++)
{
nNumber = nOrder + i*8 + j;
m = 1 << j;
if ((m_bInfoBuf[i+1] & m)== 0x00 )
{
nValue = 1;//换算成双点
}
else
{
nValue = 2;
}
g_devdata.GetFixDevData(m_nPortNo, nNumber, DATA_YX, DataGroup);
if (DataGroup.nValue != nValue)
{
if (m_nCtrlNumber = nNumber)
{
PutYK(INFDATA_YK_EXE, false); //遥控执行成功
}
SoeStatus.bAddress = 0x01; //固定值??
SoeStatus.nPot = nNumber;
SoeStatus.bStatus = nValue;
SoeStatus.wMilliseconds = systime.wMilliseconds + (systime.wSecond & 0xff) * 1000;
// SoeStatus.bSecond = systime.wMilliseconds / 1000;
SoeStatus.bMinute = systime.wMinute & 0x3f;
SoeStatus.bHour = systime.wHour & 0x1f;
SoeStatus.bDay = systime.wDay & 0x3f;
SoeStatus.eType = INFDATA_YX;
SoeStatus.eStation = GATE_REMOTESTATION; //远动站
g_soedata.InsSoeData(SoeStatus);
SoeStatus.eStation = GATE_OPERATERSTATION; //操作员站
g_soedata.InsSoeData(SoeStatus);
SoeStatus.eStation = GATE_ENGINEERSTATION; //工程师站
g_soedata.InsSoeData(SoeStatus);
g_devdata.InsDevData(&DataGroup, 1);
}
}
}
return;
}
/*====================================================================================
*
* Subroutine : PutSOE()
*
* Parameters :
*
*
* Called from : UnpackData()
*
* Description : 存储事件进队列。
*
* Return :
*
* Modification:
* 2004-11-28:
*
*====================================================================================*/
void CCDT::PutSOE(void)
{
SOE_STATUS SoeStatus; //事件结构体
memset(&SoeStatus, 0, sizeof(SOE_STATUS));
if(m_bInfoBuf[0]==0x80)
{
m_bSoe80 = 0x80;
memcpy(&m_bSoeBuf[0],&m_bInfoBuf[0],6);
}
if(m_bInfoBuf[0]==0x81 && m_bSoe80 == 0x80)
{
m_bSoe80 = 0x00;
memcpy(&m_bSoeBuf[6],&m_bInfoBuf[0],6);
SoeStatus.bAddress = 0x01; //固定值??
SoeStatus.nPot = m_bSoeBuf[9] + (m_bSoeBuf[10] & 0x0f) * 256;
SoeStatus.bStatus = m_bSoeBuf[10] & 0x80;
SoeStatus.wMilliseconds = (m_bSoeBuf[2] & 0x03 ) * 256 + m_bSoeBuf[1]
+ (m_bSoeBuf[3] & 0x3f) * 1000;
// SoeStatus.bSecond = m_bSoeBuf[3];
SoeStatus.bMinute = m_bSoeBuf[4];
SoeStatus.bHour = m_bSoeBuf[7];
SoeStatus.bDay = m_bSoeBuf[8];
SoeStatus.eType = INFDATA_SOE;
// SoeStatus.wSerial = m_bSoeBuf[9] + (m_bSoeBuf[10] & 0x0f) * 0x100;
SoeStatus.eStation = GATE_REMOTESTATION; //远动站
g_soedata.InsSoeData(SoeStatus);
SoeStatus.eStation = GATE_OPERATERSTATION; //操作员站
g_soedata.InsSoeData(SoeStatus);
SoeStatus.eStation = GATE_ENGINEERSTATION; //工程师站
g_soedata.InsSoeData(SoeStatus);
}
return;
}
/*====================================================================================
*
* Subroutine : PutDD()
*
* Parameters :
*
*
* Called from : UnpackData()
*
* Description : 存储电度值。
*
* Return :
*
* Modification:
* 2004-11-28:
*
*====================================================================================*/
void CCDT::PutDD(void)
{
unsigned short nOrder = 0; //序号
DATAGROUP DataGroup; //存储数据结构体
memset(&DataGroup, 0x00, sizeof(DATAGROUP));
nOrder = m_bInfoBuf[0] - 0xa0;
DataGroup.bLocal = 0;
DataGroup.eType = DATA_DD;
// DataGroup.nAddress = m_nAddr;
DataGroup.nPortNo = m_nPortNo;
DataGroup.nSerial = nOrder;
DataGroup.nValue = (((m_bInfoBuf[4]&0x0f) * 256 + m_bInfoBuf[3]) * 256
+ m_bInfoBuf[2]) * 256 + m_bInfoBuf[1];
g_devdata.InsDevData(&DataGroup, 1);
return;
}
/*====================================================================================
*
* Subroutine : PutYK()
*
* Parameters :
* eType: 信息类型,区分遥控选择和执行
* bFailFlag: 缺省参数,遥控成功或失败标志,缺省为成功
*
* Called from : UnpackData()
*
* Description : 存储遥控返校信息。
*
* Return :
*
* Modification:
* 2004-12-28:
*
*====================================================================================*/
void CCDT::PutYK(enum INFO_TYPE eType, bool bFailFlag)
{
SYSTEMTIME systime; //时间结构体
SOE_STATUS SoeStatus; //事件结构体
memset(&SoeStatus, 0, sizeof(SOE_STATUS));
GetLocalTime(&systime);
SoeStatus.bAddress = 0x01; //固定值??
// SoeStatus.nPot = m_bInfoBuf[2];
if (eType == INFDATA_YK_EXE)
{
SoeStatus.nPot = m_nCtrlNumber;
if (bFailFlag)
{
SoeStatus.bStatus = 0;
}
else
{
SoeStatus.bStatus = m_bCtrlType;
}
}
else if (eType == INFDATA_YK_SEL)
{
if (bFailFlag) //遥控失败
{
SoeStatus.nPot = m_nCtrlNumber;
SoeStatus.bStatus = 0x00;
}
else
{
SoeStatus.nPot = m_bInfoBuf[2];
if (m_bInfoBuf[1] == 0x33)
{
SoeStatus.bStatus = 1;
}
else if (m_bInfoBuf[1] == 0xcc)
{
SoeStatus.bStatus = 2;
}
else
{
SoeStatus.bStatus = 0;
}
}
}
SoeStatus.wMilliseconds = systime.wMilliseconds + (systime.wSecond & 0xff) * 1000;
SoeStatus.bMinute = systime.wMinute & 0x3f;
SoeStatus.bHour = systime.wHour & 0x1f;
SoeStatus.bDay = systime.wDay & 0x3f;
SoeStatus.eType = eType;
SoeStatus.eStation = GATE_REMOTESTATION; //远动站
g_soedata.InsSoeData(SoeStatus);
SoeStatus.eStation = GATE_OPERATERSTATION; //操作员站
g_soedata.InsSoeData(SoeStatus);
SoeStatus.eStation = GATE_ENGINEERSTATION; //工程师站
g_soedata.InsSoeData(SoeStatus);
m_nCtrlNumber = 0;
m_bCtrlType = 0;
return;
}
/*====================================================================================
*
* Subroutine : PutHZ()
*
* Parameters :
*
*
* Called from : UnpackData()
*
* Description : 存储频率值。
*
* Return :
*
* Modification:
* 2004-12-28:
*
*====================================================================================*/
void CCDT::PutHZ(void)
{
unsigned short nOrder = 0; //序号
int val1 = 0; //数值1
int val2 = 0; //数值2
DATAGROUP DataGroup; //存储数据结构体
memset(&DataGroup, 0x00, sizeof(DATAGROUP));
nOrder = m_bInfoBuf[0] - 0x8a;
DataGroup.bLocal = 0;
DataGroup.eType = DATA_HZ;
// DataGroup.nAddress = m_nAddr;
DataGroup.nPortNo = m_nPortNo;
DataGroup.nSerial = nOrder;
val1 = HexToBCD(m_bInfoBuf[1]);
val2 = HexToBCD(m_bInfoBuf[2]);
if ((val1>=0) && (val2>=0))
{
DataGroup.nValue = val1 + val2 * 100;
g_devdata.InsDevData(&DataGroup, 1);
}
return;
}
/*====================================================================================
*
* Subroutine : PackData()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -