使用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())
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)