Удаленный OPC подключен, но не может прочитать

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

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

Затем я изменил настройки DCOM MyComputer -> Com Security -> Разрешения на доступ и разрешения на запуск и активацию, включил все для пользователя «Все».

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

[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++)
            {


            }

        }

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

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


person SK2017    schedule 18.05.2015    source источник
comment
Возможный дублирующий вопрос здесь и здесь.   -  person Evil Dog Pie    schedule 18.05.2015


Ответы (1)


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

_opcServer = new Server(_comFactory, null) { Url = new Opc.URL("opcda://localhost/FactoryTalk Gateway") };
_opcServer.Connect();
person dergroncki    schedule 23.03.2016