聂 冰 郑广海 孙晶华
(大连交通大学软件学院,辽宁 大连 116028)
随着现代自动控制和设备制造技术的发展,先进自动控制设备在工业现场得到广泛的应用。控制设备的种类不断增加,所使用的通信协议、接口类型都呈现多样性[1]。传统的设备配置软件因为设备配置器与软件主体框架之间具有耦合性,对于新增加的设备需要创建新的EXE或DLL文件实现业务逻辑与配置界面,同时需要修改软件主体代码实现对新设备的支持。这种构架制约了设备配置软件开发和使用的灵活性,增加了开发周期,加大了开发成本[2]。因此,提高设备配置软件的通用性和可扩展性是软件设计的关键。
笔者针对传统配置软件通用性差、可扩展性不足的问题,在传统软件设计的基础上,提出了基于设备描述的设备配置模型。该模型以纯文本文件对设备配置器的三大基本要素——设备配置信息、配置数据信息和配置界面信息进行描述,降低了软件开发人员的编程难度,同时在配置软件中增加了设备配置器的抽象接口,提高了软件的可重用性,缩短了软件的开发周期。该模型应用在DJTConfig设备配置软件中证明了其有效性和实用性。
XAML(eXtensible Application Markup Language)是微软公司以XML为基础,为构建程序用户界面而开发的一种新的描述性语言。除了具有标记语言的一般特点,XAML在设计用户界面方面具有更大的优势。XAML简化了用户界面的创建过程,开发人员可以利用XAML对WPF程序的用户界面元素,如文本、按钮、图像及列表框等进行详细的设置,对整个界面进行合理化的布局[3],与其他的.NET语言结合,构建一个功能完善、界面美观的WPF程序。
通常,XAML文件由微软公司提供的工具MarkupCompiler编译成结构更紧凑的类二进制文件BAML, BAML数据流保存在程序集合的资源文件中,在InitializeComponent方法中得以加载,用于构建用户界面。该功能由WPF提供了默认支持,在基于WPF的工程中,XAML文件的编辑、编译与加载由.Net Framework 提供了默认实现,因此编程人员可以使用XAML快速地开发图形界面并方便地加载到WPF程序中。微软公司也提供了在运行期加载XAML/BAML的方式,相对于编写后台代码,使用该方法维护、修改用户界面更加方便、快捷。
定义在System.Windows.Markup命名空间下的静态函数XamlReader.Load(),可以用来分析格式良好的XAML片段并创建相应的对象树,返回该对象树的根。System.Windows.Baml2006.Baml2006Reader可用于读取XAML,结合XamlReader.Load函数生成对象树,代码如下:
string filepath = @"...Dictionary1.baml";
FileStream fstream = new FileStream(filepath, FileMode.Open);
Baml2006Reader reader = new Baml2006Reader(fstream);
ResourceDictionary rs = System.Windows.Markup.XamlReader.Load(reader) as ResourceDictionary;
在运行期间该特性以编程方式为加载用户界面提供了技术支持,同时也为设备配置器提供了一种全新的配置界面开发方式。
现场设备种类繁多,不同厂商的设备互不兼容,为了实现不同设备之间的互操作,设备描述(Device Description, DD )技术运用设备描述表、电子设备描述语言(EDDL)及可扩展设备描述语言(XDDL)等对各个设备的参数、状态及功能等进行描述,使设备之间的数据交互与传递成为可能。通用的设备描述文件结构如图1所示。
图1 通用的设备描述文件结构
鉴于XML具有开放性、平台无关性及良好的可扩展性等优点[4,5],XML成为设备描述文件的重要载体,加之DOM解析器在读写XML文件方面的强大支持,使得基于XML的设备描述文件在工业现场得到了广泛应用。该文件将设备的基本信息及配置数据等编写成XML文档,对现场设备进行结构化的文本描述,构成了格式良好、信息详尽的数据仓库,进而为实现数据驱动的设备配置模型提供了数据源。
笔者提出的设备配置模型由设备配置软件和设备配置器构成。与传统设备配置软件相比,该模型在配置软件中增加了设备配置器的抽象接口,提高了软件的可重用性。软件主体代码相对稳定,通过定义新的设备配置器完成对新设备的支持,便于系统的扩展。其模型结构如图2所示。
图2 设备配置模型结构
由图2可知,模型中的设备配置软件分为3层,分别为实例层、抽象层和服务层。在实例层中,设备配置器中的设备描述文件实例化生成的现场设备定义该层,实例对象与每个独立的设备配置器一一对应,实例对象在设备配置器加载时创建,配置器的配置界面关闭时销毁。 其行为由设备配置数据驱动,实例对象通过基于DOM的解释器对配置数据文件进行访问和操作[4],生成配置数据对象,配置界面文件由XamlReader创建并内嵌于设备配置软件的配置器窗口显示给终端用户。配置数据对象与配置界面对象通过数据绑定建立数据连接。抽象层实现了设备配置器的抽象接口,定义了设备识别、数据存储、用户界面创建及后台业务逻辑等功能的通信接口。抽象层隐藏了设备配置器的实例对象,实现了配置软件实例层对服务层的透明化,解除了两者之间的强耦合,使设备配置器与设备配置软件同步开发成为可能,进而实现在不修改设备配置软件主体代码的情况下增加对新设备的支持,弥补了设备配置软件在通用性和可扩展性方面的不足。服务层负责实现设备状态查询、配置数据读写及与设备进行数据通信等功能。
该模型的设备配置器使用XML文档对设备进行描述,对应的设备描述文件结构如图3所示。该模型对通用设备描述文件结构做了扩展,将设备参数信息分别指向基于XML的配置数据文件和基于XAML的配置界面文件,利用纯文本文件实现设备配置。
图3 设备描述文件结构
配置数据文件利用XML描述了可配置数据在设备内存中的分布,配置信息包括以下几个方面:
a. 配置数据区长度。配置数据的总长度(以字节为单位)。
b. 数据类型。数据存储格式对设备配置数据来说至关重要,只有按照规定格式存储的数据才能被设备正确识别。该数据类型针对每个可配置的单位,规定了配置数据在内存中的存储格式。
c. 偏移量。一个可配置单位的起始位置。该位置通过相对于配置数据区起始位置的字节偏移标识。
d. 初始值。创建设备的起始数据,是保证设备正常工作的一组常用配置数据。初始值保证设备不经任何配置就可以一组默认参数运转。
e. 有效取值范围。可配置项的有效数据范围,为数据校验提供相关依据。
具体实现的配置数据文件部分代码如下:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ConfigDataDefinition.1.0.xsd"> Enum="MyDevice_OutType_Enum"/>
该模型的设备配置界面由基于XAML的配置界面文件生成,该文件可由Blend或Visual Studio2008/2010提供的界面编辑器编辑。相对于编写后台代码,利用XAML设计控件更加简单、快捷。下面的代码显示了利用XAML文档配置界面标签和列表框的过程。
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" > <......>
DJTConfig设备配置软件将Visual Studio 2010 C#作为开发平台。该配置软件的配置数据由设备描述文件驱动,在设备配置器初始化的过程中动态创建。配置数据的UML模型如图4所示。
配置界面由配置界面文件生成,XamlReader负责创建界面对象树,界面对象树的加载过程由以下代码实现:
///
/// Load xaml file to a object of UserControl
///
///
///
internal static UserControl Load(string xamlFilePath)
{
using (var stream = new StreamReader(xamlFilePath))
{
var featurePageControl = XamlReader.Load(stream.BaseStream);
return (UserControl)featurePageControl;
}
}
图4 配置数据的UML模型
设计的DJTConfig配置软件界面如图5所示,图中显示了设备列表和一个打开的设备配置器。配置数据和配置界面之间通过微软数据绑定机制建立联系。界面中标签控件到MyDevice_OutputStatusLbl和列表框控件到ch0OutputTypeVal的数据绑定部分代码如下:
该设备配置软件可通过部署设备配置器增加对新设备的支持。任何符合定义格式的设备配置器都可以被设备配置软件识别并加载到运行期环境。新设备配置器的开发可以基于文本编辑器,大大降低了开发成本和对开发人员编程能力的要求。利用基于纯文本的设备描述文件开发同等规模的设备配置器相对编程模式的开发缩短开发周期50%。
图5 DJTConfig配置软件界面
提出了基于设备描述的设备配置模型,将基于XML和XAML的设备描述文件和配置界面文件内嵌在设备配置器中。通过配置纯文本的设备配置器插件实现对新设备的支持,源文件中主体代码不需要改动,简化了配置软件开发的复杂度。将该模型应用到DJTConfig设备配置软件中,设备更新简单、快捷,节省了开发时间与开发成本。