Вызов событий на Datachage PLC Tag в C # - PullRequest
2 голосов
/ 02 апреля 2012

Мне нужно прочитать значение из ПЛК и отобразить его в форме при каждом изменении значения тега ПЛК.

Там будет список тегов, которые мне нужно отслеживать.Всякий раз, когда значение 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. Любой другой лучший методобрабатывать таймер-чтение-повышение событий?

Ответы [ 2 ]

2 голосов
/ 02 апреля 2012

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

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

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

1 голос
/ 02 апреля 2012

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

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

...