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