Вызов метода через метод вызова SDK не возвращает ожидаемый результат

Я новичок в OPC-UA. В настоящее время после изучения демоверсий и примеров предоставлена ​​документация Unified Automation. Мне удалось написать простой код, который подключается к конечной точке сервера и вызывает метод. Но, к сожалению, этот метод не возвращает ожидаемый результат. Более того, если я вызову тот же метод на том же сервере и тот же URL с теми же параметрами через UAExpert, я получу ожидаемый результат. Я в своем уме и был бы признателен за любую помощь, приведенную ниже, код, который я написал в настоящее время.

Дайте мне знать, если я что-то пропустил в коде.

public void Connect(string endpointUrl)
        {
            AppSession.UserIdentity = new UserIdentity();
            AppSession.SessionName = "urn:ACGIDT053:UnifiedAutomation:UaExpert";
            //AppSession.Application.CertificateGroups[0];            
            //string endpointUrl = "opc.tcp://212.43.72.27:51510/UA/WipotecServer/";
            AppSession.Connect(endpointUrl, SecuritySelection.None);
            ICertificate certificateServer = SecurityUtils.LoadCertificate(AppSession.EndpointDescription.ServerCertificate);
            AppSession.Application.TrustedStore.Add(certificateServer, true);

            /// [Step 1]
            // parse the object id.
            NodeId objectId = NodeId.Parse("ns=2;i=15108");

            // get the selected method id.            
            NodeId methodId = NodeId.Parse("ns=2;i=15057");

            // get input arguments.
            UInt32 a = 2;
            List<Variant> inputArguments = new List<Variant>
            {
                new Variant(string.Empty, TypeInfo.Scalars.String), new Variant(a,TypeInfo.Scalars.UInt32), new Variant(string.Empty, TypeInfo.Scalars.String),
                new Variant(null, TypeInfo.Arrays.ExtensionObject), new Variant(string.Empty, TypeInfo.Scalars.String)
            };

            /// [Step 2]
            List<StatusCode> inputArgumentErrors;
            List<Variant> outputArguments = null;

            // call the method on the server.
            StatusCode error = AppSession.Call(
                objectId,
                methodId,
                inputArguments,
                out inputArgumentErrors,
                out outputArguments);

            AppSession.Disconnect();

        }

Нет исключений, которые возвращаются сервером в коде, все входные аргументы исправны, как и состояние ошибки.

ОБНОВЛЕНИЕ: выражение фильтра должно быть: (ip.src == 172.16.55.144 && ip.dst == 212.43.72.27) || (ip.dst == 172.16.55.144 && ip.src == 212.43.72.27) Ниже приведены ссылки для пакетов из Wireshark: uaexpert: https://1drv.ms/u/s!ArxC3dVLzVTqhUGxsO1aDssb45er?e=tBcBRz: https://1drv.ms/u/s!ArxC3dVLzVTqhUANVvKmHG5ULW6_?e=cAO5C8

ОБНОВЛЕНИЕ: Код обновлен согласно предложениям от комментариев. Пакеты от Wireshark для обновленного кода: https://1drv.ms/u/s!ArxC3dVLzVTqhUIuqudrkrjMn8kn?e=fAZOtd

1 ответ

Решение

Как уже упоминалось в комментариях CamilleG. Я отправлял тип одного из аргументов как массив ExtensionObject, но отправлял данные как нулевые. UAExpert отправляет пустой массив. Это была проблема. Я назначил пустой массив и данные были возвращены в аргументе out put. Спасибо за все комментарии и помощь. @CamilleG. Особая благодарность. Обновленный код ниже:

public void Connect(string endpointUrl)
        {
            AppSession.UserIdentity = new UserIdentity();
            AppSession.SessionName = "urn:ACGIDT053:UnifiedAutomation:UaExpert";
            //AppSession.Application.CertificateGroups[0];            
            //string endpointUrl = "opc.tcp://212.43.72.27:51510/UA/WipotecServer/";
            AppSession.Connect(endpointUrl, SecuritySelection.None);
            ICertificate certificateServer = SecurityUtils.LoadCertificate(AppSession.EndpointDescription.ServerCertificate);
            AppSession.Application.TrustedStore.Add(certificateServer, true);

            /// [Step 1]
            // parse the object id.
            NodeId objectId = NodeId.Parse("ns=2;i=15108");

            // get the selected method id.            
            NodeId methodId = NodeId.Parse("ns=2;i=15057");

            List<ExtensionObject> ar = new List<ExtensionObject>();

            // get input arguments.
            UInt32 a = 1;
            List<Variant> inputArguments = new List<Variant>
            {
                new Variant(string.Empty, TypeInfo.Scalars.String), new Variant(a,TypeInfo.Scalars.UInt32), new Variant(string.Empty, TypeInfo.Scalars.String),
                new Variant(ar.ToArray(), TypeInfo.Arrays.ExtensionObject), new Variant(string.Empty, TypeInfo.Scalars.String)
            };

            /// [Step 2]
            List<StatusCode> inputArgumentErrors;
            List<Variant> outputArguments = null;

            // call the method on the server.
            StatusCode error = AppSession.Call(
                objectId,
                methodId,
                inputArguments,
                out inputArgumentErrors,
                out outputArguments);

            AppSession.Disconnect();

        }
Другие вопросы по тегам