2016-08-25 6 views
0

私は、OPCサーバーとしてKepwereを使用してWPF用にthis ua-clientを使用して制御ソフトウェア/ HMIを書きます。WPFとOP UAに再接続した後に監視項目の値を再送

今日、私はいくつかの接続テストを行っていました。私のPLCのイーサネットケーブルを外し、ソフトウェアの監視項目の値を変更しました。明らかにこの変更は有効になりません。接続状態ですが、再接続した後、以前に設定した値でPLCタグをリフレッシュしないのはなぜですか?

これは予想される動作で、これを複製するために内部ストレージ変数を作成する必要がありますか?

Kepserverには、PLCにエラーがあるかどうかを示すSystem.NoErrorタグがあるため、PLCがオフラインであることがわかります。しかし、私は最新の変更を再送しようとしていますが、再接続中はオフラインでした。

私はSetPropertyメソッド上書き:

protected override bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null) 
{ 

    if(ServerState != CommunicationState.Opened || (!System_NoError && "System_NoError" != propertyName)) 
    { 
     m_eventsPending.Add(new WriteEvent 
     { 
      PropertyName = propertyName, 
      PropertyValue = value 
     }); 
     return false; 
    } 

    return base.SetProperty(ref storage, value, propertyName); 
} 

をそして、これでサーバの状態変化イベントに耳を傾ける:私はSystem_NoError上のすべての変更で

public void OnStateChangeEvent(CommunicationState state) 
{ 
    ServerState = state; 
} 

private void OnError() 
    { 
     if(System_NoError) 
     { 
      while(m_eventsPending.Count > 0) 
      { 
       WriteEvent e = m_eventsPending.ElementAt(0); 
       bool storage = !(bool)e.PropertyValue; 
       var p = this.GetType().GetProperty(e.PropertyName); 
       p.SetValue(this, storage); 
       p.SetValue(this, e.PropertyValue); 
       m_eventsPending.RemoveAt(0); 
      } 
     } 
    } 

私はいくつかの初期化を行い、それをm_eventsPendingリストに保持し、connec (オープンされた)が、PLC側では何も起こらない。何が間違っていますか?

PS:ソフトウェアとの任意の他の相互作用が ホセTruyol

答えて

0

が直接タグを書いて考えてみましょう私のコード(ボタン、スライダー、など)

よろしくた内容に応じて、PLC上の正しい変更を行いますプロパティーセッター。この例では、成功するまで5秒ごとに再試行し、緑色のライトを試みます。

public class TrafficLightViewModel : ViewModelBase 
{   
    private bool green; 
    private bool red; 
    private bool yellow; 
    private CancellationTokenSource greenCts; 
    private CancellationTokenSource redCts; 
    private CancellationTokenSource yellowCts; 
    private UaTcpSessionClient session; 

    public TrafficLightViewModel(UaTcpSessionClient session) 
    { 
     this.session = session; 
    } 

    public bool Green 
    { 
     get { return this.green; } 

     set 
     { 
      this.green = value; 
      this.greenCts?.Cancel(); 
      this.greenCts = new CancellationTokenSource(); 
      var request = new WriteRequest 
      { 
       NodesToWrite = new[] 
       { 
        new WriteValue 
        { 
         NodeId = NodeId.Parse("ns=2;s=GreenLight"), 
         AttributeId = AttributeIds.Value, 
         Value = new DataValue(value) 
        } 
       } 
      }; 
      this.WriteOutputAsync(request, this.greenCts.Token); 
     } 
    } 

    // add yellow and red 

    private async void WriteOutputAsync(WriteRequest request, CancellationToken token) 
    { 
     try 
     { 
      while (!await this.TryWriteAsync(request)) 
      { 
       await Task.Delay(5000, token); 
      } 
     } 
     catch (TaskCanceledException) 
     { 
      Debug.WriteLine($"Canceled writing output : {request.NodesToWrite[0].NodeId}"); 
     } 
    } 

    private async Task<bool> TryWriteAsync(WriteRequest request) 
    { 
     try 
     { 
      var response = await this.session.WriteAsync(request); 
      for (int i = 0; i < response.Results.Length; i++) 
      { 
       if (StatusCode.IsBad(response.Results[i])) 
       { 
        Debug.WriteLine($"Error writing output '{request.NodesToWrite[i].NodeId}' {request.NodesToWrite[i].Value.GetValue()}: {StatusCodes.GetDefaultMessage(response.Results[i])}"); 
        return false; 
       } 
      } 

      return true; 
     } 
     catch (Exception ex) 
     { 
      Debug.WriteLine($"Error writing outputs : {ex.Message}"); 
      return false; 
     } 
    } 
} 

これが役に立ちます。 アンドリュー

+0

ありがとう@andrewcullen。私はあなたのGitHub [Repository](https://github.com/convertersystems/opc-ua-client/)でこの質問を続けます。 – JoseTruyol

関連する問題