2012-04-02 8 views
2

PLCタグの値が変わるたびに、その値をPLCから読み込んでフォームに表示する必要があります。C#でPLCのタグデータを呼び出す

私が監視する必要があるタグのリストがあります。 TAG値が変わるたびに、関数を呼び出す必要があります(各タグごとに異なる関数)。

これは私がこれまでのタグ値の変更をキャプチャするためのやっていること..です

PLCに接続した後、私はタグのリストを作成するでしょう。

タイマーのTAG値を読み取ります。

OLDVALUESタグで調べると、値に変化があればイベントが発生します。

これは、4つまたは5つのタグで正常に動作しています。タグの数が多い場合、私はタグのリストを追加するでしょう。これは、これまでのところ、私がやっていることである

..タグの変更イベントの一部が発射されていない、

public delegate void DataChangedEventHandler(string TagName, string NewValue); 
    private Timer tmr = new Timer(); 

    public event DataChangedEventHandler OnDataChanged; 
    private void StartTimer(DataTable dt) 
    { 
     AddTagList(dt); 
     SetInitialVales(); 
     tmr.Tick += timerticks; 
     tmr.Interval = 250; 
     tmr.Enabled = true; 
     tmr.Start(); 
    } 
    private void StopTimer() 
    { 
     tmr.Enabled = false; 
     tmr.Stop(); 
    } 

を100と言います。

private List<string> TagValues = new List<string>(); 
    private List<string> oldValues = new List<string>(); 
    private List<string> newValues = new List<string>(); 
    private void AddTagList(DataTable dt) 
    { 
     int ILoop = 0; 

     foreach (DataRow row in dt.Rows) 
     { 
      TagValues.Add((string)row["Path"]); 
      ILoop = ILoop + 1; 
     } 
    } 

タグの初期値を設定します。

private void SetInitialVales() 
    { 
     int iLoop = 0; 
     foreach (string vals in TagValues) 
     { 
      var rd = ReadTag(vals); 
      oldValues.Add(rd.ToString()); 
      newValues.Add(rd.ToString()); 
      iLoop = iLoop + 1; 
     } 
     //newValues = oldValues 
    } 

とメインデータ部分。

 private void timerticks(object sender, EventArgs eventArgs) 
    { 
     int iLoop = 0; 
     foreach (string vals in TagValues) 
     { 
      oldValues[iLoop] = ReadTag(vals).ToString(); 
      if (oldValues[iLoop] != newValues[iLoop]) 
      { 
       newValues[iLoop] = oldValues[iLoop]; 
       if (OnDataChanged != null) 
       { 
        OnDataChanged(vals, newValues[iLoop]); 
       } 
      } 
      iLoop = iLoop + 1; 
     } 
    } 

マイクエリ:すでに提起イベントは(サブ手順が完了していない)進行中にイベントが発生した場合

1.Whatが起こるのだろう?この理由のために私はいくつかのdatachangeイベントがありませんか?

2.LIST値のメンバが変更されるたびに自動的にイベントを発生させる方法はありますか?

3.他のより良い方法は、タイマー読み取りraiseeventを処理するには?

+1

タグが250ミリ秒未満でオン/オフするとどうなるかを想像してみてください。 –

+0

ありがとうございます。私たちは世話をしました。どんなタグもそのような振る舞いはありません。 – Olivarsham

+1

これは珍しいことです。彼らは何のように行動するのですか?それらは1秒間保証されますか?タグがたくさんあるときにコードが1秒以上かかるとどうなりますか?それとも、コードがどれくらい時間がかかっても、タグがオンになっていると常に見えるようにラッチされていますか? –

答えて

2

すでに提起イベントが進行

にまだある間、イベントが発生した場合はどうなりますかイベントがあなたのコードは、前のものを実行して行われていないまで、発生しません。明らかに、あなたが爆発するイベントが1秒以上長くかかりすぎると、あなたは問題に遭遇します。あなたが持っているタグの数が多いほど、あるいは1回のスキャンで多くのタグが変化すると、これらのイベントが1秒以上かかるためにタグが変更されない可能性が高くなります。

スキャンをイベント処理から切り離す必要があります。ループ内でタグの変更をチェックするだけで何もしないワーカースレッドで行うことができます。それが見える場合は、スレッドセーフなキューに更新通知を入れてください。 UIスレッドのような別のスレッドは、キューを空にして通知を処理できます。キューはバッファとして機能し、突然のタグ変更に追いつくのに十分なストレージを提供します。

1

旧式の新しい値を持つクラスを作成し、古い方のインスタンスにアクセスするためのタグをキーとしてマップを作成する方がよいでしょうか?

そうでなければ、あなたは周りに浮かぶ多くのものがあり、それは同期を保つ必要があります。

+0

いくつかのサンプルを投稿したり、詳細を教えてください。あなたは、各タグのための別々のクラスをそのプロパティのプロパティとして作成すると言っていますか? – Olivarsham

関連する問題