VB编写OPC客户端程序
手把手教您用VB编一个OPC客户端程序33页PPT

序
21、没有人陪你走一辈子,所以你要 适应孤 独,没 有人会 帮你一 辈子, 所以你 要奋斗 一生。 22、当眼泪流尽的时候,留下的应该 是坚强 。 23、要改变命运,首先改变自己。
24、勇气很有理由被当作人类德性之 首,因 为这种 德性保 证了所 有其余 的德性 。--温 斯顿. 丘吉尔 。 25、梯子的梯阶从来不是用来搁脚的 ,它只 是让人 们的脚 放上一 段时间 ,以便 让别一 只脚能不会再掉进坑里。——黑格尔 32、希望的灯一旦熄灭,生活刹那间变成了一片黑暗。——普列姆昌德 33、希望是人生的乳母。——科策布 34、形成天才的决定因素应该是勤奋。——郭沫若 35、学到很多东西的诀窍,就是一下子不要学很多。——洛克
vb与欧姆龙OPC服务器编程实例(读取PLC100个内存的vb源代码)

Option ExplicitOption Base 1 ' All OPC Automation Arrays start with 1Dim MyOPCServer As OPCServer ' OPCServer ObjectDim MyGroups As OPCGroups ' OPCGroups Collection ObjectDim WithEvents MyGroup As OPCGroup ' OPCGroup ObjectDim MyItems As OPCItems ' OPCItems Collection ObjectDim MyItemServerHandles() As Long ' Server Handles for ItemsDim MyTID As Long ' Transaction ID for asynchronous calls Private Sub Command1_Click()Dim Errors() As LongCall MyItems.Remove(100, MyItemServerHandles, Errors)MyGroups.RemoveAllSet MyGroup = NothingSet MyGroups = NothingMyOPCServer.DisconnectSet MyOPCServer = NothingEnd SubPrivate Sub Command2_Click()PFAsyncWriteCommandEnd SubPrivate Sub Command3_Click()Form_LoadEnd SubPrivate Sub Form_Load()MyTID = 1Set MyOPCServer = New OPCServerCall MyOPCServer.Connect("OMRON.OPC.2")Set MyGroups = MyOPCServer.OPCGroupsMyGroups.DefaultGroupUpdateRate = 500MyGroups.DefaultGroupIsActive = TrueSet MyGroup = MyGroups.Add("Group1")MyGroup.IsSubscribed = TrueMyGroup.IsActive = TrueMyGroup.UpdateRate = 500Dim ErrorFlag As BooleanDim ItemObj As OPCItemDim ItemIDs(100) As StringDim ItemClientHandles(100) As LongDim Errors() As LongErrorFlag = FalseSet MyItems = MyGroup.OPCItemsDim m As IntegerFor m = 0 To 3Text1(m).ForeColor = vbRedText1(m).FontSize = 15Text2(m).ForeColor = vbRedText2(m).FontSize = 15NextFor m = 4 To 99Text1(m).ForeColor = vbBlueText1(m).FontSize = 15NextFor m = 1 To 100ItemIDs(m) = "Device.Group1.Tag" & CStr(m)ItemClientHandles(m) = mNextCall MyItems.AddItems(100, ItemIDs, ItemClientHandles, MyItemServerHandles, Errors)End SubPrivate Sub MyGroup_DataChange(ByVal TransactionID As Long, ByVal NumItems As Long, ClientHandles() As Long ItemValues() As Variant, Qualities() As Long, TimeStamps() As Date)On Error GoTo ErrorHandler '订阅方式回馈信息存储Dim i As LongFor i = 1 To NumItemsIf ClientHandles(i) > 0 And ClientHandles(i) < 101 ThenIf Qualities(i) = 192 Thendata1(ClientHandles(i)) = ItemValues(i)Else' MsgBox GetQualityText(Qualities(i))End IfElseMsgBox "DataChange Item " + Str$(i) + " has invalid Client Handle ", vbCriticalEnd IfNextExit SubErrorHandler:MsgBox Err.Description + Chr(13) + "OnDataChange", vbCritical, "ERROR"End SubPrivate Sub Timer1_Timer()Dim i As IntegerFor i = 1 To 100Text1(i - 1).Text = data1(i)Next iEnd SubPublic Sub PFAsyncWriteCommand() '异步写入命令On Error GoTo ErrorHandlerDim i, j As LongDim Values(4) As VariantDim Errors() As LongDim CID As LongDim AsyncHandles(4) As LongFor j = 1 To 4AsyncHandles(j) = MyItemServerHandles(j)Values(j) = Text2(j - 1).TextNextMyTID = MyTID + 1Call MyGroup.AsyncWrite(4, AsyncHandles, Values, Errors, MyTID, CID)For i = 1 To 4If Not Errors(i) = 0 Then MsgBox "Item " + Str$(i) + " FAILED. Error Code = " + Str$(Errors(i)), vbCritical NextExit SubErrorHandler:MsgBox Err.Description + Chr(13) + "Writing Items Asyncronous", vbCritical, "ERROR"End SubPrivate Sub MyGroup_AsyncWriteComplete(ByVal TransactionID As Long, ByVal NumItems As Long, ClientHandles() As Long, Errors() As Long)On Error GoTo ErrorHandler '异步写命令回馈信息Dim i As LongFor i = 1 To NumItemsIf Not Errors(i) = 0 Then MsgBox "AsyncWriteComplete Item Clienthandle = " + Str$(ClientHandles(i)) + " FAILED. Error Code = " + Str$(Errors(i)), vbCriticalNextExit SubErrorHandler:MsgBox Err.Description + Chr(13) + "Async Write Complete", vbCritical, "ERROR"End Sub。
OPC实验指导书

实验名称OPC客户端的编程一、实验目的:通过实际操作进一步了解OPC的各种概念,掌握OPC客户端的编写方法。
并对微软的DCOM 有一定的了解,要求通过合适的DCOM配置,使客户端能够读取网络上服务器中的数据。
二、实验内容:1)利用VB语言编写出一个简单的OPC客户端程序,要求这个客户端能够读取服务器中的数据,并显示出来。
2)配置DCOM,使客户端能够能过DCOM读取另一台服务器上的数据。
三、实验步骤:(1)建立一个Visual Basic工程1)启动Visual Basic,新建一个Visual Basic工程。
选择[Standard EXE]作为新建工程的类型。
图3-1 Visual Basic 工程的建立2)设置OPC包装DLL因为在新建的Visual Basic工程OPC包装DLL还没有被注册,必须用下述方法对OPC包装DLL 进行注册。
设置方法:1.从Visual Basic菜单里选择[Project]-[References]。
2.在[Available References]表示中,选择对应OPC包装DLL的文件名。
这里我们选择[OPCAutomation 2.0]。
图3-2 引用的设置(2)建立一个OPC对象在Visual Basic里,是以对象的单位对OPC服务器进行访问。
OPC自动化接口是由以下四种对象所定义。
OPC服务器OPC组(OPC组集合)OPC标签(OPC标签集合)OPC浏览器这里只说明OPC服务器,OPC组以及OPC标签对象的使用方法。
具体的来说,先连接一个特定的OPC服务器,然后建立OPC组,最后添加OPC标签。
1)变量声明参考图3-3所示的示范代码,先对OPC对象变量进行声明。
变量的数据类型应该指定为对象型。
这些对象变量最好在窗体代码的(General)部分声明。
因为在(General)部分声明的变量,可以在窗体的任何方法的代码内引用。
图3-3 OPC对象变量的声明有关定义OPC对象的声明及其说明列于表3-1表3-1 OPC对象变量的声明2)连接OPC服务器和建立OPC组下面说明如何连接OPC服务器和建立OPC组。
VB6.0编程客户端访问组态王OPC服务器的实现方法

武 汉船舶 职业 技术 学 院学报
21 0 1年第 3期
VB . 6 0编 程 客 户 端 访 问 组 态 王 OP 服 务 器 的 实 现 方 法 C
邹 治 军
( 南京 化 工 职 业 技 术 学 院信 息 技 术 系 , 苏 南 京 2 0 4 ) 江 1 0 8
摘 要 本 文 介 绍 了 O C规 范 , 过 实 例 介 绍 了基 于 VB . P 通 6 0编 程 客 户 端 程 序 访 问组 态 王 OP C服 务 器 的 实 现 方 法 , 有 具
1 OP 规 范 C
工业 控 制系 统包 含 大 量 的 现 场设 备 , 些 设 这 备 通常包 括来 自不 同 厂 商 的各 种 类 型 的仪 器 、 仪 表、L P C和 其他智 能设 备 。不 同 的厂 商 提供 的协 议各 异 , 因此要 与 这些设 备交 换数据 , 要编 写不 需
程 序 , 过组 态王 的 O C接 口来 访 问组态 王数 据 通 P
库 中的变 量和 变量 的域 。
Vi a B sc 一 种 可 视 化 的 、 向对 象 和 采 s l ai 是 u 面
用事 件驱 动方 式 的结 构 化 高 级 程 序设 计 语 言 , 常 用 于开 发 W id ws环 境 下 的各 类 应 用 程 序 。 no ]
Kig i 组 态 王 ) 北 京 亚控 公 司 特 别 为 n ve w( 是
中小 型项 目推 出的用 于监 视与控 制 自动化 设备 和
生 产过 程 的组 态 软 件 。组 态 王 因其 易 学 易 用 、 功 能齐全 、 物美 价廉 的特 点 , 目前 已广泛 应用 于 国 内
中 小 型 生 产 过 程 控 制 系 统 中 。 Kig i . 3的 n ve w6 5
[信息与通信]手把手教您用VB编一个OPC客户端程序
![[信息与通信]手把手教您用VB编一个OPC客户端程序](https://img.taocdn.com/s3/m/7a043a014b35eefdc8d333fc.png)
OPC
Agenda
OPC - Review of the Basics OPC - Terminology OPC & VB 101 - Automation Wrapper & Object Model Building Your VB Client - Read data - 7 easy steps with code from start to finish Housekeeping Handles Handles Everywhere - how the server and client correlate the data each is managing in your program Writing Data Future ideas to consider New developments since original presentation in 10/99 Resources for future learning
Copyright Software Toolbox, 1999,2000,2001 All Rights Reserved Worldwide. Software Toolbox is a registered trademark of Software Toolbox, Inc.
VB
OPC Your VB Program with the Automation Wrapper object included in it
• OPC Server - a piece of software supporting the OPC specification - an OPC Data Access Server is a driver that handles connectivity to PLCs or other automation hardware • OPC Item - A single tag or data point managed by the OPC server - i.e. one data point in a PLC • OPC Group - a user defined grouping of OPC items. Created by the OPC client as a way of organizing data items around logical process areas or equipment. • Collection - a grouping of objects of the same data type for example, each OPC server has an OPC items collection containing one software object for each OPC item.
用VB开发WinCC的OPC客户机

!项目背景通过对我企业改造后!"卷烟包装机组进行工业自动控制的研究,探讨了在#$%&’()环境下,用*!+,-开发的./0客户机与具有串行通讯功能的设备之间通信的实现问题。
该./0通信系统如图1。
图1#$%00中硬件组态./0结构从图1可以看出,变频器、温控仪等通过串行驱动程序与上位机#$%00进行数据交换。
通过#$%00对变频器、温控仪等的参数进行设定、读写。
该功能的实现,是通过#$%00的./0客户机来完成了。
#$%00在安装时提供了./0的客户端控件:2$343%) ./056678’498$’%:,-;2./056678’,&<<=,我们通过*!这个平台,引用这个控件成功地开发了#$%00的./0客户机。
限于篇幅,本文以调试软件来阐述了#$%00的./0客户机的开发方法。
"#$%程序设计(1)打开*!+,建立./0窗体如图:,文本框组>3?8@,83?8为写入#$%00内部变量名称;文本框组>3?8A,83?8为显示相应了#$%00内部变量值;文本框组>3?8B,83?8为写入期望了#$%00内部变量值。
单选框为./0连接成功标志。
C个命令按钮分别为“连接”、“断开”、“退出”。
图:./0窗体(:)./0的连接先在工具栏中“工程D引用”将近2$343%)./05667E 8’498$’%:,-加入,然后开始定义全局变量。
在本程序中,我使用了一个./0组进行./0访问,所以定义了全局变量。
我们要首先定义./0服务类型与计算机结点名。
定义./0组与./0标签组。
并定义./0的标签数组与值数。
注意:值数组一定要设为*9F$9%8。
.G8$’%"?G<$H$8.G8$’%!9)31I这数组定义由1开始0’%)823FJ3FK943L M./023FJ3F,#$%00M I./0的类型5$4K’&3K9436)28F$%N I节点名,即计算机名5$4#$8O"J3%8)PQ./023FJ3F6)./023FJ3F I./0服务5$4#$8O"J3%8)PQ./0RF’7G6)./0RF’7G I./0组5$4PQ./0RF’7G0’<<6)./0RF’7G)5$4PQ./0S8340’<<6)./0S834)I./0标签组5$4PQ./0S834)6)./0S834)5$4PQ./0S8346)./0S8345$40<$3%8T9%&<3);1=6)U’%N I句柄5$423FJ3FT9%&<3);=6)U’%N5$4"FF’F);=6)U’%N5$4S834S5);@=6)28F$%N I记录./0的标签5$4S834S5)*9<73;@=6)*9F$9%8I存放./0的值5$4RF’7GK9436)*9F$9%8在定义所有变量后,我们就要进行./0连接了,要进行./0连接之前,先要配置要访问的./0标签名(即#$%00内用*!开发#$%00的./0客户机林启宽(厦门卷烟厂卷包车间,福建厦门C+1--@)53J3<’G43%8’V./00$3%8($8O#$%00!9)3&’%*!摘要主要介绍了如何用*!+,-开发#$%00的./0客户机程序,就具体实例来阐述./0的设计方法、步骤及其应用。
VB与西门子OPC通信注解

VB与西门子S7-300的OPC通信一、通过STEP7软件建立一个新项目OPC,在项目中添加SIMATIC 300站和一个PC 站,其中PLC站中第四个槽安装的CP343模块。
PC站的第一个槽为OPC SERVER ,第三个槽为 IE GENERAL,然后在NETPRO下配置PLC和PC站的网络连接:(注意:是在PC站上新建的网络连接,连接类型选的S7连接)二、通过station configurator软件配置本机的PC站(要和STEP7中配置的相同),然后把PLC和PC站都下载下去(注意:下载PC站的时候要把S7ONLINE (STEP7)--->;PC internal(local))。
三、打开OPC Scout,(Start>;SIMATIC>;SIMATICNet>;OPC Scout),双击&ldquo;OPCSimaticNet&rdquo;在随之弹出的&ldquo;ADD Group&rdquo;对话框中输入组名,本例命名为&ldquo;OPC&rdquo;。
点击OK 确认;双击已添加的连接组(OPC),即弹出&ldquo;OPC Navigator&rdquo;对话框,此窗口中显示所有的连接协议。
双击&ldquo;S7&rdquo;,在PC Station 组态NetPro 中所建的连接名会被显示(S7connection_1)。
双击此连接,即可出现有可能被访问的对象树(objects tree),在PLCCPU 中已存在的DB 块也会出现以上完成的OPC SERVER部分的配置。
四、用VB编写了OPC客户端应用程序。
主要程序代码如下:在VB中引在VB中还要引用 siemens opc daautomation 2.0(1) 连接OPC服务器Dim WithEvents MyOPCServer As OPCServer ‘定义服务器对象变量MyOPCServer Dim WithEvents MyOPCGroup As OPCGroup ‘定义OPC组对象变量MyOPCGroup Set MyOPCServer = New OPCServerMyOPCServer.Connect " OPC.SimaticNET" ‘连接SIMATICNET 的OPC服务器(2) 添加OPC组对象Set MyOPCGroup=MyOPCServer.OPCGroups.Add("Group1")‘添加OPC组对象MyOPCGroup.IsSubscribed= True‘设置该组数据为后台刷新MyOPCGroup.IsActive = True‘设置该组为激活状态MyOPCGroup.UpdateRate=1000‘设置数据刷新时间为1000(3) 添加数据项Dim abItemIDs() As String‘项标识符Dim abClientHandles() As Long‘客户端句柄Dim abServerHandles() As Long‘服务器端句柄Dim abErrors() As LongDim i As LongItemCount=3abItemIDs(1) = " S7:[S7 connection_1]IB1"abItemIDs(2) = " S7:[S7 connection_1]MB1"abItemIDs(3) = " S7:[S7 connection_1]QB1"for i=1 t0 3abClientHandles(i) = i‘给客户端句柄赋值NextMyOPCGroup.OPCItems.AddItems ItemCount, abItemIDs, abClientHandles, abServerHandles, abErrors‘添加数据项操作(4) 同步数据读写OPC数据存取有同步方式和异步方式两种。
用VB编写OPC客户端

OPC
Agenda
OPC - Review of the Basics OPC - Terminology OPC & VB 101 - Automation Wrapper & Object Model Building Your VB Client - Read data - 7 easy steps with code from start to finish Housekeeping Handles Handles Everywhere - how the server and client correlate the data each is managing in your program Writing Data Future ideas to consider New developments since original presentation in 10/99 Resources for future learning
The Automation Wrapper connects to the OPC server and creates the groups and items in the server and gives you references to them in your VB program in an Object model that mirrors that of the server
OPC-VB

OPC是一个工业标准,它是由一些世界上著名的自动化系统和硬件、软件公司和Microsoft(微软)紧密合作而建立的。
O代表OLE(对象链接和嵌入),P (process过程),C (control控制)。
OLE已从面向对象重新定义为基于对象并更名为Active X。
OPC的使用是作为一个DCOM在使用,所以OPC客户端可以网络上任一计算机运行,但你必须配置DCOM的访问权限,如果你不想费神,把服务器与客户端都用相同的用户名与密码登录就成了。
如果想配置DCOM,请参看DCOM的配置。
RSlinx集成的OPC(OLE for process control)服务器使得过程数据可由其它应用程序(OPC客户机)访问。
RSlinx在安装时提供了OPC的客户端控件: Rockwell Software OPC Automation(C:\Program Files\CommonFiles\Rockwell\RsiOPCAuto.dll)这个控件就是我们在VB中要用到的控件。
一、OPC的连接先在工程中"引用" Rockwell Software OPC Automation,然后开始定义全局变量。
我们要首先定义OPC服务类型与计算机结点名。
定义OPC组与OPC标签组。
并定义OPC的标签数组与值数,注意,值数组一定要设为Variant。
Const ServerName = "RSLINX OPC Server" 'OPC的类型Const NodeName = "SMZ" '结点名,即计算机名Dim WithEvents MyOPCServer As OPCServer 'OPC服务Dim MyOPCGroups As OPCGroupsDim WithEvents MyOPCGroup As OPCGroup 'OPC组Dim MyOPCItems As OPCItems 'OPC标签组Dim ServerHandles() As Long '句柄Dim Errors() As Long '错误句柄Dim DataItem(100) As String '记录OPC的标签Dim DataValue(100) As Variant '存放OPC的标签的值Private Sub StartClient()在定义所有变量后,我们就要进行OPC连接了,要进行OPC连接之前,先要配置要访问的OPC标签名,我们DataItem 中加入相应的标签名,注意:这两个数组必须由1开始,不能由0开始。
OPC客户程序_VB同步

End Sub
Private Function GetQualityText(Quality) As String
Select Case Quality
Case 0: GetQualityText = "BAD"
Case 64: GetQualityText = "UNCERTAIN"
OutText = "添加组"
Set GroupObj = ServerObj.OPCGroups.Add("Group")
OutText = "Adding an Item to the group"
Set ItemObj = GroupObj.OPCItems.AddItem("XXXITEM", 1)'XXXITEM为添加的ITEM名称
Command_Write.Enabled = True
Command_Exit.Enabled = True
OutText = "连接OPC服务器"
Set ServerObj = New OPCServer
ServerObj.Connect ("XXXSERVER")'XXXSERVER为某OPC服务器名称
End Sub
Private Sub Command_Write_Click()'同步写
Dim OutText As String
Dim Serverhandles(1) As Long
Dim MyValues(1) As Variant
Dim MyErrors() As Long
VB+OPC代码

OPC的VB例子Option ExplicitOption Base 1Private QOpcServer As OPCServerPrivate QGroups As OPCGroupsPrivate WithEvents QGroup As OPCGroupPrivate QItems As OPCItemsPrivate QItemServerHandles() As LongPrivate Sub Form_Load()On Error GoTo ErrorHandler'建立与OPC服务器的连接Set QOpcServer = New OPCServerCall QOpcServer.Connect("S7200.OPCServer") 'S7200.OPCServer是固定的OPC名称'建立一个数据群组Set QGroups = QOpcServer.OPCGroups ' Get OPCGroups Collection Object from QOPCSe rver' Set Default Properties for Group Collection' These Properties are used to set the Properies for new GroupsQGroups.DefaultGroupIsActive = 500 ' Set Default Group Update Rate to 500 msQGroups.DefaultGroupIsActive = False ' Set Default Group Active State to InactiveSet QGroup = QGroups.Add("QGroup1") ' Add a new Group to the Group Collection' Set Group PropertiesQGroup.IsSubscribed = True ' Enable CallbacksQGroup.UpdateRate = 100 '这个群组的刷新速度是100ms'往群组里添加要传送的地址单元Dim i As LongDim ErrorFlag As BooleanDim ItemObj As OPCItemDim ItemIDs(2) As StringDim ItemClientHandles(2) As LongDim Errors() As Long ' Array for returned Item related errorsErrorFlag = FalseSet QItems = QGroup.OPCItems ' Get OPCItems Collection Object from QOPCServer' Initialize the [IN] parameters for the Add Items call' ItemIDs -> ItemIDs of the Items to add' ItemClientHandles -> Client defined handles for the Items. The Server sends these handles in the CallbacksItemIDs(1) = "2,q1.0,bool" ' Read ItemId 1 from Text BoxItemIDs(2) = "2,VW10,Word" ' Read ItemId 2 from Text BoxItemClientHandles(1) = 1ItemClientHandles(2) = 2' [OUT] parameters are' ItemServerHandles -> Server defined handles for the Items. The client must use these handle s for all Read/Write calls' Errors -> Item related errors' Add Items to the GroupCall QItems.AddItems(2, ItemIDs, ItemClientHandles, QItemServerHandles, Errors)' Check Item ErrorsFor i = 1 To 2If Not Errors(i) = 0 ThenMsgBox "Item " + Str$(i) + " FAILED. Error Code = " + Str$(Errors(i)), vbCriticalErrorFlag = TrueEnd IfNext' Continue only if all Items SUCCEEDEDIf ErrorFlag ThenDim RemoveErrors() As LongDim RemoveHandles(1) As Long' Remove Succeede ItemsFor i = 1 To 2If Errors(i) = 0 ThenRemoveHandles(1) = QItemServerHandles(i)Call QItems.Remove(1, RemoveHandles, RemoveErrors)End IfNextEnd IfIf Not QGroup Is Nothing ThenQGroup.IsActive = TrueEnd IfExit SubErrorHandler:MsgBox Err.Description + Chr(13) + "联接到OPC服务器", vbCritical, "Error"End SubPrivate Sub cmdWriteSync_Click()'On Error GoTo ErrorHandlerDim i As LongDim Values(2) As VariantDim Errors() As Long ' Array for returned Item related errors' Initialize the [IN] parameters for the SyncWrite call' Values -> Values to writeValues(1) = txtWriteVal1.Text ' Read Value 1 from Text BoxValues(2) = txtWriteVal2.Text ' Read Value 2 from Text Box' ItemServerHandles -> Server defined handles from the AddItems call' Write Values SyncronousCall QGroup.SyncWrite(2, QItemServerHandles, Values, Errors)' Check Item ErrorsFor i = 1 To 2If Not Errors(i) = 0 Then MsgBox "Item " + Str$(i) + " FAILED. Error Code = " + Str$(Error s(i)), vbCriticalNextExit SubErrorHandler:MsgBox Err.Description + Chr(13) + "Writing Items Syncronous", vbCritical, "ERROR"End Sub' Callback from OnDataChangePrivate Sub QGroup_DataChange(ByVal TransactionID As Long, ByVal NumItems As Long, Client Handles() As Long, ItemValues() As Variant, Qualities() As Long, TimeStamps() As Date)'On Error GoTo ErrorHandlerDim i As Long' Check ParametersFor i = 1 To NumItemsIf ClientHandles(i) > 0 And ClientHandles(i) < 3 Then' Values -> Values from read complete' Qualities -> Qualities of the valuesIf Qualities(i) = 192 ThentxtChangeVal.Item(ClientHandles(i) - 1).Text = ItemValues(i) ' Write Value to Text Box End IfElseMsgBox "DataChange Item " + Str$(i) + " has invalid Client Handle ", vbCriticalEnd IfNextExit SubErrorHandler:MsgBox Err.Description + Chr(13) + "OnDataChange", vbCritical, "ERRORCha"End SubPrivate Sub cmdExit_Click()Unload MeEnd Sub' Unload Form EventPrivate Sub Form_Unload(Cancel As Integer)Dim i As LongDim Errors() As Long ' Array for returned Item related errors' Remove Items from the GroupCall QItems.Remove(2, QItemServerHandles, Errors)' Check Item ErrorsFor i = 1 To 2If Not Errors(i) = 0 Then MsgBox "Item " + Str$(i) + " FAILED. Error Code = " + Str$(Errors(i)), vbCriticalNextErase QItemServerHandles ' Erase Item Server Handle ArrayQGroups.RemoveAll ' Removes all GroupsSet QGroup = Nothing ' Delete OPCGroup ObjectSet QGroups = Nothing ' Delete OPCGroups Collection ObjectQOpcServer.Disconnect ' Disconnect from OPC ServerSet QOpcServer = Nothing ' Delete OPCServer ObjectEnd Sub。
学习用VB写OPC CLIENT

Private Sub Command1_Click()Dim AllOPCServers As VariantDim i As IntegerSet AnOPCServer = New OPCServerList1.ClearAllOPCServers = AnOPCServer.GetOPCServersFor i = LBound(AllOPCServers) To UBound(AllOPCServers)List1.AddItem AllOPCServers(i)Next iSet AnOPCServer = NothingEnd Sub试了一下果然可以。
点击list中某一个opcserver,然后调用opcserver对象的connect方法就可以连接上去了。
网上的例子里面是做了个示范,标签名用了个循环赋值,For I=1To17strItemIDs(I)="Server.Group.TAG"&IlClientHandles(I)=INext’添加OPC项Call objItems.AddItems(17,strItemIDs,lClientHandles,lServerHandles,lErrors)但是例子里面也承认“OPC客户端程序要按照用户指定的标签或者从组态文件里读取需要添加的OPC标签。
”那么,实际上来说,要么用browse标签的方法去一个一个选择标签,要么事先在程序里面指定好各个标签名字了(当然可以用一个类似与ini配置文件的方法存储好要各个标签的名字,这个以后再说吧)。
从实际应用考虑,我觉得browse的方法没有必要,因为一般来说直接确定好哪些标签就行了,而且如果用参数文件的话也算比较容易后期进行配置(前提应该是tag名字要写正确)。
Items有个additems的方法,用于添加标签,参数比较多,认真看了下例子,还是有点技巧的,从第二个参数开始都是数组类型的参数,而前两个数组必须指定好长度,后面三个数组则无须指定长度,很怪啊,反正vb认可就ok了,难怪例子里面这么定义的几个数组。
用VB编写OPC客户端通过RSLINX访问SLC

用VB编写OPC客户端通过RSLINX访问SLCOPC是一个工业标准,它是由一些世界上著名的自动化系统和硬件、软件公司和Microsoft(微软)紧密合作而建立的。
O代表OLE(对象链接和嵌入),P (process过程),C (control控制)。
OLE已从面向对象重新定义为基于对象并更名为Active X。
OPC的使用是作为一个DCOM 在使用,所以OPC客户端可以网络上任一计算机运行,但你必须配置DCOM的访问权限,如果你不想费神,把服务器与客户端都用相同的用户名与密码登录就成了。
如果想配置DCOM,请参看DCOM的配置。
RSlinx集成的OPC(OLE for process control)服务器使得过程数据可由其它应用程序(OPC客户机)访问。
在安装RSlinx时提供了OPC的客户端控件: Rockwell Software OPC Automation(C:\Program Files\Common Files\Rockwell\RsiOPCAuto.dll)本例就是用VB通过对这个控件进行操作,来实现对SLC内存标签的读写访问。
本例编写如下测试梯形图:在RSlinx中建立驱动,配置OPC服务器,见下图,并让以上梯形图运行。
VB编译过的EXE文件OPC_test.rarOPC运行结果及OPC状态图opc.rarVB程序如下:'OPC是一个工业标准,它是由一些世界上著名的自动化系统和硬件、软件公司和Microsoft(微软)紧密合作而建立的。
'O代表OLE(对象链接和嵌入),P (process过程),C (control控制)。
OLE已从面向对象重新定义为基于对象并更名为Active X。
'OPC的使用是作为一个DCOM在使用,所以OPC客户端可以网络上任一计算机运行,但你必须配置DCOM的访问权限,'如果你不想费神,把服务器与客户端都用相同的用户名与密码登录就成了。
VB代码OPC server

利用visual basic所开发的opc客户端应用程序主要采用自动化通信接口和opc服务器程序实施通信。
而opc基金会提供的opc 自动化接口 opcdaauto.dll动态链接库集成了所有用于对opc服务器进行访问的对象、属性和方法,为利用visual basic开发opc 客户端应用程序提供了极大方便。
程序设计时,opc客户程序应当首先生成opc服务器支持的opc对象,然后再使用opc对象支持的属性和方法,实现对opc服务器的操作和访问。
opc数据访问对象主要包括opc服务器(opcserver)、opc组集合(opcgroups)、opc组(opcgroup)、opc标签集合(opcitems)、opc标签(opcitem)、opc浏览器(opcbrowser)等几个部分。
程序设计时,要首先在visual basic环境下选择对opc automation 2.0接口的引用,此时,opc对象会被自动添加到正在开发的工程项目中,然后,再根据需要建立这些对象的实例并利用其属性和方法来实现对opc服务器的访问。
对opc服务器的访问主要包括声明opc对象实例、连接opc server、添加标签变量、读写opc服务器(同步/异步)、断开连接等几个步骤。
opc对象实例的声明主要包括对opc服务器、opc组集合、opc 组、opc标签集合、opc服务器句柄的声明及程序所需要的其它实例的声明。
opc客户端和opc server的连接主要靠调用opc服务器对象实例的connect方法函数来完成,例如,连接本地计算机dassidirect和rslinx opc server 的代码分别为connect ("archestra.dassidirect.1")和connect("rslinx opc server")连接网络远程计算机(ip地址为10.144.45.45)上dassidirect 和rslinx opc server 的代码分别为connect ("archestra.dassidirect.1", "\10.144.45.45")和connect ("rslinx opc server", "\10.144.45.45")需要说明的是当进行远程opc连接时,必须在远程计算机上运行dcomcnfg程序,并启动该计算机opc服务器的dcom服务。
VB访问OPC

DimiAsLong
Fori=1ToNumItems
txtValue(ClientHandles(i))=ItemValΒιβλιοθήκη es(i) ‘获取项的值
txtTime(ClientHandles(i))=TimeStamps(i)
‘获取项的时间戳
txtQuantity(ClientHandles(i))=GetQualityString(Qualities(i))
‘给客户端句柄赋值
Next
MyOPCGroup.OPCItems.AddItemsItemCount,abItemIDs,abClientHandles,abServerHandles,abErrors
‘添加数据项操作
(4)同步数据读写
OPC数据存取有同步方式和异步方式两种。异步读写数据复杂,需要与事件结合使用,与同步相比速度慢但准确性高。同步读写数据简单,直接使用OPCItem的方法即可。
二、通过stationconfigurator软件配置本机的PC站(要和STEP7中配置的相同),然后把PLC和PC站都下载下去(注意:下载PC站的时候要把S7ONLINE(STEP7)--->;PCinternal(local))。
三、打开OPCScout,(Start>;SIMATIC>;SIMATICNet>;OPCScout),双击&ldquo;OPC
DimOneAsOPCItem
DimIndexAsLong
‘Index为标签顺序号
DimOneReadAsString
DimXieAsString
SetOne=MyOPCGroup.OPCItems(Index)
如何用VB编写OPC客户端程序

Dim Vt_Filter As Integer Dim nodX As Node Dim Value As Variant Dim FullName As String Dim Relative As String Dim i As Integer
Private Sub cmbAccessRights_Click() Select Case cmbAccessRights.Text Case 'OPC_ACCESS_WRITE' g_Browser.AccessRights = OPCWritable Case Else g_Browser.AccessRights = OPCReadable End Select
用 VB 编写 OPC 客户端访问 WINCC
用 VB 编写 OPC 客户端访问 WINCC OPC 是一个工业标准,它是由一些世界上著名的自动化系统和硬件、软件公司 和
Microsoft(微软)紧密合作而建立的。〔O 代表 OLE(对象链接和嵌入),P (process 过程),C (control 控制)。OLE 已从面向对象重新定义为基于对象并更名为 Active X〕。 WinCC 是西门子公司在自动化领域采用最先进的技术与微软公司在共同开发的居于世界领 先地位的工控软件。)。WinCC 是一个功能强大的全面开放的监控系统,既可以用来完成小规模的简单的过程监控应用,也 可以用来完成复杂的应用。在任何情况下 WinCC 都可以生成漂亮而便捷的人机对话接口, 使操作员能够清晰地管理和优化生产过程。它集成的 OPC(OLE for process control)服务器使 得过程数据可由其它
Dim ItemObj1 As OPCItem Dim ItemObj2 As OPCItem Dim Serverhandle(2) As Long
用VB编写OPC客户端程序实现数据共享的方法

用VB编写OPC客户端程序实现数据共享的方法李晓诗;赵志峰【摘要】主要介绍了北营焦化厂厂级管理网从现场工业控制网上实时获取工艺数据的一种方法.并阐述了北营焦化厂备煤系统的OPC客户端程序的开发及应用.【期刊名称】《辽宁科技学院学报》【年(卷),期】2012(014)003【总页数】3页(P28-30)【关键词】OPC;ODBC;客户端;数据采集【作者】李晓诗;赵志峰【作者单位】本溪北营钢铁(集团)股份有限公司,辽宁本溪117017;本溪北营钢铁(集团)股份有限公司,辽宁本溪117017【正文语种】中文【中图分类】TP3111 OPC(OLE for Process Control)技术应用在企业自动化系统发展中,经常会遇到管理网需要从工业控制网上实时地获取工艺生产过程数据来满足管理不同需求的情况。
由于现场工业控制网上的DCS系统(集散控制系统)、PLC(可编程逻辑控制器)和其他智能仪器仪表通常来自不同的厂商,通讯协议不一致,甚至有些系统并不提供通讯接口,导致控制网与管理网之间数据的通讯受到限制。
因此,如何有效、可靠、实时和高速地从控制网中获取所需要的各种实时数据,是企业自动化实施过程中一个普遍关注的问题。
OPC技术的应用,提供了一种可以解决了上述问题的方案。
1.1 OPC服务器模型接口方式OPC对象有三个:服务器(OPC Server)、组(OPC Group)和项(OPC Item)。
OPC Server即OPC启动服务器,通过它获得其他对象和服务的起始类,并用于返回OPC Group类对象。
OPC Group存储由若干OPC Item组成的Group信息,并用于返回OPC Item类对象。
OPC Item存储具体Item的定义、数据值、状态值等信息。
1.2 OPC服务器接口方式OPC数据存取规范分别定义了自动化接口和自定义接口两套接口标准。
使用VB等解释性编程语言的客户采用自动化接口访问OPC服务器。
用VB开发OPC客户端程序的步骤与实现

(1)建立新工程或项目,在“工程”菜单下选择“引用”,如图5-3所示。
只有引用OPCDAAuoto.DLL后,在程序中才能创建服务器对象,然后进行一系列的操作。
(2)在弹出的引用窗口里单击“浏览(B)…”按钮,弹出添加引用窗口,选择OPCDAAuoto.DLL 文件。
(3)在引用窗口里的OPC Automation 2.0前面打钩,按“确定”按钮。
(4)定义全局变量,这样可以在窗体的任何方法的代码内应用。
变量类型应该指定为对象型。
这些对象最好在窗体的通用部分声明加上“Option Explicit”语句,表示模块里的所有变量都需要显式声明。
由于OPC自动化接口的数组的索引要求必须从1开始,而系统默认是从0开始,为了避免错误最好在代码的最初加上“Option Base 1”语句。
为了使对象可以处理事件,必须将objTestGrp和objServer的声明中加上“WithEvents”语句,表示声明的对象可以响应事件。
Option ExplicitOption Base 1Dim WithEvents objServer As OPCServerDim objGroups As OPCGroupsDim WithEvents objTestGrp As OPCGroupDim objItems As OPCItems(5)连接OPC服务器和建立OPC组考虑到代码的可反复使用性,采用子程序进行编程。
Sub Connect(strProgID As String, Optional strNode As String)If objServer Is Nothing Then' 建立一个OPC服务器对象Set objServer = New OPCServerEnd If服务器状态ServerState属性一共有OPCRunning、OPCFailed、OPCNoconfig、OPCSuspended、OPCTest和OPCDisconnected六个值,分别表示正在运行、失败、没有配置、暂停、测试和没有连接六种OPC服务器当前的状态。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
如何用VB编写OPC客户端程序一、引言在工业自动化领域,计算机早已成为必不可少的工具,计算机技术的不断发展,大大加速了工业自动化技术的进步,而各种各样的工业控制应用软件正是具体实现这一进程的最重要的工具。
以往,应用软件开发商要为每一种硬件开发驱动程序,由于硬件的种类繁多,特征各异,软件开发商的负担异常繁重,尤其是如果硬件特征发生了变化,整个应用软件相应的驱动程序也要相应地修改,这对软件开发商,对整个工程都是很不利的。
而且由于驱动程序的不统一,不同应用程序访问同一硬件设备时常常发生冲突。
OPC(OLE for Process Control)技术标准正是在这种情况下产生的。
OPC 基于微软的OLE、COM和DCOM技术,而且它本身就是一种特殊的COM,也正因为有微软的参与,以及以已经成熟的技术为基础,它比一般的工业标准制定的效率更高,它从开始制定到第一个可运行的规范开始运行,只用了不到一年的时间。
二、OPC原理及应用OPC技术为工业自动化软件面向对象的开发提供了统一的标准。
它大大减轻了软件开发商的负担,软件开发商不必再为每一硬件单独编写驱动程序,只要硬件的特征符合统一的OPC接口程序标准,或者硬件生产商提供OPC服务器,如图一所示,不同的应用软件开发商都可以采用OPC标准设计工控软件,以标准规定的统一接口通过OPC服务器存取现场数据。
这样,当现场设备发生变化或系统中加入新设备时,OPC服务器的提供商需要重新实现服务器接口,以适应硬件的变化,但由于服务器所提供的接口的一致性,工控软件不作更改即可继续使用,只是某些情况下可能需要重新组态(如添加新的PLC站点等),这样,软件开发商可以节省大量的时间致力于工控软件的性能方面的提高,不必再考虑硬件变化带来的影响,大大减小了软件维护的工作量。
这正如OPC规范里所说,OPC将应用软件和硬件设备划清了界限。
2.1 OPC基本结构OPC服务器有两类接口:定制接口(Custom Interface) 、自动化接口(Automation Interface),定制接口比较低级,它提供更多的功能,效率也比后者高,可以用C++语言调用此类接口,自动化接口主要用于VB、DELPHI等开发工具。
按照OPC规范,定制接口是服务商必须提供的,而自动化接口则是可选的,不过,OPC基金会(管理OPC标准的国际组织)提供了一个叫做“自动化包装器”的动态连接库,用于在两者间转换。
如图二所示:在OPC的早期规范里主要包括OPC数据存取规范、OPC报警和事件、OPC历史数据存取规范。
OPC数据存取规范详细规定了客户程序和服务器程序进行数据通信的机制,其它类型的OPC服务器往往是在数据存取服务器的基础上通过增加对象、扩展接口而来的,所以该规范也是其它OPC规范的基础。
OPC数据存取规范规定的基本对象有三类:OPC Server、OPC Group和OPC Item,OPC Server包含服务器的所有信息,也是OPC Group的容器,OPC Group除了包含它自身信息外,还负责管理OPC Item。
它们的结构如图三所示。
每一个OPC Item代表到数据源的一个连接,但它没有提供外部接口,客户端程序无法对OPC Item直接进行操作,应用程序必须依靠OPC Item的容器OPC Group 来对它进行操作,这在下面的程序中会有具体说明。
2.2 OPC数据访问方式OPC客户程序对OPC服务器中数据的存取方式分为同步读写方式和异步读写方式。
客户程序可按照一定的周期调用OPC Group对象的IOPCSyncIO接口对服务器程序进行数据同步存取操作,此时客户方的调用函数一直运行到所有数据读写完成,然后才能执行其它操作,因此,这种方法适合与读取少量数据,如果数据多的话,会使系统处于假死状态,无法进行操作。
IOPCSyncIO2是从3.0版才出现的,是对IOPCSyncIO的增强。
IOPCAsyncIO2和IOPCAsyncIO3是异步方式中使用的接口,异步访问时,当客户端对服务器提出访问要求后,立即返回到OPC应用程序执行其它操作,无须等待,当OPC服务器完成数据读取后通知OPC应用程序,应用程序从而得到数据。
其中前者是在2.0版本中新定义的,具有较高的通信性能;后者则是在3.0版本中才刚刚出现,同IOPCSyncIO2类似,IOPCAsyncIO3是对IOPCAsyncIO2的增强。
在异步方式下,服务器程序收到读请求后,调用客户程序方的IOPCDataCallback接口,将数据发送给客户程序。
异步方式中允许服务器将读写操作进行排队,使客户方的调用函数可立刻返回,当服务器读写操作完成后再通知客户程序。
显然,异步通报方式的通信效率更高,这种方式也是本文所要讨论的方式,但有多个客户程序与服务器相连时,同步读写方式更具时效性。
对于每个组对象,客户程序可根据需要采用其中一种数据存取方式,而不能两者都使用。
异步读取还有一种特殊的方式,叫做订阅方式(Subscribe)这种情况下,应用程序不需要发出读请求,OPC服务器在定期更新数据的时候,如果发现数据有一定变化,则自动向应用程序发出通知和传输变化的数据。
2.3 编写OPC客户端应用程序VB简单实用,是比较理想的OPC应用程序快速开发工具,若要用VB开发OPC应用程序,必须要使用OPC自动化包装器,这在前文已经提过,这种包装器一般由OPC服务器的供应商以DLL形式提供,下面就以SIEMENS提供的sopcdaauto.dll为例,介绍如何开发OPC应用程序,这也正是笔者在最近的工程中实际应用到的,这是基于DA2.0的版本。
首先,新建VB工程后,作图四所示的引用:2.3.1 建立OPC对象首先申明OPC对象:Option Base 1Dim WithEvents ServerObj As OPCServer 'OPC Server对象,连接OPC服务器Dim GroupsObj As OPCGroups 'OPC Groups对象,添加OPC组Dim WithEvents GroupObj As OPCGroup 'OPC Group对象Dim ItemsObj As OPCItems 'OPC Item集合Dim ServerHandles() As Long '服务器端OPC Item的句柄Dim ClientHandles() as Long '客户端OPC Item的句柄Dim ItemId(2) As StringDim Errors() As Long接下来,生成各个对象:If ServerObj Is Nothing Then Set ServerObj = New OPCServer'连接OPC服务器If ServerObj.ServerState = OPCDisconnected ThenServerObj.Connect (OPC.SimaticNET) '假设OPC服务器运行在本机End IfIf GroupsObj Is Nothing Then Set GroupsObj = ServerObj.OPCGroupsIf GroupObj Is Nothing Then Set GroupObj = GroupsObj.AddIf ItemsObj Is Nothing Then Set ItemsObj = GroupObj.OPCItems GroupObj.IsActive = True '设置组为活动状态'假设有两个数据源,一个是8位开关量输入,一个是8位开关量输出瑉浥摉ㄨ??卜?卛?潣湮捥楴湯??あ瑉浥摉㈨??卜?卛?潣湮捥楴湯?兝あClientHandles(1) = 1ClientHandles(2) = 2'添加组项目,ServerHandles数组的值为各个OPC Item的服务器句柄,' ClientHandles数组的值为各个OPC Item的客户端句柄,由应用程序设定Call ItemsObj.AddItems(2, ItemId, ClientHandles, ServerHandles, Errors)2.3.2异步数据读取' OPC Item的服务器句柄,添加OPC Item时由服务器分配Dim TempServerHandles(1) As Long'事务标志符,由客户端产生,它包含的信息提供给OnReadComplete事件Dim TransactionID As Long'取消标志符,服务器端产生,用于操作需要被取消的时候Dim CancelID As Long'包含读取每个OPC Item时返回的信息Dim ErrorNr() As LongTempServerHandles(1) = ServerHandles(1) '对应第一个OPC Item GroupObj.AsyncRead 1, TempServerHandles, ErrorNr, TransactionID, CancelID第一个参数是要读的OPC Item的个数,这里只含有一个OPC Item。
读取的结果由OPC服务器通过IconnectionPointContainer接口配合IOPCDataCallback接口反调用应用程序的事务处理程序:Private Sub GroupObj_AsyncReadComplete(ByVal TransactionID As Long, ByVal NumItems As Long, ClientHandles() As Long, ItemValues() As Variant, Qualities() As Long, TimeStamps() As Date, Errors() As Long)这里的参数ClientHandles和AddItems方法中的ClientHandles是对应的,用于判断哪一个OPC Item在被读取。
其它参数的说明如下:TransactionID:客户端自由使用,应用程序开发商自定义;NumItems:表示读取的OPC Item的个数;ItemValues():各个OPC Item连接的数据源的值,类型为Variant;Qualities():OPC Item的品质值;TimeStamps():时间戳;Errors():记录服务器返回的信息。
2.3.3 异步数据写入Dim TempServerHandles (1) As LongDim VValue(1) As VariantDim ErrorNr() As LongDim TransactionID As LongDim CancelID As LongTempServerHandles(1)=ServerHandles(2)VValue(1)=1'假设要将“1”写入ClientHandle为2的OPC ItemGroupObj.AsyncWrite 1,TempServerHandles,VValue, ErrorNr, TransactionID, CancelID同样,AsyncWrite也对应一个事务处理程序:Private Sub groupObj_AsyncWriteComplete(ByVal TransactionID As Long, ByVal NumItems As Long, ClientHandles() As Long, Errors() As Long)它的参数的含义和AsuncReadComplete中的含义是类似的,这里一般需要处理的是写数据之后的返回状态,这里不再赘述。