APP下载

自动化专业全仿真实践教学平台建设

2018-07-24岳元龙贾创罗雄麟徐宝昌许亚岚

教育教学论坛 2018年24期
关键词:自动化

岳元龙 贾创 罗雄麟 徐宝昌 许亚岚

摘要:实践教学环节是自动化专业本科生课程体系的重要组成部分,也是强化学生掌握专业理论、培养实践创新能力的有效方法。目前,校内现有的缩比实践教学装置和可操作范围有限、甚至没有实操环节的工厂实习,使学生无法通过实践教学环节了解实际生产装置对控制系统和操作人员的要求。本文给出全尺度仿真实践教学平台的建设方法,包括基于UniSim的全尺度仿真对象搭建和基于OPC服务器的数据接口开发,使学生可以通过OPC客户端直接控制全仿真对象。

关键词:自动化;实践教学平台;全仿真;OPC

中图分类号:G642.0 文献标志码:A 文章编号:1674-9324(2018)24-0149-04

一、引言

独立解决被控对象的状态参数测量、控制方案设计和控制系统投用是自动化专业本科生重要的培养目标。所以,自动化专业课程体系中设置了与培养目标相对应的(配套的)理论教学和实践教学。目前,教师课堂讲授是理论教学的主要方式。通过系统的理论教学,学生一般可以较好理解和掌握自动化专业的基础理论。在实践教学方面,由于不同学校依托的行业背景不同,所以实践教学环节比较多样化[1]。中国石油大学(北京)自动化专业的定位是“突出石油石化行业特点,强化专业技能训练”,本科实践教学主要依托校内的炼油化工领域典型生产单元的缩比仿真模型和校外的炼化企业。但是,缩比仿真模型不能完全复现实际的生产过程特性,特别是在时间尺度方面,不能进行全时间尺度的仿真与操作。受限于生产过程的高温、高压、有毒等危险因素的影响,学生在校外炼化企业开展实践教学过程中无法进行实际操作,校外实践效果甚微[2]。所以,目前的实践教学条件导致毕业生整体呈现解决实际问题能力与理论基础不匹配的现象,进而出现用人单位招聘不到可用技术人员和学生找不到合适工作的双重问题[3]。为了提高自动化专业本科生的实践教学水平,探讨自动化专业全仿真实践教学平台建设方案。提供一个基于UniSim工业软件开发炼油化工领域全尺度仿真对象及其与控制算法进行实时通讯的方法。通过该方法,学生可以编写控制算法并通过通信接口控制全尺度仿真对象,以验证算法的可行性。搭建仿真教学平台的基本步骤包括:第一步,在UniSim工业软件环境下建立全尺度动态仿真对象;第二步,采用VB软件读取仿真对象的物性参数,特别是读取被控变量和操作变量;第三步,开发集成了仿真对象物性参数的OPC服务器,实现与具有OPC客户端功能的控制算法进行通讯。

二、全尺度动态仿真对象的开发

本文以原油常压蒸馏工艺为例,在UniSim软件平台上通过设置流程的物性参数和时间尺度参数,搭建全仿真实践教学平台的动态仿真对象[4],主要步骤包括选择物性包、选择基本组分、对原油划分虚拟组分、安装物流和操作单元、检查最终结果等。工艺流程中的操作单元主要包括预闪蒸、加热炉、混合器和常压蒸馏塔等,产品包括汽油、柴油等。具体操作请参考UniSim軟件使用指南,本文不再赘述。

三、全仿真对象物性参数的读取

本文以VB读取预闪蒸操作单元的数据为例,给出全仿真对象物性参数读取方法,为OPC服务器开发提供数据源。读取数据的步骤为:

第一步:建立VB开发环境与常压蒸馏工艺模型之间的连接

启动UniSim程序,打开常压蒸馏工艺主流程图。然后,在VB的菜单“工具”下“引用”中,选中“UniSim Type Library”,引入UniSim的类库,然后声明自动化对象,语法格式为:

Public unisimApp As UniSimDesign.Application

Public unisimCases As SimulationCases

Public unisimCase As SimulationCase

其中,Application对象代表了UniSim程序本身。SimulationCases代表了一个正在运行的UniSim程序中的所有模型案例,SimulationCase代表了其中的一个,后者是前者中的一个子案例。声明自动化对象后,使用如下方法连接UniSim模型:

Set unisimApp = GetObject(,"UniSimdesign.Application")或

Set unisimApp = CreateObject("UniSimdesign.Application","192.168.1.1")

Set unisimCases = unisimApp.SimulationCases

Set unisimCase = unisimCases.Item(0)

其中,GetObject和CreateObject语句均可成功连接到UniSim模型。UniSimdesign.Application在这里指向的就是当前环境中正在运行的常压蒸馏工艺主流程图。若VB程序连接的流程图在另外一台计算机上,可以使用CreateObject语句,括号内逗号后的IP地址代表了局域网内运行了UniSim的计算机的地址。为了方便,将unisimCases声明为程序中所有的案例集合,若只有一个运行的模拟案例,则该案例为集合中的第一个也是唯一一个,可用“.Item(0)”来指代和引用,若还有其他的案例则可依次类推进行声明。

第二步:声明预闪蒸操作单元

下面定义和声明模型中的对象,包括模型的流程、物流集合、操作单元以及物流,语法格式为:

Public MainFlow As Flowsheet

Public SubFlow As Flowsheet

Public MainStream As Streams

Public SubStream As Streams

Set MainFlow = unisimCase.Flowsheet

Set SubFlow = MainFlow.Flowsheets(0)

Set MainStream = MainFlow.MaterialStreams

Set SubStream = SubFlow.MaterialStreams

本例中有两个流程,MainFlow和SubFlow。MainFlow是主流程,定义为案例(SimulationCase)的Flowsheet,即流程;SubFlow为子流程,本例中为常压塔的流程图,可认为是主流程中的第一个子流程,用“.Flowsheets(0)”来声明。主流程中的物流(MainStream)定义在主流程对象(MainFlow)中,子流程的物流(SubStream)定义在子流程对象(SubFlow)中,均用“.MaterialStreams”来声明。在定义和声明模型中对象的基础上,下面定义预闪蒸操作单元。

Dim PreFlash As Object

Set PreFlash = MainFlow.Operations.Item(0)

预闪蒸(PreFlash)为主流程的Operations的第一个单元,用“.Item(0)”来声明,类似的可以依次对第二个、第三个等单元进行对象声明。

第三步:读取预闪蒸操作单元的数据

基于第一步和第二步就可以读取对象的数据了。由于每个对象所包含的属性各不相同,有的包含有压力、温度数据,有的则是流量、压降数据,所以在数据读取的过程中需要进行区分,不同对象的不同参数值需要对应定义不同的变量,但是每个数据的读取方法却都是相同的。读取预闪蒸操作单元的数据方法如下:

Text1.Text = PreFlash.VesselTemperature

Text2.Text = PreFlash.VesselPressure

Text3.Text = PreFlash.LiquidPercentLevelValue

讀取数据时在对象后用“.”加上所需要的属性名即可,如上述的温度(VesselTemperature)、压力(VesselPressure)等。其他的操作单元和物流均与此相同,只是对应的属性不一样而已。

四、OPC服务器的开发

OPC服务器开发包括两部分内容,分别是开发与预闪蒸操作单元数据连接的接口和开发OPC服务器标准接口。本文利用开发工具WtOPCServer.dll开发OPC服务器[5]。WtOPCServer.dll中封装了COM和OPC规范等细节信息,只需要开发人员熟练地调用接口函数便可以完成OPC接口的开发。下面给出开发OPC服务器的步骤。

第一步:声明函数

声明开发工具中用于开发OPC服务器的函数,只有声明成功后才可以在VB中使用这些函数。

(1)服务器初始化函数声明

Declare Function InitWTOPCsvr Lib "WtOPCSvr" Alias "_InitWTOPCsvr@8" (ByRef CLSID_Svr As Byte,ByVal ServerRate As Long) As Long

实现DCOM的初始化并在计算机中创建OPC服务器对象。其中参数CLSID_Svr为OPC服务器的类标识(CLSID),用于计算机和OPC客户端识别和连接服务器;参数ServerRate定义服务器的数据刷新速率,单位为毫秒。若该函数调用成功返回值为TRUE,否则为FALSE。

(2)服务器注册函数声明

Declare Function UpdateRegistry Lib "WtOPCSvr" Alias "_UpdateRegistry@16" (ByRef CLSID_Svr As Byte,ByRef Name As Byte,ByRef Descr As Byte,ByRef ExePath As Byte) As Long

(3)服务器注销函数声明

Declare Function UnregisterServer Lib "WtOPCSvr" Alias "_UnregisterServer@8" (ByRef CLSID_Svr As Byte,ByRef Name As Byte) As Long。

(4)标签创建函数声明

Declare Function CreateTag Lib "WtOPCSvr" Alias "_CreateTag@28" (ByRef Name As Byte,ByVal Value As Variant,ByVal InitialQuality As Integer,ByVal IsWritable As Long) As Long

作用是建立OPC服务器的过程标签,Name为字符串,表明了所建标签的名字,为服务器可接受的文本字符串;参数Value定义了标签的初始值,为Variant类型;参数InitialQuality定义标签的OPC品质属性;参数IsWritable定义标签是否可写,可写为TRUE,否则为FALSE。标签创建成功会返回一个长整型值,为创建标签的句柄值,是标签的唯一识别值,在对标签进行各种操作时起识别作用。

(4)标签删除函数声明

Declare Function RemoveTag Lib "WtOPCSvr" Alias "_RemoveTag@4" (ByVal TagHandle As Long) As Long:。作用就是在服务器结束进程时将所创建的过程标签删除,TagHandle为创建标签时所生成的句柄。

(5)标签刷新函数声明

Declare Function UpdateTag Lib "WtOPCSvr" Alias "_UpdateTag@24" (ByVal TagHandle As Long,ByVal Value As Variant,ByVal Quality As Integer) As Long

其作用是刷新过程标签的数据值。参数TagHandle是句柄,由标签创建函数在创建标签时得到;参数Value为标签要更新的值;参数Quality为标签属性条件。若函数调用成功返回值在为TRUE,否则返回FALSE。

(6)调用写函数的函数声明

Declare Function EnableWriteNotification Lib "WtOPCSvr" Alias "_EnableWriteNotification@8" (ByVal Callback As Long,ByVal ConvertToNative As Long) As Long

当用户对服务器中标签的数据进行写操作时会触发该函数,从而调用相应的写函数完成该操作。

第二步:注册服务器

利用第一步声明的UpdateRegistry在计算机中注册OPC服务器,以便OPC客户端与其进行连接。

UpdateRegistry GUID(0),SerName(0),Desc(0),ExePath(0)

注意,UpdateRegistry函数的输入值的类型为Byte,故在使用前要把各数据转换为Byte类型。

GUID为全局唯一标示符,在Windows系统中称为Class ID,即CLSID,是系统对不同应用程序分配的唯一的表示该程序的ID代码,通常为一个128位的随机数,在创建OPC服务器时需要人为定义一个CLSID,可以是任意的。在注册成功后系统会将相关信息注册至注册表中。SerNam为创建的服务器的名字,Desc为服务器描述,ExePath为服务器的路径。

第三步:初始化服务器

创建了服务器后还需要进行初始化才可以进行数据通信,初始化的主要作用是完成有关COM/DCOM的初始化,并且创建OPC服务器接口对象,使OPC客户可顺利连接到服务器。

InitWTOPCsvr GUID(0),1000

初始化通过GUID来识别服务器,这里设置其数据刷新速率为1000毫秒,也可根据具体的需要进行设置。

第四步:创建标签

创建标签用到上文声明的标签创建函数,語法格式为:

TagHandle(0) = CreateTag(TagName(0),Value,192,True)

TagHandle为当前创建的标签的句柄,具有唯一性。TagName为标签的名字,由用户自行定义,需要注意的是这里TagName的数据类型为Byte。若标签名定义为“##.%%”则函数会自动创建一个组,组名为“##”,组内包含了一个标签,标签名为“%%”,若再创建一个标签为“##.$$”,则该标签就会和前一个分在同一组下,标签名为“$$”,这一性质为创建具有相关性的一组标签提供了可行性,在UniSim模型中有许多标签的数据来自同一个对象,利用该方法可以很好地将不同对象的标签区别开,分组定义。Value为标签的数据值,192表示当前标签属性为GOOD,True表示标签可写。

通过该语句就可以在服务器中创建标签,对于一个UniSim模型,有大量的数据需要定义,本文在标签的创建中用了以下方法,仍然以主流程的预闪蒸为例,创建其第一个属性标签。

Dim x As String

Dim y As Variant

Dim UniObj As Object

Set UniObj = MainFlow.Operations.Item(0)

x = "Main Flow." & UniObj & "." & "Vessel Temperature"

y = UniObj.VesselTemperature

TagHandle(0) = CreateTag(TagName(0),y,192,True)

程序定义了一个临时对象UniObj,用来引用UniSim中的不同设备单元。x为字符串变量,通过上面的定义方法可以省去对每个对象一一定义的麻烦。

第五步:刷新标签

标签创建完成后需要对各个标签进行刷新,保持数据值的实时更新,通常在定时器中调用标签刷新函数来完成。

UpdateTag TagHandle(0),Value,192

TagHandle为标签句柄,作用是为了识别标签;Value为标签数据值的刷新值;192依然是表明当前标签的属性为GOOD。与创建标签时相同,刷新UniSim中的标签数量巨大,本文使用了如下的方式,通过定义一个临时对象变量来完成赋值。

Set UniObj = MainFlow.Operations.Item(0)

y = UniObj.VesselTemperature

UpdateTag TagHandle(0),y,192

第六步:注销服务器

利用服务器进行通信完成后,需要关闭和注销服务器。首先要删除服务器创建的所有标签,使用RemoveTag函数,其中的TagHandle为标签句柄,对于有多个标签的服务器来说可以使用循环语句删除标签。注销使用UnregisterServer函数,GUID和SerName分别为服务器标示和名字。语法格式为:

RemoveTag TagHandle(0)

UnregisterServer GUID(0),SerName(0)

第七步:OPC服务器界面设计

服务器包括六个按钮,在每个按钮中通过调用函数实现相应的功能,包括注册服务器、初始化服务器、连接UniSim、创建标签、刷新标签、注销服务器。

五、实验结果

本文设计的OPC服务器将UniSim模型的仿真数据制作为符合OPC通信标准的标签,可由客户端读取。为了测试服务器运行情况,使用Matrikon OPC Explorer读取服务器创建的数据标签,读取OPC服务器数据的结果。

六、结论

针对自动化专业本科生实践教学环节中现场实习缺少实操训练和实验室实验对象与工程设备不匹配的问题,探讨了全尺度仿真实践教学平台的建设方法。基于该方法,学生可以根据实践环节的具体需求,依托UniSim软件搭建与工业实际生产装置具有相同参数的仿真模型,用于产生全时间尺度的工艺数据。利用开发工具WtOPCServer.dll编写OPC服务器程序,将仿真模型生成的工艺数据封装为符合OPC通信标准的标签数据。学生设计的带有OPC客户端的监控系统通过与OPC服务器通信,实现对生产装置仿真模型的控制。本文给出实践教学平台建设方法极大地丰富了实践教学内容,提高了学生操作实际生产装置的能力。

参考文献:

[1]李清泉.强化高校科技优势转化 提升高素质人才培养质量[J].中国高教研究,2011,(12):16-18.

[2]聂建英,罗雄麟,左信.自动化专业实践教学基地建设研究[J].中国电力教育,2012,(15):80-82.

[3]张宏伟,张英琦,王新环.自动化专业校内外实践基地建设与实践教学改革[J].实验室研究与探索,2013,32(11):448-451.

[4]朱玉杰.UniSim单元模型二次开发及外部通信研究[N].北京:中国石油大学(北京),2008.

[5]WinTECH Software Design.WTOPCSvr[Z].DLL User's Guide.

猜你喜欢

自动化
国内焊接设备市场现状及发展趋势研究
电气工程及其自动化问题与对策
我国机械设计制造及其自动化的现状及发展趋势
浅论节能设计理念在机械制造与自动化中的应用
简析火力发电厂热工自动化仪表应用及故障排除方法
配网自动化实用化模式建设及系统运行