Opc.Ua.Com.Server.ComDaGroup.SetItemSamplingRates C# (CSharp) Method

SetItemSamplingRates() public method

Sets the sampling rate for the items.
public SetItemSamplingRates ( int serverHandles, int samplingRates, int revisedSamplingRates ) : int[]
serverHandles int The server handles.
samplingRates int The sampling rates.
revisedSamplingRates int The revised sampling rates.
return int[]
        public int[] SetItemSamplingRates(int[] serverHandles, int[] samplingRates, int[] revisedSamplingRates)
        {
            TraceState("SetItemSamplingRates", serverHandles.Length);
            ThrowIfDisposed();

            int[] errors = new int[serverHandles.Length];
            ComDaGroupItem[] items = new ComDaGroupItem[serverHandles.Length];

            lock (m_lock)
            {
                // update the filter for analog items that have not overriden the deadband.
                for (int ii = 0; ii < serverHandles.Length; ii++)
                {
                    ComDaGroupItem item = null;

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

                    item.MonitoredItem.SamplingInterval = (int)(samplingRates[ii]/2);
                    revisedSamplingRates[ii] = 0;
                    items[ii] = item;
                }

                // update the items on the server.
                try
                {
                    m_subscription.ApplyChanges();
                }
                catch (Exception e)
                {
                    int error = ComUtils.GetErrorCode(e, ResultIds.E_FAIL);

                    for (int ii = 0; ii < items.Length; ii++)
                    {
                        if (items[ii] != null)
                        {
                            errors[ii] = error;
                        }
                    }

                    return errors;
                }

                // check results for monitored items.
                for (int ii = 0; ii < items.Length; ii++)
                {
                    ComDaGroupItem item = items[ii];
                    
                    if (item == null)
                    {
                        continue;                    
                    }

                    if (ServiceResult.IsBad(item.MonitoredItem.Status.Error))
                    {
                        errors[ii] = ResultIds.E_FAIL;
                        continue;
                    }
                    
                    item.SamplingRate = samplingRates[ii];
                    item.ActualSamplingRate = (int)(items[ii].MonitoredItem.Status.SamplingInterval);

                    // if 1/2 the sampling rate is accepted then it is possible to guarantee the sampling rate.
                    if (item.ActualSamplingRate < item.SamplingRate)
                    {
                        item.ActualSamplingRate =  item.SamplingRate;
                    }

                    // can only guarantee a sampling rate of twice what the UA server can provide.
                    else
                    {
                        item.ActualSamplingRate *= 2;
                    }

                    revisedSamplingRates[ii] = item.ActualSamplingRate;
                    item.NextUpdateTime = HiResClock.UtcNow.Ticks + item.ActualSamplingRate*TimeSpan.TicksPerMillisecond;

                    if (revisedSamplingRates[ii] != samplingRates[ii])
                    {
                        errors[ii] = ResultIds.S_UNSUPPORTEDRATE;
                    }

                    TraceState(
                        "ItemSamplingUpdated",
                        this.ServerHandle,
                        item.ServerHandle,
                        item.ClientHandle,
                        m_subscription.CurrentPublishingEnabled,
                        m_subscription.CurrentPublishingInterval,
                        item.SamplingRate,
                        item.MonitoredItem.Status.SamplingInterval);
                }

                return errors;
            }
        }