VC环境下的OPC客户端程序开发

合集下载

OPC实现VC应用程序

OPC实现VC应用程序
VC环境中使用定制接口开发OPC客户应用程序,下面是程序实现关键步骤。
4.1 包含OPC头文件
开发OPC客户应用程序,需要OPC接口外,还需要程序中包含OPC标准库文件,可以从OPC基金会网站(网址:)下载这些文件:
#include "opcda_i.c" OPC数据存取接口
ItemArray为OPCITEMDEF类型结构数组,它包含数据项详细信息,客户需要知道要进行交换数据RSView32标签数据库中名称、数据类型及作为OPC服务器RSView32项目名称。添加数据项之前,要用这些数据项信息对ItemArray结构数组进行初始化。
4.6 数据交换
成功增加完所需要数据项后,OPC客户(VC应用程序)和OPC服务器(RSView32)就可以进行数据交换了。数据量不大情况下,可以使用IOPCSyncIO同步接口Write()和Read()两个方法进行数据读写操作,实现OPC客户(VC应用程序)和OPC服务器(RSView32)之间数据交换。代码如下:
3 RSView32作为OPC服务器
西门子专门用于工业控制通用组态软件之一RSView32支持OPC技术,它可以用作一个OPC客户和外部OPC服务器软件通信,也可以作为一个OPC服务器和其它第三方支持OPC技术软件进行连接。本文中RSView32作为服务器,VC应用程序作为客户端,采用C/S模式实现两者之间数据交换。
#include "opcda.h" OPC数据存取2.0头文件
#include "opccomn_i.c" OPC公共接口定义
#include "opccomn.h" OPC公共头文件
4.2 初始化COM支持库

VB6.0开发WinCC的OPC客户机实例

VB6.0开发WinCC的OPC客户机实例

VB6.0开发WinCC的OPC客户机实例关键词:OPC VB6.0 WinCC上位机WinCC是西门子公司在自动化领域采用最先进的技术与微软公司在共同开发的居于世界领先地位的工控软件。

WinCC即WINDOWS CONTROL CENTER(视窗控制中心)。

WinCC 是一个功能强大的全面开放的监控系统,既可以用来完成小规模的简单的过程监控应用,也可以用来完成复杂的应用。

在任何情况下WinCC都可以生成漂亮而便捷的人机对话接口,使操作员能够清晰地管理和优化生产过程。

它集成的OPC(OLE for process control)服务器使得过程数据可由其它应用程序(OPC客户机)访问。

WinCC在安装时提供了OPC的客户端控件: Siemens OPC DAAutomation 2.0( SOPCDAAuto.dll), 在WINCC的帮助中,有Siemens OPC DAAutomation 2.0使用的简略帮助,但说得不很详细,我在使用VB6.0开发WinCC的OPC客户机中碰到不少问题,现一并写出来,与大家共享。

希望起到抛砖引玉,举一反三的作用。

一、开发实例背景:我厂包装机BE电气改造后,由原来了单片机、直流调试板、温度控制板等控制改为带有通讯端口PLC、变频器、温控仪等控制,上位机监控软件为WinCC。

在控制系统中,变频器、温控仪的控制信号通过串口、OPC客户机接入上位机WinCC,报警信号接入PLC。

其硬件组态结构如图一OPC开发要求:①通过WinCC建立内部变量Tag(1),Tag(2),Tag(3),Tag(4)……;在视图窗口建立相应了I/O输入输出域。

通过更改WinCC中I/O域的值,来设定或更改变频器、温控仪等的参数。

②通过VB开发了串口驱动程序,读取变频器、温控仪等的参数,通过OPC控件把值传递给WinCC中的I/O域。

二、VB6开发WinCC的OPC客户机具体步骤:1、打开VB6,建立如图二窗体:其中,文本框组Text4.text为写入WinCC内部变量名称;文本框组Text5.text为显示相应了WinCC内部变量值;文本框组Text8.text为写入期望了WinCC内部变量值。

基于Visual C#的OPC客户端实现

基于Visual C#的OPC客户端实现

基于VisualC#的OPC客户端实现作者:朱立军安娜陈未如来源:《现代电子技术》2009年第02期摘要:OPC是连接数据源(OPC服务器)和数据的使用者(OPC应用程序)之间的软件接口标准。

这里以C#为开发工具,按照OPC技术的规范标准,将OPC技术应用到虚拟仪器显示组件中。

具体实现了OPC客户端数据访问服务器的过程,接口步骤及其读写数据的方法,并根据OPC服务器提供的数据,最终在虚拟仪器显示组件中生成了虚拟的正弦波、方波、锯齿波、三角波等。

关键词:OPC;OPC接口;OPC服务器;C#中图分类号:TP311.5文献标识码:B文章编号:1004 373X(2009)02 171 03Implementation of OPC Client Based on Visual C#ZHU Lijun,AN Na,CHEN Weiru(Shenyang Institute of Chemical Technology,Shenyang,110042,China)Abstract:OPC is the software interface standard between data sources (OPC server) and data users (OPC application).Based on OPC technology standards, the virtual instrument is proposed and is applied to the virtual instrument display components by using C# language.The OPC client data access server process,the method of write and read data and interface steps are realized.According to the data provided by OPC server,finally,the waveform ofsine,square,sawtooth,triangle are generated in the display components of virtual instrument.Keywords:OPC;OPC iterface;OPC server;C#0 引言随着计算机技术和数字信号处理技术的发展,人们可以用计算机软件替代传统的硬件实现的一些功能,将计算机硬件和软件有机的融合为一体,这就是所谓的虚拟仪器。

VC环境下OPC客户端程序设计

VC环境下OPC客户端程序设计

(8)OPC连接断开,释放接口指针。当程序退出或停止服务器时,依次删除Item(RemoveItems)、Group(RemoveGroups),释放资源。 void CAsynOPCDlg::OnStop( ) 停止服务器。 h1=m_IOPCItemMgt->RemoveItems(1,phServer,&pErrors);删除Items。 h1=m_IOPCServer->RemoveGroup(m_GrpSrvHandle,TRUE);删除Group。 m_IOPCServer->Release( );释放服务器。 m_IOPCServer=NULL; CoUninitialize( );关闭COM库。 图4 OPC客户端程序 使用OPC技术之后,我们就可以通过OPC客户端直接访问由硬件供应商提供的OPC服务器,从而达到直接获取现场设备数据的目的。图4显示的即是基于VC开发的OPC客户端程序对OPC服务器KEPServer的访问界面,实现了OPC客户端与OPC服务器进行数据交互的功能,为开发其它功能更加完善的OPC客户端软件提供了基础。
(7)OPC的数据项读写。对OPC数据项的读写可以有同步与异步之分,对于大量的数据传输,异步是更佳的选择,但对少量的数据传输,同步表现得更好。本程序采用异步访问方式,需要指向IOPCAsyncIO2指针。 h1=m_IOPCItemMgt->QueryInterface(IID_IOPCAsyncIO2,(void**)&m_IOPCAsyncIO2); void CAsynOPCDlg::OnRead ( ) 实现异步读数据。 h1=m_IOPCAsyncIO2->Read(1,phServer,1,&dwCancelID,&pErrors); delete[] phServer; void CAsynOPCDlg::OnWrite( ) 实现异步写数据。 h1=m_IOPCAsyncIO2->Write(1,phServer,values,2,&dwCancelID,&pErrors); delete[] phServer;

OPC服务器和客户端程序开发指南.doc

OPC服务器和客户端程序开发指南.doc

OPC服务器和客户端程序开发指南第一章OPC概述关键词:Comdcmopcda通信标准CLIENTSERVER GROUP ITEM自定义接口自动化接口同步异步回调随着计算机科学技术、工业控制等方面新技术的飞速发展,计算机监控系统从早期的集中式监控向全分布式方向发展,计算机监控系统软件随着面向对象技术的成熟,分布式对象计算、多级客户机/服务器技术也从早期的功能系统软件,发展成为以特定现场设备为特征的面向对象的监控系统软件。

与此同时,计算机监控系统的规模越来越大,不同厂家生产的现场设备种类也越来越多。

由于不同厂家提供的现场设备的通信机制不尽相同,需要由计算机监控系统软件开发的硬件设备通信驱动程序越来越多,导致硬件通信驱动程序需要不断开发的现象。

基于COM/DCOM技术的OPC技术提供了统一的通信标准,不同的厂商只要遵循OPC技术标准,就可以实现软硬件的互操作。

过程控制技术是专门为过程控制而设计的。

它是由一些世界领先的自动化系统和软硬件公司与微软公司密切合作建立的,并成立了一个专门的OPC 基金会来管理它。

OPC基金会负责OPC规范的制定和发布。

OPC提出了一套统一的标准,采用典型的客户机/服务器模式。

硬件设备的驱动程序由硬件制造商或专业公司完成,为服务器程序提供统一的OPC接口标准。

软件制造商只能通过根据OPC标准编写客户端程序来访问(读/写)服务器程序来实现与硬件设备的通信。

如图1.1所示,与传统的通信开发方法相比,OPC技术具有以下优点:硬件供应商熟悉他们自己的硬件设备,因此设备驱动程序更加可靠和高效。

软件制造商可以缩短复杂设备驱动程序的开发周期,只需要开发一套符合OPC标准的程序来实现与硬件设备的通信,这样就可以投入人力和物力来改善系统功能。

可以实现软件和硬件的互操作性。

OPC区分了软件和硬件制造商,大大提高了双方的工作效率。

图1.1应用前后的OPC技术对比因此,OPC技术的出现得到了众多软硬件制造商的支持,并且发展迅速。

(完整word版)OPCclient在VC环境下编程

(完整word版)OPCclient在VC环境下编程

OPC client 在VC环境下编程一.连接使用到变量的说明类型说明HRESULT 函数返回值,用来检测函数返回值(如:初始化COM库,查找CLSID,创建OPC服务等),提供函数执行情况CLSID 全球唯一标示符,用来确定OPC服务的标识,从注册表查找获得LPWSTR LPSTR和LPWSTR是Win32和VC++所使用的一种字符串数据类型.LPSTR被定义成是一个指向以NULL(‘\0')结尾的8位ANSI字符数组指针,而LPWSTR是一个指向以NULL结尾的16位双字节字符数组指针OPC接口说明IOPCServer *m_IOPCServer;IOPCServer 接口及成员函数主要用于对组对象进行创建,删除,枚举和获取当前状态等操作.是OPC 服务器对象的主要接口.接口及成员IOPCItemMgt *m_IOPCItemMgt;IOPCItemMgt 接口及成员函数用于OPC 客户程序添加、删除和组对象中组员等控制操作。

IOPCSyncIO *m_IOPCSyncIO;IOPCSyncIO 用于同步数据访问。

OPCITEMDEF m_Items[1];OPCITEMDEF 数组,包含着项的存取路径, 定义和被请求的数据类OPCITEMRESULT *m_ItemResult;OPCITEMRESULT 数组,服务器用来告诉客户关于项的附加的信息(项句柄和规范的数据类型)OPCHANDLE m_GrpSrvHandle;OPC服务的句柄,在多个函数中都会用到使用到的函数说明CoInitialize(NULL); 初始化COM库CoInitialize是Windows提供的API函数,用来告诉Windows以单线程的方式创建com对象.应用程序调用com库函数(除CoGetMalloc和内存分配函数)之前必须初始化com库。

返回值S_OK : 该线程中COM库初始化成功S_FALSE 该线程中COM库已经被初始化CoInit ialize () 标明以单线程方式创建。

使用C#开发OPC Client的研究和应用

使用C#开发OPC Client的研究和应用

1 OPC 和C#概述1.1OPC 概述OPC (OLE for Process Control)是一种利用微软的 C O M /D C O M 技术来达成自动化控制的协议,根据 OPC Specifica-tion 的定义,OPC is "a standard mecha-nism for communicating to numerous data sources, either devices on the factory floor, or a database in a control room."现代化企业中自动化程度越来越高,数据量也在成倍增长,为了能够充分利用这些数据,发展出了ER P/ME S等信息化系统,这些系统架构大体如图1。

OPC协议做为一种通讯转换协议,介于下层控制系统与上层软件之间;它隐藏下层系统的不同,为上层的数据应用提供一个统一的接口,使得上层软件在数据集成时,无需考虑下层控制系统的协议和实现方式,只要符合OP C客户端的接口规范即可,这大大节省了上层软件在数据集成方面的工作。

OPC发展至今已有1.0、2.0、3.0等几个版本,在目前工业自动化中以2.0使用最为广泛。

1.2C#概述C#(念法:C Sharp,音标[∫a:p])是微软公司在2000年6月发布的一种新的编程语言,并在微软职业开发者论坛(PDC)上登台亮相。

C #是微软公司研究员A n d e r s Hejlsberg的研究成果。

C#看起来与Java有着惊人的相似;但是C#与Java也有着明显的不同,它借鉴了De lph i的一个特点,与COM (组件对象模型)是直接集成的,而且它是微软公司.NET windows网络框架的主角。

C#旨在设计成为一种“简单、现代、通用”,以及面向对象的程序设计语言。

此种语言的实现,应提供对于以下软件工程要素的支持:强类型检查、数组维度检查、未初始化的变量引用检测、自动垃圾收集(Garbage Collection,指一种自动内存释放技术)。

opc编程

opc编程

C++6.0环境下的OPC通信设计及其在控制系统中的应用Posted by admin十一月 24, 2009随着计算机技术和控制技术的不断发展,现代工业过程控制系统逐渐发展成为现场设备管理,过程管理和商业管理三个层次组成的系统,然而它们之间却存在相互通信的问题,其主要问题是不同的计算机系统(DCS,MIS等)的接口不统一、不标准,过程控制系统和信息系统各有专用技术接口以及API(应用程序接口)。

尽管可以编写定制的驱动程序和接口程序,但因不同类型硬件及软件包都需相互通信,使得驱动程序的种类迅速地增长,并且连接程序开发没有一个统一、开放的标准,不同程序间易相互冲突。

这种情况不仅增加了用户的负担,而且在实际上并不能真正解决不同系统的互操作性【1~2】。

出于对上述问题的考虑,1996年8月,一个由自动化领域的领先公司组成的工作组在Microsoft公司帮助下提出了一个基于微软 OLE,COM,DCOM,XML,Internet及Net技术的开放的、灵活的、即插即用的工业标准OPC【3】。

2 OPC技术简介2.1 OPC背景OPC(OLE for Process Control)是基于Microsoft公司的Distributed internet Application(DNA)构架和Component Object Model(COM)技术,根据易扩展性而设计的。

OPC规范定义了一个工业标准接口,该标准使得COM技术适用与过程控制和制造自动化等应用领域。

OLE原意即对象链接与嵌入,而现在的OLE包含了许多新的特征,如统一数据传输、结构化存储和自动化,已经成为独立于计算机语言、操作系统甚至硬件平台的一种规范。

PLC2.2 OPC接口结构OPC由两套接口组成:客户端和服务器程序员使用的OPC自定义接口(OPC COM Custom Interfaces);支持用高端商业应用开发的客户程序的OPC自动化接口(OPC OLE Automation Interfaces)。

VC OPC Client 核心代码

VC OPC Client 核心代码
&dwRevUpdateRate, // [out] revised update rate
IID_IUnknown, // [in] REFIID riid,
(LPUNKNOWN*)&pUNKgroup); // [out, iid_is(riid)] LPUNKNOWN *pUNKgroup
hr= CLSIDFromProgID(wszProgID, // [in]
&clsid); // [out]
if(FAILED(hr))
{
CoTaskMemFree(&clsid); //COM 内存释放函数
CoUninitialize(); //终止COM库功能服务
if(pResults) CoTaskMemFree(pResults);
if(pIAsync2) pIAsync2->Release();
if(pISync) pISync->Release();
if(pIItemMgt) pIItemMgt->Release();
if(pOPC) pOPC->Release();
return 16; //获取clsid失败
}
//--------------------------------
//创建Server实例
hr=CoCreateInstance(clsid, //[in]
MultiByteToWideChar(CP_ACP, 0, mIOMDevice->ConfigMessage, -1, wchBuffer, 255);
//添加组
hr = pOPC->AddGroup (

基于Visual C的OPC客户端实现

基于Visual C的OPC客户端实现

《自动化技术与应用》2007年第26卷第4期计算机应用曼旦巴旦竺!皇!垒旦巳!!里璺塑旦旦璺基于VisualC++的OPC客户端实现纪强君,.唐秀昆z,曹长修3(1.重庆大学自动化学院,重庆400044;2.军事医学科学院,北京815200)摘要:OPC为工业现场设备通信提供了标准,本文通过介绍OPc技术的工作原理,结合OPc客户端的工作机制,简要介绍了OPc客户端程序的开发方法及用VisualC++实现的具体步骤。

关键词:OPC标准;0PC客户端;VisualC++中国分类号:TP33.7文献标识码:B文章编号:1003—724l(2007)04一0070—04OPCCIientDevelOpmentBaSedOnVISuaIC++JIQiang-_junl,TANGXiu-kun2,CAoChang-xiu3(1.ConegeofAutl湖撕on,ChongqingUIliVersity,Chongqing400044,Cllina;2.AcademyofIIlilita巧medicalscience,B蜘ing815200,C11ina)Abstract:0PCprovidesastandardformecommunicationsofindustrialfieldapparatus.Thispaperintroducestheprinciplesof0PC,andpresentstlledesignofaOPCclientbyusingⅥsualC++.KeyWords:0PCstandard;OPCclieIlt;ⅥsualC++1引言在传统控制系统中,各种过程控制方面的应用程序是通过驱动程序与现场设备进行数据交换的,这种方式存在着很多问题,例如:同一种设备为适应不同的应用程序可能需要有多种不同的驱动程序,不同驱动程序之间存在着不一致性,驱动程序对硬件存在着极大的依赖性等等。

为解决这些问题,一些技术上领先的自动化硬件和软件供应商与微软合作定义了一套统一的标准,这就是OPC标准。

VC环境下的OPC客户端程序开发

VC环境下的OPC客户端程序开发

VC环境下的OPC客户端程序开发摘要本文通过分析OPC 数据访问规范,介绍了有关OPC技术的基本概念、数据访问方式以及编写OPC客户端接口程序的一般方法。

同时给出了一个具体实例,用Visual C ++编写了一个OPC客户端接口程序,并利用OPC服务器KEPServer对其进行测试,实现了OPC客户端与OPC服务器之间的数据交换。

关键词 OPC服务器;OPC客户端;COM技术1 引言随着通信技术、计算机技术和自动化技术的快速发展,大范围信息共享的需求在自动化系统中显得越来越来越重要,现代工业控制系统已逐渐发展成为以现场设备层、过程控制层和中央管理层三个层次组成的系统,因而对其开放性也提出了更高的要求。

在传统的控制系统中,现场设备之间以及现场设备与控制软件之间的信息共享主要是通过驱动程序来实现的,不同厂家的设备使用不同的驱动程序,使得软件开发商不得不开发大量驱动程序来连接这些设备,即使设备厂家在硬件上做小小的改动,应用程序就可能重写,这也势必造成工业控制软硬件的升级与维护不便,给用户和软件开发商带来巨大的工作负担。

同时,由于不同设备的驱动程序也有所不同,使得不同的应用程序也不能同时访问同一设备的数据,因此,需要制定一种统一开放的接口标准,使应用程序能够方便的存取一台或多台现场设备的数据,为不同厂商的软硬件提供一种系统集成和数据交换的途径。

正是在自动化系统开放性要求的驱使下,促使了OPC技术的产生。

2 OPC技术简介OPC(OLE for Process Control)是基于微软公司的DNA(Distributed InterNet Application)构架和COM (Component ObjectModel)/DCOM(Distributed COM)技术,根据易扩展性而设计的,OPC规范定义了一个工业标准接口,这个标准使得COM技术适用于过程控制和制造自动化等应用领域。

OLE最初意思为对象链接与嵌入,是微软的复合文档技术。

OPC客户端的研究与开发

OPC客户端的研究与开发

OPC客户端的研究与开发随着计算机技术的发展,计算机在工业控制领域发挥着越来越重要的作用。

各种仪器仪表都提供了与计算机通信的协议相通的功能。

但是,不同厂家产品的协议互不相同,即使上一同一家公司的不同产品与计算机之间的通信协议也不尽相同。

因为不同的语言和运行环境对驱动程序的接口有不同的要求,所以不仅软件厂商需要编写大量设备驱动,硬件厂家也需要为应用程序开发不同的驱动,这样软硬件厂商无疑都加大了开发成本,同时此方案也不符合软件工程的发展趋势,在这样的背景下,OPC技术应运而生。

OPC(OLE for Process Control)技术为工业控制领域提供了一种标准的数据访问机制,将硬件与应用软件有效的分离开来。

不同的硬件厂商只需为各自的设备提供带有OPC接口的服务器,软件厂商可以采用支持OPC接口的客户端程序对它们进行统一方式的访问。

1OPC技术的特点OPC(OLE for Process Control)是工控行业的软件接口标准,它试图按照标准的方法完成不同设备之间数据的交换。

OPC基金会是OPC规范的制定者,制定了数据访问、历史数据访问、事件与报警、批处理、OPC DA XML等一系列标准。

OPC基于微软的COM技术,它具有如下的优点:(1)高速的数据传输;(2)基于分布式COM的安全性管理机制;(3)降低开发成本;(4)可以实现具有高度柔韧性功能的系统;(5)可以实现具有高可靠性的系统。

1.1 OPC服务器OPC数据访问提供数据源读取和写入特定数据的手段。

OPC数据访问对象是如图1所示的分层结构构成。

一个OPC服务器对象(OPC SERVER)具有一个作为子对象的OPC组集合对象(OPC GROUPS);在这个OPC组集合对象里可以添加多个OPC组对象(OPC GROUP);各个OPC 组对象都具有一个作为子对象的OPC标签集合对象(OPC ITEMS);在这个OPC标签集合对象里面可以添加多个OPC标签对象(OPC ITEM)。

(C#)OPC客户端源码

(C#)OPC客户端源码

【转】(C#)OPC客户端源码转载申明申明:本文为转载,如需转载本文,请获取原文作者大尾巴狼啊的同意,谢谢合作!转自:大尾巴狼啊原文出处:/xiaosacao/archive/2009/01/13/1374895.html前几天我就发布过这篇文章,可惜的是,发布后代码有的却看不到,后来我就删了,至今不明白什么原因- -!关于C++、VB来开发OPC客户端的资料网上有很多,但C#的至今没发现有多少。

由于近期项目的需要,就开发了OPC客户端的一个模块。

在我想来,程序员挺累的,原因我很累。

所以我想大家也很累~~~嘿嘿。

特别是刚接手OPC客户端开发的前几天,天天盯住显示器,百度、GOOGLE不停的搜索。

每天早上醒来,眼睛都瑟瑟的。

从事3年以上软件开发的朋友们,估计都会腰酸背痛吧!反正我是这样的。

不说那么多废话了,贴上源码,让需要的同行看看吧,代码的质量并不高,就当做抛砖引玉吧!1、枚举本地服务器2、获取服务器信息3、列出了服务器上Tag4、可以设置组的属性5、读\写功能6、可进行远程连接(DCOM需配置)先看图:引用类库:OPC服务器:开发工具:当前环境:源码:///程式使用C#.NET 2005 编写///引用类库OPCDAAuto.dll///OPCServer采用KEPWare///在windows xp sp2、sp3、windows 2003上测试通过///完成于:2008年12月31日///测试于:2009年01月05日//////作者:潇洒草///Email:zhkai868@///QQ:44649029//////如分发,请保留此摘要。

///鄙视那些拿代码当宝贝的人,鄙视那些你不拿源码换就不稀罕你的人,鄙视那些自私的人。

///别人看到你的代码,你能死啊?对你有多大威胁啊?强烈鄙视~~~///如果你是这样的人,赶紧关了。

偶不欢迎。

using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Text;using System.Windows.Forms;using ;using System.Collections;using OPCAutomation;namespace OPC测试通过{public partial class MainFrom : Form{public MainFrom(){InitializeComponent(); }#region私有变量///<summary>/// OPCServer Object///</summary>OPCServer KepServer;///<summary>/// OPCGroups Object///</summary>OPCGroups KepGroups;///<summary>/// OPCGroup Object///</summary>OPCGroup KepGroup;///<summary>/// OPCItems Object///</summary>OPCItems KepItems;///<summary>/// OPCItem Object///</summary>OPCItem KepItem;///<summary>///主机IP///</summary>string strHostIP = "";///<summary>///主机名称///</summary>string strHostName = "";///<summary>///连接状态///</summary>bool opc_connected = false; ///<summary>///客户端句柄///</summary>int itmHandleClient = 0;///<summary>///服务端句柄///</summary>int itmHandleServer = 0;#endregion#region方法///<summary>///枚举本地OPC服务器///</summary>private void GetLocalServer(){//获取本地计算机IP,计算机名称IPHostEntry IPHost = Dns.Resolve(Environment.MachineName);if (IPHost.AddressList.Length > 0){strHostIP = IPHost.AddressList[0].ToString();}else{return;}//通过IP来获取计算机名称,可用在局域网内IPHostEntry ipHostEntry = Dns.GetHostByAddress(strHostIP);strHostName=ipHostEntry.HostName.ToString();//获取本地计算机上的OPCServerNametry{KepServer = new OPCServer();object serverList = KepServer.GetOPCServers(strHostName);foreach (string turn in (Array)serverList){cmbServerName.Items.Add(turn);}cmbServerName.SelectedIndex = 0;btnConnServer.Enabled = true;}catch(Exception err){MessageBox.Show("枚举本地OPC服务器出错:"+err.Message,"提示信息",MessageBoxButtons.OK,MessageB oxIcon.Warning);}}///<summary>///创建组///</summary>private bool CreateGroup(){try{KepGroups = KepServer.OPCGroups;KepGroup = KepGroups.Add("OPCDOTNETGROUP");SetGroupProperty();KepGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(KepGroup_DataChange);KepGroup.AsyncWriteComplete += new DIOPCGroupEvent_AsyncWriteCompleteEventHandler(KepGroup _AsyncWriteComplete);KepItems = KepGroup.OPCItems;}catch (Exception err){MessageBox.Show("创建组出现错误:"+err.Message,"提示信息",MessageBoxButtons.OK,MessageBoxIcon. Warning);return false;}return true;}///<summary>///设置组属性///</summary>private void SetGroupProperty(){KepServer.OPCGroups.DefaultGroupIsActive =Convert.ToBoolean(txtGroupIsActive.Text);KepServer.OPCGroups.DefaultGroupDeadband = Convert.ToInt32(txtGroupDeadband.Text);KepGroup.UpdateRate = Convert.ToInt32(txtUpdateRate.Text);KepGroup.IsActive = Convert.ToBoolean(txtIsActive.Text);KepGroup.IsSubscribed =Convert.ToBoolean(txtIsSubscribed.Text);}///<summary>///列出OPC服务器中所有节点///</summary>///<param name="oPCBrowser"></param>private void RecurBrowse(OPCBrowser oPCBrowser){//展开分支oPCBrowser.ShowBranches();//展开叶子oPCBrowser.ShowLeafs(true);foreach (object turn in oPCBrowser){listBox1.Items.Add(turn.ToString());}}///<summary>///获取服务器信息,并显示在窗体状态栏上///</summary>private void GetServerInfo(){tsslServerStartTime.Text ="开始时间:"+ KepServer.StartTime.ToString()+" ";tsslversion.Text ="版本:"+ KepServer.MajorVersion.ToString() + "." + KepServer.MinorVersion.ToS tring()+"."+KepServer.BuildNumber.ToString();}///<summary>///连接OPC服务器///</summary>///<param name="remoteServerIP">OPCServerIP</param>///<param name="remoteServerName">OPCServer名称</param>private bool ConnectRemoteServer(string remoteServerIP, string remoteServerName){try{KepServer.Connect(remoteServerName, remoteServerIP);if (KepServer.ServerState == (int)OPCServerState.OPCRunning){tsslServerState.Text = "已连接到-" + KepServer.ServerName + " ";}else{//这里你可以根据返回的状态来自定义显示信息,请查看自动化接口API文档tsslServerState.Text = "状态:" + KepServer.ServerState.ToString() + " ";}}catch (Exception err){MessageBox.Show("连接远程服务器出现错误:" + err.Message, "提示信息", MessageBoxButtons.OK, Mess ageBoxIcon.Warning);return false;}return true;}#endregion#region事件///<summary>///写入TAG值时执行的事件///</summary>///<param name="TransactionID"></param>///<param name="NumItems"></param>///<param name="ClientHandles"></param>///<param name="Errors"></param>void KepGroup_AsyncWriteComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Arr ay Errors){lblState.Text = "";for (int i = 1; i <= NumItems; i++){lblState.Text += "Tran:" + TransactionID.ToString() + " CH:" + ClientHandles.GetValue(i). ToString() + " Error:" + Errors.GetValue(i).ToString();}}///<summary>///每当项数据有变化时执行的事件///</summary>///<param name="TransactionID">处理ID</param>///<param name="NumItems">项个数</param>///<param name="ClientHandles">项客户端句柄</param>///<param name="ItemValues">TAG值</param>///<param name="Qualities">品质</param>///<param name="TimeStamps">时间戳</param>void KepGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemV alues, ref Array Qualities, ref Array TimeStamps){//为了测试,所以加了控制台的输出,来查看事物ID号//Console.WriteLine("********"+TransactionID.ToString()+"*********");for (int i = 1; i <= NumItems; i++){this.txtTagValue.Text = ItemValues.GetValue(i).ToString();this.txtQualities.Text = Qualities.GetValue(i).ToString();this.txtTimeStamps.Text = TimeStamps.GetValue(i).ToString();}}///<summary>///选择列表项时处理的事情///</summary>///<param name="sender"></param>///<param name="e"></param>private void listBox1_SelectedIndexChanged(object sender, EventArgs e){try{if (itmHandleClient != 0){this.txtTagValue.Text = "";this.txtQualities.Text ="";this.txtTimeStamps.Text = "";Array Errors;OPCItem bItem = KepItems.GetOPCItem(itmHandleServer);//注:OPC中以1为数组的基数int[] temp = new int[2] { 0, bItem.ServerHandle };Array serverHandle = (Array)temp;//移除上一次选择的项KepItems.Remove(KepItems.Count, ref serverHandle, out Errors);}itmHandleClient = 1234;KepItem = KepItems.AddItem(listBox1.SelectedItem.ToString(), itmHandleClient); itmHandleServer = KepItem.ServerHandle;}catch(Exception err){//没有任何权限的项,都是OPC服务器保留的系统项,此处可不做处理。

C#开发串口与OPC程序

C#开发串口与OPC程序

C# API方式串口读写在调试ICU通信设备的时候,由于串口通信老出现故障,所以就怀疑CF实现的SerialPort 类是否有问题,所以最后决定用纯API函数实现串口读写。

先从网上搜索相关代码(关键字:C# API 串口),发现网上相关的资料大约来源于一个版本,那就是所谓的msdn提供的样例代码(msdn的具体出处,我没有考证),其它的代码大都是它的变种。

其实这个示例代码是有问题的,也就是说DCB结构体声明的有问题,虽然该代码可以正常通信,不过如果你设置了奇偶校验的话,你会发现奇偶校验无效。

VC中的DCB结构声明如下:typedef struct _DCB {DWORD DCBlength; /* sizeof(DCB) */DWORD BaudRate; /* Baudrate at which running */DWORD fBinary: 1; /* Binary Mode (skip EOF check) */DWORD fParity: 1; /* Enable parity checking */DWORD fOutxCtsFlow:1; /* CTS handshaking on output */DWORD fOutxDsrFlow:1; /* DSR handshaking on output */DWORD fDtrControl:2; /* DTR Flow control */DWORD fDsrSensitivity:1; /* DSR Sensitivity */DWORD fTXContinueOnXoff: 1; /* Continue TX when Xoff sent */DWORD fOutX: 1; /* Enable output X-ON/X-OFF */DWORD fInX: 1; /* Enable input X-ON/X-OFF */DWORD fErrorChar: 1; /* Enable Err Replacement */DWORD fNull: 1; /* Enable Null stripping */DWORD fRtsControl:2; /* Rts Flow control */DWORD fAbortOnError:1; /* Abort all reads and writes on Error */DWORD fDummy2:17; /* Reserved */WORD wReserved; /* Not currently used */WORD XonLim; /* Transmit X-ON threshold */WORD XoffLim; /* Transmit X-OFF threshold */BYTE ByteSize; /* Number of bits/byte, 4-8 */BYTE Parity; /* 0-4=None,Odd,Even,Mark,Space */BYTE StopBits; /* 0,1,2 = 1, 1.5, 2 */char XonChar; /* Tx and Rx X-ON character */char XoffChar; /* Tx and Rx X-OFF character */char ErrorChar; /* Error replacement char */char EofChar; /* End of Input character */char EvtChar; /* Received Event character */WORD wReserved1; /* Fill for now. */} DCB, *LPDCB;有问题的代码DCB结构声明如下:[StructLayout(LayoutKind.Sequential)]public struct DCB{public int DCBlength;public int BaudRate;public int fBinary;public int fParity;public int fOutxCtsFlow;public int fOutxDsrFlow;public int fDtrControl;public int fDsrSensitivity;public int fTXContinueOnXoff;public int fOutX;public int fInX;public int fErrorChar;public int fNull;public int fRtsControl;public int fAbortOnError;public int fDummy2;public uint flags;public ushort wReserved;public ushort XonLim;public ushort XoffLim;public byte ByteSize;public byte Parity;public byte StopBits;public byte XonChar;public byte XoffChar;public byte ErrorChar;public byte EofChar;public byte EvtChar;public ushort wReserved1;}对C++比较熟悉网友应该知道,结构体中这种格式的声明,如DWORD fBinary: 1;是以位为单位进行变量设置的,DCB中相关位一共占4个字节,也就是相当于C#中的一个int变量所占的空间。

基于VC的OPC客户端软件研究与实现

基于VC的OPC客户端软件研究与实现

摘要随着控制技术、计算机技术、网络通信技术的发展,自动化系统对大范围信息共享的需求越来越迫切,因而对工业控制系统的开放性提出了越来越高的要求。

而工业界所广泛使用的传统的DCS、FCS等类系统由于采用自定义的专用网络和协议,没有统一的接口标准,难以与其他厂家的系统或仪表互连、互操作。

各家自成体系,所形成的“信息孤岛”难以与外界交换数据。

OPC技术把对象链接和嵌入技术应用于工业过程控制领域,为工业控制领域提供了一种标准的数据访问机制。

本文在深入研究OPC DA规范和COM技术的基础上进行了OPC客户端软件程序的设计和开发,采用Visual C++6.0作为开发工具,从整体到局部详细分析了客户端的具体实现。

本文给出了主要的实现方法和步骤,提供了主要函数的定义和关键部分的代码,并针对OPC服务器的注册、交互问题进行了细致的研究,提出了解决这些问题的方法。

本文对客户端的性能进行了测试,结果表明OPC客户端的功能基本实现,得到了客户端软件设计的一般方法。

这对研究系统软件封闭、互操作性差的异构系统集成意义重大,是一个很有意义的课题。

关键词OPC 定制接口数据访问规范 MFCAbstractWith the development of Control technology, Computer technology, Network Communication technology, automation system is more and more urgent to share large scale information, and needs more opened industry control system. But traditional DCS, FCS control system applied in industry use its network and agreement, lack unified interface standard, it would be difficult to connect other systems and meters. “Information isolated island” is formed and difficult to change data with external systems and meters.OPC applies OLE (Object linking and Embedding) technology into industry Process Control Fields, and provides a kind of standard data access method.The paper studies deeply OPC DA specification,designs and develops OPC client software based on COM technology, adopted Visual C ++6.0 as the development tool of cilent, made a detailed analysis from whole to part on the concrete realization of the OPC cilent. The paper provides main methods to implement it, provides main function and critical code, goes deep into register of OPC server and alternation. Tests have been made to testing the function of the OPC client software, the result of testing indicated that the basic function of this OPC cilent has universality, finally we obtained the general method of design OPC client. It is critical to realize integration of distributed and isomerous system which is close in system software and is bad interoperability, this thesis has its significance.Key OPC Custom Interface Data Access Standard MFC目录第一章绪论 (1)1.1 OPC技术的概念和特点 (1)1.2 OPC技术的意义 (3)1.3 OPC技术应用与发展 (3)1.4 论文的课题背景及意义 (4)1.5 本文研究的主要内容及所作的工作 (5)1.6 论文结构组织 (5)第二章OPC技术介绍 (7)2.1 OPC的对象和接口 (7)2.1.1 OPC的自动化接口对象 (7)2.1.2 OPC的定制接口对象 (11)2.2 OPC数据访问规范 (13)2.2.1 OPC规范基本概念 (13)2.2.2 OPC数据访问规范 (13)2.3 OPC技术基础 (15)2.3.1 COM技术[13] (15)2.3.2 客户/服务器模型 (16)2.3.3 COM库 (18)2.3.4 COM特性 (19)2.3.5 COM组件的创建 (20)2.3.6 COM组件的开发工具——MFC与ATL (21)第三章OPC客户端软件的总体设计 (24)3.1 OPC客户端软件的功能设计 (24)3.2 OPC客户端软件的总体框架设计 (24)3.3 OPC客户端软件技术的研究 (25)3.3.1 MFC (25)3.3.2 ATL (27)3.3.3 消息映射[19] (28)第四章OPC客户端软件的设计与实现 (30)4.1 OPC客户端软件功能的具体实现 (30)4.1.1 初始化 (32)4.1.2 添加组对象和标签对象 (33)4.1.3 对数据项进行同步读写访问和异步读写访问 (37)4.1.4 删除创建的对象 (40)4.1.5 卸载COM库 (43)4.2 OPC客户端与服务器交互[25] (43)第五章OPC客户端软件的功能测试 (49)5.1 连接OPC服务器测试软件 (49)5.1.1 进程外的COM服务器的实现 (49)5.1.2 OPC服务器实现中的两个问题[26] (50)5.1.3 利用DCOM技术实现OPC远程服务器 (51)5.1.4 与OPC服务器连接测试客户端 (55)5.2 服务器注册[29] (58)第六章结束语 (60)在读期间发表论文情况 (63)致谢 (64)学位论文独创性声明 (65)学位论文知识产权权属声明 (65)第一章 绪论1.1 OPC技术的概念和特点在生产现场,存在着大量控制器和现场数字设备,这些设备来自不同的制造商,遵从不同的通讯标准,只能组成各自的控制系统,与特定的应用软件通讯。

OPC基础概念-在VC中如何实现OPC访问数据库

OPC基础概念-在VC中如何实现OPC访问数据库

OPC基础概念-在VC中如何实现OPC访问数据库在VC中如何实现OPC数据访问How to achieve data access through OPC in VC摘要本文主要讲述了在VC语言环境下,编程实现通过SimaticNet提供的OPC Server,访问PLC中数据的步骤,此方法同样适用于WinCC作为OPC Server时的数据访问。

关键词 SimaticNet、VC、OPC、WinCCKey Words SimaticNet、VC、OPC、WinCCIA&DT Service & Support Page 2-42在VC中如何实现OPC数据访问 (1)1、概述 (4)1.1 OPC介绍 (4)1.2 OPC的读写方式 (5)1.3 OPC访问接口方式 (6)2、测试环境 (7)2.1 硬件要求 (7)2.2 软件要求 (7)3、OPC Server端组态配置 (7)4、用VC自定义设计过程 (9)4.1 同步读写 (9)4.2 异步读写 (16)5、OPCItem的数据类型 (24)6、小结 (24)7、代码 (24)7.1 异步读写(包括订阅) (24)IA&DT Service & Support Page 3-421、概述1.1 OPC介绍OPC是Object Linking and Embedding(OLE)for Process Control的缩写,它是微软公司的对象链接和嵌入技术在过程控制方面的应用。

OPC以OLE/COM/DCOM技术为基础,采用客户/服务器模式,为工业自动化软件面向对象的开发提供了统一的标准,这个标准定义了应用Microsoft操作系统在基于PC的客户机之间交换自动化实时数据的方法,采用这项标准后,硬件开发商将取代软件开发商为自己的硬件产品开发统一的OPC接口程序,而软件开发者可免除开发驱动程序的工作,充分发挥自己的特长,把更多的精力投入到其核心产品的开发上。

基于VB的OPC客户端软件的设计与实现 (2)

基于VB的OPC客户端软件的设计与实现 (2)

收稿日期:2010-12-21作者简介:王绪彪(1983-),在读硕士研究生,主要从事工业控制网络研究工作。

基于VB 的OPC 客户端软件的设计与实现王绪彪,张 望,江丹玲(福州大学自动化系 福州,350108)摘 要:为解决控制领域软硬件之间数据通信困难的问题,提高实时数据访问的性能,本文对OPC数据存取规范进行了深入研究,重点分析了自动化接口标准,结合Visual Basic语言相对容易,开发周期短等特点,故采用VisualBasic作为开发语言,设计并实现了基于VB的OPC客户端应用软件。

通过测试,OPC客户端软件取得了不错的通信效果。

关键词:OPC数据访问规范;自动化接口;客户端软件Abstract: With the purpose to solve the difficulties of data communication between software and hardware in control field, and improve the function of real-time data accessing, this paper mainly studies on the OPC data access specification and then analyses deeply the standard of the automation interface. Combing with Visual Basic that is is relatively easy , short development cycle and so on.SO the paper use Visual Basic as devepment language, design and implement OPC client application software based on Visual Basic.Through the test, OPC client software achieved good communication effect.Key words: OPC data access specification ; Automation interface ; Client application中图分类号:TP391 文献标识码:B 文章编号:1001-9227(2011)02-0046-040 引 言传统方式开发的监控软件系统,由于不具备开放性,工业控制软件缺乏统一的工业标准,致使不同厂家提供的软硬件之间进行通信存在很大的困难,一方面,由于各厂家提供的软件对控制系统硬件操作的设备驱动程序接口不同,软件开发者需针对不同的硬件开发相应的驱动程序。

VC和VB开发OPC客户端程序开发步骤

VC和VB开发OPC客户端程序开发步骤

VC和VB开发OPC客户端程序开发步骤VC++和VB开发OPC客户端程序开发步骤双击自动滚屏发布者:admin发布时间:2009-11-18阅读:168次OPC客户端程序就是一种COM客户端程序,实现COM客户端程序编程模型需要六个基本步骤。

根据所在的程序设计环境或应用框架,有些步骤也许可以由编译程序自动实现。

在C++中,接口是通过指针引用的,而在Visual Basic中使用的默认接口。

(1)初始化COM库。

在C++中完成此功能的是调用COM库API(应用程序编程接口)函数CoInitialize或CoInitialzeEx。

Visual Basic中可以自动进行初始化。

(2)获得初始接口的指针。

在C++中,可以通过调用CoCreateInstance(用于本地)或CoCreateInstanceEx(用于远程)来获得接口指针。

在Visual Basic中,可以使用操作符New或CreateObject来获得接口引用。

(3)通过接口指针可以调用该接口的方法。

(4)如果要调用其它接口的方法,可以执行QueryInterface。

在C++中,通过接口指针调用QueryInterface。

在Visual Basic 6.0中,可以通过执行一个Set操作实现。

(5)在C++中,当不再使用接口指针时,要调用Release将其释放。

在Visual Basic 中,引用在其作用域外会自动释放,也可以显式地把它设置为“Nothing”。

(6)当用完COM时,你要调用CoUninitialize来取消COM初始化。

Visual Basic可以自动实现这一步。

通过这六个基本步骤的比较,就比较清楚地知道采用Visual Basic 开发环境是比较容易和方便的。

就开发语言本身而言,Visual Basic也比Visual C++语言容易掌握。

而且组态软件一般就有类似的Visual Basic脚本语言,对于本来就使用组态软件开发监控软件的用户来说,也是比较容易掌握Visual Basic开发OPC客户端程序。

c#opc客户端开发

c#opc客户端开发

using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using OPCAutomation;using ;namespace Opc_Client{public partial class Form1 : Form{public Form1(){InitializeComponent();}#region私?有®D变À?量¢?OPCServer SyServer;OPCGroups SyGroups;OPCGroup SyGroup;OPCItems SyItems;OPCItem SyItem;string strHostIP = string.Empty;string strHostName = string.Empty;bool opc_connected = false; //连¢?接¨®状Á¡ä态¬?int itmHandleClient = 0; //客¨ª户¡ì端?句?柄À¨²int itmHandleServer = 0; //服¤t务?端?句?柄À¨²#endregion#region方¤?法¤¡§private void GetLocalServer(){IPHostEntry IPHost = Dns.GetHostEntry(Dns.GetHostName());if (IPHost.AddressList.Length > 0){strHostIP = IPHost.AddressList[4].ToString();this.tboxServerIP.Text = strHostIP.ToString();}else{return;}IPHostEntry ipHostEntry = Dns.GetHostByAddress(strHostIP);strHostName = ipHostEntry.HostName.ToString();try{SyServer = new OPCServer();object serverList = SyServer.GetOPCServers(strHostName);foreach (string turn in (Array)serverList){this.cmbServerName.Items.Add(turn);cmbServerName.SelectedIndex = 0;btnConnServer.Enabled = true;}}catch (Exception err){MessageBox.Show("枚?举¨´本À?地Ì?OPC服¤t务?器¡Â出?错䨪:êo"+err.Message,"提¬¨¢示º?信?息¡é",MessageBoxButtons.OK,MessageBoxIcon.Warning);}}private bool CreatGroup(){try{SyGroups = SyServer.OPCGroups;SyGroup = SyGroups.Add("OPCDOTNETGROUP");SetGroupProperty();SyGroup.DataChange += newDIOPCGroupEvent_DataChangeEventHandler(SyGroup_DataChange);SyGroup.AsyncWriteComplete += newDIOPCGroupEvent_AsyncWriteCompleteEventHandler(SyGroup_AsyncWriteComplete);SyItems = SyGroup.OPCItems;}catch (Exception err){MessageBox.Show("创ä¡ä建¡§组Á¨¦出?现?错䨪误¨®"+err.Message,"提¬¨¢示º?信?息¡é",MessageBoxButtons.OK,MessageBoxIcon.Warning);return false;}return true;}private void LoadDataToTree(OPCBrowser oPCBrowser, TreeNodeCollection treeNodeCollection){anization.ToString();oPCBrowser.ShowBranches();foreach (object turn in oPCBrowser){TreeNode node = treeNodeCollection.Add(turn.ToString());treeView1.SelectedNode = node;oPCBrowser.MoveDown(turn.ToString());LoadDataToTree(oPCBrowser, node.Nodes);oPCBrowser.MoveUp();}oPCBrowser.ShowLeafs(false);foreach (object turn in oPCBrowser){treeView1.SelectedNode.Nodes.Add(turn.ToString());}}private void RecurBrows(OPCBrowser oPCBrowser){//string i = anizationLoadDataToTree(oPCBrowser, treeView1.Nodes[0].Nodes);oPCBrowser.ShowBranches();oPCBrowser.ShowLeafs(true);foreach (object turn in oPCBrowser){listBox1.Items.Add(turn.ToString());}}private void GetServerInfo(){this.toolStripStatusLabel1.Text = "开a始º?时º¡À间?:êo" + SyServer.StartTime.ToString() + " ";this.toolStripStatusLabel2.Text = "版ã?本À?:êo" +SyServer.MajorVersion.ToString() + "." + SyServer.MinorVersion.ToString() + "." + SyServer.BuildNumber.ToString();}private Boolean ConnectRemoteServer(string remoteServerIP, string remoteServerName){try{SyServer.Connect( remoteServerName,remoteServerIP);if (SyServer.ServerState == (int)OPCServerState.OPCRunning) {this.toolStripStatusLabel3.Text = "已°?连¢?接¨®到Ì?-" + SyServer.ServerName + " ";}else{this.toolStripStatusLabel3.Text = "状Á¡ä态¬?:êo" + SyServer.ServerState.ToString() + " ";}}catch (Exception err)MessageBox.Show("连¢?接¨®远?程¨¬服¤t务?器¡Â出?错䨪:êo" +err.Message, "提¬¨¢示º?信?息¡é", MessageBoxButtons.OK, MessageBoxIcon.Warning);return false;}return true;}private void SetGroupProperty(){SyServer.OPCGroups.DefaultGroupIsActive =Convert.ToBoolean(boBox1.SelectedItem);SyServer.OPCGroups.DefaultGroupDeadband = Convert.ToInt32(textBox1.Text); SyGroup.UpdateRate = Convert.ToInt32(textBox2.Text);SyGroup.IsActive = Convert.ToBoolean(comboBox2.SelectedItem);SyGroup.IsSubscribed = Convert.ToBoolean(comboBox3.SelectedItem);}#endregion#region事º?件tvoid SyGroup_AsyncWriteComplete(int TransactionID, int NumItems, ref Array ClientHandles, ref Array Errors){this.lblState.Text = "";for (int i = 1; i <= NumItems; i++){this.lblState.Text += "Tran:êo" + TransactionID.ToString() + " CH:êo" + ClientHandles.GetValue(i).ToString() + " Error:êo" +Errors.GetValue(i).ToString();}}void SyGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps){for (int i = 1; i <= NumItems; i++){this.tboxcurrvalue.Text = ItemValues.GetValue(i).ToString();this.tboxcurrquality.Text = Qualities.GetValue(i).ToString();this.tboxcurrtime.Text = TimeStamps.GetValue(i).ToString();}}private void Form1_Load(object sender, EventArgs e){btnConnServer.Enabled = false;btnServerBrush.Enabled = false;btnsetproparty.Enabled = false;btnwritevalue.Enabled = false;treeView1.Nodes.Add("Root");GetLocalServer();//SyServer.OPCGroups.DefaultGroupIsActive =Convert.ToBoolean(boBox1.SelectedItem);}private void listBox1_SelectedIndexChanged(object sender, EventArgs e){try{if (itmHandleClient != 0){this.tboxcurrvalue.Text = "";this.tboxcurrquality.Text = "";this.tboxcurrtime.Text = "";Array Errors;OPCItem bItem = SyItems.GetOPCItem(itmHandleServer);int[] temp = new int[2] { 0, bItem.ServerHandle };Array serverHandle = (Array)temp;SyItems.Remove(SyItems.Count, ref serverHandle, out Errors);}//int cancelID;itmHandleClient = 1234;SyItem = SyItems.AddItem(listBox1.SelectedItem.ToString(), itmHandleClient);itmHandleServer = SyItem.ServerHandle;//SyItem.Read(listBox1.SelectedItem.ToString(), out Value, out Quality, out TimeStamp);//SyGroup.AsyncRead(1, ref serverHandle, out Errors, 2016, out cancelID); }catch (Exception err){itmHandleClient = 0;this.tboxcurrvalue.Text = "Error ox";this.tboxcurrquality.Text = "Error ox";this.tboxcurrtime.Text = "Error ox";MessageBox.Show("此ä?项?为a系¦Ì统ª3保À¡ê留¢?项?:êo"+err.Message,"提¬¨¢示º?信?息¡é");}}private void Form1_FormClosing(object sender, FormClosingEventArgs e){if (!opc_connected){return;}if (SyGroup != null){SyGroup.DataChange -=newDIOPCGroupEvent_DataChangeEventHandler(SyGroup_DataChange);}if (SyServer != null){SyServer.Disconnect();SyServer = null;}opc_connected = false;}private void btnsetproparty_Click(object sender, EventArgs e){SetGroupProperty();}private void btnConnServer_Click(object sender, EventArgs e){try{if (!ConnectRemoteServer(tboxServerIP.Text, cmbServerName.Text)){return;}btnsetproparty.Enabled = true;opc_connected = true;GetServerInfo();RecurBrows(SyServer.CreateBrowser());if (!CreatGroup()){return;}}catch (Exception err){MessageBox.Show("初?始º?化¡¥出?错䨪:êo"+err.Message,"提¬¨¢示º?信?息¡é",MessageBoxButtons.OK,MessageBoxIcon.Warning);}}private void btnwritevalue_Click(object sender, EventArgs e){OPCItem bItem = SyItems.GetOPCItem(itmHandleServer);int[] temp = new int[2] {0,bItem.ServerHandle };Array serverHandle = (Array)temp;object[] valueTemp = new object[2] { "", tboxvaluewrite.Text };Array values = (Array)valueTemp;Array Errors;int cancelID;SyGroup.AsyncWrite(1, ref serverHandle, ref values, out Errors, 2016, out cancelID);//SyItem.Write(tboxvaluewrite.Text);GC.Collect();}private void btnServerBrush_Click(object sender, EventArgs e){strHostIP = tboxServerIP.Text;cmbServerName.Items.Clear();IPHostEntry ipHostEntry = Dns.GetHostByAddress(strHostIP);strHostName = ipHostEntry.HostName.ToString();try{SyServer = new OPCServer();object serverList = SyServer.GetOPCServers(strHostName);foreach (string turn in (Array)serverList){this.cmbServerName.Items.Add(turn);cmbServerName.SelectedIndex = 0;btnConnServer.Enabled = true;}}catch (Exception err){MessageBox.Show("枚?举¨´本À?地Ì?OPC服¤t务?器¡Â出?错䨪:êo" + err.Message, "提¬¨¢示º?信?息¡é", MessageBoxButtons.OK, MessageBoxIcon.Warning);}}}}。

《OPCDA服务器与客户程序开发指南》

《OPCDA服务器与客户程序开发指南》

第五章OPC 服务器的远程访问************************************************* The Distributed Component Object Model (DCOM) 是为了支持在局域网或者广域网或者INTERNET上的组件对象通讯。

因为DCOM技术基于COM技术,是COM的无缝延续,一种领先的组件技术,可以利用COM组件的优势来进行分布式的访问,因为DCOM,你不需要了解底层的网络协议。

通过DCOM技术,我们的OPC客户程序可以访问不在同一台机器上的OPC服务器。

DCOM一般而言在Microsoft Windows NT® 4.0及以上操作系统上运行。

实际上DCOM可以应用在UNIX的平台上()。

图5.1远程创建COM组件示意图一旦创建了远程的COM服务器,所有的调用将通过proxy和stub对象配置。

proxy和stub使用RPC(Remote Procedure Calls,远程过程调用)进行通信,RPC处理所有网络交互。

在服务器端,stub对象负责配置,而客户端则由proxy负责。

跨网络的数据传送由RPC负责。

实际上,DCOM使用一个扩展类型的RPC,称为对象RPC(Object RPC)或者ORPC。

RPC可以运行在多种不同的协议上,包括有TCP/IP,UDP,NetBEUI,NETBIOS和命名管道。

标准的RPC协议是UDP(用户数据报协议)。

UDP是一个无连接的协议,看来与DCOM这种面向连接的系统配合并不是一个好主意。

不过这并不是一个问题,DCOM自动负责管理连接。

对于COM组件而言,进程外组件不需要作任何修改,只需要把DCOM配置一下便可以供客户程序远程访问。

本章主要介绍如何配置DCOM来访问远程OPC服务器,以及DCOM的连接管理,最后给出Visual C++6.0下的远程访问OPC服务器的客户程序实例。

第一节OPC服务器远程访问的DCOM配置下面以Windows NT 4.0(SP6)和Windows 2000为例来说明远程访问OPC服务器时服务器端及客户端需要的配置。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VC环境下的OPC客户端程序开发来源:中国论文下载中心 [ 08-07-30 15:41:00 ] 作者:赵健师奕兵编辑:studa0714Ads by Google曙光刀片服务器TC2600支持Intel® Xeon® 5000系列处理器高密度高能效易管理低成本OPC Grape Seed Extract Save 70% on our Premium Blend: Worldwide Shipping Quoted Upfront SapphireTrend Premier OPC Trending solution for realtime process control & analysis 摘要本文通过分析OPC 数据访问规范,介绍了有关OPC技术的基本概念、数据访问方式以及编写OPC客户端接口程序的一般方法。

同时给出了一个具体实例,用Visual C++编写了一个OPC客户端接口程序,并利用OPC服务器KEPServer对其进行测试,实现了OPC客户端与OPC服务器之间的数据交换。

关键词OPC服务器;OPC客户端;COM技术1 引言随着通信技术、计算机技术和自动化技术的快速发展,大范围信息共享的需求在自动化系统中显得越来越来越重要,现代工业控制系统已逐渐发展成为以现场设备层、过程控制层和中央管理层三个层次组成的系统,因而对其开放性也提出了更高的要求。

在传统的控制系统中,现场设备之间以及现场设备与控制软件之间的信息共享主要是通过驱动程序来实现的,不同厂家的设备使用不同的驱动程序,使得软件开发商不得不开发大量驱动程序来连接这些设备,即使设备厂家在硬件上做小小的改动,应用程序就可能重写,这也势必造成工业控制软硬件的升级与维护不便,给用户和软件开发商带来巨大的工作负担。

同时,由于不同设备的驱动程序也有所不同,使得不同的应用程序也不能同时访问同一设备的数据,因此,需要制定一种统一开放的接口标准,使应用程序能够方便的存取一台或多台现场设备的数据,为不同厂商的软硬件提供一种系统集成和数据交换的途径。

正是在自动化系统开放性要求的驱使下,促使了OPC技术的产生。

2 OPC技术简介OPC(OLE for Process Control)是基于微软公司的DNA(Distributed InterNet Application)构架和COM (Component Object Model)/DCOM(Distributed COM)技术,根据易扩展性而设计的,OPC规范定义了一个工业标准接口,这个标准使得COM技术适用于过程控制和制造自动化等应用领域。

OLE最初意思为对象链接与嵌入,是微软的复合文档技术。

随着后续版本OLE2中导入了COM技术之后,现在的OLE在原版的基础上增加了更多新的功能,包括结构化存储、统一数据传输和自动化等,它已经成为独立于计算机语言、操作系统甚至硬件平台的一种规范,进一步推广了面向对象程序设计的概念。

OPC正是建立在OLE2规范之上,为工业控制领域提供了一种标准的数据访问机制。

2.1 OPC数据访问规范OPC规范是由世界主要的自动化设备制造商、OPC基金会和微软公司共同协商制定而成的,为不同厂商的设备和应用程序之间实现了接口标准化。

它把硬件供应商和软件开发商分离开来,在设备、数据库等数据源和客户之间架起了一座桥梁,为解决统一接口标准问题提供了解决方案。

这其中包括OPC数据访问规范(OPC DA)、OPC报警和事件规范(OPC AE)和OPC历史数据访问规范(OPC HDA)等,而OPC数据访问规范是最常用的规范之一。

通过对OPC数据访问规范的分析可知,在OPC数据访问规范中主要包括3类对象,分别是OPC Server、OPC Group和OPC Item。

OPC服务器对象维护有关服务器的信息并作为OPC组对象的包容器,能够动态地创建和释放组对象;OPC组对象除了维护有关自身的信息之外,还提供了包容OPC项的机制,从逻辑上管理OPC项。

它提供了客户组织数据的一种方法,客户可以对其进行读写,还可以设置客户端的数据更新速率。

当服务器缓冲区内的数据发生改变时,OPC 将向客户发出通知,客户得到通知后再进行必要处理,而无需浪费大量的时间进行查询;OPC项则表示了与OPC服务器的连接,它并不提供对外接口,客户端不能直接对其进行操作,而是通过组对象对其进行操作的。

图1表示了这3类对象的相互关系以及它们与OPC客户端程序之间的关系。

图1 OPC DA服务器对象与OPC DA客户端的对应关系2.2 OPC数据访问方式OPC客户端在对OPC服务器进行数据访问时,可以选择两种不同的访问方式,即同步访问方式和异步访问方式。

其中同步访问方式的实现相对简单,OPC服务器将OPC应用程序所要求得到的数据访问结果作为方法引数返回给OPC应用程序,此时OPC应用程序一直处于等待状态,直到结果被返回为止。

当客户数目较少并且与服务器交互的数据量也较少的时候可以采用同步访问方式。

与此相对,异步访问方式的实现较为复杂,OPC服务器接到OPC应用程序的要求后,立即将方法引数返回,OPC应用程序随后可以进行其它处理。

当OPC服务器完成数据访问时,触发OPC应用程序的异步访问完成事件,将数据访问结果传送给OPC应用程序,OPC应用程序在VC的事件处理程序中接收从OPC服务器传来的数据。

当有大量客户和大量数据交互时,异步访问方式的效率更高,能够避免客户数据请求的阻塞,从而最大限度的节省CPU和网络资源。

图2和图3分别表示了两种数据访问方式的处理过程。

图2 同步数据访问处理图3 异步数据访问处理3 VC环境下OPC客户端程序设计OPC客户端程序在设计时需要遵守OPC数据访问规范,实现规范所规定的全部必需接口。

同时,客户端模块需要有独立的设备连接界面和监控运行界面,并能够支持多服务器的连接。

下面详细介绍VC环境下的OPC客户端程序开发步骤,并给出关键源代码:(1)包含OPC头文件。

首先创建新的工程,编辑StdAfx.h文件,加载opcda.h、opccomn.h、opcerrors.h、opcprops.h、opcquality.h以及opcda_i.c、opccomn_i.c文件。

(2)初始化COM库。

由于OPC是基于COM技术制定的,所以在使用接口类之前必须首先使用CoInitialize(NULL)函数对COM库进行初始化,如果成功,函数返回值等于S_ OK。

HRESULT h1;h1=CoInitialize(NULL);if(h1!=S_OK)return(FAUSE);(3)通过OPC服务器的ProgID查询注册表中相关CLSID。

每个COM服务器都有一个字符串型的ProgID,通过ProgID可以得到全球惟一的CLSID,使用CLSIDFromProgID( )函数实现ProgID到CLSID的转换。

h1=CLSIDFromProgID(ProgID,&CLSID);(4)连接OPC服务器,查询对象的IID_IOPCServer接口。

在连接OPC服务器前,OPC客户端需要事先指定计算机名和OPC数据访问服务器名,建立连接后,创建OPC组并添加OPC数据项。

h1=CoCreateInstance(clsid,NULL,CLSCTX_ LOCAL_ SERVER,IID_IOPCServer,(void**)&m_OPCServer);(5)创建OPC组,查询IOPCItemMgt接口。

IOPCServer接口的AddGroup()方法可以创建一个有指定名称和属性的OPC组。

h1=m_IOPCServer->AddGroup(L,” ”,TRUE,800,111,&TimeBias,&PercentDeadBand,LOCAL_ID,& m_ GrpSrvHandle,&RevisedUpdateRate,IID_IOPCItemMgt,(LPUNKNOWN*)m_IOPCItemMgt);(6)添加OPC数据项。

使用IOPCItemMgt接口的AddItem()方法可以添加具有特殊属性的指定数量的数据项。

pOPCItemMgt->AddItems(ItemNumber,ItemArray,(OPCITEMRESULT**)&pItemResult,(HRESULT **) & pErrors);(7)OPC的数据项读写。

对OPC数据项的读写可以有同步与异步之分,对于大量的数据传输,异步是更佳的选择,但对少量的数据传输,同步表现得更好。

本程序采用异步访问方式,需要指向IOPCAsyncIO2指针。

h1=m_IOPCItemMgt->QueryInterface(IID_IOPCAsyncIO2,(void**)&m_IOPCAsyncIO2);void CAsynOPCDlg::OnRead ( ) 实现异步读数据。

h1=m_IOPCAsyncIO2->Read(1,phServer,1,&dwCancelID,&pErrors);delete[] phServer;void CAsynOPCDlg::OnWrite( ) 实现异步写数据。

h1=m_IOPCAsyncIO2->Write(1,phServer,values,2,&dwCancelID,&pErrors);delete[] phServer;(8)OPC连接断开,释放接口指针。

当程序退出或停止服务器时,依次删除Item(RemoveItems)、Group(RemoveGroups),释放资源。

void CAsynOPCDlg::OnStop( ) 停止服务器。

h1=m_IOPCItemMgt->RemoveItems(1,phServer,&pErrors);删除Items。

h1=m_IOPCServer->RemoveGroup(m_GrpSrvHandle,TRUE);删除Group。

m_IOPCServer->Release( );释放服务器。

m_IOPCServer=NULL;CoUninitialize( );关闭COM库。

图4 OPC客户端程序使用OPC技术之后,我们就可以通过OPC客户端直接访问由硬件供应商提供的OPC服务器,从而达到直接获取现场设备数据的目的。

图4显示的即是基于VC开发的OPC客户端程序对OPC服务器KEPServer的访问界面,实现了OPC客户端与OPC服务器进行数据交互的功能,为开发其它功能更加完善的OPC客户端软件提供了基础。

相关文档
最新文档