我正在尝试从OPC服务器获取标签列表,我正在使用QuickOPC中的EasyDaClient。我想要做的就是这个
try
{
//create the OPC Client object
OpcLabs.EasyOpc.DataAccess.EasyDAClient easyDAClient1 = new OpcLabs.EasyOpc.DataAccess.EasyDAClient();
//ServerDescriptor Declration
OpcLabs.EasyOpc.ServerDescriptor sd = new OpcLabs.EasyOpc.ServerDescriptor();
sd.MachineName = "W7VM";
sd.ServerClass = "OPC.Siemens.XML.1";
OpcLabs.EasyOpc.DataAccess.DANodeElementCollection allTags = easyDAClient1.BrowseLeaves(sd);
foreach (OpcLabs.EasyOpc.DataAccess.DANodeElement tag in allTags)
{
//if the value is a branch add it to the listbox.
if (tag.IsLeaf)
{
//add the fully qualified item id
listBox1.Items.Add(tag.ItemId.ToString());
}
}
}
catch (Exception ex)
{
MessageBox.Show("Error: " + ex.Message.ToString());
}
我总是从BrowseLeaves方法获得0个元素,我不知道我的Channel_1.Device_1是什么,所以我可以使用另一个重载。 我是新手,有人可以解释一下如何列出OPC标签吗? 仅供参考:我可以使用以下标签读取标签中的值:
easyDAClient1.ReadItem(MachineNameTextBox.Text,serverClassTextBox.Text,itemIdTextBox.Text);
所以它不是一个Conenction问题
答案 0 :(得分:4)
你正在浏览根级别的叶子,那里没有,这就是为什么你得到一个空集合。
你能做什么?有几种选择:
1)如果您想在根目录开始浏览并进入叶级别,您还需要考虑分支。使用BrowseBranches方法,或者(甚至更好)使用BrowseNodes,它返回分支和叶子。当你得到一个分支节点(你可以使用.IsBranch测试它)时,你可以决定进一步浏览它。
2)如果要获取叶子并知道它们所在的分支,可以将分支名称作为附加参数传递给BrowseLeaves方法。然而,这可能不是你的情况,因为我可以猜测你说的#34;我不知道什么是我的Channel_1.Device_1",这可能是你没有的分支ID&#34 ;知道"前期。
以下是递归浏览的完整示例:
// BrowseAndReadValues: Console application that recursively browses and displays the nodes in the OPC address space, and
// attempts to read and display values of all OPC items it finds.
using System.Diagnostics;
using JetBrains.Annotations;
using OpcLabs.EasyOpc;
using OpcLabs.EasyOpc.DataAccess;
using System;
namespace BrowseAndReadValues
{
class Program
{
const string ServerClass = "OPCLabs.KitServer.2";
[NotNull]
static readonly EasyDAClient Client = new EasyDAClient();
static void BrowseAndReadFromNode([NotNull] string parentItemId)
{
// Obtain all node elements under parentItemId
var nodeFilter = new DANodeFilter(); // no filtering whatsoever
DANodeElementCollection nodeElementCollection = Client.BrowseNodes("", ServerClass, parentItemId, nodeFilter);
// Remark: that BrowseNodes(...) may also throw OpcException; a production code should contain handling for it, here
// omitted for brevity.
foreach (DANodeElement nodeElement in nodeElementCollection)
{
Debug.Assert(nodeElement != null);
// If the node is a leaf, it might be possible to read from it
if (nodeElement.IsLeaf)
{
// Determine what the display - either the value read, or exception message in case of failure.
string display;
try
{
object value = Client.ReadItemValue("", ServerClass, nodeElement);
display = String.Format("{0}", value);
}
catch (OpcException exception)
{
display = String.Format("** {0} **", exception.GetBaseException().Message);
}
Console.WriteLine("{0} -> {1}", nodeElement.ItemId, display);
}
// If the node is not a leaf, just display its itemId
else
Console.WriteLine("{0}", nodeElement.ItemId);
// If the node is a branch, browse recursively into it.
if (nodeElement.IsBranch &&
(nodeElement.ItemId != "SimulateEvents") /* this branch is too big for the purpose of this example */)
BrowseAndReadFromNode(nodeElement);
}
}
static void Main()
{
Console.WriteLine("Browsing and reading values...");
// Set timeout to only wait 1 second - default would be 1 minute to wait for good quality that may never come.
Client.InstanceParameters.Timeouts.ReadItem = 1000;
// Do the actual browsing and reading, starting from root of OPC address space (denoted by empty string for itemId)
BrowseAndReadFromNode("");
Console.WriteLine("Press Enter to continue...");
Console.ReadLine();
}
}
}