|
|
|
@ -1,4 +1,4 @@
|
|
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
|
using SlnMesnac.Business.@base;
|
|
|
|
|
using SlnMesnac.Common;
|
|
|
|
@ -21,32 +21,32 @@ using System.Threading.Tasks;
|
|
|
|
|
using TouchSocket.Core;
|
|
|
|
|
using static System.Net.Mime.MediaTypeNames;
|
|
|
|
|
|
|
|
|
|
#region << 版 本 注 释 >>
|
|
|
|
|
#region << 版 本 注 释 >>
|
|
|
|
|
/*--------------------------------------------------------------------
|
|
|
|
|
* 版权所有 (c) 2024 WenJY 保留所有权利。
|
|
|
|
|
* CLR版本:4.0.30319.42000
|
|
|
|
|
* 机器名称:LAPTOP-E0N2L34V
|
|
|
|
|
* 命名空间:SlnMesnac.Business
|
|
|
|
|
* 唯一标识:f79d6d97-d9b0-4b0b-a442-e6bb1c1c79e6
|
|
|
|
|
* 版权所有 (c) 2024 WenJY 保留所有权利。
|
|
|
|
|
* CLR版本:4.0.30319.42000
|
|
|
|
|
* 机器名称:LAPTOP-E0N2L34V
|
|
|
|
|
* 命名空间:SlnMesnac.Business
|
|
|
|
|
* 唯一标识:f79d6d97-d9b0-4b0b-a442-e6bb1c1c79e6
|
|
|
|
|
*
|
|
|
|
|
* 创建者:WenJY
|
|
|
|
|
* 电子邮箱:wenjy@mesnac.com
|
|
|
|
|
* 创建时间:2024-04-10 16:36:01
|
|
|
|
|
* 版本:V1.0.0
|
|
|
|
|
* 描述:
|
|
|
|
|
* 创建者:WenJY
|
|
|
|
|
* 电子邮箱:wenjy@mesnac.com
|
|
|
|
|
* 创建时间:2024-04-10 16:36:01
|
|
|
|
|
* 版本:V1.0.0
|
|
|
|
|
* 描述:
|
|
|
|
|
*
|
|
|
|
|
*--------------------------------------------------------------------
|
|
|
|
|
* 修改人:
|
|
|
|
|
* 时间:
|
|
|
|
|
* 修改说明:
|
|
|
|
|
* 修改人:
|
|
|
|
|
* 时间:
|
|
|
|
|
* 修改说明:
|
|
|
|
|
*
|
|
|
|
|
* 版本:V1.0.0
|
|
|
|
|
* 版本:V1.0.0
|
|
|
|
|
*--------------------------------------------------------------------*/
|
|
|
|
|
#endregion << 版 本 注 释 >>
|
|
|
|
|
#endregion << 版 本 注 释 >>
|
|
|
|
|
namespace SlnMesnac.Business
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 设备产出业务逻辑
|
|
|
|
|
/// 设备产出业务逻辑
|
|
|
|
|
/// </summary>
|
|
|
|
|
public class ProdCompletionBusiness : BaseBusiness
|
|
|
|
|
{
|
|
|
|
@ -85,12 +85,15 @@ namespace SlnMesnac.Business
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private static bool isEmptyPalletHandleRunning = false;
|
|
|
|
|
public void Init()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
Task.Run(() =>
|
|
|
|
|
Task.Run(async () =>
|
|
|
|
|
{
|
|
|
|
|
EmptyPalletHandle();
|
|
|
|
|
await EmptyPalletHandle();
|
|
|
|
|
|
|
|
|
|
});
|
|
|
|
|
Task.Run(() =>
|
|
|
|
|
{
|
|
|
|
@ -100,11 +103,11 @@ namespace SlnMesnac.Business
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 设备产出逻辑处理
|
|
|
|
|
/// 设备产出逻辑处理
|
|
|
|
|
/// </summary>
|
|
|
|
|
private async void DeviceOutPutHandle()
|
|
|
|
|
{
|
|
|
|
|
// 读取RFID失败重试次数,超过5次推送报警
|
|
|
|
|
// 读取RFID失败重试次数,超过5次推送报警
|
|
|
|
|
int readRfidAmount = 0;
|
|
|
|
|
while (true)
|
|
|
|
|
{
|
|
|
|
@ -114,23 +117,31 @@ namespace SlnMesnac.Business
|
|
|
|
|
|
|
|
|
|
if (plc == null)
|
|
|
|
|
{
|
|
|
|
|
_logger.LogInformation("读取小包出口信号,PLC连接信息为空......");
|
|
|
|
|
_logger.LogInformation("读取小包出口信号,PLC连接信息为空......");
|
|
|
|
|
Thread.Sleep(3000);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (plc.readByteByAddress(GetPlcAddressByConfigKey("2楼小包出口到位信号"))!=1)
|
|
|
|
|
if (plc.readByteByAddress(GetPlcAddressByConfigKey("2楼小包出口到位信号")) != 1)
|
|
|
|
|
{
|
|
|
|
|
_logger.LogInformation("等待小包出口信号触发......");
|
|
|
|
|
_logger.LogInformation("等待小包出口信号触发......");
|
|
|
|
|
Thread.Sleep(5000);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
string rfid = plc.readStringByAddress(GetPlcAddressByConfigKey("2楼码垛出口RFID条码地址"),12).Replace("\0","");
|
|
|
|
|
if (!string.IsNullOrWhiteSpace(rfid))
|
|
|
|
|
{
|
|
|
|
|
_logger.LogInformation("小包出口已经有RFID了,无需再读");
|
|
|
|
|
Thread.Sleep(5000);
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
string epcStr = await ReadEpcStrByRfidKeyAsync("secondFloorOut");
|
|
|
|
|
if (string.IsNullOrEmpty(epcStr))
|
|
|
|
|
{
|
|
|
|
|
_logger.LogError("小包出口到位信号触发,读取RFID失败......");
|
|
|
|
|
//判断前一位置是否有托盘缓存
|
|
|
|
|
_logger.LogError("小包出口到位信号触发,读取RFID失败......");
|
|
|
|
|
//判断前一位置是否有托盘缓存
|
|
|
|
|
RealPalletTask realPalletTask = _realPalletTaskService.Query().FirstOrDefault();
|
|
|
|
|
if (realPalletTask != null)
|
|
|
|
|
{
|
|
|
|
@ -143,11 +154,11 @@ namespace SlnMesnac.Business
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
string virtualEpc = NoReadRFIDAlarm();
|
|
|
|
|
_logger.LogError("小包出口到位信号触发,读取RFID失败超过5次......");
|
|
|
|
|
_logger.LogError("小包出口到位信号触发,读取RFID失败超过5次......");
|
|
|
|
|
if (!string.IsNullOrEmpty(virtualEpc))
|
|
|
|
|
{
|
|
|
|
|
epcStr = virtualEpc;
|
|
|
|
|
_logger.LogError("小包出口到位信号触发,读取RFID失败超过5次,生成虚拟托盘号:"+virtualEpc);
|
|
|
|
|
_logger.LogError("小包出口到位信号触发,读取RFID失败超过5次,生成虚拟托盘号:" + virtualEpc);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
@ -158,32 +169,32 @@ namespace SlnMesnac.Business
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
RefreshMessage($"小包出口读取到RFID条码{epcStr},开始绑定流程:");
|
|
|
|
|
RefreshMessage($"小包出口读取到RFID条码{epcStr},开始绑定流程:");
|
|
|
|
|
|
|
|
|
|
_mesProductPlanService.GetStartedProdPlan(out MesProductPlanDto productPlanDto);
|
|
|
|
|
if (productPlanDto == null)
|
|
|
|
|
{
|
|
|
|
|
//TODO:没有计划的话,处理方式待定
|
|
|
|
|
throw new ArgumentException($"未获取到正在执行的生产计划");
|
|
|
|
|
//TODO:没有计划的话,处理方式待定
|
|
|
|
|
throw new ArgumentException($"未获取到正在执行的生产计划");
|
|
|
|
|
}
|
|
|
|
|
#region 开启事务
|
|
|
|
|
#region 开启事务
|
|
|
|
|
sqlSugarClient.AsTenant().BeginTran();
|
|
|
|
|
//1.生成大条码插入mes_barcode_info;
|
|
|
|
|
//1.生成大条码插入mes_barcode_info;
|
|
|
|
|
string bigCode = GenerateBigBarcode(productPlanDto, epcStr);
|
|
|
|
|
//2.40个小条码及大条码绑定托盘号,小条码绑定大条码
|
|
|
|
|
//2.40个小条码及大条码绑定托盘号,小条码绑定大条码
|
|
|
|
|
BindingBarCode(bigCode, epcStr);
|
|
|
|
|
//3.更新mes_product_plan及mes_product_order表,更新已生产数量
|
|
|
|
|
//3.更新mes_product_plan及mes_product_order表,更新已生产数量
|
|
|
|
|
UpdatePlanInfoAndOrder(productPlanDto);
|
|
|
|
|
|
|
|
|
|
// 删除正在使用的数据库托盘号
|
|
|
|
|
// 删除正在使用的数据库托盘号
|
|
|
|
|
RealPalletTask realPallet = _realPalletTaskService.Query(x => x.PalletCode == epcStr).FirstOrDefault();
|
|
|
|
|
if (realPallet != null)
|
|
|
|
|
{
|
|
|
|
|
sqlSugarClient.AsTenant().GetConnection("mes").Deleteable(realPallet).ExecuteCommand();
|
|
|
|
|
}
|
|
|
|
|
// 写入PLC RFID号供调度使用
|
|
|
|
|
plc.writeStringByAddress(GetPlcAddressByConfigKey("2楼码垛出口RFID条码地址"), epcStr);
|
|
|
|
|
plc.writeByteByAddress(GetPlcAddressByConfigKey("2楼小包出口到位信号"),2);
|
|
|
|
|
// 写入PLC RFID号供调度使用
|
|
|
|
|
plc.writeStringByAddress(GetPlcAddressByConfigKey("2楼码垛出口RFID条码地址"), epcStr);
|
|
|
|
|
// plc.writeByteByAddress(GetPlcAddressByConfigKey("2楼小包出口到位信号"), 2);
|
|
|
|
|
readRfidAmount = 0;
|
|
|
|
|
sqlSugarClient.AsTenant().CommitTran();
|
|
|
|
|
#endregion
|
|
|
|
@ -192,15 +203,15 @@ namespace SlnMesnac.Business
|
|
|
|
|
{
|
|
|
|
|
sqlSugarClient.AsTenant().RollbackTran();
|
|
|
|
|
|
|
|
|
|
_logger.LogError($"DeviceOutPutHandle异常:{ex.Message}");
|
|
|
|
|
_logger.LogError($"DeviceOutPutHandle异常:{ex.Message}");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Thread.Sleep(1000 * 5);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 推送报警,并生成虚拟托盘号暂时使用,虚拟托盘号储存到报警信息,人工处理可以将虚拟托盘号替换为正常托盘号
|
|
|
|
|
/// <return> 返回生产的虚拟托盘号
|
|
|
|
|
/// 推送报警,并生成虚拟托盘号暂时使用,虚拟托盘号储存到报警信息,人工处理可以将虚拟托盘号替换为正常托盘号
|
|
|
|
|
/// <return> 返回生产的虚拟托盘号
|
|
|
|
|
/// </summary>
|
|
|
|
|
private string NoReadRFIDAlarm()
|
|
|
|
|
{
|
|
|
|
@ -210,8 +221,8 @@ namespace SlnMesnac.Business
|
|
|
|
|
epcStr = "TEMP" + DateTime.Now.ToString("MMddHHmm");
|
|
|
|
|
sqlSugarClient.AsTenant().BeginTran();
|
|
|
|
|
|
|
|
|
|
// 有报警,找出该设备的报警记录,如果没有报警记录或者报警记录已结束,则新增报警记录
|
|
|
|
|
int warnRuleId = int.Parse(WarnStatusEnum.小包出口读取RFID失败5次.GetDescription());
|
|
|
|
|
// 有报警,找出该设备的报警记录,如果没有报警记录或者报警记录已结束,则新增报警记录
|
|
|
|
|
int warnRuleId = int.Parse(WarnStatusEnum.小包出口读取RFID失败5次.GetDescription());
|
|
|
|
|
DmsRecordAlarmTime? dmsRecordAlarmTime = sqlSugarClient.AsTenant().GetConnection("mes").Queryable<DmsRecordAlarmTime>().First(x => x.AlarmRuleId == warnRuleId);
|
|
|
|
|
if (dmsRecordAlarmTime == null)
|
|
|
|
|
{
|
|
|
|
@ -224,8 +235,8 @@ namespace SlnMesnac.Business
|
|
|
|
|
dmsRecordAlarmTime.ContinueTime = dmsBaseAlarmRule.ContinueTime;
|
|
|
|
|
dmsRecordAlarmTime.AlarmReason = dmsBaseAlarmRule.AlarmReason;
|
|
|
|
|
dmsRecordAlarmTime.AlarmReason = dmsBaseAlarmRule.AlarmReason;
|
|
|
|
|
dmsRecordAlarmTime.AlarmData = WarnStatusEnum.小包出口读取RFID失败5次.ToString();
|
|
|
|
|
dmsRecordAlarmTime.HandleSuggest = dmsBaseAlarmRule.HandleSuggest+";;虚拟托盘号为:"+epcStr;
|
|
|
|
|
dmsRecordAlarmTime.AlarmData = WarnStatusEnum.小包出口读取RFID失败5次.ToString();
|
|
|
|
|
dmsRecordAlarmTime.HandleSuggest = dmsBaseAlarmRule.HandleSuggest + ";;虚拟托盘号为:" + epcStr;
|
|
|
|
|
dmsRecordAlarmTime.CreateBy = "SlnMesnac";
|
|
|
|
|
dmsRecordAlarmTime.CreateTime = DateTime.Now;
|
|
|
|
|
|
|
|
|
@ -238,8 +249,8 @@ namespace SlnMesnac.Business
|
|
|
|
|
dmsRecordAlarmInfo.ContinueTime = dmsBaseAlarmRule.ContinueTime;
|
|
|
|
|
dmsRecordAlarmInfo.AlarmReason = dmsBaseAlarmRule.AlarmReason;
|
|
|
|
|
dmsRecordAlarmInfo.AlarmReason = dmsBaseAlarmRule.AlarmReason;
|
|
|
|
|
dmsRecordAlarmInfo.AlarmData = WarnStatusEnum.小包出口读取RFID失败5次.ToString();
|
|
|
|
|
dmsRecordAlarmInfo.HandleSuggest = dmsBaseAlarmRule.HandleSuggest + ";;虚拟托盘号为:" + epcStr;
|
|
|
|
|
dmsRecordAlarmInfo.AlarmData = WarnStatusEnum.小包出口读取RFID失败5次.ToString();
|
|
|
|
|
dmsRecordAlarmInfo.HandleSuggest = dmsBaseAlarmRule.HandleSuggest + ";;虚拟托盘号为:" + epcStr;
|
|
|
|
|
dmsRecordAlarmInfo.CreateBy = "SlnMesnac";
|
|
|
|
|
dmsRecordAlarmInfo.CreateTime = DateTime.Now;
|
|
|
|
|
|
|
|
|
@ -264,10 +275,11 @@ namespace SlnMesnac.Business
|
|
|
|
|
|
|
|
|
|
sqlSugarClient.AsTenant().CommitTran();
|
|
|
|
|
return epcStr;
|
|
|
|
|
}catch(Exception ex)
|
|
|
|
|
}
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
sqlSugarClient.AsTenant().RollbackTran();
|
|
|
|
|
_logger.LogError($"NoReadRFIDAlarm异常:{ex.Message}");
|
|
|
|
|
_logger.LogError($"NoReadRFIDAlarm异常:{ex.Message}");
|
|
|
|
|
return "";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -275,7 +287,7 @@ namespace SlnMesnac.Business
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 生成大条码插入mes_barcode_info;
|
|
|
|
|
/// 生成大条码插入mes_barcode_info;
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="productPlanDto"></param>
|
|
|
|
|
/// <param name="epcStr"></param>
|
|
|
|
@ -318,7 +330,7 @@ namespace SlnMesnac.Business
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 40个小条码及大条码绑定托盘号,小条码绑定大条码
|
|
|
|
|
/// 40个小条码及大条码绑定托盘号,小条码绑定大条码
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="bigBarcode"></param>
|
|
|
|
|
/// <param name="epcStr"></param>
|
|
|
|
@ -327,12 +339,12 @@ namespace SlnMesnac.Business
|
|
|
|
|
List<MesPrdBarcodeInfo> list = _mesPrdBarCodeService.GetUseBarCodeList();
|
|
|
|
|
if (list == null || list.Count == 0)
|
|
|
|
|
{
|
|
|
|
|
throw new InvalidOperationException("托盘未找到可以绑定的小条码");
|
|
|
|
|
throw new InvalidOperationException("托盘未找到可以绑定的小条码");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (list.Where(x => x.PrintFlag == "1").ToList().Count < 40)
|
|
|
|
|
{
|
|
|
|
|
// TODO推送低级别报警
|
|
|
|
|
// TODO推送低级别报警
|
|
|
|
|
PrintLessThan40Alarm();
|
|
|
|
|
}
|
|
|
|
|
foreach (var item in list)
|
|
|
|
@ -350,14 +362,14 @@ namespace SlnMesnac.Business
|
|
|
|
|
MesProductPlan productPlan = _mesProductPlanService.Query(x => x.PlanCode == productPlanDto.PlanCode).FirstOrDefault();
|
|
|
|
|
if (productPlan == null)
|
|
|
|
|
{
|
|
|
|
|
throw new InvalidOperationException("未找到该生产计划!");
|
|
|
|
|
throw new InvalidOperationException("未找到该生产计划!");
|
|
|
|
|
}
|
|
|
|
|
MesProductOrder productOrder = _mesProductOrderService.Query(x => x.ProductOrderId == productPlan.ProductOrderId).FirstOrDefault();
|
|
|
|
|
if (productPlan == null)
|
|
|
|
|
{
|
|
|
|
|
throw new InvalidOperationException("未找到该生产计划对应的生产工单!");
|
|
|
|
|
throw new InvalidOperationException("未找到该生产计划对应的生产工单!");
|
|
|
|
|
}
|
|
|
|
|
#region 更新生产计划
|
|
|
|
|
#region 更新生产计划
|
|
|
|
|
if (productPlan.CompleteAmount == 0)
|
|
|
|
|
{
|
|
|
|
|
productPlan.RealBeginTime = DateTime.Now;
|
|
|
|
@ -367,14 +379,14 @@ namespace SlnMesnac.Business
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
productPlan.RealEndTime = DateTime.Now;
|
|
|
|
|
productPlan.PlanStatus = Model.enums.PlanStatusEnum.已完成;
|
|
|
|
|
productPlan.PlanStatus = Model.enums.PlanStatusEnum.已完成;
|
|
|
|
|
}
|
|
|
|
|
productPlan.UpdateTime = DateTime.Now;
|
|
|
|
|
productPlan.UpdateBy = "SlnMesnac";
|
|
|
|
|
sqlSugarClient.AsTenant().GetConnection("mes").Updateable(productPlan).ExecuteCommand();
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 更新生产工单
|
|
|
|
|
#region 更新生产工单
|
|
|
|
|
|
|
|
|
|
if (productOrder.CompleteAmount == 0)
|
|
|
|
|
{
|
|
|
|
@ -396,8 +408,8 @@ namespace SlnMesnac.Business
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 小包产出绑定托盘,小包喷码数量小于40低级别报警
|
|
|
|
|
/// <return> 返回生产的虚拟托盘号
|
|
|
|
|
/// 小包产出绑定托盘,小包喷码数量小于40低级别报警
|
|
|
|
|
/// <return> 返回生产的虚拟托盘号
|
|
|
|
|
/// </summary>
|
|
|
|
|
private void PrintLessThan40Alarm()
|
|
|
|
|
{
|
|
|
|
@ -405,8 +417,8 @@ namespace SlnMesnac.Business
|
|
|
|
|
{
|
|
|
|
|
sqlSugarClient.AsTenant().BeginTran();
|
|
|
|
|
|
|
|
|
|
// 有报警,找出该设备的报警记录,如果没有报警记录或者报警记录已结束,则新增报警记录
|
|
|
|
|
int warnRuleId = int.Parse(WarnStatusEnum.托盘绑定时已喷码数不足40.GetDescription());
|
|
|
|
|
// 有报警,找出该设备的报警记录,如果没有报警记录或者报警记录已结束,则新增报警记录
|
|
|
|
|
int warnRuleId = int.Parse(WarnStatusEnum.托盘绑定时已喷码数不足40.GetDescription());
|
|
|
|
|
DmsRecordAlarmTime? dmsRecordAlarmTime = sqlSugarClient.AsTenant().GetConnection("mes").Queryable<DmsRecordAlarmTime>().First(x => x.AlarmRuleId == warnRuleId);
|
|
|
|
|
if (dmsRecordAlarmTime == null)
|
|
|
|
|
{
|
|
|
|
@ -419,7 +431,7 @@ namespace SlnMesnac.Business
|
|
|
|
|
dmsRecordAlarmTime.ContinueTime = dmsBaseAlarmRule.ContinueTime;
|
|
|
|
|
dmsRecordAlarmTime.AlarmReason = dmsBaseAlarmRule.AlarmReason;
|
|
|
|
|
dmsRecordAlarmTime.AlarmReason = dmsBaseAlarmRule.AlarmReason;
|
|
|
|
|
dmsRecordAlarmTime.AlarmData = WarnStatusEnum.托盘绑定时已喷码数不足40.ToString();
|
|
|
|
|
dmsRecordAlarmTime.AlarmData = WarnStatusEnum.托盘绑定时已喷码数不足40.ToString();
|
|
|
|
|
dmsRecordAlarmTime.HandleSuggest = dmsBaseAlarmRule.HandleSuggest;
|
|
|
|
|
dmsRecordAlarmTime.CreateBy = "SlnMesnac";
|
|
|
|
|
dmsRecordAlarmTime.CreateTime = DateTime.Now;
|
|
|
|
@ -433,7 +445,7 @@ namespace SlnMesnac.Business
|
|
|
|
|
dmsRecordAlarmInfo.ContinueTime = dmsBaseAlarmRule.ContinueTime;
|
|
|
|
|
dmsRecordAlarmInfo.AlarmReason = dmsBaseAlarmRule.AlarmReason;
|
|
|
|
|
dmsRecordAlarmInfo.AlarmReason = dmsBaseAlarmRule.AlarmReason;
|
|
|
|
|
dmsRecordAlarmInfo.AlarmData = WarnStatusEnum.托盘绑定时已喷码数不足40.ToString();
|
|
|
|
|
dmsRecordAlarmInfo.AlarmData = WarnStatusEnum.托盘绑定时已喷码数不足40.ToString();
|
|
|
|
|
dmsRecordAlarmInfo.HandleSuggest = dmsBaseAlarmRule.HandleSuggest;
|
|
|
|
|
dmsRecordAlarmInfo.CreateBy = "SlnMesnac";
|
|
|
|
|
dmsRecordAlarmInfo.CreateTime = DateTime.Now;
|
|
|
|
@ -463,18 +475,18 @@ namespace SlnMesnac.Business
|
|
|
|
|
catch (Exception ex)
|
|
|
|
|
{
|
|
|
|
|
sqlSugarClient.AsTenant().RollbackTran();
|
|
|
|
|
_logger.LogError($"PrintLessThan40Alarm异常:{ex.Message}");
|
|
|
|
|
_logger.LogError($"PrintLessThan40Alarm异常:{ex.Message}");
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 空托盘进入码垛位,读取RFID备用
|
|
|
|
|
/// 空托盘进入码垛位,读取RFID备用
|
|
|
|
|
/// </summary>
|
|
|
|
|
private async void EmptyPalletHandle()
|
|
|
|
|
private async Task EmptyPalletHandle()
|
|
|
|
|
{
|
|
|
|
|
//读取PLC空托盘流转信号
|
|
|
|
|
//读取PLC空托盘流转信号
|
|
|
|
|
while (true)
|
|
|
|
|
{
|
|
|
|
|
try
|
|
|
|
@ -482,55 +494,59 @@ namespace SlnMesnac.Business
|
|
|
|
|
var plc = base.GetPlcByKey("plc");
|
|
|
|
|
if (plc == null)
|
|
|
|
|
{
|
|
|
|
|
_logger.LogInformation("读取PLC空托盘码垛到位信号,PLC连接信息为空......");
|
|
|
|
|
_logger.LogInformation("读取PLC空托盘码垛到位信号,PLC连接信息为空......");
|
|
|
|
|
Thread.Sleep(5000);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
if (!plc.readBoolByAddress(GetPlcAddressByConfigKey("2楼码垛到位信号")))
|
|
|
|
|
if (!plc.readBoolByAddress(GetPlcAddressByConfigKey("2楼码垛到位信号")))
|
|
|
|
|
{
|
|
|
|
|
_logger.LogInformation("等待空托盘到位信号触发......");
|
|
|
|
|
_logger.LogInformation("等待空托盘到位信号触发......");
|
|
|
|
|
Thread.Sleep(5000);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//读取RFID、获取当前正在执行的计划、将当前计划、工单等信息与托盘绑定
|
|
|
|
|
RefreshMessage("空托盘到位信号触发成功,读取托盘RFID信息");
|
|
|
|
|
RealPalletTask realPalletTask = _realPalletTaskService.Query().FirstOrDefault();
|
|
|
|
|
if (realPalletTask != null)
|
|
|
|
|
{
|
|
|
|
|
_logger.LogInformation("空托盘到位信号触发,已经有读取托盘,不再读取......");
|
|
|
|
|
Thread.Sleep(5000);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
//读取RFID、获取当前正在执行的计划、将当前计划、工单等信息与托盘绑定
|
|
|
|
|
RefreshMessage("空托盘到位信号触发成功,读取托盘RFID信息");
|
|
|
|
|
|
|
|
|
|
string epcStr = await ReadEpcStrByRfidKeyAsync("secondFloorPallet");
|
|
|
|
|
|
|
|
|
|
if (string.IsNullOrEmpty(epcStr))
|
|
|
|
|
{
|
|
|
|
|
_logger.LogError("空托盘到位信号触发,读取RFID失败......");
|
|
|
|
|
_logger.LogError("空托盘到位信号触发,读取RFID失败......");
|
|
|
|
|
Thread.Sleep(1000 * 10);
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
RefreshMessage($"空托盘RFID信息读取成功,标签信息:{epcStr}");
|
|
|
|
|
RefreshMessage($"空托盘RFID信息读取成功,标签信息:{epcStr}");
|
|
|
|
|
|
|
|
|
|
// 插入一条托盘记录
|
|
|
|
|
RealPalletTask realPalletTask = new RealPalletTask()
|
|
|
|
|
// 插入一条托盘记录
|
|
|
|
|
realPalletTask = new RealPalletTask()
|
|
|
|
|
{
|
|
|
|
|
PalletCode = epcStr,
|
|
|
|
|
RecordTime = DateTime.Now,
|
|
|
|
|
};
|
|
|
|
|
bool result = _realPalletTaskService.Insert(realPalletTask);
|
|
|
|
|
if (result)
|
|
|
|
|
{
|
|
|
|
|
plc.writeBoolByAddress(GetPlcAddressByConfigKey("2楼码垛到位信号"), false);
|
|
|
|
|
}
|
|
|
|
|
_realPalletTaskService.Insert(realPalletTask);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
catch (Exception e)
|
|
|
|
|
{
|
|
|
|
|
RefreshMessage($"空托盘进入码垛位处理异常:{e.Message}");
|
|
|
|
|
RefreshMessage($"空托盘进入码垛位处理异常:{e.Message}");
|
|
|
|
|
}
|
|
|
|
|
Thread.Sleep(1000*5);
|
|
|
|
|
Thread.Sleep(1000 * 10);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 根据条码提取序列
|
|
|
|
|
/// 根据条码提取序列
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="barCode"></param>
|
|
|
|
|
/// <param name="result"></param>
|
|
|
|
@ -546,7 +562,7 @@ namespace SlnMesnac.Business
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
throw new InvalidOperationException($"通过条码:{barCode}提取当前序列异常:未找到匹配的数字");
|
|
|
|
|
throw new InvalidOperationException($"通过条码:{barCode}提取当前序列异常:未找到匹配的数字");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|