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.
cannot subscribe alarm triggered before client run
Moderator: uasdkcpp
-
- Hero Member
- Posts: 28
- Joined: 23 Sep 2016, 03:48
-
- Hero Member
- Posts: 28
- Joined: 23 Sep 2016, 03:48
Re: cannot subscribe alarm triggered before client run
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);
-
- Hero Member
- Posts: 28
- Joined: 23 Sep 2016, 03:48
Re: cannot subscribe alarm triggered before client run
hi support team,
could anyone give me any comments?
thanks
could anyone give me any comments?
thanks
- Support Team
- Hero Member
- Posts: 3068
- Joined: 18 Mar 2011, 15:09
Re: cannot subscribe alarm triggered before client run
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()).
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
Unified Automation Support Team