-
VC++开发基于LNS的LonWorks网络数据监控接口
- 发布时间:2008/11/23 7:51:57
修改时间:2008/11/22 10:14:39 浏览次数:2898
-
-
The data monitor and control interface development based on LNS LonWorks network by Visual C++
北京三维力控科技有限公司 林威汉
摘要:本文介绍了用Visual C++ 6.0开发工具,在LNS环境下,开发LonWorks网络数据监控接口的方法,举例阐述了软件实现过程。对于相关系统的设计、开发具有一定的参考价值。
关键词:LNS、LonkWorks网络数据监控接口
Abstract:The data monitor and control interface development based on LNS LonWorks network by Visual C++ 6.0 is introduced .And sample programming code is shown. This article is referenced by people who are developing LNS system.
Key words:LNS、LonWorks network data monitor and control interface
1 引言
近年来,现场总线技术迅猛发展,取代传统的集中式控制系统已成必然。LonWorks技术是美国ECHELON公司在1991年推出的一种控制局域网络,它以其优秀的分布处理能力、开放性、互操作性、多媒介适应能力以及多网络拓扑结构等特性适应了未来发展对测控网络的要求,成为众多总线中的佼佼者。与其它现场总线相比,它具有组网方便,通讯速率快,不局限于通讯介质等优点。目前其在国内的应用非常广泛,工程实例遍及楼宇控制,智能小区,工厂,矿井监控等场合,是一种具有良好发展前景的总线。
2 LNS开发接口与开发工具
LNS(LonWorks Network Services)是ECHELON提供的一个专为LonWorks网络服务的网络操作系统。LNS封装了对LonWorks网络的各种操作,如:网络安装、网络维护、变量连接等。在Windows环境下,LNS提供了基于ActiveX和COM组件方式的开发接口。这两种方式在功能和性能上都没有什么差异,而ActiveX使用起来更为简便,一般也不需要开发 人员了解很多OLE方面的知识,因而更易于被接受。本文所列举的实例采用的就是ActiveX方式。
采用ActiveX方式开发LonWorks网络通信接口可选择的开发工具十分丰富。Visual C++ 6.0目前仍然是开发自动化软件的主流工具之一。当在VC环境下用ActiveX接口开发LonWorks网络通信接口程序时,在实现过程和方法上与其它语言差别不大。只是在一些与VC语言特性相关的环节上,如果处理不当,就会影响接口程序的健壮性、稳定性。
LNS由LNS Server、LNS Object Server COM Component、Data Server和Network Interface几个主要部分 组 成,提供了从网络变量监测到网络管理和维护等完整的功能接口。在开发LonWorks网络数据监控接口程序时,涉及的只 是 其 中的数据监控部分的功能。
3 LNS实现监控的过程
LNS提供了两种网络监控方式,一种是监控集(Monitor set)方式,一种是单点(Single point)方式。两种方式都是以监控点(Monitor points)为基本 单位。一个监控点对应一个网络变量或应用消息。
监控集建立后就被保存在Data Sever中,即使应用程序关闭也仍然存在。单点方式每次都需要应用程序重新创建,退出时释放。监控集方式适用于监控任务比较繁重的场合,单点方式适合监控任务较轻,点数较多的情况。
无论是监控集或是单点方式,都要使用监控点。监控点有以下几种监控方式:显式读写、隐式绑定、查询、显示绑定。
对于显式读写方式,接口程序可以直接读写监控点的数值。在隐式绑定方式下,可以将一个监控点与一个节点的网络变量绑定,当网络变量变化时,会用事件NvMonitorUpdateEvent通知接口程序,接口程序根据消息参数可以取得更新的数据。当使用查询方式时,每隔一个周期就触发一次NvMonitorUpdateEvent事件。当使用显式绑定方式时,对应设备结点的一个或多个网络变量,要在上位机上创建并绑定一个网络变量,而这个网络变量又可以用其它三种方式进行监控。这种方式主要为了实现用一个监控点同时监测多个结点网络变量。
这几种方式分别适用于不同的场合。查询方式适用于监控任务繁重,但对数据采集的实时性要求不高的场合。隐式绑定适用于监控任务较轻,但数据变化要求实时处理的场合。当现场数据变化频繁时,用显式读写或查询方式会导致应用程序的运行速度缓慢。
本文列举的实例采用的是监控集方式,监控点采用的是隐式绑定方式以获得较好的实时性和较高的效率。
4 接口程序的设计与实现
在安装了Echelon的LNS Application Developer's Kit开发包之后,就可以使用开发包中提供的lnsobjectserver控件了。最简单的方法是在一个对话框资源上插入这个控件,然后用这个对话框创建一个类,将创建监测集、获取监控点数据等各种操作全都封装在这个类里,以供接口程序的其它模块调用。本文实例中创建了一个名为CObjServerDlg的类。这个类提供实现以下几个最主要的接口。
1)、对LNS对象服务器进行初始化的接口。
在这个接口时里,具体实现的内容包括:
设置对象服务的用户模式(单用户或多用户);
设置远程或本地方式;
打开服务器;
设置网络接口,打开网络;
设置系统;
设置网络服务设备;
打开系统;
设置通道;
得到监控集对象;
设置监控集的属性;
获得包含要监控的网络变量的设备对象;
将要监控的网络变量添加到监控点中;
打开监控集。
调用lnsobjectserver控件方法可以逐步实现上述初始化过程。需要注意的是VC对异常情况的处理,不进行异常或处理不当会导致接口程序出现各种莫名错误。下面举例说明:
void CObjServerDlg::InitObjServer()
{
m_ObjSvr.SetRemoteFlag(FALSE);
m_ObjSvr.SetSingleUserMode(FALSE);
m_ObjSvr.Open();
if (!m_ObjSvr.GetIsOpen())
{
ShowEvent("创建LNS Server失败!");
return;
}
//设置网络
LcaNetworks Networks(m_ObjSvr.GetNetworks());
try
{
//在获取网络对象时要捕获异常
m_ActiveNetwork = Networks.GetItem(COleVariant(m_csNetworkName));
ASSERT (m_ActiveNetwork.m_lpDispatch != NULL);
}
catch (COleDispatchException *pE)
{
//对异常的正确处理
if (LCA_ERR_RANGE_START+LCA_OBJECT_NOT_FOUND ==
pE->m_scError + OLE2LNS_CONVERSION)
{
CString csEvent;
csEvent.Format("网络%s不存在!", m_csNetworkName);
ShowEvent(cs);
}
else
ShowEvent(pE->m_strDescription);
pE->Delete();
return;
}
......
//其它部分代码
}
2)、处理NvMonitorUpdateEvent事件消息。当网络变量变化时,LNS会发送NvMonitorUpdateEvent消息通知接口程序。在这个消息函数中会将数值变化的监控点、数据点、源地址以参数的形式传递过来。通过这些参数可以获取变化数据的原始值和格式化值。这里需要注意的是如果LNS用的是VT_BSTR格式传值,在获取变化的数值后,必须正常释放资源。否则接口程序就会持续不断地占用系统内存,直至内存耗尽。下面举例说明:
// 将格式化的变化值赋给一个VARIANT型变量
VARIANT NvFmtValue = UpdateDataPoint.GetFormattedValue();
if (NvFmtValue.vt == VT_BSTR)
{
CString csNvFmtValue = NvFmtValue.bstrVal;
ShowVaule(csNvFmtValue);
SysFreeString(NvFmtValue.bstrVal); // 必须正确释放内存资源
}
3)、实现对监控点进行写操作的接口。
写操作和读操作的过程一样,也涉及使用原始数值格式和格式化数值格式的选择。
按照格式化数值格式进行写入时过程比较简单,示例代码如下:
LcaDataPoint DataPoint = NvMonitorPoint.GetDataPoint();//得到要写入的数据点对象
ASSERT(DataPoint.m_lpDispatch != NULL);
DataPoint.SetFormattedValue(COleVariant(csWriteData));
//csWriteData是一个CString类型的变量,代表写入的数值
如果按照原始格式进行写操作,要注意的是LNS要求使用一种"VT_ARRAY | VT_UI1"型的VARIANT变量作为写入值,示例代码如下:
LcaDataPoint DataPoint = NvMonitorPoint.GetDataPoint();//得到要写入的数据点对象
ASSERT(DataPoint.m_lpDispatch != NULL);
SAFEARRAY SafeArray;
SafeArray.cDims = 1;
SafeArray.fFeatures = 128;
SafeArray.cbElements = 1;
SafeArray.cLocks = 0;
SafeArray.rgsabound[0].cElements = nWrtDataLen;
SafeArray.rgsabound[0].lLbound = 1;
SafeArray.pvData = pszWriteData;//表示写入值的字符串指针
VARIANT NvRawValue;
NvRawValue.vt = VT_ARRAY | VT_UI1;
NvRawValue.parray = &SafeArray;
DataPoint.SetRawValue(NvRawValue);
if(!DataPoint.GetAutoWrite())
DataPoint.Write();
5 结束语
本文介绍了在LNS环境下,开发LonWorks网络数据监控接口的方法。并结合VC编程语言的特点,着重说明在一些关键环节上的处理方法。可为其他设计、开发相关系统的开发人员提供参考。
参考文献
[1] ECHELON公司。LNS for Windows Programmer's Guide,2000。
[2] 雷刚,吕国强。基于LNS和COM的LonWorks网络监控软件开发