Ejemplo n.º 1
0
        /// <summary>
        /// Reads the value of the specified item property.
        /// </summary>
        public Opc.Da.ItemValueResult Read(string itemID, PropertyID propertyID)
        {
            lock (this)
            {
                // initialize result.
                ItemValueResult result = new ItemValueResult();

                result.ItemName       = itemID;
                result.ItemPath       = null;
                result.ResultID       = ResultID.S_OK;
                result.DiagnosticInfo = null;

                // lookup item.
                DeviceItem item = (DeviceItem)m_items[itemID];

                if (item == null)
                {
                    result.ResultID = ResultID.Da.E_UNKNOWN_ITEM_NAME;
                    return(result);
                }

                // read value.
                return(item.Read(propertyID));
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// 接收服务端数据回调
        /// </summary>
        /// <param name="ar"></param>
        private void ReadCallBack(IAsyncResult ar)
        {
            //接收到的数据长度
            int         receLen = 0;
            SocketError errorCode;

            try
            {
                receLen = m_socket.EndReceive(ar, out errorCode);
                char[] chars = new char[receLen + 1];
                // Extract the characters as a buffer
                System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
                int           charLen = d.GetChars(m_dataBuffer, 0, receLen, chars, 0);
                System.String szData  = new System.String(chars);
                // 构造事件
                ItemValueResult[] values = new ItemValueResult[1];
                values[0]          = new ItemValueResult();
                values[0].Value    = m_dataBuffer;
                values[0].ItemName = "MODBUS Client:" + m_socket.LocalEndPoint.ToString();
                base.OnDataChange(null, null, values);

                if (receLen > 0)
                {
                    string strLogin = "******" + szData;
                    byte[] data     = Encoding.ASCII.GetBytes(strLogin);
                    m_socket.BeginSend(data, 0, data.Length, SocketFlags.None, out errorCode, SendCallback, m_dataBuffer);//异步发送数据
                    //异步接受服务器回报的字符串
                    m_socket.BeginReceive(m_dataBuffer, 0, m_dataBuffer.Length, SocketFlags.None, ReadCallBack, m_dataBuffer);
                }
            }
            catch (Exception ex)
            {
                CLOGException.Trace("函数CommunicationLib.CTcpClientAccess.ReadCallBack 异常", CBaseMethods.MyBase.GetExceptionInfo(ex));
            }
        }
Ejemplo n.º 3
0
        protected override ItemValueResult[] Read(ItemIdentifier[] itemIDs, Item[] items)
        {
            ItemValueResult[] array      = new ItemValueResult[itemIDs.Length];
            ArrayList         arrayList  = new ArrayList();
            ArrayList         arrayList2 = new ArrayList();

            for (int i = 0; i < itemIDs.Length; i++)
            {
                array[i] = new ItemValueResult(itemIDs[i]);
                if (items[i].MaxAgeSpecified && (items[i].MaxAge < 0 || items[i].MaxAge == int.MaxValue))
                {
                    arrayList.Add(array[i]);
                }
                else
                {
                    arrayList2.Add(array[i]);
                }
            }

            if (arrayList.Count > 0)
            {
                Read((ItemValueResult[])arrayList.ToArray(typeof(ItemValueResult)), cache: true);
            }

            if (arrayList2.Count > 0)
            {
                Read((ItemValueResult[])arrayList2.ToArray(typeof(ItemValueResult)), cache: false);
            }

            return(array);
        }
        /// <summary>
        /// 初始化
        /// </summary>
        public override void Initialize(List <string> lstConnect)
        {
            // 打开TCP通信
            Open();

            // 添加items项
            m_lstItemValueResult.Clear();
            string[] fConnects = lstConnect.ToArray();
            for (int i = 0; i < fConnects.Length; i++)
            {
                ItemValueResult itemValue = new ItemValueResult()
                {
                    ItemName = fConnects[i]                                                 /* 该数据项在服务器中定义的名字*/
                };
                m_lstItemValueResult.Add(itemValue);
                itemValue = null;
            }
            fConnects = null;

            m_timer = new Timer()
            {
                Interval = m_updateRate,
                Enabled  = true
            };
            // 计时器启用
            m_timer.Elapsed += new ElapsedEventHandler(Timer_Tick);
            CLOGException.Trace("CommunicationLib.CTcpClientAccessTimer.Initialize", string.Format("{0}successfully", IP));
        }
        /// <summary>
        /// 初始化(是否添加定时器)
        /// </summary>
        public override void Initialize(List <string> lstConnect, bool isTimer)
        {
            // 打开TCP通信
            Open();

            // 添加items项
            m_lstItemValueResult.Clear();
            string[] fConnects = lstConnect.ToArray();
            for (int i = 0; i < fConnects.Length; i++)
            {
                ItemValueResult itemValue = new ItemValueResult()
                {
                    ItemName = fConnects[i]                                                 /* 该数据项在服务器中定义的名字*/
                };
                m_lstItemValueResult.Add(itemValue);
                itemValue = null;
            }
            fConnects = null;

            m_isAckHandler = isTimer;
            CLOGException.Trace("CommunicationLib.CTcpClientAccessTimer.Initialize", string.Format("{0}successfully, isTimer:{1}", IP, isTimer));
            if (isTimer)
            {
                while (true)
                {
                    Timer_Tick(this, null);
                    System.Threading.Thread.Sleep(m_updateRate);// CConfigManagement.myPara.ReadICCardRate);
                }
                //m_timer = new Timer() { Interval = m_updateRate /*ms*/, Enabled = true, /* 定义多次循环*/AutoReset = true };
                //// 计时器启用
                //m_timer.Elapsed += new ElapsedEventHandler(Timer_Tick);
            }
        }
        /// <summary>
        /// 根据Item索引获取数据块DB值、地址、长度
        /// </summary>
        /// <param name="itemNum"></param>
        /// <param name="nDB"></param>
        /// <param name="nStartAddr"></param>
        /// <param name="nLen"></param>
        private void GetItemDBAddress(int itemNum, ref int nDB, ref int nStartAddr, ref int nLen)
        {
            if (itemNum >= m_lstItemValueResult.Count || itemNum < 0)
            {
                return;
            }

            ItemValueResult item   = m_lstItemValueResult[itemNum];
            string          str    = item.ItemName;
            int             nIndex = str.IndexOf("DB");

            if (-1 == nIndex)
            {
                return;
            }

            str = str.Substring(nIndex + 2);
            str = str.Replace("INT", "");
            str = str.Replace("B", "");
            string[] strs = str.Split(',');

            if (2 == strs.Count())
            {
                int.TryParse(strs[0], out nDB);
                int.TryParse(strs[1], out nStartAddr);
                nLen = 1;
            }
            else if (3 == strs.Count())
            {
                int.TryParse(strs[0], out nDB);
                int.TryParse(strs[1], out nStartAddr);
                int.TryParse(strs[2], out nLen);
            }
        }
Ejemplo n.º 7
0
        //======================================================================
        // Read

        /// <summary>
        /// Reads the current values for a set of items.
        /// </summary>
        /// <param name="items">The set of items to read.</param>
        /// <returns>The results of the read operation for each item.</returns>
        public Opc.Da.ItemValueResult[] Read(Item[] items)
        {
            if (items == null)
            {
                throw new ArgumentNullException("items");
            }

            if (items.Length == 0)
            {
                return(new Opc.Da.ItemValueResult[0]);
            }

            lock (this)
            {
                ArrayList results = new ArrayList(items.Length);

                foreach (Item item in items)
                {
                    ItemValueResult result = m_cache.Read(item.ItemName, m_culture.Name, item.ReqType, (item.MaxAgeSpecified) ? item.MaxAge : 0);

                    if (result == null)
                    {
                        result = new ItemValueResult(item, ResultID.E_FAIL);
                    }

                    result.ClientHandle = item.ClientHandle;

                    results.Add(result);
                }

                return((ItemValueResult[])results.ToArray(typeof(ItemValueResult)));
            }
        }
Ejemplo n.º 8
0
        protected override ItemValueResult[] Read(ItemIdentifier[] itemIDs, Item[] items)
        {
            ItemValueResult[] resultArray = new ItemValueResult[itemIDs.Length];
            ArrayList         list        = new ArrayList();
            ArrayList         list2       = new ArrayList();

            for (int i = 0; i < itemIDs.Length; i++)
            {
                resultArray[i] = new ItemValueResult(itemIDs[i]);
                if (items[i].MaxAgeSpecified && ((items[i].MaxAge < 0) || (items[i].MaxAge == 0x7fffffff)))
                {
                    list.Add(resultArray[i]);
                }
                else
                {
                    list2.Add(resultArray[i]);
                }
            }
            if (list.Count > 0)
            {
                this.Read((ItemValueResult[])list.ToArray(typeof(ItemValueResult)), true);
            }
            if (list2.Count > 0)
            {
                this.Read((ItemValueResult[])list2.ToArray(typeof(ItemValueResult)), false);
            }
            return(resultArray);
        }
Ejemplo n.º 9
0
        /// <summary>
        /// Sync read tags
        /// </summary>
        /// <param name="values"></param>
        /// <returns></returns>
        public bool ReadValues(ref IOpcTag[] values) //ItemValueResult
        {
            if (!AddItems(values))
            {
                return(false);
            }

            var results = new ItemValueResult[] { };

            if (!SyncRead(ref results))
            {
                return(false);
            }

            if (values.Count() != results.Count())
            {
                return(false);
            }

            for (var i = 0; i < values.Count(); i++)
            {
                if (values[i].Address != results[i].ItemName)
                {
                    continue;
                }
                //values[i].IsGood = results[i].Quality == Quality.Good;
                values[i].Value = results[i].Quality == Quality.Good ?
                                  results[i].Value : null;
            }
            return(true);
        }
Ejemplo n.º 10
0
 private void UpdateDPResourceData(ItemValueResult value, List <DprData> dprdata)
 {
     dprdata[dprdata.FindIndex(delegate(DprData Dprdata)
     {
         return(Dprdata.Name == value.ItemName);
     })]
     .Value = System.Convert.ToDouble(value.Value);
 }
Ejemplo n.º 11
0
 private void UpdateCFResourceData(ItemValueResult value, List <ConfigurationData> configurationinfo)
 {
     configurationinfo[configurationinfo.FindIndex(delegate(ConfigurationData configurationdata)
     {
         return(configurationdata.Name == value.ItemName);
     })]
     .Value = System.Convert.ToDouble(value.Value);
 }
Ejemplo n.º 12
0
 private void UpdateNDResourceData(ItemValueResult value, List <NetWorkData> networkdata)
 {
     networkdata[networkdata.FindIndex(delegate(NetWorkData NetWorkdata)
     {
         return(NetWorkdata.Name == value.ItemName);
     })]
     .Value = System.Convert.ToDouble(value.Value);
 }
Ejemplo n.º 13
0
 private void UpdatePMResourceData(ItemValueResult value, List <PowerMeterData> powermeterdata)
 {
     powermeterdata[powermeterdata.FindIndex(delegate(PowerMeterData pmdata)
     {
         return(pmdata.Name == value.ItemName);
     })]
     .Value = System.Convert.ToDouble(value.Value);
 }
Ejemplo n.º 14
0
 private void UpdateMDResourceData(ItemValueResult value, List <ModuleInfo> moduleInfo)
 {
     moduleInfo[moduleInfo.FindIndex(delegate(ModuleInfo moduleInfodata)
     {
         return(moduleInfodata.Name == value.ItemName);
     })]
     .Value = System.Convert.ToDouble(value.Value);
 }
Ejemplo n.º 15
0
 private void UpdateASResourceData(ItemValueResult value, List <AlarmData> alarmsummary)
 {
     alarmsummary[alarmsummary.FindIndex(delegate(AlarmData alarmsummarydata)
     {
         return(alarmsummarydata.Name == value.ItemName);
     })]
     .Value = System.Convert.ToDouble(value.Value);
 }
Ejemplo n.º 16
0
 private void UpdateCDResourceData(ItemValueResult value, List <CPUData> cpudata)
 {
     cpudata[cpudata.FindIndex(delegate(CPUData cpudatadata)
     {
         return(cpudatadata.Name == value.ItemName);
     })]
     .Value = System.Convert.ToDouble(value.Value);
 }
Ejemplo n.º 17
0
 public static void OPCSubscription_DataChanged(object subscriptionHandle, object requestHandle, ItemValueResult[] tags)
 {
     // Display result whenever a tag value is updated
     for (int i = 0; i < tags.Length; i++)
     {
         Console.WriteLine(" ItemName: " + tags[i].ItemName);
         Console.WriteLine(" Value: " + tags[i].Value);
     }
 }
Ejemplo n.º 18
0
        /// <summary>
        /// Reads the value from the cache and converts it to the rqeuested type.
        /// </summary>
        public ItemValueResult Read(string locale, System.Type reqType, int maxAge, bool supportsCOM)
        {
            // read value from device.
            DateTime target = DateTime.Now.AddMilliseconds((maxAge < 0)?0:-maxAge);

            if (maxAge == 0 || m_value == null || target > m_value.Timestamp)
            {
                m_value           = m_device.Read(m_itemID, Property.VALUE);
                m_value.Timestamp = DateTime.Now;
            }

            ItemValueResult result = new ItemValueResult((ItemIdentifier)m_value);

            result.ResultID           = m_value.ResultID;
            result.DiagnosticInfo     = m_value.DiagnosticInfo;
            result.Quality            = m_value.Quality;
            result.QualitySpecified   = true;
            result.Timestamp          = m_value.Timestamp;
            result.TimestampSpecified = true;

            if (m_value.ResultID.Succeeded())
            {
                try
                {
                    if (m_euType != euType.enumerated || reqType != typeof(string))
                    {
                        result.Value = ChangeType(m_value.Value, reqType, locale, supportsCOM);
                    }
                    else
                    {
                        result.Value = m_euInfo[System.Convert.ToInt32(m_value.Value)];
                    }
                }
                catch (OverflowException e)
                {
                    result.ResultID       = ResultID.Da.E_RANGE;
                    result.DiagnosticInfo = e.Message;
                }
                catch (InvalidCastException e)
                {
                    result.ResultID       = ResultID.Da.E_RANGE;
                    result.DiagnosticInfo = e.Message;
                }
                catch (ResultIDException e)
                {
                    result.ResultID       = e.Result;
                    result.DiagnosticInfo = e.Message;
                }
                catch (Exception e)
                {
                    result.ResultID       = ResultID.Da.E_BADTYPE;
                    result.DiagnosticInfo = e.Message;
                }
            }

            return(result);
        }
Ejemplo n.º 19
0
        //======================================================================
        // Write

        /// <summary>
        /// Writes the value, quality and timestamp for a set of items.
        /// </summary>
        /// <param name="items">The set of item values to write.</param>
        /// <returns>The results of the write operation for each item.</returns>
        public IdentifiedResult[] Write(ItemValue[] items)
        {
            if (items == null)
            {
                throw new ArgumentNullException("items");
            }

            if (items.Length == 0)
            {
                return(new Opc.IdentifiedResult[0]);
            }

            lock (this)
            {
                if (m_proxy == null)
                {
                    throw new NotConnectedException();
                }

                ItemValueList list = new ItemValueList();
                list.AddRange(items);

                OpcXml.Da10.RequestOptions       options     = OpcXml.Da10.Request.GetRequestOptions(m_options.Locale, m_options.Filters);
                OpcXml.Da10.WriteRequestItemList requestList = OpcXml.Da10.Request.GetItemValueList(list);
                OpcXml.Da10.ReplyItemList        replyList   = null;
                OpcXml.Da10.OPCError[]           errors      = null;

                OpcXml.Da10.ReplyBase reply = m_proxy.Write(
                    options,
                    requestList,
                    false,
                    out replyList,
                    out errors);

                CacheResponse(m_options.Locale, reply, errors);

                ItemValueResultList valueList = OpcXml.Da10.Request.GetResultList(replyList);

                if (valueList == null)
                {
                    throw new InvalidResponseException();
                }

                IdentifiedResult[] results = new IdentifiedResult[valueList.Count];

                for (int ii = 0; ii < valueList.Count; ii++)
                {
                    ItemValueResult valueResult = valueList[ii];

                    results[ii]                = new IdentifiedResult(valueResult);
                    results[ii].ResultID       = valueResult.ResultID;
                    results[ii].DiagnosticInfo = valueResult.DiagnosticInfo;
                }

                return(results);
            }
        }
Ejemplo n.º 20
0
        public static ItemValueResult[] RsLinx_OPC_Client_Read_Array(string ItemName, int Length)
        {
            try
            {
                //Creo un istanza di OPC.server
                Opc.Da.Server server;
                //Parametro necessario alla connect
                OpcCom.Factory fact = new OpcCom.Factory();
                //Creo un istanza di Sottoscrizione
                Opc.Da.Subscription groupRead;
                //Creo un istanza di SubscriptionState, utile per controllare lo stato della sottoscrizione
                Opc.Da.SubscriptionState groupState;
                //Creo un array di OPC.Da.Item
                Opc.Da.Item[] items = new Opc.Da.Item[1];
                //Setto factory e url del server, come url utilizzo quello del RSLinx OPC Server
                server     = new Opc.Da.Server(fact, null);
                server.Url = new Opc.URL(Url);

                //Connetto il server
                server.Connect();

                //Istanzio la sottoscrizione
                groupState            = new Opc.Da.SubscriptionState();
                groupState.Name       = "Group";
                groupState.UpdateRate = UpdateRate; //Setto il tempo di Refresh del gruppo
                groupState.Active     = true;       //Questo valore deve essere true se voglio aver la possibilità di leggere
                //Creo il gruppo sul server
                groupRead = (Opc.Da.Subscription)server.CreateSubscription(groupState);
                //Istanzio l'Item
                items[0] = new Opc.Da.Item();
                //Gli do il nome (Rockwell utilizza questa formzattazione dei nomi per gli array
                //[NomeTopicOPC]NomeTag,LDimensioneArray es. [MyOPCTopic]Posizione,L50)
                items[0].ItemName = $"{ItemName},L{Length}";

                //Aggiungo l'oggetto al gruppo
                items = groupRead.AddItems(items);
                //Leggo il valore dell'item aggiunto
                ItemValueResult[] Ritorno = groupRead.Read(items);

                //Controllo che la lettura dell'array sia andata a buon fine, se non è così lancio un'eccezione
                if (!Ritorno[0].ResultID.Name.Name.Equals("S_OK"))
                {
                    throw new System.Exception("Errore lettura OPC Tag");
                }
                return(groupRead.Read(items));
            }
            catch (Exception ex)
            {
                //Se viene lanciata un'eccezione ritorno un array di ItemValueResult con il primo che ha valore -1 e mostro un Messagebox con l'errore
                MessageBox.Show(ex.Message);
                ItemValueResult[] Errore = new ItemValueResult[1];
                Errore[0] = new ItemValueResult();
                float[] Err = { (float)-1, (float)-1 };
                Errore[0].Value = Err;
                return(Errore);
            }
        }
Ejemplo n.º 21
0
 public void Add(ItemValueResult value)
 {
     if (!IsGoodValue(value) || // Do not accumulate the bad values
         (acc.Count == 1 && !IsGoodValue(acc[0])))
     {
         acc.Clear();
     }
     acc.Add(value);
     dirty = true;
 }
Ejemplo n.º 22
0
            private ItemValueResult CreateBadResult()
            {
                ItemValueResult res = new ItemValueResult(item);

                res.TimestampSpecified = false;
                res.Quality            = Quality.Bad;
                res.QualitySpecified   = true;
                res.ResultID           = Opc.ResultID.S_OK;
                return(res);
            }
Ejemplo n.º 23
0
        internal static object ReadProperty(PropertyID propertyID, IDeviceIndexed device, ushort ItemIndex)
        {
            ItemValueResult result = device.Read(ItemIndex, propertyID);

            if (result == null || result.ResultID.Failed())
            {
                return(null);
            }
            return(result.Value);
        }
Ejemplo n.º 24
0
        /// <summary>
        /// Reads the next sample from the device.
        /// </summary>
        private void DoSample(string locale, float deadband)
        {
            if (!m_active)
            {
                return;
            }

            // read latest value from device.
            ItemValueResult currentValue = m_cache.Read(m_itemID, locale, m_reqType, 0);

            // check if value has changed.
            bool changed = true;

            // always return for error.
            if (m_latestValue != null)
            {
                // compare value to last returned value if sampling has not started yet.
                if (m_samples.Count == 0)
                {
                    changed = HasChanged(currentValue, m_latestValue, deadband);
                }

                // compare to previous sample if sampling has started.
                else if (m_bufferEnabled)
                {
                    changed = HasChanged(currentValue, (ItemValueResult)m_samples[m_samples.Count - 1], 0);
                }
            }

            // add changed value to the buffer.
            if (changed)
            {
                // clear buffer.
                if (!m_bufferEnabled)
                {
                    m_samples.Clear();
                }

                // check if buffer length is exceeded.
                if (m_samples.Count >= MAX_BUFFER_LENGTH)
                {
                    if (currentValue.ResultID == ResultID.S_OK)
                    {
                        currentValue.ResultID = ResultID.Da.S_DATAQUEUEOVERFLOW;
                    }

                    m_samples.RemoveAt(0);
                    m_overflow = true;
                }

                // add new sample to buffer.
                m_samples.Add(currentValue);
            }
        }
Ejemplo n.º 25
0
        /// <summary>
        /// Reads the value of the specified property.
        /// </summary>
        public object ReadProperty(PropertyID propertyID)
        {
            ItemValueResult result = m_device.Read(m_itemID, propertyID);

            if (result == null || result.ResultID.Failed())
            {
                return(null);
            }

            return(result.Value);
        }
Ejemplo n.º 26
0
        public static string WriteValue(string nodeName, double value)
        {
            Opc.ItemIdentifier itemId = new Opc.ItemIdentifier(nodeName);
            ItemValueResult    it     = new ItemValueResult(itemId);

            it.Value = value;

            server.Write(new ItemValueResult[] { it });

            return("Masz ty RiGCz? wpisałeś  " + value + " do węzła " + nodeName);
        }
Ejemplo n.º 27
0
            private ItemValueResult CreateResult(object value, DateTime timestamp)
            {
                ItemValueResult res = new ItemValueResult(item);

                res.Timestamp          = timestamp;
                res.TimestampSpecified = true;
                res.Value            = value;
                res.Quality          = Quality.Good;
                res.QualitySpecified = true;
                res.ResultID         = Opc.ResultID.S_OK;
                return(res);
            }
Ejemplo n.º 28
0
        private bool IsResultsPassed(ItemValueResult[] results)
        {
            int numTagsPassed = 0;
            for (int i = 0; i < results.Length; i++)
            {
                var boolValue = Convert.ToBoolean(results[i].Value.ToString());

                if (boolValue)
                    numTagsPassed++;
            }
            return (numTagsPassed == results.Length) ? true : false;
        }
Ejemplo n.º 29
0
 private static bool IsGoodValue(ItemValueResult valueRes)
 {
     if (valueRes != null && valueRes.ResultID.Succeeded() &&
         valueRes.QualitySpecified && valueRes.TimestampSpecified)
     {
         if (valueRes.Timestamp != null && valueRes.Quality != null)
         {
             return(valueRes.Quality.QualityBits == Opc.Da.qualityBits.good);
         }
     }
     return(false);
 }
Ejemplo n.º 30
0
        /// <remarks/>
        public ItemValueResult[] Read(Item[] items)
        {
            if (items == null)
            {
                throw new ArgumentNullException("items");
            }

            lock (this)
            {
                // handle trivial case.
                if (items.Length == 0)
                {
                    return(new ItemValueResult[0]);
                }

                // create item results.
                ItemValueResult[] results = new ItemValueResult[items.Length];

                for (int ii = 0; ii < items.Length; ii++)
                {
                    // initialize result with item.
                    results[ii] = new ItemValueResult(items[ii]);

                    // check for invalid handle.
                    if (items[ii].ServerHandle == null)
                    {
                        results[ii].ResultID = ResultID.Da.E_INVALIDHANDLE;
                        continue;
                    }

                    // lookup subscription item.
                    SubscriptionItem item = (SubscriptionItem)m_items[items[ii].ServerHandle];

                    if (item == null)
                    {
                        results[ii].ResultID = ResultID.Da.E_INVALIDHANDLE;
                        continue;
                    }

                    // read the item value.
                    results[ii] = item.Read(m_state.Active, m_state.Locale, items[ii].MaxAge);
                    results[ii].ServerHandle = items[ii].ServerHandle;
                }

                // apply result filters.
                ApplyFilters(m_filters, results);

                // return results.
                return(results);
            }
        }
Ejemplo n.º 31
0
        /// <summary>
        /// Reads the value from the cache and converts it to the rqeuested type.
        /// </summary>
        internal ItemValueResult Read(string locale, System.Type reqType, int maxAge, bool supportsCOM)
        {
            // read value from device.
            DateTime target = DateTimeProvider.GetCurrentTime().AddMilliseconds((maxAge < 0) ? 0 : -maxAge);



            ItemValueResult result = m_settings.ReadNewValue(maxAge, target);

            if (result.ResultID.Succeeded())
            {
                try
                {
                    object currentvalue = result.Value;
                    if (m_settings.EuType != euType.enumerated || reqType != typeof(string))
                    {
                        result.Value = ChangeType(currentvalue, reqType, locale, supportsCOM);
                    }
                    else
                    {
                        result.Value = m_settings.EuInfo[System.Convert.ToInt32(currentvalue)];
                    }
                }
                catch (OverflowException e)
                {
                    result.Quality        = Quality.Bad;
                    result.ResultID       = ResultID.Da.E_RANGE;
                    result.DiagnosticInfo = e.Message;
                }
                catch (InvalidCastException e)
                {
                    result.Quality        = Quality.Bad;
                    result.ResultID       = ResultID.Da.E_RANGE;
                    result.DiagnosticInfo = e.Message;
                }
                catch (ResultIDException e)
                {
                    result.Quality        = Quality.Bad;
                    result.ResultID       = e.Result;
                    result.DiagnosticInfo = e.Message;
                }
                catch (Exception e)
                {
                    result.Quality        = Quality.Bad;
                    result.ResultID       = ResultID.Da.E_BADTYPE;
                    result.DiagnosticInfo = e.Message;
                }
            }
            return(result);
        }
Ejemplo n.º 32
0
        /// <summary>
        /// 侦听到客户端数据回调his the call back function which will be invoked when the socket
        /// detects any client writing of data on the stream
        /// </summary>
        /// <param name="asyn"></param>
        private void ReadCallBack(IAsyncResult asyn)
        {
            SocketPacket socketData = (SocketPacket)asyn.AsyncState;

            try
            {
                // Complete the BeginReceive() asynchronous call by EndReceive() method
                // which will return the number of characters written to the stream
                // by the client
                int    iRx   = socketData.m_currentSocket.EndReceive(asyn);
                char[] chars = new char[iRx + 1];
                // Extract the characters as a buffer
                System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
                int           charLen = d.GetChars(socketData.dataBuffer, 0, iRx, chars, 0);
                System.String szData  = new System.String(chars);

                // 构造事件
                ItemValueResult[] values = new ItemValueResult[1];
                values[0]          = new ItemValueResult();
                values[0].Value    = socketData.dataBuffer;
                values[0].ItemName = "MODBUS Server:" + socketData.m_currentSocket.LocalEndPoint.ToString();
                base.OnDataChange(null, null, values);

                // Send back the reply to the client
                string replyMsg = "Server Reply:" + szData.ToUpper();
                // Convert the reply to byte array
                byte[] byData = System.Text.Encoding.ASCII.GetBytes(replyMsg);

                Socket workerSocket = (Socket)socketData.m_currentSocket;
                workerSocket.Send(byData);

                // Continue the waiting for data on the Socket
                WaitForData(socketData.m_currentSocket, socketData.m_clientNumber);
            }
            catch (ObjectDisposedException ex)
            {
                System.Diagnostics.Debugger.Log(0, "1", "\nOnDataReceived: Socket has been closed\n");
                CLOGException.Trace("函数CommunicationLib.CTcpServerAccess.ReadCallBack 异常", CBaseMethods.MyBase.GetExceptionInfo(ex));
            }
            catch (SocketException ex)
            {
                if (ex.ErrorCode == 10054) // Error code for Connection reset by peer
                {
                    // Remove the reference to the worker socket of the closed client
                    // so that this object will get garbage collected
                    m_workerSocketList[socketData.m_clientNumber - 1] = null;
                }
                CLOGException.Trace("函数CommunicationLib.CTcpServerAccess.ReadCallBack 异常", CBaseMethods.MyBase.GetExceptionInfo(ex));
            }
        }
Ejemplo n.º 33
0
 private void _group_DataChanged(object subscriptionHandle, object requestHandle, ItemValueResult[] values)
 {
     lock (_itemValues)
     {
         foreach (var value in values)
         {
             _itemValues[value.ItemName] = value.Value;
         }
     }
 }
Ejemplo n.º 34
0
        /// <summary>
        /// Reads the value from the cache and converts it to the rqeuested type.
        /// </summary>
        public ItemValueResult Read(string locale, System.Type reqType, int maxAge, bool supportsCOM)
        {
            // read value from device.
            DateTime target = DateTime.Now.AddMilliseconds((maxAge < 0)?0:-maxAge);

            if (maxAge == 0 || m_value == null || target > m_value.Timestamp)
            {
                m_value = m_device.Read(m_itemID, Property.VALUE);
                m_value.Timestamp = DateTime.Now;
            }

            ItemValueResult result = new ItemValueResult((ItemIdentifier)m_value);

            result.ResultID           = m_value.ResultID;
            result.DiagnosticInfo     = m_value.DiagnosticInfo;
            result.Quality            = m_value.Quality;
            result.QualitySpecified   = true;
            result.Timestamp          = m_value.Timestamp;
            result.TimestampSpecified = true;

            if (m_value.ResultID.Succeeded())
            {
                try
                {
                    if (m_euType != euType.enumerated || reqType != typeof(string))
                    {
                        result.Value = ChangeType(m_value.Value, reqType, locale, supportsCOM);
                    }
                    else
                    {
                        result.Value = m_euInfo[System.Convert.ToInt32(m_value.Value)];
                    }
                }
                catch (OverflowException e)
                {
                    result.ResultID = ResultID.Da.E_RANGE;
                    result.DiagnosticInfo = e.Message;
                }
                catch (InvalidCastException e)
                {
                    result.ResultID = ResultID.Da.E_RANGE;
                    result.DiagnosticInfo = e.Message;
                }
                catch (ResultIDException e)
                {
                    result.ResultID = e.Result;
                    result.DiagnosticInfo = e.Message;
                }
                catch (Exception e)
                {
                    result.ResultID = ResultID.Da.E_BADTYPE;
                    result.DiagnosticInfo = e.Message;
                }
            }

            return result;
        }
Ejemplo n.º 35
0
 public void OPCSubscription_DataChanged(object subscriptionHandle, object requestHandle, ItemValueResult[] values)
 {
     // Display result
     for (int i = 0; i < values.Length; i++)
     {
         OpcItem syncedItem = new OpcItem();
         syncedItem.ItemName = values[i].ItemName;
         syncedItem.Value = values[i].Value;
         Console.WriteLine("ItemName" + syncedItem.ItemName);
         Console.WriteLine("Value" + syncedItem.Value);
     }
 }
        /// <summary>
        /// Determines whether the value has changed.
        /// </summary>
        private bool HasChanged(ItemValueResult newValue, ItemValueResult oldValue, float deadband)
        {
            // check if the error code has changed.
            if (newValue.ResultID != oldValue.ResultID)
            {
                return true;
            }

            // check if the quality has changed.
            if (newValue.Quality != oldValue.Quality)
            {
                return true;
            }

            // check for trivial case.
            if (newValue.Value == null || oldValue.Value == null)
            {
                return newValue.Value != oldValue.Value;
            }

            // check if the value is the same.
            if (Opc.Convert.Compare(newValue.Value, oldValue.Value))
            {
                return false;
            }

            // check deadband if required.
            double percentage = ((m_deadband != -1)?m_deadband:deadband)/100;

            if (m_euType != euType.analog || percentage == 0)
            {
                return true;
            }

            // check for trival case.
            double range = m_maxValue - m_minValue;

            if (range == 0)
            {
                return true;
            }

            // handle array values.
            if (newValue.Value.GetType().IsArray && oldValue.Value.GetType().IsArray)
            {
                Array newArray = (Array)newValue.Value;
                Array oldArray = (Array)oldValue.Value;

                if (newArray.Length != oldArray.Length)
                {
                    return true;
                }

                // deadband is exceeded whenever a single element exceeds the deadband.
                for (int ii = 0; ii < newArray.Length; ii++)
                {
                    try
                    {
                        double newElement = System.Convert.ToDouble(newArray.GetValue(ii));
                        double oldElement = System.Convert.ToDouble(oldArray.GetValue(ii));

                        if (Math.Abs((newElement - oldElement)/range) > percentage)
                        {
                            return true;
                        }
                    }
                    catch
                    {
                        return true;
                    }
                }
            }

                // handle scalar values.
            else
            {
                try
                {
                    double newElement = System.Convert.ToDouble(newValue.Value);
                    double oldElement = System.Convert.ToDouble(oldValue.Value);

                    if (Math.Abs((newElement - oldElement)/range) > percentage)
                    {
                        return true;
                    }
                }
                catch
                {
                    return true;
                }
            }

            // deadband not exceeded.
            return false;
        }
 /// <summary>
 /// Clears the last value sent to the client.
 /// </summary>
 public void ResetLastUpdate()
 {
     m_latestValue = null;
 }
Ejemplo n.º 38
0
        /// <summary>
        /// Reads the value of the specified item property.
        /// </summary>
        public Opc.Da.ItemValueResult Read(PropertyID propertyID)
        {
            // initialize value and validate property.
            ItemValueResult value = new ItemValueResult();

            value.ItemName           = m_itemID;
            value.ItemPath           = null;
            value.ResultID           = ValidatePropertyID(propertyID, accessRights.readable);
            value.DiagnosticInfo     = null;
            value.Value              = null;
            value.Quality            = Quality.Bad;
            value.QualitySpecified   = false;
            value.Timestamp          = DateTime.MinValue;
            value.TimestampSpecified = false;

            if (value.ResultID.Failed())
            {
                return value;
            }

            // set default quality and timestamp (overridden when returning the item value).
            value.Quality            = Quality.Good;
            value.QualitySpecified   = true;
            value.Timestamp          = DateTime.UtcNow;
            value.TimestampSpecified = true;

            // read the property value.
            switch (propertyID.Code)
            {
                case VALUE:
                {
                    value.Value     = Opc.Convert.Clone(m_value);
                    value.Quality   = m_quality;
                    value.Timestamp = m_timestamp;
                    break;
                }

                // standard properties.
                case DATATYPE:     { value.Value = m_datatype;     break; }
                case QUALITY:      { value.Value = m_quality;      break; }
                case TIMESTAMP:    { value.Value = m_timestamp;    break; }
                case ACCESSRIGHTS: { value.Value = m_accessRights; break; }
                case SCANRATE:     { value.Value = m_scanRate;     break; }
                case EUTYPE:       { value.Value = m_euType;       break; }
                case EUINFO:       { value.Value = m_euInfo;       break; }
                case HIGHEU:       { value.Value = m_maxValue;     break; }
                case LOWEU:        { value.Value = m_minValue;     break; }

                case MINIMUM_VALUE:
                {
                    if (m_datatype == typeof(DateTime))
                    {
                        value.Value = DateTime.MinValue;
                        break;
                    }

                    if (m_datatype == typeof(Decimal))
                    {
                        value.Value = Decimal.MinValue;
                        break;
                    }

                    value.Value = null;
                    break;
                }

                case MAXIMUM_VALUE:
                {
                    if (m_datatype == typeof(DateTime))
                    {
                        value.Value = DateTime.MaxValue;
                        break;
                    }

                    if (m_datatype == typeof(Decimal))
                    {
                        value.Value = Decimal.MaxValue;
                        break;
                    }

                    value.Value = null;
                    break;
                }

                case VALUE_PRECISION:
                {
                    if (m_datatype == typeof(DateTime))
                    {
                        value.Value = 1/(double)TimeSpan.TicksPerMillisecond;
                        break;
                    }

                    if (m_datatype == typeof(Decimal))
                    {
                        value.Value = 28;
                        break;
                    }

                    value.Value = null;
                    break;
                }

                // other defined properties.
                default:
                {
                    if (!m_properties.Contains(propertyID))
                    {
                        value.ResultID = ResultID.Da.E_INVALID_PID;
                        break;
                    }

                    value.Value = m_properties[propertyID];
                    break;
                }
            }

            // read completed successfully.
            return value;
        }
        /// <summary>
        /// Copies all samples since the last update into a buffer.
        /// </summary>
        public bool ReadSamples(ArrayList samples)
        {
            if (m_samples.Count == 0)
            {
                return false;
            }

            // save latest returned value.
            m_latestValue = (ItemValueResult)((ItemValueResult)m_samples[m_samples.Count-1]).Clone();

            // copy samples into buffer.
            foreach (ItemValueResult sample in m_samples)
            {
                sample.ClientHandle = ClientHandle;
                sample.ServerHandle = ServerHandle;
                samples.Add(sample);
            }

            bool overflow = m_overflow;

            // clear the buffer.
            m_samples.Clear();
            m_overflow = false;

            // return flag indicated whether an overflow occurred.
            return overflow;
        }
Ejemplo n.º 40
0
        private void Group_DataChanged (object subscriptionHandle, object requestHandle, ItemValueResult[] values)
        {
            if (OpcTagUpdate != null)
            {
                for (int i = 0; i < values.Length; i++)
                {
                    string name = values[i].ItemName.Substring(values[i].ItemName.LastIndexOf(".") + 1);
                    int value = System.Convert.ToInt32(values[i].Value);
                    OpcTagUpdate(name, value);

                    string opcTagInfoMessage = String.Format("{0}{1}{2}{3}{4}", "OPC - TAGUPDATE > ", "Name:", name, " Value:", value.ToString());
                    _logger.LogInfo(opcTagInfoMessage);
                }
            }
        }
Ejemplo n.º 41
0
        //======================================================================
        // Read
        /// <summary>
        /// Reads the current values for a set of items. 
        /// </summary>
        /// <param name="items">The set of items to read.</param>
        /// <returns>The results of the read operation for each item.</returns>
        public Opc.Da.ItemValueResult[] Read(Item[] items)
        {
            if (items == null)   throw new ArgumentNullException("items");

            if (items.Length == 0)
            {
                return new Opc.Da.ItemValueResult[0];
            }

            lock (this)
            {
                ArrayList results = new ArrayList(items.Length);

                foreach (Item item in items)
                {
                    ItemValueResult result = m_cache.Read(item.ItemName, m_culture.Name, item.ReqType, (item.MaxAgeSpecified)?item.MaxAge:0);

                    if (result == null)
                    {
                        result = new ItemValueResult(item, ResultID.E_FAIL);
                    }

                    result.ClientHandle = item.ClientHandle;

                    results.Add(result);
                }

                return (ItemValueResult[])results.ToArray(typeof(ItemValueResult));
            }
        }