| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252 | using FreeRedis;using ServiceCenter.Extensions;using System.ComponentModel;using System.Diagnostics;using WCS.Core;using WCS.Entity.Protocol.BCR;using WCS.Entity.Protocol.DataStructure;using WCS.Entity.Protocol.Station;using WCS.WorkEngineering.Worlds;namespace WCS.WorkEngineering.Systems{    //[BelongTo(typeof(MainWorld))]    [Description("数据采集系统")]    public class 数据采集 : SystemBase    {        private RedisClient Redis = new RedisClient("");        public 数据采集()        {            var gs = Device.All.SelectMany(v => v.Protocols.Select(d => new { DB = $"{d.Value.DBInfo.No}:{d.Value.DBInfo.PLCInfo.IP}", d.Value.Position, TypeStr = d.Key, Dev = v }))                .GroupBy(v => v.DB);            foreach (var g in gs)            {                var min = g.OrderBy(v => v.Position).First();                var max = g.OrderByDescending(v => v.Position).First();                var t = Type.GetType(min.TypeStr);                min.Dev.Protocol(t, this.World);                max.Dev.Protocol(t, this.World);            }        }        public override List<object> GetObjects()        {            return new List<object>();        }        public override void Update(List<WorkTimes> list)        {            var sw = new Stopwatch();            sw.Start();            var pack = new DeviceDataPack();            pack.Frame = DateTime.Now;            var ps = pack.GetType().GetProperties().OrderBy(x => x.Name);            foreach (var p in ps)            {                if (!p.PropertyType.IsArray&&p.PropertyType!= typeof(IBCR80[]))                    continue;                var dev = p.PropertyType.GetElementType();                if (dev.GetInterfaces().Any(v => v.GetInterfaces().Any(d => d.Name == "IProtocol")))                {                    var t = p.PropertyType.GetElementType();                    var protType = GetProtocolType(t);                    var arr = Device.All.Where(v => v.HasProtocol(protType))                    .Select(v =>                    {                        try                        {                            var obj = Activator.CreateInstance(t);                            t.GetProperty("Code").SetValue(obj, v.Code);                            dynamic protObj = v.Protocol(protType, World);                            if (protType == typeof(IBCR81))                            {                                var a = new Device<IBCR81>(v, World);                                var b = a.Data.Content;                            }                            var value = ServiceCenter.Extensions.TypeExtension.Copy(protObj, t);                            //t.GetProperty("Data").SetValue(obj, value);                            return obj;                        }                        catch (Exception ex)                        {                            return null;                        }                    }).Where(v => v != null).ToArray();                    var m = typeof(Enumerable).GetMethod("OfType", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);                    m = m.MakeGenericMethod(t);                    var arr2 = m.Invoke(null, new object[] { arr });                    m = typeof(Enumerable).GetMethod("ToArray", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);                    m = m.MakeGenericMethod(t);                    var arr3 = m.Invoke(null, new object[] { arr2 });                    p.SetValue(pack, arr3);                }            }            //Redis.RPush("Packs", pack);            //if (Redis.LLen("Packs") > 50000)            //{            //    Redis.LTrim("Packs", 5000, -1);            //}            sw.Stop();            list.Add(new WorkTimes { Total = sw.ElapsedMilliseconds, Key = "采集数据" });            //var sw = new Stopwatch();            //sw.Start();            //var pack = new DeviceDataPack();            //pack.Frame = DateTime.Now;            //var ps = pack.GetType().GetProperties();            //foreach (var p in ps)            //{            //    if (!p.PropertyType.IsClass) continue;            //    var packAct = Activator.CreateInstance(p.PropertyType);            //    var prs = p.PropertyType.GetProperties();            //    foreach (var pr in prs)            //    {            //        if (!pr.PropertyType.IsArray) continue;            //        var yt = pr.PropertyType.GetElementType();            //        if (yt.IsClass)            //        {            //            var pros = yt.GetProperties();            //            //var entType = yt.GetGenericArguments()[0];            //            //var protType = GetProtocolType(entType);            //            var dataAct = Activator.CreateInstance(yt);            //            Parallel.ForEach(pros, pro =>            //            {            //                try            //                {            //                    if (pro.PropertyType != typeof(DateTime))            //                    {            //                        if (pro.PropertyType != typeof(string))            //                        {            //                            var protType = GetProtocolType(pro.PropertyType);            //                            var dev = Device.All            //                                .Where(v => v.HasProtocol(protType)).Select(v =>            //                                {            //                                    try            //                                    {            //                                        var obj = Activator.CreateInstance(pro.PropertyType);            //                                        pro.PropertyType.GetProperty("Code").SetValue(obj, v.Code);            //                                        var a = v.Protocol(protType, World);            //                                        var value = v.Protocol(protType, World).Copy(pro.PropertyType);            //                                        pro.SetValue(obj, value);            //                                        return obj;            //                                    }            //                                    catch (Exception ex)            //                                    {            //                                        return null;            //                                    }            //                                }).FirstOrDefault(v => v != null);            //                            if (dev != null)            //                            {            //                                pro.SetValue(dataAct, dev);            //                            }            //                        }            //                        else            //                        {            //                        }            //                    }            //                }            //                catch (Exception e)            //                {            //                    Console.WriteLine(e);            //                }            //            });            //            var a = 1;            //            //var m = typeof(Enumerable).GetMethod("OfType", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);            //            //m = m.MakeGenericMethod(yt);            //            //var arr2 = m.Invoke(null, new object[] { datasAct });            //            //m = typeof(Enumerable).GetMethod("ToArray", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);            //            //m = m.MakeGenericMethod(yt);            //            //var arr3 = m.Invoke(null, new object[] { arr2 });            //            //p.SetValue(pack, arr3);            //            //var entType = yt.GetGenericArguments()[0];            //            //var protType = GetProtocolType(entType);            //            //var arr = Device.All.Where(v => v.HasProtocol(protType))            //            //    .Select(v =>            //            //    {            //            //        try            //            //        {            //            //            var obj = Activator.CreateInstance(yt);            //            //            yt.GetProperty("Code").SetValue(obj, v.Code);            //            //            //var value = v.Protocol(protType, World).Copy(entType);            //            //            //t.GetProperty("Data").SetValue(obj, value);            //            //            return obj;            //            //        }            //            //        catch (Exception ex)            //            //        {            //            //            return null;            //            //        }            //            //    }).Where(v => v != null).ToArray();            //            //var m = typeof(Enumerable).GetMethod("OfType", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);            //            //m = m.MakeGenericMethod(yt);            //            //var arr2 = m.Invoke(null, new object[] { arr });            //            //m = typeof(Enumerable).GetMethod("ToArray", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);            //            //m = m.MakeGenericMethod(yt);            //            //var arr3 = m.Invoke(null, new object[] { arr2 });            //            //p.SetValue(pack, arr3);            //        }            //    }            //    //var t = p.PropertyType.GetElementType();            //    //if (t.IsGenericType)            //    //{            //    //    var entType = t.GetGenericArguments()[0];            //    //    var protType = GetProtocolType(entType);            //    //    var arr = Device.All.Where(v => v.HasProtocol(protType))            //    //    .Select(v =>            //    //    {            //    //        try            //    //        {            //    //            var obj = Activator.CreateInstance(t);            //    //            t.GetProperty("Code").SetValue(obj, v.Code);            //    //            //var value = v.Protocol(protType, World).Copy(entType);            //    //            //t.GetProperty("Data").SetValue(obj, value);            //    //            return obj;            //    //        }            //    //        catch (Exception ex)            //    //        {            //    //            return null;            //    //        }            //    //    }).Where(v => v != null).ToArray();            //    //    var m = typeof(Enumerable).GetMethod("OfType", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);            //    //    m = m.MakeGenericMethod(t);            //    //    var arr2 = m.Invoke(null, new object[] { arr });            //    //    m = typeof(Enumerable).GetMethod("ToArray", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public);            //    //    m = m.MakeGenericMethod(t);            //    //    var arr3 = m.Invoke(null, new object[] { arr2 });            //    //    p.SetValue(pack, arr3);            //    //}            //}            ////Redis.RPush("Packs", pack);            ////if (Redis.LLen("Packs") > 50000)            ////{            ////    Redis.LTrim("Packs", 5000, -1);            ////}            //sw.Stop();            //list.Add(new WorkTimes { Total = sw.ElapsedMilliseconds, Key = "采集数据" });        }        private Type GetProtocolType(Type source)        {            var t = source.GetInterfaces().FirstOrDefault(v => v.GetInterfaces().Any(d => d.Name == "IProtocol"));            return t;        }    }}
 |