Exemple #1
0
        public DataValue WriteValue(NodeId ndoeId, BuiltInType datayType, object newValue)
        {
            var wrapedValue = new Variant(Convert.ChangeType(newValue, TypeInfo.GetSystemType(datayType, -1)));
            var data        = new DataValue(wrapedValue);

            var valueToWrite = new WriteValue()
            {
                Value       = data,
                NodeId      = ndoeId,
                AttributeId = Attributes.Value,
            };

            try
            {
                _session.Write(null, new WriteValueCollection()
                {
                    valueToWrite
                }, out var statusCodes, out var diagnosticInfo);

                if (statusCodes.FirstOrDefault().Code == StatusCodes.Good)
                {
                    Utils.Trace(Utils.TraceMasks.Information, "Value successfully written to server!");
                    data.SourceTimestamp = DateTime.Now;
                    return(data);
                }

                Utils.Trace(Utils.TraceMasks.Error, "Value was not written to server!");
            }
            catch (Exception e)
            {
                Utils.Trace(Utils.TraceMasks.Error, $"{e.Message}");
            }
            return(null);
        }
Exemple #2
0
        /// <summary>write a note to server(you should use try catch)</summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="tag"></param>
        /// <param name="value"></param>
        /// <returns>if success True,otherwise False</returns>
        public bool WriteNode <T>(string tag, T value)
        {
            WriteValue writeValue1 = new WriteValue()
            {
                NodeId      = new NodeId(tag),
                AttributeId = 13
            };

            writeValue1.Value.Value           = (object)value;
            writeValue1.Value.StatusCode      = (StatusCode)0U;
            writeValue1.Value.ServerTimestamp = DateTime.MinValue;
            writeValue1.Value.SourceTimestamp = DateTime.MinValue;
            WriteValueCollection writeValueCollection = new WriteValueCollection();
            WriteValue           writeValue2          = writeValue1;

            writeValueCollection.Add(writeValue2);
            WriteValueCollection     nodesToWrite = writeValueCollection;
            StatusCodeCollection     results;
            DiagnosticInfoCollection diagnosticInfos;

            this.m_session.Write((RequestHeader)null, nodesToWrite, out results, out diagnosticInfos);
            ClientBase.ValidateResponse((IList)results, (IList)nodesToWrite);
            ClientBase.ValidateDiagnosticInfos(diagnosticInfos, (IList)nodesToWrite);
            return(!StatusCode.IsBad(results[0]));
        }
        /// <summary>
        /// Prompts the user to specify the browse options.
        /// </summary>
        public bool ShowDialog(Session session, WriteValue value)
        {
            if (session == null) throw new ArgumentNullException("session");
            if (value == null)   throw new ArgumentNullException("value");

            
            NodeIdCTRL.Browser = new Browser(session);

            INode node = session.NodeCache.Find(value.NodeId);

            if (node != null)
            {
                DisplayNameTB.Text = node.ToString();
            }

            NodeIdCTRL.Identifier      = value.NodeId;
            AttributeIdCB.SelectedItem = Attributes.GetBrowseName(value.AttributeId);
            IndexRangeTB.Text          = value.IndexRange;
         
            if (ShowDialog() != DialogResult.OK)
            {
                return false;
            }

            value.NodeId      = NodeIdCTRL.Identifier;
            value.AttributeId = Attributes.GetIdentifier((string)AttributeIdCB.SelectedItem);
            value.IndexRange  = IndexRangeTB.Text;            
         
            return true;
        }
Exemple #4
0
        public static async Task <object> WriteVar(int node, KeyValuePair <string, object>[] ValuesToSet)
        {
            try
            {
                WriteValue[] valuesToWrite = new WriteValue[ValuesToSet.Length];
                for (int i = 0; i < ValuesToSet.Length; i++)
                {
                    valuesToWrite[i] = new WriteValue
                    {
                        // you can parse the nodeId from a string.
                        NodeId = NodeId.Parse("ns=" + node.ToString() + ";s=" + ValuesToSet[i].Key),
                        // variable class nodes have a Value attribute.
                        AttributeId = AttributeIds.Value,
                        Value       = new DataValue(ValuesToSet[i].Value)
                    };
                }


                var writeRequest = new WriteRequest
                {
                    NodesToWrite = valuesToWrite
                };
                // send the ReadRequest to the server.
                var writeResult = await channel.WriteAsync(writeRequest);

                return(writeResult);
            }
            catch (Exception ex)
            {
                //await channel.AbortAsync();
                return(null);
            }
        }
Exemple #5
0
        private void WriteMI_Click(object sender, EventArgs e)
        {
            try {
                if (NodesTV.SelectedNode == null)
                {
                    return;
                }

                ReferenceDescription reference = NodesTV.SelectedNode.Tag as ReferenceDescription;

                if (reference == null || (reference.NodeClass & (NodeClass.Variable | NodeClass.VariableType)) == 0)
                {
                    return;
                }

                Session session = m_browser.Session;

                // build list of nodes to read.
                WriteValueCollection values = new WriteValueCollection();

                WriteValue value = new WriteValue();

                value.NodeId      = (NodeId)reference.NodeId;
                value.AttributeId = Attributes.Value;
                value.IndexRange  = null;
                value.Value       = null;

                values.Add(value);

                // show form.
                new WriteDlg().Show(session, values);
            } catch (Exception exception) {
                GuiUtils.HandleException(this.Text, MethodBase.GetCurrentMethod(), exception);
            }
        }
Exemple #6
0
        /// <summary>
        /// write a note to server(you should use try catch)
        /// </summary>
        /// <typeparam name="T">The type of tag to write on</typeparam>
        /// <param name="tag">节点名称</param>
        /// <param name="value">值</param>
        /// <returns>if success True,otherwise False</returns>
        public bool WriteNode <T>(string tag, T value)
        {
            var valueToWrite = new WriteValue()
            {
                NodeId      = new NodeId(tag),
                AttributeId = Attributes.Value
            };

            valueToWrite.Value.Value           = value;
            valueToWrite.Value.StatusCode      = StatusCodes.Good;
            valueToWrite.Value.ServerTimestamp = DateTime.MinValue;
            valueToWrite.Value.SourceTimestamp = DateTime.MinValue;

            var valuesToWrite = new WriteValueCollection {
                valueToWrite
            };

            // 写入当前的值

            Session.Write(
                null,
                valuesToWrite,
                out var results,
                out var diagnosticInfos);

            ClientBase.ValidateResponse(results, valuesToWrite);
            ClientBase.ValidateDiagnosticInfos(diagnosticInfos, valuesToWrite);

            if (StatusCode.IsBad(results[0]))
            {
                throw new ServiceResultException(results[0]);
            }

            return(!StatusCode.IsBad(results[0]));
        }
Exemple #7
0
        /// <summary>
        /// Adds random values to write.
        /// </summary>
        private void AddWriteValues(
            TestVariable variable,
            WriteValueCollection nodesToWrite)
        {
            WriteValue nodeToWrite = new WriteValue();

            nodeToWrite.NodeId      = variable.Variable.NodeId;
            nodeToWrite.AttributeId = Attributes.Value;

            DataValue value = new DataValue();

            value.Value = m_generator.GetRandom(
                variable.Variable.DataType,
                variable.Variable.ValueRank,
                variable.Variable.ArrayDimensions,
                Session.TypeTree);

            value.StatusCode      = StatusCodes.Good;
            value.ServerTimestamp = DateTime.MinValue;
            value.SourceTimestamp = DateTime.MinValue;

            variable.Values.Add(value);

            nodeToWrite.Value  = value;
            nodeToWrite.Handle = variable;

            nodesToWrite.Add(nodeToWrite);
        }
Exemple #8
0
        public static void write()
        {
            WriteValue value = new WriteValue();

            value.NodeId      = Data.tags["DigitConst"].NodeId;
            value.AttributeId = Attributes.Value;
            value.Value.Value = 10;

            WriteValueCollection valuesToWrite = new WriteValueCollection();

            valuesToWrite.Add(value);

            StatusCodeCollection     results         = null;
            DiagnosticInfoCollection diagnosticInfos = null;

            ResponseHeader responseHeader = session.Write(
                null,
                valuesToWrite,
                out results,
                out diagnosticInfos);

            ClientBase.ValidateResponse(results, valuesToWrite);
            ClientBase.ValidateDiagnosticInfos(diagnosticInfos, valuesToWrite);

            if (StatusCode.IsBad(results[0]))
            {
                throw ServiceResultException.Create(results[0], 0, diagnosticInfos, responseHeader.StringTable);
            }
        }
Exemple #9
0
        private void UpdateBTN_Click(object sender, EventArgs e)
        {
            try {
                WriteValue nodeToWrite = new WriteValue();
                nodeToWrite.NodeId             = m_variableId;
                nodeToWrite.AttributeId        = Attributes.Value;
                nodeToWrite.Value              = new DataValue();
                nodeToWrite.Value.WrappedValue = GetValue();

                WriteValueCollection nodesToWrite = new WriteValueCollection();
                nodesToWrite.Add(nodeToWrite);

                // read the attributes.
                StatusCodeCollection     results         = null;
                DiagnosticInfoCollection diagnosticInfos = null;

                ResponseHeader responseHeader = m_session.Write(
                    null,
                    nodesToWrite,
                    out results,
                    out diagnosticInfos);

                ClientBase.ValidateResponse(results, nodesToWrite);
                ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToWrite);

                // check for error.
                if (StatusCode.IsBad(results[0]))
                {
                    throw ServiceResultException.Create(results[0], 0, diagnosticInfos, responseHeader.StringTable);
                }
            } catch (Exception exception) {
                ClientUtils.HandleException(this.Text, exception);
            }
        }
Exemple #10
0
        private void NewMI_Click(object sender, EventArgs e)
        {
            try {
                WriteValue nodeToWrite = null;

                // choose the first selected row as a template.
                foreach (DataGridViewRow row in ResultsDV.SelectedRows)
                {
                    DataRowView source = row.DataBoundItem as DataRowView;
                    WriteValue  value  = (WriteValue)source.Row[0];
                    nodeToWrite = (WriteValue)value.Clone();
                    break;
                }

                if (nodeToWrite == null)
                {
                    nodeToWrite = new WriteValue()
                    {
                        AttributeId = Attributes.Value
                    };
                }

                // prompt use to edit new value.
                WriteValue result = new EditWriteValueDlg().ShowDialog(m_session, nodeToWrite);

                if (result != null)
                {
                    DataRow row = m_dataset.Tables[0].NewRow();
                    UpdateRow(row, result);
                    m_dataset.Tables[0].Rows.Add(row);
                }
            } catch (Exception exception) {
                ClientUtils.HandleException(this.Text, exception);
            }
        }
Exemple #11
0
        /// <summary>
        /// write a note to server(you should use try catch)
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="tag"></param>
        /// <param name="value"></param>
        /// <returns>if success True,otherwise False</returns>
        public bool WriteNode <T>(string tag, T value)
        {
            WriteValue valueToWrite = new WriteValue()
            {
                NodeId      = new NodeId(tag),
                AttributeId = Attributes.Value
            };

            valueToWrite.Value.Value           = value;
            valueToWrite.Value.StatusCode      = StatusCodes.Good;
            valueToWrite.Value.ServerTimestamp = DateTime.MinValue;
            valueToWrite.Value.SourceTimestamp = DateTime.MinValue;

            WriteValueCollection valuesToWrite = new WriteValueCollection
            {
                valueToWrite
            };

            // 写入当前的值

            m_session.Write(
                null,
                valuesToWrite,
                out StatusCodeCollection results,
                out DiagnosticInfoCollection diagnosticInfos);

            ClientBase.ValidateResponse(results, valuesToWrite);
            ClientBase.ValidateDiagnosticInfos(diagnosticInfos, valuesToWrite);

            return(!StatusCode.IsBad(results[0]));
        }
Exemple #12
0
 public DelegatesDependendClass(
     WriteValue writeValue,
     AppendValue appendValue)
 {
     _writeValue  = writeValue;
     _appendValue = appendValue;
 }
        public async Task <bool> WriteNodeValueAsync(string serverUrl, VariableNode variableNode, VariableState state)
        {
            Session session = await GetSessionAsync(serverUrl);

            var typeManager = new DataTypeManager(session);
            WriteValueCollection writeValues = new WriteValueCollection();

            WriteValue writeValue = new WriteValue
            {
                NodeId      = variableNode.NodeId,
                AttributeId = Attributes.Value,
                Value       = typeManager.GetDataValueFromVariableState(state, variableNode)
            };

            writeValues.Add(writeValue);

            session.Write(null, writeValues, out var results, out _);
            if (!StatusCode.IsGood(results[0]))
            {
                if (results[0] == StatusCodes.BadTypeMismatch)
                {
                    throw new ValueToWriteTypeException("Wrong Type Error: data sent are not of the type expected. Check your data and try again");
                }
                throw new ValueToWriteTypeException(results[0].ToString());
            }
            return(true);
        }
Exemple #14
0
        private void WriteValue(Session session, NodeId variableId, DataValue value)
        {
            WriteValue nodeToWrite = new WriteValue {
                NodeId      = variableId,
                AttributeId = Attributes.Value,
                Value       = new DataValue {
                    WrappedValue = value.WrappedValue
                }
            };

            WriteValueCollection nodesToWrite = new WriteValueCollection {
                nodeToWrite
            };

            // read the attributes.
            StatusCodeCollection     results         = null;
            DiagnosticInfoCollection diagnosticInfos = null;

            ResponseHeader responseHeader = session.Write(
                null,
                nodesToWrite,
                out results,
                out diagnosticInfos);

            ClientBase.ValidateResponse(results, nodesToWrite);
            ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToWrite);

            // check for error.
            if (StatusCode.IsBad(results[0]))
            {
                throw ServiceResultException.Create(results[0], 0, diagnosticInfos, responseHeader.StringTable);
            }
        }
        /// <summary>
        /// Adds a value to the control.
        /// </summary>
        public void AddValue(ReferenceDescription reference)
        {
            Node node = m_session.NodeCache.Find(reference.NodeId) as Node;

            if (node == null)
            {
                return;
            }

            WriteValue value = new WriteValue();

            value.NodeId      = node.NodeId;
            value.AttributeId = Attributes.Value;
            value.IndexRange  = null;

            // read the display name for non-variables.
            if ((node.NodeClass & (NodeClass.Variable | NodeClass.VariableType)) == 0)
            {
                value.AttributeId = Attributes.DisplayName;
            }

            value.Value = GetDefaultValue(value.NodeId, value.AttributeId);

            AddItem(value);
            AdjustColumns();
        }
        private void EditMI_Click(object sender, EventArgs e)
        {
            try
            {
                // choose the first selected row.
                foreach (DataGridViewRow row in ResultsDV.SelectedRows)
                {
                    DataRowView source = row.DataBoundItem as DataRowView;
                    WriteValue  value  = (WriteValue)source.Row[0];

                    WriteValue result = new EditWriteValueDlg().ShowDialog(m_session, value);

                    if (result != null)
                    {
                        UpdateRow(source.Row, result);
                    }

                    break;
                }
            }
            catch (Exception exception)
            {
                ClientUtils.HandleException(this.Text, exception);
            }
        }
Exemple #17
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="node"></param>
        /// <returns></returns>
        public string VariableWrite(string node, int value)
        {
            try
            {
                StatusCodeCollection     values          = null;
                DiagnosticInfoCollection diagnosticInfos = null;
                //WriteValueIdCollection nodesToRead = new WriteValueIdCollection();
                WriteValueCollection nodesToWrite = new WriteValueCollection();
                WriteValue           valueId      = new WriteValue();
                valueId.NodeId      = new NodeId(node);
                valueId.AttributeId = Attributes.Value;
                valueId.IndexRange  = null;
                valueId.Value       = new DataValue(value);
                nodesToWrite.Add(valueId);
                ResponseHeader response = session.Write(null, nodesToWrite, out values, out diagnosticInfos);

                /*string value = "";
                 * if (values[0].Value != null)
                 * {
                 *  var rawValue = values[0].WrappedValue.ToString();
                 *  value = rawValue.Replace("|", "\r\n").Replace("{", "").Replace("}", "");
                 * }*/
                return(null);
            }
            catch
            {
                return(null);
            }
        }
 public static void WriteData(this XiDataList dataList,
                              WriteValue dataObjectToWrite)
 {
     dataList.WriteData(new List <WriteValue> {
         dataObjectToWrite
     });
 }
Exemple #19
0
        /// <summary>
        /// Adds a write request for a DA item.
        /// </summary>
        /// <param name="item">The item.</param>
        /// <param name="nodeToWrite">The node to write.</param>
        /// <param name="index">The index associated with the value.</param>
        /// <returns>StatusCode.Good if the write is allowed. An error code otherwise.</returns>
        private StatusCode Add(DaItemState item, WriteValue nodeToWrite, int index)
        {
            if (nodeToWrite.AttributeId != Attributes.Value)
            {
                return(StatusCodes.BadNotWritable);
            }

            if (nodeToWrite.ParsedIndexRange != NumericRange.Empty)
            {
                return(StatusCodes.BadIndexRangeInvalid);
            }

            if (nodeToWrite.Value.ServerTimestamp != DateTime.MinValue)
            {
                return(StatusCodes.BadWriteNotSupported);
            }

            if (item.Element.DataType != 0)
            {
                if (!CheckDataType(item.Element.DataType, nodeToWrite.Value.WrappedValue))
                {
                    return(StatusCodes.BadTypeMismatch);
                }
            }

            WriteRequest request = new WriteRequest(item.ItemId, nodeToWrite.Value, index);

            Add(request);
            return(StatusCodes.Good);
        }
        public void ArraySubRangeIndexRangeValidationTest()
        {
            // Test with String array
            WriteValue writeValue = new WriteValue()
            {
                AttributeId = Attributes.Value,
                NodeId      = new NodeId(4000, 8),
                Value       = new DataValue(new Variant(new string[] { "ha" })),
                IndexRange  = "0,1:2"
            };

            Assert.AreEqual(BuiltInType.String, writeValue.Value.WrappedValue.TypeInfo.BuiltInType);
            Assert.True(ServiceResult.IsGood(WriteValue.Validate(writeValue)), "WriteValue.Validate result was not Good");

            // Test with ByteString array
            writeValue.Value = new DataValue(new Variant(new byte[][] { new byte[] { 0x22, 0x21 } }));
            Assert.AreEqual(BuiltInType.ByteString, writeValue.Value.WrappedValue.TypeInfo.BuiltInType);
            Assert.True(ServiceResult.IsGood(WriteValue.Validate(writeValue)), "WriteValue.Validate result was not Good");

            // Negative test with Int32 array
            writeValue.Value = new DataValue(new Variant(new int[] { 1, 2 }));
            Assert.AreEqual(BuiltInType.Int32, writeValue.Value.WrappedValue.TypeInfo.BuiltInType);
            ServiceResult validateResult = WriteValue.Validate(writeValue);

            Assert.True(ServiceResult.IsBad(validateResult), "WriteValue.Validate result was not Good");
            Assert.AreEqual(new StatusCode(StatusCodes.BadTypeMismatch), validateResult.StatusCode);
        }
Exemple #21
0
        public List <String> WriteVariable(string identifier, ushort namespaceIndex, Object value, uint attribute)
        {
            NodeId        node            = null;
            List <String> statusCodeWrite = new List <String>();

            node = new NodeId(identifier, namespaceIndex);
            DataValue valueToWrite = new DataValue()
            {
                Value = (new Variant(value))
            };
            DiagnosticInfoCollection diagnosticInfos = null;
            WriteValueCollection     nodesTowrite    = new WriteValueCollection();
            WriteValue nodeToWrite = new WriteValue()
            {
                NodeId      = node,
                AttributeId = attribute,
                Value       = valueToWrite,
                IndexRange  = null
            };

            nodesTowrite.Add(nodeToWrite);
            StatusCodeCollection writeResults;

            session.Write(null, nodesTowrite, out writeResults, out diagnosticInfos);
            for (int i = 0; i < writeResults.Count; i++)
            {
                statusCodeWrite.Add(writeResults[i].ToString());
            }
            return(statusCodeWrite);
        }
Exemple #22
0
        /// <summary>
        /// Validates the nodes and writes the value to the underlying system.
        /// </summary>
        /// <param name="context">The context.</param>
        /// <param name="nodesToWrite">The nodes to write.</param>
        /// <param name="errors">The errors.</param>
        /// <param name="nodesToValidate">The nodes to validate.</param>
        /// <param name="cache">The cache.</param>
        protected override void Write(
            ServerSystemContext context,
            IList <WriteValue> nodesToWrite,
            IList <ServiceResult> errors,
            List <NodeHandle> nodesToValidate,
            IDictionary <NodeId, NodeState> cache)
        {
            ComDaClientManager system = (ComDaClientManager)this.SystemContext.SystemHandle;
            ComDaClient        client = system.SelectClient((ServerSystemContext)SystemContext, false);

            WriteRequestCollection requests = new WriteRequestCollection();

            // validates the nodes and queues an write requests.
            for (int ii = 0; ii < nodesToValidate.Count; ii++)
            {
                NodeHandle handle = nodesToValidate[ii];

                lock (Lock)
                {
                    // validate node.
                    NodeState source = ValidateNode(context, handle, cache);

                    if (source == null)
                    {
                        continue;
                    }

                    // determine if request can be sent to the server.
                    bool       queued      = false;
                    WriteValue nodeToWrite = nodesToWrite[handle.Index];
                    errors[handle.Index] = requests.Add(source, nodeToWrite, handle.Index, out queued);

                    if (queued)
                    {
                        continue;
                    }

                    // write the attribute value.
                    errors[handle.Index] = source.WriteAttribute(
                        context,
                        nodeToWrite.AttributeId,
                        nodeToWrite.ParsedIndexRange,
                        nodeToWrite.Value);

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

            // write to the server.
            client.Write(requests);

            // get the results from the requests sent to the server.
            for (int ii = 0; ii < requests.Count; ii++)
            {
                WriteRequest request = requests[ii];
                errors[request.Index] = request.GetResult();
            }
        }
 public static void WriteData(this XiDataList dataList,
                              WriteValue dataObjectToWrite,
                              OnWriteDataComplete onComplete,
                              object asyncState)
 {
     dataList.WriteData(new List <WriteValue> {
         dataObjectToWrite
     }, onComplete, asyncState);
 }
        /// <summary>
        /// Display current attribute values.
        /// </summary>
        /// <param name="nodeToRead"></param>
        /// <param name="attrIds"></param>
        /// <param name="results"></param>
        /// /// <param name="response"></param>
        private void updateAttributes(
            NodeId nodeToRead,
            UInt32Collection attrIds,
            DataValueCollection results,
            ResponseHeader response)
        {
            if (attrIds.Count != results.Count)
            {
                // Error case.
                return;
            }

            try
            {
                for (int i = 0; i < attrIds.Count; i++)
                {
                    string attributeName  = (string)attrIds[i].ToString();
                    string attributeValue = results[i].ToString();
                    string attributeStatus;

                    // Add the attribute name / value to the list view.
                    ListViewItem item = new ListViewItem(attributeName);

                    // Add the value
                    item.SubItems.Add(attributeValue);

                    if (attrIds[i] == Attributes.Value)
                    {
                        m_CurrentWriteValue             = new WriteValue();
                        m_CurrentWriteValue.AttributeId = Attributes.Value;
                        m_CurrentWriteValue.NodeId      = nodeToRead;
                        m_CurrentWriteNodeName          = nodeToRead.ToString();
                        m_CurrentValue = results[i].Value;
                    }

                    // Add status.
                    attributeStatus = results[i].StatusCode.ToString();
                    if (StatusCode.IsBad(results[i].StatusCode))
                    {
                        item.SubItems[0].Text      = (String)attributeStatus;
                        item.SubItems[0].ForeColor = Color.Red;
                    }

                    // Add item to listview.
                    this.lvAttributes.Items.Add(item);

                    // Fit the width of the nodeid column to the size of the header.
                    this.lvAttributes.Columns[0].Width = -2;
                }
            }
            catch (Exception e)
            {
                // Update status label.
                OnUpdateStatusLabel("Error while processing read results: " + e.Message, false);
            }
        }
Exemple #25
0
        public static WriteValue ToWriteValue(this WriteData writeData)
        {
            var xiWriteData = new WriteValue
            {
                DataValue   = writeData.ToDataValue(),
                ServerAlias = writeData.Registration.ServerAlias,
            };

            return(xiWriteData);
        }
        /// <summary>
        /// Updates the row with the node to write.
        /// </summary>
        public void UpdateRow(DataRow row, WriteValue nodeToWrite)
        {
            row[0] = nodeToWrite;
            row[1] = ImageList.Images[ClientUtils.GetImageIndex(nodeToWrite.AttributeId, null)];
            row[2] = (m_session != null) ? m_session.NodeCache.GetDisplayText(nodeToWrite.NodeId) : Utils.ToString(nodeToWrite.NodeId);
            row[3] = Attributes.GetBrowseName(nodeToWrite.AttributeId);
            row[4] = nodeToWrite.IndexRange;

            UpdateRow(row, nodeToWrite.Value);
        }
Exemple #27
0
        public bool WriteValues(List <string> opcNodes, List <object> values, out List <bool> status)
        {
            bool ret = false;

            try
            {
                if (opcNodes.Count != values.Count)
                {
                    throw new Exception("opcNodes.Count != values.Count");
                }

                int count = opcNodes.Count;

                status = new List <bool>(count);
                List <Type>   types   = new List <Type>(count);
                List <NodeId> nodeIds = new List <NodeId>(count);

                DiagnosticInfoCollection diags;
                StatusCodeCollection     statusCodes;

                WriteValueCollection writeValues = new WriteValueCollection(count);

                for (int i = 0; i < count; i++)
                {
                    Variant   variant = new Variant(values[i]);
                    DataValue dataVal = new DataValue(variant);

                    WriteValue writeVal = new WriteValue();
                    writeVal.Value       = dataVal;
                    writeVal.NodeId      = new NodeId(opcNodes[i]);
                    writeVal.AttributeId = Attributes.Value;

                    writeValues.Add(writeVal);
                }

                ResponseHeader rh = session.Write(null, writeValues, out statusCodes, out diags);

                ret = StatusCode.IsGood(rh.ServiceResult.Code);

                for (int i = 0; i < count; i++)
                {
                    //status[i] = StatusCode.IsGood(statusCodes[i]);
                    status.Add(StatusCode.IsGood(statusCodes[i]));
                    ret = ret & status[i];
                }
            }
            catch (Exception ex)
            {
                ret    = false;
                status = null;
                System.Diagnostics.Debug.WriteLine("Exception OpcUaClient::WriteValues " + ex.Message);
            }

            return(ret);
        }
Exemple #28
0
        private async Task WriteValueInternal(byte[] value)
        {
            await Task.Delay(333);

            Debug.WriteLine($">>> {value.Dump()}");
            try
            {
                WriteValue.Invoke(value);
            }
            catch { }
        }
        /// <summary>
        /// Update the attribute listview.
        /// </summary>
        /// <param name="nodesToRead"></param>
        /// <param name="results"></param>
        /// <returns></returns>
        private void updateAttributeList(ReadValueIdCollection nodesToRead, DataValueCollection results)
        {
            if (nodesToRead.Count != results.Count)
            {
                // Error case.
                return;
            }

            try
            {
                for (int i = 0; i < nodesToRead.Count - 1; i++)
                {
                    string attributeName = (string)nodesToRead[i].Handle;
                    string attributeValue;
                    string attributeStatus;

                    // Add the attribute name / value to the list view.
                    ListViewItem item = new ListViewItem(attributeName);

                    // Add value.
                    attributeValue = m_Server.attributeValueToString(nodesToRead[i], results[i]);
                    item.SubItems.Add(attributeValue);

                    if (nodesToRead[i].AttributeId == Attributes.Value)
                    {
                        m_CurrentWriteValue             = new WriteValue();
                        m_CurrentWriteValue.AttributeId = Attributes.Value;
                        m_CurrentWriteValue.NodeId      = nodesToRead[i].NodeId;
                        m_CurrentWriteNodeName          = nodesToRead[i].NodeId.ToString();
                        m_CurrentValue = results[i].Value;
                    }

                    // Add status.
                    attributeStatus = StatusCode.LookupSymbolicId(results[i].StatusCode.Code);
                    if (StatusCode.IsBad(results[i].StatusCode))
                    {
                        item.SubItems[1].Text      = (String)attributeStatus;
                        item.SubItems[1].ForeColor = Color.Red;
                    }

                    // Add item to the listview.
                    this.lvAttributes.Items.Add(item);

                    // Set column width.
                    this.lvAttributes.Columns[0].Width = 150;
                    this.lvAttributes.Columns[1].Width = 250;
                }
            }
            catch (Exception e)
            {
                // Update status label.
                OnUpdateStatusLabel("Error while processing read results: " + e.Message, false);
            }
        }
        public IActionResult writevalue([FromBody] WriteValue rawdata)
        {
            string           IpAddress  = rawdata.IpAddress;
            int              Port       = rawdata.Port;
            string           VarAddress = rawdata.VarAddress;
            string           FC         = rawdata.FC;
            dynamic          NewValue   = rawdata.NewValue;
            Read_Write       readwrite  = new Read_Write(_subSvc);
            ResultValueModel data       = readwrite.WriteValue(IpAddress, Port, VarAddress, FC, NewValue);

            return(Json(data));
        }
Exemple #31
0
        /// <summary>
        /// Adds random values to write.
        /// </summary>
        private void AddWriteBadValues(
            TestVariable variable,
            WriteValueCollection nodesToWrite)
        {
            for (BuiltInType ii = BuiltInType.Null; ii < BuiltInType.DataValue; ii++)
            {
                if (variable.DataType != ii || variable.Variable.ValueRank >= 0)
                {
                    // add random scalar.
                    WriteValue nodeToWrite = new WriteValue();

                    nodeToWrite.NodeId      = variable.Variable.NodeId;
                    nodeToWrite.AttributeId = Attributes.Value;

                    DataValue value = new DataValue();

                    value.Value           = m_generator.GetRandom(ii);
                    value.StatusCode      = StatusCodes.Good;
                    value.ServerTimestamp = DateTime.MinValue;
                    value.SourceTimestamp = DateTime.MinValue;

                    variable.Values.Add(value);

                    nodeToWrite.Value  = value;
                    nodeToWrite.Handle = variable;

                    nodesToWrite.Add(nodeToWrite);
                }

                if (variable.DataType != ii || variable.Variable.ValueRank == ValueRanks.Scalar)
                {
                    // add random array.
                    WriteValue nodeToWrite = new WriteValue();

                    nodeToWrite.NodeId      = variable.Variable.NodeId;
                    nodeToWrite.AttributeId = Attributes.Value;

                    DataValue value = new DataValue();

                    value.Value           = m_generator.GetRandomArray(ii, true, 100, false);
                    value.StatusCode      = StatusCodes.Good;
                    value.ServerTimestamp = DateTime.MinValue;
                    value.SourceTimestamp = DateTime.MinValue;

                    variable.Values.Add(value);

                    nodeToWrite.Value  = value;
                    nodeToWrite.Handle = variable;

                    nodesToWrite.Add(nodeToWrite);
                }
            }
        }
        /// <summary>
        /// Adds a value to the control.
        /// </summary>
        public void AddValue(ReferenceDescription reference)
        {
            Node node = m_session.NodeCache.Find(reference.NodeId) as Node;

            if (node == null)
            {
                return;
            }

            WriteValue value = new WriteValue();

            value.NodeId      = node.NodeId;
            value.AttributeId = Attributes.Value;
            value.IndexRange  = null;

            // read the display name for non-variables.
            if ((node.NodeClass & (NodeClass.Variable | NodeClass.VariableType)) == 0)
            {
                value.AttributeId  = Attributes.DisplayName;
            }

            value.Value = GetDefaultValue(value.NodeId, value.AttributeId);

            AddItem(value);
            AdjustColumns();
        }
Exemple #33
0
        /// <summary>
        /// Writes the values for the specified item ids.
        /// </summary>
        /// <param name="itemIds">The item ids.</param>
        /// <param name="values">The values.</param>
        /// <returns>The results.</returns>
        public int[] Write(string[] itemIds, DaValue[] values)
        {
            int[] results = new int[itemIds.Length];
            WriteValueCollection valuesToWrite = new WriteValueCollection();

            ComDaReadPropertiesRequest[] requests = new ComDaReadPropertiesRequest[values.Length];
            
            // prepare request.
            for (int ii = 0; ii < itemIds.Length; ii++)
            {
                ComDaReadPropertiesRequest request = requests[ii] = new ComDaReadPropertiesRequest();
                request.ItemId = itemIds[ii];
            }

            // need to get the data type of the remote node.
            m_browseManager.GetPropertyValues(Session, requests, PropertyIds.UaBuiltInType, PropertyIds.UaValueRank);

            // validate items.
            for (int ii = 0; ii < requests.Length; ii++)
            {
                ComDaReadPropertiesRequest request = requests[ii];

                if (request.Error < 0)
                {
                    results[ii] = request.Error;
                    continue;
                }

                int? builtInType = request.Values[0].Value as int?;
                int? valueRank = request.Values[1].Value as int?;

                if (builtInType == null || valueRank == null)
                {
                    results[ii] = ResultIds.E_UNKNOWNITEMID;
                    continue;
                }

                // convert value to UA data type.
                WriteValue valueToWrite = new WriteValue();

                valueToWrite.NodeId = m_mapper.GetRemoteNodeId(itemIds[ii]);
                valueToWrite.AttributeId = Attributes.Value;
                valueToWrite.Handle = ii;

                // convert value to UA data type.
                try
                {
                    TypeInfo remoteType = new TypeInfo((BuiltInType)builtInType.Value, valueRank.Value);
                    valueToWrite.Value = m_mapper.GetRemoteDataValue(values[ii], remoteType);
                }
                catch (Exception e)
                {
                    results[ii] = ComUtils.GetErrorCode(e, ResultIds.E_BADTYPE);
                    continue;
                }

                valuesToWrite.Add(valueToWrite);
            }

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

            // write the values to the server.
            int[] remoteResults = m_groupManager.Write(valuesToWrite);

            // copy results.
            for (int ii = 0; ii < valuesToWrite.Count; ii++)
            {
                results[(int)valuesToWrite[ii].Handle] = remoteResults[ii];
            }

            return results;
        }
Exemple #34
0
        /// <summary>
        /// Adds index ranges to the collection.
        /// </summary>
        private void AddWriteValues(
            Node node, 
            WriteValueCollection nodesToWrite, 
            params uint[] attributeIds)
        {            
            if (attributeIds != null)
            {
                for (int ii = 0; ii < attributeIds.Length; ii++)
                {
                    WriteValue nodeToWrite = new WriteValue();
                
                    nodeToWrite.NodeId = node.NodeId;
                    nodeToWrite.AttributeId = attributeIds[ii];

                    DataValue value = new DataValue();

                    ServiceResult result = node.Read(
                        null,
                        attributeIds[ii],
                        value);
                
                    value.StatusCode = StatusCodes.Good;
                    value.ServerTimestamp = DateTime.MinValue;
                    value.SourceTimestamp = DateTime.MinValue;

                    if (ServiceResult.IsBad(result))
                    {
                        value.Value = null;
                    }

                    nodeToWrite.Value = value;
                    nodeToWrite.Handle = node;

                    nodesToWrite.Add(nodeToWrite);

                    Array array = value.Value as Array;

                    if (array != null)
                    {
                        NumericRange range = new NumericRange(0, 1);

                        object subarray = array;
                        range.ApplyRange(ref subarray);

                        nodeToWrite = new WriteValue();
                
                        nodeToWrite.Value = new DataValue();
                        nodeToWrite.Value.Value = subarray;
                        nodeToWrite.Value.StatusCode = StatusCodes.Good;
                        nodeToWrite.Value.ServerTimestamp = DateTime.MinValue;
                        nodeToWrite.Value.SourceTimestamp = DateTime.MinValue;
                        nodeToWrite.NodeId = node.NodeId;
                        nodeToWrite.AttributeId = attributeIds[ii];
                        nodeToWrite.IndexRange = "0";
                        nodeToWrite.Handle = node;
                    
                        nodesToWrite.Add(nodeToWrite);
                    }

                    nodeToWrite = new WriteValue();
            
                    nodeToWrite.Value = new DataValue();
                    nodeToWrite.Value.Value = value.Value;
                    nodeToWrite.Value.StatusCode = StatusCodes.Uncertain;
                    nodeToWrite.Value.ServerTimestamp = DateTime.MinValue;
                    nodeToWrite.Value.SourceTimestamp = DateTime.MinValue;
                    nodeToWrite.NodeId = node.NodeId;
                    nodeToWrite.AttributeId = attributeIds[ii];
                    nodeToWrite.Handle = node;
                
                    nodesToWrite.Add(nodeToWrite);

                    nodeToWrite = new WriteValue();
            
                    nodeToWrite.Value = new DataValue();
                    nodeToWrite.Value.Value = value.Value;
                    nodeToWrite.Value.StatusCode = StatusCodes.Good;
                    nodeToWrite.Value.ServerTimestamp = DateTime.UtcNow;
                    nodeToWrite.Value.SourceTimestamp = DateTime.MinValue;
                    nodeToWrite.NodeId = node.NodeId;
                    nodeToWrite.AttributeId = attributeIds[ii];
                    nodeToWrite.Handle = node;
                
                    nodesToWrite.Add(nodeToWrite);

                    nodeToWrite = new WriteValue();
            
                    nodeToWrite.Value = new DataValue();
                    nodeToWrite.Value.Value = value.Value;
                    nodeToWrite.Value.StatusCode = StatusCodes.Good;
                    nodeToWrite.Value.ServerTimestamp = DateTime.MinValue;
                    nodeToWrite.Value.SourceTimestamp = DateTime.UtcNow;
                    nodeToWrite.NodeId = node.NodeId;
                    nodeToWrite.AttributeId = attributeIds[ii];
                    nodeToWrite.Handle = node;
                
                    nodesToWrite.Add(nodeToWrite);
                }
            }
        }
Exemple #35
0
		/// <summary>
        /// IOPCSyncIO2::WriteVQT - Writes one or more values, qualities and timestamps for the items specified.
		/// </summary>
		public void WriteVQT(
            int dwCount, 
            int[] phServer, 
            OPCITEMVQT[] pItemVQT, 
            out System.IntPtr ppErrors)
		{
			// validate arguments.
			if (dwCount == 0 || phServer == null || pItemVQT == null || dwCount != phServer.Length || dwCount != pItemVQT.Length)
			{
				throw ComUtils.CreateComException(ResultIds.E_INVALIDARG);
			}

			try
            {
                int[] errors = new int[dwCount];
                
                // build list of values to write.
                WriteValueCollection valuesToWrite = new WriteValueCollection();
                    
			    lock (m_lock)
			    {
				    if (m_subscription == null) throw ComUtils.CreateComException(ResultIds.E_FAIL);

                    for (int ii = 0; ii < dwCount; ii++)
                    {
                        Item itemToWrite = null;

                        if (!m_items.TryGetValue(phServer[ii], out itemToWrite))
                        {
                            errors[ii] = ResultIds.E_INVALIDHANDLE;
                            continue;
                        }

                        WriteValue valueToWrite = new WriteValue();

                        valueToWrite.NodeId      = itemToWrite.Variable.NodeId;
                        valueToWrite.IndexRange  = null;
                        valueToWrite.AttributeId = Attributes.Value;

                        DataValue value = new DataValue();
                        
                        int error = 0;
                        value.Value = m_server.VariantValueToValue(itemToWrite.Variable, pItemVQT[ii].vDataValue, out error);

                        if (error != ResultIds.S_OK)
                        {
                            errors[ii] = error;
                            continue;
                        }

                        if (pItemVQT[ii].bQualitySpecified != 0)
                        {
                            value.StatusCode = ComUtils.GetQualityCode(pItemVQT[ii].wQuality);
                        }
                        
                        if (pItemVQT[ii].bTimeStampSpecified != 0)
                        {
                            value.SourceTimestamp = ComUtils.GetDateTime(pItemVQT[ii].ftTimeStamp);
                        }

                        valueToWrite.Value = value;
                        
                        // needed to correlate results to input.
                        valueToWrite.Handle = ii;
                        
                        valuesToWrite.Add(valueToWrite);
                    }                
			    }

                // write values from server.
                StatusCodeCollection results = null;
                DiagnosticInfoCollection diagnosticInfos = null;
                
                if (valuesToWrite.Count > 0)
                {
                    m_session.Write(
                        null,
                        valuesToWrite,
                        out results,
                        out diagnosticInfos);
                
                    // validate response from the UA server.
                    ClientBase.ValidateResponse(results, valuesToWrite);
                    ClientBase.ValidateDiagnosticInfos(diagnosticInfos, valuesToWrite);
                }
                
                for (int ii = 0; ii < valuesToWrite.Count; ii++)
                {
                    // get index in original array.
                    int index = (int)valuesToWrite[ii].Handle;

                    // map UA code to DA code. 
                    errors[index] = Server.MapWriteStatusToErrorCode(results[ii]);
                }

                // marshal error codes.
                ppErrors = ComUtils.GetInt32s(errors);
            }
			catch (Exception e)
			{
				throw ComUtils.CreateComException(e);
			}
		}
Exemple #36
0
        /// <summary>
        /// Performs n synchronous write operation.
        /// </summary>
        /// <param name="serverHandles">The server handles.</param>
        /// <param name="values">The values.</param>
        /// <returns>Any errors.</returns>
        public int[] SyncWrite(int[] serverHandles, DaValue[] values)
        {
            TraceState("SyncWrite", serverHandles.Length);
            ThrowIfDisposed();

            int[] results = new int[serverHandles.Length];
            WriteValueCollection valuesToWrite = new WriteValueCollection();

            lock (m_lock)
            {
                // validate items.
                DaValue convertedValue = new DaValue();

                for (int ii = 0; ii < serverHandles.Length; ii++)
                {
                    ComDaGroupItem item = null;

                    if (!m_itemsByHandle.TryGetValue(serverHandles[ii], out item))
                    {
                        results[ii] = ResultIds.E_INVALIDHANDLE;
                        continue;
                    }

                    // apply the COM type conversion.
                    DaValue requestedValue = values[ii];

                    if (requestedValue.Value == null)
                    {
                        results[ii] = ResultIds.E_BADTYPE;
                        continue;
                    }

                    if (item.CanonicalDataType != (short)VarEnum.VT_EMPTY)
                    {
                        object value = null;

                        int error = ComUtils.ChangeTypeForCOM(requestedValue.Value, (VarEnum)item.CanonicalDataType, out value);

                        if (error < 0)
                        {
                            results[ii] = error;
                            continue;
                        }

                        // could happen if there is a problem reading the datatype from the server.
                        if (requestedValue.Value == null)
                        {
                            results[ii] = ResultIds.E_BADTYPE;
                            continue;
                        }

                        // copy all of the attributes into the converted value.
                        convertedValue.Value = value;
                        convertedValue.Quality = requestedValue.Quality;
                        convertedValue.Timestamp = requestedValue.Timestamp;
                        convertedValue.Error = requestedValue.Error;

                        requestedValue = convertedValue;
                    }

                    WriteValue valueToWrite = new WriteValue();

                    valueToWrite.NodeId = item.NodeId;
                    valueToWrite.AttributeId = Attributes.Value;
                    valueToWrite.Handle = ii;

                    // convert value to UA data type.
                    try
                    {
                        valueToWrite.Value = m_manager.Mapper.GetRemoteDataValue(requestedValue, item.RemoteDataType);
                    }
                    catch (Exception e)
                    {
                        results[ii] = ComUtils.GetErrorCode(e, ResultIds.E_BADTYPE);
                        continue;
                    }

                    valuesToWrite.Add(valueToWrite);
                }
            }

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

            // write the values to the server.
            int[] remoteResults = m_manager.Write(valuesToWrite);

            // copy results.
            for (int ii = 0; ii < valuesToWrite.Count; ii++)
            {
                results[(int)valuesToWrite[ii].Handle] = remoteResults[ii];
            }

            return results;
        }
Exemple #37
0
        /// <summary>
        /// IOPCSyncIO::Write - Writes values to one or more items in a group.
        /// </summary>
		public void Write(
            int dwCount, 
            int[] phServer, 
            object[] pItemValues, 
            out System.IntPtr ppErrors)
		{
			// validate arguments.
			if (dwCount == 0 || phServer == null || pItemValues == null || dwCount != phServer.Length || dwCount != pItemValues.Length)
			{
				throw ComUtils.CreateComException(ResultIds.E_INVALIDARG);
			}

			try
			{
                int[] errors = new int[dwCount];

                // build list of values to write.
                WriteValueCollection valuesToWrite = new WriteValueCollection();

		        lock (m_lock)
		        {
			        if (m_subscription == null) throw ComUtils.CreateComException(ResultIds.E_FAIL);
                                            
                    for (int ii = 0; ii < dwCount; ii++)
                    {
                        Item itemToWrite = null;

                        if (!m_items.TryGetValue(phServer[ii], out itemToWrite))
                        {
                            errors[ii] = ResultIds.E_INVALIDHANDLE;
                            continue;
                        }

                        VariableNode variable = itemToWrite.Variable;

                        WriteValue valueToWrite = new WriteValue();

                        valueToWrite.NodeId      = variable.NodeId;
                        valueToWrite.IndexRange  = null;
                        valueToWrite.AttributeId = Attributes.Value;

                        DataValue value = new DataValue();
                        
                        int error = 0;
                        value.Value = m_server.VariantValueToValue(variable, pItemValues[ii], out error);

                        if (error != ResultIds.S_OK)
                        {
                            errors[ii] = error;
                            continue;
                        }

                        valueToWrite.Value = value;
                        
                        // needed to correlate results to input.
                        valueToWrite.Handle = ii;
                        
                        valuesToWrite.Add(valueToWrite);
                    }
                }

                // write values from server.
                StatusCodeCollection results = null;
                DiagnosticInfoCollection diagnosticInfos = null;
                
                if (valuesToWrite.Count > 0)
                {
                    m_session.Write(
                        null,
                        valuesToWrite,
                        out results,
                        out diagnosticInfos);
                
                    // validate response from the UA server.
                    ClientBase.ValidateResponse(results, valuesToWrite);
                    ClientBase.ValidateDiagnosticInfos(diagnosticInfos, valuesToWrite);
                                    
                    //Utils.Trace(
                    //   "SyncWrite: GroupHandle={0}, ServerHandle={1}, Value={2}", 
                    //   m_clientHandle,
                    //   phServer[0],
                    //   valuesToWrite[0].Value.WrappedValue);
                }
                
                for (int ii = 0; ii < valuesToWrite.Count; ii++)
                {
                    // get index in original array.
                    int index = (int)valuesToWrite[ii].Handle;

                    // map UA code to DA code. 
                    errors[index] = Server.MapWriteStatusToErrorCode(results[ii]);
                }

                // marshal error codes.
                ppErrors = ComUtils.GetInt32s(errors);
			}
			catch (Exception e)
			{
                Utils.Trace(e, "Error writing items.");
				throw ComUtils.CreateComException(e);
			}
		}
Exemple #38
0
        /// <summary>
        /// IOPCAsyncIO3::WriteVQT - Writes one or more values, qualities and timestamps for the items specified. 
        ///                          The results are returned via the client�s IOPCDataCallback connection established 
        ///                          through the server�s IConnectionPointContainer.
        /// </summary>
		public void WriteVQT(
            int dwCount, 
            int[] phServer, 
            OPCITEMVQT[] pItemVQT, 
            int dwTransactionID, 
            out int pdwCancelID, 
            out System.IntPtr ppErrors)
		{
            pdwCancelID = 0;

			// validate arguments.
			if (dwCount == 0 || phServer == null || pItemVQT == null || dwCount != phServer.Length || dwCount != pItemVQT.Length)
			{
				throw ComUtils.CreateComException(ResultIds.E_INVALIDARG);
			}
			
            // get callback object - nothing more to do if missing.
            IOPCDataCallback callback = (IOPCDataCallback)GetCallback(typeof(IOPCDataCallback).GUID);

            if (callback == null)
            {
		        throw ComUtils.CreateComException(ResultIds.CONNECT_E_NOCONNECTION);
            }
            
			try
			{ 
                int[] errors = new int[dwCount];
                
                // build list of values to write.
                WriteValueCollection valuesToWrite = new WriteValueCollection();
                
		        lock (m_lock)
		        {
				    if (m_subscription == null) throw ComUtils.CreateComException(ResultIds.E_FAIL);
                    
                    CallbackValue[] conversionErrors = null;

                    for (int ii = 0; ii < dwCount; ii++)
                    {
                        Item itemToWrite = null;

                        if (!m_items.TryGetValue(phServer[ii], out itemToWrite))
                        {
                            errors[ii] = ResultIds.E_INVALIDHANDLE;
                            continue;
                        }

                        VariableNode variable = itemToWrite.Variable;

                        WriteValue valueToWrite = new WriteValue();

                        valueToWrite.NodeId      = variable.NodeId;
                        valueToWrite.IndexRange  = null;
                        valueToWrite.AttributeId = Attributes.Value;

                        DataValue value = new DataValue();
                        
                        int error = 0;
                        value.Value = m_server.VariantValueToValue(variable, pItemVQT[ii].vDataValue, out error);

                        if (error != ResultIds.S_OK)
                        {
                            // only allocate this array when it is needed.
                            if (conversionErrors == null)
                            {
                                conversionErrors = new CallbackValue[dwCount];
                            }

                            // create the callback item.
                            CallbackValue conversionError = new CallbackValue();

                            conversionError.ClientHandle = itemToWrite.ClientHandle;
                            conversionError.Error = error;

                            conversionErrors[ii] = conversionError;

                            errors[ii] = error;
                            continue;
                        }

                        valueToWrite.Value = value;
                        
                        if (pItemVQT[ii].bQualitySpecified != 0)
                        {
                            value.StatusCode = ComUtils.GetQualityCode(pItemVQT[ii].wQuality);
                        }
                        
                        if (pItemVQT[ii].bTimeStampSpecified != 0)
                        {
                            value.SourceTimestamp = ComUtils.GetDateTime(pItemVQT[ii].ftTimeStamp);
                        }

                        // needed to correlate results to input.
                        valueToWrite.Handle = itemToWrite;
                        
                        valuesToWrite.Add(valueToWrite);
                    }
                    
                    // create transaction.
                    if (valuesToWrite.Count > 0 || conversionErrors != null)
                    {
                        pdwCancelID = Utils.IncrementIdentifier(ref m_nextHandle);
                        m_transactions[pdwCancelID] = new AsyncWriteTransaction(dwTransactionID, valuesToWrite);
                    }
                    
                    // send conversion errors in the callback if no valid items available (CTT bug workaround).
                    if (valuesToWrite.Count == 0 && conversionErrors != null)
                    {   
                        // must return S_OK from this function if sending the errors in the callback.
                        List<CallbackValue> errorsToSend = new List<CallbackValue>();
             
                        for (int ii = 0; ii < conversionErrors.Length; ii++)
                        {
                            if (conversionErrors[ii] != null)
                            {
                                errors[ii] = ResultIds.S_OK;
                                errorsToSend.Add(conversionErrors[ii]);
                            }
                        }

                        // queue the request.
                        CallbackRequest request = new CallbackRequest();

                        request.CallbackType = CallbackType.Write;
                        request.Callback = callback;
                        request.TransactionId = dwTransactionID;
                        request.GroupHandle = m_clientHandle;
                        request.ServerHandle = m_serverHandle;
                        request.Values = errorsToSend;

                        QueueCallbackRequest(request);
                    }
				}
                   
                // write values from server.                    
                if (valuesToWrite.Count > 0)
                {
                    m_session.BeginWrite(
                        null,
                        valuesToWrite,
                        new AsyncCallback(OnWriteComplete),
                        pdwCancelID);
                }
                
                // marshal error codes.
                ppErrors = ComUtils.GetInt32s(errors); 
			}
			catch (Exception e)
			{
                Utils.Trace(e, "Error writing items.");
				throw ComUtils.CreateComException(e);
			}
		}
Exemple #39
0
        /// <summary>
        /// Adds random values to write.
        /// </summary>
        private void AddWriteValues(
            TestVariable variable, 
            WriteValueCollection nodesToWrite)
        {            
            WriteValue nodeToWrite = new WriteValue();
        
            nodeToWrite.NodeId = variable.Variable.NodeId;
            nodeToWrite.AttributeId = Attributes.Value;

            DataValue value = new DataValue();
            
            value.Value = m_generator.GetRandom(
                variable.Variable.DataType,
                variable.Variable.ValueRank,
                variable.Variable.ArrayDimensions,
                Session.TypeTree);
                
            value.StatusCode = StatusCodes.Good;
            value.ServerTimestamp = DateTime.MinValue;
            value.SourceTimestamp = DateTime.MinValue;

            variable.Values.Add(value);

            nodeToWrite.Value = value;
            nodeToWrite.Handle = variable;

            nodesToWrite.Add(nodeToWrite);
        }
 internal HistogramCounter(DataSet<InternalHistogram> dataSet)
     : base(dataSet)
 {
     this.histogram = dataSet; // this avoids repeated casting.
     this.writeValue = this.WriteUnroundedValue;
 }
Exemple #41
0
        /// <summary>
        /// Adds random values to write.
        /// </summary>
        private void AddWriteBadValues(
            TestVariable variable, 
            WriteValueCollection nodesToWrite)
        {           
            for (BuiltInType ii = BuiltInType.Null; ii < BuiltInType.DataValue; ii++)
            {
                if (variable.DataType != ii || variable.Variable.ValueRank >= 0)
                {
                    // add random scalar.
                    WriteValue nodeToWrite = new WriteValue();
                
                    nodeToWrite.NodeId = variable.Variable.NodeId;
                    nodeToWrite.AttributeId = Attributes.Value;

                    DataValue value = new DataValue();
                    
                    value.Value = m_generator.GetRandom(ii);                        
                    value.StatusCode = StatusCodes.Good;
                    value.ServerTimestamp = DateTime.MinValue;
                    value.SourceTimestamp = DateTime.MinValue;

                    variable.Values.Add(value);

                    nodeToWrite.Value = value;
                    nodeToWrite.Handle = variable;

                    nodesToWrite.Add(nodeToWrite);
                }

                if (variable.DataType != ii || variable.Variable.ValueRank == ValueRanks.Scalar)
                {
                    // add random array.
                    WriteValue nodeToWrite = new WriteValue();
                
                    nodeToWrite.NodeId = variable.Variable.NodeId;
                    nodeToWrite.AttributeId = Attributes.Value;

                    DataValue value = new DataValue();
                    
                    value.Value = m_generator.GetRandomArray(ii, true, 100, false);                        
                    value.StatusCode = StatusCodes.Good;
                    value.ServerTimestamp = DateTime.MinValue;
                    value.SourceTimestamp = DateTime.MinValue;

                    variable.Values.Add(value);

                    nodeToWrite.Value = value;
                    nodeToWrite.Handle = variable;

                    nodesToWrite.Add(nodeToWrite);
                }
            }
        }
        private void NewMI_Click(object sender, EventArgs e)
        {
            try
            {
                WriteValue value = new WriteValue();

                if (new WriteValueEditDlg().ShowDialog(m_session, value))
                {
                    AddItem(value);
                }

                AdjustColumns();
            }
            catch (Exception exception)
            {
				GuiUtils.HandleException(this.Text, MethodBase.GetCurrentMethod(), exception);
            }
        }
Exemple #43
0
        private void WriteMI_Click(object sender, EventArgs e)
        {
            try
            {
                if (NodesTV.SelectedNode == null)
                {
                    return;
                }
                                    
                ReferenceDescription reference = NodesTV.SelectedNode.Tag as ReferenceDescription;
                
                if (reference == null || (reference.NodeClass & (NodeClass.Variable | NodeClass.VariableType)) == 0)
                {
                    return;
                }

                Session session = m_browser.Session;

                // build list of nodes to read.
                WriteValueCollection values = new WriteValueCollection();

                WriteValue value = new WriteValue();

                value.NodeId      = (NodeId)reference.NodeId;
                value.AttributeId = Attributes.Value;
                value.IndexRange  = null;
                value.Value       = null;

                values.Add(value);

                // show form.
                new WriteDlg().Show(session, values);
            }
            catch (Exception exception)
            {
				GuiUtils.HandleException(this.Text, MethodBase.GetCurrentMethod(), exception);
            }
        }
Exemple #44
0
        /// <summary>
        /// Removes nodes that are not actually writeable.
        /// </summary>
        private void InitialWrite()
        {
            WriteValueCollection nodesToWrite = new WriteValueCollection();

            lock (m_variables)
            {
                for (int ii = 0; ii < m_variables.Count; ii++)
                {
                    TestVariable variable = m_variables[ii];
                    WriteValue nodeToWrite = new WriteValue();

                    nodeToWrite.NodeId = variable.Variable.NodeId;
                    nodeToWrite.AttributeId = Attributes.Value;

                    DataValue value = new DataValue();

                    if (!m_useDeadbandValues)
                    {
                        bool different = false;

                        do
                        {
                            value.Value = m_generator.GetRandom(
                                variable.Variable.DataType,
                                variable.Variable.ValueRank,
                                variable.Variable.ArrayDimensions,
                                Session.TypeTree);

                            if (variable.EURange != null)
                            {
                                value.Value = EnsureInRange(value.Value, variable.Variable, variable.EURange);
                            }

                            different = true;

                            for (int jj = variable.Values.Count - 1; jj >= 0; jj--)
                            {
                                if (m_comparer.CompareVariant(value.WrappedValue, variable.Values[jj].WrappedValue))
                                {
                                    different = false;
                                    break;
                                }

                                if (variable.DataType == BuiltInType.Boolean)
                                {
                                    break;
                                }
                            }
                        }
                        while (!different);
                    }

                    else
                    {
                        value.Value = IncrementValue(variable, m_deadbandCounter);
                    }

                    value.StatusCode = StatusCodes.Good;
                    value.ServerTimestamp = DateTime.MinValue;
                    value.SourceTimestamp = DateTime.MinValue;

                    nodeToWrite.Value = value;
                    nodeToWrite.Handle = variable.Values.Count;

                    nodesToWrite.Add(nodeToWrite);

                    variable.Values.Add(value);
                    variable.Timestamps.Add(DateTime.MinValue);
                }
            }

            StatusCodeCollection results;
            DiagnosticInfoCollection diagnosticInfos;

            DateTime now = DateTime.UtcNow;

            RequestHeader requestHeader = new RequestHeader();
            requestHeader.ReturnDiagnostics = 0;

            // need to check if the test completes and the next one starts while the write is in progress.
            ResponseHeader responseHeader = Session.Write(
                requestHeader,
                nodesToWrite,
                out results,
                out diagnosticInfos);

            ClientBase.ValidateResponse(results, nodesToWrite);
            ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToWrite);

            // check diagnostics.
            if (diagnosticInfos != null && diagnosticInfos.Count > 0)
            {
                Log("Returned non-empty DiagnosticInfos array during Write.");
                return;
            }

            // check results.
            lock (m_variables)
            {
                List<TestVariable> writeableVariables = new List<TestVariable>();

                for (int ii = 0; ii < nodesToWrite.Count; ii++)
                {
                    if (StatusCode.IsGood(results[ii]))
                    {
                        m_variables[ii].WriteError = false;
                        writeableVariables.Add(m_variables[ii]);
                    }
                }

                m_variables.Clear();
                m_variables.AddRange(writeableVariables);
            }
        }
Exemple #45
0
        /// <summary>
        /// Reads the attributes, verifies the results and updates the nodes.
        /// </summary>
        private bool Write(int counter)
        {
            bool success = true;
            m_deadbandCounter++;
            
            WriteValueCollection nodesToWrite = new WriteValueCollection();

            lock (m_variables)
            {
                if (m_stopped != 0 || counter != m_writeTimerCounter)
                {
                    return true;
                }

                for (int ii = 0; ii < m_variables.Count; ii++)
                {        
                    TestVariable variable = m_variables[ii];
                    WriteValue nodeToWrite = new WriteValue();
                
                    nodeToWrite.NodeId = variable.Variable.NodeId;
                    nodeToWrite.AttributeId = Attributes.Value;

                    DataValue value = new DataValue();
                    
                    if (!m_useDeadbandValues)
                    {
                        bool different = false;

                        do
                        {                        
                            value.Value = m_generator.GetRandom(
                                variable.Variable.DataType,
                                variable.Variable.ValueRank,
                                variable.Variable.ArrayDimensions,
                                Session.TypeTree);

                            if (variable.EURange != null)
                            {
                                value.Value = EnsureInRange(value.Value, variable.Variable, variable.EURange);
                            }

                            different = true;

                            for (int jj = variable.Values.Count-1; jj >= 0; jj--)
                            {
                                if (m_comparer.CompareVariant(value.WrappedValue, variable.Values[jj].WrappedValue))
                                {
                                    different = false;
                                    break;
                                }

                                if (variable.DataType == BuiltInType.Boolean)
                                {
                                    break;
                                }
                            }
                        }
                        while (!different);
                    }
                    
                    else
                    {
                        value.Value = IncrementValue(variable, m_deadbandCounter);
                    }

                    value.StatusCode = StatusCodes.Good;
                    value.ServerTimestamp = DateTime.MinValue;
                    value.SourceTimestamp = DateTime.MinValue;

                    nodeToWrite.Value = value;
                    nodeToWrite.Handle = variable.Values.Count;

                    nodesToWrite.Add(nodeToWrite);

                    variable.Values.Add(value);
                    variable.Timestamps.Add(DateTime.MinValue);
                }

                m_lastWriteTime = DateTime.UtcNow;
            }

            StatusCodeCollection results;
            DiagnosticInfoCollection diagnosticInfos;

            DateTime now = DateTime.UtcNow;

            RequestHeader requestHeader = new RequestHeader();
            requestHeader.ReturnDiagnostics = 0;

            // need to check if the test completes and the next one starts while the write is in progress.
            ResponseHeader responseHeader = Session.Write(
                requestHeader,
                nodesToWrite,
                out results,
                out diagnosticInfos);

            ClientBase.ValidateResponse(results, nodesToWrite);
            ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToWrite);
            
            // check diagnostics.
            if (diagnosticInfos != null && diagnosticInfos.Count > 0)
            {
                Log("Returned non-empty DiagnosticInfos array during Write.");
                return false;
            }

            // check results.
            lock (m_variables)
            {
                if (m_lastWriteTime > DateTime.MinValue && (DateTime.UtcNow - m_lastWriteTime).TotalMilliseconds > 300)
                {
                    m_writeDelayed = true;
                    Log("WARNING: A Write operation took {0}s. Test results may not be meaningful.", (DateTime.UtcNow - m_lastWriteTime).TotalSeconds);
                }

                m_lastWriteTime = DateTime.UtcNow;

                if (m_stopped != 0 || counter != m_writeTimerCounter)
                {
                    return true;
                }

                for (int ii = 0; ii < nodesToWrite.Count; ii++)
                {
                    TestVariable variable = m_variables[ii];

                    if (StatusCode.IsBad(results[ii]))
                    {
                        if (results[ii] == StatusCodes.BadTypeMismatch || results[ii] == StatusCodes.BadOutOfRange)
                        {
                            variable.WriteError = true;
                            continue;
                        }

                        Log("Unexpected error during Write.");
                        return false;
                    }

                    WriteValue request = nodesToWrite[ii];

                    variable.Timestamps[(int)request.Handle] = responseHeader.Timestamp;
                }

                m_writeCount++;
            }
            
            return success;
        }