using Newtonsoft.Json;
using ServiceCenter.Extensions;
using ServiceCenter.Redis;
using System.ComponentModel;
using WCS.Core;
using WCS.Entity.Protocol.DataStructure;
using WCS.Entity.Protocol.SRM;
using WCS.Service.Worlds;
using WCS.WorkEngineering.Extensions;
using WCS.WorkEngineering.Protocol.BCR;
using WCS.WorkEngineering.Protocol.SRM;
using WCS.WorkEngineering.Protocol.Station;
namespace WCS.Service.Systems
{
///
/// 数据采集系统
///
//[BelongTo(typeof(DataCollectionWorld))]
[Description("数据采集系统")]
public class DataCollectionSysyem : DeviceSystem
{
public List ConvList;
public List> Conv91List;
public List> Bcrs;
public List Srms;
public DataCollectionSysyem()
{
ConvList = Device.All.Where(v => v.HasProtocol(typeof(IStation523))).Select(v => new Station(v, this.World)).ToList();
Conv91List = Device.All.Where(v => v.HasProtocol(typeof(IStation91))).Select(v => new Device(v, this.World)).ToList();
Bcrs = Device.All.Where(v => v.HasProtocol(typeof(IBCR81))).Select(v => new Device(v, this.World)).ToList();
Srms = Device.All.Where(v => v.HasProtocol(typeof(ISRM520))).Select(v => new SRM(v, this.World)).ToList();
}
protected override bool ParallelDo => true;
protected override bool SaveLogsToFile => true;
public override bool Select(Device dev)
{
return dev.Code == "SRM1";
}
public override void Do(SRM obj)
{
try
{
DeviceDataPack pack = new DeviceDataPack();
//处理输送线
List DevList = new List();
foreach (var item in ConvList)
{
var dev = new StationData()
{
Code = item.Entity.Code,
Frame = DateTime.Now,
D520 = TypeExtension.Mapper(item.Data),
D521 = TypeExtension.Mapper(item.Data2),
D523 = TypeExtension.Mapper(item.Data3),
D90 = new WCS_Station90(),
D91 = new WCS_Station91(),
D80 = new WCS_BCR80(),
D81 = new WCS_BCR81()
};
if (Conv91List.Any(v => v.Entity.Code == item.Entity.Code))
{
var d91 = Conv91List.First(v => v.Entity.Code == item.Entity.Code);
dev.D91 = TypeExtension.Mapper(d91.Data);
}
if (Bcrs.Any(v => v.Entity.Code == item.Entity.Code))
{
var d81 = Bcrs.First(v => v.Entity.Code == item.Entity.Code);
dev.D81 = TypeExtension.Mapper(d81.Data);
}
//保存报警
RedisHub.WMS.Set($"{nameof(EquipmentAlarm)}:{item.Entity.Code}", JsonConvert.SerializeObject(new EquipmentAlarm()
{
Code = item.Entity.Code,
Msg = item.Data3.Alarm.ToString(),
Time = DateTime.Now
}));
DevList.Add(dev);
}
//保存模式
var status = ConvList.Select(v => new Tuple(v.Entity.Code, v.Data2.Mode.ToString()));
RedisHub.WMS.Set($"ConvStatus", JsonConvert.SerializeObject(status));
pack.StationDatas = new DeviceDataCollection(DateTime.Now, DevList.ToArray());
//处理堆垛机
List srmList = new List();
foreach (var item in Srms)
{
var dev = new SRMData()
{
Code = item.Entity.Code,
Frame = DateTime.Now,
D520 = TypeExtension.Mapper(item.Data),
D521 = TypeExtension.Mapper(item.Data2),
D537 = TypeExtension.Mapper(item.Data3),
};
//保存报警
RedisHub.WMS.Set($"{nameof(EquipmentAlarm)}:{item.Entity.Code}", JsonConvert.SerializeObject(new EquipmentAlarm()
{
Code = item.Entity.Code,
Msg = item.Data3.Alarm.ToString(),
Time = DateTime.Now
}));
srmList.Add(dev);
}
//保存模式
var status1 = Srms.Select(v => new Tuple(v.Entity.Code, v.Data2.AutoStatus.ToString()));
RedisHub.WMS.Set($"SrmStatus", JsonConvert.SerializeObject(status1));
pack.SRMDatas = new DeviceDataCollection(DateTime.Now, srmList.ToArray());
pack.Frame = DateTime.Now;
//保存到Redis
RedisHub.Monitor.RPush("Packs", pack);
RedisHub.Monitor.Set(nameof(DeviceDataPack), pack);
if (RedisHub.Monitor.LLen("Packs") > 500000)
{
RedisHub.Monitor.LTrim("Packs", 5000, -1);
}
}
catch (Exception ex)
{
World.Log(ex.StackTrace, ServiceCenter.Logs.LogLevelEnum.Mid);
}
}
}
///
/// 设备报警
///
public class EquipmentAlarm
{
///
/// 设备号
///
public string Code { get; set; }
///
/// 内容
///
public string Msg { get; set; }
///
/// 时间
///
public DateTime Time { get; set; }
}
}