⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cdt.cpp

📁 此程序适用于电力系统中的网关程序
💻 CPP
📖 第 1 页 / 共 3 页
字号:
/******************************************************************
* 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 + -