ua_plugin_nodestore.h 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506
  1. /* This Source Code Form is subject to the terms of the Mozilla Public
  2. * License, v. 2.0. If a copy of the MPL was not distributed with this
  3. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  4. #ifndef UA_SERVER_NODES_H_
  5. #define UA_SERVER_NODES_H_
  6. /* !!! Warning !!!
  7. *
  8. * If you are not developing a nodestore plugin, then you should not work with
  9. * the definitions from this file directly. The underlying node structures are
  10. * not meant to be used directly by end users. Please use the public server API
  11. * / OPC UA services to interact with the information model. */
  12. #ifdef __cplusplus
  13. extern "C" {
  14. #endif
  15. #include "ua_server.h"
  16. /**
  17. * .. _information-modelling:
  18. *
  19. * Information Modelling
  20. * =====================
  21. *
  22. * Information modelling in OPC UA combines concepts from object-orientation and
  23. * semantic modelling. At the core, an OPC UA information model is a graph made
  24. * up of
  25. *
  26. * - Nodes: There are eight possible Node types (variable, object, method, ...)
  27. * - References: Typed and directed relations between two nodes
  28. *
  29. * Every node is identified by a unique (within the server) :ref:`nodeid`.
  30. * Reference are triples of the form ``(source-nodeid, referencetype-nodeid,
  31. * target-nodeid)``. An example reference between nodes is a
  32. * ``hasTypeDefinition`` reference between a Variable and its VariableType. Some
  33. * ReferenceTypes are *hierarchic* and must not form *directed loops*. See the
  34. * section on :ref:`ReferenceTypes <referencetypenode>` for more details on
  35. * possible references and their semantics.
  36. *
  37. * **Warning!!** The structures defined in this section are only relevant for
  38. * the developers of custom Nodestores. The interaction with the information
  39. * model is possible only via the OPC UA :ref:`services`. So the following
  40. * sections are purely informational so that users may have a clear mental
  41. * model of the underlying representation.
  42. *
  43. * Base Node Attributes
  44. * --------------------
  45. *
  46. * Nodes contain attributes according to their node type. The base node
  47. * attributes are common to all node types. In the OPC UA :ref:`services`,
  48. * attributes are referred to via the :ref:`nodeid` of the containing node and
  49. * an integer :ref:`attribute-id`.
  50. *
  51. * Internally, open62541 uses ``UA_Node`` in places where the exact node type is
  52. * not known or not important. The ``nodeClass`` attribute is used to ensure the
  53. * correctness of casting from ``UA_Node`` to a specific node type. */
  54. /* List of reference targets with the same reference type and direction */
  55. typedef struct {
  56. UA_NodeId referenceTypeId;
  57. UA_Boolean isInverse;
  58. size_t targetIdsSize;
  59. UA_ExpandedNodeId *targetIds;
  60. } UA_NodeReferenceKind;
  61. #define UA_NODE_BASEATTRIBUTES \
  62. UA_NodeId nodeId; \
  63. UA_NodeClass nodeClass; \
  64. UA_QualifiedName browseName; \
  65. UA_LocalizedText displayName; \
  66. UA_LocalizedText description; \
  67. UA_UInt32 writeMask; \
  68. size_t referencesSize; \
  69. UA_NodeReferenceKind *references; \
  70. \
  71. /* Members specific to open62541 */ \
  72. void *context; \
  73. UA_Boolean constructed; /* don't run the constructors twice on a node */
  74. typedef struct {
  75. UA_NODE_BASEATTRIBUTES
  76. } UA_Node;
  77. /* The following methods specialize internally for the different node classes
  78. * (distinguished by the nodeClass member) */
  79. /* Attributes must be of a matching type (VariableAttributes, ObjectAttributes,
  80. * and so on). The attributes are copied. Note that the attributes structs do
  81. * not contain NodeId, NodeClass and BrowseName. The NodeClass of the node needs
  82. * to be correctly set before calling this method. UA_Node_deleteMembers is
  83. * called on the node when an error occurs internally. */
  84. UA_StatusCode UA_EXPORT
  85. UA_Node_setAttributes(UA_Node *node, const void *attributes,
  86. const UA_DataType *attributeType);
  87. UA_StatusCode UA_EXPORT
  88. UA_Node_copy(const UA_Node *src, UA_Node *dst);
  89. UA_StatusCode UA_EXPORT
  90. UA_Node_addReference(UA_Node *node, const UA_AddReferencesItem *item);
  91. UA_StatusCode UA_EXPORT
  92. UA_Node_deleteReference(UA_Node *node, const UA_DeleteReferencesItem *item);
  93. void UA_EXPORT
  94. UA_Node_deleteReferences(UA_Node *node);
  95. void UA_EXPORT
  96. UA_Node_deleteMembers(UA_Node *node);
  97. /**
  98. * VariableNode
  99. * ------------
  100. *
  101. * Variables store values in a :ref:`datavalue` together with
  102. * metadata for introspection. Most notably, the attributes data type, value
  103. * rank and array dimensions constrain the possible values the variable can take
  104. * on.
  105. *
  106. * Variables come in two flavours: properties and datavariables. Properties are
  107. * related to a parent with a ``hasProperty`` reference and may not have child
  108. * nodes themselves. Datavariables may contain properties (``hasProperty``) and
  109. * also datavariables (``hasComponents``).
  110. *
  111. * All variables are instances of some :ref:`variabletypenode` in return
  112. * constraining the possible data type, value rank and array dimensions
  113. * attributes.
  114. *
  115. * Data Type
  116. * ^^^^^^^^^
  117. *
  118. * The (scalar) data type of the variable is constrained to be of a specific
  119. * type or one of its children in the type hierarchy. The data type is given as
  120. * a NodeId pointing to a :ref:`datatypenode` in the type hierarchy. See the
  121. * Section :ref:`datatypenode` for more details.
  122. *
  123. * If the data type attribute points to ``UInt32``, then the value attribute
  124. * must be of that exact type since ``UInt32`` does not have children in the
  125. * type hierarchy. If the data type attribute points ``Number``, then the type
  126. * of the value attribute may still be ``UInt32``, but also ``Float`` or
  127. * ``Byte``.
  128. *
  129. * Consistency between the data type attribute in the variable and its
  130. * :ref:`VariableTypeNode` is ensured.
  131. *
  132. * Value Rank
  133. * ^^^^^^^^^^
  134. *
  135. * This attribute indicates whether the value attribute of the variable is an
  136. * array and how many dimensions the array has. It may have the following
  137. * values:
  138. *
  139. * - ``n >= 1``: the value is an array with the specified number of dimensions
  140. * - ``n = 0``: the value is an array with one or more dimensions
  141. * - ``n = -1``: the value is a scalar
  142. * - ``n = -2``: the value can be a scalar or an array with any number of dimensions
  143. * - ``n = -3``: the value can be a scalar or a one dimensional array
  144. *
  145. * Consistency between the value rank attribute in the variable and its
  146. * :ref:`variabletypenode` is ensured.
  147. *
  148. * Array Dimensions
  149. * ^^^^^^^^^^^^^^^^
  150. *
  151. * If the value rank permits the value to be a (multi-dimensional) array, the
  152. * exact length in each dimensions can be further constrained with this
  153. * attribute.
  154. *
  155. * - For positive lengths, the variable value is guaranteed to be of the same
  156. * length in this dimension.
  157. * - The dimension length zero is a wildcard and the actual value may have any
  158. * length in this dimension.
  159. *
  160. * Consistency between the array dimensions attribute in the variable and its
  161. * :ref:`variabletypenode` is ensured. */
  162. /* Indicates whether a variable contains data inline or whether it points to an
  163. * external data source */
  164. typedef enum {
  165. UA_VALUESOURCE_DATA,
  166. UA_VALUESOURCE_DATASOURCE
  167. } UA_ValueSource;
  168. #define UA_NODE_VARIABLEATTRIBUTES \
  169. /* Constraints on possible values */ \
  170. UA_NodeId dataType; \
  171. UA_Int32 valueRank; \
  172. size_t arrayDimensionsSize; \
  173. UA_UInt32 *arrayDimensions; \
  174. \
  175. /* The current value */ \
  176. UA_ValueSource valueSource; \
  177. union { \
  178. struct { \
  179. UA_DataValue value; \
  180. UA_ValueCallback callback; \
  181. } data; \
  182. UA_DataSource dataSource; \
  183. } value;
  184. typedef struct {
  185. UA_NODE_BASEATTRIBUTES
  186. UA_NODE_VARIABLEATTRIBUTES
  187. UA_Byte accessLevel;
  188. UA_Double minimumSamplingInterval;
  189. UA_Boolean historizing; /* currently unsupported */
  190. } UA_VariableNode;
  191. /**
  192. * .. _variabletypenode:
  193. *
  194. * VariableTypeNode
  195. * ----------------
  196. *
  197. * VariableTypes are used to provide type definitions for variables.
  198. * VariableTypes constrain the data type, value rank and array dimensions
  199. * attributes of variable instances. Furthermore, instantiating from a specific
  200. * variable type may provide semantic information. For example, an instance from
  201. * ``MotorTemperatureVariableType`` is more meaningful than a float variable
  202. * instantiated from ``BaseDataVariable``. */
  203. typedef struct {
  204. UA_NODE_BASEATTRIBUTES
  205. UA_NODE_VARIABLEATTRIBUTES
  206. UA_Boolean isAbstract;
  207. /* Members specific to open62541 */
  208. UA_NodeTypeLifecycle lifecycle;
  209. } UA_VariableTypeNode;
  210. /**
  211. * .. _methodnode:
  212. *
  213. * MethodNode
  214. * ----------
  215. *
  216. * Methods define callable functions and are invoked using the :ref:`Call
  217. * <method-services>` service. MethodNodes may have special properties (variable
  218. * childen with a ``hasProperty`` reference) with the :ref:`qualifiedname` ``(0,
  219. * "InputArguments")`` and ``(0, "OutputArguments")``. The input and output
  220. * arguments are both described via an array of ``UA_Argument``. While the Call
  221. * service uses a generic array of :ref:`variant` for input and output, the
  222. * actual argument values are checked to match the signature of the MethodNode.
  223. *
  224. * Note that the same MethodNode may be referenced from several objects (and
  225. * object types). For this, the NodeId of the method *and of the object
  226. * providing context* is part of a Call request message. */
  227. typedef struct {
  228. UA_NODE_BASEATTRIBUTES
  229. UA_Boolean executable;
  230. /* Members specific to open62541 */
  231. UA_MethodCallback method;
  232. } UA_MethodNode;
  233. /**
  234. * ObjectNode
  235. * ----------
  236. *
  237. * Objects are used to represent systems, system components, real-world objects
  238. * and software objects. Objects are instances of an :ref:`object
  239. * type<objecttypenode>` and may contain variables, methods and further
  240. * objects. */
  241. typedef struct {
  242. UA_NODE_BASEATTRIBUTES
  243. UA_Byte eventNotifier;
  244. } UA_ObjectNode;
  245. /**
  246. * .. _objecttypenode:
  247. *
  248. * ObjectTypeNode
  249. * --------------
  250. *
  251. * ObjectTypes provide definitions for Objects. Abstract objects cannot be
  252. * instantiated. See :ref:`object-lifecycle` for the use of constructor and
  253. * destructor callbacks. */
  254. typedef struct {
  255. UA_NODE_BASEATTRIBUTES
  256. UA_Boolean isAbstract;
  257. /* Members specific to open62541 */
  258. UA_NodeTypeLifecycle lifecycle;
  259. } UA_ObjectTypeNode;
  260. /**
  261. * .. _referencetypenode:
  262. *
  263. * ReferenceTypeNode
  264. * -----------------
  265. *
  266. * Each reference between two nodes is typed with a ReferenceType that gives
  267. * meaning to the relation. The OPC UA standard defines a set of ReferenceTypes
  268. * as a mandatory part of OPC UA information models.
  269. *
  270. * - Abstract ReferenceTypes cannot be used in actual references and are only
  271. * used to structure the ReferenceTypes hierarchy
  272. * - Symmetric references have the same meaning from the perspective of the
  273. * source and target node
  274. *
  275. * The figure below shows the hierarchy of the standard ReferenceTypes (arrows
  276. * indicate a ``hasSubType`` relation). Refer to Part 3 of the OPC UA
  277. * specification for the full semantics of each ReferenceType.
  278. *
  279. * .. graphviz::
  280. *
  281. * digraph tree {
  282. *
  283. * node [height=0, shape=box, fillcolor="#E5E5E5", concentrate=true]
  284. *
  285. * references [label="References\n(Abstract, Symmetric)"]
  286. * hierarchical_references [label="HierarchicalReferences\n(Abstract)"]
  287. * references -> hierarchical_references
  288. *
  289. * nonhierarchical_references [label="NonHierarchicalReferences\n(Abstract, Symmetric)"]
  290. * references -> nonhierarchical_references
  291. *
  292. * haschild [label="HasChild\n(Abstract)"]
  293. * hierarchical_references -> haschild
  294. *
  295. * aggregates [label="Aggregates\n(Abstract)"]
  296. * haschild -> aggregates
  297. *
  298. * organizes [label="Organizes"]
  299. * hierarchical_references -> organizes
  300. *
  301. * hascomponent [label="HasComponent"]
  302. * aggregates -> hascomponent
  303. *
  304. * hasorderedcomponent [label="HasOrderedComponent"]
  305. * hascomponent -> hasorderedcomponent
  306. *
  307. * hasproperty [label="HasProperty"]
  308. * aggregates -> hasproperty
  309. *
  310. * hassubtype [label="HasSubtype"]
  311. * haschild -> hassubtype
  312. *
  313. * hasmodellingrule [label="HasModellingRule"]
  314. * nonhierarchical_references -> hasmodellingrule
  315. *
  316. * hastypedefinition [label="HasTypeDefinition"]
  317. * nonhierarchical_references -> hastypedefinition
  318. *
  319. * hasencoding [label="HasEncoding"]
  320. * nonhierarchical_references -> hasencoding
  321. *
  322. * hasdescription [label="HasDescription"]
  323. * nonhierarchical_references -> hasdescription
  324. *
  325. * haseventsource [label="HasEventSource"]
  326. * hierarchical_references -> haseventsource
  327. *
  328. * hasnotifier [label="HasNotifier"]
  329. * hierarchical_references -> hasnotifier
  330. *
  331. * generatesevent [label="GeneratesEvent"]
  332. * nonhierarchical_references -> generatesevent
  333. *
  334. * alwaysgeneratesevent [label="AlwaysGeneratesEvent"]
  335. * generatesevent -> alwaysgeneratesevent
  336. *
  337. * {rank=same hierarchical_references nonhierarchical_references}
  338. * {rank=same generatesevent haseventsource hasmodellingrule
  339. * hasencoding hassubtype}
  340. * {rank=same alwaysgeneratesevent hasproperty}
  341. *
  342. * }
  343. *
  344. * The ReferenceType hierarchy can be extended with user-defined ReferenceTypes.
  345. * Many Companion Specifications for OPC UA define new ReferenceTypes to be used
  346. * in their domain of interest.
  347. *
  348. * For the following example of custom ReferenceTypes, we attempt to model the
  349. * structure of a technical system. For this, we introduce two custom
  350. * ReferenceTypes. First, the hierarchical ``contains`` ReferenceType indicates
  351. * that a system (represented by an OPC UA object) contains a component (or
  352. * subsystem). This gives rise to a tree-structure of containment relations. For
  353. * example, the motor (object) is contained in the car and the crankshaft is
  354. * contained in the motor. Second, the symmetric ``connectedTo`` ReferenceType
  355. * indicates that two components are connected. For example, the motor's
  356. * crankshaft is connected to the gear box. Connections are independent of the
  357. * containment hierarchy and can induce a general graph-structure. Further
  358. * subtypes of ``connectedTo`` could be used to differentiate between physical,
  359. * electrical and information related connections. A client can then learn the
  360. * layout of a (physical) system represented in an OPC UA information model
  361. * based on a common understanding of just two custom reference types. */
  362. typedef struct {
  363. UA_NODE_BASEATTRIBUTES
  364. UA_Boolean isAbstract;
  365. UA_Boolean symmetric;
  366. UA_LocalizedText inverseName;
  367. } UA_ReferenceTypeNode;
  368. /**
  369. * .. _datatypenode:
  370. *
  371. * DataTypeNode
  372. * ------------
  373. *
  374. * DataTypes represent simple and structured data types. DataTypes may contain
  375. * arrays. But they always describe the structure of a single instance. In
  376. * open62541, DataTypeNodes in the information model hierarchy are matched to
  377. * ``UA_DataType`` type descriptions for :ref:`generic-types` via their NodeId.
  378. *
  379. * Abstract DataTypes (e.g. ``Number``) cannot be the type of actual values.
  380. * They are used to constrain values to possible child DataTypes (e.g.
  381. * ``UInt32``). */
  382. typedef struct {
  383. UA_NODE_BASEATTRIBUTES
  384. UA_Boolean isAbstract;
  385. } UA_DataTypeNode;
  386. /**
  387. * ViewNode
  388. * --------
  389. *
  390. * Each View defines a subset of the Nodes in the AddressSpace. Views can be
  391. * used when browsing an information model to focus on a subset of nodes and
  392. * references only. ViewNodes can be created and be interacted with. But their
  393. * use in the :ref:`Browse<view-services>` service is currently unsupported in
  394. * open62541. */
  395. typedef struct {
  396. UA_NODE_BASEATTRIBUTES
  397. UA_Byte eventNotifier;
  398. UA_Boolean containsNoLoops;
  399. } UA_ViewNode;
  400. /**
  401. * Nodestore
  402. * =========
  403. * The following definitions are used for implementing node storage plugins.
  404. * Most users will want to use one of the predefined Nodestores.
  405. *
  406. * Warning! Endusers should not manually edit nodes. Please use the server API
  407. * for that. Otherwise, the consistency checks of the server are omitted. This
  408. * can crash the application eventually. */
  409. typedef void
  410. (*UA_NodestoreVisitor)(void *visitorContext, const UA_Node *node);
  411. typedef struct {
  412. /* Nodestore context and lifecycle */
  413. void *context;
  414. void (*deleteNodestore)(void *nodestoreContext);
  415. /* For non-multithreaded access, some nodestores allow that nodes are edited
  416. * without a copy/replace. This is not possible when the node is only an
  417. * intermediate representation and stored e.g. in a database backend. */
  418. UA_Boolean inPlaceEditAllowed;
  419. /* The following definitions are used to create empty nodes of the different
  420. * node types. The memory is managed by the nodestore. Therefore, the node
  421. * has to be removed via a special deleteNode function. (If the new node is
  422. * not added to the nodestore.) */
  423. UA_Node * (*newNode)(void *nodestoreContext, UA_NodeClass nodeClass);
  424. void (*deleteNode)(void *nodestoreContext, UA_Node *node);
  425. /* ``Get`` returns a pointer to an immutable node. ``Release`` indicates
  426. * that the pointer is no longer accessed afterwards. */
  427. const UA_Node * (*getNode)(void *nodestoreContext, const UA_NodeId *nodeId);
  428. void (*releaseNode)(void *nodestoreContext, const UA_Node *node);
  429. /* Returns an editable copy of a node (needs to be deleted with the
  430. * deleteNode function or inserted / replaced into the nodestore). */
  431. UA_StatusCode (*getNodeCopy)(void *nodestoreContext, const UA_NodeId *nodeId,
  432. UA_Node **outNode);
  433. /* Inserts a new node into the nodestore. If the NodeId is zero, then a
  434. * fresh numeric NodeId is assigned. If insertion fails, the node is
  435. * deleted. */
  436. UA_StatusCode (*insertNode)(void *nodestoreContext, UA_Node *node,
  437. UA_NodeId *addedNodeId);
  438. /* To replace a node, get an editable copy of the node, edit and replace
  439. * with this function. If the node was already replaced since the copy was
  440. * made, UA_STATUSCODE_BADINTERNALERROR is returned. If the NodeId is not
  441. * found, UA_STATUSCODE_BADNODEIDUNKNOWN is returned. In both error cases,
  442. * the editable node is deleted. */
  443. UA_StatusCode (*replaceNode)(void *nodestoreContext, UA_Node *node);
  444. /* Removes a node from the nodestore. */
  445. UA_StatusCode (*removeNode)(void *nodestoreContext, const UA_NodeId *nodeId);
  446. /* Execute a callback for every node in the nodestore. */
  447. void (*iterate)(void *nodestoreContext, void* visitorContext,
  448. UA_NodestoreVisitor visitor);
  449. } UA_Nodestore;
  450. #ifdef __cplusplus
  451. } // extern "C"
  452. #endif
  453. #endif /* UA_SERVER_NODES_H_ */