cannot subscribe alarm triggered before client run

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

Moderator: uasdkcpp

Post Reply
Jerry
Hero Member
Hero Member
Posts: 28
Joined: 23 Sep 2016, 03:48

cannot subscribe alarm triggered before client run

Post by Jerry »

Dear support team

when i trigger an alarm in OPC UA server, and then run the opc ua client to subscribe the alarm with example code. i find client cannot subscribe the alarm triggered before client runs.
but then i run the UAExpert, and drag "Server" node to "Event View". it can subscribe the alarm.

how does the UAExpert do that?

looking forward to your reply.

thanks.

Jerry
Hero Member
Hero Member
Posts: 28
Joined: 23 Sep 2016, 03:48

Re: cannot subscribe alarm triggered before client run

Post by Jerry »

here is the mainly code to create monitoredItem

Code: Select all

    itemsToCreate.create(j+1);

    UaEventFilter            eventFilter;
    UaSimpleAttributeOperand selectElement;
    UaContentFilter*         pContentFilter        = NULL;
    UaContentFilterElement*  pContentFilterElement = NULL;
    UaFilterOperand*         pOperand              = NULL;
	//for data monitoreditem
	for(i=0; i<j; i++)
	{
		itemsToCreate[i].ItemToMonitor.AttributeId = OpcUa_Attributes_Value;
		
		OpcUa_NodeId_CopyTo(m_pConfiguration->getNodesToMonitor().rawData()+i,&itemsToCreate[i].ItemToMonitor.NodeId);
		// itemsToCreate[0].ItemToMonitor.NodeId.Identifier.Numeric = OpcUaId_Server_ServerStatus_CurrentTime;
		itemsToCreate[i].RequestedParameters.ClientHandle = i;
		itemsToCreate[i].RequestedParameters.SamplingInterval = 1;
		itemsToCreate[i].RequestedParameters.QueueSize = 5;
		itemsToCreate[i].RequestedParameters.DiscardOldest = OpcUa_True;
		itemsToCreate[i].MonitoringMode = OpcUa_MonitoringMode_Reporting;
		itemsToCreate[i].ItemToMonitor.IndexRange;

		/*OpcUa_DataChangeFilter* pDataChangeFilter = NULL;
		OpcUa_EncodeableObject_CreateExtension(
			&OpcUa_DataChangeFilter_EncodeableType,
			&itemsToCreate[i].RequestedParameters.Filter,
			(OpcUa_Void**)&pDataChangeFilter);
		if ( pDataChangeFilter ) 
		{
			pDataChangeFilter->DeadbandType = OpcUa_DeadbandType_None;
			pDataChangeFilter->Trigger      = OpcUa_DataChangeTrigger_StatusValueTimestamp;
		}*/
	}
	//for event monitoreditem
	itemsToCreate[j].ItemToMonitor.AttributeId = OpcUa_Attributes_EventNotifier;
    itemsToCreate[j].ItemToMonitor.NodeId.Identifier.Numeric = OpcUaId_Server;
    itemsToCreate[j].RequestedParameters.ClientHandle = j;
    itemsToCreate[j].RequestedParameters.SamplingInterval = 1;
    itemsToCreate[j].RequestedParameters.QueueSize = 0;
    itemsToCreate[j].RequestedParameters.DiscardOldest = OpcUa_True;
    itemsToCreate[j].MonitoringMode = OpcUa_MonitoringMode_Reporting;

	 // Define which eventfields to send with each event
    selectElement.setBrowsePathElement(0, UaQualifiedName("Message", 0), 1);
    eventFilter.setSelectClauseElement(0, selectElement, 7);
    selectElement.setBrowsePathElement(0, UaQualifiedName("SourceName", 0), 1);
    eventFilter.setSelectClauseElement(1, selectElement, 7);
    selectElement.setBrowsePathElement(0, UaQualifiedName("Severity", 0), 1);
    eventFilter.setSelectClauseElement(2, selectElement, 7);
	selectElement.setBrowsePathElement(0, UaQualifiedName("Time", 0), 1);
    eventFilter.setSelectClauseElement(3, selectElement, 7);
	selectElement.setBrowsePathElement(0, UaQualifiedName("EventType", 0), 1);
    eventFilter.setSelectClauseElement(4, selectElement, 7);
	selectElement.setBrowsePathElement(0, UaQualifiedName("SourceNode", 0), 1);
    eventFilter.setSelectClauseElement(5, selectElement, 7);
	selectElement.setBrowsePathElement(0, UaQualifiedName("EventCode", 2), 1);
    eventFilter.setSelectClauseElement(6, selectElement, 7);
	// We only want to receive events of type ControllerEventType
    pContentFilter = new UaContentFilter;
    pContentFilterElement = new UaContentFilterElement;
    // Operator OfType
    pContentFilterElement->setFilterOperator(OpcUa_FilterOperator_OfType);
    // Operand 1 (Literal)
    pOperand = new UaLiteralOperand;
   // ((UaLiteralOperand*)pOperand)->setLiteralValue(m_pConfiguration->getEventTypeToFilter());
	 ((UaLiteralOperand*)pOperand)->setLiteralValue(UaVariant(UaNodeId(2041, 0)));
    pContentFilterElement->setFilterOperand(0, pOperand, 1);
    pContentFilter->setContentFilterElement(0, pContentFilterElement, 1);
    eventFilter.setWhereClause(pContentFilter);
    // set filter for monitored items
    eventFilter.detachFilter(itemsToCreate[j].RequestedParameters.Filter);

	    printf("\nAdding monitored items to subscription ...\n");
		result = m_pSubscription->createMonitoredItems(
        serviceSettings,
        OpcUa_TimestampsToReturn_Both,
        itemsToCreate,
        createResults);

Jerry
Hero Member
Hero Member
Posts: 28
Joined: 23 Sep 2016, 03:48

Re: cannot subscribe alarm triggered before client run

Post by Jerry »

hi support team,
could anyone give me any comments?

thanks :)

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

Re: cannot subscribe alarm triggered before client run

Post by Support Team »

Hello Jerry,

the server only sends Events whenever the state of a condition (alarm) changes. If you missed that change in the client you don't receive the event.
For this use case OPC UA defines a method in the server a client can call to have the server send an event for each condition that has the retain flag set to true.
You find a sample code for that in the console client that is installed with the SDK. (see subscribeAlarms()).
Best regards
Unified Automation Support Team

Post Reply