2017-12-08 56 views
0

나는 OPC connection을 만들고 있는데 다음과 같은 데이터를 얻습니다. 연결이 lost이면 작업이 계속되지 않습니다. 연결이 끊어진 경우 OPC에 reconnect이 필요합니다.OPC에 다시 연결

어떻게하면됩니까? 또는 연결이 끊어짐을 어떻게 알 수 있습니까? 당신은 항상 (하트 비트 같은) OPC 서버의 "좋은"품질을해야 확실히 알 단일 데이터 포인트가 있으면

public Opc.Da.Server Server { get; set; } 
public Opc.Da.Subscription GroupRead { get; set; } 

public Result StartListening() 
{ 
    Result result = new Result(true); 

    try 
    { 
     var surl = string.Format("opcda://{0}", MyOpcClientClass.ServerName); 
     var url = new Opc.URL(surl); 
     Server = new Opc.Da.Server(new OpcCom.Factory(), null); 
     Server.Connect(url, new Opc.ConnectData(new System.Net.NetworkCredential())); 

     Server.ServerShutdown += ServerShutdown; 

     var group = new Opc.Da.SubscriptionState(); 
     group.Name = MyOpcClientClass.GroupName; 
     group.UpdateRate = MyOpcClientClass.Period; 
     group.Active = true; 

     GroupRead = (Opc.Da.Subscription)Server.CreateSubscription(group); 
     GroupRead.DataChanged += new Opc.Da.DataChangedEventHandler(DataChanged); 

     var items = this.MyOpcClientClassFieldMappingList.Select(i => new Opc.Da.Item 
     { 
      ItemName = i.OpcTagName 
     }).ToList(); 

     GroupRead.AddItems(items.ToArray()); 

    } 
    catch (Exception e) 
    { 
     // error log 
    } 

    return result; 
} 

private void DataChanged(object subscriptionHandle, object requestHandle, Opc.Da.ItemValueResult[] values) 
{ 
    try 
    { 
     // do smth... 
    } 
    catch (Exception e) 
    { 
     // error log 
    } 
} 
+0

From cmd.exe> ​​NetStat -a는 모든 연결과 상태를 제공합니다. 다시 연결하려면 현재 연결을 닫아야합니다. – jdweng

+0

@jdweng 수동으로 다시 연결할 수 있습니다. 괜찮아. 하지만 코드로이 작업을 수행하려고합니다. 연결이 끊어지면 자동으로 다시 연결하십시오. – Cer

+1

서버를 다시 연결할 수 없습니다. 서버가 닫히고 다시 열리고 클라이언트가 다시 연결될 때까지 기다려야합니다. 따라서 서버는 연결 해제 이벤트를 캡처해야합니다. 이제 연결 끊기 이벤트없이 연결을 종료 할 수 있습니다. 그래서 보통 클라이언트가 보낸 데이터가없는 메시지 인 keep-alive를 구현합니다. 일정 시간 동안 연결 유지가되지 않으면 연결을 끊지 않고 연결이 닫힌 것으로 가정하여 연결을 닫습니다. – jdweng

답변

0

, 당신은 당신의 프로그램에서 다른 곳 DataChanged에서이를 모니터링하거나 할 수있다. 품질이 "좋지 않은"경우 재 연결을 시도하십시오.

if(values[1].Quality.ToString() == "bad") //Where 1 is the datapoint you expect to be good 
{ 
    StartListening(); 
}