C#编写代码读取OPC某个标签的值得代码

C#编写代码读取OPC某个标签的值得代码,第1张

一准备工作:

下载opc基金会的OPC Proxy DLL然后按照说明进行安装。这些动态库是opc程序运行所必须的。

1 将下列文件拷贝至要运行OPC服务器和OPC客户端的机器上的SYSTEM32目录下

copy opcproxydll C:\WINDOWS\system32

copy opccomn_psdll C:\WINDOWS\system32

copy opc_aepsdll C:\WINDOWS\system32

copy opchda_psdll C:\WINDOWS\system32

copy aprxdistexe C:\WINDOWS\system32

copy opcenumexe C:\WINDOWS\system32

2 注册这些 dll 文件

REGSVR32 opcproxydll

REGSVR32 opccomn_psdll

REGSVR32 opc_aepsdll

REGSVR32 opchda_psdll

3 如果在windows 系统(\WINDOWS \system32)目下不存在actxprxydll,运行aprxdistexe

4 安装 opcenumexe

opcenum /regserver

二opcserver开发

1 新建vc工程。比如建一个控制台工程。在工程中包含如下头文件

#include "opcdah"

#include "opc_aeh"

#include "WTOPCsvrAPIh"

#include "WtOPCsvrEXTapih"

以上头文件在例子程序中都能找到,拷贝到自己的工程下。

WTOPCsvrAPIh是开发包动态库提供的导出函数文件。里面有每个函数的具体说明,调用的时候看一下说明。

2 在cpp中定义一个GUID这个guid是用来标识opcserver的唯一id可以通过 *** 作系统的工具生成,也可以编一个。格式如下。

const GUID

CLSID_OPCSimSvr = {0x99b8f472, 0xc037, 0x11d2, {0x80, 0xb8, 0x0, 0x60, 0x97, 0x58, 0x58, 0xbe}};

3 在工程中加入对WtOPCSvr动态库的连接。

WTOPCsvr动态库的有关文件都在之前的例子包里面能找到。

WTOPCsvrlib WTOPCsvrdll是对应lib和dll

4 初始化

(1)调用UpdateRegistry()函数完成注册。下面是一个调用参考例子代码

BOOL COPCSimSvrApp::InitInstance()

{

TCHAR szTokens[] = _T("-/ ");

CString HelpPath;

CString SvrName, SvrDescrip;

int i;

HelpPath = AfxGetApp()->m_pszHelpFilePath;

i = HelpPathReverseFind('\\');

HelpPath = HelpPathLeft(i+1);

HelpPath += "OPCSIMSVREXE";

//

// Self-Registration code

// (look for cmdline options to register & unregister server)

//

SvrName = "WinTECHOPCServer";

SvrDescrip = "WinTECH Software OPC Server Simulator";

CString tempCmdLine(m_lpCmdLine);

LPTSTR lpszToken = _tcstok(tempCmdLineGetBuffer(1), szTokens);

while (lpszToken != NULL)

{

if (_tcsicmp(lpszToken, _T("UnregServer"))==0)

{

UnregisterServer ((BYTE )&CLSID_OPCSimSvr, SvrName);

return (FALSE);

}

else if (_tcsicmp(lpszToken, _T("RegServer"))==0)

{

UpdateRegistry ((BYTE )&CLSID_OPCSimSvr,

SvrName,

SvrDescrip,

HelpPath);

return (FALSE);

}

lpszToken = _tcstok(NULL, szTokens);

}

(2)调用InitWTOPCsvr完成开发包dll初始化。

以上两个步骤不可颠倒。

5 创建item

这里的item是服务器所有的item,这些item通过opc库户端能浏览到。创建item的函数为CreateTag()

Opc有两种地址空间形式:扁平和多层结构的。

比如调用创建的点为item1、item2、item3这类结构就是扁平的。各个点类似与文件系统中的文件。

比如调用创建的点为testitem1、testitem2、testitem3这种点名,开发包会自动形成多层的点结构。Test类似与文件系统中的文件夹,item类似与文件系统中的文件夹下的文件。扁平式和多层结构在客户端浏览点名时体现。

多层结构的点名之间默认是用“”分隔。为了简单可以将我们的opcserver设计为扁平结构。

创建一个点时会返回一个handle用来标识这个点。我们程序需要自己建立这个handle和数据库中保存设备实时值的对应关系。这部分可以参考例子代码。

6 建立一个定时器采集设备数据

定时从数据库中取得各个handle对应的item的值。然后比较各个item的值是否和上一次读取的值有变化,如果有变化调用UpdateTagToList放入对应的队列。开发包会自动将变化的值送到客户端。

大致流程为

(1) 从数据库中采集一遍所有点的实时值。

(2) 调用StartUpdateTags()

(3) 循环读取每个item在数据库中的数据,和上一次读取到的进行比较。如果有变化调用UpdateTagToList()

(4) 最用调用EndUpdateTags()完成所有item的更新。

7 客户端控制

客户端写tag的值的时候,在opcserver是通过一个回调函数来响应的。

在服务器端必须调用EnableWriteNotification()来指定写值的回调函数。回调函数的格式为:

typedef VOID (CALLBACK WRITENOTIFYPROC)(HANDLE, VARIANT, DWORD);

然后在回调函数内部实现从HANDLE指定的tag写到具体的控制设备对应的变量中。

8 其它常用函数

RequestDisconnect()一般在opcserver在关闭时调用,用来通知客户端opcserver自己要关闭。

NumbrClientConnections()用来计算当前有多少个客户端连接到了opcserver

UninitWTOPCsvr()程序退出时清理

SetVendorInfo()设置厂商信息

三opc客户端测试

下面以本机opcquickclientexe为例说明服务器和客户端之间的应用关系。

1 运行opcquickclientexe

2 点击edit->new server connection 菜单。d出server properties对话框。从中展开opc data access server version 20会浏览到本机安装的所有opcserver。选中我们自己开发的opcserver,点击确定。完成与服务器的连接

3 点击edit->new group 用默认值添加组。

4 点击edit->new item d出如下对话框。(下图是一个多层结构地址空间的例子,单层的更简单)选中左侧的某个父节点,右侧会显示出各个子tag。选中要向opcserver查询的tag,点击add leaves。然后点击ok

5 在客户端主界面上能看到刚才要查询的tag。它会自动跟随opcserver端数据的变化而变换。

6 右键要控制的tag,在菜单中选择同步写或者异步写(一般建议用异步,避免阻塞客户端的正常运行)。键入要写入的值。查看设备上是否动作。从而检验opcserver是否编写的正确。

答案:如何求解“对称”问题?证明曲线C:F(x,y)=

opc既不是硬件也不是软件。OPC是一种通讯规范,OPC基金会组织规定的一套规范,按照这个规范去把程序写出来,包括一个OPC服务器程序和一个OPC客户端程序,只要是按规范写的,不管是谁写的,就能保证OPC服务器能被OPC客户端访问。

opc服务器向下可以读取设备的数据,比如PLC、DCS等等,但这部分OPC规范是不管的,只要厂家用任意接口任意方法把设备数据读到就OK,然后OPC服务器程序把这些读到的数据按规范要求开放在网络上,其他任意OPC客户端程序,可以远程浏览这些数据,并选择读取这些数据中需要的。

扩展资料

OPC的工作原理

OPC以OLE/COM机制作为应用程序的通信标准,而OLE/COM是一种客户端/服务器模式,具有语言无关性、代码重用性、易于集成性等优点。

OPC服务器中的代码确定了服务器所存取的设备和数据、数据项的命名规则和服务器存取数据的细节,不管现场设备以何种形式存在,客户都以统一的方式去访问,从而保证软件对客户的透明性,使得用户完全从低层的开发中脱离出来。

客户应用程序仅须使用标准接口和服务器通信,而并不需要知道底层的实现细节。通过OPC服务器,OPC客户既可以直接读写物理VO设备的数据,也可 *** 作SCADA,DCS等系统的端口变量(只要该系统提供OPC服务)。

OPC全称是Object Linking and Embedding(OLE) for Process Control,它的出现为基于Windows的应用程序和现场过程控制应用建立了桥梁。在过去,为了存取现场设备的数据信息,每一个应用软件开发商都需要编写专用的接口函数。由于现场设备的种类繁多,且产品的不断升级,往往给用户和软件开发商带来了巨大的工作负担。通常这样也不能满足工作的实际需要,系统集成商和开发商急切需要一种具有高效性、可靠性、开放性、可互 *** 作性的即插即用的设备驱动程序。在这种情况下,OPC标准应运而生。OPC标准以微软公司的OLE技术为基础,它的制定是通过提供一套标准的OLE/COM接口完成的,在OPC技术中使用的是OLE 2技术,OLE标准允许多台微机之间交换文档、图形等对象。

COM是Component Object Model的缩写,是所有OLE机制的基础。COM是一种为了实现与编程语言无关的对象而制定的标准,该标准将Windows下的对象定义为独立单元,可不受程序限制地访问这些单元。这种标准可以使两个应用程序通过对象化接口通讯,而不需要知道对方是如何创建的。例如,用户可以使用C++语言创建一个Windows对象,它支持一个接口,通过该接口,用户可以访问该对象提供的各种功能,用户可以使用Visual Basic,C,Pascal,Smalltalk或其它语言编写对象访问程序。在Windows NT40 *** 作系统下,COM规范扩展到可访问本机以外的其它对象,一个应用程序所使用的对象可分布在网络上,COM的这个扩展被称为DCOM(Distributed COM)。

通过DCOM技术和OPC标准,完全可以创建一个开放的、可互 *** 作的控制系统软件。OPC采用客户/服务器模式,把开发访问接口的任务放在硬件生产厂家或第三方厂家,以OPC服务器的形式提供给用户,解决了软、硬件厂商的矛盾,完成了系统的集成,提高了系统的开放性和可互 *** 作性。

OPC服务器通常支持两种类型的访问接口,它们分别为不同的编程语言环境提供访问机制。这两种接口是:自动化接口(Automation interface);自定义接口(Custom interface)。自动化接口通常是为基于脚本编程语言而定义的标准接口,可以使用VisualBasic、Delphi、PowerBuilder等编程语言开发OPC服务器的客户应用。而自定义接口是专门为C++等高级编程语言而制定的标准接口。OPC现已成为工业界系统互联的缺省方案,为工业监控编程带来了便利,用户不用为通讯协议的难题而苦恼。任何一家自动化软件解决方案的提供者,如果它不能全方位地支持OPC,则必将被历史所淘汰。

1、在控制领域中,系统往往由分散的各子系统构成;并且各子系统往往采用不同厂家的设备和方案。用户需要,将这些子系统集成,并架构统一的实时监控系统。

2、这样的实时监控系统需要解决分散子系统间的数据共享,各子系统需要统一协调相应控制指令。

3、再考虑到实时监控系统往往需要升级和调整。

4、就需要各子系统具备统一的开放接口。

5、OPC(OLE for Process Control) 规范正是这一思维的产物。

6、OPC 基于Microsoft公司的 Distributed interNet Application (DNA) 构架和 Component Object Model (COM) 技术的,根据易于扩展性而设计的。OPC规范定义了一个工业标准接口。

7、OPC是以OLE/COM机制作为应用程序的通讯标准。OLE/COM是一种客户/服务器模式,具有语言无关性、代码重用性、易于集成性等优点。OPC规范了接口函数,不管现场设备以何种形式存在,客户都以统一的方式去访问,从而保证软件对客户的透明性,使得用户完全从低层的开发中脱离出来。

8、OPC定义了一个开放的接口,在这个接口上,基于PC的软件组件能交换数据。它是基于Windows的OLE——对象链接和嵌入、COM——部件对象模型(Component Object Model)和DCOM——分布式COM(Distributed COM)技术。因而,OPC为自动化层的典型现场设备连接工业应用程序和办公室程序提供了一个理想的方法。

以上就是关于C#编写代码读取OPC某个标签的值得代码全部的内容,包括:C#编写代码读取OPC某个标签的值得代码、opc服务器是什么是硬件还是软件啊!!麻烦知道的内行帮忙解释解释~~、opc的定义解释等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9879614.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存