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

SyncRead() public method

Performs n synchronous read operation.
public SyncRead ( uint maxAge, int serverHandles, bool isInitialRefresh, int clientHandles ) : DaValue[]
maxAge uint The max age.
serverHandles int The server handles.
isInitialRefresh bool if set to true the read is being done as part of the initial refresh for active items.
clientHandles int The client handles (must be allocated by the caller).
return DaValue[]
        public DaValue[] SyncRead(uint maxAge, int[] serverHandles, bool isInitialRefresh, int[] clientHandles)
        {
            TraceState("SyncRead", maxAge, serverHandles.Length);
            ThrowIfDisposed();

            DaValue[] results = new DaValue[serverHandles.Length];
            List<ComDaGroupItem> items = new List<ComDaGroupItem>(serverHandles.Length);
            ReadValueIdCollection valuesToRead = new ReadValueIdCollection();

            lock (m_lock)
            {
                // validate items.
                for (int ii = 0; ii < serverHandles.Length; ii++)
                {
                    results[ii] = new DaValue();

                    ComDaGroupItem item = null;

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

                    if (clientHandles != null)
                    {
                        clientHandles[ii] = item.ClientHandle;
                    }

                    // check for cache read.
                    if (maxAge == UInt32.MaxValue)
                    {
                        // inactive items cannot be read from cache.
                        if (!item.Active || !m_active)
                        {
                            results[ii].Quality = OpcRcw.Da.Qualities.OPC_QUALITY_OUT_OF_SERVICE;
                            results[ii].Timestamp = DateTime.UtcNow;
                            continue;
                        }
                      
                        // check if waiting for initial data.
                        if (item.CacheEntry == null)
                        {
                            results[ii].Quality = OpcRcw.Da.Qualities.OPC_QUALITY_WAITING_FOR_INITIAL_DATA;
                            results[ii].Timestamp = DateTime.UtcNow;
                            continue;
                        }

                        // get the latest value from the cache.
                        item.CacheEntry.GetLatest(results[ii]);
                        UpdateReadResult(item, results[ii]);
                        continue;
                    }

                    // apply max age.
                    if (maxAge > 0)
                    {
                        if (item.CacheEntry != null)
                        {
                            if (item.CacheEntry.CacheTimestamp.AddMilliseconds(maxAge) > DateTime.UtcNow)
                            {
                                item.CacheEntry.GetLatest(results[ii]);
                                UpdateReadResult(item, results[ii]);
                                continue;
                            }
                        }
                    }

                    // schedule read from device.
                    ReadValueId valueToRead = new ReadValueId();

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

                    valuesToRead.Add(valueToRead);
                    items.Add(item);
                }
            }

            if (valuesToRead.Count  == 0)
            {
                return results;
            }

            // read the values from the server.
            DaValue[] remoteResults = m_manager.Read(valuesToRead);
            
            // copy results.
            for (int ii = 0; ii < valuesToRead.Count; ii++)
            {
                int index = (int)valuesToRead[ii].Handle;

                if (isInitialRefresh)
                {
                    UpdateCache(items[ii], remoteResults[ii], isInitialRefresh);
                }

                UpdateReadResult(items[ii], remoteResults[ii]);
                results[(int)valuesToRead[ii].Handle] = remoteResults[ii];
            }

            return results;
        }