Skip to content

Instantly share code, notes, and snippets.

@JensMertelmeyer
Last active October 16, 2020 05:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JensMertelmeyer/0f6c4af370e0ce4e9faed36d80471584 to your computer and use it in GitHub Desktop.
Save JensMertelmeyer/0f6c4af370e0ce4e9faed36d80471584 to your computer and use it in GitHub Desktop.
#include <open62541/server.h>
#include <open62541/server_config_default.h>
namespace NodeIds {
namespace Objects {
UA_NodeId MyStruct;
}
namespace Types {
namespace MyStruct {
UA_NodeId root;
UA_NodeId TimeStamp;
}
}
}
int main() {
UA_Server *server = UA_Server_new();
UA_ServerConfig *config = UA_Server_getConfig(server);
UA_ServerConfig_setDefault(config);
UA_StatusCode statusCode;
// Add MyStruct type
auto typeAttributes = UA_ObjectTypeAttributes_default;
typeAttributes.displayName = UA_LOCALIZEDTEXT("en", "MyStruct");
typeAttributes.isAbstract = false;
statusCode = UA_Server_addObjectTypeNode(
server,
UA_NODEID_NULL,
UA_NODEID_NUMERIC(0, UA_NS0ID_BASEOBJECTTYPE),
UA_NODEID_NUMERIC(0, UA_NS0ID_HASSUBTYPE),
UA_QUALIFIEDNAME(1, "t_MyStruct"),
typeAttributes,
nullptr,
&NodeIds::Types::MyStruct::root
);
// Add timestamp to MyStruct
auto timestampAttributes = UA_VariableAttributes_default;
timestampAttributes.displayName = UA_LOCALIZEDTEXT("en", "TimeStamp");
timestampAttributes.dataType = UA_TYPES[UA_TYPES_DATETIME].typeId;
statusCode = UA_Server_addVariableNode(
server,
UA_NODEID_NULL,
NodeIds::Types::MyStruct::root,
UA_NODEID_NUMERIC(0, UA_NS0ID_HASCOMPONENT),
UA_QUALIFIEDNAME(1, "TimeStamp"),
UA_NODEID_NUMERIC(0, UA_NS0ID_BASEDATAVARIABLETYPE),
timestampAttributes,
nullptr,
&NodeIds::Types::MyStruct::TimeStamp
);
// Make timestamp mandatory
statusCode = UA_Server_addReference(
server,
NodeIds::Types::MyStruct::TimeStamp,
UA_NODEID_NUMERIC(0, UA_NS0ID_HASMODELLINGRULE),
UA_EXPANDEDNODEID_NUMERIC(0, UA_NS0ID_MODELLINGRULE_MANDATORY),
/* isForward: */true
);
// Add instance of MyStruct under NS0/Objects
auto objectAttributes = UA_ObjectAttributes_default;
objectAttributes.displayName = UA_LOCALIZEDTEXT("en", "MyStruct");
statusCode = UA_Server_addObjectNode(
server,
UA_NODEID_NULL,
UA_NODEID_NUMERIC(0, UA_NS0ID_OBJECTSFOLDER),
UA_NODEID_NUMERIC(0, UA_NS0ID_ORGANIZES),
UA_QUALIFIEDNAME(1, "MyStruct"),
NodeIds::Types::MyStruct::root,
objectAttributes,
nullptr,
&NodeIds::Objects::MyStruct
);
// start server
bool isRunning = true;
UA_Server_run(server, &isRunning);
}
@JensMertelmeyer
Copy link
Author

MODELLINGRULE_MANDATORY was missing for timestamp.
See open62541/open62541#3956

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment