2012-04-02 3 views
2

Мне нужно прочитать значение из ПЛК и отобразить его в форме при изменении значения тега ПЛК.Вызывающие события в ПЛК теги данных в C#

Там будет список тегов, которые мне нужны для наблюдения. Всякий раз, когда изменяется значение TAG, мне нужно вызвать функцию (разные функции для каждого тега).

Это то, что я сделал до сих пор для захвата изменения значения тега ..

После подключения к ПЛК, я буду создавать список тегов.

Чтение значений TAG в таймере.

При чтении я проверю с тегом OLDVALUES, если есть какое-либо изменение в значении. Я подниму событие.

Это прекрасно работает с 4 или 5 тегами. Когда количество тегов больше, скажем, 100, некоторые события изменения тегов не обжиг ..

Это то, что до сих пор я сделал ..

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(); 
    } 

Я буду добавлять в список тегов. .

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.Что произойдет, если событие возникает в то время как уже поднимала событие все еще продолжается (суб процедура не завершена) ?? По этой причине я пропускаю некоторые события datachange?

2. Как повысить поднять событие автоматически при изменении значения члена LIST?

3. Любой другой лучший способ обработки таймера-чтения-рейза?

+1

Представьте себе, что происходит, когда тег включается и выключается менее чем за 250 миллисекунд. –

+0

Спасибо. что мы позаботились. Ни один из тегов не ведет себя так. – Olivarsham

+1

Это необычно. Что они делают? Гарантированы ли они на секунду? Что произойдет, если ваш код займет больше секунды, если у вас много тегов? Или он фиксируется так, что независимо от того, сколько времени занимает ваш код, он всегда видит, что тег включен? –

ответ

2

Что произойдет, если событие возникает в то время как уже поднимала событие все еще продолжается

событие не будет поднят, не до код выполняется выполнение предыдущего. Очевидно, что вы столкнетесь с проблемами, когда события, которые вы стреляете, занимают слишком много времени, более 1 секунды. Чем больше тегов у вас есть, тем больше вероятность, что они могут измениться в течение одного сканирования, тем больше шансов, что эти события заняли более 1 секунды и, таким образом, пропустить изменение тега.

Вам необходимо отделить сканирование от обработки событий. Вы можете сделать это с помощью рабочего потока, который ничего не делает, кроме проверки изменений тегов в цикле. И если он видит что-либо, добавьте уведомление об обновлении в потокобезопасную очередь. Другой поток, например, ваш поток пользовательского интерфейса, может освобождать очередь и обрабатывать уведомления.Очередь теперь действует как буфер, обеспечивая достаточное количество хранилища, чтобы быть в состоянии идти в ногу с внезапным всплеском изменений тегов.

1

не было бы лучше создать класс со старым новым значением в нем, а затем карту с тегом в качестве ключа для доступа к старому новому экземпляру?

похоже, что у вас есть много вещей, плавающих вокруг, которые необходимо синхронизировать.

+0

Можете ли вы отправить несколько образцов или разработать его? Вы хотите сказать, чтобы создать отдельный класс для каждого тега с их значениями как свойствами? – Olivarsham