UA Server SDK C++ Bundle  1.3.2.200
 All Data Structures Namespaces Functions Variables Typedefs Enumerations Enumerator Groups Pages
Supplement C: Registering Nodes

Content:

Due to the fact that Read and Write are called with NodeIds, not with handles like in COM DA, UaSession provides registerNodes() to allow a client to optimize the cyclic access to Nodes for example for writing variable values or for calling methods.

Step 1: Implementing registerNodes()

Add the following code to header,

/* OPC UA service calls */
. . .
void registerNodes();

and source file, rsp.:

/*============================================================================
registerNodes - RegisterNodes for frequently use in read or write
*===========================================================================*/
void registerNodes()
{
printf("\n\n****************************************************************\n");
printf("** Try to call registerNodes for configured node ids\n");
if ( g_pUaSession == NULL )
{
printf("** Error: Server not connected\n");
printf("****************************************************************\n");
return;
}
OpcUa_UInt32 i;
OpcUa_UInt32 count;
UaStatus status;
UaNodeIdArray nodesToRegister;
UaNodeIdArray registeredNodes;
ServiceSettings serviceSettings;
// Initialize IN parameter nodesToRegister
count = g_VariableNodeIds.length();
nodesToRegister.create(count);
for ( i=0; i<count; i++ )
{
g_VariableNodeIds[i].copyTo(&nodesToRegister[i]);
}
/*********************************************************************
Call registerNodes service
**********************************************************************/
status = g_pUaSession->registerNodes(
serviceSettings, // Use default settings
nodesToRegister, // Array of nodeIds to register
registeredNodes); // Returns an array of registered nodeIds
/*********************************************************************/
if ( status.isBad() )
{
printf("** Error: UaSession::registerNodes failed [ret=%s] **\n", status.toString().toUtf8());
}
else
{
printf("** UaSession::registerNodes succeeded\n");
for ( i=0; i<count; i++ )
{
// Copy back returned NodeIds
g_VariableNodeIds[i] = registeredNodes[i];
}
printf("****************************************************************\n");
}
}

Finally call setupSecurity in main() :

registerNodes();

whereas the placement of this statement can be in any order after the platformlayer has been initialized.

Step 2: Implementing unregisterNodes()

In order to delete shortcuts in the server created by registerNodes() add the following code to header,

/* OPC UA service calls */
. . .
void unregisterNodes();

and source file, rsp.:

/*============================================================================
unregisterNodes - RegisterNodes for frequently use in read or write
*===========================================================================*/
void unregisterNodes()
{
printf("\n\n****************************************************************\n");
printf("** Try to call unregisterNodes for removing node ids\n");
if ( g_pUaSession == NULL )
{
printf("** Error: Server not connected\n");
printf("****************************************************************\n");
return;
}
OpcUa_UInt32 i;
OpcUa_UInt32 count;
UaStatus status;
UaNodeIdArray nodesToUnregister;
ServiceSettings serviceSettings;
// Initialize IN parameter nodesToRegister
count = g_VariableNodeIds.length();
nodesToUnregister.create(count);
for ( i=0; i<count; i++ )
{
g_VariableNodeIds[i].copyTo(&nodesToUnregister[i]);
}
/*********************************************************************
Call registerNodes service
**********************************************************************/
status = g_pUaSession->unregisterNodes(
serviceSettings, // Use default settings
nodesToUnregister); // Array of nodeIds to unregister
/*********************************************************************/
if ( status.isBad() )
{
printf("** Error: UaSession::unregisterNodes failed [ret=%s] **\n", status.toString().toUtf8());
}
else
{
printf("** UaSession::unregisterNodes succeeded\n");
}
buildNodeIds();
printf("****************************************************************\n");
}

Finally call unregisterNodes() in main() :

registerNodes();
. . .
// ++
unregisterNodes();
// ++