bool toWpcpId(const OpcUa_NodeId* nodeid, struct wpcp_value_t* value, char* buffer, uint32_t buffer_length) { value->type = WPCP_VALUE_TYPE_TEXT_STRING; value->data.text_string = buffer; if (nodeid->IdentifierType == OpcUa_IdentifierType_Numeric) value->value.length = OpcUa_SnPrintfA(buffer, buffer_length, "ns=%u;i=%u", nodeid->NamespaceIndex, nodeid->Identifier.Numeric); else if (nodeid->IdentifierType == OpcUa_IdentifierType_String) { uint64_t len = OpcUa_SnPrintfA(buffer, buffer_length, "ns=%u;s=", nodeid->NamespaceIndex); OpcUa_UInt32 strsize = OpcUa_String_StrSize(&nodeid->Identifier.String); memcpy(buffer + len, OpcUa_String_GetRawString(&nodeid->Identifier.String), strsize); value->value.length = len + strsize; } else if (nodeid->IdentifierType == OpcUa_IdentifierType_Guid) { OpcUa_String* str = 0; OpcUa_Guid_ToString(nodeid->Identifier.Guid, &str); uint64_t len = OpcUa_SnPrintfA(buffer, buffer_length, "ns=%u;g=", nodeid->NamespaceIndex); OpcUa_UInt32 strsize = OpcUa_String_StrSize(str); memcpy(buffer + len, OpcUa_String_GetRawString(str), strsize); value->value.length = len + strsize; OpcUa_String_Delete(&str); } else value->value.length = 0; return true; }
bool toWpcpString(const OpcUa_String* string, struct wpcp_value_t* value) { value->type = WPCP_VALUE_TYPE_TEXT_STRING; value->value.length = OpcUa_String_StrSize(string); value->data.text_string = OpcUa_String_GetRawString(string); return true; }
/*============================================================================ * method which implements the Read service. *===========================================================================*/ OpcUa_StatusCode my_Read( OpcUa_Endpoint a_hEndpoint, OpcUa_Handle a_hContext, const OpcUa_RequestHeader* a_pRequestHeader, OpcUa_Double a_nMaxAge, OpcUa_TimestampsToReturn a_eTimestampsToReturn, OpcUa_Int32 a_nNoOfNodesToRead, const OpcUa_ReadValueId* a_pNodesToRead, OpcUa_ResponseHeader* a_pResponseHeader, OpcUa_Int32* a_pNoOfResults, OpcUa_DataValue** a_pResults, OpcUa_Int32* a_pNoOfDiagnosticInfos, OpcUa_DiagnosticInfo** a_pDiagnosticInfos) { OpcUa_Int i,n; OpcUa_Void* p_Node; extern OpcUa_UInt32 securechannelId; extern OpcUa_UInt32 session_flag; extern OpcUa_Double msec_counter; extern OpcUa_String* p_user_name; OpcUa_InitializeStatus(OpcUa_Module_Server, "OpcUa_ServerApi_Read"); /* validate arguments. */ OpcUa_ReturnErrorIfArgumentNull(a_hEndpoint); OpcUa_ReturnErrorIfArgumentNull(a_hContext); OpcUa_ReturnErrorIfArgumentNull(a_pRequestHeader); OpcUa_ReferenceParameter(a_nMaxAge); OpcUa_ReferenceParameter(a_eTimestampsToReturn); OpcUa_ReturnErrorIfArrayArgumentNull(a_nNoOfNodesToRead, a_pNodesToRead); OpcUa_ReturnErrorIfArgumentNull(a_pResponseHeader); OpcUa_ReturnErrorIfArrayArgumentNull(a_pNoOfResults, a_pResults); OpcUa_ReturnErrorIfArrayArgumentNull(a_pNoOfDiagnosticInfos, a_pDiagnosticInfos); *a_pNoOfDiagnosticInfos=0; *a_pDiagnosticInfos=OpcUa_Null; RESET_SESSION_COUNTER #ifndef NO_DEBUGING_ MY_TRACE("\n\n\nRREADSERVICE==============================================\n"); if(p_user_name!=OpcUa_Null) MY_TRACE("\nUser:%s\n",OpcUa_String_GetRawString(p_user_name)); #endif /*_DEBUGING_*/ if(OpcUa_IsBad(session_flag)) { //teile client mit , dass Session geschlossen ist #ifndef NO_DEBUGING_ MY_TRACE("\nSession nicht aktiv\n"); #endif /*_DEBUGING_*/ uStatus=OpcUa_BadSessionNotActivated; OpcUa_GotoError; } uStatus=check_authentication_token(a_pRequestHeader); if(OpcUa_IsBad(uStatus)) { #ifndef NO_DEBUGING_ MY_TRACE("\nAuthentication Token ungültig.\n"); #endif /*_DEBUGING_*/ OpcUa_GotoError; } *a_pResults=OpcUa_Alloc(a_nNoOfNodesToRead*sizeof(OpcUa_DataValue)); OpcUa_GotoErrorIfAllocFailed((*a_pResults)) for(n=0;n<a_nNoOfNodesToRead;n++) { OpcUa_DataValue_Initialize((*a_pResults)+n); ((*a_pResults)+n)->StatusCode=OpcUa_BadAttributeIdInvalid; p_Node=search_for_node((a_pNodesToRead+n)->NodeId); if(p_Node!= OpcUa_Null) //pruefe ob Knoten existiert { if(((a_pNodesToRead+n)->AttributeId)<=7 && ((a_pNodesToRead+n)->AttributeId)>=1) { if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_NodeId) { ((*a_pResults)+n)->Value.Value.NodeId=OpcUa_Memory_Alloc(sizeof(OpcUa_NodeId)); if(((*a_pResults)+n)->Value.Value.NodeId !=OpcUa_Null) { OpcUa_NodeId_Initialize(((*a_pResults)+n)->Value.Value.NodeId); *(((*a_pResults)+n)->Value.Value.NodeId)=((_ObjectKnoten_*)p_Node)->BaseAttribute.NodeId; fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_NodeId, OpcUa_VariantArrayType_Scalar,0); ((*a_pResults)+n)->StatusCode=OpcUa_Good; } else { ((*a_pResults)+n)->StatusCode=OpcUa_BadOutOfMemory; } } if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_NodeClass) { ((*a_pResults)+n)->Value.Value.Int32=((_ObjectKnoten_*)p_Node)->BaseAttribute.NodeClass; fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_Int32, OpcUa_VariantArrayType_Scalar,0); ((*a_pResults)+n)->StatusCode=OpcUa_Good; } if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_BrowseName) { ((*a_pResults)+n)->Value.Value.QualifiedName=OpcUa_Memory_Alloc(sizeof(OpcUa_QualifiedName)); if(((*a_pResults)+n)->Value.Value.QualifiedName!=OpcUa_Null) { OpcUa_QualifiedName_Initialize(((*a_pResults)+n)->Value.Value.QualifiedName); OpcUa_String_AttachCopy(&((*a_pResults)+n)->Value.Value.QualifiedName->Name,((_ObjectKnoten_*)p_Node)->BaseAttribute.BrowseName); ((*a_pResults)+n)->Value.Value.QualifiedName->NamespaceIndex=((_ObjectKnoten_*)p_Node)->BaseAttribute.NodeId.NamespaceIndex; fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_QualifiedName, OpcUa_VariantArrayType_Scalar,0); ((*a_pResults)+n)->StatusCode=OpcUa_Good; } else { ((*a_pResults)+n)->StatusCode=OpcUa_BadOutOfMemory; } } if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_DisplayName) { ((*a_pResults)+n)->Value.Value.LocalizedText=OpcUa_Memory_Alloc(sizeof(OpcUa_LocalizedText)); if(((*a_pResults)+n)->Value.Value.LocalizedText!=OpcUa_Null) { OpcUa_LocalizedText_Initialize(((*a_pResults)+n)->Value.Value.LocalizedText); OpcUa_String_AttachCopy(&((*a_pResults)+n)->Value.Value.LocalizedText->Text,((_ObjectKnoten_*)p_Node)->BaseAttribute.DisplayName); OpcUa_String_AttachCopy(&((*a_pResults)+n)->Value.Value.LocalizedText->Locale,"en"); fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_LocalizedText, OpcUa_VariantArrayType_Scalar,0); ((*a_pResults)+n)->StatusCode=OpcUa_Good; } else { ((*a_pResults)+n)->StatusCode=OpcUa_BadOutOfMemory; } } if(((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_Description || (a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_WriteMask) || (a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_UserWriteMask) { ((*a_pResults)+n)->StatusCode=OpcUa_BadNotReadable; } } else { switch((((_ObjectKnoten_*)p_Node)->BaseAttribute.NodeClass)) { case OpcUa_NodeClass_Variable: { if((a_pNodesToRead+n)->AttributeId<=20 && (a_pNodesToRead+n)->AttributeId>=13) { if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_Value) { ((*a_pResults)+n)->StatusCode=fill_Variant_for_value_attribute((_VariableKnoten_*)p_Node, OpcUa_Null,((*a_pResults)+n)); if(a_eTimestampsToReturn!=OpcUa_TimestampsToReturn_Neither) { uStatus=assigne_Timestamp(((*a_pResults)+n),a_eTimestampsToReturn); if(OpcUa_IsBad(uStatus)) { ((*a_pResults)+n)->StatusCode=OpcUa_BadInternalError; uStatus=OpcUa_Good; } } } if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_DataType) { ((*a_pResults)+n)->Value.Value.NodeId=OpcUa_Memory_Alloc(sizeof(OpcUa_NodeId)); if(((*a_pResults)+n)->Value.Value.NodeId!=OpcUa_Null) { OpcUa_NodeId_Initialize(((*a_pResults)+n)->Value.Value.NodeId); *(((*a_pResults+n)->Value.Value.NodeId))=((_VariableKnoten_*)p_Node)->DataType; fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_NodeId, OpcUa_VariantArrayType_Scalar,0); ((*a_pResults)+n)->StatusCode=OpcUa_Good; } else { ((*a_pResults)+n)->StatusCode=OpcUa_BadOutOfMemory; } } if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_ValueRank) { ((*a_pResults)+n)->Value.Value.Int32=((_VariableKnoten_*)p_Node)->ValueRank; fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_Int32, OpcUa_VariantArrayType_Scalar,0); ((*a_pResults)+n)->StatusCode=OpcUa_Good; } if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_ArrayDimensions) { ((*a_pResults)+n)->Value.Value.UInt32=(((_VariableKnoten_*)p_Node)->ArrayDimensions); fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_UInt32, OpcUa_VariantArrayType_Scalar,0); ((*a_pResults)+n)->StatusCode=OpcUa_Good; } if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_AccessLevel) { ((*a_pResults)+n)->Value.Value.Byte=((_VariableKnoten_*)p_Node)->AccessLevel; fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_Byte, OpcUa_VariantArrayType_Scalar,0); ((*a_pResults)+n)->StatusCode=OpcUa_Good; } if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_UserAccessLevel) { ((*a_pResults)+n)->Value.Value.Byte=((_VariableKnoten_*)p_Node)->UserAccessLevel; fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_Byte, OpcUa_VariantArrayType_Scalar,0); ((*a_pResults)+n)->StatusCode=OpcUa_Good; } if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_MinimumSamplingInterval) { ((*a_pResults)+n)->Value.Value.Double=OpcUa_MinimumSamplingIntervals_Indeterminate; fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_Double, OpcUa_VariantArrayType_Scalar,0); ((*a_pResults)+n)->StatusCode=OpcUa_Good; } if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_Historizing) { ((*a_pResults)+n)->Value.Value.Boolean=((_VariableKnoten_*)p_Node)->Historizing; fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_Boolean, OpcUa_VariantArrayType_Scalar,0); ((*a_pResults)+n)->StatusCode=OpcUa_Good; } } break; } case OpcUa_NodeClass_VariableType: { if(((a_pNodesToRead+n)->AttributeId<=16 && (a_pNodesToRead+n)->AttributeId>=13) ||((a_pNodesToRead+n)->AttributeId==8)) { if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_Value) { ((*a_pResults)+n)->StatusCode=fill_Variant_for_value_attribute((_VariableKnoten_*)p_Node, OpcUa_Null,((*a_pResults)+n)); if(a_eTimestampsToReturn!=OpcUa_TimestampsToReturn_Neither) { uStatus=assigne_Timestamp(((*a_pResults)+n),a_eTimestampsToReturn); if(OpcUa_IsBad(uStatus)) { ((*a_pResults)+n)->StatusCode=OpcUa_BadInternalError; uStatus=OpcUa_Good; } } } if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_DataType) { ((*a_pResults)+n)->Value.Value.NodeId=OpcUa_Memory_Alloc(sizeof(OpcUa_NodeId)); if(((*a_pResults)+n)->Value.Value.NodeId!=OpcUa_Null) { OpcUa_NodeId_Initialize(((*a_pResults)+n)->Value.Value.NodeId); *((*a_pResults)+n)->Value.Value.NodeId=((_VariableTypeKnoten_*)p_Node)->DataType; fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_NodeId, OpcUa_VariantArrayType_Scalar,0); ((*a_pResults)+n)->StatusCode=OpcUa_Good; } else { ((*a_pResults)+n)->StatusCode=OpcUa_BadOutOfMemory; } } if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_ArrayDimensions) { ((*a_pResults)+n)->Value.Value.UInt32=((_VariableTypeKnoten_*)p_Node)->ArrayDimensions; fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_UInt32, OpcUa_VariantArrayType_Scalar,0); ((*a_pResults)+n)->StatusCode=OpcUa_Good; } if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_IsAbstract) { ((*a_pResults)+n)->Value.Value.Boolean=((_VariableTypeKnoten_*)p_Node)->IsAbstract; fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_Boolean, OpcUa_VariantArrayType_Scalar,0); ((*a_pResults)+n)->StatusCode=OpcUa_Good; } } break; } case OpcUa_NodeClass_Object: { if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_EventNotifier) { ((*a_pResults)+n)->Value.Value.Byte=((_ObjectKnoten_*)p_Node)->EventNotifier; fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_Byte, OpcUa_VariantArrayType_Scalar,0); ((*a_pResults)+n)->StatusCode=OpcUa_Good; } break; } case OpcUa_NodeClass_ObjectType: { if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_IsAbstract) { ((*a_pResults)+n)->Value.Value.Boolean=((_ObjectTypeKnoten_*)p_Node)->IsAbstract; fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_Boolean, OpcUa_VariantArrayType_Scalar,0); ((*a_pResults)+n)->StatusCode=OpcUa_Good; } break; } case OpcUa_NodeClass_DataType: { if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_IsAbstract) { ((*a_pResults)+n)->Value.Value.Boolean=((_DataTypeKnoten_*)p_Node)->IsAbstract; fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_Boolean, OpcUa_VariantArrayType_Scalar,0); ((*a_pResults)+n)->StatusCode=OpcUa_Good; } break; } case OpcUa_NodeClass_ReferenceType: { if((a_pNodesToRead+n)->AttributeId<=10 && (a_pNodesToRead+n)->AttributeId>=8) { if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_IsAbstract) { ((*a_pResults)+n)->Value.Value.Boolean=((_ReferenceTypeKnoten_*)p_Node)->IsAbstract; fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_Boolean, OpcUa_VariantArrayType_Scalar,0); ((*a_pResults)+n)->StatusCode=OpcUa_Good; } if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_Symmetric) { ((*a_pResults)+n)->Value.Value.Boolean=((_ReferenceTypeKnoten_*)p_Node)->Symmetric; fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_Boolean, OpcUa_VariantArrayType_Scalar,0); ((*a_pResults)+n)->StatusCode=OpcUa_Good; } if((a_pNodesToRead+n)->AttributeId==OpcUa_Attributes_InverseName) { ((*a_pResults)+n)->Value.Value.LocalizedText=OpcUa_Memory_Alloc(sizeof(OpcUa_LocalizedText)); if(((*a_pResults)+n)->Value.Value.NodeId!=OpcUa_Null) { OpcUa_LocalizedText_Initialize(((*a_pResults)+n)->Value.Value.LocalizedText); OpcUa_String_AttachCopy(&((*a_pResults)+n)->Value.Value.LocalizedText->Text, ((_ReferenceTypeKnoten_*)p_Node)->InverseName_text); OpcUa_String_AttachCopy(&((*a_pResults)+n)->Value.Value.LocalizedText->Locale, ((_ReferenceTypeKnoten_*)p_Node)->InverseName_locale); fill_datatype_arraytype_in_my_Variant(((*a_pResults)+n),OpcUaId_LocalizedText, OpcUa_VariantArrayType_Scalar,0); ((*a_pResults)+n)->StatusCode=OpcUa_Good; } else { ((*a_pResults)+n)->StatusCode=OpcUa_BadOutOfMemory; } } } break; } default: break; } } } else { ((*a_pResults)+n)->StatusCode=OpcUa_BadNodeIdUnknown; } } *a_pNoOfResults=a_nNoOfNodesToRead; #ifndef NO_DEBUGING_ MY_TRACE("\nanzahl der nodes :%d\n",a_nNoOfNodesToRead); for(i=0;i<a_nNoOfNodesToRead;i++) { MY_TRACE("\n|%d|, |%d| attributeId:%u\n",(a_pNodesToRead+i)->NodeId.NamespaceIndex,(a_pNodesToRead+i)->NodeId.Identifier.Numeric,(a_pNodesToRead+i)->AttributeId); } #endif /*_DEBUGING_*/ uStatus = response_header_ausfuellen(a_pResponseHeader,a_pRequestHeader,uStatus); if(OpcUa_IsBad(uStatus)) { a_pResponseHeader->ServiceResult=OpcUa_BadInternalError; } #ifndef NO_DEBUGING_ MY_TRACE("\nSERVICE===ENDE============================================\n\n\n"); #endif /*_DEBUGING_*/ RESET_SESSION_COUNTER OpcUa_ReturnStatusCode; OpcUa_BeginErrorHandling; uStatus = response_header_ausfuellen(a_pResponseHeader,a_pRequestHeader,uStatus); if(OpcUa_IsBad(uStatus)) { a_pResponseHeader->ServiceResult=OpcUa_BadInternalError; } #ifndef NO_DEBUGING_ MY_TRACE("\nSERVICEENDE (IM SERVICE SIND FEHLER AUFGETRETTEN)===========\n\n\n"); #endif /*_DEBUGING_*/ RESET_SESSION_COUNTER OpcUa_FinishErrorHandling; }