RobotDataAnalysis.cs 10.2 KB
using DataAcquisition.Common.Communications;
using DataAcquisition.Common.Enums;
using DataAcquisition.Common.Utils;
using DataAcquisition.DataAccess;
using DataAcquisition.Models;
using Microsoft.EntityFrameworkCore;

namespace DataAcquisition.Services.DataAnalysis
{
    public class RobotDataAnalysis(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 equipmentTypes = new List<EquipmentTypeConst>
                {
                    EquipmentTypeConst.Kuka,
                    EquipmentTypeConst.Fanuc,
                };
                var kukaEquipments = equipments.Where(x => equipmentTypes.Contains(x.EquipmentType) && x.EquipmentProperties.Any()).ToList();
                foreach (var item in kukaEquipments)
                {
                    //设备未开机则跳过
                    if (item[RobotProps.BootFlag.ToString()].Value != bool.TrueString)
                    {
                        //结束当前设备所有记录
                        context.EquipmentPropertyRecords.Where(x => x.EquipmentCode == item.Code && !x.IsEnd).ExecuteUpdate(x => x.SetProperty(p => p.IsEnd, true));
                        continue;
                    }

                    var propCodes = new List<RobotProps>
                    {
                        RobotProps.BootFlag,//开机标志
                        RobotProps.WorkFlag,//工作标志
                        RobotProps.WeldFlag,//焊接标志
                        RobotProps.WeldCompleteFlag,//焊接完成标志
                        RobotProps.Alarm,//报警
                        RobotProps.Work_Time,//工作时长
                        RobotProps.Work_Mode,//工作模式
                    };

                    //记录设备状态
                    SetEquipmentRecord(context, item, propCodes);

                    //每小时存一条记录
                    var startTime = DateTime.Today.AddHours(DateTime.Now.Hour);

                    //浮点类型的数据
                    var propCodes2 = new List<RobotProps>
                    {
                        RobotProps.Weld_Speed,//米/分钟
                    };

                    if (item.Area == 1)
                    {
                        propCodes2.Add(RobotProps.Gas_Flow);//L/分钟
                    }

                    foreach (var propCode in propCodes2)
                    {
                        var property = item[propCode.ToString()];
                        _ = float.TryParse(property.Value, out var propValue);
                        //结束之前的记录
                        context.EquipmentPropertyRecords.Where(x => x.EquipmentCode == item.Code && x.EquipmentPropertyCode == propCode.ToString() && !x.IsEnd && x.CreateTime < startTime).ExecuteUpdate(x => x.SetProperty(e => e.IsEnd, true));
                        if (propValue > 0)
                        {
                            var record = context.EquipmentPropertyRecords.Where(x => x.EquipmentCode == item.Code && x.EquipmentPropertyCode == propCode.ToString() && !x.IsEnd && x.CreateTime >= startTime).OrderByDescending(x => x.CreateTime).FirstOrDefault();

                            var val = propValue;
                            //送丝速度 1.2mm
                            if (propCode == RobotProps.Weld_Speed)
                            {
                                val = Convert.ToSingle(propValue / 60 * (Math.PI * Math.Pow(1.2 / 10 / 2, 2)));
                            }
                            else if (propCode == RobotProps.Gas_Flow)
                            {
                                val = propValue / 60;
                            }

                            //存在记录则更新
                            if (record != null)
                            {
                                _ = float.TryParse(record.Value, out var oldValue);
                                context.EquipmentPropertyRecords.Where(x => x.Id == record.Id).ExecuteUpdate(x => x.SetProperty(e => e.Value, (oldValue + val).ToString()).SetProperty(x => x.UpdateTime, DateTime.Now));
                            }
                            else
                            {
                                context.EquipmentPropertyRecords.Add(new EquipmentPropertyRecord
                                {
                                    EquipmentCode = item.Code,
                                    EquipmentName = item.Name,
                                    EquipmentPropertyCode = property.Code,
                                    EquipmentPropertyName = property.Name,
                                    Value = val.ToString(),
                                    IsEnd = false,
                                    CreateTime = DateTime.Now,
                                    UpdateTime = DateTime.Now,
                                });
                                context.SaveChanges();
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                log.LogError($"[{nameof(RobotDataAnalysis)}]数据解析出现异常:{ex.Message}");
            }
        }

        /// <summary>
        /// 记录设备状态
        /// </summary>
        /// <param name="context"></param>
        /// <param name="equipment"></param>
        /// <param name="propCodes"></param>
        public void SetEquipmentRecord(DataContext context, Equipment equipment, IEnumerable<RobotProps> propCodes)
        {
            foreach (var propCode in propCodes)
            {
                //每小时存一条记录
                var startTime = DateTime.Today.AddHours(DateTime.Now.Hour);
                var prop = equipment[propCode.ToString()];
                _ = bool.TryParse(prop.Value, out var propValue);
                //结束之前的记录
                context.EquipmentPropertyRecords.Where(x => x.EquipmentCode == equipment.Code && x.EquipmentPropertyCode == propCode.ToString() && !x.IsEnd && x.CreateTime < startTime).ExecuteUpdate(x => x.SetProperty(e => e.IsEnd, true));
                if (propValue)
                {
                    if (propCode == RobotProps.Alarm)
                    {
                        _ = int.TryParse(equipment[RobotProps.Work_Mode.ToString()].Value, out var mode);
                        //设备报警仅在自动模式下记录
                        if (mode < 3) continue;
                    }

                    var oldRecord = context.EquipmentPropertyRecords.Where(x => x.EquipmentCode == equipment.Code && x.EquipmentPropertyCode == propCode.ToString() && !x.IsEnd && x.CreateTime >= startTime).OrderByDescending(x => x.CreateTime).FirstOrDefault();
                    if (oldRecord != null)
                    {
                        context.EquipmentPropertyRecords.Where(x => x.Id == oldRecord.Id).ExecuteUpdate(x => x.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();
                    }
                }
                //结束
                else
                {
                    context.EquipmentPropertyRecords.Where(x => x.EquipmentPropertyCode == equipment.Code && x.EquipmentPropertyCode == propCode.ToString() && !x.IsEnd).ExecuteUpdate(x => x.SetProperty(p => p.IsEnd, true));
                }

                #region 记录加工工件

                //True为开始焊接,False为焊接结束
                if (prop.Code == RobotProps.WeldCompleteFlag.ToString())
                {
                    if (propValue)
                    {
                        var workRecord = context.WorkpieceProcessingRecords.Where(x => x.EquipmentCode == equipment.Code && !x.IsEnd && x.CreateTime >= DateTime.Today).OrderByDescending(x => x.CreateTime).FirstOrDefault();
                        if (workRecord != null)
                        {
                            context.WorkpieceProcessingRecords.Where(x => x.Id == workRecord.Id).ExecuteUpdate(x => x.SetProperty(e => e.UpdateTime, DateTime.Now));
                        }
                        else
                        {
                            _ = int.TryParse(equipment[RobotProps.Type.ToString()].Value, out var type);
                            _ = int.TryParse(equipment[RobotProps.Program_No.ToString()].Value, out var program_No);
                            context.WorkpieceProcessingRecords.Add(new WorkpieceProcessingRecord
                            {
                                EquipmentCode = equipment.Code,
                                EquipmentName = equipment.Name,
                                WorkpieceCode = type.ToString(),//待完善
                                IsEnd = false,
                                ProgramNo = program_No,
                                CreateTime = DateTime.Now,
                                UpdateTime = DateTime.Now,
                            });
                            context.SaveChanges();
                        }
                    }
                    else
                    {
                        context.WorkpieceProcessingRecords.Where(x => x.EquipmentCode == equipment.Code && !x.IsEnd).ExecuteUpdate(x => x.SetProperty(p => p.IsEnd, true));
                    }
                }

                #endregion
            }
        }
    }
}