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

📄 swa2000.cpp

📁 国家环保总局污染源在线通讯协议的简化版
💻 CPP
字号:
/// SWA2000.cpp
///	驱动程序接口函数主代码
///	无属性页设备驱动模版
#include "stdafx.h"	
#include "ownerarchive.h"
#include "DevDef.h"
#include "DevBas.h"
#include "mcgsrun.h"
#include "mcgsset.h"

IMcgsset g_mcgsset;
IDataCentre g_datacentre;

///	函数功能:	设置设备属性列表
///	函数返回:	TRUE,固定
///	参数意义:	data			MCGS传过来的MCGS_DATA结构的指针
///				strPropertyName 设备属性的名称的数组
///				strPropertyValue 
///								设备属性的当前值的数组
///				bPropertyHasValueArray 
///								指定设备属性是否具有取值列表的数组,
///								true 表示有,false 表示没有。如果具有取值列表则可以获取取值列表
///								调用时,三个数组大小都为0,返回时,三个数组大小必须一致
///	备	  注:	
MCGS_DLL_FUNC  SvrGetProperty(MCGS_DATA& data,
							  CStringArray& strPropertyName,
							  CStringArray& strPropertyValue,
							  CArray<bool,bool>& bPropertyHasValueArray)
{
	/// 从DEV_DATA中获取属性,对有取值列表的属性,必须把bPropertyHasValueArray中的对应位设置为true;
	CDevBas devBas;
	devBas.mfCheckDevDataInit(data);
	strPropertyName.SetSize(DEV_DWORD_PROPERTYNUM);
	strPropertyValue.SetSize(DEV_DWORD_PROPERTYNUM);
	bPropertyHasValueArray.SetSize(DEV_DWORD_PROPERTYNUM);
	
	int nListIndex = 0;
	for (int i = 0; i < DEV_DWORD_PROPERTYNUM; i ++)
	{
		strPropertyName[i] = DEV_STR_PROPERTYNAME[i];
		if (DEV_DWORD_PROPERTYLISTNUM[i] == 0)
		{
			bPropertyHasValueArray[i] = false;
			strPropertyValue[i].Format(_T("%d"), 
				((DEV_DATA*)data.m_pDevData)->nArProperty[i]);
		}
		else
		{
			bPropertyHasValueArray[i] = true;			
			strPropertyValue[i].Format(_T("%s"), 
				DEV_STR_PROPERTLIST[nListIndex
				+ ((DEV_DATA*)data.m_pDevData)->nArProperty[i]]);			
			nListIndex += DEV_DWORD_PROPERTYLISTNUM[i];
		}
	}
	return TRUE;
}

///	函数功能:	设置设备属性列表的下拉框内容
///	函数返回:	TRUE,固定
///	参数意义:	data			MCGS传过来的MCGS_DATA结构的指针
///				strPropertyName 设备属性的名称
///				strPropertyValue设备属性的值的数组,在这个数组中返回设备属性列表的下拉框内容		
///				
///	备	  注:
MCGS_DLL_FUNC SvrEnumPropertyValue(MCGS_DATA& data,
								   CString& strPropertyName,
								   CStringArray& strPropertyValue)
{
	CDevBas devBas;
	devBas.mfCheckDevDataInit(data);
	int nListIndex = 0;
	///	首先循环所有属性,判断是否当前需要设置的属性
	for (int i = 0; i < DEV_DWORD_PROPERTYNUM; i ++)
	{
		if (strPropertyName.CompareNoCase(DEV_STR_PROPERTYNAME[i]) == 0
			&& DEV_DWORD_PROPERTYLISTNUM[i] > 0)
		{
			///	找到当前需要设置的属性后,把静态数组里相应位置的内容填充到数组去
			for (DWORD j = 0; j < DEV_DWORD_PROPERTYLISTNUM[i]; j ++)
			{
				strPropertyValue.Add(DEV_STR_PROPERTLIST[nListIndex + j]);
			}			
		}
		nListIndex += DEV_DWORD_PROPERTYLISTNUM[i];		
	}
	
	return TRUE;
}

///	函数功能:	获取设备属性列表的属性内容,把值写到 data 中去
///	函数返回:	TRUE,固定
///	参数意义:	data			MCGS传过来的MCGS_DATA结构的指针
///				strPropertyName 设备属性的名称的数组		
///				strPropertyValue设备属性的值的数组	
///	备	  注:
MCGS_DLL_FUNC SvrSetProperty(MCGS_DATA& data,
							 CStringArray& strPropertyName,
							 CStringArray& strPropertyValue)
{
	/// 把属性值设置到DEV_DATA中.
	CDevBas devBas;
	devBas.mfCheckDevDataInit(data);
	
	int nListIndex = 0;
	for (int i = 0; i < DEV_DWORD_PROPERTYNUM; i ++)
	{
		if (strPropertyName[i].CompareNoCase(DEV_STR_PROPERTYNAME[i]) == 0)
		{
			///	判断当前属性是否具有下拉框
			if (DEV_DWORD_PROPERTYLISTNUM[i] == 0)
			{
				CString strTemp = strPropertyValue[i];
				if (strTemp.GetLength () > 0)
				{
					strTemp.TrimLeft();
					strTemp.TrimRight();
					strTemp.MakeUpper();
					int nPos = 0;
					int nTempValue = 0;
					///	判断输入的数值是10进制还是16进制
					if ((nPos = strTemp.Find(DEV_STR_PROPERTYHEAD0X)) >= 0)
					{
						strTemp = strTemp.Right(strTemp.GetLength() - nPos - 2);
						_stscanf(strTemp, _T("%X"), &nTempValue);
						((DEV_DATA*)data.m_pDevData)->nArProperty[i] = nTempValue;
					}
					else
					{
						_stscanf(strTemp, _T("%d"), &nTempValue);
						((DEV_DATA*)data.m_pDevData)->nArProperty[i] = nTempValue;
					}					
				}				
			}
			else
			{
				for (DWORD j = 0; j < DEV_DWORD_PROPERTYLISTNUM[i]; j ++)
				{
					if( strPropertyValue[i].CompareNoCase(
						DEV_STR_PROPERTLIST[nListIndex + j]) == 0 )
						((DEV_DATA*)data.m_pDevData)->nArProperty[i] = j;
				}
				nListIndex += DEV_DWORD_PROPERTYLISTNUM[i];				
			}			
		}		
	}
	
	devBas.mfSaveDevData(data);
	return TRUE;
}

///	函数功能:	弹出在线帮助
///	函数返回:	TRUE,固定
///	参数意义:	strFileName		帮助文件名
///				lngID			帮助ID号	
///	备	  注:
MCGS_DLL_FUNC SvrDoHelp(CString& strFileName, long& lngID)
{
	/// 把属性值设置到DEV_DATA中.
	strFileName = DEV_STR_HELPFILENAME;
	lngID = DEV_DWORD_HELPID;
	return TRUE;
}

///	函数功能:	获取各个通道的名字和类型
///	函数返回:	TRUE,固定
///	参数意义:	data			MCGS传过来的MCGS_DATA结构的指针
///				strChannelName	设备通道的名称的数组		
///				strPropertyValue设备通道的数据类型的数组
///	备	  注:
MCGS_DLL_FUNC SvrGetChannel(MCGS_DATA& data,
								 CStringArray& strChannelName,
								 INTARRAY& tyChannelType)
{
	CDevBas::mfCheckDevDataInit(data);

	strChannelName.SetSize (1);
	tyChannelType.SetSize(1);

	///	通道1:通讯状态标志
	strChannelName[0].Format(DEV_STR_COMMUNICATEFLAG, 0);
	tyChannelType[0] = VINTEGER;

	CDevBas::mfCreateChanel(data, strChannelName, tyChannelType);
	
	return TRUE;
}

///	函数功能:	编辑客户自定义属性, 调用DEV的内部属性页
///	函数返回:	TRUE,固定
///	参数意义:	data			MCGS传过来的MCGS_DATA结构的指针
///				bDefaultPeopertyDialog = false, 使用自定义属性对话框进行编辑
///				strName			设备名称
///				strComment		设备注释
///				DevCltTime		最小采集周期
///				DevChannelNum	通道数量
///				DevWorkFlag		初始工作状态
///				strChannelVarName 通道所连接的数据对象名数组
///				iChannelType	通道的数据类型
///	备	  注:
MCGS_DLL_FUNC SvrEditProperties(MCGS_DATA& data,
							  bool& bDefaultPeopertyDialog,
							  CString& strName,
							  CString& strComment,
							  long& DevCltTime,
							  long& DevChannelNum,
							  long& DevWorkFlag,
							  CStringArray* strChannelVarName,
							  CArray<int,int>* iChannelType)
{
  bDefaultPeopertyDialog = true;
  return TRUE;
}

///	函数功能:	编辑客户自定义属性, 调用DEV的内部属性页,在这里删除和添加通道
///	函数返回:	TRUE,固定
///	参数意义:	data			MCGS传过来的MCGS_DATA结构的指针
///				
///	备	  注:	一般来说此函数可以不用修改,可用于任何有内部属性页的设备
MCGS_DLL_FUNC SvrEditProperty(MCGS_DATA& data,bool& bDefaultPeopertyDialog)
{
	bDefaultPeopertyDialog = true;
	return TRUE;
}


///	函数功能:	编辑客户自定义属性, 调用DEV的内部属性页
///	函数返回:	TRUE,固定
///	参数意义:	data MCGS传过来的MCGS_DATA结构的指针
///				在这里删除和添加通道
///	备	  注:	一般来说此函数可以不用修改,可用于任何有内部属性页的设备
MCGS_DLL_FUNC SvrEditCustomProperty(MCGS_DATA& data)
{
	return TRUE;
}

///	函数功能:	初次创建设备时调用本函数
///	函数返回:	TRUE,固定
///	参数意义:	data			MCGS传过来的MCGS_DATA结构的指针
///	备	  注:
MCGS_DLL_FUNC SvrInitDevSet(MCGS_DATA& data)
{
	// 为DEV_DATA中的变量赋初值
	CDevBas::mfCheckDevDataInit(data);

	// 把DevData中的变量流化到MCGS_DATA中
	return TRUE;
}

///	函数功能:	在本函数中,从Mcgs_Data中回复出DEV_DATA中的数据来
///	函数返回:	TRUE,固定
///	参数意义:	data			MCGS传过来的MCGS_DATA结构的指针
///	备	  注:
MCGS_DLL_FUNC SvrInitDevRun(MCGS_DATA& data)
{
	// 调试时调此函数
	srand(GetTickCount());
	return TRUE;
}

///	函数功能:	退出设备采
///	函数返回:	TRUE,固定
///	参数意义:	data			MCGS传过来的MCGS_DATA结构的指针
///				strChannelName	设备通道的名称的数组		
///				strPropertyValue设备通道的数据类型的数组	
///	备	  注:	一般来说此函数可以不用修改,可用于任何设备
MCGS_DLL_FUNC SvrExitDevRun(MCGS_DATA& data)
{
	if (data.m_pDevData != NULL)
	{
		((DEV_DATA*)data.m_pDevData)->nArProperty.SetSize(0);
		delete data.m_pDevData;
		data.m_pDevData = NULL;
	}
	return TRUE;
}

///	函数功能:	主采集函数用于采集数据
///	函数返回:	0,正确。-100,错误。
///	参数意义:	data			MCGS传过来的MCGS_DATA结构的指针
///				collectFlag		用于标志设备通道是否需要操作的数组		
///				valueArray		用于返回设备通道的数值型数据的数组			
///				strValueArray	用于返回设备通道的字符串型数据的数组
///	备	  注:	在这里调用CDevBas中的mfcollectDevData函数进行实际的数据采集操作
///				一般来说此函数可以不用修改,可用于任何设备
MCGS_DLL_FUNC SvrCollectDevData(MCGS_DATA& data,
								 CArray<int,int>& collectFlag,
								 CArray<double,double>& valueArray,
								 CStringArray& strValueArray)
{
	if (valueArray.GetSize() <= 0)
	{
		ASSERT(FALSE);
		return 0;
	}
	valueArray[0] = 1;	

    // 创建协议及处理 
	{	
		int nReturn = CDevBas::mfCollectDevData(data, collectFlag, valueArray, strValueArray);
		if(nReturn < 0)
		{
			valueArray[0] = nReturn;
			return -100;
		}
		
	}

	valueArray[0] = 0;

	return 0;	
}
 
///	函数功能:	此函数实现命令功能,所有的命令操作都在这里进行
///	函数返回:	0,正确。2,设备命令无效。
///	参数意义:	data			MCGS传过来的MCGS_DATA结构的指针
///				strCmd			MCGS传过来的命令字符串
///				valueArray		用于返回设备通道的数值型数据的数组			
///				strValueArray	用于返回设备通道的字符串型数据的数组
///	备	  注:	在这里对写命令解码,后调用CDevBas中的mfWriteChannel函数进行实际的写操作
///				一般来说,如果有通讯状态标志位,此函数可以不用修改,可用于任何设备
MCGS_DLL_FUNC SvrDevIOCtrl(MCGS_DATA& data,
							   CString& strCmd,
								 CArray<double,double>& valueArray,
								 CStringArray& strValueArray)
{
	if (valueArray.GetSize() <= 0)
	{
		ASSERT(FALSE);
		return 0;
	}
	

	// 创建协议及处理 
	{	
		int nReturn =CDevBas::mfDevIOCtrl(data, strCmd, valueArray, strValueArray);
		if ( nReturn < 0)
		{
			valueArray[0] = -nReturn;
		}
	}	
	
	return 0;
}

///	函数功能:	获取设备驱动的名称等信息
///	函数返回:	TRUE,固定
///	参数意义:	strName			设备的名称
///				DEVTYPE			设备类型 子设备		
///				devStyle		设备类别 串口设备			
///				cType			运行类别
///				strDllName		运行时调用驱动的名称
///	备	  注:	一般来说此函数可以不用修改,可用于任何设备
MCGS_DLL_FUNC SvrGetDevInfo(CString& strName,
								 DEVTYPE& devType,
								 DEVSTYLE& devStyle,
								 MCGS_RUNTIME_TYPE cType,
								 CString& strDllName)
{
#ifdef _UNICODE
	return FALSE;
#else
	strName = DEV_STR_NAME;
#endif //_UNICODE
	devType = DEV_CHILD;
	devStyle = DEV_TCPIP;
	// 获取运行时DLL
	switch (cType)
	{
	case MCGS_RUNTIME_TYPE_EMU:
		{				
			strDllName = DEV_STR_DLLNAMEMU;
		}
		break;
	case MCGS_RUNTIME_TYPE_WCE_X86:
		{
			strDllName = DEV_STR_DLLNAMECE;
		}
		break;
	};
	return TRUE;
}

///	函数功能:	
///	函数返回:	TRUE,固定
///	参数意义:	lpDispatch 
///	备	  注:	
MCGS_DLL_FUNC  SvrSetSetIDispatch(LPDISPATCH& lpDispatch)
{
	g_mcgsset.SvrSetDispatch( lpDispatch );
	return TRUE;
}

///	函数功能:	
///	函数返回:	TRUE,固定
///	参数意义:	lpDispatch 
///	备	  注:	
MCGS_DLL_FUNC  SvrSetRunIDispatch(LPDISPATCH& lpDispatch)
{
	g_datacentre.SvrSetDispatch( lpDispatch );
	return TRUE;
}

⌨️ 快捷键说明

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