Exemple #1
0
        public int BatchWrite(SortedDictionary <ITag, object> items, bool isSync = true)
        {
            int rev = ExtMethods.BatchWrite(items);

            if (DataChange != null && rev >= 0)
            {
                int           len  = items.Count;
                HistoryData[] data = new HistoryData[len];
                int           i    = 0;
                foreach (var item in items)
                {
                    ITag tag = item.Key;
                    data[i].ID        = tag.ID;
                    data[i].TimeStamp = tag.TimeStamp;
                    data[i].Quality   = tag.Quality;
                    data[i].Value     = item.Key.ToStorage(item.Value);
                    i++;
                }
                foreach (DataChangeEventHandler deleg in DataChange.GetInvocationList())
                {
                    deleg.BeginInvoke(this, new DataChangeEventArgs(1, data), null, null);
                }
            }
            return(rev);
        }
Exemple #2
0
        public void Update()
        {
            DateTime dt = DateTime.Now;

            FileData[] list = _fileReader.ReadAll(_id);
            if (list != null)
            {
                if (DataChange != null)
                {
                    List <HistoryData> hdata = new List <HistoryData>();
                    foreach (ITag tag in _items)
                    {
                        int index = Array.BinarySearch(list, new FileData {
                            ID = tag.ID
                        });
                        if (index >= 0)
                        {
                            FileData data = list[index];
                            if (tag.Address.VarType == DataType.STR)
                            {
                                if (data.Text != tag.ToString())
                                {
                                    (tag as StringTag).String = data.Text;
                                    tag.Update(Storage.Empty, dt, QUALITIES.QUALITY_GOOD);
                                }
                                continue;
                            }
                            if (tag.Value != data.Value)
                            {
                                tag.Update(data.Value, dt, QUALITIES.QUALITY_GOOD);
                                hdata.Add(new HistoryData(data.ID, QUALITIES.QUALITY_GOOD, data.Value, dt));
                            }
                        }
                    }
                    foreach (DataChangeEventHandler deleg in DataChange.GetInvocationList())
                    {
                        deleg.BeginInvoke(this, new DataChangeEventArgs(1, hdata), null, null);
                    }
                }
                else
                {
                    foreach (ITag tag in _items)
                    {
                        int index = Array.BinarySearch(list, new FileData {
                            ID = tag.ID
                        });
                        if (index >= 0)
                        {
                            if (tag.Value != list[index].Value)
                            {
                                tag.Update(list[index].Value, dt, QUALITIES.QUALITY_GOOD);
                            }
                        }
                    }
                }
            }
        }
Exemple #3
0
        public virtual int BatchWrite(SortedDictionary <ITag, object> items, bool isSync = true)
        {
            int             len   = items.Count;
            int             rev   = 0;
            IMultiReadWrite multi = _plcReader as IMultiReadWrite;

            if (multi != null)
            {
                DeviceAddress[] addrs = new DeviceAddress[len];
                object[]        objs  = new object[len];
                int             i     = 0;
                foreach (var item in items)
                {
                    addrs[i] = item.Key.Address;
                    objs[i]  = item.Value;
                    i++;
                }

                rev = multi.WriteMultiple(addrs, objs);
            }
            else
            {
                foreach (var tag in items)
                {
                    if (tag.Key.Write(tag.Value) < 0)
                    {
                        rev = -1;
                    }
                }
            }

            if (DataChange != null && rev >= 0)
            {
                HistoryData[] data = new HistoryData[len];
                int           i    = 0;
                foreach (var item in items)
                {
                    ITag tag = item.Key;
                    data[i].ID        = tag.ID;
                    data[i].TimeStamp = tag.TimeStamp;
                    data[i].Quality   = tag.Quality;
                    data[i].Value     = item.Key.ToStorage(item.Value);
                    i++;
                }

                foreach (DataChangeEventHandler deleg in DataChange.GetInvocationList())
                {
                    deleg.BeginInvoke(this, new DataChangeEventArgs(1, data), null, null);
                }
            }

            return(rev);
        }
Exemple #4
0
        /// <summary>
        /// 主通信流程:Step 6:根据数据更新上位机相关信息
        /// </summary>
        protected void Update()
        {
            DateTime dt = DateTime.Now;

            if (DataChange != null)
            {
                HistoryData[] values = new HistoryData[_changedList.Count];
                int           i      = 0;
                foreach (int index in _changedList)
                {
                    ITag item     = _items[index];
                    var  itemData = item.Read();//这是从缓存Cache中读取的数据
                    if (item.Active)
                    {
                        item.Update(itemData, dt, QUALITIES.QUALITY_GOOD);
                    }

                    /*
                     * 下面的语言判断是否要更新有变化的Itag:
                     * 1.对敏感度为零的,只要有任何变化都要更新;??浮点数和零 比较大小
                     * 2.对于浮点数,新值的变化要超过敏感的 百分比
                     */
                    if (_deadband == 0 || (item.Address.VarType == DataType.FLOAT &&
                                           (Math.Abs(itemData.Single / item.Value.Single - 1) > _deadband)))
                    {
                        values[i].ID        = item.ID;
                        values[i].Quality   = item.Quality;
                        values[i].Value     = itemData;
                        values[i].TimeStamp = item.TimeStamp;
                        i++;
                    }
                }

                foreach (DataChangeEventHandler deleg in DataChange.GetInvocationList())     //批量调用绑定在事件上面的委托
                {
                    deleg.BeginInvoke(this, new DataChangeEventArgs(1, values), null, null); //只在这个地方,才去调用绑定的事件,对那些更新周期为零的变量进行存储,存储周期随Group
                }
            }
            else
            {
                foreach (int index in _changedList)
                {
                    ITag item = _items[index];
                    if (item.Active)
                    {
                        item.Update(item.Read(), dt, QUALITIES.QUALITY_GOOD);
                    }
                }
            }
        }
Exemple #5
0
        protected void Update()
        {
            DateTime dt = DateTime.Now;

            if (DataChange != null)
            {
                HistoryData[] values = new HistoryData[_changedList.Count];
                int           i      = 0;
                foreach (int index in _changedList)
                {
                    ITag item     = _items[index];
                    var  itemData = item.Read();
                    if (item.Active)
                    {
                        item.Update(itemData, dt, QUALITIES.QUALITY_GOOD);
                    }
                    if (_deadband == 0 || (item.Address.VarType == DataType.FLOAT &&
                                           (Math.Abs(itemData.Single / item.Value.Single - 1) > _deadband)))
                    {
                        values[i].ID        = item.ID;
                        values[i].Quality   = item.Quality;
                        values[i].Value     = itemData;
                        values[i].TimeStamp = item.TimeStamp;
                        i++;
                    }
                }

                foreach (DataChangeEventHandler deleg in DataChange.GetInvocationList())
                {
                    deleg.BeginInvoke(this, new DataChangeEventArgs(1, values), null, null);
                }
            }
            else
            {
                foreach (int index in _changedList)
                {
                    ITag item = _items[index];
                    if (item.Active)
                    {
                        item.Update(item.Read(), dt, QUALITIES.QUALITY_GOOD);
                    }
                }
            }

            _changedList.Clear();
        }
Exemple #6
0
        public bool RecieveData(string data) //when sendmessge arrived WM_COPYDATA
        {
            int index = data.IndexOf('#');   //格式:GroupID#TagID:Value|TagID:Value|TagID:Value

            if (index > 0 && data.Substring(0, index) == _id.ToString())
            {
                string[]      strs  = data.Right(index).Split('|');
                HistoryData[] hdata = new HistoryData[strs.Length];
                DateTime      date  = DateTime.Now;
                int           i     = 0;
                foreach (string d in strs)
                {
                    int ind = d.IndexOf(':');
                    if (ind > 0)
                    {
                        short tid;
                        if (short.TryParse(data.Substring(0, ind), out tid))
                        {
                            ITag tag = _server[tid];
                            if (tag != null)
                            {
                                Storage  value = Storage.Empty;
                                DataType type  = tag.Address.VarType;
                                switch (type)
                                {
                                case DataType.BOOL:
                                    value.Boolean = Convert.ToBoolean(d.Right(ind));
                                    break;

                                case DataType.BYTE:
                                    value.Byte = Convert.ToByte(d.Right(ind));
                                    break;

                                case DataType.WORD:
                                case DataType.SHORT:
                                    value.Int16 = Convert.ToInt16(d.Right(ind));
                                    break;

                                case DataType.TIME:
                                case DataType.INT:
                                    value.Int32 = Convert.ToInt32(d.Right(ind));
                                    break;

                                case DataType.FLOAT:
                                    value.Single = Convert.ToSingle(d.Right(ind));
                                    break;

                                case DataType.STR:
                                    break;
                                }
                                tag.Update(value, date, QUALITIES.QUALITY_GOOD);//也可以不传值,tag自身refresh
                                hdata[i].ID        = tag.ID;
                                hdata[i].Value     = value;
                                hdata[i].TimeStamp = date;
                                hdata[i].Quality   = QUALITIES.QUALITY_GOOD;
                            }
                        }
                    }
                    i++;
                }
                if (DataChange != null)
                {
                    foreach (DataChangeEventHandler deleg in DataChange.GetInvocationList())
                    {
                        deleg.BeginInvoke(this, new DataChangeEventArgs(1, hdata), null, null);
                    }
                }
                return(true);
            }
            return(false);
        }