2017-12-15 3 views
-1

PLC에서 읽은 신호가 참인지 거짓인지를 확인하는 응용 프로그램이 있습니다. - 일련의 계산을 수행하고 false 일 경우 신호를 기다립니다. 이 작업을 수행하는 동안 while 루프를 사용하고 있습니다. 그러나 문제는 실제 상태가 1000ms 동안 유지되고 루프가 100ms 미만으로 완료되므로 다시 돌아가고 상태가 참이므로 다시 확인합니다. 따라서 PLC로부터 수신 한 1 개의 신호에 대해 루프는 약 9-10 회 실행됩니다. thread.sleep을 추가하려고했지만 여전히 여러 번 처리합니다. 상태가 참일 때 루프가 한 번 실행되고 다시 참이 될 때까지 기다려야합니다.루프를 완료하는 데 필요한 것보다 더 많은 시간 동안 조건이 true로 유지되는 경우에도 while 루프를 한 번 실행하는 방법

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(); 

     } 

    } 
+0

저장 및 비교를 통해 변경 사항을 감지해야합니다. – john

+0

그런 다음 루프를 사용하지 않으므로 이러한 동작에 이벤트를 사용합니다. – Karolis

+0

타이머 내에서 if 문 전체를 이동하려고했습니다. 똑같은 일이 일어난다. 제안의 샘플 코드를 제공해 주시겠습니까? – user3177511

답변

0

내가 GPIO 핀에서 프로그램 판독 신호를 작동하고 문제가 여러 번 처리되는 신호의 단일 방지 일명, 광산과 매우 유사하다. 이를 해결하기 위해 신호가 다시 켜지는지 확인하기 전에 먼저 신호가 꺼져 있는지 확인하려고합니다. 그것은 다른 실행을 계속하기 전에

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" 이외 좌회전 신호를 기다릴 것이다.

+0

안녕하세요, 귀하의 제안을 시도했지만 루프가 실행될 때 응용 프로그램이 고정됩니다. – user3177511

+0

프로그램에 다른 부분이있는 경우 스레드에서 수행해야합니다. – lamandy

+0

안녕하세요,이 스레드를 처리했습니다. 그것은 작은 새로운 문제를 제외하고 지금은 잘 작동합니다. 신호 상태가 처음 인 순간 .. 아무것도하지 않습니다. 두 번째 신호부터 작업이 시작됩니다. 이 때문에 첫 번째 신호의 결과는 오 탐지 (false positive)로 판명됩니다. – user3177511

0

내가 그것을 읽고있다 경우가 올바르게 당신의 조건 while 루프에 충족되는 곳에서 break;을 둘 필요가 : 여기

는 코드입니다. https://dotnetfiddle.net/FsGryD

나는 또한 SpinWait.SpinUntil(<boolean_condition>)를 사용하는 것이 더 좋은 옵션이 될 수있는 경우 고려할 수 있음을 추가합니다 :

은 여기 예를했다. ( https://msdn.microsoft.com/en-us/library/system.threading.spinwait(v=vs.110).aspx).

이전에 멀티 스레딩/IO 대기 기능을 사용하여 장치의 신호를 기다렸습니다.

0

사실 일 때까지 기다리려면 다시이 허위인지 추적해야합니다.

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; 
     } 

    } 
} 
+0

안녕하세요, 귀하의 제안을 시도했습니다. 그러나 @ lamandy의 제안처럼, 새로운 작은 문제를 제외하고는 작동합니다. 신호 상태가 처음 인 순간 .. 아무것도하지 않습니다. 두 번째 신호부터 작업이 시작됩니다. 이 때문에 첫 번째 신호의 결과는 거짓 긍정으로 밝혀졌습니다 – user3177511

관련 문제