|
|
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);
|
|
|
}
|
|
|
}
|
|
|
}
|