コード例 #1
0
        private void ChangePhase(ISystemContext context, NodeId phaseId)
        {
            m_currentPhase           = phaseId;
            m_rig.CurrentPhase.Value = phaseId;
            m_rig.CurrentPhase.ClearChangeMasks(context, false);

            try
            {
                // build the requests.
                List <DataSourceClient.WriteRequest> requests = new List <DataSourceClient.WriteRequest>();

                for (int ii = 0; ii < m_tools.Count; ii++)
                {
                    NodeId lockId = m_tools[ii].GetLockForPhase(m_currentPhase);

                    if (NodeId.IsNull(lockId) || m_tools[ii].ActiveLockId == null)
                    {
                        continue;
                    }

                    m_tools[ii].ActiveLockId.Value = lockId.ToString();

                    RemoteNode remoteNode = null;

                    if (m_remoteNodes.TryGetValue(m_tools[ii].ActiveLockId.NodeId, out remoteNode))
                    {
                        DataSourceClient.WriteRequest request = new DataSourceClient.WriteRequest();
                        request.Index                  = 0;
                        request.RemoteId               = remoteNode.RemoteId;
                        request.WriteValue             = new WriteValue();
                        request.WriteValue.AttributeId = Attributes.Value;
                        request.WriteValue.Value.Value = lockId.ToString();
                        requests.Add(request);
                    }
                }

                // update the remote data source.
                List <ServiceResult> results = m_source.Write(requests);

                for (int ii = 0; ii < requests.Count; ii++)
                {
                    if (ServiceResult.IsBad(results[ii]))
                    {
                        Utils.Trace("Update ActiveLockId failed: {0}", results[ii].ToString());
                    }
                }
            }
            catch (Exception e)
            {
                Utils.Trace("Could not update ActiveLockIds: {0}", e.Message);
            }
        }
コード例 #2
0
        /// <summary>
        /// Writes the value for the specified attributes.
        /// </summary>
        public override void Write(
            OperationContext context,
            IList<WriteValue> nodesToWrite,
            IList<ServiceResult> errors)
        {
            ServerSystemContext systemContext = SystemContext.Copy(context);
            IDictionary<NodeId, NodeState> operationCache = new NodeIdDictionary<NodeState>();
            List<DataSourceClient.WriteRequest> writeRequests = new List<DataSourceClient.WriteRequest>();

            lock (Lock)
            {
                for (int ii = 0; ii < nodesToWrite.Count; ii++)
                {
                    WriteValue nodeToWrite = nodesToWrite[ii];

                    // skip items that have already been processed.
                    if (nodeToWrite.Processed)
                    {
                        continue;
                    }

                    // check for valid handle.
                    NodeHandle handle = GetManagerHandle(systemContext, nodeToWrite.NodeId, operationCache);

                    if (handle == null)
                    {
                        continue;
                    }

                    // owned by this node manager.
                    nodeToWrite.Processed = true;

                    // index range is not supported.
                    if (nodeToWrite.AttributeId != Attributes.Value)
                    {
                        if (!String.IsNullOrEmpty(nodeToWrite.IndexRange))
                        {
                            errors[ii] = StatusCodes.BadWriteNotSupported;
                            continue;
                        }
                    }

                    // check if the node is a area in memory.
                    if (handle.Node == null)
                    {
                        errors[ii] = StatusCodes.BadNodeIdUnknown;
                        continue;
                    }

                    // check if the request if for a remote node.
                    RemoteNode remoteNode = null;

                    if (m_remoteNodes.TryGetValue(handle.NodeId, out remoteNode))
                    {
                        // check for theorectical access.
                        BaseVariableState variable = handle.Node as BaseVariableState;

                        if (variable == null || nodeToWrite.AttributeId != Attributes.Value || (variable.AccessLevel & AccessLevels.CurrentWrite) == 0)
                        {
                            errors[ii] = StatusCodes.BadNotWritable;
                            continue;
                        }

                        // check for access based on current user credentials.
                        if (!CheckWriteAccess(systemContext, remoteNode))
                        {
                            errors[ii] = StatusCodes.BadUserAccessDenied;
                            continue;
                        }

                        DataSourceClient.WriteRequest request = new DataSourceClient.WriteRequest();
                        request.RemoteId = remoteNode.RemoteId;
                        request.WriteValue = nodeToWrite;
                        request.Index = ii;
                        writeRequests.Add(request);

                        errors[ii] = StatusCodes.BadNoCommunication;
                        continue;
                    }

                    // write the attribute value.
                    errors[ii] = handle.Node.WriteAttribute(
                        systemContext,
                        nodeToWrite.AttributeId,
                        nodeToWrite.ParsedIndexRange,
                        nodeToWrite.Value);

                    // updates to source finished - report changes to monitored items.
                    handle.Node.ClearChangeMasks(systemContext, false);
                }

                // check for nothing to do.
                if (writeRequests.Count == 0)
                {
                    return;
                }
            }
            
            // update the remote data source.
            List<ServiceResult> results = m_source.Write(writeRequests);

            for (int ii = 0; ii < writeRequests.Count; ii++)
            {
                errors[writeRequests[ii].Index] = results[ii];
            }
        }
コード例 #3
0
        private void ChangePhase(ISystemContext context, NodeId phaseId)
        {
            m_currentPhase = phaseId;
            m_rig.CurrentPhase.Value = phaseId;
            m_rig.CurrentPhase.ClearChangeMasks(context, false);

            try
            {
                // build the requests.
                List<DataSourceClient.WriteRequest> requests = new List<DataSourceClient.WriteRequest>();

                for (int ii = 0; ii < m_tools.Count; ii++)
                {
                    NodeId lockId = m_tools[ii].GetLockForPhase(m_currentPhase);

                    if (NodeId.IsNull(lockId) || m_tools[ii].ActiveLockId == null)
                    {
                        continue;
                    }

                    m_tools[ii].ActiveLockId.Value = lockId.ToString();

                    RemoteNode remoteNode = null;

                    if (m_remoteNodes.TryGetValue(m_tools[ii].ActiveLockId.NodeId, out remoteNode))
                    {
                        DataSourceClient.WriteRequest request = new DataSourceClient.WriteRequest();
                        request.Index = 0;
                        request.RemoteId = remoteNode.RemoteId;
                        request.WriteValue = new WriteValue();
                        request.WriteValue.AttributeId = Attributes.Value;
                        request.WriteValue.Value.Value = lockId.ToString();
                        requests.Add(request);
                    }
                }

                // update the remote data source.
                List<ServiceResult> results = m_source.Write(requests);

                for (int ii = 0; ii < requests.Count; ii++)
                {
                    if (ServiceResult.IsBad(results[ii]))
                    {
                        Utils.Trace("Update ActiveLockId failed: {0}", results[ii].ToString());
                    }
                }
            }
            catch (Exception e)
            {
                Utils.Trace("Could not update ActiveLockIds: {0}", e.Message);
            }
        }
コード例 #4
0
        /// <summary>
        /// Writes the value for the specified attributes.
        /// </summary>
        public override void Write(
            OperationContext context,
            IList <WriteValue> nodesToWrite,
            IList <ServiceResult> errors)
        {
            ServerSystemContext                  systemContext  = SystemContext.Copy(context);
            IDictionary <NodeId, NodeState>      operationCache = new NodeIdDictionary <NodeState>();
            List <DataSourceClient.WriteRequest> writeRequests  = new List <DataSourceClient.WriteRequest>();

            lock (Lock)
            {
                for (int ii = 0; ii < nodesToWrite.Count; ii++)
                {
                    WriteValue nodeToWrite = nodesToWrite[ii];

                    // skip items that have already been processed.
                    if (nodeToWrite.Processed)
                    {
                        continue;
                    }

                    // check for valid handle.
                    NodeHandle handle = GetManagerHandle(systemContext, nodeToWrite.NodeId, operationCache);

                    if (handle == null)
                    {
                        continue;
                    }

                    // owned by this node manager.
                    nodeToWrite.Processed = true;

                    // index range is not supported.
                    if (nodeToWrite.AttributeId != Attributes.Value)
                    {
                        if (!String.IsNullOrEmpty(nodeToWrite.IndexRange))
                        {
                            errors[ii] = StatusCodes.BadWriteNotSupported;
                            continue;
                        }
                    }

                    // check if the node is a area in memory.
                    if (handle.Node == null)
                    {
                        errors[ii] = StatusCodes.BadNodeIdUnknown;
                        continue;
                    }

                    // check if the request if for a remote node.
                    RemoteNode remoteNode = null;

                    if (m_remoteNodes.TryGetValue(handle.NodeId, out remoteNode))
                    {
                        // check for theorectical access.
                        BaseVariableState variable = handle.Node as BaseVariableState;

                        if (variable == null || nodeToWrite.AttributeId != Attributes.Value || (variable.AccessLevel & AccessLevels.CurrentWrite) == 0)
                        {
                            errors[ii] = StatusCodes.BadNotWritable;
                            continue;
                        }

                        // check for access based on current user credentials.
                        if (!CheckWriteAccess(systemContext, remoteNode))
                        {
                            errors[ii] = StatusCodes.BadUserAccessDenied;
                            continue;
                        }

                        DataSourceClient.WriteRequest request = new DataSourceClient.WriteRequest();
                        request.RemoteId   = remoteNode.RemoteId;
                        request.WriteValue = nodeToWrite;
                        request.Index      = ii;
                        writeRequests.Add(request);

                        errors[ii] = StatusCodes.BadNoCommunication;
                        continue;
                    }

                    // write the attribute value.
                    errors[ii] = handle.Node.WriteAttribute(
                        systemContext,
                        nodeToWrite.AttributeId,
                        nodeToWrite.ParsedIndexRange,
                        nodeToWrite.Value);

                    // updates to source finished - report changes to monitored items.
                    handle.Node.ClearChangeMasks(systemContext, false);
                }

                // check for nothing to do.
                if (writeRequests.Count == 0)
                {
                    return;
                }
            }

            // update the remote data source.
            List <ServiceResult> results = m_source.Write(writeRequests);

            for (int ii = 0; ii < writeRequests.Count; ii++)
            {
                errors[writeRequests[ii].Index] = results[ii];
            }
        }