0

这是从 OPC Server 获取多个值的代码。

private void getData()
{
       try
       {
            int count = 1;
            opcServer.Connect("OPCTechs.SiemensNet30DA", "");

            opcGroup = opcServer.OPCGroups.Add("MP");
            opcGroup.DataChange += new DIOPCGroupEvent_DataChangeEventHandler(opcGroup_DataChange);

            //Get First String
            for (int i = 40; i <= 47; i++)
                opcGroup.OPCItems.AddItem("D104.B" + i, count++);

            //Get Second String
            for (int i = 80; i <= 91; i++)
                opcGroup.OPCItems.AddItem("D104.B" + i, count++);

            opcGroup.OPCItems.DefaultIsActive = true;
            opcGroup.UpdateRate = 1000;
            opcGroup.IsSubscribed = opcGroup.IsActive;
      }
      catch (Exception exc)
      {
                 MessageBox.Show(exc.Message, "Alert");
      }
}
private void opcGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
{
     try
     {
            string temp = "";
            int count = 1;
            for (count = 1; count <= NumItems; count++)
            {
               if (Convert.ToInt32(ClientHandles.GetValue(count)) == 47)
                    temp += ItemValues.GetValue(count).ToString();
            }
            Textbox1.Text = temp.ToString();
            temp = "";
        }
        catch (Exception e)
        {
            MessageBox.Show(e.Message, "Alert");
        }
}

正如您在代码中看到的,我试图获得 47 的值if (Convert.ToInt32(ClientHandles.GetValue(count)) == 47)ClientHandle但每次我得到一些其他值而不是这个值。当我打印所有的值时,我看到,值47是随机出现的。我不明白为什么它会随机出现?

位置 47 的值应仅出现在该位置。这是从 OPC 服务器获取多个值的好方法吗?

4

1 回答 1

3

这就是 OPC 的工作原理。您为要订阅的每个项目指定一个客户端句柄。每当服务器有一些项目的新数据时,您都会收到包含一个或多个项目的通知。由于无法预测哪些数据何时更改,因此也无法指定通知中将包含哪些项目以及它是哪个顺序。

您需要浏览通知中包含的所有项目,并根据它们的客户端句柄,决定如何处理每个项目。顺序可能每次都会改变,但这不是问题:假设您正在寻找客户端句柄 47。在第一个通知中,您将在索引 10 的 ClientHandles 中找到它;在第二个通知中,它可能根本不存在;在第三个通知中,它可能位于索引 15。您只需确定位置,然后在其他数组中的相同位置找到该位置的数据:也就是说,对于第一个通知,在数组 ItemValues 中的索引 10 处,质量和时间戳;对于第三个通知,在同一数组中的索引 15 处。

于 2015-09-22T17:39:29.990 回答