2

我试图通过 DA 协议从 OPC 读取值。我发现钛是免费的,这就是我的条件。我正在使用手册,其中写了如何从 OPC 服务器读取值,但只能从您在 OPC 服务器上使用您自己创建的变量创建的组中读取值。我想读取 OPC 服务器上已经存在的值并从中创建组,以便我可以读取它们的值。

解决了

这是解决方案

 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

 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());
    }
}

非常感谢您的任何建议。

4

1 回答 1

2

所以问题是当你迭代你的definitions集合时,你还没有真正添加任何项目:

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);

这应该可以解决该错误。

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

于 2020-07-01T08:06:23.707 回答