2013-07-31 9 views
1

OpcNetApi를 사용하여 OPC 서버에 연결하고 있습니다. 나는 아무런 문제없이 데이터를 연결하고 읽을 수 있지만, 데이터를 변경하면 변경 사항을 볼 수 있도록 다시 읽어야합니다. DataChanged 이벤트에 Handler를 추가했지만 변경 이벤트를 통보 받고 있지 않습니다. 내 구독 정보OpcNetApi DataChange 이벤트가 실행되지 않습니다.

이 기능을 작동시키기 위해 필요한 특별한 것이 있습니까?

Opc.URL url = new Opc.URL("opcda://localhost/ArchestrA.FSGateway.3"); 
     OpcCom.Factory factory = new OpcCom.Factory(); 

     using (Opc.Da.Server server = new Opc.Da.Server(factory, url)) { 
      server.Connect(); 
      Console.WriteLine("Server LocalID = {0}", server.Locale); 
      Opc.Da.SubscriptionState state = new Opc.Da.SubscriptionState(); 
      using (Opc.Da.Subscription group = server.CreateSubscription(new Opc.Da.SubscriptionState { 
        Name = "GROUP1", 
        UpdateRate = 40, 
        Deadband = 0, 
        Active = true 
       }) as Opc.Da.Subscription) { 
       // Create the itesm 
       Opc.Da.Item[] items = new Opc.Da.Item[2]; 
       items[0] = new Opc.Da.Item { ItemName = "value1", Active = true, ClientHandle = "6S1", ActiveSpecified = true }; 
       items[1] = new Opc.Da.Item { ItemName = "value2", Active = true, ClientHandle = "6S2", ActiveSpecified = true }; 
       Opc.Da.ItemResult[] results = group.AddItems(items); 
       for (int i = 0; i < results.Length; i++) { 
        items[i].ServerHandle = results[i].ServerHandle; 
       } 
       group.DataChanged += new Opc.Da.DataChangedEventHandler(group_DataChanged); 
       group.State.Active = true; 
       Opc.IRequest request; 
       group.Read(group.Items, 1234, new Opc.Da.ReadCompleteEventHandler(group_ReadComplete), out request); 

       // Stop when 'q' is pressed 
       ConsoleKeyInfo key = new ConsoleKeyInfo(); 
       while (key.Key != ConsoleKey.Q) { 
        key = Console.ReadKey(); 
        if (key.Key == ConsoleKey.R) { 
         group.Read(group.Items, 1234, new Opc.Da.ReadCompleteEventHandler(group_ReadComplete), out request); 
        } 
       } 
       group.DataChanged -= group_DataChanged; 
       group.RemoveItems(items); 
      } 
      server.Disconnect(); 
     } 

     static void group_DataChanged(object subscriptionHandle, object requestHandle, Opc.Da.ItemValueResult[] values) { 
      Console.WriteLine("Data Changed"); 
      foreach (Opc.Da.ItemValueResult readResult in values) { 
       Console.WriteLine("\t{0}\tvalue:{1}", readResult.ItemName, readResult.Value); 
      } 
      Console.WriteLine(); 
     } 

, 감사합니다

는 JFercan 당신이 쓴

답변

1

모든 좋은 것 같습니다하지만 당신은 단지 우리에게 보여줄 수있는 이 group_DataChanged 가입의 데이터 중 적어도 하나가 업데이트 될 때 호출 방법.

+0

감사합니다. 코드에 group_DataChanged를 추가했습니다. 시작할 때와 읽기 작업 후에 핸들러가 호출되는 것을 볼 수 있습니다. 그러나 HMI 클라이언트를 변경하면 DataChanged 이벤트가 발생하지 않습니다. 단지 두 번째 읽기를 수행 한 후에 호출 된 핸들러가 있습니다. – Fernando

+0

@Fernando 시도 : http://infosys.beckhoff.com/english.php?content=../content/1033/tcopcserver/html/sample2_netapi.htm&id= 다음 예제와 같이 코드를 수정하십시오. –