我有一个应用程序,我正在检查从PLC读取的信号是正确的还是错误的,它是正确的-它做了一组计算,如果是假的,它等待信号。我用了一个while循环来做这个。但问题是,真正的状态保持在1000 is内,循环在不到100 is的时间内完成,所以它再次恢复,并且由于状态为true,它再次证明它。因此,对于我从PLC接收到的一个信号,循环运行约9-10次.我尝试过添加thread.sleep,但它仍然不止一次地处理它。当状态为true时,我希望循环运行一次,然后等待它再次变为真。
以下是代码:
bool isRunning = true;
private void WorkThreadFunction()
{
while (isRunning)
{
if (ethernetIPforSLCMicroCom1.Read("B3:254/1") == "True")
{
stopWatch = Stopwatch.StartNew();
int isTriggered;
Int32.TryParse(trigger, out isTriggered);
timer1.Start();
Thread.Sleep(10);
serialcheck();
System.GC.Collect();
}
}发布于 2017-12-15 05:53:00
我处理一个从GPIO引脚读取信号的程序,您的问题与我的问题非常相似,也就是防止单个on信号被多次处理。我的解决方案是,在我去检查信号是否再次打开之前,先确保信号是关闭的。
while (isRunning)
{
var signal = ethernetIPforSLCMicroCom1.Read("B3:254/1");
if (signal == "True")
{
//do your stuff
}
while (signal == "True")
signal = ethernetIPforSLCMicroCom1.Read("B3:254/1");
}内部循环将等待信号转到"True"以外的其他东西,然后再继续任何其他执行。
发布于 2017-12-15 05:47:09
如果我正确地阅读了它,您只需要将一个break;放在while循环中满足条件的位置。
我在这里举了一个例子:https://dotnetfiddle.net/FsGryD
我还要补充一点,您可能会考虑使用SpinWait.SpinUntil(<boolean_condition>)是否是一个更好的选择。(https://msdn.microsoft.com/en-us/library/system.threading.spinwait(v=vs.110).aspx.
我在前面的多线程/ IO等待函数中使用了这种方法来等待设备发出的信号。
发布于 2017-12-15 05:50:30
为了等待它再次成为真,您需要跟踪它是否是假的。
bool isRunning = true;
bool signalHasBeenFalse = true;
private void WorkThreadFunction()
{
while (isRunning)
{
if (ethernetIPforSLCMicroCom1.Read("B3:254/1") == "True" && hasBeenFalse )
{
signalHasBeenFalse = false;
stopWatch = Stopwatch.StartNew();
int isTriggered;
Int32.TryParse(trigger, out isTriggered);
timer1.Start();
Thread.Sleep(10);
serialcheck();
System.GC.Collect();
}
if ( ethernetIPforSLCMicroCom1.Read("B3:254/1") != "True" )
{
signalHasBeenFalse = true;
}
}
}https://stackoverflow.com/questions/47826400
复制相似问题