| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352 | using Newtonsoft.Json;using PlcSiemens.Core.Extension;using ServiceCenter.Extensions;using ServiceCenter.Redis;using ServiceCenter.SqlSugars;using SqlSugar;using System.Collections.Concurrent;using System.ComponentModel;using System.Diagnostics;using System.Text;using WCS.Core;using WCS.Entity.Protocol.DataStructure;using WCS.Entity.Protocol.Station;using WCS.WorkEngineering.Extensions;using WCS.WorkEngineering.Worlds;namespace WCS.WorkEngineering.Systems{    /// <summary>    ///  数据采集系统    /// </summary>    [BelongTo(typeof(MainWorld))]    [Description("数据采集系统")]    public class DataCollectionSysyem : DeviceSystem<Device<IStation520>>    {        public static DeviceDataPack pack = new DeviceDataPack();        private static object locker = new object();        public DataCollectionSysyem()        {            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);            }        }        /// <summary>        ///  所有设备数据        ///  Key 是不同设备所使用的类型 例如DeviceDataCollection<SRMData>        ///  value 不同设备的具体数据        /// </summary>        public static ConcurrentDictionary<string, DeviceData> AllDatas = new ConcurrentDictionary<string, DeviceData>();        protected override bool ParallelDo => true;        protected override bool SaveLogsToFile => true;        public override bool Select(Device dev)        {            return dev.Code == "1";        }        public override void Do(Device<IStation520> objDev)        {            var sql = new StringBuilder();            try            {                var sw = new Stopwatch();                sw.Start();                var pack = new DeviceDataPack();                pack.Frame = World.Frame;                sql.Append("INSERT INTO ");                var ps = pack.GetType().GetProperties().OrderBy(x => x.Name);                var db = new SqlSugarHelper().PLC;                var frame = DateTime.Now;                Parallel.ForEach(ps, p =>                {                    if (!p.PropertyType.IsArray) return;                    var t = p.PropertyType.GetElementType();                    if (t.IsGenericType)                    {                        var entType = t.GetGenericArguments()[0];                        var protType = GetProtocolType(entType);                        if (protType == null) return;                        var devices = Device.All.Where(v => v.HasProtocol(protType));                        List<object> arr = new List<object>();                        Parallel.ForEach(devices, x =>                        {                            try                            {                                var protObj = x.Protocol(protType, World) as ProtocolProxyBase;                                if (protObj.Frame < DateTime.Now.AddYears(-24))                                {                                    protObj.Frame = frame;                                }                                if (protObj.Db.failed)                                {                                    return;                                }                                var obj = Activator.CreateInstance(t);                                t.GetProperty("Code").SetValue(obj, x.Code);                                var value = WCS.Core.Extentions.Copy(protObj, entType, protObj.Frame);                                t.GetProperty("Data").SetValue(obj, value);                                t.GetProperty("Frame").SetValue(obj, protObj.Frame);                                entType.GetProperty("Code").SetValue(value, x.Code);                                arr.Add(obj);                            }                            catch                            {                            }                        });                        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);                    }                });                var sw3 = new Stopwatch();                sw3.Start();                //开始存储设备信息                RedisHub.Monitor.RPush("Packs", pack);                if (RedisHub.Monitor.LLen("Packs") > 50000)                {                    RedisHub.Monitor.LTrim("Packs", 5000, -1);                }                #region 存储设备报警信息                List<EquipmentAlarm> equipmentAlarms = new List<EquipmentAlarm>();                equipmentAlarms.AddRange(pack.Robot522.Where(x => x.Data.Alarm != 0).Select(x => new EquipmentAlarm()                {                    Code = x.Code,                    Msg = x.Data.Alarm.ToString(),                    Time = x.Frame                }));                equipmentAlarms.AddRange(pack.SRM537.Where(x => x.Data.Alarm != 0).Select(x => new EquipmentAlarm()                {                    Code = x.Code,                    Msg = x.Data.Alarm.ToString(),                    Time = x.Frame                }));                equipmentAlarms.AddRange(pack.Station523.Where(x => x.Data.Alarm != 0).Select(x => new EquipmentAlarm()                {                    Code = x.Code,                    Msg = x.Data.Alarm.ToString(),                    Time = x.Frame                }));                equipmentAlarms.AddRange(pack.Truss523.Where(x => x.Data.Alarm != 0).Select(x => new EquipmentAlarm()                {                    Code = x.Code,                    Msg = x.Data.Alarm.ToString(),                    Time = x.Frame                }));                RedisHub.Default.Set(nameof(EquipmentAlarm), JsonConvert.SerializeObject(equipmentAlarms));                #endregion 存储设备报警信息                #region 存储设备状态信息                List<EquipmentStatus> equipmentStatus = new List<EquipmentStatus>();                equipmentStatus.AddRange(pack.RGV521.Where(x => x.Data.WorkMode != 0).Select(x => new EquipmentStatus()                {                    Code = x.Code,                    con = x.Data.WorkMode.GetDescription(),                    Status = x.Data.WorkMode.ToInt(),                    Time = x.Frame                }));                equipmentStatus.AddRange(pack.Robot521.Where(x => x.Data.RobotMode != 0).Select(x => new EquipmentStatus()                {                    Code = x.Code,                    con = x.Data.RobotMode.GetDescription(),                    Status = x.Data.RobotMode.ToInt(),                    Time = x.Frame                }));                equipmentStatus.AddRange(pack.SRM521.Where(x => x.Data.AutoStatus != 0).Select(x => new EquipmentStatus()                {                    Code = x.Code,                    con = x.Data.AutoStatus.GetDescription(),                    Status = x.Data.AutoStatus.ToInt(),                    Time = x.Frame                }));                equipmentStatus.AddRange(pack.Station521.Where(x => x.Data.Mode != 0).Select(x => new EquipmentStatus()                {                    Code = x.Code,                    con = x.Data.Mode.GetDescription(),                    Status = x.Data.Mode.ToInt(),                    Time = x.Frame                }));                equipmentStatus.AddRange(pack.Truss521.Where(x => x.Data.Status != 0).Select(x => new EquipmentStatus()                {                    Code = x.Code,                    con = x.Data.Status.GetDescription(),                    Status = x.Data.Status.ToInt(),                    Time = x.Frame                }));                RedisHub.Default.Set(nameof(EquipmentStatus), JsonConvert.SerializeObject(equipmentStatus));                #endregion 存储设备状态信息                sw3.Stop();                World.Log($"redis存储耗时:{sw3.ElapsedMilliseconds}");                var sw4 = new Stopwatch();                sw4.Start();                if (pack.BCR80.Any()) db.Insertable(pack.BCR80.Select(x => x.Data).ToList()).ExecuteCommand();                if (pack.BCR81.Any()) db.Insertable(pack.BCR81.Select(x => x.Data).ToList()).ExecuteCommand();                if (pack.BCR83.Any()) db.Insertable(pack.BCR83.Select(x => x.Data).ToList()).ExecuteCommand();                if (pack.RGV520.Any()) db.Insertable(pack.RGV520.Select(x => x.Data).ToList()).ExecuteCommand();                if (pack.RGV521.Any()) db.Insertable(pack.RGV521.Select(x => x.Data).ToList()).ExecuteCommand();                if (pack.Robot520.Any()) db.Insertable(pack.Robot520.Select(x => x.Data).ToList()).ExecuteCommand();                if (pack.Robot521.Any()) db.Insertable(pack.Robot521.Select(x => x.Data).ToList()).ExecuteCommand();                if (pack.Robot522.Any()) db.Insertable(pack.Robot522.Select(x => x.Data).ToList()).ExecuteCommand();                if (pack.Robot530.Any()) db.Insertable(pack.Robot530.Select(x => x.Data).ToList()).ExecuteCommand();                if (pack.Robot531.Any()) db.Insertable(pack.Robot531.Select(x => x.Data).ToList()).ExecuteCommand();                if (pack.SRM520.Any()) db.Insertable(pack.SRM520.Select(x => x.Data).ToList()).ExecuteCommand();                if (pack.SRM521.Any()) db.Insertable(pack.SRM521.Select(x => x.Data).ToList()).ExecuteCommand();                if (pack.SRM537.Any()) db.Insertable(pack.SRM537.Select(x => x.Data).ToList()).ExecuteCommand();                if (pack.Station520.Any()) db.Insertable(pack.Station520.Select(x => x.Data).ToList()).ExecuteCommand();                if (pack.Station521.Any()) db.Insertable(pack.Station521.Select(x => x.Data).ToList()).ExecuteCommand();                if (pack.Station523.Any()) db.Insertable(pack.Station523.Select(x => x.Data).ToList()).ExecuteCommand();                if (pack.Station524.Any()) db.Insertable(pack.Station524.Select(x => x.Data).ToList()).ExecuteCommand();                if (pack.Station525.Any()) db.Insertable(pack.Station525.Select(x => x.Data).ToList()).ExecuteCommand();                if (pack.Station90.Any()) db.Insertable(pack.Station90.Select(x => x.Data).ToList()).ExecuteCommand();                if (pack.Station91.Any()) db.Insertable(pack.Station91.Select(x => x.Data).ToList()).ExecuteCommand();                if (pack.Truss520.Any()) db.Insertable(pack.Truss520.Select(x => x.Data).ToList()).ExecuteCommand();                if (pack.Truss521.Any()) db.Insertable(pack.Truss521.Select(x => x.Data).ToList()).ExecuteCommand();                if (pack.Truss523.Any()) db.Insertable(pack.Truss523.Select(x => x.Data).ToList()).ExecuteCommand();                if (pack.Truss530.Any()) db.Insertable(pack.Truss530.Select(x => x.Data).ToList()).ExecuteCommand();                if (pack.Truss531.Any()) db.Insertable(pack.Truss531.Select(x => x.Data).ToList()).ExecuteCommand();                sw4.Stop();                World.Log($"执行SQL耗时:{sw4.ElapsedMilliseconds}");                sw.Stop();                World.Log($"数据采集耗时:{sw.ElapsedMilliseconds}");            }            catch (Exception e)            {                World.Log($"错误内容:{e.Message}");            }        }        public void Set(StringBuilder sql, string cSql)        {            lock (locker)            {                sql.Append(cSql);            }        }        private Type GetProtocolType(Type source)        {            var t = source.GetInterfaces().FirstOrDefault(v => v.GetInterfaces().Any(d => d.Name == "IProtocol"));            var t1 = source.GetInterfaces().FirstOrDefault(v => v.GetInterfaces().Any(d => d.Name == "IProtocol"));            return t;        }        private object AppendLock = new object();        public StringBuilder Append(StringBuilder sql, string value)        {            lock (AppendLock)            {                return sql.Append(value);            }        }        public string GetString(string value)        {            return value.Replace("INSERT INTO ", "")                .Replace(",N'", ",'")                .Replace("\0", "")                .Replace("wcs_", "")                .Replace("(N'", "('") + "\r";        }    }    /// <summary>    ///  设备报警    /// </summary>    public class EquipmentAlarm    {        /// <summary>        ///  设备号        /// </summary>        public string Code { get; set; }        /// <summary>        ///  内容        /// </summary>        public string Msg { get; set; }        /// <summary>        ///  时间        /// </summary>        public DateTime Time { get; set; }    }    /// <summary>    ///  设备状态信息    /// </summary>    public class EquipmentStatus    {        /// <summary>        ///  设备号        /// </summary>        public string Code { get; set; }        /// <summary>        ///  内容        /// </summary>        public string con { get; set; }        /// <summary>        ///  内容        /// </summary>        public int Status { get; set; }        /// <summary>        ///  时间        /// </summary>        public DateTime Time { get; set; }    }    /// <summary>    ///    /// </summary>    /// <typeparam name="T"></typeparam>    public class Quest<T>    {        public T Data { get; set; }    }}
 |