如何通过OPC自定义接口来实现客户端数据的读取

如何通过OPC自定义接口来实现客户端数据的读取,第1张

使用OPC

DA进行Client的读写 *** 作时,我们使用Custom接口,出此之外还有Automation接口。以下是Custome接口开发时涉及到的三个关键对象:OpcServer、OpcGroup、OpcItem,下图是他们之间的逻辑关系:

在客户端开发时,要使用OpcServer对象来实现客户端与Opc服务器之间的连接。一个OpcServer对象下有多个OpcGroup,一个OpcGroup下有多个OpcItem,在自定义接口下的Client开发,是以Group为单位的 *** 作,数据读写都是通过OpcGroup进行的。

•搭建程序运行环境

程序运行需要的软硬件环境:

1..Net Framework 4.0

2.Simatic Net 2008(Or Other) HF1

3.西门子300(Or Other) PLC

我们可以通过本机的配置来实现OPC的远程连接,我没有采用这种方式,一是这种配置比较麻烦,而是这种方式不稳定。所以我采用本机安装一个OPCServer来实现与PLC的交互。

对于OPCServer软件,我选择的是SimaticNet 2008 HF1(安装WinCC的时候会有选择安装SimaticNet的选项),没有特别的原因,就是比较熟悉了而已,而且PLC选用的是西门子的。

我们可以不写OPC Client程序来测试,如何通过OPCServer与PLC之间的交互。首先当我们安装完毕SimaticNet之后,需要对Station Configuration Editor进行配置,如下图:

首先我们要指定Station的名称,上图叫PCStation,点击下方的StationName可以进行更改。下一步在1号栈上选择一个OPCServer,3号栈上选择一个通信网卡。

接下来我们需要在Step 7中建立Station Configuration Editor与PLC之间的连接,我们暂且叫组态。组态的过程中要建立与Station Configuration Editor中对应的Opc Server和IE General(所在栈号相同),Station Configuration Edition起到桥接的作用 用,主要让PLC与Opc Server之间建立一条S7连接。暂时没有拿到组态图,以后补上。

当我们组态完毕时,如何判断组态是否正确呢?在SimaticNet的目录上有个叫Opc Scout(Opc Scout V10)的软件,打开如下图:

上图列出来了本机所有的Server,我们能使用名为OPC.SimaticNET的Server。双击这个Server添加一个组,多次双击这个Server可以添加多个组,验证了上图的Server与Group的关系了。

我们双击新建的Group,进入如下图的界面:

上图列出了所有的连接。上文说到的组态中建立的S7连接可以在S7节点中看到,展开这个节点可以看到我们建立的S7连接,如下图:

上图列出了名为S7 connection_1的S7连接,展开Object对象,列出PLC的结构。我们选择一种来新建我们的Item,由于我这里没有PLC模块,所以无法截图给大家看。

至此我们的OPC Client的运行环境搭建完毕。

•编写OPC Client端程序。

我们需要使用OPC Foundation提供的自定义接口来进行开发,在Visual Studio引用名为:OpcRcw.Comn.dll和OpcRcw.Da.dll这两个DLL。

我们定义一个名为OpcDaCustomAsync的类,让这个类继承自:IOPCDataCallback,IDisposable

展开全部

新建C#应用程序,命名为OPC

Client,将OPCAutomation.dll引用,如图。

using

OPCAutomation

2.

定义OPC的三个接口类OPCServer类、OPCGroup类和OPCItem类;

OPCServer

KepServer

OPCGroups

KepGroups

OPCGroup

KepGroup

OPCItems

KepItems

OPCItem

KepItem

3.

枚举网络OPC服务器

枚举OPC服务器用到GetOPCServers()函数

//获取计算机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()//获取本地计算机上的OPCServerName

try

{

KepServer

=

new

OPCServer()

object

serverList

=

KepServer.GetOPCServers(strHostName)

//枚举网络所有OPC服务器并写入ComboBox控件

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,

MessageBoxIcon.Warning)

}

4.

连接OPC服务器

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,

MessageBoxIcon.Warning)

return

false

}

5.

创建组和列出OPC服务器中所有节点

//创建组

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

}

//列出OPC服务器中所有节点

//展开分支

oPCBrowser.ShowBranches()

//展开叶子

oPCBrowser.ShowLeafs(true)

foreach

(object

turn

in

oPCBrowser)

{

listBox1.Items.Add(turn.ToString())

}


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

原文地址: http://outofmemory.cn/sjk/9908679.html

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

发表评论

登录后才能评论

评论列表(0条)

保存