一.概念
(1)节点的通用属性
(2)变量的附加属性
二.使用open62541向server内添加变量节点
static void
addVariable(UA_Server *server) {
/* Define the attribute of the myInteger variable node */
UA_VariableAttributes attr = UA_VariableAttributes_default;
UA_Int32 myInteger = 42;
UA_Variant_setScalar(&attr.value, &myInteger, &UA_TYPES[UA_TYPES_INT32]);
attr.description = UA_LOCALIZEDTEXT("en-US","the answer");
attr.displayName = UA_LOCALIZEDTEXT("en-US","the answer");
attr.dataType = UA_TYPES[UA_TYPES_INT32].typeId;
attr.accessLevel = UA_ACCESSLEVELMASK_READ | UA_ACCESSLEVELMASK_WRITE;
/* Add the variable node to the information model */
UA_NodeId myIntegerNodeId = UA_NODEID_STRING(1, "the.answer");
UA_QualifiedName myIntegerName = UA_QUALIFIEDNAME(1, "the answer");
UA_NodeId parentNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER);
UA_NodeId parentReferenceNodeId = UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES);
UA_Server_addVariableNode(server, myIntegerNodeId, parentNodeId,
parentReferenceNodeId, myIntegerName,
UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE), attr, NULL, NULL);
}
代码块来自open62541的文档
(1)Define the attribute of the myInteger variable node
open62541中定义的变量的属性如下:
/**
* VariableAttributes
* ^^^^^^^^^^^^^^^^^^
*/
typedef struct {
UA_UInt32 specifiedAttributes;
UA_LocalizedText displayName;
UA_LocalizedText description;
UA_UInt32 writeMask;
UA_UInt32 userWriteMask;
UA_Variant value;
UA_NodeId dataType;
UA_Int32 valueRank;
size_t arrayDimensionsSize;
UA_UInt32 *arrayDimensions;
UA_Byte accessLevel;
UA_Byte userAccessLevel;
UA_Double minimumSamplingInterval;
UA_Boolean historizing;
} UA_VariableAttributes;
attr的默认值UA_VariableAttributes_default值:
const UA_VariableAttributes UA_VariableAttributes_default = {
0, /* specifiedAttributes */
{{0, NULL}, {0, NULL}}, /* displayName */
{{0, NULL}, {0, NULL}}, /* description */
0, 0, /* writeMask (userWriteMask) */
{NULL, UA_VARIANT_DATA,
0, NULL, 0, NULL}, /* value */
{0, UA_NODEIDTYPE_NUMERIC,
{UA_NS0ID_BASEDATATYPE}}, /* dataType */
UA_VALUERANK_ANY, /* valueRank */
0, NULL, /* arrayDimensions */
UA_ACCESSLEVELMASK_READ, 0, /* accessLevel (userAccessLevel) */
0.0, /* minimumSamplingInterval */
false /* historizing */
};
attr的属性可以根据自己的需求来改变
(2)Add the variable node to the information model
static UA_INLINE UA_THREADSAFE UA_StatusCode
UA_Server_addVariableNode(UA_Server *server, const UA_NodeId requestedNewNodeId,
const UA_NodeId parentNodeId,
const UA_NodeId referenceTypeId,
const UA_QualifiedName browseName,
const UA_NodeId typeDefinition,
const UA_VariableAttributes attr,
void *nodeContext, UA_NodeId *outNewNodeId) {
return __UA_Server_addNode(server, UA_NODECLASS_VARIABLE, &requestedNewNodeId,
&parentNodeId, &referenceTypeId, browseName,
&typeDefinition, (const UA_NodeAttributes*)&attr,
&UA_TYPES[UA_TYPES_VARIABLEATTRIBUTES],
nodeContext, outNewNodeId);
}
/* UA_Server_addVariableNode函数的参数:(作用:向地址空间内部添加一个变量节点)
UA_Server *server,
const UA_NodeId requestedNewNodeId, 请求添加的节点
const UA_NodeId parentNodeId, 父节点
const UA_NodeId referenceTypeId, 引用的类型
const UA_QualifiedName browseName, 浏览的名字(非本地化)
const UA_NodeId typeDefinition, variableTypeNodeId
const UA_VariableAttributes attr, 该节点的属性
void *nodeContext,
UA_NodeId *outNewNodeId
*/