You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

257 lines
9.8 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
{
/// <summary>
/// 报表数据刷新业务类
/// </summary>
public class MonitorDataRefreshBusiness
{
TransferSingal transferSingal = new TransferSingal();
private Timer refreshTimer;
public MonitorDataRefreshBusiness()
{
// 启动定时器每隔1秒刷新一次报表数据
refreshTimer = new System.Threading.Timer(RefreshData, null, 0, 1000);
}
/// <summary>
/// 数据刷新
/// </summary>
/// <param name="o"></param>
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);
}
}
/// <summary>
/// 监控画面信息插入
/// </summary>
/// <param name="deviceNo">机台号</param>
/// <param name="recipeCode">硫化机台编号</param>
/// <param name="rgvNo">RGV编号</param>
public bool MonitorInsert(string recipeCode, string deviceNo, int rgvNo)
{
DateTime judgeTime = DateTime.Now - TimeSpan.FromMinutes(10);
List<ZxDailyReportEntity> 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);
}
}
}