receiving alarm event issue

Questions regarding the use of the C++ SDK for Server or Client development or integration into customer products ...

Moderator: uasdkcpp

Post Reply
zhu.li
Jr. Member
Jr. Member
Posts: 1
Joined: 19 Feb 2019, 07:42

receiving alarm event issue

Post by zhu.li »

"No text available (internal error)" error is displayed in the Message content of the field in the receiving alarm event
Code:

Code: Select all

UaStatus SampleSubscription::createMonitoredItems()
{
       ......

       // Select EventId (BaseEventType)
	selectElement.setBrowsePathElement(0, UaQualifiedName("EventId", 0), 1);
	eventFilter.setSelectClauseElement(0, selectElement, 15);
	// Select EventType (BaseEventType)
	selectElement.setBrowsePathElement(0, UaQualifiedName("EventType", 0), 1);
	eventFilter.setSelectClauseElement(1, selectElement, 15);
	// Select SourceName (BaseEventType)
	selectElement.setBrowsePathElement(0, UaQualifiedName("SourceName", 0), 1);
	eventFilter.setSelectClauseElement(2, selectElement, 15);
	// Select Time (BaseEventType)
	selectElement.setBrowsePathElement(0, UaQualifiedName("Time", 0), 1);
	eventFilter.setSelectClauseElement(3, selectElement, 15);
	// Select Message (BaseEventType)
	selectElement.setBrowsePathElement(0, UaQualifiedName("Message", 0), 1);
	eventFilter.setSelectClauseElement(4, selectElement, 15);
	// Select Severity (BaseEventType)
	selectElement.setBrowsePathElement(0, UaQualifiedName("Severity", 0), 1);
	eventFilter.setSelectClauseElement(5, selectElement, 15);
	// Select BranchId (ConditionType)
	selectElement.setBrowsePathElement(0, UaQualifiedName("BranchId", 0), 1);
	eventFilter.setSelectClauseElement(6, selectElement, 15);
	// Select ConditionName (ConditionType)
	selectElement.setBrowsePathElement(0, UaQualifiedName("ConditionName", 0), 1);
	eventFilter.setSelectClauseElement(7, selectElement, 15);
	// Select Retain (ConditionType)
	selectElement.setBrowsePathElement(0, UaQualifiedName("Retain", 0), 1);
	eventFilter.setSelectClauseElement(8, selectElement, 15);
	// Select AckedState -> Id (AcknowledgableConditionType)
	selectElement.setBrowsePathElement(0, UaQualifiedName("AckedState", 0), 1);
	selectElement.setBrowsePathElement(1, UaQualifiedName("Id", 0), 2);
	eventFilter.setSelectClauseElement(9, selectElement, 15);
	// Select ConfirmedState -> Id (AcknowledgableConditionType)
	selectElement.setBrowsePathElement(0, UaQualifiedName("ConfirmedState", 0), 1);
	selectElement.setBrowsePathElement(1, UaQualifiedName("Id", 0), 2);
	eventFilter.setSelectClauseElement(10, selectElement, 15);
	selectElement.clearBrowsePath();
	// Select ActiveState (AlarmConditionType)
	selectElement.setBrowsePathElement(0, UaQualifiedName("ActiveState", 0), 1);
	eventFilter.setSelectClauseElement(11, selectElement, 15);
	// Select ActiveState -> Id (AlarmConditionType)
	selectElement.setBrowsePathElement(0, UaQualifiedName("ActiveState", 0), 2);
	selectElement.setBrowsePathElement(1, UaQualifiedName("Id", 0), 2);
	eventFilter.setSelectClauseElement(12, selectElement, 15);
	// Select ActiveState -> EffectiveDisplayName (AlarmConditionType)
	selectElement.setBrowsePathElement(0, UaQualifiedName("ActiveState", 0), 2);
	selectElement.setBrowsePathElement(1, UaQualifiedName("EffectiveDisplayName", 0), 2);
	eventFilter.setSelectClauseElement(13, selectElement, 15);
	// Select Condition NodeId
	// This is special - the path is empty and the requested Attribute is NodeId
	selectElement.setTypeId(UaNodeId(OpcUaId_ConditionType));
	selectElement.setAttributeId(OpcUa_Attributes_NodeId);
	selectElement.clearBrowsePath();
	eventFilter.setSelectClauseElement(14, selectElement, 15);

        ......
}

void SampleSubscription::newEvents(
	OpcUa_UInt32                clientSubscriptionHandle, //!< [in] Client defined handle of the affected subscription
	UaEventFieldLists&          eventFieldList)           //!< [in] List of event notifications sent by the server
{
        OpcUa_UInt32 i = 0;
	printf("-- Event newEvents -----------------------------------------\n");
	printf("clientSubscriptionHandle %d \n", clientSubscriptionHandle);
	for (i = 0; i < eventFieldList.length(); i++)
	{
		EventObject newEvent;
		UaVariant(eventFieldList[i].EventFields[1]).toNodeId(newEvent.eventType);
		if (newEvent.eventType.identifierNumeric() == OpcUaId_RefreshStartEventType || newEvent.eventType.identifierNumeric() ==      OpcUaId_RefreshEndEventType)
			continue;

		// check if eventType and conditionNodeId is set
		if (OpcUa_IsGood(UaVariant(eventFieldList[i].EventFields[1]).toNodeId(newEvent.eventType)) && OpcUa_IsGood(UaVariant(eventFieldList[i].EventFields[14]).toNodeId(newEvent.conditionNodeId)))
		{
			// get rest of the event fields
			UaVariant(eventFieldList[i].EventFields[0]).toByteString(newEvent.eventId);
			UaVariant(eventFieldList[i].EventFields[1]).toNodeId(newEvent.eventType);
			newEvent.sourceName = UaVariant(eventFieldList[i].EventFields[2]).toString();
			UaVariant(eventFieldList[i].EventFields[3]).toDateTime(newEvent.time);
			UaVariant(eventFieldList[i].EventFields[4]).toLocalizedText(newEvent.message);
			UaVariant(eventFieldList[i].EventFields[5]).toUInt16(newEvent.severity);
			UaVariant(eventFieldList[i].EventFields[6]).toNodeId(newEvent.branchId);
			newEvent.conditionName = UaVariant(eventFieldList[i].EventFields[7]).toString();
			UaVariant(eventFieldList[i].EventFields[8]).toBool(newEvent.retain);
			UaVariant(eventFieldList[i].EventFields[9]).toBool(newEvent.ackedStateId);
			UaVariant(eventFieldList[i].EventFields[10]).toBool(newEvent.confirmedStateId);
			UaVariant(eventFieldList[i].EventFields[11]).toLocalizedText(newEvent.activeState);
			UaVariant(eventFieldList[i].EventFields[12]).toBool(newEvent.activeStateId);
			UaVariant(eventFieldList[i].EventFields[13]).toLocalizedText(newEvent.activeStateEffectiveDisplayName);
			UaVariant(eventFieldList[i].EventFields[14]).toNodeId(newEvent.conditionNodeId);
		
			for (OpcUa_UInt32 n = 0; n < 15; n++)
			{
				printf("EventFields[%d] value: [%s] \n", n, UaVariant(eventFieldList[i].EventFields[n]).toString().toUtf8());
			}

			printf("Event[%d] Message=%s SourceName=%s Severity=%d uvActive=%s uvAcked=%d \n",
				i,
				newEvent.message.toFullString().toUtf8(),
				newEvent.sourceName.toUtf8(),
				newEvent.severity,
				newEvent.activeState.toString().toUtf8(),
				newEvent.ackedStateId);
		}

		
	}
	printf("------------------------------------------------------------\n");
}
I did the code by example.It can receive the event. But the Message ITEM has no value.
As shown in figure:
[img]/Users/mac/Downloads/img.png[/img]

Can you help me see what the problem is?
Thank you!

User avatar
Support Team
Hero Member
Hero Member
Posts: 3068
Joined: 18 Mar 2011, 15:09

Re: receiving alarm event issue

Post by Support Team »

Hello zhu.li

this sounds like the server actually returns a valid message text which is "No text available (internal error)". So I assume you did everything correct in the client application.
Since the server returns that message you will only find the answer to your question on the server side.
Best regards
Unified Automation Support Team

Post Reply