北京科技大学软件课程设计报告自动化专业.docx
《北京科技大学软件课程设计报告自动化专业.docx》由会员分享,可在线阅读,更多相关《北京科技大学软件课程设计报告自动化专业.docx(30页珍藏版)》请在冰豆网上搜索。
北京科技大学软件课程设计报告自动化专业
科技大学
课程设计(软件设计)
报告
班级:
姓名:
学号:
同组同学:
指导教师:
曾慧
日期:
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