📄 cdt.cpp
字号:
/******************************************************************
* Copyright (c) 2004-2005, 许继日立公司
* All rights reserved.
*
* 文件名称:cdt.cpp
* 文件标识:
* 摘 要:CDT规约类。主要有部颁CDT规约的应用层解析。
*
* 当前版本:1.0
* 作 者:李龙伟 <lilongwei1@hotmail.com>
* 完成日期:2004年11月03日
*
* 取代版本:1.0
* 原作者 :李龙伟
* 完成日期:2004年11月24日
******************************************************************/
#include <windows.h>
#include "stdio.h"
#include "ext.h"
#include "cdt.h"
#include "ntdef.h"
#include "gatetime.h"
/*====================================================================================
*
* Subroutine : CCDT()
*
* Parameters :
*
*
* Called from :
*
* Description : CCDT类构造函数
*
* Return :
*
* Modification:
* 2004-09-24:
*
*====================================================================================*/
CCDT::CCDT(BYTE no, short rlen, short slen) : BaseRule(no,rlen,slen)
{
memcpy(m_bBchTable, G_bBchTable, 256);
m_bHeadEB = 0;
m_bHead90 = 0;
m_bSerial = 0; //解包数据序号
m_bSyncFlag = FIND_HEAD; //同步字类型
m_nCtrlNumber = 0; //遥控号,初始成0好像有问题??
m_bCtrlType = 0; //控分控合
m_bControl = 0; //控制字节
m_bFrameType = 0; //帧类别
m_bInfoNumber = 0; //信息字数
memset(&m_bInfoBuf, 0, sizeof(m_bInfoBuf)); //解包数据信息
for (int i=0; i<6; i+=2)
{
m_bSendBuf[i] = 0xeb;
m_bSendBuf[i+1] = 0x90;
}
}
/*====================================================================================
*
* Subroutine : ~CCDT()
*
* Parameters :
*
*
* Called from :
*
* Description : CCDT类析构函数
*
* Return :
*
* Modification:
* 2004-09-24:
*
*====================================================================================*/
CCDT::~CCDT()
{
}
/*====================================================================================
*
* Subroutine : RuleLoop()
*
* Parameters :
*
*
* Called from : Rule_Data()
*
* Description : 串口数据大循环函数
*
* Return :
*
* Modification:
* 2004-09-24:
*
*====================================================================================*/
void CCDT::RuleLoop(void)
{
int nResult = 0; //返回值变量
int i = 0; //一般变量]
unsigned long i_start; //收到报文判断开始
unsigned long i_end; //结束时间
int tstop = 30;//??????
i_start = GetTickCount(); //初始化
i_end = GetTickCount(); //初始化
g_glonet.InsDevStatus(GATE_UNCLOSE);
//??测试使用
m_begin = GetTickCount();
while (1)
{
if (g_bSysStop)
{
break;
}
//??测试使用
TimeTest();
if (BaseConnect(CHANNEL_RS232) == 0)
{
Sleep(10);//函数最小分辨率为10
continue;
}
while (1)
{
Sleep(10);
// PackData();
// BaseSend();
nResult = BaseRead(1, 0, CHANNEL_SOCK);// RS232Read(300);
if (nResult>0)
{
i_start = GetTickCount();
g_glonet.InsDevStatus(GATE_CLOSE);
for (i=0; i<nResult; i++)
{
PreUnpackData(m_bRevBuf[i]);
}
}
else
{
i_end = GetTickCount();
if ((i_end-i_start)/1000>tstop)
{
g_glonet.InsDevStatus(GATE_UNCLOSE);
break;
}
}
}
}
return;
}
/*====================================================================================
*
* Subroutine : PreUnpackData()
*
* Parameters : bRead 读取的数值
*
*
* Called from : RuleLoop()
*
* Description : 处理收到的数据,防止有接收的数据分两次传送的情况
*
* Return :
*
* Modification:
* 2004-11-20:
*
*====================================================================================*/
void CCDT::PreUnpackData(BYTE bRead)
{
if (bRead == m_bHeadEB)
{
m_bHeadEB++;
}
else if ((bRead == 0x90) && (m_bHeadEB > 0) )
{
m_bHead90++;
}
else
{
m_bHeadEB = 0;
m_bHead90 = 0;
}
if ( (m_bHeadEB == 3) && (m_bHead90 == 3) )
{
m_bHeadEB = 0;
m_bHead90 = 0;
m_bSerial = 0;
m_bSyncFlag = SYN_HEAD;
return;
}
if (m_bSyncFlag == SYN_HEAD)
{
m_bInfoBuf[m_bSerial] = bRead;
m_bSerial ++;
if (m_bSerial >= 6)
{
m_bSerial = 0;
if ( CheckRevCode() )
{
m_bInfoNumber = m_bInfoBuf[2];
m_bControl = ((m_bInfoBuf[0]&0x80) != 0) ? 1:0;
m_bFrameType = m_bInfoBuf[1];
if ((m_bInfoNumber > 0) && (m_bInfoBuf[1] != 0xf9) )
{
m_bSyncFlag = PACK_DATA;
}
else
{
m_bSyncFlag = FIND_HEAD;
}
}
else
{
m_bSyncFlag = FIND_HEAD;
}
return;
}
}
if (m_bSyncFlag == PACK_DATA)
{
m_bInfoBuf[m_bSerial] = bRead;
m_bSerial++;
if (m_bSerial >= 6)
{
m_bSerial = 0;
if (CheckRevCode())
{
UnpackData();
}
else
{ //error rate
m_bSyncFlag = FIND_HEAD;
}
if( m_bInfoNumber > 0)
{
m_bInfoNumber--;
}
if( m_bInfoNumber == 0 )
{
m_bSyncFlag = FIND_HEAD;
}
}
}
}
/*====================================================================================
*
* Subroutine : CheckRevCode()
*
* Parameters :
*
*
* Called from : PreUnpackData()
*
* Description : 判断校验码
*
* Return : true 校验码正确
* false校验码错误
* Modification:
* 2004-11-20:
*
*====================================================================================*/
bool CCDT::CheckRevCode()
{
bool bResult = false; //返回值
unsigned char temp = 0x00; //临时变量
for (int i=0; i<5; i++)
{
temp = temp ^ m_bInfoBuf[i];
temp = m_bBchTable[temp];
}
temp = temp ^ 0xff;
if (temp == m_bInfoBuf[5])
{
bResult = true;
}
return bResult;
}
/*====================================================================================
*
* Subroutine : CheckSendCode()
*
* Parameters :
*
*
* Called from : PackData()
*
* Description : 计算校验码
*
* Return :
*
* Modification:
* 2004-12-25:
*
*====================================================================================*/
void CCDT::CheckSendCode(int no)
{
unsigned char temp = 0x00; //临时变量
for (int i=0; i<5; i++)
{
temp = temp ^ m_bSendBuf[no+i];
temp = m_bBchTable[temp];
}
temp = temp ^ 0xff;
m_bSendBuf[no+5] = temp;
}
/*====================================================================================
*
* Subroutine : UnpackData()
*
* Parameters :
*
*
* Called from : PreUnpackData()
*
* Description : 解包,整理数据
*
* Return :
*
* Modification:
* 2004-11-20:
*
*====================================================================================*/
void CCDT::UnpackData(void)
{
int nOrder = 0; //序号
short nValue = 0; //数值
// BYTE cstatus;
// short pyx;
// char szStr[20];
enum FUNC_TYPE eFuncType = FUNC_NONE; //功能码类型
GetFunType(eFuncType);
// if( eFuncType != m_ePreFuncType && m_ePreFuncType == BAOHU_KIND )
// {//notify
// Fill_BaoHuNotify();
// m_ePreFuncType = eFuncType;
// }
if( eFuncType != m_ePreFuncType && m_ePreFuncType == FUNC_YK_UP )
{
// CTRL_Proc(VARTYPE_YX,0,0,1);
}
if( eFuncType != m_ePreFuncType && m_ePreFuncType == FUNC_YT_UP )
{
// CTRL_Proc(VARTYPE_YT,0,0,1);
}
m_ePreFuncType = eFuncType;
switch(eFuncType)
{
case FUNC_YC: //遥测
PutYC();
break;
case FUNC_YX: //遥信
PutYX();
break;
case FUNC_DD://电能脉冲计数值
PutDD();
break;
case FUNC_SOE://事件顺序纪录
PutSOE();
break;
case FUNC_YK_UP://遥控返校
PutYK(INFDATA_YK_SEL);
break;
case FUNC_YT_UP://升降返校
// if( m_bInfoBuf[1] == 0x33) CTRL_Proc(VARTYPE_YT,0,m_bInfoBuf[2],0);
// else CTRL_Proc(VARTYPE_YT,1,m_bInfoBuf[2],0);
break;
case FUNC_HZ://频率
PutHZ();
break;
case FUNC_YC_ADD://总加遥测
break;
case FUNC_WHITE://水位
// lValue = HexToBCD(m_bInfoBuf[1]) + HexToBCD(m_bInfoBuf[2])*100+HexToBCD(m_bInfoBuf[3])*10000;
break;
// case BAOHU_KIND:
// lValue = ((m_bInfoBuf[4]*256+m_bInfoBuf[3])*256+m_bInfoBuf[2])*256+m_bInfoBuf[1];
// PutBHDZValue(m_bInfoBuf[0],lValue);
break;
default:
break;
}
return;
}
/*====================================================================================
*
* Subroutine : GetFunType()
*
* Parameters :
*
*
* Called from : UnpackData()
*
* Description : 区分功能码代号
*
* Return : 是否得到功能码代号(0 没有得到,!0得到)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -