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

📄 protocalbase.cpp

📁 电力和自动化通讯规约模拟软件
💻 CPP
字号:
// ProtocalBase.cpp: implementation of the CProtocalBase class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "RTUSim.h"
#include "ProtocalBase.h"

#include "MSComm.h"
#include "RTUSimDlg.h"
#include "SOERec.h"
#include "FaultRec.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CProtocalBase::CProtocalBase(void * pMainDlg)
{
	m_pmsComm = NULL;
	m_pMainDlg = (CRTUSimDlg *)pMainDlg;
}

CProtocalBase::~CProtocalBase()
{

}

/*****************************************************************
** Explan:

** 输 入: 无

** 输 出: 无

** 功能描述:
			//规约解释
			//解释完毕不要忘记删除已经解释的命令
			//响应可以放置到m_baOutBuffer中
			//调用SendRespons进行数据的发送
			//大家在写自己的Explan时,只需要将命令解释完毕后把响应放到输出缓冲区内,然后调用基类的Explan
			//如果存在无法解释的命令,需要将无效命令数据删除,不要进行基类Explan的调用

** 全局变量:

** 调用模块:	SendRespons

** 作 者:	李佰国

** 日 期:	2003.05.07

** 修 改:

** 日 期:

** 版本:	0.1
****************************************************************/
void CProtocalBase::Explain()
{
	SendRespons();
}

/*****************************************************************
** ReciveData:

** 输 入: 
	CByteArray &baData:新接收到的命令数据

** 输 出: 无

** 功能描述:
			将命令缓存到命令缓冲区,调用Explan进行解释

** 全局变量:

** 调用模块:	Explan

** 作 者:	李佰国

** 日 期:	2003.05.07

** 修 改:

** 日 期:

** 版本:	0.1
****************************************************************/
void CProtocalBase::ReciveData(CByteArray &baData)
{
	for(int i = 0; i < baData.GetSize(); i++)
	{
		m_baInBuffer.Add(baData[i]);
	}

	CByteArray baTmp;
	baTmp.Copy(m_baDigital);
	Explain();
	CheckStateChange(baTmp, m_baDigital);
}

/*****************************************************************
** SendRespons:

** 输 入: 无

** 输 出: 无

** 功能描述:
			将输出缓冲区的内容发送

** 全局变量:

** 调用模块:无

** 作 者:	李佰国

** 日 期:	2003.05.07

** 修 改:

** 日 期:

** 版本:	0.1
****************************************************************/
void CProtocalBase::SendRespons()
{
	COleVariant vData;
	vData = m_baOutBuffer;
	if(IsWindow(*m_pMainDlg))
	{
		m_pMainDlg->DisplayData(false, m_baOutBuffer);
	}

	if(m_pmsComm != NULL)
	{
		if(m_pmsComm->GetPortOpen())
		{
			m_pmsComm->SetOutput(vData);
			m_baOutBuffer.RemoveAll();
		}
	}
}

/*****************************************************************
** SetComm:

** 输 入: 
		CMSComm *pmsComm:规约需要使用的串口指针

** 输 出: 无

** 功能描述:
			设置规约需要使用的串口指针

** 全局变量:

** 调用模块:无

** 作 者:	李佰国

** 日 期:	2003.05.07

** 修 改:

** 日 期:

** 版本:	0.1
****************************************************************/
void CProtocalBase::SetComm(CMSComm *pmsComm)
{
	if(pmsComm != NULL)
	{
		if(pmsComm->GetPortOpen())
		{
			m_pmsComm = pmsComm;
		}
	}
}

void CProtocalBase::CheckStateChange(CByteArray & baOld, CByteArray & baNow)
{
	if(baOld.GetSize() == baNow.GetSize())
	{
		for(int i = 0; i< baOld.GetSize(); i++)
		{
			if(baNow[i] != baOld[i])
			{
				BYTE bMask = 1;
				for(int j = 0; j < 8; j++)
				{
					if((baOld[i] & (bMask << j)) != (baNow[i] & (bMask << j)))
					{
						CSOERec * pSOE = new CSOERec;

						pSOE->m_uDigitalNO = i * 8 + j;
						pSOE->m_bOpened = (baOld[i] & (j * 2 + 1));
						GetSystemTime(&pSOE->m_stTime);
						m_paSOE.Add(pSOE);
						if(m_pMainDlg != NULL)
						{
							m_pMainDlg->ChangeState();
						}
					}
				}
			}
		}
	}
}

void CProtocalBase::SetMainWnd(void *pMainDlg)
{
	m_pMainDlg = (CRTUSimDlg *)pMainDlg;
	SetComm(&m_pMainDlg->m_msComm);
}


void CProtocalBase::DoAFault()
{
	return;

}

void CProtocalBase::DoBFault()
{
	return;

}

void CProtocalBase::DoCFault()
{
	return;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -