UaStatus AggrServerHistoryManager::updateHistorizedItems()
{
UaStatus status;
// Create internal monitored items for historizing
if (m_pSession->isActivated())
{
DataMonitoredItemSpecArray dataMonitoredItems;
OpcUa_UInt32 i = 0;
std::map<UaNodeId,HistorizedVariable*>::iterator it;
dataMonitoredItems.create((OpcUa_UInt32)m_mapVariables.size());
// Collect information for the monitored items to create
for (it = m_mapVariables.begin(); it != m_mapVariables.end(); it++)
{
HistorizedVariable* pVariable = it->second;
pVariable->m_pVariable->nodeId().copyTo(&dataMonitoredItems[i].m_itemToMonitor.NodeId);
dataMonitoredItems[i].m_itemToMonitor.AttributeId = OpcUa_Attributes_Value;
dataMonitoredItems[i].m_requestedSamplingInterval = ASHISTORYMANAGER_SAMPLING_INTERVAL;
dataMonitoredItems[i].m_pDataCallback = pVariable;
i++;
}
// Create the monitored items
status = m_pServerManager->createDataMonitoredItems(m_pSession, dataMonitoredItems);
if (status.isGood())
{
i = 0;
// Store the create results
for (it = m_mapVariables.begin(); it != m_mapVariables.end(); it++)
{
HistorizedVariable* pVariable = it->second;
if (dataMonitoredItems[i].m_createResult.isGood())
{
pVariable->m_isValid = OpcUa_True;
pVariable->m_monitoredItemId = dataMonitoredItems[i].m_monitoredItemId;
pVariable->setHistoryManager(this);
if (dataMonitoredItems[i].m_isInitialValueProvided != OpcUa_False)
{
pVariable->dataChange(dataMonitoredItems[i].m_initialValue);
}
}
i++;
}
}
}
return status;
}
The map variable m_mapVariables is a list having all the namespace variables to be historised. Unfortunately sometimes this function runs and sometimes it gives a segmentation fault. The fault comes when the below line gets executed for creating data monitored items (SDK).
This issue has been opened since long and there is no response to it.
Please let me know whether any feedback could be given to it or not. I would be happy to provide you any further details required.