组态王中如何定义opc服务器?

组态王中如何定义opc服务器?,第1张

1、首先要知道什么叫OPC,OPC是一个运行于基于PC操作系统的软件,所以做OPC是不现实的,建议使用SIMATIC NET(net pc6.x)或者其他第三方OPC软件。

2、现在版本的组态王针对西门子300系列的驱动已经可以使用了,如果不是使用CP5611等等专门的通讯卡,建议使用组态王本身的驱动来采集数据。

3、如果使用CP5611或者以太网等等来和西门子PLC通讯,建议用NET PC来做OPC,以太网方式的话还可以采用Kepware等OPC均可。 1、首先要知道什么叫OPC,OPC是一个运行于基于PC操作系统的软件,所以做OPC是不现实的,建议使用SIMATIC NET(net pc6.x)或者其他第三方OPC软件。

2、现在版本的组态王针对西门子300系列的驱动已经可以使用了,如果不是使用CP5611等等专门的通讯卡,建议使用组态王本身的驱动来采集数据。

3、如果使用CP5611或者以太网等等来和西门子PLC通讯,建议用NET PC来做OPC,以太网方式的话还可以采用Kepware等OPC均可。

ForeverCreditOPCServer服务器软件,简称OPCServer。

OPC客户端的使用方法:

建立和删除OPC设备

组态王中支持多OPC服务器

在使用OPC服务器之前,需要先在组态王中建立OPC服务器设备。

在组态王工程浏览器的设备”项目中选中OPC服务器”,工程浏览器的右侧内容区显示当前工程中定义的OPC设备和新建OPC”图标。

双击新建”图标,组态王开始自动搜索当前的计算机系统中已经安装的所有OPC服务器,然后弹出查看OPC服务器”对话框。

OPC设备定义:

网络节点名”编辑框中为要查看OPC服务器的计算机名称,默认为本机”。

如果需要查看网络上的其它站点的OPC服务器,在编辑框中输入节点的UNC路径。

如计算机名称为数据采集站”,则输入数据采集站”,然后单击查找”按钮,如果查找成功,则在右边的OPC服务器”列表中显示目标站点的所有已安装的OPC服务器名称,如果没有查找到,则提示查找失败。

OPC服务器信息”文本框中显示OPC服务器”列表中选中的OPC服务器的相关说明信息,如选中KingView.View.1”,则在信息中显示KingView.View”。

读写方式”是用来定义该OPC设备对应的OPC变量在进行读写数据时采用同步或异步方式,尝试恢复间隔”和最长恢复时间”用来设置当组态王与OPC服务器之间的通讯出现故障时,系统尝试恢复通讯的策略参数。

订阅频率”,目前组态王异步读是按照订阅的方式实现的,可以根据不同的需要进行设置,使用动态优化”是组态王对通讯过程采取动态管理的办法。

尝试恢复间隔”,最长恢复时间”,使用动态优化”的具体含义与IO设备定义向导中的相同。

用户可以在列表中选择所需的OPC服务器。

单击确定”按钮,查看OPC服务器”对话框自动关闭,OPC设备建立成功。

OPC服务器的建立:

对于已经建立的OPC设备,如果您确认不再需要,可以将它删除。

选中要删除的OPC设备,单击鼠标右键,在弹出的快捷菜单中选择删除,弹出的提示信息,如果选择是”,则将该设备从组态王中删除。

一.准备工作:

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

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

copy opcproxy.dll C:\WINDOWS\system32

copy opccomn_ps.dll C:\WINDOWS\system32

copy opc_aeps.dll C:\WINDOWS\system32

copy opchda_ps.dll C:\WINDOWS\system32

copy aprxdist.exe C:\WINDOWS\system32

copy opcenum.exe C:\WINDOWS\system32

2. 注册这些 dll 文件

REGSVR32 opcproxy.dll

REGSVR32 opccomn_ps.dll

REGSVR32 opc_aeps.dll

REGSVR32 opchda_ps.dll

3. 如果在windows 系统(\WINDOWS \system32)目下不存在actxprxy.dll,运行aprxdist.exe

4. 安装 opcenum.exe

opcenum /regserver

二.opcserver开发

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

#include "opcda.h"

#include "opc_ae.h"

#include "WTOPCsvrAPI.h"

#include "WtOPCsvrEXTapi.h"

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

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

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

const GUID

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

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

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

WTOPCsvr.lib WTOPCsvr.dll是对应lib和dll

4. 初始化

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

BOOL COPCSimSvrApp::InitInstance()

{

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

CString HelpPath

CString SvrName, SvrDescrip

int i

HelpPath = AfxGetApp()->m_pszHelpFilePath

i = HelpPath.ReverseFind('\\')

HelpPath = HelpPath.Left(i+1)

HelpPath += "OPCSIMSVR.EXE"

//

// Self-Registration code

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

//

SvrName = "WinTECH.OPCServer"

SvrDescrip = "WinTECH Software OPC Server Simulator"

CString tempCmdLine(m_lpCmdLine)

LPTSTR lpszToken = _tcstok(tempCmdLine.GetBuffer(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.这类结构就是扁平的。各个点类似与文件系统中的文件。

比如调用创建的点为test.item1、test.item2、test.item3这种点名,开发包会自动形成多层的点结构。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客户端测试

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

1. 运行opcquickclient.exe

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

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

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

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

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


欢迎分享,转载请注明来源:夏雨云

原文地址:https://www.xiayuyun.com/zonghe/305127.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存