|
|
using HslCommunication;
|
|
|
using HslCommunication.Profinet.Melsec;
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
using System;
|
|
|
using System.Collections.Generic;
|
|
|
using System.Diagnostics;
|
|
|
using System.Linq;
|
|
|
using System.Text;
|
|
|
using System.Threading.Tasks;
|
|
|
using zzz.Model.Entity;
|
|
|
using zzz.Repository;
|
|
|
|
|
|
namespace zzz.Services.ReadPLC
|
|
|
{
|
|
|
/// <summary>
|
|
|
/// 读取PLC数据服务
|
|
|
/// </summary>
|
|
|
public class ReadPLCDataService : IReadPLCDataService
|
|
|
{
|
|
|
private readonly ILogger<ReadPLCDataService> _logger;
|
|
|
private readonly MelsecMcNet _melsecMcNet = null;
|
|
|
private readonly IBaseRepository<EqmtExcept> _eqmtExceptRep;
|
|
|
private readonly IBaseRepository<EqmtExceptHis> _eqmtExceptHisRep;
|
|
|
//private readonly IBaseRepository<EqmtExceptMaster> _eqmtExceptMasterRep;
|
|
|
private readonly IBaseRepository<Eqmt13> _eqmt13Rep;
|
|
|
|
|
|
private readonly IBaseRepository<Eqmt15> _eqmt15Rep;//lgy add
|
|
|
private readonly IBaseRepository<Eqmt7> _eqmt7Rep;//lgy add
|
|
|
private readonly IBaseRepository<Eqmt2> _eqmt2Rep;//lgy add
|
|
|
private readonly IBaseRepository<Eqmt20> _eqmt20Rep;//lgy add
|
|
|
|
|
|
private readonly IBaseRepository<Eqmt16> _eqmt16Rep;
|
|
|
private readonly IBaseRepository<Eqmt17> _eqmt17Rep;
|
|
|
private readonly IBaseRepository<Eqmt18> _eqmt18Rep;
|
|
|
private readonly IBaseRepository<Eqmt19> _eqmt19Rep;
|
|
|
private readonly IBaseRepository<EqmtPubData> _eqmtPubRep;
|
|
|
private readonly IBaseRepository<EqmtBase> _eqmtBaseRep;
|
|
|
private readonly IBaseRepository<EqmtProductSpec> _eqmtProductSpecRep;
|
|
|
private readonly IBaseRepository<EqmtCollectAddData> _eqmtAddDataRep;
|
|
|
private readonly IBaseRepository<EqmtCollectDailyShift> _eqmtCollectDailyShiftRep;
|
|
|
private readonly IBaseRepository<EqmtExceptMaster> _eqmtExceptMasterRep;
|
|
|
private readonly IBaseRepository<EqmtCollectQCResult> _eqmtCollectQCResultRep;
|
|
|
/// <summary>
|
|
|
/// 构造
|
|
|
/// </summary>
|
|
|
public ReadPLCDataService(
|
|
|
ILogger<ReadPLCDataService> logger,
|
|
|
IBaseRepository<EqmtExcept> eqmtExceptRep,
|
|
|
IBaseRepository<EqmtExceptHis> eqmtExceptHisRep,
|
|
|
//IBaseRepository<EqmtExceptMaster> eqmtExceptMasterRep,
|
|
|
IBaseRepository<Eqmt13> eqmt13Rep,
|
|
|
IBaseRepository<Eqmt15> eqmt15Rep,
|
|
|
IBaseRepository<Eqmt7> eqmt7Rep,
|
|
|
IBaseRepository<Eqmt2> eqmt2Rep,
|
|
|
IBaseRepository<Eqmt20> eqmt20Rep,
|
|
|
IBaseRepository<Eqmt16> eqmt16Rep,
|
|
|
IBaseRepository<Eqmt17> eqmt17Rep,
|
|
|
IBaseRepository<Eqmt18> eqmt18Rep,
|
|
|
IBaseRepository<Eqmt19> eqmt19Rep,
|
|
|
IBaseRepository<EqmtPubData> eqmtPubRep,
|
|
|
IBaseRepository<EqmtBase> eqmtBaseRep,
|
|
|
IBaseRepository<EqmtProductSpec> eqmtProductSpecRep,
|
|
|
IBaseRepository<EqmtCollectAddData> eqmtAddDataRep,
|
|
|
IBaseRepository<EqmtCollectDailyShift> eqmtCollectDailyShiftRep,
|
|
|
IBaseRepository<EqmtExceptMaster> eqmtExceptMasterRep,
|
|
|
IBaseRepository<EqmtCollectQCResult> eqmtCollectQCResultRep
|
|
|
)
|
|
|
{
|
|
|
_logger = logger;
|
|
|
_melsecMcNet = new MelsecMcNet();
|
|
|
_eqmtExceptRep = eqmtExceptRep;
|
|
|
_eqmtExceptHisRep = eqmtExceptHisRep;
|
|
|
//_eqmtExceptMasterRep = eqmtExceptMasterRep;
|
|
|
|
|
|
_eqmt13Rep = eqmt13Rep;
|
|
|
_eqmt15Rep = eqmt15Rep;
|
|
|
_eqmt7Rep = eqmt7Rep;
|
|
|
_eqmt2Rep = eqmt2Rep;
|
|
|
_eqmt20Rep = eqmt20Rep;
|
|
|
_eqmt16Rep = eqmt16Rep;
|
|
|
_eqmt17Rep = eqmt17Rep;
|
|
|
_eqmt18Rep = eqmt18Rep;
|
|
|
_eqmt19Rep = eqmt19Rep;
|
|
|
_eqmtPubRep = eqmtPubRep;
|
|
|
_eqmtBaseRep = eqmtBaseRep;
|
|
|
_eqmtProductSpecRep = eqmtProductSpecRep;
|
|
|
_eqmtAddDataRep = eqmtAddDataRep;
|
|
|
_eqmtCollectDailyShiftRep = eqmtCollectDailyShiftRep;
|
|
|
_eqmtExceptMasterRep = eqmtExceptMasterRep;
|
|
|
_eqmtCollectQCResultRep = eqmtCollectQCResultRep;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 打开连接
|
|
|
/// </summary>
|
|
|
/// <param name="ip"></param>
|
|
|
/// <param name="port"></param>
|
|
|
/// <returns></returns>
|
|
|
private bool ConnectPLC(string ip, int port)
|
|
|
{
|
|
|
_melsecMcNet.IpAddress = ip;
|
|
|
_melsecMcNet.Port = port;
|
|
|
|
|
|
DisConnectPLC();
|
|
|
//打开连接
|
|
|
try
|
|
|
{
|
|
|
var connResult = _melsecMcNet.ConnectServer();
|
|
|
|
|
|
_logger.LogInformation($"打开连接 ip:{ip} port:{port}");
|
|
|
return connResult.IsSuccess;
|
|
|
}
|
|
|
catch (Exception)
|
|
|
{
|
|
|
_logger.LogError($"打开连接失败 ip:{ip} port:{port}");
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
/// <summary>
|
|
|
/// 关闭连接
|
|
|
/// </summary>
|
|
|
private void DisConnectPLC()
|
|
|
{
|
|
|
_melsecMcNet.ConnectClose();
|
|
|
}
|
|
|
|
|
|
#region 前辈所写
|
|
|
/// <summary>
|
|
|
/// 读取13线数据
|
|
|
/// </summary>
|
|
|
public async Task ReadDataLine13(EquipInput input)
|
|
|
{
|
|
|
Stopwatch oTime1 = new Stopwatch();
|
|
|
oTime1.Start(); //记录开始时间
|
|
|
try
|
|
|
{
|
|
|
_logger.LogInformation($"读取13线数据 开始");
|
|
|
|
|
|
var eqmt13 = new Eqmt13()
|
|
|
{
|
|
|
eqmt_id = input.eqmt_id,
|
|
|
collect_id = Guid.NewGuid().ToString(),
|
|
|
gmt_create = DateTime.Now,
|
|
|
};
|
|
|
|
|
|
var connSuccess = ConnectPLC(input.ip, input.port[0]);
|
|
|
var tryreadData = _melsecMcNet.ReadBool("M88").IsSuccess;
|
|
|
if (connSuccess && tryreadData)
|
|
|
{
|
|
|
//L271-L273 L271=240;L272=290;L273=350
|
|
|
var L271 = _melsecMcNet.ReadBool("L271", 3);
|
|
|
if (L271.IsSuccess && L271.Content.Length > 0)
|
|
|
{
|
|
|
eqmt13.l271 = Convert.ToByte(L271.Content[0]);
|
|
|
}
|
|
|
if (L271.IsSuccess && L271.Content.Length > 1)
|
|
|
{
|
|
|
eqmt13.l272 = Convert.ToByte(L271.Content[1]);
|
|
|
}
|
|
|
if (L271.IsSuccess && L271.Content.Length > 2)
|
|
|
{
|
|
|
eqmt13.l273 = Convert.ToByte(L271.Content[2]);
|
|
|
}
|
|
|
|
|
|
eqmt13.d60 = _melsecMcNet.ReadInt16("D60").Content; // 生产速度
|
|
|
eqmt13.d5030 = _melsecMcNet.ReadInt32("D5030").Content; // 总生产产量
|
|
|
eqmt13.d5032 = _melsecMcNet.ReadInt32("D5032").Content; // 总成品量
|
|
|
eqmt13.d10398 = _melsecMcNet.ReadInt32("D10398").Content; // 当日生产产量
|
|
|
eqmt13.d10448 = _melsecMcNet.ReadInt32("D10448").Content; // 当日成品量
|
|
|
eqmt13.d10650 = _melsecMcNet.ReadFloat("D10650").Content.ObjToDecimal(0); //当日合格率
|
|
|
eqmt13.d10700 = _melsecMcNet.ReadInt32("D10700").Content; //当日开机时间
|
|
|
eqmt13.d10750 = _melsecMcNet.ReadInt32("D10750").Content; //当日停机时间
|
|
|
eqmt13.m88 = Convert.ToByte(_melsecMcNet.ReadBool("M88").Content); //开机中
|
|
|
|
|
|
eqmt13.d10240 = _melsecMcNet.ReadInt32("D10240").Content;//吸水纸X切计数
|
|
|
eqmt13.d10250 = _melsecMcNet.ReadInt32("D10250").Content;//三层复合X切计数
|
|
|
eqmt13.d10260 = _melsecMcNet.ReadInt32("D10260").Content;//周切刀计数
|
|
|
eqmt13.d10270 = _melsecMcNet.ReadInt32("D10270").Content;//无尘纸X切计数
|
|
|
|
|
|
eqmt13.d900 = _melsecMcNet.ReadInt16("D900").Content;//实时电压L1L2
|
|
|
eqmt13.d901 = _melsecMcNet.ReadInt16("D901").Content;//实时电压L2L3
|
|
|
eqmt13.d902 = _melsecMcNet.ReadInt16("D902").Content;//实时电压L2L1
|
|
|
eqmt13.d903 = _melsecMcNet.ReadInt16("D903").Content;//实时电压L1N
|
|
|
eqmt13.d904 = _melsecMcNet.ReadInt16("D904").Content;//实时电压L2N
|
|
|
eqmt13.d905 = _melsecMcNet.ReadInt16("D905").Content;//实时电压L3N
|
|
|
eqmt13.d906 = _melsecMcNet.ReadInt16("D906").Content;//平均线电压
|
|
|
eqmt13.d907 = _melsecMcNet.ReadInt16("D907").Content;//平均相电压
|
|
|
eqmt13.d908 = _melsecMcNet.ReadInt16("D908").Content;//线电流L1
|
|
|
eqmt13.d909 = _melsecMcNet.ReadInt16("D909").Content;//线电流L2
|
|
|
eqmt13.d910 = _melsecMcNet.ReadInt16("D910").Content;//线电流L3
|
|
|
eqmt13.d911 = _melsecMcNet.ReadInt16("D911").Content;//线电流N
|
|
|
|
|
|
eqmt13.d950 = _melsecMcNet.ReadUInt16("D950").Content;//总有功电量
|
|
|
eqmt13.d952 = _melsecMcNet.ReadUInt16("D952").Content;//总无功电量
|
|
|
eqmt13.d954 = _melsecMcNet.ReadUInt16("D954").Content;//总视在电量
|
|
|
eqmt13.d10900 = _melsecMcNet.ReadUInt16("D10900").Content;//单日有功电量
|
|
|
eqmt13.d10950 = _melsecMcNet.ReadUInt16("D10950").Content;//当日无功电量
|
|
|
eqmt13.d10970 = _melsecMcNet.ReadUInt16("D10970").Content;//单日视在电量
|
|
|
|
|
|
//异常停机数据
|
|
|
#region 异常停机数据
|
|
|
|
|
|
var except01 = new List<string>();
|
|
|
|
|
|
var M160_M190 = _melsecMcNet.ReadBool("M160", 31);
|
|
|
for (int i = 0; i < 31; i++)
|
|
|
{
|
|
|
if (M160_M190.Content[i])
|
|
|
{
|
|
|
except01.Add($"M{160 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var M70 = _melsecMcNet.ReadBool("M70");
|
|
|
if (M70.Content) except01.Add($"M70");
|
|
|
|
|
|
var M700_M745 = _melsecMcNet.ReadBool("M700", 46);
|
|
|
for (int i = 0; i < 46; i++)
|
|
|
{
|
|
|
if (M700_M745.Content[i])
|
|
|
{
|
|
|
except01.Add($"M{700 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var M108_M121 = _melsecMcNet.ReadBool("M108", 14);
|
|
|
for (int i = 0; i < 14; i++)
|
|
|
{
|
|
|
if (M108_M121.Content[i])
|
|
|
{
|
|
|
except01.Add($"M{108 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var M50 = _melsecMcNet.ReadBool("M50");
|
|
|
if (M50.Content) except01.Add($"M50");
|
|
|
|
|
|
var M380_M394 = _melsecMcNet.ReadBool("M380", 15);
|
|
|
for (int i = 0; i < 15; i++)
|
|
|
{
|
|
|
if (M380_M394.Content[i])
|
|
|
{
|
|
|
except01.Add($"M{380 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var B00010_B0002F = _melsecMcNet.ReadBool("B00010", 32);
|
|
|
for (int i = 0; i < 32; i++)
|
|
|
{
|
|
|
if (B00010_B0002F.Content[i])
|
|
|
{
|
|
|
except01.Add($"B000{(16 + i).ToString("x2").ToUpper()}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var B00510_B0052F = _melsecMcNet.ReadBool("B00510", 32);
|
|
|
for (int i = 0; i < 32; i++)
|
|
|
{
|
|
|
if (B00510_B0052F.Content[i])
|
|
|
{
|
|
|
except01.Add($"B005{(16 + i).ToString("x2").ToUpper()}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var B00A10_B00A2F = _melsecMcNet.ReadBool("B00A10", 32);
|
|
|
for (int i = 0; i < 32; i++)
|
|
|
{
|
|
|
if (B00A10_B00A2F.Content[i])
|
|
|
{
|
|
|
except01.Add($"B00A{(16 + i).ToString("x2").ToUpper()}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var B01810_B01819 = _melsecMcNet.ReadBool("B01810", 10);
|
|
|
for (int i = 0; i < 10; i++)
|
|
|
{
|
|
|
if (B01810_B01819.Content[i])
|
|
|
{
|
|
|
except01.Add($"B018{(16 + i).ToString("x2").ToUpper()}");
|
|
|
}
|
|
|
}
|
|
|
#endregion
|
|
|
|
|
|
//异常不停机数据
|
|
|
#region 异常不停机数据
|
|
|
|
|
|
var except02 = new List<string>();
|
|
|
|
|
|
var L100_L115 = _melsecMcNet.ReadBool("L100", 18);
|
|
|
for (int i = 0; i < 18; i++)
|
|
|
{
|
|
|
if (L100_L115.Content[i])
|
|
|
{
|
|
|
except02.Add($"L{100 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var M800_M834 = _melsecMcNet.ReadBool("M800", 35);
|
|
|
for (int i = 0; i < 35; i++)
|
|
|
{
|
|
|
if (M800_M834.Content[i])
|
|
|
{
|
|
|
except02.Add($"M{800 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var M860_M874 = _melsecMcNet.ReadBool("M860", 15);
|
|
|
for (int i = 0; i < 15; i++)
|
|
|
{
|
|
|
if (M860_M874.Content[i])
|
|
|
{
|
|
|
except02.Add($"M{860 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var SM52 = _melsecMcNet.ReadBool("SM52");
|
|
|
if (SM52.Content) except02.Add($"SM52");
|
|
|
|
|
|
var B0000F = _melsecMcNet.ReadBool("B0000F");
|
|
|
if (B0000F.Content) except02.Add($"B0000F");
|
|
|
|
|
|
var B0050F = _melsecMcNet.ReadBool("B0050F");
|
|
|
if (B0050F.Content) except02.Add($"B0050F");
|
|
|
|
|
|
var B00A0F = _melsecMcNet.ReadBool("B00A0F");
|
|
|
if (B00A0F.Content) except02.Add($"B00A0F");
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region 增加EqmtPub数据
|
|
|
var product_type = "";
|
|
|
if (eqmt13.l271 == 1)
|
|
|
product_type = "1";
|
|
|
else if (eqmt13.l272 == 1)
|
|
|
product_type = "2";
|
|
|
else if (eqmt13.l273 == 1)
|
|
|
product_type = "3";
|
|
|
var eqmtBaseInfo = (await _eqmtBaseRep.QueryAsync(x => x.eqmt_id == eqmt13.eqmt_id)).FirstOrDefault();
|
|
|
var eqmtProductSpecInfo = (await _eqmtProductSpecRep.QueryAsync(x => x.eqmt_id == eqmt13.eqmt_id && x.product_type == product_type)).FirstOrDefault();
|
|
|
|
|
|
EqmtPubData newPub = new EqmtPubData();
|
|
|
|
|
|
newPub.collect_id = eqmt13.collect_id;
|
|
|
newPub.eqmt_id = eqmt13.eqmt_id;
|
|
|
newPub.product_type = product_type;
|
|
|
newPub.product_type_name = $"{eqmtBaseInfo?.product}({eqmtProductSpecInfo?.product_type_name})";
|
|
|
newPub.speed = eqmt13.d60;
|
|
|
newPub.total_product_qty = eqmt13.d5032;
|
|
|
newPub.intraday_product_qty = eqmt13.d10398;
|
|
|
newPub.intraday_ok_qty = eqmt13.d10448;
|
|
|
newPub.intraday_ng_qty = eqmt13.d10398 - eqmt13.d10448;
|
|
|
newPub.intraday_yield_rate = eqmt13.d10650;
|
|
|
newPub.intraday_eqmt_run_time = eqmt13.d10700 + eqmt13.d10750;
|
|
|
newPub.intraday_eqmt_work_time = eqmt13.d10700;
|
|
|
newPub.intraday_eqmt_stop_time = eqmt13.d10750;
|
|
|
newPub.eqmt_status = eqmt13.m88;
|
|
|
newPub.eqmt_except_flag = Convert.ToByte(except01.Count() > 0);
|
|
|
newPub.eqmt_alarm_flag = Convert.ToByte(except02.Count() > 0);
|
|
|
#endregion
|
|
|
|
|
|
#region 报警数据
|
|
|
var exceptHisList = new List<EqmtExceptHis>();
|
|
|
|
|
|
var exceptList01 = from r in except01
|
|
|
select new EqmtExceptHis()
|
|
|
{
|
|
|
collect_id = eqmt13.collect_id,
|
|
|
eqmt_id = eqmt13.eqmt_id,
|
|
|
registor_address = r
|
|
|
};
|
|
|
|
|
|
exceptHisList.AddRange(exceptList01);
|
|
|
|
|
|
var exceptList02 = from r in except01
|
|
|
select new EqmtExceptHis()
|
|
|
{
|
|
|
collect_id = eqmt13.collect_id,
|
|
|
eqmt_id = eqmt13.eqmt_id,
|
|
|
registor_address = r,
|
|
|
};
|
|
|
|
|
|
exceptHisList.AddRange(exceptList02);
|
|
|
|
|
|
|
|
|
var exceptList = from r in exceptHisList
|
|
|
select new EqmtExcept()
|
|
|
{
|
|
|
collect_id = r.collect_id,
|
|
|
eqmt_id = r.eqmt_id,
|
|
|
registor_address = r.registor_address,
|
|
|
};
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region 写入数据库
|
|
|
//报工数据 一定要写在 pubData插入之前
|
|
|
var addData = await CreateEqmtCollectAddData(newPub);
|
|
|
await _eqmtAddDataRep.InsertAsync(addData);
|
|
|
|
|
|
await _eqmt13Rep.InsertAsync(eqmt13);
|
|
|
|
|
|
newPub.oee = addData.oee;
|
|
|
await _eqmtPubRep.InsertAsync(newPub);
|
|
|
|
|
|
//历史数据一直累加
|
|
|
await _eqmtExceptHisRep.InsertAsync(exceptHisList);
|
|
|
|
|
|
//实时数据只显示最后的
|
|
|
await _eqmtExceptRep.DeleteAsync(x => x.eqmt_id == eqmt13.eqmt_id);
|
|
|
await _eqmtExceptRep.InsertAsync(exceptList);
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
|
_logger.LogInformation($"读取13线数据 异常 {e.Message}");
|
|
|
}
|
|
|
finally
|
|
|
{
|
|
|
oTime1.Stop(); //记录结束时间
|
|
|
_logger.LogInformation($"读取13线数据 完成,耗时{oTime1.Elapsed.TotalSeconds}秒");
|
|
|
DisConnectPLC();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 读取16线数据
|
|
|
/// 一个端口
|
|
|
/// </summary>
|
|
|
public async Task ReadDataLine16(EquipInput input)
|
|
|
{
|
|
|
Stopwatch oTime1 = new Stopwatch();
|
|
|
oTime1.Start(); //记录开始时间
|
|
|
try
|
|
|
{
|
|
|
_logger.LogInformation($"读取16线数据 开始");
|
|
|
|
|
|
var eqmt16 = new Eqmt16()
|
|
|
{
|
|
|
eqmt_id = input.eqmt_id,
|
|
|
collect_id = Guid.NewGuid().ToString(),
|
|
|
gmt_create = DateTime.Now,
|
|
|
};
|
|
|
|
|
|
var connSuccess = ConnectPLC(input.ip, input.port[0]);
|
|
|
var tryreadData = _melsecMcNet.ReadBool("B500").IsSuccess; //开机
|
|
|
if (connSuccess && tryreadData)
|
|
|
{
|
|
|
var d10 = _melsecMcNet.ReadInt32("D10", 1);
|
|
|
eqmt16.d10 = d10.Content[0];
|
|
|
eqmt16.d0 = _melsecMcNet.ReadInt16("D0").Content;
|
|
|
eqmt16.d4000 = _melsecMcNet.ReadInt32("D4000").Content;
|
|
|
eqmt16.d4002 = _melsecMcNet.ReadInt32("D4002").Content;
|
|
|
eqmt16.d4004 = _melsecMcNet.ReadInt32("D4004").Content;
|
|
|
eqmt16.d4006 = _melsecMcNet.ReadInt32("D4006").Content;
|
|
|
eqmt16.d4008 = _melsecMcNet.ReadFloat("D4008").Content.ObjToDecimal(0);
|
|
|
eqmt16.d4022 = _melsecMcNet.ReadInt16("D4022").Content;
|
|
|
eqmt16.d4030 = _melsecMcNet.ReadInt16("D4030").Content;
|
|
|
eqmt16.d4032 = _melsecMcNet.ReadInt16("D4032").Content;
|
|
|
eqmt16.d4042 = _melsecMcNet.ReadInt16("D4042").Content;
|
|
|
eqmt16.d4050 = _melsecMcNet.ReadInt16("D4050").Content;
|
|
|
eqmt16.d4052 = _melsecMcNet.ReadInt16("D4052").Content;
|
|
|
eqmt16.d4062 = _melsecMcNet.ReadInt16("D4062").Content;
|
|
|
eqmt16.d4070 = _melsecMcNet.ReadInt16("D4070").Content;
|
|
|
eqmt16.d4072 = _melsecMcNet.ReadInt16("D4072").Content;
|
|
|
eqmt16.d4080 = _melsecMcNet.ReadFloat("D4080").Content.ObjToDecimal(0);
|
|
|
eqmt16.m40 = Convert.ToByte(_melsecMcNet.ReadBool("B500").Content ? 1 : 0);
|
|
|
eqmt16.m6490 = Convert.ToByte(_melsecMcNet.ReadBool("M6490").Content ? 1 : 0);
|
|
|
|
|
|
//异常停机数据
|
|
|
#region 异常停机数据
|
|
|
|
|
|
var except01 = new List<string>();
|
|
|
|
|
|
var M6001_M6336 = _melsecMcNet.ReadBool("M6001", 336);
|
|
|
for (int i = 0; i < 336; i++)
|
|
|
{
|
|
|
if (M6001_M6336.Content[i])
|
|
|
{
|
|
|
except01.Add($"M{6001 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
//异常不停机数据
|
|
|
#region 异常不停机数据
|
|
|
|
|
|
var except02 = new List<string>();
|
|
|
|
|
|
var M6501_M6756 = _melsecMcNet.ReadBool("M6501", 256);
|
|
|
for (int i = 0; i < 256; i++)
|
|
|
{
|
|
|
if (M6501_M6756.Content[i])
|
|
|
{
|
|
|
except02.Add($"M{6501 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
#region QC数据
|
|
|
var qcList = new Dictionary<string,int>();
|
|
|
|
|
|
var R401_R464 = _melsecMcNet.ReadInt32("R401", 64);
|
|
|
for (int i = 0; i < 64; i++)
|
|
|
{
|
|
|
if (R401_R464.Content[i]>0)
|
|
|
{
|
|
|
qcList.Add($"R{401 + i}", R401_R464.Content[i]);
|
|
|
}
|
|
|
}
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region 增加EqmtPub数据
|
|
|
var eqmtBaseInfo = (await _eqmtBaseRep.QueryAsync(x => x.eqmt_id == eqmt16.eqmt_id)).FirstOrDefault();
|
|
|
var eqmtProductSpecInfo = (await _eqmtProductSpecRep.QueryAsync(x => x.eqmt_id == eqmt16.eqmt_id && x.product_type == eqmt16.d10.ToString())).FirstOrDefault();
|
|
|
EqmtPubData newPub = new EqmtPubData();
|
|
|
|
|
|
newPub.collect_id = eqmt16.collect_id;
|
|
|
newPub.eqmt_id = eqmt16.eqmt_id;
|
|
|
newPub.product_type = eqmt16.d10.ToString();
|
|
|
newPub.product_type_name = $"{eqmtBaseInfo?.product}({eqmtProductSpecInfo?.product_type_name})";
|
|
|
newPub.speed = eqmt16.d0;
|
|
|
newPub.total_product_qty = eqmt16.d4000;
|
|
|
newPub.intraday_product_qty = eqmt16.d4002;
|
|
|
newPub.intraday_ok_qty = eqmt16.d4004;
|
|
|
newPub.intraday_ng_qty = eqmt16.d4006;
|
|
|
newPub.intraday_yield_rate = eqmt16.d4008;
|
|
|
newPub.intraday_eqmt_run_time = eqmt16.d4022 * 3600 + eqmt16.d4030 * 60 + eqmt16.d4032;
|
|
|
newPub.intraday_eqmt_work_time = eqmt16.d4042 * 3600 + eqmt16.d4050 * 60 + eqmt16.d4052;
|
|
|
newPub.intraday_eqmt_stop_time = eqmt16.d4062 * 3600 + eqmt16.d4070 * 60 + eqmt16.d4072;
|
|
|
newPub.intraday_eqmt_work_rate = eqmt16.d4080;
|
|
|
newPub.intraday_eqmt_stop_times = 0;
|
|
|
if (eqmt16.m6490==1)
|
|
|
{
|
|
|
newPub.eqmt_status = 2;
|
|
|
}
|
|
|
else if (eqmt16.m40==1)
|
|
|
{
|
|
|
newPub.eqmt_status = 1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
newPub.eqmt_status = 0;
|
|
|
}
|
|
|
newPub.eqmt_except_flag = Convert.ToByte(except01.Count() > 0);
|
|
|
newPub.eqmt_alarm_flag = Convert.ToByte(except02.Count() > 0);
|
|
|
#endregion
|
|
|
|
|
|
#region 报警数据
|
|
|
var exceptHisList = new List<EqmtExceptHis>();
|
|
|
|
|
|
//报警停机数据
|
|
|
var exceptList01 = from r in except01
|
|
|
select new EqmtExceptHis()
|
|
|
{
|
|
|
collect_id = eqmt16.collect_id,
|
|
|
eqmt_id = eqmt16.eqmt_id,
|
|
|
registor_address = r
|
|
|
};
|
|
|
exceptHisList.AddRange(exceptList01);
|
|
|
|
|
|
//报警不停机数据
|
|
|
var exceptList02 = from r in except01
|
|
|
select new EqmtExceptHis()
|
|
|
{
|
|
|
collect_id = eqmt16.collect_id,
|
|
|
eqmt_id = eqmt16.eqmt_id,
|
|
|
registor_address = r,
|
|
|
};
|
|
|
exceptHisList.AddRange(exceptList02);
|
|
|
|
|
|
//QC数据
|
|
|
var qcAddList = from r in qcList
|
|
|
select new EqmtExceptHis()
|
|
|
{
|
|
|
collect_id = eqmt16.collect_id,
|
|
|
eqmt_id = eqmt16.eqmt_id,
|
|
|
registor_address = r.Key,
|
|
|
qc_result = r.Value,
|
|
|
};
|
|
|
exceptHisList.AddRange(qcAddList);
|
|
|
|
|
|
//异常数据-
|
|
|
var exceptList = from r in exceptHisList
|
|
|
select new EqmtExcept()
|
|
|
{
|
|
|
collect_id = r.collect_id,
|
|
|
eqmt_id = r.eqmt_id,
|
|
|
registor_address = r.registor_address,
|
|
|
qc_result = r.qc_result,
|
|
|
};
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region 写入数据库
|
|
|
//报工数据 一定要写在 pubData插入之前
|
|
|
var addData = await CreateEqmtCollectAddData(newPub);
|
|
|
await _eqmtAddDataRep.InsertAsync(addData);
|
|
|
|
|
|
await _eqmt16Rep.InsertAsync(eqmt16);
|
|
|
|
|
|
newPub.oee = addData.oee;
|
|
|
await _eqmtPubRep.InsertAsync(newPub);
|
|
|
|
|
|
//历史数据一直累加
|
|
|
await _eqmtExceptHisRep.InsertAsync(exceptHisList);
|
|
|
|
|
|
//实时数据只显示最后的
|
|
|
await _eqmtExceptRep.DeleteAsync(x => x.eqmt_id == eqmt16.eqmt_id);
|
|
|
await _eqmtExceptRep.InsertAsync(exceptList);
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
|
_logger.LogInformation($"读取16线数据 异常 {e.Message}");
|
|
|
}
|
|
|
finally
|
|
|
{
|
|
|
oTime1.Stop(); //记录结束时间
|
|
|
_logger.LogInformation($"读取16线数据 完成,耗时{oTime1.Elapsed.TotalSeconds}秒");
|
|
|
DisConnectPLC();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 读取19线数据
|
|
|
/// 一个端口
|
|
|
/// </summary>
|
|
|
public async Task ReadDataLine19(EquipInput input)
|
|
|
{
|
|
|
Stopwatch oTime1 = new Stopwatch();
|
|
|
oTime1.Start(); //记录开始时间
|
|
|
try
|
|
|
{
|
|
|
_logger.LogInformation($"读取19线数据 开始");
|
|
|
|
|
|
var eqmt19 = new Eqmt19()
|
|
|
{
|
|
|
eqmt_id = input.eqmt_id,
|
|
|
collect_id = Guid.NewGuid().ToString(),
|
|
|
gmt_create = DateTime.Now,
|
|
|
};
|
|
|
|
|
|
var connSuccess = ConnectPLC(input.ip, input.port[0]);
|
|
|
var tryreadData = _melsecMcNet.ReadBool("B500").IsSuccess; //开机
|
|
|
if (connSuccess && tryreadData)
|
|
|
{
|
|
|
var d10 = _melsecMcNet.ReadInt32("D10", 1);
|
|
|
eqmt19.d10 = d10.Content[0];
|
|
|
eqmt19.d0 = _melsecMcNet.ReadInt16("D0").Content;
|
|
|
eqmt19.d4000 = _melsecMcNet.ReadInt32("D4000").Content;
|
|
|
eqmt19.d4002 = _melsecMcNet.ReadInt32("D4002").Content;
|
|
|
eqmt19.d4004 = _melsecMcNet.ReadInt32("D4004").Content;
|
|
|
eqmt19.d4006 = _melsecMcNet.ReadInt32("D4006").Content;
|
|
|
eqmt19.d4008 = _melsecMcNet.ReadFloat("D4008").Content.ObjToDecimal(0);
|
|
|
eqmt19.d4022 = _melsecMcNet.ReadInt16("D4022").Content;
|
|
|
eqmt19.d4030 = _melsecMcNet.ReadInt16("D4030").Content;
|
|
|
eqmt19.d4032 = _melsecMcNet.ReadInt16("D4032").Content;
|
|
|
eqmt19.d4042 = _melsecMcNet.ReadInt16("D4042").Content;
|
|
|
eqmt19.d4050 = _melsecMcNet.ReadInt16("D4050").Content;
|
|
|
eqmt19.d4052 = _melsecMcNet.ReadInt16("D4052").Content;
|
|
|
eqmt19.d4062 = _melsecMcNet.ReadInt16("D4062").Content;
|
|
|
eqmt19.d4070 = _melsecMcNet.ReadInt16("D4070").Content;
|
|
|
eqmt19.d4072 = _melsecMcNet.ReadInt16("D4072").Content;
|
|
|
eqmt19.d4080 = _melsecMcNet.ReadFloat("D4080").Content.ObjToDecimal(0);
|
|
|
eqmt19.m40 = Convert.ToByte(_melsecMcNet.ReadBool("B500").Content ? 1 : 0);
|
|
|
eqmt19.m6490 = Convert.ToByte(_melsecMcNet.ReadBool("M6490").Content ? 1 : 0);
|
|
|
|
|
|
//异常停机数据
|
|
|
#region 异常停机数据
|
|
|
|
|
|
var except01 = new List<string>();
|
|
|
|
|
|
var M6001_M6336 = _melsecMcNet.ReadBool("M6001", 336);
|
|
|
for (int i = 0; i < 336; i++)
|
|
|
{
|
|
|
if (M6001_M6336.Content[i])
|
|
|
{
|
|
|
except01.Add($"M{6001 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
//异常不停机数据
|
|
|
#region 异常不停机数据
|
|
|
|
|
|
var except02 = new List<string>();
|
|
|
|
|
|
var M6501_M6756 = _melsecMcNet.ReadBool("M6501", 256);
|
|
|
for (int i = 0; i < 256; i++)
|
|
|
{
|
|
|
if (M6501_M6756.Content[i])
|
|
|
{
|
|
|
except02.Add($"M{6501 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
#region QC数据
|
|
|
var qcList = new Dictionary<string, int>();
|
|
|
|
|
|
var R401_R464 = _melsecMcNet.ReadInt32("R401", 64);
|
|
|
for (int i = 0; i < 64; i++)
|
|
|
{
|
|
|
if (R401_R464.Content[i] > 0)
|
|
|
{
|
|
|
qcList.Add($"R{401 + i}", R401_R464.Content[i]);
|
|
|
}
|
|
|
}
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region 增加EqmtPub数据
|
|
|
var eqmtBaseInfo = (await _eqmtBaseRep.QueryAsync(x => x.eqmt_id == eqmt19.eqmt_id)).FirstOrDefault();
|
|
|
var eqmtProductSpecInfo = (await _eqmtProductSpecRep.QueryAsync(x => x.eqmt_id == eqmt19.eqmt_id && x.product_type == eqmt19.d10.ToString())).FirstOrDefault();
|
|
|
EqmtPubData newPub = new EqmtPubData();
|
|
|
|
|
|
newPub.collect_id = eqmt19.collect_id;
|
|
|
newPub.eqmt_id = eqmt19.eqmt_id;
|
|
|
newPub.product_type = eqmt19.d10.ToString();
|
|
|
newPub.product_type_name = $"{eqmtBaseInfo?.product}({eqmtProductSpecInfo?.product_type_name})";
|
|
|
newPub.speed = eqmt19.d0;
|
|
|
newPub.total_product_qty = eqmt19.d4000;
|
|
|
newPub.intraday_product_qty = eqmt19.d4002;
|
|
|
newPub.intraday_ok_qty = eqmt19.d4004;
|
|
|
newPub.intraday_ng_qty = eqmt19.d4006;
|
|
|
newPub.intraday_yield_rate = eqmt19.d4008;
|
|
|
newPub.intraday_eqmt_run_time = eqmt19.d4022 * 3600 + eqmt19.d4030 * 60 + eqmt19.d4032;
|
|
|
newPub.intraday_eqmt_work_time = eqmt19.d4042 * 3600 + eqmt19.d4050 * 60 + eqmt19.d4052;
|
|
|
newPub.intraday_eqmt_stop_time = eqmt19.d4062 * 3600 + eqmt19.d4070 * 60 + eqmt19.d4072;
|
|
|
newPub.intraday_eqmt_work_rate = eqmt19.d4080;
|
|
|
newPub.intraday_eqmt_stop_times = 0;
|
|
|
if (eqmt19.m6490==1)
|
|
|
{
|
|
|
newPub.eqmt_status = 2;
|
|
|
}
|
|
|
else if (eqmt19.m40==1)
|
|
|
{
|
|
|
newPub.eqmt_status = 1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
newPub.eqmt_status = 0;
|
|
|
}
|
|
|
newPub.eqmt_except_flag = Convert.ToByte(except01.Count() > 0);
|
|
|
newPub.eqmt_alarm_flag = Convert.ToByte(except02.Count() > 0);
|
|
|
#endregion
|
|
|
|
|
|
#region 报警数据
|
|
|
var exceptHisList = new List<EqmtExceptHis>();
|
|
|
|
|
|
//报警停机数据
|
|
|
var exceptList01 = from r in except01
|
|
|
select new EqmtExceptHis()
|
|
|
{
|
|
|
collect_id = eqmt19.collect_id,
|
|
|
eqmt_id = eqmt19.eqmt_id,
|
|
|
registor_address = r
|
|
|
};
|
|
|
exceptHisList.AddRange(exceptList01);
|
|
|
|
|
|
//报警不停机数据
|
|
|
var exceptList02 = from r in except01
|
|
|
select new EqmtExceptHis()
|
|
|
{
|
|
|
collect_id = eqmt19.collect_id,
|
|
|
eqmt_id = eqmt19.eqmt_id,
|
|
|
registor_address = r,
|
|
|
};
|
|
|
exceptHisList.AddRange(exceptList02);
|
|
|
|
|
|
//QC数据
|
|
|
var qcAddList = from r in qcList
|
|
|
select new EqmtExceptHis()
|
|
|
{
|
|
|
collect_id = eqmt19.collect_id,
|
|
|
eqmt_id = eqmt19.eqmt_id,
|
|
|
registor_address = r.Key,
|
|
|
qc_result = r.Value,
|
|
|
};
|
|
|
exceptHisList.AddRange(qcAddList);
|
|
|
|
|
|
//异常数据-
|
|
|
var exceptList = from r in exceptHisList
|
|
|
select new EqmtExcept()
|
|
|
{
|
|
|
collect_id = r.collect_id,
|
|
|
eqmt_id = r.eqmt_id,
|
|
|
registor_address = r.registor_address,
|
|
|
qc_result = r.qc_result,
|
|
|
};
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region 写入数据库
|
|
|
//报工数据 一定要写在 pubData插入之前
|
|
|
var addData = await CreateEqmtCollectAddData(newPub);
|
|
|
await _eqmtAddDataRep.InsertAsync(addData);
|
|
|
|
|
|
await _eqmt19Rep.InsertAsync(eqmt19);
|
|
|
|
|
|
newPub.oee = addData.oee;
|
|
|
await _eqmtPubRep.InsertAsync(newPub);
|
|
|
|
|
|
//历史数据一直累加
|
|
|
await _eqmtExceptHisRep.InsertAsync(exceptHisList);
|
|
|
|
|
|
//实时数据只显示最后的
|
|
|
await _eqmtExceptRep.DeleteAsync(x => x.eqmt_id == eqmt19.eqmt_id);
|
|
|
await _eqmtExceptRep.InsertAsync(exceptList);
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
|
_logger.LogInformation($"读取19线数据 异常 {e.Message}");
|
|
|
}
|
|
|
finally
|
|
|
{
|
|
|
oTime1.Stop(); //记录结束时间
|
|
|
_logger.LogInformation($"读取19线数据 完成,耗时{oTime1.Elapsed.TotalSeconds}秒");
|
|
|
DisConnectPLC();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 读取17线数据
|
|
|
/// 两个端口
|
|
|
/// </summary>
|
|
|
public async Task ReadDataLine17(EquipInput input)
|
|
|
{
|
|
|
Stopwatch oTime1 = new Stopwatch();
|
|
|
oTime1.Start(); //记录开始时间
|
|
|
try
|
|
|
{
|
|
|
_logger.LogInformation($"读取17线数据 开始");
|
|
|
|
|
|
var eqmt17 = new Eqmt17()
|
|
|
{
|
|
|
eqmt_id = input.eqmt_id,
|
|
|
collect_id = Guid.NewGuid().ToString(),
|
|
|
gmt_create = DateTime.Now,
|
|
|
};
|
|
|
var qcList = new Dictionary<string, int>(); //qc数据
|
|
|
|
|
|
//先读取第二个Plc数据
|
|
|
var connSuccess = ConnectPLC(input.ip, input.port[1]);
|
|
|
var tryreadData = (_melsecMcNet.Read("R622",1)).IsSuccess; //总数量
|
|
|
if (connSuccess && tryreadData)
|
|
|
{
|
|
|
eqmt17.r622 = _melsecMcNet.ReadInt32("R622").Content;
|
|
|
eqmt17.r602 = _melsecMcNet.ReadInt32("R602").Content;
|
|
|
eqmt17.r600 = _melsecMcNet.ReadInt32("R600").Content;
|
|
|
eqmt17.r604 = _melsecMcNet.ReadInt32("R604").Content;
|
|
|
eqmt17.r612 = _melsecMcNet.ReadFloat("R612").Content.ObjToDecimal(0);
|
|
|
eqmt17.r651 = _melsecMcNet.ReadInt16("R651").Content;
|
|
|
eqmt17.r652 = _melsecMcNet.ReadInt16("R652").Content;
|
|
|
eqmt17.r661 = _melsecMcNet.ReadInt16("R661").Content;
|
|
|
eqmt17.r662 = _melsecMcNet.ReadInt16("R662").Content;
|
|
|
eqmt17.r702 = _melsecMcNet.ReadInt16("R675").Content;
|
|
|
eqmt17.r700 = _melsecMcNet.ReadInt16("R674").Content;
|
|
|
eqmt17.r682 = _melsecMcNet.ReadInt16("R672").Content.ObjToDecimal(0);
|
|
|
eqmt17.r689 = _melsecMcNet.ReadInt16("R689").Content;
|
|
|
|
|
|
#region QC数据
|
|
|
|
|
|
//qc数据
|
|
|
var R801_R864 = _melsecMcNet.ReadInt32("R801", 64);
|
|
|
for (int i = 0; i < 64; i++)
|
|
|
{
|
|
|
if (R801_R864.Content[i] > 0)
|
|
|
{
|
|
|
qcList.Add($"R{801 + i}", R801_R864.Content[i]);
|
|
|
}
|
|
|
}
|
|
|
#endregion
|
|
|
}
|
|
|
|
|
|
|
|
|
//再读取第一个Plc数据
|
|
|
connSuccess = ConnectPLC(input.ip, input.port[0]);
|
|
|
tryreadData = (_melsecMcNet.Read("M610", 1)).IsSuccess; //开机
|
|
|
if (connSuccess && tryreadData)
|
|
|
{
|
|
|
eqmt17.d10 = _melsecMcNet.ReadInt32("D10").Content.ToString();
|
|
|
eqmt17.d0 = _melsecMcNet.ReadInt16("D0").Content;
|
|
|
eqmt17.m610 = Convert.ToByte(_melsecMcNet.ReadBool("M610").Content ? 1 : 0);
|
|
|
eqmt17.m6490 = Convert.ToByte(_melsecMcNet.ReadBool("M6490").Content ? 1 : 0);
|
|
|
|
|
|
//异常停机数据
|
|
|
#region 异常停机数据
|
|
|
var except01 = new List<string>();
|
|
|
|
|
|
var M6001_M6336 = _melsecMcNet.ReadBool("M6001", 336);
|
|
|
for (int i = 0; i < 336; i++)
|
|
|
{
|
|
|
if (M6001_M6336.Content[i])
|
|
|
{
|
|
|
except01.Add($"M{6001 + i}");
|
|
|
}
|
|
|
}
|
|
|
#endregion
|
|
|
|
|
|
//异常不停机数据
|
|
|
#region 异常不停机数据
|
|
|
var except02 = new List<string>();
|
|
|
|
|
|
var M6501_M6756 = _melsecMcNet.ReadBool("M6501", 256);
|
|
|
for (int i = 0; i < 256; i++)
|
|
|
{
|
|
|
if (M6501_M6756.Content[i])
|
|
|
{
|
|
|
except02.Add($"M{6501 + i}");
|
|
|
}
|
|
|
}
|
|
|
#endregion
|
|
|
|
|
|
#region 增加EqmtPub数据
|
|
|
var eqmtBaseInfo = (await _eqmtBaseRep.QueryAsync(x => x.eqmt_id == eqmt17.eqmt_id)).FirstOrDefault();
|
|
|
var eqmtProductSpecInfo = (await _eqmtProductSpecRep.QueryAsync(x => x.eqmt_id == eqmt17.eqmt_id && x.product_type == eqmt17.d10.ToString())).FirstOrDefault();
|
|
|
EqmtPubData newPub = new EqmtPubData();
|
|
|
|
|
|
newPub.collect_id = eqmt17.collect_id;
|
|
|
newPub.eqmt_id = eqmt17.eqmt_id;
|
|
|
newPub.product_type = eqmt17.d10.ToString();
|
|
|
newPub.product_type_name = $"{eqmtBaseInfo?.product}({eqmtProductSpecInfo?.product_type_name})";
|
|
|
newPub.speed = eqmt17.d0;
|
|
|
newPub.total_product_qty = eqmt17.r622;
|
|
|
newPub.intraday_product_qty = eqmt17.r602;
|
|
|
newPub.intraday_ok_qty = eqmt17.r600;
|
|
|
newPub.intraday_ng_qty = eqmt17.r604;
|
|
|
newPub.intraday_yield_rate = eqmt17.r612;
|
|
|
newPub.intraday_eqmt_run_time = eqmt17.r652 * 3600 + eqmt17.r651 * 60 ;
|
|
|
newPub.intraday_eqmt_work_time = eqmt17.r662 * 3600 + eqmt17.r661 * 60 ;
|
|
|
newPub.intraday_eqmt_stop_time = eqmt17.r700 * 3600 + eqmt17.r702 * 60 ;
|
|
|
newPub.intraday_eqmt_work_rate = eqmt17.r682;
|
|
|
newPub.intraday_eqmt_stop_times = eqmt17.r689;
|
|
|
if (eqmt17.m6490==1)
|
|
|
{
|
|
|
newPub.eqmt_status = 2;
|
|
|
}
|
|
|
else if (eqmt17.m610==1)
|
|
|
{
|
|
|
newPub.eqmt_status = 1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
newPub.eqmt_status = 0;
|
|
|
}
|
|
|
newPub.eqmt_except_flag = Convert.ToByte(except01.Count() > 0);
|
|
|
newPub.eqmt_alarm_flag = Convert.ToByte(except02.Count() > 0);
|
|
|
#endregion
|
|
|
|
|
|
#region 报警数据
|
|
|
var exceptHisList = new List<EqmtExceptHis>();
|
|
|
|
|
|
//报警停机数据
|
|
|
var exceptList01 = from r in except01
|
|
|
select new EqmtExceptHis()
|
|
|
{
|
|
|
collect_id = eqmt17.collect_id,
|
|
|
eqmt_id = eqmt17.eqmt_id,
|
|
|
registor_address = r
|
|
|
};
|
|
|
exceptHisList.AddRange(exceptList01);
|
|
|
|
|
|
//报警不停机数据
|
|
|
var exceptList02 = from r in except01
|
|
|
select new EqmtExceptHis()
|
|
|
{
|
|
|
collect_id = eqmt17.collect_id,
|
|
|
eqmt_id = eqmt17.eqmt_id,
|
|
|
registor_address = r,
|
|
|
};
|
|
|
exceptHisList.AddRange(exceptList02);
|
|
|
|
|
|
//QC数据
|
|
|
var qcAddList = from r in qcList
|
|
|
select new EqmtExceptHis()
|
|
|
{
|
|
|
collect_id = eqmt17.collect_id,
|
|
|
eqmt_id = eqmt17.eqmt_id,
|
|
|
registor_address = r.Key,
|
|
|
qc_result = r.Value,
|
|
|
};
|
|
|
exceptHisList.AddRange(qcAddList);
|
|
|
|
|
|
//异常数据-
|
|
|
var exceptList = from r in exceptHisList
|
|
|
select new EqmtExcept()
|
|
|
{
|
|
|
collect_id = r.collect_id,
|
|
|
eqmt_id = r.eqmt_id,
|
|
|
registor_address = r.registor_address,
|
|
|
qc_result = r.qc_result,
|
|
|
};
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region 写入数据库
|
|
|
//报工数据 一定要写在 pubData插入之前
|
|
|
var addData = await CreateEqmtCollectAddData(newPub);
|
|
|
await _eqmtAddDataRep.InsertAsync(addData);
|
|
|
|
|
|
await _eqmt17Rep.InsertAsync(eqmt17);
|
|
|
|
|
|
newPub.oee = addData.oee;
|
|
|
await _eqmtPubRep.InsertAsync(newPub);
|
|
|
|
|
|
//历史数据一直累加
|
|
|
await _eqmtExceptHisRep.InsertAsync(exceptHisList);
|
|
|
|
|
|
//实时数据只显示最后的
|
|
|
await _eqmtExceptRep.DeleteAsync(x => x.eqmt_id == eqmt17.eqmt_id);
|
|
|
await _eqmtExceptRep.InsertAsync(exceptList);
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
|
_logger.LogInformation($"读取17线数据 异常 {e.Message}");
|
|
|
}
|
|
|
finally
|
|
|
{
|
|
|
oTime1.Stop(); //记录结束时间
|
|
|
_logger.LogInformation($"读取17线数据 完成,耗时{oTime1.Elapsed.TotalSeconds}秒");
|
|
|
DisConnectPLC();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 读取18线数据
|
|
|
/// 两个端口
|
|
|
/// </summary>
|
|
|
public async Task ReadDataLine18(EquipInput input)
|
|
|
{
|
|
|
Stopwatch oTime1 = new Stopwatch();
|
|
|
oTime1.Start(); //记录开始时间
|
|
|
try
|
|
|
{
|
|
|
_logger.LogInformation($"读取18线数据 开始");
|
|
|
|
|
|
var eqmt18 = new Eqmt18()
|
|
|
{
|
|
|
eqmt_id = input.eqmt_id,
|
|
|
collect_id = Guid.NewGuid().ToString(),
|
|
|
gmt_create = DateTime.Now,
|
|
|
};
|
|
|
var qcList = new Dictionary<string, int>(); //qc数据
|
|
|
|
|
|
//先读取第二个Plc数据
|
|
|
var connSuccess = ConnectPLC(input.ip, input.port[1]);
|
|
|
var tryreadData = (_melsecMcNet.Read("R622", 1)).IsSuccess; //总数量
|
|
|
if (connSuccess && tryreadData)
|
|
|
{
|
|
|
eqmt18.r622 = _melsecMcNet.ReadInt32("R622").Content;
|
|
|
eqmt18.r602 = _melsecMcNet.ReadInt32("R602").Content;
|
|
|
eqmt18.r600 = _melsecMcNet.ReadInt32("R600").Content;
|
|
|
eqmt18.r604 = _melsecMcNet.ReadInt32("R604").Content;
|
|
|
eqmt18.r612 = _melsecMcNet.ReadFloat("R612").Content.ObjToDecimal(0);
|
|
|
eqmt18.r651 = _melsecMcNet.ReadInt16("R651").Content;
|
|
|
eqmt18.r652 = _melsecMcNet.ReadInt16("R652").Content;
|
|
|
eqmt18.r661 = _melsecMcNet.ReadInt16("R661").Content;
|
|
|
eqmt18.r662 = _melsecMcNet.ReadInt16("R662").Content;
|
|
|
eqmt18.r702 = _melsecMcNet.ReadInt16("R702").Content;
|
|
|
eqmt18.r700 = _melsecMcNet.ReadInt16("R700").Content;
|
|
|
eqmt18.r682 = _melsecMcNet.ReadFloat("R682").Content.ObjToDecimal(0);
|
|
|
eqmt18.r689 = _melsecMcNet.ReadInt16("R689").Content;
|
|
|
|
|
|
#region QC数据
|
|
|
|
|
|
//qc数据
|
|
|
var R801_R864 = _melsecMcNet.ReadInt32("R801", 64);
|
|
|
for (int i = 0; i < 64; i++)
|
|
|
{
|
|
|
if (R801_R864.Content[i] > 0)
|
|
|
{
|
|
|
qcList.Add($"R{801 + i}", R801_R864.Content[i]);
|
|
|
}
|
|
|
}
|
|
|
#endregion
|
|
|
}
|
|
|
|
|
|
|
|
|
//再读取第一个Plc数据
|
|
|
connSuccess = ConnectPLC(input.ip, input.port[0]);
|
|
|
tryreadData = (_melsecMcNet.Read("M610", 1)).IsSuccess; //开机
|
|
|
if (connSuccess && tryreadData)
|
|
|
{
|
|
|
eqmt18.d10 = _melsecMcNet.ReadInt32("D10").Content.ToString();
|
|
|
eqmt18.d0 = _melsecMcNet.ReadInt16("D0").Content;
|
|
|
eqmt18.m610 = Convert.ToByte(_melsecMcNet.ReadBool("M610").Content ? 1 : 0);
|
|
|
eqmt18.m6490 = Convert.ToByte(_melsecMcNet.ReadBool("M6490").Content ? 1 : 0);
|
|
|
|
|
|
//异常停机数据
|
|
|
#region 异常停机数据
|
|
|
var except01 = new List<string>();
|
|
|
|
|
|
var M6001_M6336 = _melsecMcNet.ReadBool("M6001", 336);
|
|
|
for (int i = 0; i < 336; i++)
|
|
|
{
|
|
|
if (M6001_M6336.Content[i])
|
|
|
{
|
|
|
except01.Add($"M{6001 + i}");
|
|
|
}
|
|
|
}
|
|
|
#endregion
|
|
|
|
|
|
//异常不停机数据
|
|
|
#region 异常不停机数据
|
|
|
var except02 = new List<string>();
|
|
|
|
|
|
var M6501_M6756 = _melsecMcNet.ReadBool("M6501", 256);
|
|
|
for (int i = 0; i < 256; i++)
|
|
|
{
|
|
|
if (M6501_M6756.Content[i])
|
|
|
{
|
|
|
except02.Add($"M{6501 + i}");
|
|
|
}
|
|
|
}
|
|
|
#endregion
|
|
|
|
|
|
#region 增加EqmtPub数据
|
|
|
var eqmtBaseInfo = (await _eqmtBaseRep.QueryAsync(x => x.eqmt_id == eqmt18.eqmt_id)).FirstOrDefault();
|
|
|
var eqmtProductSpecInfo = (await _eqmtProductSpecRep.QueryAsync(x => x.eqmt_id == eqmt18.eqmt_id && x.product_type == eqmt18.d10.ToString())).FirstOrDefault();
|
|
|
EqmtPubData newPub = new EqmtPubData();
|
|
|
|
|
|
newPub.collect_id = eqmt18.collect_id;
|
|
|
newPub.eqmt_id = eqmt18.eqmt_id;
|
|
|
newPub.product_type = eqmt18.d10.ToString();
|
|
|
newPub.product_type_name = $"{eqmtBaseInfo?.product}({eqmtProductSpecInfo?.product_type_name})";
|
|
|
newPub.speed = eqmt18.d0;
|
|
|
newPub.total_product_qty = eqmt18.r622;
|
|
|
newPub.intraday_product_qty = eqmt18.r602;
|
|
|
newPub.intraday_ok_qty = eqmt18.r600;
|
|
|
newPub.intraday_ng_qty = eqmt18.r604;
|
|
|
newPub.intraday_yield_rate = eqmt18.r612;
|
|
|
newPub.intraday_eqmt_run_time = eqmt18.r652 * 3600 + eqmt18.r651 * 60;
|
|
|
newPub.intraday_eqmt_work_time = eqmt18.r662 * 3600 + eqmt18.r661 * 60;
|
|
|
newPub.intraday_eqmt_stop_time = eqmt18.r700 * 3600 + eqmt18.r702 * 60;
|
|
|
newPub.intraday_eqmt_work_rate = eqmt18.r682;
|
|
|
newPub.intraday_eqmt_stop_times = eqmt18.r689;
|
|
|
if (eqmt18.m6490==1)
|
|
|
{
|
|
|
newPub.eqmt_status = 2;
|
|
|
}
|
|
|
else if (eqmt18.m610==1)
|
|
|
{
|
|
|
newPub.eqmt_status = 1;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
newPub.eqmt_status = 0;
|
|
|
}
|
|
|
newPub.eqmt_except_flag = Convert.ToByte(except01.Count() > 0);
|
|
|
newPub.eqmt_alarm_flag = Convert.ToByte(except02.Count() > 0);
|
|
|
#endregion
|
|
|
|
|
|
#region 报警数据
|
|
|
var exceptHisList = new List<EqmtExceptHis>();
|
|
|
|
|
|
//报警停机数据
|
|
|
var exceptList01 = from r in except01
|
|
|
select new EqmtExceptHis()
|
|
|
{
|
|
|
collect_id = eqmt18.collect_id,
|
|
|
eqmt_id = eqmt18.eqmt_id,
|
|
|
registor_address = r
|
|
|
};
|
|
|
exceptHisList.AddRange(exceptList01);
|
|
|
|
|
|
//报警不停机数据
|
|
|
var exceptList02 = from r in except01
|
|
|
select new EqmtExceptHis()
|
|
|
{
|
|
|
collect_id = eqmt18.collect_id,
|
|
|
eqmt_id = eqmt18.eqmt_id,
|
|
|
registor_address = r,
|
|
|
};
|
|
|
exceptHisList.AddRange(exceptList02);
|
|
|
|
|
|
//QC数据
|
|
|
var qcAddList = from r in qcList
|
|
|
select new EqmtExceptHis()
|
|
|
{
|
|
|
collect_id = eqmt18.collect_id,
|
|
|
eqmt_id = eqmt18.eqmt_id,
|
|
|
registor_address = r.Key,
|
|
|
qc_result = r.Value,
|
|
|
};
|
|
|
exceptHisList.AddRange(qcAddList);
|
|
|
|
|
|
//异常数据-
|
|
|
var exceptList = from r in exceptHisList
|
|
|
select new EqmtExcept()
|
|
|
{
|
|
|
collect_id = r.collect_id,
|
|
|
eqmt_id = r.eqmt_id,
|
|
|
registor_address = r.registor_address,
|
|
|
qc_result = r.qc_result,
|
|
|
};
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region 写入数据库
|
|
|
//报工数据 一定要写在 pubData插入之前
|
|
|
var addData = await CreateEqmtCollectAddData(newPub);
|
|
|
await _eqmtAddDataRep.InsertAsync(addData);
|
|
|
|
|
|
await _eqmt18Rep.InsertAsync(eqmt18);
|
|
|
|
|
|
newPub.oee = addData.oee;
|
|
|
await _eqmtPubRep.InsertAsync(newPub);
|
|
|
|
|
|
//历史数据一直累加
|
|
|
await _eqmtExceptHisRep.InsertAsync(exceptHisList);
|
|
|
|
|
|
//班次数据,QC,新增异常数据
|
|
|
//await _eqmtExceptRep.DeleteAsync(x => x.eqmt_id == eqmt18.eqmt_id);
|
|
|
//await _eqmtExceptRep.InsertAsync(exceptList);
|
|
|
await DailyShiftData(newPub, exceptHisList);
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
|
_logger.LogInformation($"读取18线数据 异常 {e.Message}");
|
|
|
}
|
|
|
finally
|
|
|
{
|
|
|
oTime1.Stop(); //记录结束时间
|
|
|
_logger.LogInformation($"读取18线数据 完成,耗时{oTime1.Elapsed.TotalSeconds}秒");
|
|
|
DisConnectPLC();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// 创建间隔采集数据
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
private async Task<EqmtCollectAddData> CreateEqmtCollectAddData(EqmtPubData pubData)
|
|
|
{
|
|
|
var eqmtBaseInfo = (await _eqmtBaseRep.QueryAsync(x => x.eqmt_id == pubData.eqmt_id)).FirstOrDefault();
|
|
|
var eqmtProductSpecInfo = (await _eqmtProductSpecRep.QueryAsync(x => x.eqmt_id == pubData.eqmt_id && x.product_type == pubData.product_type)).FirstOrDefault();
|
|
|
|
|
|
var ret = new EqmtCollectAddData()
|
|
|
{
|
|
|
eqmt_id = pubData.eqmt_id,
|
|
|
line_name = eqmtBaseInfo?.line_name,
|
|
|
product = eqmtBaseInfo.product,
|
|
|
product_type = pubData.product_type,
|
|
|
product_type_name = eqmtProductSpecInfo?.product_type_name,
|
|
|
eqmt_status = pubData.eqmt_status,
|
|
|
};
|
|
|
ret.add_datetime = ret.gmt_create;
|
|
|
|
|
|
|
|
|
if (eqmtBaseInfo == null) return ret;
|
|
|
|
|
|
|
|
|
//时间开动率 = 开动时间 / 负荷时间(设备收集)
|
|
|
decimal timeRate = 0;
|
|
|
if (pubData.intraday_eqmt_work_time != 0)
|
|
|
{
|
|
|
timeRate = Convert.ToDecimal( pubData.intraday_eqmt_run_time) / Convert.ToDecimal(pubData.intraday_eqmt_work_time);
|
|
|
}
|
|
|
|
|
|
//性能开动率 = 净开动率×速度开动率
|
|
|
|
|
|
//净开动率 = 加工数量×实际加工周期 / 开动时间 速度是按每分钟生产的个数算的,所以开动时间要换算成分钟
|
|
|
decimal runRate = 0;
|
|
|
if (pubData.speed > 0 && pubData.intraday_eqmt_run_time > 0)
|
|
|
{
|
|
|
runRate = pubData.intraday_product_qty * (1m / pubData.speed) / (pubData.intraday_eqmt_run_time / 60m);
|
|
|
}
|
|
|
|
|
|
//速度开动率 = 理论加工周期 / 实际加工周期 = (1/理论加工速度) / (1/实际加工速度) = 实际加工速度/理论加工速度
|
|
|
decimal speedRate = 0;
|
|
|
if (eqmtBaseInfo != null && eqmtBaseInfo.strand_speed != 0)
|
|
|
{
|
|
|
speedRate = pubData.speed.ObjToDecimal() / eqmtBaseInfo.strand_speed.ObjToDecimal();
|
|
|
}
|
|
|
|
|
|
//合格品率=合格品数量 / 加工数量(设备收集)
|
|
|
decimal okRate = pubData.intraday_yield_rate;
|
|
|
|
|
|
//OEE = 时间开动率×性能开动率×合格品率×100% 因为合格率已经有百分比了,所以这里不用8100
|
|
|
var oee = timeRate * runRate * speedRate * okRate;
|
|
|
|
|
|
ret.oee = oee;
|
|
|
|
|
|
//最后一条采集数据
|
|
|
var lineLastData = (await _eqmtPubRep.QueryAsync(x => x.eqmt_id == pubData.eqmt_id)).OrderByDescending(x => x.gmt_create).FirstOrDefault();
|
|
|
if (lineLastData == null)
|
|
|
{
|
|
|
ret.add_qty = pubData.intraday_product_qty;
|
|
|
ret.add_qty_ok = pubData.intraday_ok_qty;
|
|
|
ret.add_qty_ng = pubData.intraday_ng_qty;
|
|
|
ret.add_during_time = pubData.intraday_eqmt_run_time;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
if (pubData.intraday_product_qty >= lineLastData.intraday_product_qty)
|
|
|
{
|
|
|
//当日产量增加 没换班次
|
|
|
ret.add_qty = pubData.intraday_product_qty - lineLastData.intraday_product_qty;
|
|
|
ret.add_qty_ok = pubData.intraday_ok_qty - lineLastData.intraday_ok_qty;
|
|
|
ret.add_qty_ng = pubData.intraday_ng_qty - lineLastData.intraday_ng_qty;
|
|
|
|
|
|
TimeSpan ts = (ret.gmt_create??DateTime.Now) - (lineLastData.gmt_create ?? DateTime.Now);
|
|
|
ret.add_during_time = Convert.ToInt32(ts.TotalSeconds);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//当日产量增加 清零重新生产
|
|
|
ret.add_qty = pubData.intraday_product_qty;
|
|
|
ret.add_qty_ok = pubData.intraday_ok_qty;
|
|
|
ret.add_qty_ng = pubData.intraday_ng_qty;
|
|
|
ret.add_during_time = pubData.intraday_eqmt_run_time;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 班次产量数据
|
|
|
/// </summary>
|
|
|
/// <returns></returns>
|
|
|
private async Task DailyShiftData(EqmtPubData pubData, List<EqmtExceptHis> exceptList)
|
|
|
{
|
|
|
var eqmtBaseInfo = (await _eqmtBaseRep.QueryAsync(x => x.eqmt_id == pubData.eqmt_id)).FirstOrDefault();
|
|
|
var eqmtProductSpecInfo = (await _eqmtProductSpecRep.QueryAsync(x => x.eqmt_id == pubData.eqmt_id && x.product_type == pubData.product_type)).FirstOrDefault();
|
|
|
var eqmtExceptMastList = await _eqmtExceptMasterRep.QueryAsync(x=>x.eqmt_id == pubData.eqmt_id);
|
|
|
|
|
|
//取最后一个班次信息
|
|
|
var lastShiftData = (await _eqmtCollectDailyShiftRep.QueryAsync(x => x.eqmt_id == pubData.eqmt_id))
|
|
|
.OrderByDescending(x=>x.shift_begin_dt)
|
|
|
.FirstOrDefault();
|
|
|
|
|
|
var dateNow = DateTime.Now;
|
|
|
EqmtCollectDailyShift newShift = new EqmtCollectDailyShift();
|
|
|
|
|
|
//当日开机时间0分钟,直接退出
|
|
|
if (pubData.intraday_eqmt_run_time == 0)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
//班次开始时间
|
|
|
DateTime shiftBeginTime;
|
|
|
//停机次数是否增加
|
|
|
var isAddException = false;
|
|
|
|
|
|
if (lastShiftData == null || lastShiftData.intraday_product_qty > pubData.intraday_product_qty)
|
|
|
{
|
|
|
//没有单班数据,或者换班了(当班数据小于前回当班数据) 新建一个班次
|
|
|
newShift = new EqmtCollectDailyShift()
|
|
|
{
|
|
|
eqmt_id = pubData.eqmt_id,
|
|
|
line_name = eqmtBaseInfo?.line_name,
|
|
|
product = eqmtBaseInfo.product,
|
|
|
product_type = pubData.product_type,
|
|
|
product_type_name = eqmtProductSpecInfo?.product_type_name,
|
|
|
shift_begin_dt = dateNow,
|
|
|
speed = pubData.intraday_product_qty / pubData.intraday_eqmt_run_time * 60, //产量/时间(分钟)
|
|
|
total_product_qty = pubData.total_product_qty,
|
|
|
intraday_product_qty = pubData.intraday_product_qty,
|
|
|
intraday_ok_qty = pubData.intraday_ok_qty,
|
|
|
intraday_ng_qty = pubData.intraday_ng_qty,
|
|
|
intraday_yield_rate = pubData.intraday_yield_rate,
|
|
|
intraday_eqmt_run_time = pubData.intraday_eqmt_run_time,
|
|
|
intraday_eqmt_work_time = pubData.intraday_eqmt_work_time,
|
|
|
intraday_eqmt_stop_time = pubData.intraday_eqmt_stop_time,
|
|
|
intraday_eqmt_work_rate = pubData.intraday_eqmt_work_rate,
|
|
|
intraday_eqmt_stop_times = pubData.intraday_eqmt_stop_times,
|
|
|
|
|
|
gmt_create = dateNow,
|
|
|
create_time = dateNow,
|
|
|
};
|
|
|
newShift.oee = CalOEE(pubData, eqmtBaseInfo?.strand_speed, newShift.speed);
|
|
|
|
|
|
await _eqmtCollectDailyShiftRep.InsertAsync(newShift);
|
|
|
|
|
|
shiftBeginTime = dateNow;
|
|
|
isAddException = pubData.intraday_eqmt_stop_times > 0;
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
//生产总数量没变化,直接退出
|
|
|
if (lastShiftData.total_product_qty == pubData.total_product_qty)
|
|
|
{
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
lastShiftData.speed = pubData.intraday_product_qty / pubData.intraday_eqmt_run_time * 60; //产量/时间(分钟)
|
|
|
lastShiftData.total_product_qty = pubData.total_product_qty;
|
|
|
lastShiftData.intraday_product_qty = pubData.intraday_product_qty;
|
|
|
lastShiftData.intraday_ok_qty = pubData.intraday_ok_qty;
|
|
|
lastShiftData.intraday_ng_qty = pubData.intraday_ng_qty;
|
|
|
lastShiftData.intraday_yield_rate = pubData.intraday_yield_rate;
|
|
|
lastShiftData.intraday_eqmt_run_time = pubData.intraday_eqmt_run_time;
|
|
|
lastShiftData.intraday_eqmt_work_time = pubData.intraday_eqmt_work_time;
|
|
|
lastShiftData.intraday_eqmt_stop_time = pubData.intraday_eqmt_stop_time;
|
|
|
lastShiftData.intraday_eqmt_work_rate = pubData.intraday_eqmt_work_rate;
|
|
|
lastShiftData.intraday_eqmt_stop_times = pubData.intraday_eqmt_stop_times;
|
|
|
|
|
|
lastShiftData.oee = CalOEE(pubData, eqmtBaseInfo?.strand_speed, lastShiftData.speed);
|
|
|
lastShiftData.update_time = dateNow;
|
|
|
lastShiftData.gmt_modified = dateNow;
|
|
|
|
|
|
await _eqmtCollectDailyShiftRep.UpdateAsync(lastShiftData);
|
|
|
|
|
|
shiftBeginTime = lastShiftData.shift_begin_dt??dateNow;
|
|
|
isAddException = lastShiftData.intraday_eqmt_stop_times < pubData.intraday_eqmt_stop_times;
|
|
|
}
|
|
|
|
|
|
//停机次数增加
|
|
|
if (isAddException)
|
|
|
{
|
|
|
var newExceptList = from r in exceptList
|
|
|
//where r.
|
|
|
join m in eqmtExceptMastList on r.registor_address equals m.registor_address into ml
|
|
|
from mname in ml.DefaultIfEmpty()
|
|
|
select new EqmtExcept()
|
|
|
{
|
|
|
shift_begin_dt = shiftBeginTime,
|
|
|
intraday_eqmt_stop_times = pubData.intraday_eqmt_stop_times,
|
|
|
collect_id = pubData.collect_id,
|
|
|
eqmt_id = r.eqmt_id,
|
|
|
registor_address = r.registor_address,
|
|
|
except_type = mname?.except_type,
|
|
|
except_type_name = mname?.except_type_name,
|
|
|
except_message = mname?.except_message,
|
|
|
qc_result = r.qc_result,
|
|
|
};
|
|
|
var targetTypes = new List<int>() { 1, 2, 3 };
|
|
|
await _eqmtExceptRep.InsertAsync(newExceptList.Where(x=> targetTypes.Contains(x.except_type??999)));
|
|
|
}
|
|
|
|
|
|
//更新最新QC数据
|
|
|
var newQCList = from r in exceptList
|
|
|
//where r.
|
|
|
join m in eqmtExceptMastList on r.registor_address equals m.registor_address into ml
|
|
|
from mname in ml.DefaultIfEmpty()
|
|
|
select new EqmtCollectQCResult()
|
|
|
{
|
|
|
shift_begin_dt = shiftBeginTime,
|
|
|
collect_id = pubData.collect_id,
|
|
|
eqmt_id = r.eqmt_id,
|
|
|
registor_address = r.registor_address,
|
|
|
except_type = mname?.except_type,
|
|
|
except_type_name = mname?.except_type_name,
|
|
|
except_message = mname?.except_message,
|
|
|
qc_result = r.qc_result,
|
|
|
};
|
|
|
await _eqmtCollectQCResultRep.DeleteAsync(x => x.eqmt_id == pubData.eqmt_id && x.shift_begin_dt == shiftBeginTime);
|
|
|
await _eqmtCollectQCResultRep.InsertAsync(newQCList.Where(x => x.except_type == 0));
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 计算OEE
|
|
|
/// </summary>
|
|
|
/// <param name="pubData"></param>
|
|
|
/// <param name="standard_speed"></param>
|
|
|
/// <param name="currentSpeed"></param>
|
|
|
/// <returns></returns>
|
|
|
private decimal CalOEE(EqmtPubData pubData,int? standard_speed, int currentSpeed)
|
|
|
{
|
|
|
//时间开动率 = 开动时间 / 负荷时间(设备收集)
|
|
|
decimal timeRate = 0;
|
|
|
if (pubData.intraday_eqmt_work_time != 0)
|
|
|
{
|
|
|
timeRate = Convert.ToDecimal(pubData.intraday_eqmt_run_time) / Convert.ToDecimal(pubData.intraday_eqmt_work_time);
|
|
|
}
|
|
|
|
|
|
//性能开动率 = 净开动率×速度开动率
|
|
|
|
|
|
//净开动率 = 加工数量×实际加工周期 / 开动时间 速度是按每分钟生产的个数算的,所以开动时间要换算成分钟
|
|
|
decimal runRate = 0;
|
|
|
if (currentSpeed > 0)
|
|
|
{
|
|
|
runRate = pubData.intraday_product_qty * (1m / currentSpeed) / (pubData.intraday_eqmt_run_time / 60m);
|
|
|
}
|
|
|
|
|
|
//速度开动率 = 理论加工周期 / 实际加工周期 = (1/理论加工速度) / (1/实际加工速度) = 实际加工速度/理论加工速度
|
|
|
decimal speedRate = 0;
|
|
|
if (standard_speed != 0)
|
|
|
{
|
|
|
speedRate = pubData.speed.ObjToDecimal() / standard_speed.ObjToDecimal();
|
|
|
}
|
|
|
|
|
|
//合格品率=合格品数量 / 加工数量(设备收集)
|
|
|
decimal okRate = pubData.intraday_yield_rate;
|
|
|
|
|
|
//OEE = 时间开动率×性能开动率×合格品率×100% 因为合格率已经有百分比了,所以这里不用8100
|
|
|
var oee = timeRate * runRate * speedRate * okRate;
|
|
|
|
|
|
return oee;
|
|
|
}
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region lgy 新增
|
|
|
|
|
|
/// <summary>
|
|
|
/// 读取15线数据
|
|
|
/// </summary>
|
|
|
public async Task ReadDataLine15(EquipInput input)
|
|
|
{
|
|
|
Stopwatch oTime1 = new Stopwatch();
|
|
|
oTime1.Start(); //记录开始时间
|
|
|
try
|
|
|
{
|
|
|
_logger.LogInformation($"读取15线数据 开始");
|
|
|
|
|
|
var eqmt15 = new Eqmt15()
|
|
|
{
|
|
|
eqmt_id = input.eqmt_id,
|
|
|
collect_id = Guid.NewGuid().ToString(),
|
|
|
gmt_create = DateTime.Now,
|
|
|
};
|
|
|
|
|
|
var connSuccess = ConnectPLC(input.ip, input.port[0]);
|
|
|
var tryreadData = _melsecMcNet.ReadBool("M88").IsSuccess;
|
|
|
if (connSuccess && tryreadData)
|
|
|
{
|
|
|
//L271-L273 L271=240;L272=290;L273=350
|
|
|
var L271 = _melsecMcNet.ReadBool("L271", 3);
|
|
|
if (L271.IsSuccess && L271.Content.Length > 0)
|
|
|
{
|
|
|
eqmt15.l271 = Convert.ToByte(L271.Content[0]);
|
|
|
}
|
|
|
if (L271.IsSuccess && L271.Content.Length > 1)
|
|
|
{
|
|
|
eqmt15.l272 = Convert.ToByte(L271.Content[1]);
|
|
|
}
|
|
|
if (L271.IsSuccess && L271.Content.Length > 2)
|
|
|
{
|
|
|
eqmt15.l273 = Convert.ToByte(L271.Content[2]);
|
|
|
}
|
|
|
|
|
|
eqmt15.d60 = _melsecMcNet.ReadInt16("D60").Content; // 生产速度
|
|
|
eqmt15.d5030 = _melsecMcNet.ReadInt32("D5030").Content; // 总生产产量
|
|
|
eqmt15.d5032 = _melsecMcNet.ReadInt32("D5032").Content; // 总成品量
|
|
|
eqmt15.d10398 = _melsecMcNet.ReadInt32("D10398").Content; // 当日生产产量
|
|
|
eqmt15.d10448 = _melsecMcNet.ReadInt32("D10448").Content; // 当日成品量
|
|
|
eqmt15.d10650 = _melsecMcNet.ReadFloat("D10650").Content.ObjToDecimal(0); //当日合格率
|
|
|
eqmt15.d10700 = _melsecMcNet.ReadInt32("D10700").Content; //当日开机时间
|
|
|
eqmt15.d10750 = _melsecMcNet.ReadInt32("D10750").Content; //当日停机时间
|
|
|
eqmt15.m88 = Convert.ToByte(_melsecMcNet.ReadBool("M88").Content); //开机中
|
|
|
|
|
|
eqmt15.d10240 = _melsecMcNet.ReadInt32("D10240").Content;//吸水纸X切计数
|
|
|
eqmt15.d10250 = _melsecMcNet.ReadInt32("D10250").Content;//三层复合X切计数
|
|
|
eqmt15.d10260 = _melsecMcNet.ReadInt32("D10260").Content;//周切刀计数
|
|
|
eqmt15.d10270 = _melsecMcNet.ReadInt32("D10270").Content;//无尘纸X切计数
|
|
|
|
|
|
eqmt15.d900 = _melsecMcNet.ReadInt16("D900").Content;//实时电压L1L2
|
|
|
eqmt15.d901 = _melsecMcNet.ReadInt16("D901").Content;//实时电压L2L3
|
|
|
eqmt15.d902 = _melsecMcNet.ReadInt16("D902").Content;//实时电压L2L1
|
|
|
eqmt15.d903 = _melsecMcNet.ReadInt16("D903").Content;//实时电压L1N
|
|
|
eqmt15.d904 = _melsecMcNet.ReadInt16("D904").Content;//实时电压L2N
|
|
|
eqmt15.d905 = _melsecMcNet.ReadInt16("D905").Content;//实时电压L3N
|
|
|
eqmt15.d906 = _melsecMcNet.ReadInt16("D906").Content;//平均线电压
|
|
|
eqmt15.d907 = _melsecMcNet.ReadInt16("D907").Content;//平均相电压
|
|
|
eqmt15.d908 = _melsecMcNet.ReadInt16("D908").Content;//线电流L1
|
|
|
eqmt15.d909 = _melsecMcNet.ReadInt16("D909").Content;//线电流L2
|
|
|
eqmt15.d910 = _melsecMcNet.ReadInt16("D910").Content;//线电流L3
|
|
|
eqmt15.d911 = _melsecMcNet.ReadInt16("D911").Content;//线电流N
|
|
|
|
|
|
eqmt15.d950 = _melsecMcNet.ReadUInt16("D950").Content;//总有功电量
|
|
|
eqmt15.d952 = _melsecMcNet.ReadUInt16("D952").Content;//总无功电量
|
|
|
eqmt15.d954 = _melsecMcNet.ReadUInt16("D954").Content;//总视在电量
|
|
|
eqmt15.d10900 = _melsecMcNet.ReadUInt16("D10900").Content;//单日有功电量
|
|
|
eqmt15.d10950 = _melsecMcNet.ReadUInt16("D10950").Content;//当日无功电量
|
|
|
eqmt15.d10970 = _melsecMcNet.ReadUInt16("D10970").Content;//单日视在电量
|
|
|
|
|
|
//异常停机数据
|
|
|
#region 异常停机数据
|
|
|
|
|
|
var except01 = new List<string>();
|
|
|
|
|
|
var M160_M190 = _melsecMcNet.ReadBool("M160", 31);
|
|
|
for (int i = 0; i < 31; i++)
|
|
|
{
|
|
|
if (M160_M190.Content[i])
|
|
|
{
|
|
|
except01.Add($"M{160 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var M70 = _melsecMcNet.ReadBool("M70");
|
|
|
if (M70.Content) except01.Add($"M70");
|
|
|
|
|
|
var M700_M745 = _melsecMcNet.ReadBool("M700", 46);
|
|
|
for (int i = 0; i < 46; i++)
|
|
|
{
|
|
|
if (M700_M745.Content[i])
|
|
|
{
|
|
|
except01.Add($"M{700 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var M108_M121 = _melsecMcNet.ReadBool("M108", 14);
|
|
|
for (int i = 0; i < 14; i++)
|
|
|
{
|
|
|
if (M108_M121.Content[i])
|
|
|
{
|
|
|
except01.Add($"M{108 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var M50 = _melsecMcNet.ReadBool("M50");
|
|
|
if (M50.Content) except01.Add($"M50");
|
|
|
|
|
|
var M380_M394 = _melsecMcNet.ReadBool("M380", 15);
|
|
|
for (int i = 0; i < 15; i++)
|
|
|
{
|
|
|
if (M380_M394.Content[i])
|
|
|
{
|
|
|
except01.Add($"M{380 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var B00010_B0002F = _melsecMcNet.ReadBool("B00010", 32);
|
|
|
for (int i = 0; i < 32; i++)
|
|
|
{
|
|
|
if (B00010_B0002F.Content[i])
|
|
|
{
|
|
|
except01.Add($"B000{(16 + i).ToString("x2").ToUpper()}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var B00510_B0052F = _melsecMcNet.ReadBool("B00510", 32);
|
|
|
for (int i = 0; i < 32; i++)
|
|
|
{
|
|
|
if (B00510_B0052F.Content[i])
|
|
|
{
|
|
|
except01.Add($"B005{(16 + i).ToString("x2").ToUpper()}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var B00A10_B00A2F = _melsecMcNet.ReadBool("B00A10", 32);
|
|
|
for (int i = 0; i < 32; i++)
|
|
|
{
|
|
|
if (B00A10_B00A2F.Content[i])
|
|
|
{
|
|
|
except01.Add($"B00A{(16 + i).ToString("x2").ToUpper()}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var B01810_B01819 = _melsecMcNet.ReadBool("B01810", 10);
|
|
|
for (int i = 0; i < 10; i++)
|
|
|
{
|
|
|
if (B01810_B01819.Content[i])
|
|
|
{
|
|
|
except01.Add($"B018{(16 + i).ToString("x2").ToUpper()}");
|
|
|
}
|
|
|
}
|
|
|
#endregion
|
|
|
|
|
|
//异常不停机数据
|
|
|
#region 异常不停机数据
|
|
|
|
|
|
var except02 = new List<string>();
|
|
|
|
|
|
var L100_L115 = _melsecMcNet.ReadBool("L100", 18);
|
|
|
for (int i = 0; i < 18; i++)
|
|
|
{
|
|
|
if (L100_L115.Content[i])
|
|
|
{
|
|
|
except02.Add($"L{100 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var M800_M834 = _melsecMcNet.ReadBool("M800", 35);
|
|
|
for (int i = 0; i < 35; i++)
|
|
|
{
|
|
|
if (M800_M834.Content[i])
|
|
|
{
|
|
|
except02.Add($"M{800 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var M860_M874 = _melsecMcNet.ReadBool("M860", 15);
|
|
|
for (int i = 0; i < 15; i++)
|
|
|
{
|
|
|
if (M860_M874.Content[i])
|
|
|
{
|
|
|
except02.Add($"M{860 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var SM52 = _melsecMcNet.ReadBool("SM52");
|
|
|
if (SM52.Content) except02.Add($"SM52");
|
|
|
|
|
|
var B0000F = _melsecMcNet.ReadBool("B0000F");
|
|
|
if (B0000F.Content) except02.Add($"B0000F");
|
|
|
|
|
|
var B0050F = _melsecMcNet.ReadBool("B0050F");
|
|
|
if (B0050F.Content) except02.Add($"B0050F");
|
|
|
|
|
|
var B00A0F = _melsecMcNet.ReadBool("B00A0F");
|
|
|
if (B00A0F.Content) except02.Add($"B00A0F");
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region 增加EqmtPub数据
|
|
|
var product_type = "";
|
|
|
if (eqmt15.l271 == 1)
|
|
|
product_type = "1";
|
|
|
else if (eqmt15.l272 == 1)
|
|
|
product_type = "2";
|
|
|
else if (eqmt15.l273 == 1)
|
|
|
product_type = "3";
|
|
|
var eqmtBaseInfo = (await _eqmtBaseRep.QueryAsync(x => x.eqmt_id == eqmt15.eqmt_id)).FirstOrDefault();
|
|
|
var eqmtProductSpecInfo = (await _eqmtProductSpecRep.QueryAsync(x => x.eqmt_id == eqmt15.eqmt_id && x.product_type == product_type)).FirstOrDefault();
|
|
|
|
|
|
EqmtPubData newPub = new EqmtPubData();
|
|
|
|
|
|
newPub.collect_id = eqmt15.collect_id;
|
|
|
newPub.eqmt_id = eqmt15.eqmt_id;
|
|
|
newPub.product_type = product_type;
|
|
|
newPub.product_type_name = $"{eqmtBaseInfo?.product}({eqmtProductSpecInfo?.product_type_name})";
|
|
|
newPub.speed = eqmt15.d60;
|
|
|
newPub.total_product_qty = eqmt15.d5032;
|
|
|
newPub.intraday_product_qty = eqmt15.d10398;
|
|
|
newPub.intraday_ok_qty = eqmt15.d10448;
|
|
|
newPub.intraday_ng_qty = eqmt15.d10398 - eqmt15.d10448;
|
|
|
newPub.intraday_yield_rate = eqmt15.d10650;
|
|
|
newPub.intraday_eqmt_run_time = eqmt15.d10700 + eqmt15.d10750;
|
|
|
newPub.intraday_eqmt_work_time = eqmt15.d10700;
|
|
|
newPub.intraday_eqmt_stop_time = eqmt15.d10750;
|
|
|
newPub.eqmt_status = eqmt15.m88;
|
|
|
newPub.eqmt_except_flag = Convert.ToByte(except01.Count() > 0);
|
|
|
newPub.eqmt_alarm_flag = Convert.ToByte(except02.Count() > 0);
|
|
|
#endregion
|
|
|
|
|
|
#region 报警数据
|
|
|
var exceptHisList = new List<EqmtExceptHis>();
|
|
|
|
|
|
var exceptList01 = from r in except01
|
|
|
select new EqmtExceptHis()
|
|
|
{
|
|
|
collect_id = eqmt15.collect_id,
|
|
|
eqmt_id = eqmt15.eqmt_id,
|
|
|
registor_address = r
|
|
|
};
|
|
|
|
|
|
exceptHisList.AddRange(exceptList01);
|
|
|
|
|
|
var exceptList02 = from r in except01
|
|
|
select new EqmtExceptHis()
|
|
|
{
|
|
|
collect_id = eqmt15.collect_id,
|
|
|
eqmt_id = eqmt15.eqmt_id,
|
|
|
registor_address = r,
|
|
|
};
|
|
|
|
|
|
exceptHisList.AddRange(exceptList02);
|
|
|
|
|
|
|
|
|
var exceptList = from r in exceptHisList
|
|
|
select new EqmtExcept()
|
|
|
{
|
|
|
collect_id = r.collect_id,
|
|
|
eqmt_id = r.eqmt_id,
|
|
|
registor_address = r.registor_address,
|
|
|
};
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
|
|
#region 写入数据库
|
|
|
//报工数据 一定要写在 pubData插入之前
|
|
|
var addData = await CreateEqmtCollectAddData(newPub);
|
|
|
await _eqmtAddDataRep.InsertAsync(addData);
|
|
|
|
|
|
await _eqmt15Rep.InsertAsync(eqmt15);
|
|
|
|
|
|
newPub.oee = addData.oee;
|
|
|
await _eqmtPubRep.InsertAsync(newPub);
|
|
|
|
|
|
//历史数据一直累加
|
|
|
await _eqmtExceptHisRep.InsertAsync(exceptHisList);
|
|
|
|
|
|
//实时数据只显示最后的
|
|
|
await _eqmtExceptRep.DeleteAsync(x => x.eqmt_id == eqmt15.eqmt_id);
|
|
|
await _eqmtExceptRep.InsertAsync(exceptList);
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
|
_logger.LogInformation($"读取15线数据 异常 {e.Message}");
|
|
|
}
|
|
|
finally
|
|
|
{
|
|
|
oTime1.Stop(); //记录结束时间
|
|
|
_logger.LogInformation($"读取15线数据 完成,耗时{oTime1.Elapsed.TotalSeconds}秒");
|
|
|
DisConnectPLC();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 读取7线数据
|
|
|
/// </summary>
|
|
|
/// <param name="input"></param>
|
|
|
/// <returns></returns>
|
|
|
public async Task ReadDataLine7(EquipInput input)
|
|
|
{
|
|
|
Stopwatch oTime1 = new Stopwatch();
|
|
|
oTime1.Start(); //记录开始时间
|
|
|
try
|
|
|
{
|
|
|
_logger.LogInformation($"读取7线数据 开始");
|
|
|
|
|
|
var eqmt7 = new Eqmt7()
|
|
|
{
|
|
|
eqmt_id = input.eqmt_id,
|
|
|
collect_id = Guid.NewGuid().ToString(),
|
|
|
gmt_create = DateTime.Now,
|
|
|
};
|
|
|
|
|
|
var connSuccess = ConnectPLC(input.ip, input.port[0]);
|
|
|
|
|
|
if (connSuccess )
|
|
|
{
|
|
|
|
|
|
eqmt7.d2000 = _melsecMcNet.ReadInt16("D2000").Content; // 产品型号
|
|
|
eqmt7.w10 = _melsecMcNet.ReadInt32("W10").Content/10; // 生产速度
|
|
|
|
|
|
eqmt7.d9500 = _melsecMcNet.ReadInt32("D9500").Content; // 总生产产量
|
|
|
eqmt7.d9502 = _melsecMcNet.ReadInt32("D9502").Content; // 总成品量
|
|
|
eqmt7.d9554 = _melsecMcNet.ReadInt32("D9554").Content; // 总能耗
|
|
|
eqmt7.d9504 = _melsecMcNet.ReadInt32("D9504").Content; // 班产量
|
|
|
eqmt7.d9506 = _melsecMcNet.ReadInt32("D9506").Content; // 班成品
|
|
|
eqmt7.d9508 = _melsecMcNet.ReadInt32("D9508").Content; // 班废品
|
|
|
eqmt7.d9510 = _melsecMcNet.ReadInt32("D9510").Content; // 班能耗
|
|
|
eqmt7.d9522 = _melsecMcNet.ReadInt32("D9522").Content; // 视觉废品
|
|
|
eqmt7.d9524 = _melsecMcNet.ReadInt32("D9524").Content/10; //班合格率
|
|
|
Console.WriteLine(_melsecMcNet.ReadFloat("D9524").Content);
|
|
|
|
|
|
eqmt7.d9526 = _melsecMcNet.ReadFloat("D9526").Content.ObjToDecimal(0); //班开机率
|
|
|
eqmt7.d9528 = _melsecMcNet.ReadFloat("D9528").Content.ObjToDecimal(0); //班有效率
|
|
|
eqmt7.d9530 = _melsecMcNet.ReadInt32("D9530").Content; //班OEE
|
|
|
|
|
|
|
|
|
|
|
|
//异常不停机数据
|
|
|
#region 异常不停机数据
|
|
|
/*
|
|
|
var except02 = new List<string>();
|
|
|
|
|
|
var L100_L115 = _melsecMcNet.ReadBool("L100", 18);
|
|
|
for (int i = 0; i < 18; i++)
|
|
|
{
|
|
|
if (L100_L115.Content[i])
|
|
|
{
|
|
|
except02.Add($"L{100 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var M800_M834 = _melsecMcNet.ReadBool("M800", 35);
|
|
|
for (int i = 0; i < 35; i++)
|
|
|
{
|
|
|
if (M800_M834.Content[i])
|
|
|
{
|
|
|
except02.Add($"M{800 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var M860_M874 = _melsecMcNet.ReadBool("M860", 15);
|
|
|
for (int i = 0; i < 15; i++)
|
|
|
{
|
|
|
if (M860_M874.Content[i])
|
|
|
{
|
|
|
except02.Add($"M{860 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var SM52 = _melsecMcNet.ReadBool("SM52");
|
|
|
if (SM52.Content) except02.Add($"SM52");
|
|
|
|
|
|
var B0000F = _melsecMcNet.ReadBool("B0000F");
|
|
|
if (B0000F.Content) except02.Add($"B0000F");
|
|
|
|
|
|
var B0050F = _melsecMcNet.ReadBool("B0050F");
|
|
|
if (B0050F.Content) except02.Add($"B0050F");
|
|
|
|
|
|
var B00A0F = _melsecMcNet.ReadBool("B00A0F");
|
|
|
if (B00A0F.Content) except02.Add($"B00A0F");
|
|
|
*/
|
|
|
#endregion
|
|
|
|
|
|
#region 增加EqmtPub数据
|
|
|
var product_type = "1";
|
|
|
//if (eqmt7.l271 == 1)
|
|
|
// product_type = "1";
|
|
|
//else if (eqmt15.l272 == 1)
|
|
|
// product_type = "2";
|
|
|
//else if (eqmt15.l273 == 1)
|
|
|
// product_type = "3";
|
|
|
var eqmtBaseInfo = (await _eqmtBaseRep.QueryAsync(x => x.eqmt_id == eqmt7.eqmt_id)).FirstOrDefault();
|
|
|
var eqmtProductSpecInfo = (await _eqmtProductSpecRep.QueryAsync(x => x.eqmt_id == eqmt7.eqmt_id && x.product_type == product_type)).FirstOrDefault();
|
|
|
|
|
|
EqmtPubData newPub = new EqmtPubData();
|
|
|
|
|
|
newPub.collect_id = eqmt7.collect_id;
|
|
|
newPub.eqmt_id = eqmt7.eqmt_id;
|
|
|
newPub.product_type = product_type;
|
|
|
newPub.product_type_name = $"{eqmtBaseInfo?.product}({eqmtProductSpecInfo?.product_type_name})";
|
|
|
|
|
|
newPub.speed = eqmt7.w10;
|
|
|
newPub.total_product_qty = eqmt7.d9500;
|
|
|
newPub.intraday_product_qty = eqmt7.d9504;
|
|
|
|
|
|
newPub.intraday_ok_qty = eqmt7.d9506;
|
|
|
newPub.intraday_ng_qty = eqmt7.d9508;
|
|
|
newPub.intraday_yield_rate = eqmt7.d9524;
|
|
|
newPub.intraday_eqmt_work_rate = eqmt7.d9526;
|
|
|
|
|
|
newPub.oee = eqmt7.d9530;
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region 报警数据
|
|
|
/*var exceptHisList = new List<EqmtExceptHis>();*/
|
|
|
|
|
|
/*var exceptList01 = from r in except01
|
|
|
select new EqmtExceptHis()
|
|
|
{
|
|
|
collect_id = eqmt7.collect_id,
|
|
|
eqmt_id = eqmt7.eqmt_id,
|
|
|
registor_address = r
|
|
|
};
|
|
|
|
|
|
exceptHisList.AddRange(exceptList01);*/
|
|
|
|
|
|
/*var exceptList02 = from r in except01
|
|
|
select new EqmtExceptHis()
|
|
|
{
|
|
|
collect_id = eqmt7.collect_id,
|
|
|
eqmt_id = eqmt7.eqmt_id,
|
|
|
registor_address = r,
|
|
|
};
|
|
|
|
|
|
exceptHisList.AddRange(exceptList02);*/
|
|
|
|
|
|
|
|
|
/*var exceptList = from r in exceptHisList
|
|
|
select new EqmtExcept()
|
|
|
{
|
|
|
collect_id = r.collect_id,
|
|
|
eqmt_id = r.eqmt_id,
|
|
|
registor_address = r.registor_address,
|
|
|
};*/
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
#region 写入数据库
|
|
|
//报工数据 一定要写在 pubData插入之前
|
|
|
var addData = await CreateEqmtCollectAddData(newPub);
|
|
|
await _eqmtAddDataRep.InsertAsync(addData);
|
|
|
|
|
|
await _eqmt7Rep.InsertAsync(eqmt7);
|
|
|
|
|
|
//newPub.oee = addData.oee;
|
|
|
await _eqmtPubRep.InsertAsync(newPub);
|
|
|
|
|
|
//历史数据一直累加
|
|
|
//await _eqmtExceptHisRep.InsertAsync(exceptHisList);
|
|
|
|
|
|
//实时数据只显示最后的
|
|
|
//await _eqmtExceptRep.DeleteAsync(x => x.eqmt_id == eqmt7.eqmt_id);
|
|
|
//await _eqmtExceptRep.InsertAsync(exceptList);
|
|
|
|
|
|
#endregion
|
|
|
}
|
|
|
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
|
_logger.LogInformation($"读取7线数据 异常 {e.Message}");
|
|
|
}
|
|
|
finally
|
|
|
{
|
|
|
oTime1.Stop(); //记录结束时间
|
|
|
_logger.LogInformation($"读取7线数据 完成,耗时{oTime1.Elapsed.TotalSeconds}秒");
|
|
|
DisConnectPLC();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
/// 读取2线数据
|
|
|
/// </summary>
|
|
|
/// <param name="input"></param>
|
|
|
/// <returns></returns>
|
|
|
public async Task ReadDataLine2(EquipInput input)
|
|
|
{
|
|
|
Stopwatch oTime1 = new Stopwatch();
|
|
|
oTime1.Start(); //记录开始时间
|
|
|
try
|
|
|
{
|
|
|
_logger.LogInformation($"读取2线数据 开始");
|
|
|
|
|
|
var eqmt2 = new Eqmt2()
|
|
|
{
|
|
|
eqmt_id = input.eqmt_id,
|
|
|
collect_id = Guid.NewGuid().ToString(),
|
|
|
gmt_create = DateTime.Now,
|
|
|
};
|
|
|
|
|
|
var connSuccess = ConnectPLC(input.ip, input.port[0]);
|
|
|
|
|
|
if (connSuccess)
|
|
|
{
|
|
|
//eqmt2.d2000 = _melsecMcNet.ReadInt16("D2000").Content; // 产品型号
|
|
|
//eqmt2.w10 = _melsecMcNet.ReadInt16("W10").Content/10; // 生产速度
|
|
|
//eqmt2.d9500 = _melsecMcNet.ReadInt32("D9500").Content; // 总生产产量
|
|
|
//eqmt2.d9502 = _melsecMcNet.ReadInt32("D9502").Content; // 总成品量
|
|
|
//eqmt2.d9554 = _melsecMcNet.ReadInt32("D9554").Content; // 总能耗
|
|
|
//eqmt2.d9504 = _melsecMcNet.ReadInt32("D9504").Content; // 班产量
|
|
|
//eqmt2.d9506 = _melsecMcNet.ReadInt32("D9506").Content; // 班成品
|
|
|
//eqmt2.d9508 = _melsecMcNet.ReadInt32("D9508").Content; // 班废品
|
|
|
//eqmt2.d9510 = _melsecMcNet.ReadInt32("D9510").Content; // 班能耗
|
|
|
//eqmt2.d9522 = _melsecMcNet.ReadInt32("D9522").Content; // 视觉废品
|
|
|
|
|
|
//eqmt2.d9524 = _melsecMcNet.ReadFloat("D9524").Content.ObjToDecimal(0); //班合格率
|
|
|
//eqmt2.d9526 = _melsecMcNet.ReadFloat("D9526").Content.ObjToDecimal(0); //班开机率
|
|
|
//eqmt2.d9528 = _melsecMcNet.ReadFloat("D9528").Content.ObjToDecimal(0); //班有效率
|
|
|
//eqmt2.d9530 = _melsecMcNet.ReadInt32("D9530").Content; //班OEE
|
|
|
|
|
|
eqmt2.d2000 = _melsecMcNet.ReadInt16("D7558").Content; // 产品型号
|
|
|
eqmt2.w10 = _melsecMcNet.ReadInt16("W10").Content / 10; // 生产速度
|
|
|
|
|
|
eqmt2.d9500 = _melsecMcNet.ReadInt32("D7500").Content; // 总生产产量
|
|
|
eqmt2.d9502 = _melsecMcNet.ReadInt32("D7502").Content; // 总成品量
|
|
|
eqmt2.d9504 = _melsecMcNet.ReadInt32("D7550").Content; // 班产量
|
|
|
eqmt2.d9554 = _melsecMcNet.ReadInt32("D7954").Content; // 总能耗
|
|
|
eqmt2.d9506 = _melsecMcNet.ReadInt32("D7552").Content; // 班成品
|
|
|
eqmt2.d9508 = _melsecMcNet.ReadInt32("D7554").Content; // 班废品
|
|
|
eqmt2.d9524 = Math.Round((decimal) eqmt2.d9506/eqmt2.d9504, 2) * 100; //班合格率
|
|
|
|
|
|
eqmt2.d9526 = _melsecMcNet.ReadFloat("D9526").Content.ObjToDecimal(0); //班开机率
|
|
|
eqmt2.d9528 = _melsecMcNet.ReadFloat("D9528").Content.ObjToDecimal(0); //班有效率
|
|
|
eqmt2.d9530 = _melsecMcNet.ReadInt32("D9530").Content; //班OEE
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
//异常不停机数据
|
|
|
#region 异常不停机数据
|
|
|
/*
|
|
|
var except02 = new List<string>();
|
|
|
|
|
|
var L100_L115 = _melsecMcNet.ReadBool("L100", 18);
|
|
|
for (int i = 0; i < 18; i++)
|
|
|
{
|
|
|
if (L100_L115.Content[i])
|
|
|
{
|
|
|
except02.Add($"L{100 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var M800_M834 = _melsecMcNet.ReadBool("M800", 35);
|
|
|
for (int i = 0; i < 35; i++)
|
|
|
{
|
|
|
if (M800_M834.Content[i])
|
|
|
{
|
|
|
except02.Add($"M{800 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var M860_M874 = _melsecMcNet.ReadBool("M860", 15);
|
|
|
for (int i = 0; i < 15; i++)
|
|
|
{
|
|
|
if (M860_M874.Content[i])
|
|
|
{
|
|
|
except02.Add($"M{860 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var SM52 = _melsecMcNet.ReadBool("SM52");
|
|
|
if (SM52.Content) except02.Add($"SM52");
|
|
|
|
|
|
var B0000F = _melsecMcNet.ReadBool("B0000F");
|
|
|
if (B0000F.Content) except02.Add($"B0000F");
|
|
|
|
|
|
var B0050F = _melsecMcNet.ReadBool("B0050F");
|
|
|
if (B0050F.Content) except02.Add($"B0050F");
|
|
|
|
|
|
var B00A0F = _melsecMcNet.ReadBool("B00A0F");
|
|
|
if (B00A0F.Content) except02.Add($"B00A0F");
|
|
|
*/
|
|
|
#endregion
|
|
|
|
|
|
#region 增加EqmtPub数据
|
|
|
var product_type = "1";
|
|
|
//if (eqmt7.l271 == 1)
|
|
|
// product_type = "1";
|
|
|
//else if (eqmt15.l272 == 1)
|
|
|
// product_type = "2";
|
|
|
//else if (eqmt15.l273 == 1)
|
|
|
// product_type = "3";
|
|
|
var eqmtBaseInfo = (await _eqmtBaseRep.QueryAsync(x => x.eqmt_id == eqmt2.eqmt_id)).FirstOrDefault();
|
|
|
var eqmtProductSpecInfo = (await _eqmtProductSpecRep.QueryAsync(x => x.eqmt_id == eqmt2.eqmt_id && x.product_type == product_type)).FirstOrDefault();
|
|
|
|
|
|
EqmtPubData newPub = new EqmtPubData();
|
|
|
|
|
|
newPub.collect_id = eqmt2.collect_id;
|
|
|
newPub.eqmt_id = eqmt2.eqmt_id;
|
|
|
newPub.product_type = product_type;
|
|
|
newPub.product_type_name = $"{eqmtBaseInfo?.product}({eqmtProductSpecInfo?.product_type_name})";
|
|
|
|
|
|
newPub.speed = eqmt2.w10;
|
|
|
newPub.total_product_qty = eqmt2.d9500;
|
|
|
newPub.intraday_product_qty = eqmt2.d9504;
|
|
|
|
|
|
newPub.intraday_ok_qty = eqmt2.d9506;
|
|
|
newPub.intraday_ng_qty = eqmt2.d9508;
|
|
|
newPub.intraday_yield_rate = eqmt2.d9524;
|
|
|
newPub.intraday_eqmt_work_rate = eqmt2.d9526;
|
|
|
|
|
|
newPub.oee = eqmt2.d9530;
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region 报警数据
|
|
|
/*var exceptHisList = new List<EqmtExceptHis>();*/
|
|
|
|
|
|
/*var exceptList01 = from r in except01
|
|
|
select new EqmtExceptHis()
|
|
|
{
|
|
|
collect_id = eqmt7.collect_id,
|
|
|
eqmt_id = eqmt7.eqmt_id,
|
|
|
registor_address = r
|
|
|
};
|
|
|
|
|
|
exceptHisList.AddRange(exceptList01);*/
|
|
|
|
|
|
/*var exceptList02 = from r in except01
|
|
|
select new EqmtExceptHis()
|
|
|
{
|
|
|
collect_id = eqmt7.collect_id,
|
|
|
eqmt_id = eqmt7.eqmt_id,
|
|
|
registor_address = r,
|
|
|
};
|
|
|
|
|
|
exceptHisList.AddRange(exceptList02);*/
|
|
|
|
|
|
|
|
|
/*var exceptList = from r in exceptHisList
|
|
|
select new EqmtExcept()
|
|
|
{
|
|
|
collect_id = r.collect_id,
|
|
|
eqmt_id = r.eqmt_id,
|
|
|
registor_address = r.registor_address,
|
|
|
};*/
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
#region 写入数据库
|
|
|
//报工数据 一定要写在 pubData插入之前
|
|
|
var addData = await CreateEqmtCollectAddData(newPub);
|
|
|
await _eqmtAddDataRep.InsertAsync(addData);
|
|
|
|
|
|
await _eqmt2Rep.InsertAsync(eqmt2);
|
|
|
|
|
|
//newPub.oee = addData.oee;
|
|
|
await _eqmtPubRep.InsertAsync(newPub);
|
|
|
|
|
|
//历史数据一直累加
|
|
|
//await _eqmtExceptHisRep.InsertAsync(exceptHisList);
|
|
|
|
|
|
//实时数据只显示最后的
|
|
|
//await _eqmtExceptRep.DeleteAsync(x => x.eqmt_id == eqmt7.eqmt_id);
|
|
|
//await _eqmtExceptRep.InsertAsync(exceptList);
|
|
|
|
|
|
#endregion
|
|
|
}
|
|
|
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
|
_logger.LogInformation($"读取2线数据 异常 {e.Message}");
|
|
|
}
|
|
|
finally
|
|
|
{
|
|
|
oTime1.Stop(); //记录结束时间
|
|
|
_logger.LogInformation($"读取2线数据 完成,耗时{oTime1.Elapsed.TotalSeconds}秒");
|
|
|
DisConnectPLC();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
/// 读取20线数据
|
|
|
/// </summary>
|
|
|
/// <param name="input"></param>
|
|
|
/// <returns></returns>
|
|
|
public async Task ReadDataLine20(EquipInput input)
|
|
|
{
|
|
|
Stopwatch oTime1 = new Stopwatch();
|
|
|
oTime1.Start(); //记录开始时间
|
|
|
try
|
|
|
{
|
|
|
_logger.LogInformation($"读取20线数据 开始");
|
|
|
|
|
|
var eqmt20 = new Eqmt20()
|
|
|
{
|
|
|
eqmt_id = input.eqmt_id,
|
|
|
collect_id = Guid.NewGuid().ToString(),
|
|
|
gmt_create = DateTime.Now,
|
|
|
};
|
|
|
|
|
|
var connSuccess = ConnectPLC(input.ip, input.port[0]);
|
|
|
|
|
|
if (connSuccess)
|
|
|
{
|
|
|
|
|
|
eqmt20.d2000 = _melsecMcNet.ReadInt16("D2000").Content; // 产品型号
|
|
|
eqmt20.w10 = _melsecMcNet.ReadInt16("W10").Content/10; // 生产速度
|
|
|
eqmt20.d9500 = _melsecMcNet.ReadInt32("D9500").Content; // 总生产产量
|
|
|
eqmt20.d9502 = _melsecMcNet.ReadInt32("D9502").Content; // 总成品量
|
|
|
eqmt20.d9554 = _melsecMcNet.ReadInt32("D9554").Content; // 总能耗
|
|
|
eqmt20.d9504 = _melsecMcNet.ReadInt32("D9504").Content; // 班产量
|
|
|
eqmt20.d9506 = _melsecMcNet.ReadInt32("D9506").Content; // 班成品
|
|
|
eqmt20.d9508 = _melsecMcNet.ReadInt32("D9508").Content; // 班废品
|
|
|
eqmt20.d9510 = _melsecMcNet.ReadInt32("D9510").Content; // 班能耗
|
|
|
eqmt20.d9522 = _melsecMcNet.ReadInt32("D9522").Content; // 视觉废品
|
|
|
|
|
|
eqmt20.d9524 = _melsecMcNet.ReadFloat("D9524").Content.ObjToDecimal(0); //班合格率
|
|
|
eqmt20.d9526 = _melsecMcNet.ReadFloat("D9526").Content.ObjToDecimal(0); //班开机率
|
|
|
eqmt20.d9528 = _melsecMcNet.ReadFloat("D9528").Content.ObjToDecimal(0); //班有效率
|
|
|
eqmt20.d9530 = _melsecMcNet.ReadInt32("D9530").Content; //班OEE
|
|
|
|
|
|
|
|
|
|
|
|
//异常停机数据
|
|
|
#region 异常停机数据
|
|
|
/*
|
|
|
var except01 = new List<string>();
|
|
|
|
|
|
var M160_M190 = _melsecMcNet.ReadBool("M160", 31);
|
|
|
for (int i = 0; i < 31; i++)
|
|
|
{
|
|
|
if (M160_M190.Content[i])
|
|
|
{
|
|
|
except01.Add($"M{160 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var M70 = _melsecMcNet.ReadBool("M70");
|
|
|
if (M70.Content) except01.Add($"M70");
|
|
|
|
|
|
var M700_M745 = _melsecMcNet.ReadBool("M700", 46);
|
|
|
for (int i = 0; i < 46; i++)
|
|
|
{
|
|
|
if (M700_M745.Content[i])
|
|
|
{
|
|
|
except01.Add($"M{700 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var M108_M121 = _melsecMcNet.ReadBool("M108", 14);
|
|
|
for (int i = 0; i < 14; i++)
|
|
|
{
|
|
|
if (M108_M121.Content[i])
|
|
|
{
|
|
|
except01.Add($"M{108 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var M50 = _melsecMcNet.ReadBool("M50");
|
|
|
if (M50.Content) except01.Add($"M50");
|
|
|
|
|
|
var M380_M394 = _melsecMcNet.ReadBool("M380", 15);
|
|
|
for (int i = 0; i < 15; i++)
|
|
|
{
|
|
|
if (M380_M394.Content[i])
|
|
|
{
|
|
|
except01.Add($"M{380 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var B00010_B0002F = _melsecMcNet.ReadBool("B00010", 32);
|
|
|
for (int i = 0; i < 32; i++)
|
|
|
{
|
|
|
if (B00010_B0002F.Content[i])
|
|
|
{
|
|
|
except01.Add($"B000{(16 + i).ToString("x2").ToUpper()}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var B00510_B0052F = _melsecMcNet.ReadBool("B00510", 32);
|
|
|
for (int i = 0; i < 32; i++)
|
|
|
{
|
|
|
if (B00510_B0052F.Content[i])
|
|
|
{
|
|
|
except01.Add($"B005{(16 + i).ToString("x2").ToUpper()}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var B00A10_B00A2F = _melsecMcNet.ReadBool("B00A10", 32);
|
|
|
for (int i = 0; i < 32; i++)
|
|
|
{
|
|
|
if (B00A10_B00A2F.Content[i])
|
|
|
{
|
|
|
except01.Add($"B00A{(16 + i).ToString("x2").ToUpper()}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var B01810_B01819 = _melsecMcNet.ReadBool("B01810", 10);
|
|
|
for (int i = 0; i < 10; i++)
|
|
|
{
|
|
|
if (B01810_B01819.Content[i])
|
|
|
{
|
|
|
except01.Add($"B018{(16 + i).ToString("x2").ToUpper()}");
|
|
|
}
|
|
|
}*/
|
|
|
#endregion
|
|
|
|
|
|
//异常不停机数据
|
|
|
#region 异常不停机数据
|
|
|
/*
|
|
|
var except02 = new List<string>();
|
|
|
|
|
|
var L100_L115 = _melsecMcNet.ReadBool("L100", 18);
|
|
|
for (int i = 0; i < 18; i++)
|
|
|
{
|
|
|
if (L100_L115.Content[i])
|
|
|
{
|
|
|
except02.Add($"L{100 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var M800_M834 = _melsecMcNet.ReadBool("M800", 35);
|
|
|
for (int i = 0; i < 35; i++)
|
|
|
{
|
|
|
if (M800_M834.Content[i])
|
|
|
{
|
|
|
except02.Add($"M{800 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var M860_M874 = _melsecMcNet.ReadBool("M860", 15);
|
|
|
for (int i = 0; i < 15; i++)
|
|
|
{
|
|
|
if (M860_M874.Content[i])
|
|
|
{
|
|
|
except02.Add($"M{860 + i}");
|
|
|
}
|
|
|
}
|
|
|
|
|
|
var SM52 = _melsecMcNet.ReadBool("SM52");
|
|
|
if (SM52.Content) except02.Add($"SM52");
|
|
|
|
|
|
var B0000F = _melsecMcNet.ReadBool("B0000F");
|
|
|
if (B0000F.Content) except02.Add($"B0000F");
|
|
|
|
|
|
var B0050F = _melsecMcNet.ReadBool("B0050F");
|
|
|
if (B0050F.Content) except02.Add($"B0050F");
|
|
|
|
|
|
var B00A0F = _melsecMcNet.ReadBool("B00A0F");
|
|
|
if (B00A0F.Content) except02.Add($"B00A0F");
|
|
|
*/
|
|
|
#endregion
|
|
|
|
|
|
#region 增加EqmtPub数据
|
|
|
var product_type = "1";
|
|
|
//if (eqmt7.l271 == 1)
|
|
|
// product_type = "1";
|
|
|
//else if (eqmt15.l272 == 1)
|
|
|
// product_type = "2";
|
|
|
//else if (eqmt15.l273 == 1)
|
|
|
// product_type = "3";
|
|
|
var eqmtBaseInfo = (await _eqmtBaseRep.QueryAsync(x => x.eqmt_id == eqmt20.eqmt_id)).FirstOrDefault();
|
|
|
var eqmtProductSpecInfo = (await _eqmtProductSpecRep.QueryAsync(x => x.eqmt_id == eqmt20.eqmt_id && x.product_type == product_type)).FirstOrDefault();
|
|
|
|
|
|
EqmtPubData newPub = new EqmtPubData();
|
|
|
|
|
|
newPub.collect_id = eqmt20.collect_id;
|
|
|
newPub.eqmt_id = eqmt20.eqmt_id;
|
|
|
newPub.product_type = product_type;
|
|
|
newPub.product_type_name = $"{eqmtBaseInfo?.product}({eqmtProductSpecInfo?.product_type_name})";
|
|
|
|
|
|
newPub.speed = eqmt20.w10;
|
|
|
newPub.total_product_qty = eqmt20.d9500;
|
|
|
newPub.intraday_product_qty = eqmt20.d9504;
|
|
|
|
|
|
newPub.intraday_ok_qty = eqmt20.d9506;
|
|
|
newPub.intraday_ng_qty = eqmt20.d9508;
|
|
|
newPub.intraday_yield_rate = eqmt20.d9524;
|
|
|
newPub.intraday_eqmt_work_rate = eqmt20.d9526;
|
|
|
|
|
|
newPub.oee = eqmt20.d9530;
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
#region 报警数据
|
|
|
/*var exceptHisList = new List<EqmtExceptHis>();*/
|
|
|
|
|
|
/*var exceptList01 = from r in except01
|
|
|
select new EqmtExceptHis()
|
|
|
{
|
|
|
collect_id = eqmt7.collect_id,
|
|
|
eqmt_id = eqmt7.eqmt_id,
|
|
|
registor_address = r
|
|
|
};
|
|
|
|
|
|
exceptHisList.AddRange(exceptList01);*/
|
|
|
|
|
|
/*var exceptList02 = from r in except01
|
|
|
select new EqmtExceptHis()
|
|
|
{
|
|
|
collect_id = eqmt7.collect_id,
|
|
|
eqmt_id = eqmt7.eqmt_id,
|
|
|
registor_address = r,
|
|
|
};
|
|
|
|
|
|
exceptHisList.AddRange(exceptList02);*/
|
|
|
|
|
|
|
|
|
/*var exceptList = from r in exceptHisList
|
|
|
select new EqmtExcept()
|
|
|
{
|
|
|
collect_id = r.collect_id,
|
|
|
eqmt_id = r.eqmt_id,
|
|
|
registor_address = r.registor_address,
|
|
|
};*/
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
#region 写入数据库
|
|
|
//报工数据 一定要写在 pubData插入之前
|
|
|
var addData = await CreateEqmtCollectAddData(newPub);
|
|
|
await _eqmtAddDataRep.InsertAsync(addData);
|
|
|
|
|
|
await _eqmt20Rep.InsertAsync(eqmt20);
|
|
|
|
|
|
//newPub.oee = addData.oee;
|
|
|
await _eqmtPubRep.InsertAsync(newPub);
|
|
|
|
|
|
//历史数据一直累加
|
|
|
//await _eqmtExceptHisRep.InsertAsync(exceptHisList);
|
|
|
|
|
|
//实时数据只显示最后的
|
|
|
//await _eqmtExceptRep.DeleteAsync(x => x.eqmt_id == eqmt7.eqmt_id);
|
|
|
//await _eqmtExceptRep.InsertAsync(exceptList);
|
|
|
|
|
|
#endregion
|
|
|
}
|
|
|
|
|
|
}
|
|
|
catch (Exception e)
|
|
|
{
|
|
|
_logger.LogInformation($"读取20线数据 异常 {e.Message}");
|
|
|
}
|
|
|
finally
|
|
|
{
|
|
|
oTime1.Stop(); //记录结束时间
|
|
|
_logger.LogInformation($"读取20线数据 完成,耗时{oTime1.Elapsed.TotalSeconds}秒");
|
|
|
DisConnectPLC();
|
|
|
}
|
|
|
}
|
|
|
|
|
|
}
|
|
|
}
|