北京科技大学软件课程设计报告自动化专业之欧阳物创编.docx

上传人:b****3 文档编号:4001371 上传时间:2022-11-27 格式:DOCX 页数:24 大小:160.11KB
下载 相关 举报
北京科技大学软件课程设计报告自动化专业之欧阳物创编.docx_第1页
第1页 / 共24页
北京科技大学软件课程设计报告自动化专业之欧阳物创编.docx_第2页
第2页 / 共24页
北京科技大学软件课程设计报告自动化专业之欧阳物创编.docx_第3页
第3页 / 共24页
北京科技大学软件课程设计报告自动化专业之欧阳物创编.docx_第4页
第4页 / 共24页
北京科技大学软件课程设计报告自动化专业之欧阳物创编.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

北京科技大学软件课程设计报告自动化专业之欧阳物创编.docx

《北京科技大学软件课程设计报告自动化专业之欧阳物创编.docx》由会员分享,可在线阅读,更多相关《北京科技大学软件课程设计报告自动化专业之欧阳物创编.docx(24页珍藏版)》请在冰豆网上搜索。

北京科技大学软件课程设计报告自动化专业之欧阳物创编.docx

北京科技大学软件课程设计报告自动化专业之欧阳物创编

北京科技大学

时间:

2021.02.07

命题人:

欧阳物

课程设计(软件设计)

报告

班级:

姓名:

学号:

同组同学:

指导教师:

曾慧

日期:

2014年11月13日

 

1设计内容

1.1实验目的

通过实际操作进一步了解OPC的各种概念,掌握OPC客户端的编写方法。

并对微软的DCOM有一定的了解,要求通过合适的DCOM配置,使客户端能够读取网络上服务器中的数据。

1.2实验内容

1)利用VB语言编写出一个简单的OPC客户端程序,要求这个客户端能够读取服务器中的数据,并显示出来。

2)配置DCOM,使客户端能够能过DCOM读取另一台服务器上的数据。

2应用程序总体分析与设计

应用程序与OPC服务器进行连接并读取服务器端的数据,同时把读取到的数据通过棒柱和文本框显示,并可以保存数据便于查找,同时应用了Picture控件对实时数据变化趋势分析。

2.1项目建立

2.1.1建立一个VisualBasic工程

1)启动VisualBasic,新建一个VisualBasic工程。

选择[StandardEXE]作为新建工程的类型。

图2.1VisualBasic工程的建立

2.2OPC建立

2.2.1设置OPC包装DLL

对OPC包装DLL进行注册:

从VisualBasic菜单里选择[Project]-[References]。

在[AvailableReferences]表示中,选择[OPCAutomation2.0]。

图2.2引用的设置

2.2.2建立一个OPC对象

在VisualBasic里,是以对象的单位对OPC服务器进行访问。

OPC自动化接口是由以下四种对象所定义。

OPC服务器

OPC组(OPC组集合)

OPC标签(OPC标签集合)

OPC浏览器

1)变量声明

图2.3OPC对象变量的声明

其中,部分变量声明意义见表所示。

表2.1OPC对象变量的声明

变量名

说明

objServer

OPCServer对象,用于连接OPC服务器。

objGroups

OPCGroups对象,用于添加OPC组的OPC组集合

objTestGrp

OPCGroup对象,演示用的OPC组。

objItems

OPCItems对象,用于添加OPC标签的OPC标签集合。

lServerHandles()

长整型的数组,用于保存OPC标签的服务器句柄。

3应用程序各功能模块分析与设计

3.1界面设计

图3.1界面效果图

窗体中所使用的控件种类如表3.1所示。

表3.1FmMain的控件

控件

名称

窗体(Form)

FmMain

命令按钮(CommandButton)

BtnConnect

命令按钮(CommandButton)

BtnAddItem

命令按钮(CommandButton)

BtnQuit

命令按钮(CommandButton)

BtnSave

命令按钮(CommandButton)

BtnStop

命令按钮(CommandButton)

Btndraw

定时器(Timer)

tmUpdate

定时器(Timer)

dataUpdate

对话框(CommonDialog)

CommonDialog1

图像(PictureBox)

picBar(作为数组使用,从左开始1~2)

标签(Label)

lbBar(作为数组使用。

从左开如1~2)

文本框(TextBox)

dataInfo

图像(Picture)

Picture1

3.2服务器的断开与链接

3.2.1连接OPC服务器和建立OPC组

这里用“NEW”关键词生成OPC服务器的对象,然后调用OPC服务器对象的“Connect”方法,和OPC服务器连接。

Connect子程序如下:

'连接OPC服务器和建立OPC组

SubConnect(strProgIDAsString,OptionalstrNodeAsString)

IfobjServerIsNothingThen

'建立一个OPC服务器对象

SetobjServer=NewOPCServer

EndIf

IfobjServer.ServerState=OPCDisconnectedThen

'连接OPC服务器

objServer.ConnectstrProgID,strNode

EndIf

IfobjGroupsIsNothingThen

'建立一个OPC组集合

SetobjGroups=objServer.OPCGroups

EndIf

IfobjTestGrpIsNothingThen

'添加一个OPC组

SetobjTestGrp=objGroups.Add("TestGrp")

EndIf

EndSub

3.2.2添加OPC标签

对OPC服务器进行访问前,必须先在OPC组里添加要访问的OPC标签。

AddItem子程序如下:

‘添加OPC标签

SubAddItem()

DimstrItemIDs(8)AsString

DimlClientHandles

(2)AsLong

DimlErrors()AsLong

DimIAsInteger

IfobjTestGrpIsNothingThen

ExitSub

EndIf

IfNotobjItemsIsNothingThen

IfobjItems.Count>0Then

ExitSub

EndIf

EndIf

'设置组活动状态

objTestGrp.IsActive=True

'取消组非同期通知

objTestGrp.IsSubscribed=False

'建立OPC项集合

SetobjItems=objTestGrp.OPCItems

'生成标签的项标识符

ForI=1To2

strItemIDs(I)="TAG"

lClientHandles(I)=I

Next

'添加OPC项

CallobjItems.AddItems(8,strItemIDs,_

lClientHandles,lServerHandles,lErrors)

EndSub

3.2.3断开服务器

连接着OPC服务器的OPC应用程序,在退出前必须断开和OPC服务器的连接。

因为OPC服务器并不知道OPC应用程序的退出,如果不先断开连接,那么OPC服务器使用的计算机资源就不被释放。

如果这样的问题反复发生,久而久之,连续运转的自动控制系统可能会使计算机资源渐渐枯竭从而发生严重问题。

Disconnect子程序如下:

'断开OPC服务器

SubDisconnect()

DimlErrors()AsLong

IfNotobjItemsIsNothingThen

IfobjItems.Count>0Then

'清除OPC项

objItems.Remove2,lServerHandles,lErrors

EndIf

SetobjItems=Nothing

EndIf

IfNotobjTestGrpIsNothingThen

'清除OPC组

objGroups.Remove"TestGrp"

SetobjTestGrp=Nothing

EndIf

IfNotobjGroupsIsNothingThen

SetobjGroups=Nothing

EndIf

IfNotobjServerIsNothingThen

IfobjServer.ServerState<>OPCDisconnectedThen

'断开OPC服务器.

objServer.Disconnect

EndIf

SetobjServer=Nothing

EndIf

EndSub

3.3数据读取与显示

客户端使用2个定时器TmUpdate和dataUpdate,定时为1S。

在TmUpdate事件中调用同步读取数据函数SyncRead,每隔1S读取服务器端的数据,同时对棒柱的显示进行刷新。

在定时器dataUpdate事件中读取系统时间并不断刷新TextBox的内容,显示当前的时间和数据。

3.3.1棒状图显示

为了是显示更加人性化,对不同范围的数值显示采用了不同的颜色。

当数值过低或者过高时分别显示深蓝色和红色以示警告。

中间值显示绿色和橙黄色。

程序代码如下所示:

SyncReadOPCCache,vtItemValues,lErrors

'棒图的表示

ForI=1To2

'数据的格式化

strBuf=Format(vtItemValues(I),"###.000")

'表示数据字符串

lbBar(I).Caption=strBuf

dataTemp(I)=strBuf

'计算棒的宽和高

nWidth=picBar(I).ScaleWidth

nHeight=picBar(I).ScaleHeight

sglScale=vtItemValues(I)/100

nDrawHeight=CInt(nHeight*sglScale)

'清除现棒图

picBar(I).Cls

'绘制棒图

IfvtItemValues(I)

picBar(I).Line(0,nHeight-nDrawHeight)-(nWidth,nHeight),RGB(0,0,255),BF

Else

IfvtItemValues(I)

picBar(I).Line(0,nHeight-tHoldValue1/100*nHeight)-(nWidth,nHeight),RGB(0,225,0),BF

picBar(I).Line(0,nHeight-nDrawHeight)-(nWidth,(1-tHoldValue1/100)*nHeight),RGB(225,225,0),BF

Else

picBar(I).Line(0,nHeight-tHoldValue1/100*nHeight)-(nWidth,nHeight),RGB(0,225,0),BF

picBar(I).Line(0,nHeight-tHoldValue2/100*nHeight)-(nWidth,(1-tHoldValue1/100)*nHeight),RGB(225,225,0),BF

picBar(I).Line(0,nHeight-nDrawHeight)-(nWidth,(1-tHoldValue2/100)*nHeight),RGB(255,0,0),BF

EndIf

EndIf

IfI=1Then

y(num1)=vtItemValues(I)

num1=num1+1

Else

z(num2)=vtItemValues(I)

num2=num2+1

EndIf

Next

EndSub

3.3.2文本框显示

程序代码如下:

PrivateSubdataUpdate_Timer()

IfSaveFlagThen'保存数据结束后清除原来的数据

dataInfo.Text=Year(Now())&Month(Now())&Day(Now())&""&Hour(Now())&":

"&Minute(Now())&":

"&Second(Now())&""&"反应罐温度:

"&dataTemp

(1)&""&"反应罐液位:

"&dataTemp

(2)&Chr(13)&Chr(10)

SaveFlag=False

Else

dataInfo.Text=dataInfo.Text&Year(Now())&Month(Now())&Day(Now())&""&Hour(Now())&":

"&Minute(Now())&":

"&Second(Now())&""&"反应罐温度:

"&dataTemp

(1)&""&"反应罐液位:

"&dataTemp

(2)&Chr(13)&Chr(10)

EndIf

EndSub

3.4数据保存

此处定义bool型的SaveFlag为保存标志,在保存时停止对新的数据的接收。

主要用到CommonDialog控件。

该控件可用于创建“文件打开”、“文件保存”、“文件打印”、“颜色设置”、“字体设置”、“帮助”6种对话框。

程序代码如下所示:

PrivateSubBtnSave_Click()

TmUpdate.Enabled=False

dataUpdate.Enabled=False

CommonDialog1.DialogTitle="另存为"

CommonDialog1.DefaultExt="txt"

CommonDialog1.ShowSave

IfLen(CommonDialog1.FileName)>0Then

OpenCommonDialog1.FileNameForOutputAs#1

Print#1,dataInfo.Text

Close#1

SaveFlag=True

EndIf

EndSub

3.5实时曲线绘制

Picture是功能强大坐标图绘制软件,本次设计中采用VB中Picture控件进行实时曲线绘制。

在设计时添加2个系列曲线,代表两个通道,即温度和液位与时间的关系。

并在图中绘出两条警戒线,能更直观地比对数据的变化。

图3.2Picture设置

部分程序代码如下所示:

Picture1.Cls

IfCheck1.Value=0Then

Ifcol<201Then

Foru=1To2

Forj=colTocol

X=j

Y=vtItemValues(u)

px(j,u)=X

py(j,u)=Y

Nextj

Nextu

col=col+1

pl=pl+1

Else

Fors=1To2

Fort=1To199

px(t,s)=t

py(t,s)=py(t+1,s)

Nextt

py(200,s)=vtItemValues(s)

Nexts

EndIf

Else

col=col

EndIf

Ifpl>=2Then

Forw=1To2

Picture1.PSet(px(1,w),py(1,w))

Forj=2Tocol

Picture1.Line-(px(j-1,w),py(j-1,w)),QBColor(w*2)

Nextj

Nextw

EndIf

'画两条警戒线

Picture1.DrawWidth=2

Picture1.Line(0,150)-(200,150),vbRed

Picture1.Line(0,600)-(200,600),vbBlue

'指示警戒值,警戒值以上改变显示颜色

IflbBar

(1).Caption>150OrlbBar

(2).Caption>600Then

Label7.Caption="出现异常!

"

Else

Label7.Caption="正在观测!

"

EndIf

IflbBar

(1).Caption>150Then

Text2.Text="温度过高!

"

picBar

(1).Line(0,nHeight-nDrawHeight)-(nWidth,nHeight),_

RGB(255,0,0),BF

EndIf

IflbBar

(1).Caption<150Then

Text2.Text="温度平稳!

"

picBar

(1).Line(0,nHeight-nDrawHeight)-(nWidth,nHeight),_

RGB(0,255,0),BF

EndIf

IflbBar

(2).Caption>600Then

Text1.Text="液面过高!

"

picBar

(2).Line(0,nHeight-nDrawHeight)-(nWidth,nHeight),_

RGB(255,0,0),BF

4程序测试

4.1测试过程

运行程序后,先单击“连接”按钮,保证客户端连接上组态王数据库。

然后单击“加载”按钮,观察数据时候正常显示,棒柱的数据和颜色是否正常,文本框内的时间和数据是否正常以及看是否能实时显示曲线。

单击“保存数据”按钮,弹出对话框,选择路径,填写文件名后保存数据。

最后单击“退出”按钮,看成否正常退出程序。

运行程序,注意将bin文件夹放到工程下。

4.2测试结果

从测试结果上看,整个程序没有bug,各个功能正常。

从绘图的结果可以看出从服务器传来的数据是按正弦规律变化的。

图4.1程序测试图一

图4.2程序测试图二

图4.3保存数据

5程序文档

5.1使用说明

(1)运行程序,连接成功后,启动,此时棒状图以及文本框内就会显示反应罐温度和反应罐液位的值。

(2)当数据积累到一定程度之后,点击“绘图”按钮,应罐温度和反应罐液位数值变化曲线就会显示出来,每点击一次,就会刷新一次。

从而实现了数据的实时显示。

程序中数据刷新为1s,因此在点击“绘图”按钮时频率最好不要超过1s。

(3)保存数据。

点击“保存”按钮,会弹出对话框,输入响应的文件名保存便可。

保存数据后,所有历史数据会被清空。

5.2程序清单

OptionBase1

OptionExplicit

DimWithEventsobjServerAsOPCServer

DimobjGroupsAsOPCGroups

DimobjTestGrpAsOPCGroup

DimobjItemsAsOPCItems

DimlServerHandles()AsLong

Dimpx(200,2)AsSingle,py(200,2)AsSingle

DimcolAsInteger

DimplAsInteger

DimdataTemp

(2)AsString

DimDrawFlagAsBoolean

DimSaveFlagAsBoolean

SubConnect(strProgIDAsString,OptionalstrNodeAsString)

IfobjServerIsNothingThen

'建立一个OPC服务器对象

SetobjServer=NewOPCServer

EndIf

IfobjServer.ServerState=OPCDisconnectedThen

'连接OPC服务器

objServer.ConnectstrProgID,strNode

EndIf

IfobjGroupsIsNothingThen

'建立一个OPC组集合

SetobjGroups=objServer.OPCGroups

EndIf

IfobjTestGrpIsNothingThen

'添加一个OPC组

SetobjTestGrp=objGroups.Add("TestGrp")

EndIf

EndSub

SubAddItem()

DimstrItemIDs

(2)AsString

DimlClientHandles

(2)AsLong

DimlErrors()AsLong

DimIAsInteger

IfobjTestGrpIsNothingThen

ExitSub

EndIf

IfNotobjItemsIsNothingThen

IfobjItems.Count>0Then

ExitSub

EndIf

EndIf

'设置组活动状态

objTestGrp.IsActive=True

'取消组非同期通知

objTestGrp.IsSubscribed=False

'建立OPC项集合

SetobjItems=objTestGrp.OPCItems

'生成标签的项标识符

strItemIDs

(1)="反应罐温度.Value"

strItemIDs

(2)="反应罐液位.Value"

lClientHandles

(1)=1

lClientHandles

(2)=2

'添加OPC项

CallobjItems.AddItems(2,strItemIDs,_

lClientHandles,lServerHandles,lErrors)

EndSub

SubDisconnect()

DimlErrors()AsLong

IfNotobjItemsIsNothingThen

IfobjItems.Count>0Then

'清除OPC项

objItems.Remove2,lServerHandles,lErrors

EndIf

SetobjItems=Nothing

EndIf

IfNotobjTestGrpIsNothingThen

'清除OPC组

objGroups.Remove"TestGrp"

SetobjTestGrp=Nothing

EndIf

IfNotobjGroupsIsNothingThen

SetobjGroups=Nothing

EndIf

IfNotobjServerIsNothingThen

IfobjServer.ServerState<>OPCDisconnectedThen

'断开OPC服务器.

objServer.Disconnect

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1