软件课程设计报告北京科技大学.docx
《软件课程设计报告北京科技大学.docx》由会员分享,可在线阅读,更多相关《软件课程设计报告北京科技大学.docx(25页珍藏版)》请在冰点文库上搜索。
![软件课程设计报告北京科技大学.docx](https://file1.bingdoc.com/fileroot1/2023-6/27/8af60a3b-7f61-4134-b9ac-a89a5ba8d827/8af60a3b-7f61-4134-b9ac-a89a5ba8d8271.gif)
软件课程设计报告北京科技大学
北京科技大学
课程设计(软件设计)
报告
班级:
姓名:
学号:
指导教师:
日期:
年月日
1设计内容
OPC(OLEforProcessControl)又称为过程控制的对象连接与嵌入技术。
它是它的出现为基于Windows的应用程序和现场过程控制应用建立了桥梁。
在过去,为了存取现场设备的数据信息,每一个应用软件开发商都需要编写专用的接口函数。
由于现场设备的种类繁多,且产品的不断升级,往往给用户和软件开发商带来了巨大的工作负担。
通常这样也不能满足工作的实际需要,系统集成商和开发商急切需要一种具有高效性、可靠性、开放性、可互操作性的即插即用的设备驱动程序。
在这种情况下,OPC标准应运而生。
OPC标准以微软公司的OLE技术为基础,它的制定是通过提供一套标准的OLE/COM接口完成的,在OPC技术中使用的是OLE2技术,OLE标准允许多台微机之间交换文档、图形等对象。
OPC的出现大大缩短了软件开发的时间。
本次课程设计就是要求使用VB设计一个简单的客户端程序,这个程序能读取本机服务器上面的数据,并以直观的柱形图显示出来。
另外,还应该添加一些别的功能。
2应用程序总体分析与设计
为了能连接服务器,首先在PC机运行模拟的服务器。
然后,在VB6.0环境下,创建各种用于显示数据和控制的控件。
给每一个控件添加事件响应函数。
程序运行的流程如下:
3应用程序各功能模块分析与设计
3.1连接服务器
首先使用new关键字创建一个OPC对象,然后调用Connect方法连接到服务器。
然后书写连接按钮的响应函数。
PrivateSubBtnConnnect_Click()
'调用Connect子程序
CallConnect("OPCJ.SampleServer.1")
EndSub
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加项
对OPC服务器进行访问前,必须先在OPC组里添加要访问的OPC标签。
这里添加OPC标签的标识符和数目是固定的,但是实际的OPC应用程序往往要按照用户的指定或读取组态文件取得和处理需要添加OPC标签。
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
PrivateSubbtnAddItem_Click()
'调用AddItem子程序
CallAddItem
IfNotobjTestGrpIsNothingThen
IfobjTestGrp.OPCItems.Count>0Then
'启动定时器
TmUpdate.Enabled=True
Else
EndIf
EndIf
EndSub
3.3读取数据
为了实时显示数据,还要设置一个定时中断类型的服务函数,然后没间隔一段时间去向服务器读取一下数据。
定时器会在加载项的时候启动。
PrivateSubtmUpdate_Timer()
DimvtItemValues()AsVariant
DimlErrors()AsLong
DimstrBufAsString
DimnWidthAsInteger
DimnHeightAsInteger
DimnDrawHeightAsInteger
DimsglScaleAsSingle
DimIAsInteger
'同期读取
SyncReadOPCCache,vtItemValues,lErrors
'棒图的表示
ForI=1To4
'数据的格式化
IfPauseFlag(I)=0Then
strBuf=Format(vtItemValues(I),"###.000")
'表示数据字符串
lbBar(I).Caption=strBuf
'计算棒的宽和高
nWidth=PicBar(I).ScaleWidth
nHeight=PicBar(I).ScaleHeight
sglScale=vtItemValues(I)/100
nDrawHeight=CInt(nHeight*sglScale)
'清除现棒图
PicBar(I).Cls
'绘制棒图
'IfvtItemValues(I)<20OrvtItemValues(I)>90Then
'PicBar(I).Line(0,nHeight-nDrawHeight)-(nWidth,nHeight),RGB(255,0,0),BF
'Else
'PicBar(I).Line(0,nHeight-nDrawHeight)-(nWidth,nHeight),RGB(0,255,0),BF
'EndIf
PicBar(I).Line(0,nHeight-nDrawHeight)-(nWidth,nHeight),RGB(vtItemValues(I)*2.55,255-vtItemValues(I)*2.55,0),BF
EndIf
Next
IfFileFlag=1Then
Print#FileNo,Date;Time,Str(vtItemValues
(1)),Str(vtItemValues
(1)),Str(vtItemValues
(1)),Str(vtItemValues
(1))
EndIf
EndSub
3.4显示与隐藏
为了方便显示与隐藏其中某些项,这里给一个柱形图配置一个复选框,当复选框选中的时候,该项目便隐藏起来。
取消复选框,该项目又会显示出来。
这样子的功能对于只需要观察某些数据的时候,很是方便。
具体实现方式如下:
PrivateSubCheck1_Click()
IfCheck1.Value=1Then
PicBar
(1).Visible=False
lbBar
(1).Visible=False
Label1.Visible=False
Else
PicBar
(1).Visible=True
lbBar
(1).Visible=True
Label1.Visible=True
EndIf
EndSub
PrivateSubCheck2_Click()
IfCheck2.Value=1Then
PicBar
(2).Visible=False
lbBar
(2).Visible=False
Label2.Visible=False
Else
PicBar
(2).Visible=True
lbBar
(2).Visible=True
Label2.Visible=True
EndIf
EndSub
PrivateSubCheck3_Click()
IfCheck3.Value=1Then
PicBar(3).Visible=False
lbBar(3).Visible=False
Label3.Visible=False
Else
PicBar(3).Visible=True
lbBar(3).Visible=True
Label3.Visible=True
EndIf
EndSub
PrivateSubCheck4_Click()
IfCheck4.Value=1Then
PicBar(4).Visible=False
lbBar(4).Visible=False
Label4.Visible=False
Else
PicBar(4).Visible=True
lbBar(4).Visible=True
Label4.Visible=True
EndIf
EndSub
3.5暂停与继续
在实际生产环境中,遇到一些特殊情况需要暂停以观察数据,以防止被后面新的数据刷新。
所以四个柱形图又都配置了一个暂停复选框,当复选框选中的时候,柱形图暂停更新,当取消复选框,柱形图继续更新。
实现代码如下:
PrivateSubCheck5_Click()
IfCheck5.Value=1Then
PauseFlag(4)=1
Else
PauseFlag(4)=0
EndIf
EndSub
PrivateSubCheck6_Click()
IfCheck6.Value=1Then
PauseFlag
(1)=1
Else
PauseFlag
(1)=0
EndIf
EndSub
PrivateSubCheck7_Click()
IfCheck7.Value=1Then
PauseFlag
(2)=1
Else
PauseFlag
(2)=0
EndIf
EndSub
PrivateSubCheck8_Click()
IfCheck8.Value=1Then
PauseFlag(3)=1
Else
PauseFlag(3)=0
EndIf
EndSub
其中的PauseFlag是个全局变量用于指示该柱形图的数据是不是暂停了,如果是,在程序刷新的过程中则不对其刷新。
3.6报表与记录
工业生产中,保留历史数据是必须的。
为了分析一些特殊情况下的原因,必须要知道相关的数据,所以保留历史数据是很重要的部分。
数据量大的时候可以使用数据库,但是小数据量可以使用文件保存数据的方式。
这里,使用文件的方式记录读取的数据。
PrivateSubCheck9_Click()
FileFlag=Check9.Value
IfFileFlag=1Then
FileNo=FreeFile()
Open"C:
\Users\Cheng\Desktop\shunjun\"&Str(Year(Now))&"年"&Str(Month(Now))&"月"&Str(Day(Now))&"日.txt"ForAppendAsFileNo
Else
CloseFileNo
EndIf
EndSub
当保存文件复选框选中的时候,打开今天所对应的文件,当取消选中的时候,关闭打开的文件。
如果文件打开,相应的变量的状态会更改以指示当前需要向文件中写入数据,所以定时中断的时候,会向文件中写入数据。
IfFileFlag=1Then
Print#FileNo,Date;Time,Str(vtItemValues
(1)),Str(vtItemValues
(1)),Str(vtItemValues
(1)),Str(vtItemValues
(1))
EndIf
4程序测试
4.1测试过程
软件的测试主要包含连接测试,显示与隐藏测试,暂停测试和数据记录测试。
4.1.1连接测试
打开程序,点击运行。
然后分别点击连接和加项按钮。
图4-1连接测试
4.1.2显示与隐藏测试
在程序运行状态下,选中隐藏复选框。
图4-2显示与隐藏
4.1.3暂停按钮
取消所有隐藏复选框,然后选中部分暂停按钮。
如下图所示
图4-3暂停
4.1.4数据保存
选中保存数据复选框,记录当前时间,过30秒取消选中。
图4-4保存数据
4.2测试结果
4.2.1连接结果
为了更方便的显示结果,显示的颜色会随着数据的变化而变化,数据越接近于100柱形图的颜色就越接近于红色。
数据越接近于0,柱形图颜色越接近于绿色。
图4-5数据显示测试
4.2.2显示与隐藏结果
勾选前两个隐藏复选框后,发现相关的内容隐藏了。
图4-6显示与隐藏
4.2.3暂停显示
勾选暂停显示后,相应的柱形图不再同旁边的数据一起刷新了。
图4-7暂停显示
4.2.4数据保存结果
当勾选保存数据复选框后,数据便被写入当天的文本文件。
下图中左边一列记录的日期和时间,右边记录的是四个变量的数据。
图4-8数据保存
5程序文档
5.1使用说明
双击shunjun文件夹中的“工程1.exe”,程序开始执行。
连接->加项,数据就能正常显示了。
隐藏,暂停和保存数据复选框分别控制的是隐藏柱形图,柱形图暂停更新和保存文件。
5.2程序说明
OptionBase1
OptionExplicit
'建立OPC对象-声明变量
DimWithEventsobjServerAsOPCServer
DimobjGroupsAsOPCGroups
DimWithEventsobjTestGrpAsOPCGroup
DimobjItemsAsOPCItems
DimlServerHandles()AsLong
DimPauseFlag(1To4)AsInteger
DimFileFlagAsInteger
DimFileNo
PrivateSubBtnConnnect_Click()
'调用Connect子程序
CallConnect("OPCJ.SampleServer.1")
EndSub
PrivateSubbtnAddItem_Click()
'调用AddItem子程序
CallAddItem
IfNotobjTestGrpIsNothingThen
IfobjTestGrp.OPCItems.Count>0Then
'启动定时器
TmUpdate.Enabled=True
Else
EndIf
EndIf
EndSub
PrivateSubbtnQuit_Click()
'卸载窗体
UnloadFmMain
EndSub
PrivateSubCheck1_Click()
IfCheck1.Value=1Then
PicBar
(1).Visible=False
lbBar
(1).Visible=False
Label1.Visible=False
Else
PicBar
(1).Visible=True
lbBar
(1).Visible=True
Label1.Visible=True
EndIf
EndSub
PrivateSubCheck2_Click()
IfCheck2.Value=1Then
PicBar
(2).Visible=False
lbBar
(2).Visible=False
Label2.Visible=False
Else
PicBar
(2).Visible=True
lbBar
(2).Visible=True
Label2.Visible=True
EndIf
EndSub
PrivateSubCheck3_Click()
IfCheck3.Value=1Then
PicBar(3).Visible=False
lbBar(3).Visible=False
Label3.Visible=False
Else
PicBar(3).Visible=True
lbBar(3).Visible=True
Label3.Visible=True
EndIf
EndSub
PrivateSubCheck4_Click()
IfCheck4.Value=1Then
PicBar(4).Visible=False
lbBar(4).Visible=False
Label4.Visible=False
Else
PicBar(4).Visible=True
lbBar(4).Visible=True
Label4.Visible=True
EndIf
EndSub
PrivateSubCheck5_Click()
IfCheck5.Value=1Then
PauseFlag(4)=1
Else
PauseFlag(4)=0
EndIf
EndSub
PrivateSubCheck6_Click()
IfCheck6.Value=1Then
PauseFlag
(1)=1
Else
PauseFlag
(1)=0
EndIf
EndSub
PrivateSubCheck7_Click()
IfCheck7.Value=1Then
PauseFlag
(2)=1
Else
PauseFlag
(2)=0
EndIf
EndSub
PrivateSubCheck8_Click()
IfCheck8.Value=1Then
PauseFlag(3)=1
Else
PauseFlag(3)=0
EndIf
EndSub
PrivateSubCheck9_Click()
FileFlag=Check9.Value
IfFileFlag=1Then
FileNo=FreeFile()
Open"C:
\Users\Cheng\Desktop\shunjun\"&Str(Year(Now))&"年"&Str(Month(Now))&"月"&Str(Day(Now))&"日.txt"ForAppendAsFileNo
Else
CloseFileNo
EndIf
EndSub
PrivateSubForm_Load()
TmUpdate.Enabled=False
TmUpdate.Interval=1000
EndSub
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(4)AsString
DimlClientHandles(4)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(4)="TAG4"
strItemIDs
(1)="TAG1"
strItemIDs
(2)="TAG2"
strItemIDs(3)="TAG3"
lClientHandles(4)=4
lClient