论文部分内容阅读
[摘 要]本文依据最新的生态环境监测系统设计理论与实践研究,介绍了一种以JBuilder为开发平台,本文详细分析研究了Matlab和Java的集成,利用Java-COM桥技术实现了两者之间的集成。利用Java-COM桥技术用Matlab作为数学分析、数据处理工具、算法开发工具的大气环境评测系统的设计与实现。该系统不仅充分发挥了JBuilder开发应用程序的强大优势,而且充分利用了Matlab在计算、图形绘制上的长处。
[关键词]生态监测 系统设计 Matlab Java
中图分类号:TF762.3 文献标识码:A 文章编号:1009-914X(2016)21-0101-02
1 COM和Java解决方案
Microsoft Java编译器、虚拟机以及各式各样的工具极大简化了Java/COM程序员的工作。编译器有特殊的引导命令和包,可将Java类当作COM类对待。但在大多数情况下,只需依赖Microsoft JVM为COM提供的支持,同时利用两个有力的外部工具。若将Java对象创建成一个COM服务器,那么对象仍然会在JVM内部运行。Microsoft JVM是作为一个DLL实现的,它向操作系统展示出了COM接口。在内部,JVM将对这些COM接口的函数调用映射成Java对象中的方法调用。当然,JVM必须知道哪个Java类文件对应于服务器执行模块;之所以能够找出这方面的信息,是由于事前已用Javareg在Windows注册表内注册了类文件。Javareg是与Microsoft Java SDK配套提供的一个工具程序,能读入一个Java类文件,生成相应的类型库以及一个GUID,并可将类注册到系统内。
Java/COM客户是一些特殊的Java代码,它们想激活和使用系统内注册的一个COM服务器。同样地,JVM会与COM服务器沟通,并将它提供的服务作为Java类内的各种方法展示出来。另一个Microsoft工具是jactivex,它能读取一个类型库,并生成相应的Java源文件,在其中包含特殊的编译器引导命令。生成的源文件属于在指定类型库之后命名的一个包的一部分。下一步是在自己的COM客户Java源文件中导入那个包。
2 利用Java-COM桥实现Matlab與Java集成
2.1 大气环评系统中COM组件生成关键技术
计算模块是系统的核心模块,根据大气环境评测模型中给出的公式,我们可以方便的得到污染源附近定点的污染物浓度,利用Matlab编程求解,点源模式和熏烟模式以及对点源模式的扩展在Matlab中的关键代码。
1.Matlab中COM Builder编译环境设置
Matlab COM Builder在编译生成COM组件时需要借助于外部的编译器,因此首先需要设置Matlab COM Builder所使用的外部编译器,通过mbuilde-setup完成编译环境的设置。Matlab自动注册mwcomutil.dll和mwcommgr.dll,这两个DLL是Matlab COM Builder生成的COM组件的基础,所有生成的COM组件都会使用到这两个DLL。
2.创建COM组件
将编写好的M文件利用Matlab的COM生成器发布成COM组件,并且在系统中完成注册。成功创建COM组件后,创建信息显示在“Build Status”面板中。Matlab把.m文件编译成COM组件,同时将COM组件的信息登记在注册表中,登记信息中的ProgID为该COM组件的标识符,jawin就是通过ProgID来调用COM组件。
3. 组件接口
COM是一个标准,遵从这个标准的组件能够相互调用。COM通过接口对外提供所有的功能,每一个COM组件都实现一定的接口,至少实现IUnknown接口。由于系统对Matlab的调用只涉及到简单的参数传递,没有特殊要求的接口,故开发的组件有IUnknown和IDispatch接口。接口本质上是一个只包含虚函数指针的结构体。具体的函数由组件类实现,客户调用组件正是通过虚函数指针实现的。
4.接口定义
COM规范在采用OSF的DCE规范描述远程调用接口IDL (Interface Description Language,接口描述语言)的基础上,进行扩展形成了COM接口的描述语言。接口描述语言提供了一种不依赖于任何语言的接口描述方法,因此,它可以成为组件程序和客户程序之间的共同语言。COM规范使用的IDL接口描述语言不仅可用于定义COM接口,同时还定义了一些常用的数据类型,也可以描述自定义的数据结构,对于接口成员函数,可以指定每个参数的类型、输入输出特性,甚至支持可变长度的数组的描述。IDL支持指针类型,与C/C++很类似。
接口定义语言是一种方法,通过这种方法,可以定义COM对象所支持的接口。IDL定义了许多的构成声明和属性的关键字。IDL文件由MIDL编译器编译。MIDL编译器的输出包括:类型库,这个二进制文件包含关于由COM服务器程序所暴露对象的信息。类型库由读取类型库所描述组件对象的接口的开发工具装载。更重要的是,类型库可以被标准的调度对象在跨COM调度时使用。类型库有时是一个单独的TLB文件,有时它作为资源被编译到相关联的DLL或可执行文件中。C/C++兼容的接口描述头文件(*.h),它可以被组件程序和客户程序所使用;GUID文件,它声明了在IDL文件中的每个接口和类相对应的GUID。可以生成代理/存根DLL的源文件。
组件发布后会有一个全球唯一的GUID,本系统中发布的组件注册到注册表文件中后的“{5618F642-0799-485F-997E-66146110DA64}”即为Matlab发布组件的GUID,并且在注册表留有注册信息。支持COM组件技术的开发工具都可以在开发的应用程序中利用该GUID调用这个组件的方法和过程。当然也可以根据该GUID在注册表中的注册信息,即ProgID中的信息“dqms.dqms.1_0”来调用此组件,大气环境评测系统就是使用这种方法调用通过Java-COM桥调用组件的。 2.2 在Java中调用COM技术
在Java编程时通过导入jawin包,利用jawin包中的类和ProgID(系统组件的ProgID在上文中已经提及)来初始化COM、生成对象和调用组件函数。步骤如下:
(1)导入jawin.jar;(2)用引入的包Ole32CoInitialize()来初始化COM;(3)根据ProgID生产一个DispatchPtr(jawin包中的类)对象,后面用该对象来调用COM组件函数和设置属性;(4)调用Matlab函数输入变量和输出变量的设置。首先生成一个Integer对象,用来表示输出参数个数,当没有输出变量时不用生成这个对象,然后输出定义成Variant.ByrefHolder(jawin包中的类)对象的变量,并且用空的输出变量的数据类型构造该对象,输入对象为一般的Object对象;(5)用生成的DispatchPtr对象的invoke函数来调用Matlab函数以及输入、输出变量。Invoke调用参数作如下排列;函数名称(字符串),表示输出变量个数的Integer对象,第一个表示输出变量的Variant ByrefHolder对象,第二个表示输出变量的Variant ByrefHolder对象,……,第一个输入变量对象,第二个输入变量对象……
也可以生成一个Object数组供DispatchPtr对象的Invoke()函数调用,该Object数组元素包括表示输出变量个数的Integer对象、表示输出变量的Variant ByrefHolder对象、输入变量对象。(6)取出输出变量的值,通过强制转换表示输出变量的Variant.ByrefHolder对象,通过getRef()得到的对象到输出变量的数据类型对象。
3 大气环境评测系统设计
3.1 大气环境评测系统的架构
大气环境评测系统是湖北省环境检测中心站的项目“环境评测计算系统”中的大气评测部分,预期设计用在可移动的污染物检测设备上。系统主要包括点源扩散模式、多源面源扩散模式、熏烟模式等常见的扩散模式预测功能,都是按照HJ/T2.2-93导则-大气环境(文献6)推荐的模型和计算方法对污染物浓度进行預测。
系统在设计上将应用和负责计算两部分分为应用层和计算层,如图2所示。应用层部分包含了大气环境评测系统的多种模式预测功能,主要工作是参数的设置和中间指标,如烟气抬升高度、太阳高度角、混合层厚度等的计算,并准备计算各种模式需要用到的数据。应用层的另一个功能就是对计算层返回的计算结果进行分析,显示到GUI中去。
计算层的主要工作是通过Java-COM桥将得到的数据传递到计算组件中,并将计算结果返回。
3.2 计算模块程序流程
计算模块是大气环境评测系统的核心,是各种扩散模式模型的应用过程。计算模块的数据流程并不复杂,首先是在GUI中对污染源进行设置,得到最原始的污染源参数;紧接着是按照预测模式的不同,分别计算中间指标,然后将得到的数据作为调用COM组件的参数进行传递;数据传递给由Matlab发布的COM组件后结果计算将结果数据返回给应用层,再返回到GUI。模块的程序流程中整个计算模块的核心部分在于对COM组件得到调用,由于项目的特性,大气环境评测模型有很多的参数,调用组件的过程时需要加以注意参数的顺序和格式。
4 结论
综上所述,一般的环境监测设计系统都讨论了Matlab与高级语言的编程接口方法,对目前已有Matlab接口方法进行了系统总结,分析了这些方法的优势、缺陷和使用条件,然后提出了利用COM组件技术实现Matlab与高级语言接口的方法。重点研究了Matlab中开发COM组件的技术,并研究了Matlab生成COM组件的内部过程,给出了Matlab和标准COM变量之间的转换规则。而本文另辟蹊径详细分析研究了Matlab和Java的集成,利用Java-COM桥技术实现了两者之间的集成。文章进一步研究可以研究大气环境影响评价中的大气预测模型,此模型旨在于通过对污染源参数的测定,将得到的数据用模型可以计算出污染源附近某点的污染物浓度。简单的讨论了大气环境评测系统的设计和开发过程。对系统开发过程中的难点进行了详细的介绍并对其进行了深入分析。本文的创新之处在于:在现有的大气环境评测系统中,没有利用数学计算软件,在模型计算上的准确度都依赖于对计算函数的编写精度,而本文则是利用了COM技术实现了Matlab的完美重用,并且将Matlab运用到计算系统中去,加大了系统的计算精度和准确性。由于个人精力和经验所限,文中谈到的一些功能只是提出了些想法和实现的可行性并没有全部实现,系统的图形功能还没有开发成熟,只能简单的显示出定点浓度的示意,并没有达到显示安全范围的功能,这些还有待他人的继续开发和完善。实际上大气环境评测系统是环境影响评价评测项目中的大气部分,整个项目包括了如声环境、水环境等多个方面的内容,希望在不久的将来后继开发者能将全部功能实现,为环境工作者提供一套方便、快捷、实用、精确的计算软件。
另外,现在的数学计算工具功能越来越强大,可以对环境预测模型进行扩展,现有的模型没有涉及到最大安全范围的计算,只是计算了污染源附近某处的污染物浓度以及最大浓度距离。可以设计一套程序对安全范围进行拟合,一种比较笨拙的办法是将离污染源的距离按照一定规律进行多次计算,根据污染物浓度标准,将浓度符合国家安全标准的位置在图形中标识出来。这只是一种比较简单的方法,还有待进一步的论证和深入。
参考文献
[1]邓翔宇.基于GPRS和无线传感网络的环境监测系统设计[J]. 自动化与仪器仪表.2011(03)
[2]陈立定,冯景辉.基于PLC和GPRS的远程环境监测系统设计[J]. 自动化与仪表.2010(04)
[3]张绪良,王树德,张朝晖,徐宗军,郑伟.GIS湿地生态环境监测与管理信息系统的建设与应用[J].中国农学通报. 2010(13)
[关键词]生态监测 系统设计 Matlab Java
中图分类号:TF762.3 文献标识码:A 文章编号:1009-914X(2016)21-0101-02
1 COM和Java解决方案
Microsoft Java编译器、虚拟机以及各式各样的工具极大简化了Java/COM程序员的工作。编译器有特殊的引导命令和包,可将Java类当作COM类对待。但在大多数情况下,只需依赖Microsoft JVM为COM提供的支持,同时利用两个有力的外部工具。若将Java对象创建成一个COM服务器,那么对象仍然会在JVM内部运行。Microsoft JVM是作为一个DLL实现的,它向操作系统展示出了COM接口。在内部,JVM将对这些COM接口的函数调用映射成Java对象中的方法调用。当然,JVM必须知道哪个Java类文件对应于服务器执行模块;之所以能够找出这方面的信息,是由于事前已用Javareg在Windows注册表内注册了类文件。Javareg是与Microsoft Java SDK配套提供的一个工具程序,能读入一个Java类文件,生成相应的类型库以及一个GUID,并可将类注册到系统内。
Java/COM客户是一些特殊的Java代码,它们想激活和使用系统内注册的一个COM服务器。同样地,JVM会与COM服务器沟通,并将它提供的服务作为Java类内的各种方法展示出来。另一个Microsoft工具是jactivex,它能读取一个类型库,并生成相应的Java源文件,在其中包含特殊的编译器引导命令。生成的源文件属于在指定类型库之后命名的一个包的一部分。下一步是在自己的COM客户Java源文件中导入那个包。
2 利用Java-COM桥实现Matlab與Java集成
2.1 大气环评系统中COM组件生成关键技术
计算模块是系统的核心模块,根据大气环境评测模型中给出的公式,我们可以方便的得到污染源附近定点的污染物浓度,利用Matlab编程求解,点源模式和熏烟模式以及对点源模式的扩展在Matlab中的关键代码。
1.Matlab中COM Builder编译环境设置
Matlab COM Builder在编译生成COM组件时需要借助于外部的编译器,因此首先需要设置Matlab COM Builder所使用的外部编译器,通过mbuilde-setup完成编译环境的设置。Matlab自动注册mwcomutil.dll和mwcommgr.dll,这两个DLL是Matlab COM Builder生成的COM组件的基础,所有生成的COM组件都会使用到这两个DLL。
2.创建COM组件
将编写好的M文件利用Matlab的COM生成器发布成COM组件,并且在系统中完成注册。成功创建COM组件后,创建信息显示在“Build Status”面板中。Matlab把.m文件编译成COM组件,同时将COM组件的信息登记在注册表中,登记信息中的ProgID为该COM组件的标识符,jawin就是通过ProgID来调用COM组件。
3. 组件接口
COM是一个标准,遵从这个标准的组件能够相互调用。COM通过接口对外提供所有的功能,每一个COM组件都实现一定的接口,至少实现IUnknown接口。由于系统对Matlab的调用只涉及到简单的参数传递,没有特殊要求的接口,故开发的组件有IUnknown和IDispatch接口。接口本质上是一个只包含虚函数指针的结构体。具体的函数由组件类实现,客户调用组件正是通过虚函数指针实现的。
4.接口定义
COM规范在采用OSF的DCE规范描述远程调用接口IDL (Interface Description Language,接口描述语言)的基础上,进行扩展形成了COM接口的描述语言。接口描述语言提供了一种不依赖于任何语言的接口描述方法,因此,它可以成为组件程序和客户程序之间的共同语言。COM规范使用的IDL接口描述语言不仅可用于定义COM接口,同时还定义了一些常用的数据类型,也可以描述自定义的数据结构,对于接口成员函数,可以指定每个参数的类型、输入输出特性,甚至支持可变长度的数组的描述。IDL支持指针类型,与C/C++很类似。
接口定义语言是一种方法,通过这种方法,可以定义COM对象所支持的接口。IDL定义了许多的构成声明和属性的关键字。IDL文件由MIDL编译器编译。MIDL编译器的输出包括:类型库,这个二进制文件包含关于由COM服务器程序所暴露对象的信息。类型库由读取类型库所描述组件对象的接口的开发工具装载。更重要的是,类型库可以被标准的调度对象在跨COM调度时使用。类型库有时是一个单独的TLB文件,有时它作为资源被编译到相关联的DLL或可执行文件中。C/C++兼容的接口描述头文件(*.h),它可以被组件程序和客户程序所使用;GUID文件,它声明了在IDL文件中的每个接口和类相对应的GUID。可以生成代理/存根DLL的源文件。
组件发布后会有一个全球唯一的GUID,本系统中发布的组件注册到注册表文件中后的“{5618F642-0799-485F-997E-66146110DA64}”即为Matlab发布组件的GUID,并且在注册表留有注册信息。支持COM组件技术的开发工具都可以在开发的应用程序中利用该GUID调用这个组件的方法和过程。当然也可以根据该GUID在注册表中的注册信息,即ProgID中的信息“dqms.dqms.1_0”来调用此组件,大气环境评测系统就是使用这种方法调用通过Java-COM桥调用组件的。 2.2 在Java中调用COM技术
在Java编程时通过导入jawin包,利用jawin包中的类和ProgID(系统组件的ProgID在上文中已经提及)来初始化COM、生成对象和调用组件函数。步骤如下:
(1)导入jawin.jar;(2)用引入的包Ole32CoInitialize()来初始化COM;(3)根据ProgID生产一个DispatchPtr(jawin包中的类)对象,后面用该对象来调用COM组件函数和设置属性;(4)调用Matlab函数输入变量和输出变量的设置。首先生成一个Integer对象,用来表示输出参数个数,当没有输出变量时不用生成这个对象,然后输出定义成Variant.ByrefHolder(jawin包中的类)对象的变量,并且用空的输出变量的数据类型构造该对象,输入对象为一般的Object对象;(5)用生成的DispatchPtr对象的invoke函数来调用Matlab函数以及输入、输出变量。Invoke调用参数作如下排列;函数名称(字符串),表示输出变量个数的Integer对象,第一个表示输出变量的Variant ByrefHolder对象,第二个表示输出变量的Variant ByrefHolder对象,……,第一个输入变量对象,第二个输入变量对象……
也可以生成一个Object数组供DispatchPtr对象的Invoke()函数调用,该Object数组元素包括表示输出变量个数的Integer对象、表示输出变量的Variant ByrefHolder对象、输入变量对象。(6)取出输出变量的值,通过强制转换表示输出变量的Variant.ByrefHolder对象,通过getRef()得到的对象到输出变量的数据类型对象。
3 大气环境评测系统设计
3.1 大气环境评测系统的架构
大气环境评测系统是湖北省环境检测中心站的项目“环境评测计算系统”中的大气评测部分,预期设计用在可移动的污染物检测设备上。系统主要包括点源扩散模式、多源面源扩散模式、熏烟模式等常见的扩散模式预测功能,都是按照HJ/T2.2-93导则-大气环境(文献6)推荐的模型和计算方法对污染物浓度进行預测。
系统在设计上将应用和负责计算两部分分为应用层和计算层,如图2所示。应用层部分包含了大气环境评测系统的多种模式预测功能,主要工作是参数的设置和中间指标,如烟气抬升高度、太阳高度角、混合层厚度等的计算,并准备计算各种模式需要用到的数据。应用层的另一个功能就是对计算层返回的计算结果进行分析,显示到GUI中去。
计算层的主要工作是通过Java-COM桥将得到的数据传递到计算组件中,并将计算结果返回。
3.2 计算模块程序流程
计算模块是大气环境评测系统的核心,是各种扩散模式模型的应用过程。计算模块的数据流程并不复杂,首先是在GUI中对污染源进行设置,得到最原始的污染源参数;紧接着是按照预测模式的不同,分别计算中间指标,然后将得到的数据作为调用COM组件的参数进行传递;数据传递给由Matlab发布的COM组件后结果计算将结果数据返回给应用层,再返回到GUI。模块的程序流程中整个计算模块的核心部分在于对COM组件得到调用,由于项目的特性,大气环境评测模型有很多的参数,调用组件的过程时需要加以注意参数的顺序和格式。
4 结论
综上所述,一般的环境监测设计系统都讨论了Matlab与高级语言的编程接口方法,对目前已有Matlab接口方法进行了系统总结,分析了这些方法的优势、缺陷和使用条件,然后提出了利用COM组件技术实现Matlab与高级语言接口的方法。重点研究了Matlab中开发COM组件的技术,并研究了Matlab生成COM组件的内部过程,给出了Matlab和标准COM变量之间的转换规则。而本文另辟蹊径详细分析研究了Matlab和Java的集成,利用Java-COM桥技术实现了两者之间的集成。文章进一步研究可以研究大气环境影响评价中的大气预测模型,此模型旨在于通过对污染源参数的测定,将得到的数据用模型可以计算出污染源附近某点的污染物浓度。简单的讨论了大气环境评测系统的设计和开发过程。对系统开发过程中的难点进行了详细的介绍并对其进行了深入分析。本文的创新之处在于:在现有的大气环境评测系统中,没有利用数学计算软件,在模型计算上的准确度都依赖于对计算函数的编写精度,而本文则是利用了COM技术实现了Matlab的完美重用,并且将Matlab运用到计算系统中去,加大了系统的计算精度和准确性。由于个人精力和经验所限,文中谈到的一些功能只是提出了些想法和实现的可行性并没有全部实现,系统的图形功能还没有开发成熟,只能简单的显示出定点浓度的示意,并没有达到显示安全范围的功能,这些还有待他人的继续开发和完善。实际上大气环境评测系统是环境影响评价评测项目中的大气部分,整个项目包括了如声环境、水环境等多个方面的内容,希望在不久的将来后继开发者能将全部功能实现,为环境工作者提供一套方便、快捷、实用、精确的计算软件。
另外,现在的数学计算工具功能越来越强大,可以对环境预测模型进行扩展,现有的模型没有涉及到最大安全范围的计算,只是计算了污染源附近某处的污染物浓度以及最大浓度距离。可以设计一套程序对安全范围进行拟合,一种比较笨拙的办法是将离污染源的距离按照一定规律进行多次计算,根据污染物浓度标准,将浓度符合国家安全标准的位置在图形中标识出来。这只是一种比较简单的方法,还有待进一步的论证和深入。
参考文献
[1]邓翔宇.基于GPRS和无线传感网络的环境监测系统设计[J]. 自动化与仪器仪表.2011(03)
[2]陈立定,冯景辉.基于PLC和GPRS的远程环境监测系统设计[J]. 自动化与仪表.2010(04)
[3]张绪良,王树德,张朝晖,徐宗军,郑伟.GIS湿地生态环境监测与管理信息系统的建设与应用[J].中国农学通报. 2010(13)