2

電気機器のタグを読み取ることができる OPC クライアントを作成しています。これは、OPC グループ内のアイテムを設定することによって行われます。アイテムをアクティブまたは非アクティブに設定するために、bool[] の配列であるプロパティが必要です。このプロパティ bool[] のどのインデックスがプロパティの設定に使用されたかを知る必要があるため、それを使用してアイテムをアクティブ化できます。メソッドを使用することもできますが、プロパティを使用することをお勧めします。_theGroup は、アイテムを保持する OPC グループです。

private bool[] _ItemActive;    
public bool[] itemActive {
    get { return _ItemActive; }
    set {
        if (_theGroup != null) {
            int itemIndex = ?? // I don't know how to find property index access by user
            int itemHandle = itemHandles[itemIndex]; //uses index to discover handle
            _theGroup.SetActiveState(itemHandle, value, out err); // use handle to set item active
        }
        _ItemActive = value;
    }
}

ユーザーはこのようなことをします。

opcClient.itemActive[3] = false;

3 を検出し、bool[] の配列のセッターで上記の itemIndex にプラグインできるようにする必要があります。

4

2 に答える 2

5

カスタム ロジックを実行する場所で、オーバーライドされたインデクサー演算子を使用してカスタム コレクションを作成できます。しかし、setter メソッドを作成するSetItemActivation(int,bool)ことは、よりクリーンなソリューションのようです。

于 2013-06-21T20:50:48.023 に答える
0

私は解決策を見つけました。インスタンスがエントリへの変更を追跡する新しいクラスを作成します。インデックス値が変更されるたびに、どのエントリがどの値に変更されたかを示すイベントが発生します。これがそのようなクラスです (もちろん、以下のコードはジェネリックを使用して bool を置き換え、より汎用性を高めることができます):

// This class tracks changes to its entries
public class BoolArray_Tracked{
  // Set up the data for which changes at specific indices must be tracked
  private bool[] _trackedBools;
  public bool this[int itemIndex]{
    get { return _trackedBools[itemIndex]; }
    set {
      // check if something really changed
      // not sure if you want this
      if(_trackedBools[itemIndex] != value){
      _trackedBools[itemIndex] = value;
      OnIndexChanged(itemIndex, value);// Raise an event for changing the data
      }
    }
  }

  // Constructor
  public BoolArray_Tracked(bool[] _trackedBools){
    this._trackedBools = _trackedBools;
  }

  // Set up the event raiser
  public delegate void IndexEventHandler(object sender, IndexEventArgs a);
  public event IndexEventHandler RaiseIndexEvent;

  // Raise an event for changing the data
  private void OnIndexChanged(int indexNumber, bool boolValue){
    if (RaiseIndexEvent != null)
      RaiseIndexEvent(this, new IndexEventArgs(indexNumber, boolValue));
  }
}

// This is class enables events with integer and boolean fields
public class IndexEventArgs : EventArgs{
  public int Index{get; private set;}
  public bool Value{get; private set;}

  public IndexEventArgs(int _index, bool _value){
    Index = _index;
    Value = _value;
  }
}

次に OPC クラスを実装します。

class OPC_client{
  // Tracked bool array
  public BoolArray_Tracked ItemActive{get; set;}

  // Constructor
  public OPC_client(bool[] boolItemActive){
    ItemActive = new BoolArray_Tracked(boolItemActive);
    ItemActive.RaiseIndexEvent += Handle_ItemActive_IndexChange;
  }

  // State what should happen when an item changes
  private void Handle_ItemActive_IndexChange(object sender, IndexEventArgs e){
    //if (_theGroup != null) {//Your code in the question
      int itemIndex = e.Index; 
      //int itemHandle = itemHandles[itemIndex]; //Your code
      //_theGroup.SetActiveState(itemHandle, value, out err); // Yours
    //} //Your code

    Console.WriteLine("The array `ItemActive' was changed"
      + " at entry " + itemIndex.ToString() 
      + " to value " + e.Value.ToString());
  }
}

最後に、これをテストする簡単なプログラムを実装します

static void Main(string[] args){
  OPC_client opcTest = new OPC_client(new bool[]{true, false});
  Console.WriteLine("Testing if message appears if value stays the same");
  opcTest.ItemActive[0] = true;

  Console.WriteLine();
  Console.WriteLine("Testing if message appears if value changes");
  opcTest.ItemActive[0] = false;
  Console.ReadLine();
}
于 2013-12-01T21:05:09.997 に答える