📄 swa2000.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 + -