Мне нужно прочитать значение из ПЛК и отобразить его в форме при изменении значения тега ПЛК.Вызывающие события в ПЛК теги данных в 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. Любой другой лучший способ обработки таймера-чтения-рейза?
Представьте себе, что происходит, когда тег включается и выключается менее чем за 250 миллисекунд. –
Спасибо. что мы позаботились. Ни один из тегов не ведет себя так. – Olivarsham
Это необычно. Что они делают? Гарантированы ли они на секунду? Что произойдет, если ваш код займет больше секунды, если у вас много тегов? Или он фиксируется так, что независимо от того, сколько времени занимает ваш код, он всегда видит, что тег включен? –