1

こんにちは、アドバイスが必要です。C# を使用してデスクトップ アプリケーション (Winform) を開発しています。フォームがあり、OPC (他のファイル) という名前の別のクラスがあります。

これはOPCクラスのコードです

OPC クラス

namespace BarCodePrint.Class
{   
public class OPC
{
    public OPCServer ConnectedOPCServer { get; set; }
    public OPCGroups ObjOPCGroup {get; set;}
    public OPCGroup ConnectedOPCGroup { get; set; }
    public int _numItems { get; set; }
    public string _nodeName { get; set; }

    Array _OPCItemIDs;
    Array _ItemServerHandles;
    Array _ItemServerErrors;
    Array _ClientHandles;
    Array _RequestedDataTypes;
    Array _AccessPaths;
    Array _WriteItems;

    public OPC()
    {
        //Code
    }

    public void OPCConnect()
    {
       //Code
    }

    public void OPCDisconnect()
    {
        //Code
    }

    public void AddGroupToOPC()
    {
       //Code
    }

    public void AddItemsToOPC()
    {
        //Code
    }

    public void Write()
    { 
        //Code
    }


    private void ConnectedOPCGroup_DataChange(int TransactionID, int NumItems, ref Array ClientHandles, ref Array ItemValues, ref Array Qualities, ref Array TimeStamps)
    {
        try
        {
            for (int i = 1; i <= NumItems; i++)
            {


                if ((Convert.ToInt32(ClientHandles.GetValue(i)) == 1))
                {
                   //Do something
                }
            }
        }
        catch (Exception exc)
        {
          //HandleException
        }

    }

}
}

メソッドConnectedOPCGroup_DataChangeは、デバイスで値が変更されるたびに実行されます。私がやりたいのは、値が変更されてその値がフォームに送信されたときです。問題は、イベントを使用する必要があるかどうかです。またはフォームの同じファイルに私の OPC クラスを入れますか? または私は他の方法でそれを行うことができますか?

よく説明していただければ幸いです。

ありがとう

4

2 に答える 2

3

イベントを使用するか、何かを直接呼び出すだけかを尋ねる場合は、ユース ケースによって異なります。イベントは、アクションをブロードキャストする優れた方法です。複数のアイテムが何かの変化について知る必要がある場合は、イベントを使用してコードを切り離すことができます。とはいえ、他のコードを 1 つだけ伝えたい場合は、それも可能です。イベントは同じスレッドでディスパッチされるため、サブスクライバーを直接呼び出してもイベントでディスパッチしても、実行中のコードは同じコンテキストで処理されます。

個人的には、ハードカップリングを防ぐためにイベントを使用するのが好きです。ディスパッチャー コードは、誰がサブスクライブしているかを知る必要はありません。「ねえ、何かが起こった、今あなたは仕事をしている」と言うだけです。

イベントを Rx と組み合わせて、サンプリングやスロットリングを行ったり、その他のあらゆる種類の優れた機能を実行したりできるため、イベントも優れています。

「何かが起こった」ことを伝えるために大量の余分なコードを追加していることに気付いた場合は、イベントを使用する必要があります。

于 2013-03-14T00:14:28.600 に答える
0

OPC サーバーからデータを取得するには、直接読み取る方法と DataChange イベントを使用する方法の 2 つがあります。どちらを選択するかはあなた次第であり、どちらかを「ベスト プラクティス」と呼ぶことはできません。あなたの質問が実装に関するものである場合は、 ConnectedOPCGroup_DataChange サブの最後に「 Handles ConnectedGroup.DataChange 」がないことがわかります。OPCAutomation ライブラリがイベントを生成するので、それを処理するだけです。

質問の 2 番目の部分に対処するには、OPC クライアント クラスをメイン フォームから分離することをお勧めします。

于 2013-10-02T15:42:10.777 に答える