using HighWayIot.Log4net; using HighWayIot.Plc; using HighWayIot.Plc.PlcHelper; using HighWayIot.Repository.domain; using HighWayIot.Repository.service; using HighWayIot.Winform.UserControlPages; using HslCommunication; using HslCommunication.Profinet.Keyence; using Models; using SixLabors.ImageSharp.PixelFormats; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace HighWayIot.Winform.Business { /// /// 报表数据刷新业务类 /// public class MonitorDataRefreshBusiness { TransferSingal transferSingal = new TransferSingal(); private Timer refreshTimer; public MonitorDataRefreshBusiness() { // 启动定时器,每隔1秒刷新一次报表数据 refreshTimer = new System.Threading.Timer(RefreshData, null, 0, 1000); } /// /// 数据刷新 /// /// private void RefreshData(object o) { try { byte[] signals = transferSingal.ReadStationReportSignal(); if (signals == null) { return; } //解析返回的信号数据 ushort[] rgvNo = new ushort[7]; //RGV状态信号 ushort[] rgvState = new ushort[7]; //称重信号 float[] weights = new float[4]; //报警信号 bool[] alarm = new bool[10]; //报警信号获取 alarm[0] = signals[58].GetBoolByIndex(0); alarm[1] = signals[58].GetBoolByIndex(1); alarm[2] = signals[58].GetBoolByIndex(2); alarm[3] = signals[58].GetBoolByIndex(3); alarm[4] = signals[58].GetBoolByIndex(4); alarm[5] = signals[58].GetBoolByIndex(5); alarm[6] = signals[58].GetBoolByIndex(6); alarm[7] = signals[58].GetBoolByIndex(7); alarm[8] = signals[59].GetBoolByIndex(0); alarm[9] = signals[59].GetBoolByIndex(1); bool flag = false; //称重信号解析 for (int i = 0; i < 10; i++) { if (alarm[i]) { if (SysErrorLogService.Instance.InsertErrorLogInfo(new SysErrorLogEntity() { Text = $"{i + 1}小车报警", Operator = RoleBusiness.LoginUserName, LogTime = DateTime.Now, P1 = i + 1, })) { flag = true; } } } if (flag) { transferSingal.WriteAlarmSignal(); } //报表信号获取 for (int i = 0; i < 7; i++) { rgvNo[i] = PlcConnect.MelsecInstance2.ByteTransform.TransUInt16(signals, (i * 2) + 20); rgvState[i] = PlcConnect.MelsecInstance2.ByteTransform.TransUInt16(signals, i * 2); if (i > 2) { weights[i - 3] = PlcConnect.MelsecInstance2.ByteTransform.TransSingle(signals, ((i - 3) * 4) + 38); } } //LogHelper.Instance.Info(string.Join(", ", rgvNo)); //LogHelper.Instance.Info(string.Join(", ", rgvState)); //装圈工位信号 if (rgvState[0] == 1) { // 监控画面信息插入 if (MonitorInsert(RecipeSendBusiness.NowRecipeCode, RecipeSendBusiness.NowDeviceNo, rgvNo[0])) { MonitorMainPage.MonitorRefreshAction.Invoke(); } transferSingal.WriteStationReportSignal(1); // 复位信号 } //基部胶信号 if (rgvState[1] == 1) { ZxDailyReportEntity entity = ZxDailyReportService.Instance.GetNearData(rgvNo[1]); if (entity == null) { transferSingal.WriteStationReportSignal(2); // 复位信号 goto n1; } entity.BaseEndTime = DateTime.Now; if (ZxDailyReportService.Instance.UpdateDailyReportInfo(entity)) { MonitorMainPage.MonitorRefreshAction.Invoke(); } transferSingal.WriteStationReportSignal(2); // 复位信号 } n1: //中层胶信号 if (rgvState[2] == 1) { ZxDailyReportEntity entity = ZxDailyReportService.Instance.GetNearData(rgvNo[2]); if (entity == null) { transferSingal.WriteStationReportSignal(3); // 复位信号 goto n2; } entity.MidEndTime = DateTime.Now; if (ZxDailyReportService.Instance.UpdateDailyReportInfo(entity)) { MonitorMainPage.MonitorRefreshAction.Invoke(); } MonitorMainPage.MonitorRefreshAction.Invoke(); transferSingal.WriteStationReportSignal(3); // 复位信号 } n2: //胎面胶信号 for (int i = 3; i <= 5; i++) { if (rgvState[i] == 1) { // 监控画面信息插入 ZxDailyReportEntity entity = ZxDailyReportService.Instance.GetNearData(rgvNo[i]); if (entity == null) { transferSingal.WriteStationReportSignal(i + 1); // 复位信号 continue; } entity.FaceEndTime = DateTime.Now; int temp = Convert.ToInt32(weights[i - 3]); if (temp != 0) { entity.RawTireWeight = temp; } if (ZxDailyReportService.Instance.UpdateDailyReportInfo(entity)) { MonitorMainPage.MonitorRefreshAction.Invoke(); } transferSingal.WriteStationReportSignal(i + 1); // 复位信号 } } //结束 if (rgvState[6] == 1) { ZxDailyReportEntity entity = ZxDailyReportService.Instance.GetNearData(rgvNo[6]); if (entity == null) { transferSingal.WriteStationReportSignal(7); // 复位信号 return; } int temp = Convert.ToInt32(weights[3]); entity.IsDone = 1; if (temp != 0) { entity.RepeatWeight = temp; } if (ZxDailyReportService.Instance.UpdateDailyReportInfo(entity)) { MonitorMainPage.MonitorRefreshAction.Invoke(); } transferSingal.WriteStationReportSignal(7); // 复位信号 } } catch (Exception ex) { Log4net.LogHelper.Instance.Error("报表解析方法出现错误", ex); } } /// /// 监控画面信息插入 /// /// 机台号 /// 硫化机台编号 /// RGV编号 public bool MonitorInsert(string recipeCode, string deviceNo, int rgvNo) { DateTime judgeTime = DateTime.Now - TimeSpan.FromMinutes(10); List judgeEntity = ZxDailyReportService.Instance .GetDailyReportInfos(x => x.DeviceNo == rgvNo && x.IsDone == 0 && x.StartTime >= judgeTime ).ToList(); //要是二十分钟内有没完结的相同记录,就不插入 if (judgeEntity.Count > 0) { Log4net.LogHelper.Instance.Info($"({deviceNo}车)重复插入"); return false; } ZxRecipeEntity recipeEntity = ZxRecipeService.Instance.GetRecipeInfosByRecipeCode(recipeCode).FirstOrDefault(); if (recipeEntity == null) { Log4net.LogHelper.Instance.Info($"没有符合的配方数据({deviceNo}车)"); return false; } ZxDailyReportEntity entity = new ZxDailyReportEntity() { Uuid = Guid.NewGuid().ToString("N"), VulcanizationNo = deviceNo, StartTime = DateTime.Now, RecipeName = recipeEntity.RecipeName, RecipeCode = recipeEntity.RecipeCode, SpecCode = recipeEntity.RecipeSpecCode, DeviceNo = rgvNo, RawTireWeight = 0, StandardWeight = (int)ZxRecipeParaService.Instance.GetRecipeParaInfoByRecipeCode(recipeCode).FirstOrDefault()?.TireWeight, IsDone = 0 }; return ZxDailyReportService.Instance.InsertDailyReportInfo(entity); } } }