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.

368 lines
15 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 CFX;
using CFX.Structures;
using Microsoft.AspNetCore.Http;
using Sln.Iot.Business.Entity;
using Sln.Iot.CFX.CFXConnect;
using Sln.Iot.CFX.Event;
using Sln.Iot.Common;
using Sln.Iot.Config;
using Sln.Iot.Model.Entity;
using Sln.Iot.PLC;
using Sln.Iot.Serilog;
using Sln.Iot.Socket;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.NetworkInformation;
using System.Text;
using System.Threading.Tasks;
namespace Sln.Iot.Business
{
public class MesReportBusiness
{
private Timer _timer;
private readonly SerilogHelper _log = SerilogHelper.Instance;
private readonly DeltaHttpClient _deltaHttpClient = DeltaHttpClient.Instance;
private readonly AppConfig _appConfig = AppConfigSetting.Load();
private readonly PLCConnect _plc = PLCConnect.Instance;
CFXConnectVacuum _cfxVacuum = CFXConnectVacuum.Instance;
CFXConnectOven _cfxOven = CFXConnectOven.Instance;
StationParametersModifiedEvent stationParametersModifiedEvent = new StationParametersModifiedEvent();
public MesReportBusiness()
{
//_deltaHttpClient.Init();
_timer = new Timer(TimerCallback, null, 0, 1000 * _appConfig.MesSendDelay);
}
public void TimerCallback(object? state)
{
//MES上报
ErrorGet(1);
//_deltaHttpClient.PostRequestSend(tranter(GlobalVar.Connect1Entity));
ErrorGet(2);
//_deltaHttpClient.PostRequestSend(tranter(GlobalVar.Connect2Entity));
//CFX上传
_cfxVacuum.PublishEvent(new CFXEnvelope(stationParametersModifiedEvent.Handle(ParameterSet(GlobalVar.Connect1Entity.InterfaceID,
"制程设备",
GlobalVar.Connect1Entity.Status,
GlobalVar.Connect1Entity.Status,
GlobalVar.Connect1Entity.StatusCode,
GlobalVar.Connect1Entity.PassQuantity.ToString(),
GlobalVar.Connect1Entity.FailQuantity.ToString(),
GlobalVar.Connect1Entity.CycleTime.ToString(),
GlobalVar.Connect1Entity.RunningTime.ToString(),
GlobalVar.Connect1Entity.WaitingTime.ToString(),
"1",
GlobalVar.Connect1Entity.InputQuantity.ToString(),
GlobalVar.Connect1Entity.ErrorCount.ToString(),
GlobalVar.Connect1Entity.ErrorTime.ToString()
))));
_cfxOven.PublishEvent(new CFXEnvelope(stationParametersModifiedEvent.Handle(ParameterSet(GlobalVar.Connect2Entity.InterfaceID,
"制程设备",
GlobalVar.Connect2Entity.Status,
GlobalVar.Connect2Entity.Status,
GlobalVar.Connect2Entity.StatusCode,
GlobalVar.Connect2Entity.PassQuantity.ToString(),
GlobalVar.Connect2Entity.FailQuantity.ToString(),
GlobalVar.Connect2Entity.CycleTime.ToString(),
GlobalVar.Connect2Entity.RunningTime.ToString(),
GlobalVar.Connect2Entity.WaitingTime.ToString(),
"1",
GlobalVar.Connect2Entity.InputQuantity.ToString(),
GlobalVar.Connect2Entity.ErrorCount.ToString(),
GlobalVar.Connect2Entity.ErrorTime.ToString()
))));
if (_appConfig.IsMESLog)
{
_log.Info($"CFX真空箱上报 - InterfaceID:{GlobalVar.Connect1Entity.InterfaceID}, D262 状态码 Status:{GlobalVar.Connect1Entity.Status}, D108 灯号 StatusCode:{GlobalVar.Connect1Entity.StatusCode}, PassQty:{GlobalVar.Connect1Entity.PassQuantity}, FailQty:{GlobalVar.Connect1Entity.FailQuantity}, CycleTime:{GlobalVar.Connect1Entity.CycleTime}, RunningTime:{GlobalVar.Connect1Entity.RunningTime}, WaitingTime:{GlobalVar.Connect1Entity.WaitingTime}, InputQty:{GlobalVar.Connect1Entity.InputQuantity}, ErrorCnt:{GlobalVar.Connect1Entity.ErrorCount}, ErrorTimes:{GlobalVar.Connect1Entity.ErrorTime}");
_log.Info($"CFX烤箱上报 - InterfaceID:{GlobalVar.Connect2Entity.InterfaceID}, D262 状态码 Status:{GlobalVar.Connect2Entity.Status}, D15176 灯号 StatusCode:{GlobalVar.Connect2Entity.StatusCode}, PassQty:{GlobalVar.Connect2Entity.PassQuantity}, FailQty:{GlobalVar.Connect2Entity.FailQuantity}, CycleTime:{GlobalVar.Connect2Entity.CycleTime}, RunningTime:{GlobalVar.Connect2Entity.RunningTime}, WaitingTime:{GlobalVar.Connect2Entity.WaitingTime}, InputQty:{GlobalVar.Connect2Entity.InputQuantity}, ErrorCnt:{GlobalVar.Connect2Entity.ErrorCount}, ErrorTimes:{GlobalVar.Connect2Entity.ErrorTime}");
}
}
private string tranter(MesReportEntity entity)
{
//entity.CycleTime = _appConfig.CycleTime;
#region 傳送字的資料
string strSendData;
strSendData = "[{";
// strSendData += "\"factory\":\"" + "DG5" + "\",";
strSendData += "\"interfaceID\":\"" + entity.InterfaceID + "\",";
// strSendData += "\"EquipType\":" + EquipType + ",";
strSendData += "\"status\":" + entity.StatusCode + ",";
strSendData += "\"statusCode\":\"" + entity.Status + "\",";
strSendData += "\"passQty\":" + entity.PassQuantity + ",";
strSendData += "\"failQty\":" + entity.FailQuantity + ",";
strSendData += "\"errorCnt\":" + entity.ErrorCount + ",";
strSendData += "\"errorTimes\":" + entity.ErrorTime + ",";
strSendData += "\"cycleTime\":" + entity.CycleTime + ",";
strSendData += "\"runningTime\":" + entity.RunningTime + ",";
strSendData += "\"waitingTime\":" + entity.WaitingTime + ",";
// strSendData += "\"selfCheck\":" + (SELFCHECK ? "1" : "0") + ",";
strSendData += "\"selfCheck\":" + "1" + ",";
strSendData += "\"inputQty\":" + entity.InputQuantity + ",";
strSendData += "\"barcode\":\"" + entity.Barcode + "\",";
strSendData += "\"model\":\"" + entity.Cya + "\",";
strSendData += "\"paramList\":[";
// strSendData += "{\"paramCode\":\"" + Key1 + "\",";
// strSendData += "\"paramValue\":\"" + Value1 + "\"},";
// strSendData += "{\"paramCode\":\"" + Key2 + "\",";
// strSendData += "\"paramValue\":\"" + Value2 + "\"},";
// strSendData += "{\"paramCode\":\"" + Key3 + "\",";
// strSendData += "\"paramValue\":\"" + Value3 + "\"},";
//因为我们的数据此部分没有如果再remove将删除[,导致格式错误
// strSendData = strSendData.Remove(strSendData.Length - 1);//20170525 Tim 修改最後一個,沒刪除的bug
strSendData += "]";
strSendData += "}]";
//_cfxHelper.PublishEvent(new CFXEnvelope(stationParametersModifiedEvent.Handle(ParameterSet(entity.InterfaceID,
// "制程设备",
// entity.Status,
// entity.Status,
// entity.StatusCode,
// entity.PassQuantity.ToString(),
// entity.FailQuantity.ToString(),
// entity.CycleTime.ToString(),
// entity.RunningTime.ToString(),
// entity.WaitingTime.ToString(),
// "1",
// entity.InputQuantity.ToString(),
// entity.ErrorCount.ToString(),
// entity.ErrorTime.ToString()
// ))));
#endregion
return strSendData;
}
/// <summary>
/// 设备状态获取
/// </summary>
/// <returns></returns>
private void ErrorGet(int deviceNo)
{
string status = "0";
string statusCode = "0";
if (deviceNo == 1) //真空箱
{ //灯号
GlobalVar.Connect1Entity.RunningTime = (int)(DateTime.Now - GlobalVar.OpenTime).TotalSeconds;
var r1 = _plc.ReadInt16(_plc.PLC21, "D108");
if (r1.IsSuccess)
{
GlobalVar.Connect1Entity.StatusCode = r1.Content.ToString();
GlobalVar.Connect1Entity.Status = StatusJudge(r1.Content, 1).ToString();
if (GlobalVar.Connect1Entity.Status == "1")
{
if (GlobalVar.Connect1Entity.IsError == false)
{
GlobalVar.Connect1Entity.ErrorCount++;
GlobalVar.Connect1Entity.LastErrorTime = DateTime.Now;
GlobalVar.Connect1Entity.IsError = true;
}
else
{
GlobalVar.Connect1Entity.ErrorTime = (int)(DateTime.Now - GlobalVar.Connect1Entity.LastErrorTime).TotalSeconds;
}
}
else
{
if (GlobalVar.Connect1Entity.IsError == true)
{
GlobalVar.Connect1Entity.IsError = false;
}
}
}
else
{
_log.Error($"读取PLC状态失败: 真空箱1{r1.IsSuccess} - {r1.Message}");
}
}
else if (deviceNo == 2) //烤箱
{ //灯号
GlobalVar.Connect2Entity.RunningTime = (int)(DateTime.Now - GlobalVar.OpenTime).TotalSeconds;
var r1 = _plc.ReadInt16(_plc.PLC20, "D15176");
if (r1.IsSuccess)
{
GlobalVar.Connect2Entity.StatusCode = r1.Content.ToString();
GlobalVar.Connect2Entity.Status = StatusJudge(r1.Content, 2).ToString();
if (GlobalVar.Connect2Entity.Status == "1")
{
if (GlobalVar.Connect2Entity.IsError == false)
{
GlobalVar.Connect2Entity.ErrorCount++;
GlobalVar.Connect2Entity.LastErrorTime = DateTime.Now;
GlobalVar.Connect2Entity.IsError = true;
}
else
{
GlobalVar.Connect2Entity.ErrorTime = (int)(DateTime.Now - GlobalVar.Connect2Entity.LastErrorTime).TotalSeconds;
}
}
else
{
if (GlobalVar.Connect2Entity.IsError == true)
{
GlobalVar.Connect2Entity.IsError = false;
}
}
}
else
{
_log.Error($"读取PLC状态失败: 烤箱{r1.IsSuccess} - {r1.Message}");
}
}
//return (status, statusCode);
}
private void ErrorJudge(bool errorSituation)
{
}
/// <summary>
/// 根据StatusCode判断Status
/// </summary>
/// <param name="sc"></param>
/// <returns></returns>
private int StatusJudge(int sc, int num)
{
if (sc == 1)
{
//return 1;
try
{
switch (num)
{
//故障码
case 1: //真空箱
//return 1;
return _plc.ReadInt16(_plc.PLC21, "D262").Content;
case 2: //烤箱
//return 1;
return _plc.ReadInt16(_plc.PLC20, "D262").Content;
default:
return 1;
}
}
catch
{
return 1;
}
}
else
{
return 0;
}
}
/// <summary>
/// stationParameters参数设置
/// </summary>
public List<Parameter> ParameterSet(
string interfaceID,
string equipType,
string status,
string light,
string statusCode,
string passQty,
string failQty,
string cycleTime,
string runningTime,
string waitingTime,
string selfCheck,
string inputQty,
string errorCnt,
string errorTimes
)
{
return new List<Parameter>()
{
new GenericParameter()
{
Name = "InterfaceID",
Value = interfaceID
},
new GenericParameter()
{
Name = "EquipType",
Value = equipType
},
new GenericParameter()
{
Name = "Status",
Value = status
},
new GenericParameter()
{
Name = "Light",
Value = light
},
new GenericParameter()
{
Name = "StatusCode",
Value = statusCode
},
new GenericParameter()
{
Name = "PassQty",
Value = passQty
},
new GenericParameter()
{
Name = "FailQty",
Value = failQty
},
new GenericParameter()
{
Name = "CycleTime",
Value = cycleTime
},
new GenericParameter()
{
Name = "RunningTime",
Value = runningTime
},
new GenericParameter()
{
Name = "WaitingTime",
Value = waitingTime
},
new GenericParameter()
{
Name = "SelfCheck",
Value = selfCheck
},
new GenericParameter()
{
Name = "InputQty",
Value = inputQty
},
new GenericParameter()
{
Name = "ErrorCnt",
Value = errorCnt
},
new GenericParameter()
{
Name = "ErrorTimes",
Value = errorTimes
},
};
}
}
}