2015-05-18 6 views
2

Я пишу пользовательское приложение OPC-клиента на C#, позволяя считывать данные с сервера RSLinx.Удаленный OPC подключен, но не может читать

Во-первых, я не смог удаленно подключиться к RSLINX Opc Server. Исключение доступа Отказано в доступе.

Я тогда alteredthe DCOM Настройки MyComputer -> Com Security -> Права доступа и запуск и разрешение активации, включено все для пользователя «Everyone»

Это тогда позволило мне подключиться, но когда дело доходит до чтения сервер я получаю следующее исключение -

[System.Runtime.InteropServices.COMException] {"Exception from HRESULT: 0x80040202"} System.Runtime.InteropServices.COMException 

Я рыскал в Интернете столько, сколько я, возможно, может, и все они сводятся к вопросам, связанным DCOM. Я просто попробовал все с настройками Dcom. Я убедился, что настройки включены как для MyComputer, так и для RSLinx-сервера.

Я использую два .dll файлы из OPCFoundation - opcNetApi.dll, opcNetApi.Com.dll

Вот мой код (это может быть удобно)

private void readplc() 
     { 
      Opc.URL url = new Opc.URL("opcda://48.5.0.05/RSLinx OPC Server"); 
      Opc.Da.Server server = null; 
      OpcCom.Factory fact = new OpcCom.Factory(); 
      server = new Opc.Da.Server(fact, null); 
      try 
      { 
       server.Connect(url, new Opc.ConnectData(new System.Net.NetworkCredential())); 
      } 
      catch (Exception exy) 
      { 
       MessageBox.Show(exy.Message); 

      } 
      // Create a group 
      Opc.Da.Subscription group; 
      Opc.Da.SubscriptionState groupState = new Opc.Da.SubscriptionState(); 
      groupState.Name = "Group"; 
      groupState.Active = true; 
      group = (Opc.Da.Subscription)server.CreateSubscription(groupState); 
      // add items to the group. 
      Opc.Da.Item[] items = new Opc.Da.Item[6]; 
      items[0] = new Opc.Da.Item(); 
      items[0].ItemName = "[ALARM]F20:9"; 
      items[1] = new Opc.Da.Item(); 
      items[1].ItemName = "[ALARM]F22:30"; 
      items[2] = new Opc.Da.Item(); 
      items[2].ItemName = "[ALARM]F22:6"; 
      items[3] = new Opc.Da.Item(); 
      items[3].ItemName = "[ALARM]F18:8"; 
      items[4] = new Opc.Da.Item(); 
      items[4].ItemName = "[ALARM]F22:32"; 
      items[5] = new Opc.Da.Item(); 
      items[5].ItemName = "[ALARM]F22:5"; 
      items = group.AddItems(items); 

      try 
      { 

       group.DataChanged += new Opc.Da.DataChangedEventHandler(OnTransactionCompleted); // COM EXCEPTION THROWN HERE 
       Console.ReadLine(); 

      } 
      catch (Exception ex) 
      { 
       MessageBox.Show(ex.Message); 
       Console.ReadKey(); 
      } 

     } 




     private void OnTransactionCompleted(object group, object hReq, Opc.Da.ItemValueResult[] items) 
     { 

      for (int i = 0; i < items.GetLength(0); i++) 
      { 


      } 

     } 

I знаю, что код работает так, как я пытался создать приложение, подключающееся как локальный хост на ПК, к которому я пытаюсь подключиться к удаленному подключению, он с радостью читает данные.

Надеюсь, у кого-то будет представление о том, что происходит, я потратил более 12 часов в течение последних 4 рабочих дней, пытаясь разобраться в этом!

+1

Существует возможный duplciate вопрос [здесь] (http://stackoverflow.com/a/6038417/3581917) и [здесь] (Http: // StackOverflow .com/д/2246525/3581917). –

ответ

0

Это работает для меня:

_opcServer = new Server(_comFactory, null) { Url = new Opc.URL("opcda://localhost/FactoryTalk Gateway") }; 
_opcServer.Connect(); 
Смежные вопросы