首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# OPC DA读取值

C# OPC DA读取值
EN

Stack Overflow用户
提问于 2020-07-01 15:26:02
回答 1查看 1.4K关注 0票数 2

我正在尝试通过DA协议从OPC中读取值。我发现钛是免费的,这就是我的状况。我使用的是this手册,这里写的是如何从OPC服务器上读取值,但只能从你在OPC服务器上用自己创建的变量创建的组中读取。我想读取已经在OPC服务器上的值,并从它们创建组,这样我就可以读取它们的值。

已解决

以下是解决方案

代码语言:javascript
复制
 static void Main(string[] args)
    {
        TitaniumAS.Opc.Client.Bootstrap.Initialize();

        Uri url = UrlBuilder.Build("Kepware.KEPServerEX.V6");

        using (var server = new OpcDaServer(url))
        {
            server.Connect();
            OpcDaGroup MyGroup = server.AddGroup("MyGroup");
            MyGroup.IsActive = true;
            var browser = new OpcDaBrowserAuto(server);
            OpcDaBrowseElement[] MySimulation = browser.GetElements("Simulation.Functions");
            OpcDaItemDefinition[] definitions = new OpcDaItemDefinition[MySimulation.Count()];
            for (int i = 0; i < MySimulation.Count(); i++)
            {
                definitions[i] = new OpcDaItemDefinition { ItemId = MySimulation[i].ItemId, IsActive = true };
            }
            MyGroup.AddItems(definitions);
            MyGroup.ValuesChanged += OnGroupValuesChanged;
            MyGroup.UpdateRate = TimeSpan.FromMilliseconds(100); // ValuesChanged won't be triggered if zero           
        }
    }
    static void OnGroupValuesChanged(object sender, OpcDaItemValuesChangedEventArgs args)
    {
        // Output values.
        foreach (OpcDaItemValue value in args.Values)
        {
            Console.WriteLine("ItemId: {0}; Value: {1}; Quality: {2}; Timestamp: {3}",
                value.Item.ItemId, value.Value, value.Quality, value.Timestamp);
        }
    }

对于表单,您需要像这样编辑Program.cs

代码语言:javascript
复制
 static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// 
    /// </summary>
    //[STAThread]
    
    static void Main()
    {
        TitaniumAS.Opc.Client.Bootstrap.Initialize();
        var thread = new Thread(RunApplication);
        thread.SetApartmentState(ApartmentState.STA);
        thread.Start();  
    }
    static void RunApplication()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}

非常感谢您的建议。

EN

回答 1

Stack Overflow用户

发布于 2020-07-01 16:06:24

所以问题在于,当您迭代definitions集合时,实际上还没有向其中添加任何项:

代码语言:javascript
复制
OpcDaItemDefinition[] definitions = new OpcDaItemDefinition[MySimulation.Count()];
for (int i = 0; i < MySimulation.Count(); i++)
{
      definitions[i] = new OpcDaItemDefinition(...);
      //definitions[i].ItemId = MySimulation[i].ItemId;
      //definitions[i].IsActive = true;
}
MyGroup.AddItems(definitions);

这应该可以解决这个错误。

编辑:刚刚看到你的编辑,你也解决了。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62671682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档