#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.