Как мне присвоить значения экземплярам моих узлов на моем сервере OPC UA (код C #)

#c# #server #opc-ua

#c# #сервер #opc-ua

Вопрос:

Я новичок в OPC UA server и использую C # для разработки сервера. Я использовал UA Modeller для создания своих объектов и включения их на сервер при использовании C #.

Я создал экземпляры объектов на своем сервере, и теперь я хочу присвоить значения этим узлам? Как мне это сделать? и как я могу заставить эти присвоенные значения постоянно меняться, как если бы они были подключены к источнику данных в реальном времени?

         Console.WriteLine("Loading the MyIM Model.");
            ImportUaNodeset(Assembly.GetEntryAssembly(), "myinformationmodel_1.1.0.xml");

            Console.WriteLine("myIM sucessfully loaded");

            CreateObjectSettings settings = new CreateObjectSettings()
            {
                ParentNodeId = UnifiedAutomation.UaBase.ObjectIds.ObjectsFolder,
                ReferenceTypeId = UnifiedAutomation.UaBase.ReferenceTypeIds.Organizes,
                RequestedNodeId = new NodeId("myIM", DefaultNamespaceIndex),
                BrowseName = new QualifiedName("Controllers", DefaultNamespaceIndex),
                TypeDefinitionId = UnifiedAutomation.UaBase.ObjectTypeIds.FolderType
            };
            ObjectNode controllersNode = CreateObject(Server.DefaultRequestContext, settings);

            settings = new CreateObjectSettings()
            {
                ParentNodeId = controllersNode.NodeId,
                ReferenceTypeId = UnifiedAutomation.UaBase.ReferenceTypeIds.Organizes,
                RequestedNodeId = new NodeId("Bodyshop", DefaultNamespaceIndex),
                BrowseName = new QualifiedName("Bodyshop", DefaultNamespaceIndex),
                TypeDefinitionId = new NodeId(myAG.myIM.ObjectTypes.BodyshopProductionEquipmentType, DefaultNamespaceIndex)

            };
            CreateObject(Server.DefaultRequestContext, settings);

            settings = new CreateObjectSettings()
            {
                ParentNodeId = controllersNode.NodeId,
                ReferenceTypeId = UnifiedAutomation.UaBase.ReferenceTypeIds.Organizes,
                RequestedNodeId = new NodeId("PaintShop", DefaultNamespaceIndex),
                BrowseName = new QualifiedName("PaintShop", DefaultNamespaceIndex),
                TypeDefinitionId = new NodeId(myAG.myIM.ObjectTypes.PaintshopProductionEquipmentType, DefaultNamespaceIndex)

            };
            CreateObject(Server.DefaultRequestContext, settings);
            
            settings = new CreateObjectSettings()
            {
                ParentNodeId = controllersNode.NodeId,
                ReferenceTypeId = UnifiedAutomation.UaBase.ReferenceTypeIds.Organizes,
                RequestedNodeId = new NodeId("ProductionMainFolder", DefaultNamespaceIndex),
                BrowseName = new QualifiedName("ProductionMainFolder", DefaultNamespaceIndex),
                TypeDefinitionId = new NodeId(myAG.myIM.ObjectTypes.ProductionEquipmentType, DefaultNamespaceIndex)

            };
            CreateObject(Server.DefaultRequestContext, settings);
  

Ответ №1:

Не уверен, какую библиотеку OPC UA C # вы используете, но я могу объяснить это в общих чертах

CreateObject Метод обычно возвращает объект состояния. В случае библиотеки OPC Foundation C # объект состояния имеет тип BaseDataVariableState и имеет свойство, вызываемое Value типом object. Которые вы можете установить в любое время.

При обновлении значения вы также должны обновить Timestamp свойство (лучше всего установить в DateTime.UtcNow) и очистить маску изменения (метод вызова ClearChangeMasks ).

Чтобы имитировать источник данных, вы обычно запускаете таймер (например, после завершения CreateAddressSpace метода), и каждый раз по истечении таймера вы обновляете значение и временную метку экземпляров ваших переменных. Библиотека OPC foundation предоставляет класс с именем Opc.Ua.Test.DataGenerator , который генерирует случайные значения для вас и осведомлен о базовых типах OPC UA.

Немного вдохновения, если вам нужно что-то другое, а не случайные значения, такие как провалы, всплески, тенденции, вы можете заглянуть в папку plugins iot-edge-opc-plc, которая является симуляцией сервера OPC UA.

Если вы ищете способ использовать свои собственные классы OPC UA в качестве классов C #, вы могли бы начать с примера DataTypes из OPC Foundation.