gpt4 book ai didi

c# - 在 C# 中调用 PLC Tag datachage 上的事件

转载 作者:行者123 更新时间:2023-11-30 22:29:51 25 4
gpt4 key购买 nike

每当 PLC 标签值发生变化时,我需要从 PLC 读取值并以表格形式显示。

会有我需要监控的标签列表。每当 TAG 值发生变化时,我都需要调用一个函数(每个标签都有不同的函数)。

这就是我到目前为止为捕获标签值变化所做的工作..

连接到 PLC 后,我将创建标签列表。

读取定时器中的 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.如果在已经引发的事件仍在进行中(子过程未完成)引发事件,会发生什么情况?是因为这个原因我错过了一些数据更改事件吗??

2.如何在LIST成员值变化时自动引发raise事件??

3.还有其他更好的方法来处理timer-read-raiseevent吗?

最佳答案

What will happen if a event is raised while already raised event is still in progress

在您的代码执行完前一个代码之前,不会引发该事件。显然,当您触发的事件持续时间过长(超过 1 秒)时,您会遇到麻烦。您拥有的标签越多,或者在一次扫描中可以更改的标签越多,这些事件花费超过 1 秒并因此错过标签更改的可能性就越大。

您需要将扫描与事件处理分离。您可以使用一个只在循环中检查标签更改的工作线程来执行此操作。如果它看到任何更新通知,则将更新通知放入线程安全队列中。另一个线程,如您的 UI 线程,可以清空队列并处理通知。队列现在充当缓冲区,提供足够的存储空间以跟上突然爆发的标签更改。

关于c# - 在 C# 中调用 PLC Tag datachage 上的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9971865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com