【发布时间】:2022-08-07 17:13:59
【问题描述】:
我正在与外部设备 (PLC) 通信,他请求数据。
我有一个事件检查我的 PLC 中的值何时发生变化(例如 \"NeedNewPosition\" 或 \"NeedNewBarValues\")
我想更改我的代码,它将一一处理它们。有时他似乎同时处理其中的两个。 (可能是因为一个比另一个需要更长的时间才能完成) 我读过一些关于异步方法和等待/任务等的内容,但对于这么简单的事情来说,这似乎需要做很多工作。
编码:
private void PLCValueChanged(object sender, EventArgs e)
{
bool xDisplayValue = false;
PLCVar plcvariable = (PLCVar)sender;
string VarName = plcvariable.DisplayName;
switch (VarName)
{
case \"NEEDNEWPOSITION\": //Writing required position to PLC
if (Convert.ToBoolean(plcvariable.Value))
{
SearchNewPosition();
OPCclient.SendVarToPLC(OPCclient.SendPlcAllBarsFinished, \"FALSE\");
OPCclient.SendVarToPLC(OPCclient.SendPLCAllMagnetsFinished, \"FALSE\");
MagnetsInArea = GetMagnetsInWorkArea();
SymbolsInArea = GetSymbolsInWorkArea();
BarsInArea = GetBarsInWorkArea();
}
else
{
OPCclient.SendVarToPLC(OPCclient.SendPLCNewPositionIsSend, \"FALSE\");
}
break;
case \"NEEDNEWBARVALUES\": //Writing Bar Values to PLC
if (Convert.ToBoolean(plcvariable.Value))
{
OPCclient.SendVarToPLC(OPCclient.SendPLCBarStrippedOK, \"FALSE\");
OPCclient.SendVarToPLC(OPCclient.SendPLCBarMagnetsOK, \"FALSE\");
OPCclient.SendVarToPLC(OPCclient.SendPLCAllBarMagnetsLoose, \"FALSE\");
SetFirstBarValues();
OffsetsCalculated = false;
StartVisualisation?.Invoke(this, null); //%M59
}
else //if (!Convert.ToBoolean(plcvariable.Value))
{
OPCclient.SendVarToPLC(OPCclient.SendPLCBarDataIsSend, \"FALSE\");
}
break;
-
如果您发布代码,您能否发布一个完整的可编译块并正确格式化?谢谢。
-
所以我猜
PLCValueChanged被其他东西触发了,你希望一个事件在另一个事件再次尝试调用它之前完成? -
对于您的问题:是的,活动能够以一种方式触发,即前一个仍在处理中时触发。如果发生这种情况,您需要考虑两件事: 1. 它是否经常发生?这意味着如果每一个触发的事件将与其前身重叠,那么无论您做什么,您都会遇到堆积。如果您只有窥视,那么构建管道可能就是您想要的。 2. 如果处理时间很长,您不希望在 Event-Thread 上处理事件。因此,无论如何,您可能想要构建某种管道。异步对1没有帮助。)
-
@DavidG 正确,因为
NeedNewPosition收到BarsInArea,他需要NeedNewBarValues的信息。这就是为什么我希望第二个电话等待第一个电话完成。 -
@Fildor - 只有在使用多个线程时才会发生这种情况。在单线程模型中,您无法获得重叠线程。
标签: c#