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#

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