Esempio n. 1
0
        /// <summary>
        /// Called when a data change event arrives.
        /// </summary>
        /// <param name="clientHandles">The client handles.</param>
        /// <param name="values">The values.</param>
        internal void OnDataChange(int[] clientHandles, DaValue[] values)
        {
            // check if callbacks are enabled.
            if (m_monitoredItems == null)
            {
                return;
            }

            // lookup client handle a report change directly to monitored item.
            lock (m_monitoredItems)
            {
                for (int ii = 0; ii < clientHandles.Length; ii++)
                {
                    DataChangeInfo info = null;

                    if (!m_monitoredItems.TryGetValue(clientHandles[ii], out info))
                    {
                        continue;
                    }

                    MonitoredItem[] monitoredItems = info.MonitoredItems;

                    // convert the value to a UA value.
                    info.LastValue = new DataValue();
                    info.LastError = ReadRequest.GetItemValue(values[ii], info.LastValue, DiagnosticsMasks.All);
                    info.LastValue.ServerTimestamp = DateTime.UtcNow;

                    // queue the values.
                    for (int jj = 0; jj < monitoredItems.Length; jj++)
                    {
                        monitoredItems[jj].QueueValue(info.LastValue, info.LastError);
                    }
                }
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Reads the property values and stores the results in the request objects.
        /// </summary>
        /// <param name="requests">The requests.</param>
        public void ReadPropertyValues(List <ReadRequest> requests)
        {
            for (int ii = 0; ii < requests.Count; ii++)
            {
                ReadRequest request = requests[ii];

                if (request != null && request.PropertyIds != null)
                {
                    request.PropertyValues = ReadPropertyValues(
                        request.ItemId,
                        request.PropertyIds.ToArray());
                }
            }
        }
Esempio n. 3
0
        /// <summary>
        /// Reads the item values and stores the results in the request object.
        /// </summary>
        /// <param name="requests">The requests.</param>
        public void ReadItemValues(List <ReadRequest> requests)
        {
            ComDaGroup group = new ComDaGroup(this, false);

            try
            {
                int           count1          = 0;
                GroupItem[]   items           = new GroupItem[requests.Count];
                ReadRequest[] addItemRequests = new ReadRequest[requests.Count];

                // create the items in the temporary group.
                for (int ii = 0; ii < requests.Count; ii++)
                {
                    ReadRequest request = requests[ii];

                    if (request == null)
                    {
                        continue;
                    }

                    if (!request.ValueRequired)
                    {
                        continue;
                    }

                    // add the item.
                    items[count1]           = group.CreateItem(request.ItemId, 0, 0, true);
                    addItemRequests[count1] = request;
                    count1++;
                }

                // create the items on the server.
                group.ApplyChanges();

                // build the list of values to write.
                int           count2        = 0;
                int[]         serverHandles = new int[count1];
                ReadRequest[] readRequests  = new ReadRequest[count1];

                for (int ii = 0; ii < count1; ii++)
                {
                    // check for error on create.
                    GroupItem   item    = items[ii];
                    ReadRequest request = addItemRequests[ii];

                    if (item.ErrorId < 0)
                    {
                        request.Value.Error = item.ErrorId;
                        continue;
                    }

                    serverHandles[count2] = item.ServerHandle;
                    readRequests[count2]  = request;
                    count2++;
                }

                // write values to the server.
                DaValue[] values = group.SyncRead(serverHandles, count2);

                // read the values.
                for (int ii = 0; ii < count2; ii++)
                {
                    readRequests[ii].Value = values[ii];
                }
            }
            finally
            {
                // delete the group and items.
                group.Delete();
            }
        }