2017-12-08 42 views
0

私はOPC connectionを作成しており、次のようなデータが得られます。接続がlostの場合、操作は続行されません。私は、接続が壊れたときにOPCにreconnectする必要があります。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

cmd.exeから> NetStat -aは、すべての接続とステータスを表示します。再接続する前に、現在の接続を閉じる必要があります。 – jdweng

+0

@jdweng私は手動で再接続できます。これで結構です。しかし、私はコードでこれをやろうとしています。接続が失われたときに自動的に再接続します。 – Cer

+1

サーバーは再接続できません。サーバーは、クローズして再オープンし、クライアントの再接続を待つ必要があります。したがって、サーバーは切断イベントをキャプチャする必要があります。これで、切断イベントなしで接続を閉じることができます。したがって、通常、クライアントが送信したデータのないメッセージであるキープアライブを実装します。一定期間キープ・アライブを取得しないと、接続を切断せずに接続を閉じたとみなして接続をクローズします。 – jdweng

答えて

0

単一のデータポイントがある場合、あなたは確かに知って常に(ハートビートのような)OPCサーバに「良い」品質を持っている必要があり、あなたはDataChangedにまたはどこか他のプログラムで、それを監視することができます。品質が「悪い」場合は、再接続を試みます。

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