0

OPC サーバーから複数の値を取得するコードを次に示します。

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 の仕組みです。サブスクライブするアイテムごとにクライアント ハンドルを指定します。サーバーがいくつかのアイテムの新しいデータを取得するたびに、1 つ以上のアイテムを含む通知を受け取ります。どのデータがいつ変化するか予測できないため、どの項目がどの順序で通知に含まれるかを特定することもできません。

通知に含まれるすべての項目を確認し、クライアント ハンドルに基づいて、それぞれをどう処理するかを決定する必要があります。順番は毎回変わるかもしれませんが、それは問題ではありません: クライアント ハンドル 47 を探しているとしましょう。2 番目の通知では、まったく存在しない可能性があります。3 番目の通知では、インデックス 15 にある可能性があります。位置を決定するだけで、他の配列の同じ位置にあるデータを見つけることができます。つまり、最初の通知では、配列 ItemValues のインデックス 10 で、品質、およびタイムスタンプ。3 番目の通知は、同じ配列のインデックス 15 にあります。

于 2015-09-22T17:39:29.990 に答える