KukaPLCDataAnalysis.cs 8.05 KB
using DataAcquisitionServer.Common.Communications;
using DataAcquisitionServer.Common.Enums;
using DataAcquisitionServer.Common.Utils;
using DataAcquisitionServer.DataAccess;
using DataAcquisitionServer.Models;
using Microsoft.EntityFrameworkCore;

namespace DataAcquisitionServer.Services.DataAnalysis
{
    public class KukaPLCDataAnalysis(IDbContextFactory<DataContext> dbContextFactory) : IDataAnalysis
    {
        private readonly IDbContextFactory<DataContext> dbContextFactory = dbContextFactory;
        private readonly SystemLog log = SystemLog.Instance;

        public void Analysis(IEnumerable<ICommunication> communications, IEnumerable<Equipment> equipments)
        {
            using var context = dbContextFactory.CreateDbContext();
            try
            {
                var kukaPlcEquipments = equipments.Where(x => x.EquipmentType == EquipmentTypeConst.SiemensPLC && x.EquipmentProperties.Any()).ToList();
                foreach (var item in kukaPlcEquipments)
                {
                    if (!item.EquipmentProperties.Any(x => x.UpdateTime > DateTime.Now.AddSeconds(-30)))
                    {
                        //数据更新时间超过10秒则过期
                        continue;
                    }
                    if (item.Code == EquipmentConst.KukaPLC_1.ToString())
                    {
                        var propCodes = new List<KukaPLCProps>
                        {
                            KukaPLCProps.Electricity,//用电量[累计值]
                            KukaPLCProps.P_KW,//有功功率[实时数据]
                            KukaPLCProps.Gas_Flow,//气体流量[实时数据]
                        };
                        SetEquipmentRecord(context, item, propCodes);

                        //写入数据
                        var weld_Day_EquipmentProperty = item[KukaPLCProps.Weld_statistics_Day.ToString()];
                        var weld_Month_EquipmentProperty = item[KukaPLCProps.Weld_statistics_Month.ToString()];
                        var communication = communications.Where(x => x.CommunicationId == item.CommunicationId).FirstOrDefault();
                        if (communication != null)
                        {
                            var equipmentCodes = equipments.Where(x => x.Area == item.Area).Select(x => x.Code).ToList();

                            var monthStartTime = DateTime.Now.AddDays(1 - DateTime.Now.Day).Date;

                            var todayValue = context.EquipmentPropertyRecords.Where(x => equipmentCodes.Contains(x.EquipmentCode) && x.EquipmentPropertyCode == KukaProps.Weld_Speed.ToString() && x.CreateTime > DateTime.Today).Select(x => x.Value).AsEnumerable().Sum(float.Parse);

                            var monthValue = context.EquipmentPropertyRecords.Where(x => equipmentCodes.Contains(x.EquipmentCode) && x.EquipmentPropertyCode == KukaProps.Weld_Speed.ToString() && x.CreateTime > monthStartTime).Select(x => x.Value).AsEnumerable().Sum(float.Parse);

                            Task.Run(() =>
                            {
                                var properties = new List<EquipmentProperty>
                                {
                                    new EquipmentProperty
                                    {
                                        Id = weld_Day_EquipmentProperty.Id,
                                        Equipment = item,
                                        EquipmentId = item.Id,
                                        DataAddress = weld_Day_EquipmentProperty.DataAddress,
                                        DataType = weld_Day_EquipmentProperty.DataType,
                                        Value = todayValue.ToString(),
                                    },
                                    new EquipmentProperty
                                    {
                                        Id = weld_Month_EquipmentProperty.Id,
                                        Equipment = item,
                                        EquipmentId = item.Id,
                                        DataAddress = weld_Month_EquipmentProperty.DataAddress,
                                        DataType = weld_Month_EquipmentProperty.DataType,
                                        Value = monthValue.ToString(),
                                    }
                                };
                                communication.Write(properties);
                            });
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                log.LogError($"[{nameof(KukaPLCDataAnalysis)}]数据解析出现异常:{ex.Message}");
            }
        }

        public void SetEquipmentRecord(DataContext context, Equipment equipment, IEnumerable<KukaPLCProps> propCodes)
        {
            foreach (var item in propCodes)
            {
                var prop = equipment[item.ToString()];
                _ = float.TryParse(prop.Value, out var propValue);
                //每小时存一条记录
                var startTime = DateTime.Today.AddHours(DateTime.Now.Hour);
                if (propValue == 0)
                {
                    context.EquipmentPropertyRecords.Where(x => x.EquipmentCode == equipment.Code && x.EquipmentPropertyCode == prop.Code && x.IsEnd).ExecuteUpdate(x => x.SetProperty(p => p.IsEnd, true));
                    continue;
                }

                var record = context.EquipmentPropertyRecords.Where(x => x.EquipmentCode == equipment.Code && x.EquipmentPropertyCode == prop.Code && x.CreateTime >= startTime).OrderByDescending(x => x.CreateTime).FirstOrDefault();
                if (prop.Code == KukaPLCProps.Electricity.ToString())
                {
                    if (record != null && record.Remark != propValue.ToString())
                    {
                        _ = float.TryParse(record.Remark, out var oldValue);
                        context.EquipmentPropertyRecords.Where(x => x.Id == record.Id).ExecuteUpdate(x => x.SetProperty(p => p.Value, (propValue - oldValue).ToString()).SetProperty(p => p.UpdateTime, DateTime.Now));
                    }
                    else if (record == null)
                    {
                        context.EquipmentPropertyRecords.Add(new EquipmentPropertyRecord
                        {
                            EquipmentCode = equipment.Code,
                            EquipmentName = equipment.Name,
                            EquipmentPropertyCode = prop.Code,
                            EquipmentPropertyName = prop.Name,
                            Value = "0",
                            IsEnd = false,
                            CreateTime = DateTime.Now,
                            UpdateTime = DateTime.Now,
                            Remark = propValue.ToString()//记录参考值
                        });
                        context.SaveChanges();
                    }
                }
                else
                {
                    if (record != null)
                    {
                        _ = float.TryParse(record.Value, out var oldValue);
                        context.EquipmentPropertyRecords.Where(x => x.Id == record.Id).ExecuteUpdate(x => x.SetProperty(p => p.Value, (oldValue + propValue).ToString()).SetProperty(p => p.UpdateTime, DateTime.Now));
                    }
                    else
                    {
                        context.EquipmentPropertyRecords.Add(new EquipmentPropertyRecord
                        {
                            EquipmentCode = equipment.Code,
                            EquipmentName = equipment.Name,
                            EquipmentPropertyCode = prop.Code,
                            EquipmentPropertyName = prop.Name,
                            Value = propValue.ToString(),
                            IsEnd = false,
                            CreateTime = DateTime.Now,
                            UpdateTime = DateTime.Now,
                        });
                        context.SaveChanges();
                    }
                }
            }
        }
    }
}