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
{
///
/// 数据采集系统
///
[BelongTo(typeof(MainWorld))]
[Description("数据采集系统")]
public class DataCollectionSysyem : DeviceSystem>
{
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);
}
}
///
/// 所有设备数据
/// Key 是不同设备所使用的类型 例如DeviceDataCollection
/// value 不同设备的具体数据
///
public static ConcurrentDictionary AllDatas = new ConcurrentDictionary();
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 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 arr = new List();
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 equipmentAlarms = new List();
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 = new List();
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";
}
}
///
/// 设备报警
///
public class EquipmentAlarm
{
///
/// 设备号
///
public string Code { get; set; }
///
/// 内容
///
public string Msg { get; set; }
///
/// 时间
///
public DateTime Time { get; set; }
}
///
/// 设备状态信息
///
public class EquipmentStatus
{
///
/// 设备号
///
public string Code { get; set; }
///
/// 内容
///
public string con { get; set; }
///
/// 内容
///
public int Status { get; set; }
///
/// 时间
///
public DateTime Time { get; set; }
}
///
///
///
///
public class Quest
{
public T Data { get; set; }
}
}