Время жизни / уникальность NodeId (Как управлять NodeIds для динамических узлов)
Спецификация (Часть 3: Модель адресного пространства) OPC UA гласит:
5.2.2 NodeId
... Сервер должен сохранять NodeId узла, то есть он не должен генерировать новые NodeId при перезагрузке.
но как это может быть?
NodeId представляет собой комбинацию из NamespceIndex и Identifier. NamespceIndex может быть изменен при перезапуске Сервера. увидеть:
http://documentation.unified-automation.com/uasdkhp/1.0.0/html/_l2_ua_node_ids.html
По этой причине Клиент не должен сохранять индекс пространства имен без сохранения URI пространства имен, поскольку URI пространства имен, представленный индексом "2" во время одного сеанса, может быть представлен индексом "5" во время следующего сеанса.
Также использование FolderType с, например, "Files" в качестве элементов говорит об этом, или же сервер должен хранить NodeId, который он использует для File-X, чтобы назначить его снова сразу после перезапуска?
Для чего нужен GenericModelChangeEventType, если NodeId не может быть создан?
Клиент: я подумал, что использование BrowsePath-Path (например, "Objects.Server.ServerStatus.CurrentTime" (*)) для адресации NodeIds, а затем использование NodeId во время сеанса клинета для доступа к узлам является хорошим подходом. Кроме того, потому что Companion Specifications определяет имя браузера, поэтому я могу сохранить. Это хорошая идея? ( * нужно обратить внимание на коллизии, вызванные различными пространствами имен)
Сервер: Как должен вести себя Сервер, когда ему нужно генерировать / создавать новые NodeIds. Нужно, чтобы NodeIds был однозначным постоянно или только для времени выполнения Сервера. Я знаю, что некоторые Серверы используют NodeIds со Строковыми Идентификаторами, и эти Строковые Идентификаторы сделаны из BrowsePath, например, "ns=1;s=Server.ServerStatus.CurrentTime". Но мне это не нравится...
2 ответа
Что означает спецификация OPC UA, когда говорится "Сервер должен сохранять NodeId узла, то есть он не должен генерировать новые NodeIds при перезагрузке". выглядит следующим образом: NodeIds, если рассматривать их как комбинацию URI и идентификатора пространства имен, не должен изменяться. Сервер может или не может переназначить индексы пространства имен после перезагрузки, но результирующий namespaceURI/Identifier не должен изменяться. Итак, если при первом запуске у меня был узел с идентификатором 1234 и индексом пространства имен 7, и этот индекс пространства имен соответствовал " http://mynamespace.mycompany.com/ " в таблице пространства имен, то во втором запуске тот же узел может иметь Идентификатор 1234, но индекс пространства имен 8, пока в новом индексе NamespaceTable 8 теперь соответствует " http://mynamespace.mycompany.com/ ".
Я думаю, что Unified Automation SDK технически нарушает спецификации в этом отношении. Предлагаемая рекомендация в любом случае является хорошей практикой для клиентских реализаций, но, как вы указали, не должна быть строго обязательной.
Также использование FolderType с, например, "Files" в качестве элементов говорит об этом, или же сервер должен хранить NodeId, который он использует для File-X, чтобы назначить его снова сразу после перезапуска?
Я не уверен, что вы спрашиваете здесь.
Для чего нужен GenericModelChangeEventType, если NodeId не может быть создан?
Это не то, что здесь говорится. Узлы могут быть созданы и удалены, а структура объектов и переменных может измениться. Все, что говорится в спецификации, это то, что для данного узла "Foo" с NodeId "ns=1;s=Foo" он должен иметь тот же NodeId, если сервер перезагружается.
Я подумал, что использование BrowsePath-Path (например, "Objects.Server.ServerStatus.CurrentTime" (*)) для адресации NodeIds, а затем использование NodeId во время сеанса клинета для доступа к узлам - это хороший подход.
Пути просмотра предназначены для программирования типов. Подход, предложенный документами Unified Automation SDK, является безопасным для сохранения NodeIds в вашем клиенте.
Как должен вести себя Сервер, когда ему нужно генерировать / создавать новые NodeIds. Нужно, чтобы NodeIds был однозначным постоянно или только для времени выполнения Сервера. Я знаю, что некоторые Серверы используют NodeIds со Строковыми Идентификаторами, и эти Строковые Идентификаторы сделаны из BrowsePath, например, "ns=1;s=Server.ServerStatus.CurrentTime". Но мне это не нравится...
Создавайте их так, как вам нравится в пространствах имен, которыми вы управляете, это ваше дело. Использование основанных на строках NodeIds позволяет вам легко "извлечь" NodeId из определенных других источников, например, из адреса переменной в ПЛК или чего-то подобного.