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

2664 lines
115 KiB

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 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.ReadInt16("W10").Content; // 生产速度
eqmt7.w10 = _melsecMcNet.ReadInt32("W10").Content/10; // 生产速度
// var d1 = _melsecMcNet.ReadInt32("D2990").Content; // 生产速度
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.ReadFloat("D9524").Content.ObjToDecimal(0); //班合格率
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 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 == 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
//异常停机数据
#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 == 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();
}
}
#endregion
}
}