UA ANSI C Server Professional  1.4.2.297
 All Data Structures Functions Variables Typedefs Enumerations Enumerator Modules Pages
custom_provider.c
/******************************************************************************
**
** Copyright (C) 2011-2014 Unified Automation GmbH. All Rights Reserved.
** Web: http://www.unifiedautomation.com
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** Project: OPC Ansi C OPC Server Examples
**
******************************************************************************/
#include "custom_provider.h"
#include <uaserver_utilities.h>
#include "custom_provider_helper.h"
OPCUA_BEGIN_EXTERN_C
/* Global provider data */
UaServer_Provider *g_pCustomProvider;
UaServer_pProviderInterface *g_pCustomProviderInterface;
OpcUa_UInt16 g_uCustomProvider_NamespaceIndex = OpcUa_UInt16_Max;
/* Forward declarations */
IFMETHODIMP(CustomProvider_Cleanup)(OpcUa_Void);
IFMETHODIMP(CustomProvider_ReadAsync)(UaServer_ProviderReadContext *a_pReadCtx);
IFMETHODIMP(CustomProvider_WriteAsync)(UaServer_ProviderWriteContext *a_pWriteCtx);
IFMETHODIMP(CustomProvider_BrowseAsync)(UaServer_ProviderBrowseContext *a_pBrowseCtx);
IFMETHODIMP(CustomProvider_TranslateAsync)(UaServer_ProviderTranslateContext *a_pTranslateCtx);
IFMETHODIMP(CustomProvider_AddItem)(UaServer_MonitoredItem *a_pItem);
IFMETHODIMP(CustomProvider_RemoveItem)(UaServer_MonitoredItem *a_pItem);
IFMETHODIMP(CustomProvider_Subscribe)(UaServer_ProviderSubscribeContext *a_pCtx);
OpcUa_StatusCode CustomProvider_Subscription_Initialize();
OpcUa_StatusCode CustomProvider_Subscription_Cleanup();
OpcUa_StatusCode CustomProvider_CreateSampleNodes(OpcUa_BaseNode *a_pOwner, OpcUa_NodeId *a_pStartingNodeId)
{
OpcUa_DataVariable *pVariable = OpcUa_Null;
OpcUa_Variant *pValue = OpcUa_Null;
UaServer_AddressSpace *pAddressSpace = &g_pCustomProvider->AddressSpace;
UaServer_AddressSpace *pServerAddressSpace = OpcUa_Null;
OpcUa_NodeId nodeId, referenceNodeId, typeNodeId;
OpcUa_InitializeStatus(OpcUa_Module_Server, "CustomProvider_CreateSampleNodes");
OpcUa_ReturnErrorIfArgumentNull(a_pOwner);
OpcUa_ReturnErrorIfArgumentNull(a_pStartingNodeId);
UaServer_AddressSpace_Get(0, &pServerAddressSpace);
OpcUa_NodeId_Initialize(&nodeId);
OpcUa_NodeId_Initialize(&referenceNodeId);
OpcUa_NodeId_Initialize(&typeNodeId);
/* Create variable that is read- and writable by all users */
a_pStartingNodeId->Identifier.Numeric++;
uStatus = UaServer_CreateDataVariable(pAddressSpace,
&pVariable,
a_pOwner,
a_pStartingNodeId->Identifier.Numeric,
g_uCustomProvider_NamespaceIndex,
"Sample_WriteAll_ReadAll");
OpcUa_GotoErrorIfBad(uStatus);
OpcUa_Variable_SetDataType_Numeric(pVariable, OpcUaId_UInt32, 0);
pValue = OpcUa_Variable_GetValue(pVariable);
pValue->Datatype = OpcUaType_UInt32;
pValue->Value.UInt32 = 100;
UaServer_UserMgt_SetPermissions((OpcUa_BaseNode*)pVariable,
0,
0,
0x0FFF);
/* Create variable that is readable by all users and only writable by user 'root' */
a_pStartingNodeId->Identifier.Numeric++;
uStatus = UaServer_CreateDataVariable(pAddressSpace,
&pVariable,
a_pOwner,
a_pStartingNodeId->Identifier.Numeric,
g_uCustomProvider_NamespaceIndex,
"Sample_WriteRoot_ReadAll");
OpcUa_GotoErrorIfBad(uStatus);
OpcUa_Variable_SetDataType_Numeric(pVariable, OpcUaId_UInt32, 0);
pValue = OpcUa_Variable_GetValue(pVariable);
pValue->Datatype = OpcUaType_UInt32;
pValue->Value.UInt32 = 100;
UaServer_UserMgt_SetPermissions((OpcUa_BaseNode*)pVariable,
1,
1,
UA_USER_ATTRWRITABLE | UA_USER_WRITABLE | UA_USER_READABLE | UA_USER_BROWSEABLE |
UA_GROUP_READABLE | UA_GROUP_BROWSEABLE |
UA_OTHER_READABLE | UA_OTHER_BROWSEABLE);
/* Create variable that is read- and writable only by user 'root' */
a_pStartingNodeId->Identifier.Numeric++;
uStatus = UaServer_CreateDataVariable(pAddressSpace,
&pVariable,
a_pOwner,
a_pStartingNodeId->Identifier.Numeric,
g_uCustomProvider_NamespaceIndex,
"Sample_WriteRoot_ReadRoot");
OpcUa_GotoErrorIfBad(uStatus);
OpcUa_Variable_SetDataType_Numeric(pVariable, OpcUaId_UInt32, 0);
pValue = OpcUa_Variable_GetValue(pVariable);
pValue->Datatype = OpcUaType_UInt32;
pValue->Value.UInt32 = 100;
UaServer_UserMgt_SetPermissions((OpcUa_BaseNode*)pVariable,
1,
1,
UA_USER_ATTRWRITABLE | UA_USER_WRITABLE | UA_USER_READABLE | UA_USER_BROWSEABLE);
OpcUa_ReturnStatusCode;
OpcUa_BeginErrorHandling;
OpcUa_FinishErrorHandling;
}
/* Internal Helper For Creating The AddressSpace In The Server */
OpcUa_StatusCode CustomProvider_CreateAddressSpace()
{
OpcUa_UInt16 uNsIdx = g_uCustomProvider_NamespaceIndex;
OpcUa_Folder *pCustomProvider = OpcUa_Null;
OpcUa_Folder *pFolder = OpcUa_Null;
OpcUa_NodeId nodeId;
UaServer_AddressSpace *pAddressSpace = &(g_pCustomProvider->AddressSpace);
UaServer_AddressSpace *pServerAddressSpace = OpcUa_Null;
OpcUa_BaseNode_DefaultValues *pBaseNode_DefaultValues = OpcUa_BaseNode_DefaultValues_Get();
OpcUa_InitializeStatus(OpcUa_Module_Server, "CustomProvider_CreateAddressSpace");
OpcUa_NodeId_Initialize(&nodeId);
/* Set default values for node creation */
pBaseNode_DefaultValues->MinimumSamplingInterval = 50.0;
pBaseNode_DefaultValues->AccessLevel = OpcUa_AccessLevels_CurrentReadOrWrite;
#if UASERVER_SUPPORT_AUTHORIZATION == OPCUA_CONFIG_NO
pBaseNode_DefaultValues->UserAccessLevel = OpcUa_AccessLevels_CurrentReadOrWrite;
#endif
/* Get objects folder node */
UaServer_AddressSpace_Get(0, &pServerAddressSpace);
nodeId.NamespaceIndex = 0;
nodeId.Identifier.Numeric = OpcUaId_ObjectsFolder;
UaServer_GetNode(pServerAddressSpace, &nodeId, (OpcUa_BaseNode**)&pFolder);
/* Create custom provider base node */
nodeId.Identifier.Numeric++;
uStatus = UaServer_CreateFolder(pAddressSpace,
&pCustomProvider,
(OpcUa_BaseNode*)pFolder,
nodeId.Identifier.Numeric,
uNsIdx,
"Custom Provider");
OpcUa_GotoErrorIfBad(uStatus);
/* create demo nodes */
uStatus = CustomProvider_CreateSampleNodes((OpcUa_BaseNode*)pCustomProvider, &nodeId);
OpcUa_GotoErrorIfBad(uStatus);
OpcUa_ReturnStatusCode;
OpcUa_BeginErrorHandling;
OpcUa_FinishErrorHandling;
}
/* Initialization function called by the server */
IFMETHODIMP(CustomProvider_Initialize)(UaServer_Provider *a_pProvider,
UaServer_pProviderInterface *a_pProviderInterface)
{
OpcUa_InitializeStatus(OpcUa_Module_Server, "CustomProvider_Initialize");
printf("Initialize CustomProvider ...\n");
/* Store values */
g_pCustomProvider = a_pProvider;
g_pCustomProviderInterface = a_pProviderInterface;
OpcUa_MemSet(g_pCustomProviderInterface, 0, sizeof(UaServer_pProviderInterface));
/* Register service handlers */
a_pProviderInterface->Cleanup = CustomProvider_Cleanup;
a_pProviderInterface->ReadAsync = CustomProvider_ReadAsync;
a_pProviderInterface->WriteAsync = CustomProvider_WriteAsync;
a_pProviderInterface->BrowseAsync = CustomProvider_BrowseAsync;
a_pProviderInterface->TranslateAsync = CustomProvider_TranslateAsync;
a_pProviderInterface->AddItem = CustomProvider_AddItem;
a_pProviderInterface->RemoveItem = CustomProvider_RemoveItem;
a_pProviderInterface->Subscribe = CustomProvider_Subscribe;
/* Register address space */
uStatus = UaServer_RegisterAddressSpace((OpcUa_Handle *)a_pProvider,
&g_uCustomProvider_NamespaceIndex,
"http://www.unifiedautomation.com/customprovider/",
1009);
OpcUa_ReturnErrorIfBad(uStatus);
/* Create address space */
uStatus = CustomProvider_CreateAddressSpace();
OpcUa_ReturnErrorIfBad(uStatus);
/* Initialize subscription management */
uStatus = CustomProvider_Subscription_Initialize();
OpcUa_ReturnErrorIfBad(uStatus);
printf("Initialize CustomProvider DONE!\n");
OpcUa_ReturnStatusCode;
OpcUa_BeginErrorHandling;
OpcUa_FinishErrorHandling;
}
/* Clean up the custom provider */
IFMETHODIMP(CustomProvider_Cleanup)()
{
OpcUa_InitializeStatus(OpcUa_Module_Server, "CustomProvider_Cleanup");
printf("Cleanup CustomProvider ...\n");
/* Cleanup subscription management */
CustomProvider_Subscription_Cleanup();
printf("Cleanup CustomProvider DONE!\n");
OpcUa_ReturnStatusCode;
OpcUa_BeginErrorHandling;
OpcUa_FinishErrorHandling;
}
#if BUILD_SHARED_LIBS
CUSTOMPROVIDER_API(OpcUa_StatusCode) InitializeProvider(UaServer_Provider* pProvider,
UaServer_pProviderInterface* pProviderInterface)
{
return CustomProvider_Initialize(pProvider, pProviderInterface);
}
#endif
OPCUA_END_EXTERN_C