/// <summary>
        /// Called when the state of a Node changes.
        /// </summary>
        /// <param name="context">The system context.</param>
        /// <param name="node">The affected node.</param>
        /// <param name="changes">The mask indicating what changes have occurred.</param>
        public void OnMonitoredNodeChanged(ISystemContext context, NodeState node, NodeStateChangeMasks changes)
        {
            lock (NodeManager.Lock)
            {
                if (DataChangeMonitoredItems == null)
                {
                    return;
                }

                for (int ii = 0; ii < DataChangeMonitoredItems.Count; ii++)
                {
                    MonitoredItem monitoredItem = DataChangeMonitoredItems[ii];

                    if (monitoredItem.AttributeId == Attributes.Value && (changes & NodeStateChangeMasks.Value) != 0)
                    {
                        QueueValue(context, node, monitoredItem);
                        continue;
                    }

                    if (monitoredItem.AttributeId != Attributes.Value && (changes & NodeStateChangeMasks.NonValue) != 0)
                    {
                        QueueValue(context, node, monitoredItem);
                        continue;
                    }
                }
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Handles change events raised by the node.
        /// </summary>
        /// <param name="context">The system context.</param>
        /// <param name="state">The node that raised the event.</param>
        /// <param name="masks">What caused the event to be raised</param>
        public void OnNodeChange(ISystemContext context, NodeState state, NodeStateChangeMasks masks)
        {
            if (m_monitoredItems != null)
            {
                for (int ii = 0; ii < m_monitoredItems.Count; ii++)
                {
                    DataChangeMonitoredItem monitoredItem = m_monitoredItems[ii];

                    // check if the node has been deleted.
                    if ((masks & NodeStateChangeMasks.Deleted) != 0)
                    {
                        monitoredItem.QueueValue(null, StatusCodes.BadNodeIdUnknown);
                        continue;
                    }

                    if (monitoredItem.AttributeId == Attributes.Value)
                    {
                        if ((masks & NodeStateChangeMasks.Value) != 0)
                        {
                            monitoredItem.ValueChanged(context);
                        }
                    }
                    else
                    {
                        if ((masks & NodeStateChangeMasks.NonValue) != 0)
                        {
                            monitoredItem.ValueChanged(context);
                        }
                    }
                }
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Sets value of OPCUA node property to corresponding VC property
        /// </summary>
        private void ua_PropertyChanged(ISystemContext context, NodeState node, NodeStateChangeMasks changes)
        {
            if (!UaBrowseName2VcComponentName.ContainsKey(node.BrowseName.Name))
            {
                _vcUtils.VcWriteWarningMsg(String.Format("Component with property {0} not found", node.BrowseName.Name));
                return;
            }

            // Cast property OPCUA node to BaseDataVariableState type
            BaseDataVariableState uaProperty = (BaseDataVariableState)node;

            // Get property component as VC object
            ISimComponent vcComponent = _vcUtils.GetComponent(UaBrowseName2VcComponentName[node.BrowseName.Name]);
            IProperty     vcProperty  = vcComponent.GetProperty(node.DisplayName.ToString());

            if (uaProperty.DataType == new NodeId(DataTypeIds.String))
            {
                if ((string)uaProperty.Value == (string)vcProperty.Value)
                {
                    return;
                }
                vcProperty.Value = (string)uaProperty.Value;
            }
            else if (uaProperty.DataType == new NodeId(DataTypeIds.Boolean))
            {
                if ((bool)uaProperty.Value == (bool)vcProperty.Value)
                {
                    return;
                }
                vcProperty.Value = (bool)uaProperty.Value;
            }
            else if (uaProperty.DataType == new NodeId(DataTypeIds.Double))
            {
                if ((double)uaProperty.Value == (double)vcProperty.Value)
                {
                    return;
                }
                vcProperty.Value = (double)uaProperty.Value;
            }
            else if (uaProperty.DataType == new NodeId(DataTypeIds.Integer))
            {
                if ((int)uaProperty.Value == (int)vcProperty.Value)
                {
                    return;
                }
                vcProperty.Value = (int)uaProperty.Value;
            }
            else
            {
                _vcUtils.VcWriteWarningMsg("OPCUA property type not supported" + uaProperty.DataType.ToString());
                return;
            }
        }
Exemplo n.º 4
0
        /// <summary>
        /// Sets value of OPCUA node signal to corresponding VC signal
        /// </summary>
        private void ua_SignalTriggered(ISystemContext context, NodeState node, NodeStateChangeMasks changes)
        {
            if (!UaBrowseName2VcComponentName.ContainsKey(node.BrowseName.Name))
            {
                _vcUtils.VcWriteWarningMsg(String.Format("Component with signal {0} not found", node.BrowseName.Name));
                return;
            }

            // Cast signal OPCUA node to BaseDataVariableState type
            BaseDataVariableState uaSignal = (BaseDataVariableState)node;

            // Get signal component as VC object
            ISimComponent vcComponent = _vcUtils.GetComponent(UaBrowseName2VcComponentName[node.BrowseName.Name]);
            ISignal       vcSignal    = (ISignal)vcComponent.FindBehavior(node.DisplayName.ToString());

            if (uaSignal.DataType == new NodeId(DataTypeIds.String))
            {
                if ((string)uaSignal.Value == (string)vcSignal.Value)
                {
                    return;
                }
                vcSignal.Value = (string)uaSignal.Value;
            }
            else if (uaSignal.DataType == new NodeId(DataTypeIds.Boolean))
            {
                if ((bool)uaSignal.Value == (bool)vcSignal.Value)
                {
                    return;
                }
                vcSignal.Value = (bool)uaSignal.Value;
            }
            else if (uaSignal.DataType == new NodeId(DataTypeIds.Double))
            {
                if ((double)uaSignal.Value == (double)vcSignal.Value)
                {
                    return;
                }
                vcSignal.Value = (double)uaSignal.Value;
            }
            else if (uaSignal.DataType == new NodeId(DataTypeIds.Integer))
            {
                if ((int)uaSignal.Value == (int)vcSignal.Value)
                {
                    return;
                }
                vcSignal.Value = (int)uaSignal.Value;
            }
            else
            {
                _vcUtils.VcWriteWarningMsg("OPCUA signal type not supported" + uaSignal.DataType.ToString());
                return;
            }
        }
Exemplo n.º 5
0
 /// <summary>
 /// Clear NamespaceMetadata nodes cache in case nodes are added or deleted
 /// </summary>
 private void ServerNamespacesChanged(ISystemContext context, NodeState node, NodeStateChangeMasks changes)
 {
     if ((changes & NodeStateChangeMasks.Children) != 0 ||
         (changes & NodeStateChangeMasks.References) != 0)
     {
         try
         {
             lock (Lock)
             {
                 m_namespaceMetadataStates.Clear();
             }
         }
         catch
         {
             // ignore errors
         }
     }
 }
Exemplo n.º 6
0
 private void My_OnDeleteEventHandler(ISystemContext context, NodeState node, NodeStateChangeMasks changes)
 {
     if ((changes & NodeStateChangeMasks.Deleted) != 0)
     {
         if (m_OPCDAValue != null)
         {
             m_OPCDAValue.OnValueChanged -= new EventHandler <ItemValueArgs>(My_OnValueChangedHandler);
             m_OPCDAValue = null;
         }
         if (m_SimulatedValue != null)
         {
             m_SimulatedValue.OnValueChanged -= new EventHandler <ItemValueArgs>(My_OnValueChangedHandler);
             m_SimulatedValue = null;
         }
         if (m_CommServerValue != null)
         {
             m_CommServerValue.OnValueChanged -= new EventHandler <ItemValueArgs>(My_OnValueChangedHandler);
             m_CommServerValue = null;
         }
         m_variable.OnWriteValue   = null;
         m_variable.OnStateChanged = null;
     }
 }
Exemplo n.º 7
0
        public void ValueTest()
        {
            PropertyState <double> _property = new PropertyState <double>(null, "PropertyState");

            Assert.AreEqual <NodeStateChangeMasks>(NodeStateChangeMasks.Value, _property.ChangeMasks);
            Assert.AreEqual <double>(default(double), _property.Value);
            _property.ClearChangeMasks(new SystemContextFixture(), true);
            Assert.AreEqual <NodeStateChangeMasks>(NodeStateChangeMasks.None, _property.ChangeMasks);
            ISystemContext       _returnedContext   = null;
            NodeStateChangeMasks _returnedMask      = NodeStateChangeMasks.None;
            NodeState            _returnedNodeState = null;
            int _handlerCalled = 0;

            _property.OnStateChanged += (x, y, z) => { _returnedContext = x; _returnedNodeState = y; _returnedMask = z; _handlerCalled++; };
            _property.Value           = 999.99;
            Assert.AreEqual <NodeStateChangeMasks>(NodeStateChangeMasks.Value, _property.ChangeMasks);
            Assert.AreEqual <double>(999.99, _property.Value);
            _property.ClearChangeMasks(new SystemContextFixture(), true);
            Assert.AreEqual <int>(1, _handlerCalled);
            Assert.IsNotNull(_returnedContext);
            Assert.AreSame(_property, _returnedNodeState);
            Assert.AreEqual <NodeStateChangeMasks>(NodeStateChangeMasks.Value, _returnedMask);
            Assert.AreEqual <NodeStateChangeMasks>(NodeStateChangeMasks.None, _property.ChangeMasks);
        }
        /// <summary>
        /// Handles change events raised by the node.
        /// </summary>
        /// <param name="context">The system context.</param>
        /// <param name="state">The node that raised the event.</param>
        /// <param name="masks">What caused the event to be raised</param>
        public void OnNodeChange(ISystemContext context, NodeState state, NodeStateChangeMasks masks)
        {
            if (m_monitoredItems != null)
            {
                for (int ii = 0; ii < m_monitoredItems.Count; ii++)
                {
                    DataChangeMonitoredItem monitoredItem = m_monitoredItems[ii];

                    // check if the node has been deleted.
                    if ((masks & NodeStateChangeMasks.Deleted) != 0)
                    {
                        monitoredItem.QueueValue(null, StatusCodes.BadNodeIdUnknown);
                        continue;
                    }

                    if (monitoredItem.AttributeId == Attributes.Value)
                    {
                        if ((masks & NodeStateChangeMasks.Value) != 0)
                        {
                            monitoredItem.ValueChanged(context);
                        }
                    }
                    else
                    {
                        if ((masks & NodeStateChangeMasks.NonValue) != 0)
                        {
                            monitoredItem.ValueChanged(context);
                        }
                    }
                }
            }
        }
Exemplo n.º 9
0
        /// <summary>
        /// Called when the state of a Node changes.
        /// </summary>
        /// <param name="context">The system context.</param>
        /// <param name="node">The affected node.</param>
        /// <param name="changes">The mask indicating what changes have occurred.</param>
        public void OnMonitoredNodeChanged(ISystemContext context, NodeState node, NodeStateChangeMasks changes)
        {
            lock (NodeManager.Lock)
            {
                if (DataChangeMonitoredItems == null)
                {
                    return;
                }

                for (int ii = 0; ii < DataChangeMonitoredItems.Count; ii++)
                {
                    MonitoredItem monitoredItem = DataChangeMonitoredItems[ii];

                    if (monitoredItem.AttributeId == Attributes.Value && (changes & NodeStateChangeMasks.Value) != 0)
                    {
                        QueueValue(context, node, monitoredItem);
                        continue;
                    }

                    if (monitoredItem.AttributeId != Attributes.Value && (changes & NodeStateChangeMasks.NonValue) != 0)
                    {
                        QueueValue(context, node, monitoredItem);
                        continue;
                    }
                }
            }
        }
Exemplo n.º 10
0
 /// <summary>
 /// Event handler for when a property node has changed value.
 /// </summary>
 private void ua_PropertyChanged(ISystemContext context, NodeState node, NodeStateChangeMasks changes)
 {
     // VC API is not thread-safe, it must be accessed from the main thread only.
     Execute.OnUIThread(() => { UpdateValueToVcProperty(node); });
 }