private void CheckIfSemanticsHaveChanged(ServerSystemContext systemContext, PropertyState property, object newPropertyValue, object previousPropertyValue)
{
// check if the changed property is one that can trigger semantic changes
string propertyName = property.BrowseName.Name;
if (propertyName != BrowseNames.EURange &&
propertyName != BrowseNames.InstrumentRange &&
propertyName != BrowseNames.EngineeringUnits &&
propertyName != BrowseNames.Title &&
propertyName != BrowseNames.AxisDefinition &&
propertyName != BrowseNames.FalseState &&
propertyName != BrowseNames.TrueState &&
propertyName != BrowseNames.EnumStrings &&
propertyName != BrowseNames.XAxisDefinition &&
propertyName != BrowseNames.YAxisDefinition &&
propertyName != BrowseNames.ZAxisDefinition)
{
return;
}
//look for the Parent and its monitoring items
foreach (var monitoredNode in m_monitoredNodes.Values)
{
var propertyState = monitoredNode.Node.FindChild(systemContext, property.BrowseName);
if (propertyState!=null && property!= null && propertyState.NodeId == property.NodeId && !Utils.IsEqual(newPropertyValue, previousPropertyValue))
{
foreach (var monitoredItem in monitoredNode.DataChangeMonitoredItems)
{
if (monitoredItem.AttributeId == Attributes.Value)
{
NodeState node = monitoredNode.Node;
if ((node is AnalogItemState && (propertyName == BrowseNames.EURange || propertyName == BrowseNames.EngineeringUnits)) ||
(node is TwoStateDiscreteState && (propertyName == BrowseNames.FalseState || propertyName == BrowseNames.TrueState)) ||
(node is MultiStateDiscreteState && (propertyName == BrowseNames.EnumStrings)) ||
(node is ArrayItemState && (propertyName == BrowseNames.InstrumentRange || propertyName == BrowseNames.EURange || propertyName == BrowseNames.EngineeringUnits || propertyName == BrowseNames.Title)) ||
((node is YArrayItemState || node is XYArrayItemState) && (propertyName == BrowseNames.InstrumentRange || propertyName == BrowseNames.EURange || propertyName == BrowseNames.EngineeringUnits || propertyName == BrowseNames.Title || propertyName == BrowseNames.XAxisDefinition)) ||
(node is ImageItemState && (propertyName == BrowseNames.InstrumentRange || propertyName == BrowseNames.EURange || propertyName == BrowseNames.EngineeringUnits || propertyName == BrowseNames.Title || propertyName == BrowseNames.XAxisDefinition || propertyName == BrowseNames.YAxisDefinition)) ||
(node is CubeItemState && (propertyName == BrowseNames.InstrumentRange || propertyName == BrowseNames.EURange || propertyName == BrowseNames.EngineeringUnits || propertyName == BrowseNames.Title || propertyName == BrowseNames.XAxisDefinition || propertyName == BrowseNames.YAxisDefinition || propertyName == BrowseNames.ZAxisDefinition)) ||
(node is NDimensionArrayItemState && (propertyName == BrowseNames.InstrumentRange || propertyName == BrowseNames.EURange || propertyName == BrowseNames.EngineeringUnits || propertyName == BrowseNames.Title || propertyName == BrowseNames.AxisDefinition)))
{
monitoredItem.SetSemanticsChanged();
DataValue value = new DataValue();
value.ServerTimestamp = DateTime.UtcNow;
monitoredNode.Node.ReadAttribute(systemContext, Attributes.Value, monitoredItem.IndexRange, null, value);
monitoredItem.QueueValue(value, ServiceResult.Good, true);
}
}
}
}
}
}