using Admin.Core.Common;
using Admin.Core.IService;
using Admin.Core.Model.Model_New;
using Admin.Core.Model;
using Admin.Core.Model.ViewModels;
using System.Text;
using System.Timers;
using Aucma.Core.HwPLc;
using log4net;
using NetTaste;
using NPOI.SS.Formula.Functions;
using System.Collections.Generic;
namespace Aucma.Core.SheetMetalTasks
{
///
/// 任务列表
///
public class AucamSheetMetalTaskService : IAucamSheetMetalTaskService
{
private static readonly log4net.ILog logHelper = LogManager.GetLogger(typeof(AucamSheetMetalTaskService));
#region 刷新创建计划
///
/// 刷新创建计划
///
public delegate Task RefreshCretaePlanInfo();
public static event RefreshCretaePlanInfo RefreshCreatePlanInfoEvent;
#endregion
#region 刷新图表
///
/// 刷新创建计划
///
public delegate Task RefreshChat();
public static event RefreshChat RefreshChatEvent;
#endregion
#region 刷新创建计划
///
/// 刷新创建计划
///
public delegate void RefreshPlanInfo(SheetMetaSendPlanInfoView planInfo);
public static event RefreshPlanInfo RefreshPlanInfoEvent;
#endregion
#region 刷新当前正在执行的计划
///
/// 刷新当前正在执行的计划
///
public delegate void RefreshCurrentPlanInfo();
public static event RefreshCurrentPlanInfo RefreshCurrentPlanInfoEvent;
#endregion
#region 给设备监控模块显示
///
/// 刷新当前正在执行的计划
///
public delegate void RefreshExecInfo(string message, string color);
public static event RefreshExecInfo RefreshExecInfoEvent;
#endregion
protected readonly IExecutePlanInfoServices? _executePlanInfoServices;
protected readonly IRecordSidePanelComplateServices _sidePanelComplateServices;
protected readonly IRecordBackPanelComplateServices _backPanelComplateServices;
protected readonly IProductPlanInfoServices _productPlanInfoServices;
protected readonly ISysUserInfoServices? _sysUserInfoServices;
protected readonly IMaterialCompletionServices? _materialCompletionServices;
protected readonly ISmSyncModelServices? _smSyncModelServices;
public HwPLc.PlcModel obj_backPanel = null;
public HwPLc.PlcModel obj_sidePanel = null;
bool flay = true;//方法完成标识
#region 构造函数
///
/// 构造函数
///
///
///
///
///
///
///
public AucamSheetMetalTaskService(IExecutePlanInfoServices executePlanInfoServices, IRecordSidePanelComplateServices recordSidePanelComplateServices,
IRecordBackPanelComplateServices recordBackPanelComplateServices, IProductPlanInfoServices productPlanInfoServices,
ISysUserInfoServices sysUserInfoServices, IMaterialCompletionServices materialCompletionServices, ISmSyncModelServices smSyncModelServices)
{
_executePlanInfoServices = executePlanInfoServices;
_sidePanelComplateServices = recordSidePanelComplateServices;
_backPanelComplateServices = recordBackPanelComplateServices;
_productPlanInfoServices = productPlanInfoServices;
_sysUserInfoServices = sysUserInfoServices;
_materialCompletionServices = materialCompletionServices;
_smSyncModelServices = smSyncModelServices;
}
#endregion
#region 启动任务下发
public Task SheetMetalTasks()
{
//Thread.Sleep(5000);
//while (true)
//{
// var obj_backPanel = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("BackPanelPLC"));
// if (obj_backPanel.plc.IsConnected)
// {
// bool result = obj_backPanel.plc.ReadBool("M61");
// Console.WriteLine(result);
// Thread.Sleep(5000);
// }
//}
Task.Run(async () =>
{
await InitSendBackPanelPlan();
});
//Task.Run(async () =>
//{
// await InitSendSidePanelPlan();
//});
//Task.Run(() =>
//{
// UpdateComplatePlan();//更新计划数
//});
//Task.Run(async () =>
//{
// await ReadSideBlanking();//获取前板下料
//});
Task.Run(async () =>
{
await QuerySidePanelMode();//获取型号
});
Task.Run(async () =>
{
await QueryBackPanelMode();
});
return Task.CompletedTask;
}
#endregion
#region 之前代码
#region 下发多个计划同步执行
///
/// 初始化下发生产计划,获取已拆分的计划进行下发——前板任务
///
public async Task InitSendSidePanelPlan()
{
Thread.Sleep(5000);
var obj_sidePanel = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("SidePanelPlc"));
while (true)
{
List planInfoList = await _executePlanInfoServices.QuerySheetMetalSendPlanData("1001");
if (planInfoList == null || planInfoList.Count == 0) continue;
planInfoList = planInfoList.Where(d => d.PlanAmount > d.SidePanelAmount&&(d.ExecuteStatus == 1 || d.ExecuteStatus == 2)).ToList();
if (planInfoList == null || planInfoList.Count == 0) continue;
planInfoList = planInfoList.Where(d => d.ExecuteStatus == 1 || d.ExecuteStatus == 2).ToList();
if (planInfoList == null || planInfoList.Count == 0) continue;
var planInfos = planInfoList.Where(d => d.PlanType == 2).ToList();
if (planInfos != null)
{
if (planInfos.Count > 0)
{
SheetMetaSendPlanInfoView planInfo = planInfos.FirstOrDefault(d => d.SidePanelAmount != d.PlanAmount);
if (planInfo == null) continue;
if (planInfo.PlanType == 2)//如果为2或者为1 前板板计划单独下发 以前板完成为主
{
List binList=GetSideBinStatus(obj_sidePanel);
SmSyncModel smSyncModel =_smSyncModelServices.FirstAsync(d => d.MaterialSpecifications.Equals(planInfo.MaterialSpecificatons)&&d.Category=="0").Result;
if (smSyncModel == null) continue;
Bin bin = binList.First(d => d.ProductId.Equals(smSyncModel.SmProductId));
if (bin==null) continue;
SendPlanTaskToSidPanel(planInfo, obj_sidePanel,smSyncModel.SmProductId.ObjToInt());
UpdateSidPanelPlanTaskByComplate(planInfo);
}
}
else
{
Console.WriteLine("未获取到需要下发的任务");
}
}
Thread.Sleep(5000);
}
}
///
/// 初始化下发生产计划,获取已拆分的计划进行下发——后板任务
///
public async Task InitSendBackPanelPlan()
{
Thread.Sleep(5000);
var obj_backPanel = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("BackPanelPLC"));
await Task.CompletedTask;
while (true)
{
try
{
var planInfoList = await _executePlanInfoServices.QuerySheetMetalSendPlanData("1001");
if (planInfoList == null || planInfoList.Count == 0) continue;
planInfoList = planInfoList.Where(d => d.PlanAmount > d.SidePanelAmount).ToList();
if (planInfoList == null || planInfoList.Count == 0) continue;
planInfoList = planInfoList.Where(d => d.ExecuteStatus == 1 || d.ExecuteStatus == 2).ToList();
if (planInfoList == null || planInfoList.Count == 0) continue;
var planInfos = planInfoList.Where(d => d.PlanType == 3 || d.PlanType == 1).ToList();
if (planInfos != null)
{
if (planInfos.Count > 0)
{
SheetMetaSendPlanInfoView planInfo = planInfos.FirstOrDefault(d => d.BackPanelAmount != d.PlanAmount);
if (planInfo == null) continue;
if (planInfo.PlanType == 3 )//如果为3或者为1 后板计划单独下发 以前板完成为主
{
//获取设置的型号查询对应的型号,下发计划
List binList = GetBackBinStatus(obj_backPanel);
SmSyncModel smSyncModel = _smSyncModelServices.FirstAsync(d => d.MaterialSpecifications.Equals(planInfo.MaterialSpecificatons) && d.Category == "1").Result;
if (smSyncModel == null) continue;
Bin bin = binList.FirstOrDefault(d => d.ProductId.Equals(smSyncModel.SmProductId));
if (bin == null) continue;
SendPlanTaskToBackPanel(planInfo, obj_backPanel, smSyncModel.SmProductId.ObjToInt());
UpdateBackPanelPlanTaskByComplate(planInfo);
}
}
else
{
Console.WriteLine("未获取到需要下发的任务");
}
}
Thread.Sleep(3000);
}
catch (Exception ex)
{
logHelper.Error(ex.Message);
}
}
}
///
/// 下发前板生产计划
///
///
///
public void SendPlanTaskToSidPanel(SheetMetaSendPlanInfoView planInfo, PlcModel obj_sidePanel,int SmProductId)
{
try
{
Task.Run(() =>
{
if (obj_sidePanel != null)
{
//计划编号10个字:D6000-D6009、物料编号10个字:D6010-D6019、计划数量1个字:D6020、应答字1个字D6021
obj_sidePanel.plc.WriteString("D6000", planInfo.TaskCode);
string processNumber = GetProcessNumberBy(planInfo.MaterialCode);
obj_sidePanel.plc.WriteString("D6010", planInfo.MaterialSpecificatons);
obj_sidePanel.plc.WriteInt32("D6020", planInfo.PlanAmount);
obj_sidePanel.plc.WriteInt32("D6021", 1);
obj_sidePanel.plc.WriteInt32("D6022", SmProductId);//产品号
Console.WriteLine($"{DateTime.Now.ToString("HH:m:s")}===>计划【{planInfo.TaskCode}】已下发,等待前板设备应答。。。。。。");
RefreshExecInfoEvent?.Invoke($"计划【{planInfo.TaskCode}】已下发,等待前板设备应答。。。。。。", "White");
#region PLC反馈信号逻辑处理
//循环读取PLC应答信号,PLC应答后复位应答信号、更新计划状态为执行中
bool isFlag = true;
DateTime startTime = DateTime.Now;
do
{
if (obj_sidePanel.plc.ReadInt16("D6021") == 2)
{
obj_sidePanel.plc.WriteInt32("D6021", 0);
Console.WriteLine($"{DateTime.Now.ToString("HH:m:s")}===>计划【{planInfo.TaskCode}】,收到前板设备应答信号,复位应答地址");
RefreshExecInfoEvent?.Invoke($"计划【{planInfo.TaskCode}】,收到前板板设备应答信号,复位应答地址", "White");
startTime = DateTime.Now;
isFlag = false;
}
Thread.Sleep(2000);
} while (isFlag);
//更新计划状态为2执行中
planInfo.ExecuteStatus = 2;
bool result = _executePlanInfoServices.UpdateSheetMetalExecutePlanInfo(planInfo.ObjId, planInfo.ExecuteStatus, startTime).Result;
if (result)
{
//更新前端展示图表
RefreshCreatePlanInfoEvent?.Invoke();//更新界面
RefreshChatEvent?.Invoke();//刷新图表
}
#endregion
//读取设备进度,完成后再次下发新任务
ReadDeviceComplate_SidePanel(obj_sidePanel);
if (!isFlag)
{
//更新前端展示图表
RefreshCreatePlanInfoEvent?.Invoke();//更新界面
RefreshChatEvent?.Invoke();//刷新图表
RefreshPlanInfoEvent?.Invoke(planInfo);//刷新计划执行
}
}
});
}
catch (Exception ex)
{
RefreshExecInfoEvent?.Invoke($"前板⽣产计划下发异常:{ex.Message}", "Red");
}
}
///
/// 下发背板生产计划
///
///
///
public void SendPlanTaskToBackPanel(SheetMetaSendPlanInfoView planInfo, PlcModel obj_backPanel,int productId)
{
try
{
Task.Run(() =>
{
if (obj_backPanel != null)
{
//计划编号10个字:D6000-D6009、物料编号10个字:D6010-D6019、计划数量1个字:D6020、应答字1个字D6021
obj_backPanel.plc.WriteString("D4000", planInfo.TaskCode);
string processNumber = GetProcessNumberBy(planInfo.MaterialCode);
obj_backPanel.plc.WriteString("D4010", planInfo.MaterialSpecificatons);
obj_backPanel.plc.WriteInt16("D4020", planInfo.PlanAmount.ToString());
obj_backPanel.plc.WriteInt16("D4021", 1.ToString());
obj_backPanel.plc.WriteInt16("D4022", productId.ToString());
Console.WriteLine($"{DateTime.Now.ToString("HH:m:s")}===>计划【{planInfo.TaskCode}】已下发,等待背板设备应答。。。。。。");
RefreshExecInfoEvent?.Invoke($"计划【{planInfo.TaskCode}】已下发,等待背板设备应答。。。。。。", "White");
#region PLC反馈信号逻辑处理
//循环读取PLC应答信号,PLC应答后复位应答信号、更新计划状态为执行中
bool isFlag = true;
DateTime startTime = DateTime.Now;
do
{
Console.WriteLine(obj_backPanel.plc.ReadInt16("D4021"));
if (obj_backPanel.plc.ReadInt16("D4021") == 2)
{
obj_backPanel.plc.WriteInt16("D4021", "0");
Console.WriteLine($"{DateTime.Now.ToString("HH:m:s")}===>收到背板板设备应答信号,复位应答地址");
RefreshExecInfoEvent?.Invoke($"收到背板板设备应答信号,复位应答地址", "White");
startTime = DateTime.Now;
isFlag = false;
}
Thread.Sleep(2000);
} while (isFlag);
//更新计划状态为2执行中
planInfo.ExecuteStatus = 2;
bool result = _executePlanInfoServices.UpdateSheetMetalExecutePlanInfo(planInfo.ObjId, planInfo.ExecuteStatus, startTime).Result;
if (result)
{
//更新前端展示图表
RefreshCreatePlanInfoEvent?.Invoke();//更新界面
RefreshChatEvent?.Invoke();//刷新图表
//RefreshPlanInfoEvent?.Invoke(planInfo);
}
#endregion
//读取设备进度,完成后再次下发新任务
ReadDeviceComplate_BackPanel(obj_backPanel);
if (!isFlag)
{
//更新前端展示图表
RefreshCreatePlanInfoEvent?.Invoke();//更新界面
RefreshChatEvent?.Invoke();//刷新图表
}
}
});
}
catch (Exception ex)
{
RefreshExecInfoEvent?.Invoke($"背板⽣产计划下发异常:{ex.Message}", "Red");
}
}
///
/// 根据后板完成记录更新生产计划
///
private void UpdateBackPanelPlanTaskByComplate(SheetMetaSendPlanInfoView planInfo)
{
try
{
lock (string.Empty)
{
bool isComplate = true;
do
{
//等待计划执行完成
List sidePanelComplates = _sidePanelComplateServices.Query(x => x.ProductlineCode == "1001" && x.PlanCode == planInfo.TaskCode);
int sumSidePanelAmount = sidePanelComplates.Sum(x => x.OutPutAmount);
List backPanelComplates = _backPanelComplateServices.Query(x => x.ProductlineCode == "1001" && x.PlanCode == planInfo.TaskCode);
int sumBackPanelAmount = backPanelComplates.Sum(x => x.OutPutAmount);
Console.WriteLine($"当前计划:{planInfo.TaskCode};计划产量:{planInfo.PlanAmount};前板完成:{sumSidePanelAmount};背板完成:{sumBackPanelAmount}");
RefreshExecInfoEvent?.Invoke($"当前计划:{planInfo.TaskCode};计划产量:{planInfo.PlanAmount};前板完成:{sumSidePanelAmount};背板完成:{sumBackPanelAmount}", "White");
int sumAmount = 0;
if (planInfo.PlanType == 1)
{
if (planInfo.PlanAmount == sumBackPanelAmount)
{
if (sumSidePanelAmount == sumBackPanelAmount && sumSidePanelAmount != 0 && sumBackPanelAmount != 0)
{
sumAmount = sumSidePanelAmount;
planInfo.ExecuteStatus = 3;
}
if (sumSidePanelAmount < sumBackPanelAmount && sumBackPanelAmount == planInfo.PlanAmount)
{
sumAmount = sumSidePanelAmount;
}
if (sumSidePanelAmount > sumBackPanelAmount && sumSidePanelAmount == planInfo.PlanAmount)
{
sumAmount = sumBackPanelAmount;
}
if (sumSidePanelAmount == 0 && sumBackPanelAmount == 0) sumAmount = 0;
isComplate = false;
}
else
{
if (sumSidePanelAmount < sumBackPanelAmount && sumBackPanelAmount == planInfo.PlanAmount)
{
sumAmount = sumSidePanelAmount;
}
if (sumSidePanelAmount > sumBackPanelAmount && sumSidePanelAmount == planInfo.PlanAmount)
{
sumAmount = sumBackPanelAmount;
}
if (sumSidePanelAmount == 0 && sumBackPanelAmount == 0) sumAmount = 0;
}
}
if (planInfo.PlanType == 3)
{
sumAmount = sumBackPanelAmount;
if (planInfo.PlanAmount - sumAmount == 0)
{
planInfo.ExecuteStatus = 3;
isComplate = false;
}
planInfo.CompleteAmount = sumAmount;
}
var obj = _executePlanInfoServices.FirstAsync(d => d.ObjId == planInfo.ObjId).Result;
if (obj.PlanType == 1 && planInfo.ExecuteStatus == 3)
{
obj.CompleteAmount = sumAmount;
obj.EndTime = DateTime.Now;
}
if (obj.PlanType == 3 && planInfo.ExecuteStatus == 3)
{
obj.EndTime = DateTime.Now;
}
bool result = _executePlanInfoServices.UpdateExecutePlanInfo(obj).Result;
if (result)
{
//更新前端展示图表
// RefreshCreatePlanInfoEvent?.Invoke();//更新界面
//if (planInfo.PlanType == 3)
//{
RefreshCreatePlanInfoEvent?.Invoke();//更新界面
RefreshPlanInfoEvent?.Invoke(planInfo);
//}
RefreshChatEvent?.Invoke();//刷新图表
}
Thread.Sleep(5000);
} while (isComplate);
if (!isComplate)
{
RefreshCreatePlanInfoEvent?.Invoke();//更新界面
RefreshPlanInfoEvent?.Invoke(planInfo);
RefreshChatEvent?.Invoke();//刷新图表
}
}
}
catch (Exception ex)
{
Console.WriteLine($"计划任务信息更新异常:{ex.Message}");
RefreshExecInfoEvent?.Invoke($"计划任务信息更新异常:{ex.Message}", "Red");
}
}
///
/// 根据前板完成记录更新生产计划
///
///
private void UpdateSidPanelPlanTaskByComplate(SheetMetaSendPlanInfoView planInfo)
{
lock (string.Empty)
{
bool isComplate = true;
do
{
try
{
//等待计划执行完成
List sidePanelComplates = _sidePanelComplateServices.Query(x => x.ProductlineCode == "1001" && x.PlanCode == planInfo.TaskCode);
int sumSidePanelAmount = sidePanelComplates.Sum(x => x.OutPutAmount);
List backPanelComplates = _backPanelComplateServices.Query(x => x.ProductlineCode == "1001" && x.PlanCode == planInfo.TaskCode);
int sumBackPanelAmount = backPanelComplates.Sum(x => x.OutPutAmount);
Console.WriteLine($"当前计划:{planInfo.TaskCode};计划产量:{planInfo.PlanAmount};前板完成:{sumSidePanelAmount};背板完成:{sumBackPanelAmount}");
RefreshExecInfoEvent?.Invoke($"当前计划:{planInfo.TaskCode};计划产量:{planInfo.PlanAmount};前板完成:{sumSidePanelAmount};背板完成:{sumBackPanelAmount}", "White");
int sumAmount = 0;
if (planInfo.PlanType == 1)
{
if (planInfo.PlanAmount == sumSidePanelAmount)
{
if (sumSidePanelAmount == sumBackPanelAmount && sumSidePanelAmount != 0 && sumBackPanelAmount != 0)
{
sumAmount = sumSidePanelAmount;
planInfo.ExecuteStatus = 3;
}
if (sumSidePanelAmount < sumBackPanelAmount && sumBackPanelAmount == planInfo.PlanAmount)
{
sumAmount = sumSidePanelAmount;
}
if (sumSidePanelAmount > sumBackPanelAmount && sumSidePanelAmount == planInfo.PlanAmount)
{
sumAmount = sumBackPanelAmount;
}
if (sumSidePanelAmount == 0 && sumBackPanelAmount == 0) sumAmount = 0;
isComplate = false;
}
else
{
if (sumSidePanelAmount < sumBackPanelAmount && sumBackPanelAmount == planInfo.PlanAmount)
{
sumAmount = sumSidePanelAmount;
}
if (sumSidePanelAmount > sumBackPanelAmount && sumSidePanelAmount == planInfo.PlanAmount)
{
sumAmount = sumBackPanelAmount;
}
if (sumSidePanelAmount == 0 && sumBackPanelAmount == 0) sumAmount = 0;
}
}
if (planInfo.PlanType == 2)
{
sumAmount = sumSidePanelAmount;
if (planInfo.PlanAmount - sumAmount == 0)
{
planInfo.ExecuteStatus = 3;
isComplate = false;
}
planInfo.CompleteAmount = sumAmount;
}
planInfo.CompleteAmount = sumAmount;
var obj = _executePlanInfoServices.FirstAsync(d => d.ObjId == planInfo.ObjId).Result;
obj.CompleteAmount = planInfo.CompleteAmount;
obj.ExecuteStatus = planInfo.ExecuteStatus;
bool result = _executePlanInfoServices.UpdateExecutePlanInfo(obj).Result;
if (result)
{
//更新前端展示图表
//RefreshCreatePlanInfoEvent?.Invoke();//更新界面
RefreshChatEvent?.Invoke();//刷新图表
//SheetMetaSendPlanInfoView planInfo = planInfoList.FirstOrDefault(d => d.TaskCode == planCode);
RefreshPlanInfoEvent?.Invoke(planInfo);//刷新计划执行
}
Thread.Sleep(5000);
}
catch (Exception ex)
{
Console.WriteLine($"计划任务信息更新异常:{ex.Message}");
RefreshExecInfoEvent?.Invoke($"计划任务信息更新异常:{ex.Message}", "Red");
}
} while (isComplate);
if (!isComplate)
{
//更新前端展示图表
//RefreshCreatePlanInfoEvent?.Invoke();//更新界面
RefreshChatEvent?.Invoke();//刷新图表
//SheetMetaSendPlanInfoView planInfo = planInfoList.FirstOrDefault(d => d.TaskCode == planCode);
RefreshPlanInfoEvent?.Invoke(planInfo);//刷新计划执行
}
}
}
#endregion
#region 下发单个计划逻辑
///
/// 初始化下发生产计划,获取已拆分的计划进行下发
///
public void InitSendPlan()
{
Thread.Sleep(5000);
var obj_sidePanel = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("SidePanelPlc"));
var obj_backPanel = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("BackPanelPLC"));
while (true)
{
var planInfos = _executePlanInfoServices.Query(d => d.ProductLineCode.Equals("1001") && d.ExecuteStatus == 1 || d.ExecuteStatus == 2);
if (planInfos != null)
{
if (planInfos.Count > 0)
{
ExecutePlanInfo planInfo = planInfos.First();
if (planInfo.PlanType == 1) //联合下发
{
SendPlanTask(planInfo, obj_sidePanel, obj_backPanel);
UpdatePlanTaskByComplate(planInfo);
}
else if (planInfo.PlanType == 2)
{
SendPlanTask_SidePanel(planInfo, obj_sidePanel);
UpdatePlanTaskByComplate(planInfo);
}
else if (planInfo.PlanType == 3)
{
SendPlanTaskTo_BackPanel(planInfo, obj_backPanel);
UpdatePlanTaskByComplate(planInfo);
}
}
else
{
Console.WriteLine("未获取到需要下发的任务");
}
}
Thread.Sleep(3000);
}
}
///
/// 根据完成记录更新生产计划
///
///
private void UpdatePlanTaskByComplate(ExecutePlanInfo planInfo)
{
try
{
lock (string.Empty)
{
bool isComplate = true;
do
{
//等待计划执行完成
List sidePanelComplates = _sidePanelComplateServices.Query(x => x.ProductlineCode == "1001" && x.PlanCode == planInfo.TaskCode);
int sumSidePanelAmount = sidePanelComplates.Sum(x => x.OutPutAmount);
List backPanelComplates = _backPanelComplateServices.Query(x => x.ProductlineCode == "1001" && x.PlanCode == planInfo.TaskCode);
int sumBackPanelAmount = backPanelComplates.Sum(x => x.OutPutAmount);
Console.WriteLine($"当前计划:{planInfo.TaskCode};计划产量:{planInfo.PlanAmount};前板完成:{sumSidePanelAmount};背板完成:{sumBackPanelAmount}");
RefreshExecInfoEvent?.Invoke($"当前计划:{planInfo.TaskCode};计划产量:{planInfo.PlanAmount};前板完成:{sumSidePanelAmount};背板完成:{sumBackPanelAmount}", "White");
int sumAmount = 0;
if (planInfo.PlanType == 1)
{
if (sumSidePanelAmount >= sumBackPanelAmount)
{
sumAmount = sumBackPanelAmount;
}
else
{
sumAmount = sumSidePanelAmount;
}
}
else if (planInfo.PlanType == 2)
{
sumAmount = sumSidePanelAmount;
}
else
{
sumAmount = sumBackPanelAmount;
}
if (planInfo.PlanAmount - sumAmount == 0)
{
planInfo.ExecuteStatus = 3;
isComplate = false;
}
planInfo.CompleteAmount = sumAmount;
bool result = _executePlanInfoServices.UpdateExecutePlanInfo(planInfo).Result;
if (result)
{
//更新前端展示图表
RefreshCreatePlanInfoEvent?.Invoke();//更新界面
RefreshChatEvent?.Invoke();//刷新图表
}
Thread.Sleep(5000);
} while (isComplate);
}
}
catch (Exception ex)
{
Console.WriteLine($"计划任务信息更新异常:{ex.Message}");
RefreshExecInfoEvent?.Invoke($"计划任务信息更新异常:{ex.Message}", "Red");
}
}
///
/// 联合下发
///
///
///
///
private void SendPlanTask(ExecutePlanInfo planInfo, PlcModel obj_sidePanel, PlcModel obj_backPanel)
{
try
{
//前板
Task.Run(() =>
{
if (obj_sidePanel != null)
{
//计划编号10个字:D6000-D6009、物料编号10个字:D6010-D6019、计划数量1个字:D6020、应答字1个字D6021
obj_sidePanel.plc.WriteString("D6000", planInfo.TaskCode);
string processNumber = GetProcessNumberBy(planInfo.MaterialCode);
obj_sidePanel.plc.WriteString("D6010", planInfo.MaterialSpecificatons);
obj_sidePanel.plc.WriteInt32("D6020", planInfo.PlanAmount);
obj_sidePanel.plc.WriteInt32("D6021", 1);
Console.WriteLine($"{DateTime.Now.ToString("HH:m:s")}===>等待前板设备应答。。。。。。");
RefreshExecInfoEvent?.Invoke("等待前板设备应答......", "Red");
//下发完成后读取PLC应答,应答后复位应答信号
#region PLC反馈信号逻辑处理
//循环读取PLC应答信号,PLC应答后复位应答信号、更新计划状态为执行中
bool isFlag = true;
do
{
//开始做计划的时候给我
if (obj_sidePanel.plc.ReadInt32("D6021") == 2)
{
obj_sidePanel.plc.WriteInt32("D6021", 0);
Console.WriteLine($"{DateTime.Now.ToString("HH:m:s")}===>收到前板设备应答信号,复位应答地址");
RefreshExecInfoEvent?.Invoke("收到前板设备应答信号,复位应答地址", "White");
isFlag = false;
}
Thread.Sleep(2000);
} while (isFlag);
//更新计划状态为2执行中
planInfo.ExecuteStatus = 2;
bool result = _executePlanInfoServices.UpdateExecutePlanInfo(planInfo).Result;
if (result)
{
//更新前端展示图表
RefreshCreatePlanInfoEvent?.Invoke();//更新界面
RefreshChatEvent?.Invoke();//刷新图表
}
#endregion
//读取设备进度,完成后再次下发新任务
ReadDeviceComplate_SidePanel(obj_sidePanel);
if (!isFlag)
{
//更新前端展示图表
RefreshCreatePlanInfoEvent?.Invoke();//更新界面
RefreshChatEvent?.Invoke();//刷新图表
}
}
});
//背板
Task.Run(() =>
{
if (obj_backPanel != null)
{
//计划编号10个字:D6000-D6009、物料编号10个字:D6010-D6019、计划数量1个字:D6020、应答字1个字D6021
obj_backPanel.plc.WriteString("D4000", planInfo.TaskCode);
string processNumber = GetProcessNumberBy(planInfo.MaterialCode);
obj_backPanel.plc.WriteString("D4010", "BCD/310NF");
obj_backPanel.plc.WriteInt32("D4020", planInfo.PlanAmount);
obj_backPanel.plc.WriteInt32("D4021", 1);
Console.WriteLine($"{DateTime.Now.ToString("HH:m:s")}===>等待背板设备应答。。。。。。");
RefreshExecInfoEvent?.Invoke($"等待背板设备应答。。。。。。", "White");
#region PLC反馈信号逻辑处理
//循环读取PLC应答信号,PLC应答后复位应答信号、更新计划状态为执行中
bool isFlag = true;
do
{
if (obj_backPanel.plc.ReadInt32("D4021") == 2)
{
obj_backPanel.plc.WriteInt32("D4021", 0);
Console.WriteLine($"{DateTime.Now.ToString("HH:m:s")}===>收到背板板设备应答信号,复位应答地址");
RefreshExecInfoEvent?.Invoke("收到背板板设备应答信号,复位应答地址", "White");
isFlag = false;
}
Thread.Sleep(2000);
} while (isFlag);
//更新计划状态为2执行中
planInfo.ExecuteStatus = 2;
bool result = _executePlanInfoServices.UpdateExecutePlanInfo(planInfo).Result;
if (result)
{
//更新前端展示图表
RefreshCreatePlanInfoEvent?.Invoke();//更新界面
RefreshChatEvent?.Invoke();//刷新图表
}
#endregion
//读取设备进度,完成后再次下发新任务
ReadDeviceComplate_BackPanel(obj_backPanel);
if (!isFlag)
{
//更新前端展示图表
RefreshCreatePlanInfoEvent?.Invoke();//更新界面
RefreshChatEvent?.Invoke();//刷新图表
}
}
});
}
catch (Exception ex)
{
Console.WriteLine($"前板⽣产计划下发异常:{ex.Message}");
RefreshExecInfoEvent?.Invoke($"前板⽣产计划下发异常:{ex.Message}", "Red");
}
}
///
/// 下发前板生产计划
///
///
///
public void SendPlanTask_SidePanel(ExecutePlanInfo planInfo, PlcModel obj_sidePanel)
{
try
{
Task.Run(() =>
{
if (obj_sidePanel != null)
{
//计划编号10个字:D6000-D6009、物料编号10个字:D6010-D6019、计划数量1个字:D6020、应答字1个字D6021
obj_sidePanel.plc.WriteString("D6000", planInfo.TaskCode);
string processNumber = GetProcessNumberBy(planInfo.MaterialCode);
obj_sidePanel.plc.WriteString("D6010", planInfo.MaterialSpecificatons);
obj_sidePanel.plc.WriteInt32("D6020", planInfo.PlanAmount);
obj_sidePanel.plc.WriteInt32("D6021", 1);
Console.WriteLine($"{DateTime.Now.ToString("HH:m:s")}===>等待前板设备应答。。。。。。");
RefreshExecInfoEvent?.Invoke("等待前板设备应答......", "White");
//下发完成后读取PLC应答,应答后复位应答信号
#region PLC反馈信号逻辑处理
//循环读取PLC应答信号,PLC应答后复位应答信号、更新计划状态为执行中
bool isFlag = true;
do
{
if (obj_sidePanel.plc.ReadInt32("D6021") == 2)
{
obj_sidePanel.plc.WriteInt32("D6021", 0);
Console.WriteLine($"{DateTime.Now.ToString("HH:m:s")}===>收到前板设备应答信号,复位应答地址");
RefreshExecInfoEvent?.Invoke("收到前板设备应答信号......", "White");
isFlag = false;
}
Thread.Sleep(2000);
} while (isFlag);
//更新计划状态为2执行中
planInfo.ExecuteStatus = 2;
bool result = _executePlanInfoServices.UpdateExecutePlanInfo(planInfo).Result;
if (result)
{
//更新前端展示图表
RefreshCreatePlanInfoEvent?.Invoke();//更新界面
RefreshChatEvent?.Invoke();//刷新图表
RefreshCurrentPlanInfoEvent?.Invoke();
}
#endregion
//读取设备进度,完成后再次下发新任务
ReadDeviceComplate_SidePanel(obj_sidePanel);
if (!isFlag)
{
//更新前端展示图表
RefreshCreatePlanInfoEvent?.Invoke();//更新界面
RefreshChatEvent?.Invoke();//刷新图表
}
}
});
}
catch (Exception ex)
{
Console.WriteLine($"前板⽣产计划下发异常:{ex.Message}");
RefreshExecInfoEvent?.Invoke($"前板⽣产计划下发异常:{ex.Message}", "Red");
}
}
///
/// 读取前板生产数据
///
///
public async void ReadDeviceComplate_SidePanel(PlcModel obj)
{
bool isFlag = true;
do
{
try
{
//D6030
//计划编号:D6030-D6039,物料编号:D6040-D6049,计划完成数:D6050,计划下线数:D6051,设备状态:D6052-D6056,生产节拍:D6057-D6058
byte[] info = obj.plc.Read("D6030", 59);
if (info == null)
{
Thread.Sleep(1000);
continue;
}
//计划编号
string planCode = Encoding.ASCII.GetString(info.Skip(0).Take(20).ToArray());
//物料编号
string materialCode = Encoding.ASCII.GetString(info.Skip(20).Take(20).ToArray());
//完成数量
int complateAmount = short.Parse(bytesToHexStr(info.Skip(40).Take(1).ToArray(), 1), System.Globalization.NumberStyles.HexNumber);
//下线数量
int offLineAmount = short.Parse(bytesToHexStr(info.Skip(41).Take(2).ToArray(), 2), System.Globalization.NumberStyles.HexNumber);
//设备状态
int deviceStatus = short.Parse(bytesToHexStr(info.Skip(43).Take(2).ToArray(), 2), System.Globalization.NumberStyles.HexNumber);
//生产节拍
int productionBeat = short.Parse(bytesToHexStr(info.Skip(51).Take(4).ToArray(), 4), System.Globalization.NumberStyles.HexNumber);
Console.WriteLine($"前板设备数据读取====>>>>当前计划:{planCode},物料编号:{materialCode},完成数量:{complateAmount},下线数量:{offLineAmount},设备状态:{deviceStatus},生产节拍:{productionBeat}");
RefreshExecInfoEvent?.Invoke($"前板设备数据读取====>>>>当前计划:{planCode},物料编号:{materialCode},完成数量:{complateAmount},下线数量:{offLineAmount},设备状态:{deviceStatus},生产节拍:{productionBeat}", "White");
//添加完工记录
RecordSidePanelComplate sidePanelComplate = new RecordSidePanelComplate()
{
ProductlineCode = "1001",
PlanCode = planCode.Substring(0, 16),
//MaterialCode = string.IsNullOrEmpty(materialCode) ? "" : materialCode,
MaterialCode = materialCode.Replace("\0", "").Trim(),//"BCD/310NF",
CompleteAmount = complateAmount,
OffLineAmount = offLineAmount,
DeviceStatus = deviceStatus,
ProductionBeat = productionBeat,
RecordTime = DateTime.Now,
IsFlag = 1
};
if (string.IsNullOrEmpty(planCode))
{
Thread.Sleep(5000);
continue;
}
//先查询该计划编号下的前一条完工记录,如果不存在本条记录产量为0
List sidePanelComplates = _sidePanelComplateServices.Query(x => x.ProductlineCode == "1001" && x.PlanCode == planCode.Substring(0, 16));
int lastComplateAmount = 0; //前一条完成记录的计划完成数量
int sumComplateAmount = 0; //当前计划总产量
if (sidePanelComplates != null)
{
if (sidePanelComplates.Count > 0)
{
sidePanelComplates = sidePanelComplates.OrderByDescending(x => x.RecordTime).ToList();
lastComplateAmount = sidePanelComplates.First().CompleteAmount;
sidePanelComplate.OutPutAmount = complateAmount - lastComplateAmount;
sumComplateAmount = sidePanelComplates.Sum(x => x.OutPutAmount) + sidePanelComplate.OutPutAmount;
if (sidePanelComplate.OutPutAmount == 0)
{
Thread.Sleep(5000);
continue;
}
else
{
List planInfos = _executePlanInfoServices.Query(x => x.TaskCode.Equals(planCode.Substring(0, 16)) && x.ExecuteStatus == 2);
if (planInfos != null)
{
if (planInfos.Count > 0)
{
ExecutePlanInfo planInfo = planInfos.First();
if (planInfo != null)
{
if (planInfo.PlanAmount - sumComplateAmount == 0)
{
isFlag = false;
Console.WriteLine($"前板计划执行完成,计划数量:{planInfo.PlanAmount};实际产量:{sumComplateAmount};差异值:{planInfo.PlanAmount - sumComplateAmount}");
RefreshExecInfoEvent?.Invoke($"前板计划执行完成,计划数量:{planInfo.PlanAmount};实际产量:{sumComplateAmount};差异值:{planInfo.PlanAmount - sumComplateAmount}", "White");
}
}
}
}
}
}
}
_sidePanelComplateServices.InsertSidePanelCimplate(sidePanelComplate);
if (complateAmount != lastComplateAmount)
{
//更新前端展示图表
RefreshCreatePlanInfoEvent?.Invoke();//更新界面
RefreshChatEvent?.Invoke();//刷新图表
RefreshCreatePlanInfoEvent?.Invoke();
var planInfoList = await _executePlanInfoServices.QuerySheetMetalSendPlanData("1001");
if (planInfoList != null && planInfoList.Count != 0)
{
SheetMetaSendPlanInfoView planInfo = planInfoList.FirstOrDefault(d => d.TaskCode == planCode.Replace("\0", "").Trim());
RefreshPlanInfoEvent?.Invoke(planInfo);//刷新计划执行
}
}
Thread.Sleep(5000);
}
catch (Exception e)
{
Console.WriteLine($"读取前板设备完成数据异常:{e.Message}");
RefreshExecInfoEvent?.Invoke($"读取前板设备完成数据异常:{e.Message}", "Red");
}
} while (isFlag);
if (!isFlag)
{
//更新前端展示图表
RefreshCreatePlanInfoEvent?.Invoke();//更新界面
RefreshChatEvent?.Invoke();//刷新图表
}
}
///
/// 下发背板生产计划
///
///
///
public void SendPlanTaskTo_BackPanel(ExecutePlanInfo planInfo, PlcModel obj_backPanel)
{
try
{
Task.Run(() =>
{
if (obj_backPanel != null)
{
//计划编号10个字:D6000-D6009、物料编号10个字:D6010-D6019、计划数量1个字:D6020、应答字1个字D6021
obj_backPanel.plc.WriteString("D4000", planInfo.TaskCode);
string processNumber = GetProcessNumberBy(planInfo.MaterialCode);
obj_backPanel.plc.WriteString("D4010", planInfo.MaterialSpecificatons);
obj_backPanel.plc.WriteInt32("D4020", planInfo.PlanAmount);
obj_backPanel.plc.WriteInt32("D4021", 1);
Console.WriteLine($"{DateTime.Now.ToString("HH:m:s")}===>等待背板设备应答。。。。。。");
RefreshExecInfoEvent?.Invoke($"等待背板设备应答。。。。。。", "White");
#region PLC反馈信号逻辑处理
//循环读取PLC应答信号,PLC应答后复位应答信号、更新计划状态为执行中
bool isFlag = true;
do
{
if (obj_backPanel.plc.ReadInt32("D4021") == 2)
{
obj_backPanel.plc.WriteInt32("D4021", 0);
Console.WriteLine($"{DateTime.Now.ToString("HH:m:s")}===>收到背板板设备应答信号,复位应答地址");
RefreshExecInfoEvent?.Invoke($"收到背板板设备应答信号,复位应答地址", "White");
isFlag = false;
}
Thread.Sleep(2000);
} while (isFlag);
//更新计划状态为2执行中
planInfo.ExecuteStatus = 2;
bool result = _executePlanInfoServices.UpdateExecutePlanInfo(planInfo).Result;
if (result)
{
//更新前端展示图表
RefreshCreatePlanInfoEvent?.Invoke();//更新界面
RefreshChatEvent?.Invoke();//刷新图表
}
#endregion
//读取设备进度,完成后再次下发新任务
ReadDeviceComplate_BackPanel(obj_backPanel);
if (!isFlag)
{
//更新前端展示图表
RefreshCreatePlanInfoEvent?.Invoke();//更新界面
RefreshChatEvent?.Invoke();//刷新图表
}
}
});
}
catch (Exception ex)
{
Console.WriteLine($"读取前板设备完成数据异常:{ex.Message}");
RefreshExecInfoEvent?.Invoke($"背板⽣产计划下发异常:{ex.Message}", "Red");
}
}
///
/// 读取背板生产数据
///
///
public void ReadDeviceComplate_BackPanel(PlcModel obj)
{
bool isFlag = true;
try
{
do
{
//计划编号:D6030-D6039,物料编号:D6040-D6049,计划完成数:D6050,计划下线数:D6051,设备状态:D6052-D6056,生产节拍:D6057-D6058
byte[] info = obj.plc.Read("D4030", 59);
if (info == null)
{
Thread.Sleep(1000);
continue;
}
//计划编号
string planCode = Encoding.ASCII.GetString(info.Skip(0).Take(20).ToArray()).Replace("\0", "").Trim();
//物料编号
string materialCode = Encoding.ASCII.GetString(info.Skip(20).Take(20).ToArray()).Replace("\0", "").Trim();
//完成数量
int complateAmount = short.Parse(bytesToHexStr(info.Skip(40).Take(1).ToArray(), 1), System.Globalization.NumberStyles.HexNumber);
//下线数量
int offLineAmount = short.Parse(bytesToHexStr(info.Skip(41).Take(2).ToArray(), 2), System.Globalization.NumberStyles.HexNumber);
//设备状态
int deviceStatus = short.Parse(bytesToHexStr(info.Skip(43).Take(2).ToArray(), 2), System.Globalization.NumberStyles.HexNumber);
//生产节拍
int productionBeat = short.Parse(bytesToHexStr(info.Skip(51).Take(4).ToArray(), 4), System.Globalization.NumberStyles.HexNumber);
Console.WriteLine($"背板设备数据读取====>>>>当前计划:{planCode},物料编号:{materialCode},完成数量:{complateAmount},下线数量:{offLineAmount},设备状态:{deviceStatus},生产节拍:{productionBeat}");
RefreshExecInfoEvent?.Invoke($"当前计划:{planCode},物料编号:{materialCode},完成数量:{complateAmount},下线数量:{offLineAmount},设备状态:{deviceStatus},生产节拍:{productionBeat}", "White");
//添加完工记录
RecordBackPanelComplate backPanelComplate = new RecordBackPanelComplate()
{
ProductlineCode = "1001",
PlanCode = planCode.Replace("\0", "").Trim(),
MaterialCode = string.IsNullOrEmpty(materialCode) ? "" : materialCode.Replace("\0", "").Trim(),
//MaterialCode = materialCode.Replace("\0", "").Trim(),//"BCD/310NF",
CompleteAmount = complateAmount,
OffLineAmount = offLineAmount,
DeviceStatus = deviceStatus,
ProductionBeat = productionBeat,
RecordTime = DateTime.Now,
IsFlag = 1
};
if (string.IsNullOrEmpty(planCode))
{
Thread.Sleep(5000);
continue;
}
//先查询该计划编号下的前一条完工记录,如果不存在本条记录产量为0
List backPanelComplates = _backPanelComplateServices.Query(x => x.ProductlineCode == "1001" && x.PlanCode == planCode.Substring(0, 16));
int lastComplateAmount = 0; //前一条完成记录的计划完成数量
int sumComplateAmount = 0; //当前计划总产量
if (backPanelComplates != null)
{
if (backPanelComplates.Count > 0)
{
backPanelComplates = backPanelComplates.OrderByDescending(x => x.RecordTime).ToList();
lastComplateAmount = backPanelComplates.First().CompleteAmount;
backPanelComplate.OutPutAmount = complateAmount - lastComplateAmount;
sumComplateAmount = backPanelComplates.Sum(x => x.OutPutAmount) + backPanelComplate.OutPutAmount;
if (backPanelComplate.OutPutAmount == 0)
{
Thread.Sleep(5000);
continue;
}
else
{
List planInfos = _executePlanInfoServices.Query(x => x.TaskCode == planCode && x.ExecuteStatus == 2);
if (planInfos != null)
{
if (planInfos.Count > 0)
{
ExecutePlanInfo planInfo = planInfos.First();
if (planInfo != null)
{
if (planInfo.PlanAmount - sumComplateAmount == 0)
{
isFlag = false;
Console.WriteLine($"背板计划执行完成,计划数量:{planInfo.PlanAmount};实际产量:{sumComplateAmount};差异值:{planInfo.PlanAmount - sumComplateAmount}");
RefreshExecInfoEvent?.Invoke($"背板计划执行完成,计划数量:{planInfo.PlanAmount};实际产量:{sumComplateAmount};差异值:{planInfo.PlanAmount - sumComplateAmount}", "White");
}
}
}
}
}
}
}
_backPanelComplateServices.InsertBackPanelCimplate(backPanelComplate);
if (complateAmount != lastComplateAmount)
{
//更新前端展示图表
RefreshCreatePlanInfoEvent?.Invoke();//更新界面
RefreshChatEvent?.Invoke();//刷新图表
}
Thread.Sleep(5000);
} while (isFlag);
if (!isFlag)
{
//更新前端展示图表
RefreshCreatePlanInfoEvent?.Invoke();//更新界面
RefreshChatEvent?.Invoke();//刷新图表
}
}
catch (Exception e)
{
Console.WriteLine($"读取背板设备完成数据异常:{e.Message}");
RefreshExecInfoEvent?.Invoke($"背板⽣产计划下发异常:{e.Message}", "Red");
}
}
///
/// 通过物料编号获取工艺编号
///
///
///
private string GetProcessNumberBy(string materialCode)
{
return System.Guid.NewGuid().ToString("N").Substring(0, 20);
}
public static string bytesToHexStr(byte[] bytes, int iLen)//e.g. { 0x01, 0x01} ---> " 01 01"
{
string returnStr = "";
if (bytes != null)
{
for (int i = 0; i < iLen; i++)
{
returnStr += bytes[i].ToString("X2");
}
}
return returnStr;
}
#endregion
#region 更新计划列表数量
///
/// 更新计划列表数量
///
public void UpdateComplatePlan()
{
string stationCode = Appsettings.app("StationInfo", "StationCode");
string productLineCode = Appsettings.app("StationInfo", "ProductLineCode");
List pPlanInfoList = new List();
while (true)
{
var planInfoList = _executePlanInfoServices.QueryAsync(d => d.ProductLineCode.Contains(stationCode)).Result;
if (planInfoList == null || planInfoList.Count == 0) continue;
var list = from d in planInfoList
select new
{
d.OrderCode,
d.CompleteAmount
};
var grouplist = (from d in list
group d by d.OrderCode into g
select new
{
OrderCode = g.Key,
CompleteAmount = g.Sum(d => d.CompleteAmount)
}).OrderBy(t => t.OrderCode).ToList();
var productPlanInfoList = _productPlanInfoServices.QueryAsync(d => d.ProductLineCode.Contains(stationCode) && d.CompleteAmount != d.PlanAmount).Result;
productPlanInfoList.ForEach(async t =>
{
var materialCompletionList = _materialCompletionServices.QueryAsync(d => d.ProductLineCode.Contains(productLineCode) && d.StationName.Equals(stationCode)).Result;
var obj = grouplist.FirstOrDefault(d => d.OrderCode.Equals(t.OrderCode));
if (obj != null)
{
ProductPlanInfo productPlanInfo = new ProductPlanInfo();
if (obj.CompleteAmount == 1 && t.CompleteAmount == 0)
{
productPlanInfo.EndTime = DateTime.Now;
_sysUserInfoServices.UpdateSapPlan(obj.OrderCode);//第一次执行更新日历表
}
if (t.PlanAmount == obj.CompleteAmount)
{
productPlanInfo.CompleteAmount = obj.CompleteAmount;
productPlanInfo.EndTime = DateTime.Now;
}
if (t.PlanAmount > obj.CompleteAmount)
{
productPlanInfo.CompleteAmount = obj.CompleteAmount;
}
else
{
productPlanInfo.CompleteAmount = t.PlanAmount;
}
int completeNum = materialCompletionList.Count();//过点完成数量
if ((obj.CompleteAmount - completeNum) > 0)
{
MaterialCompletion materialCompletion = new MaterialCompletion();
materialCompletion.OrderCode = t.OrderCode;
materialCompletion.ProductLineCode = productLineCode;
materialCompletion.MaterialCode = t.MaterialCode;
materialCompletion.MaterialName = t.MaterialName;
materialCompletion.StationName = stationCode;
materialCompletion.CompleteDate = DateTime.Now;
materialCompletion.planCode = t.PlanCode;
await _materialCompletionServices.AddAsync(materialCompletion);
}
}
});
if (pPlanInfoList.Count != 0 && pPlanInfoList != null)
{
_productPlanInfoServices.UpdateAsync(pPlanInfoList);
}
Thread.Sleep(3000);
}
}
#endregion
#endregion
#region 同步钣金设置型号
///
/// 获取所有设置的钣金前板型号
///
///
public async Task QuerySidePanelMode()
{
while (true)
{
Thread.Sleep(50000);
obj_sidePanel = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("SidePanelPlc"));
if (obj_sidePanel == null) { continue; }
if (obj_sidePanel.plc.IsConnected)
{
Console.WriteLine("===============采集前板开始===============");
byte[] info = obj_sidePanel.plc.Read("D7000", 3000);
if (info == null)
{
Thread.Sleep(1000);
continue;
}
int j = 1;
string mode = string.Empty;
List addList = new List();
List updateList = new List();
var smSyncModelList = _smSyncModelServices.QueryAsync(d=>d.Category=="0").Result;
for (int i = 1; i <= 600; i++)
{
if (i % 2 == 0)
{
//设置型号
mode = Encoding.ASCII.GetString(info.Skip(i * 10).Take(10).ToArray()).Replace("\0", "").Trim();
if (smSyncModelList.Count == 0 || smSyncModelList == null)
{
SmSyncModel sm = new SmSyncModel();
sm.SmProductId = j.ToString();
sm.SmModel = mode.Trim();
sm.SyncTime = DateTime.Now;
sm.CreateTime = DateTime.Now;
sm.Category = "0";
addList.Add(sm);
}
else
{
var obj = smSyncModelList.First(d => d.SmProductId == j.ToString());
if (obj == null)
{
SmSyncModel sm = new SmSyncModel();
sm.SmProductId = j.ToString();
sm.SmModel = mode.Trim();
sm.SyncTime = DateTime.Now;
sm.Category = "0";
addList.Add(sm);
}
else
{
if (string.IsNullOrEmpty(obj.SmModel) && string.IsNullOrEmpty(mode)) continue;
if (string.IsNullOrEmpty(obj.SmModel) && !string.IsNullOrEmpty(mode))
{
obj.SmProductId = j.ToString();
obj.SmModel = mode.Trim();
obj.SyncTime = DateTime.Now;
obj.Category = "0";
updateList.Add(obj);
}
if (!string.IsNullOrEmpty(obj.SmModel) && !string.IsNullOrEmpty(mode) && obj.SmModel!= mode)
{
obj.SmProductId = j.ToString();
obj.SmModel = mode.Trim();
obj.SyncTime = DateTime.Now;
obj.Category = "0";
updateList.Add(obj);
}
}
}
j++;
}
}
if (addList != null && addList.Count > 0) await _smSyncModelServices.AddAsync(addList);
if (updateList != null&&updateList.Count > 0) await _smSyncModelServices.UpdateAsync(updateList);
Console.WriteLine("===============采集结束===============");
}
}
}
///
/// 获取所有设置的钣金前板型号
///
///
public async Task QueryBackPanelMode()
{
while (true)
{
Thread.Sleep(5000);
obj_backPanel = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("BackPanelPLC"));
if (obj_backPanel == null) { continue; }
if (obj_backPanel.plc.IsConnected)
{
Console.WriteLine("===============采集后板开始===============");
byte[] info = obj_backPanel.plc.Read("D7000", 3000);
if (info == null)
{
Thread.Sleep(1000);
continue;
}
int j = 1;
string mode = string.Empty;
List addList = new List();
List updateList = new List();
var smSyncModelList = _smSyncModelServices.QueryAsync(d=>d.Category=="1").Result;
for (int i = 1; i <= 600; i++)
{
if (i % 2 == 0)
{
//设置型号
mode = Encoding.ASCII.GetString(info.Skip(i * 10).Take(10).ToArray()).Replace("\0", "").Trim();
if (smSyncModelList.Count == 0 || smSyncModelList == null)
{
SmSyncModel sm = new SmSyncModel();
sm.SmProductId = j.ToString();
sm.SmModel = mode.Trim();
sm.SyncTime = DateTime.Now;
sm.CreateTime = DateTime.Now;
sm.Category = "1";
addList.Add(sm);
}
else
{
var obj = smSyncModelList.First(d => d.SmProductId == j.ToString());
if (obj == null)
{
SmSyncModel sm = new SmSyncModel();
sm.SmProductId = j.ToString();
sm.SmModel = mode.Trim();
sm.SyncTime = DateTime.Now;
sm.Category = "1";
addList.Add(sm);
}
else
{
if (string.IsNullOrEmpty(obj.SmModel) && string.IsNullOrEmpty(mode)) continue;
if (string.IsNullOrEmpty(obj.SmModel) && !string.IsNullOrEmpty(mode))
{
obj.SmProductId = j.ToString();
obj.SmModel = mode.Trim();
obj.SyncTime = DateTime.Now;
obj.Category = "1";
updateList.Add(obj);
}
if (!string.IsNullOrEmpty(obj.SmModel) && !string.IsNullOrEmpty(mode) && obj.SmModel != mode)
{
obj.SmProductId = j.ToString();
obj.SmModel = mode.Trim();
obj.SyncTime = DateTime.Now;
obj.Category = "1";
updateList.Add(obj);
}
}
}
j++;
}
}
if (addList != null && addList.Count > 0) await _smSyncModelServices.AddAsync(addList);
if (updateList != null && updateList.Count > 0) await _smSyncModelServices.UpdateAsync(updateList);
Console.WriteLine("===============采集结束===============");
}
}
}
#endregion
public List GetBackBinStatus(PlcModel obj_SidePanel)
{
List list = new List();
if (!obj_SidePanel.plc.IsConnected)
{
Console.WriteLine("plc为 false");
return null;
}
var startb0=obj_SidePanel.plc.ReadBool("M60");
if (startb0)
{
string productId = obj_SidePanel.plc.ReadInt16("D2002").ToString();//读取产品编码
Bin bin = new Bin();
bin.ProductId = productId;
bin.Status = startb0;
list.Add(bin);
}
var startb2 = obj_SidePanel.plc.ReadBool("M61");
if (startb2)
{
string productId = obj_SidePanel.plc.ReadInt16("D2026").ToString();
Bin bin = new Bin();
bin.ProductId = productId;
bin.Status = startb2;
list.Add(bin);
}
var startb4 = obj_SidePanel.plc.ReadBool("M62");
if (startb4)
{
string productId = obj_SidePanel.plc.ReadInt16("D2050").ToString();
Bin bin = new Bin();
bin.ProductId = productId;
bin.Status = startb4;
list.Add(bin);
}
var startb6 = obj_SidePanel.plc.ReadBool("M63");
if (startb6)
{
string productId = obj_SidePanel.plc.ReadInt16("D2075").ToString();
Bin bin = new Bin();
bin.ProductId = productId;
bin.Status = startb6;
list.Add(bin);
}
var startb7 = obj_SidePanel.plc.ReadBool("M64");
if (startb7)
{
string productId = obj_SidePanel.plc.ReadInt16("D2098").ToString();
Bin bin = new Bin();
bin.ProductId = productId;
bin.Status = startb7;
list.Add(bin);
}
var startb8 = obj_SidePanel.plc.ReadBool("M65");
if (startb8)
{
string productId = obj_SidePanel.plc.ReadInt16("D2122").ToString();
Bin bin = new Bin();
bin.ProductId = productId;
bin.Status = startb8;
list.Add(bin);
}
return list;
}
public List GetSideBinStatus(PlcModel obj_SidePanel)
{
List list = new List();
var startb0 = obj_SidePanel.plc.ReadBool("M140");
if (startb0)
{
string productId = obj_SidePanel.plc.ReadInt16("D1402").ToString();
Bin bin = new Bin();
bin.ProductId = productId;
bin.Status = startb0;
list.Add(bin);
}
var startb2 = obj_SidePanel.plc.ReadBool("M141");
if (startb0)
{
string productId = obj_SidePanel.plc.ReadInt16("D1426").ToString();
Bin bin = new Bin();
bin.ProductId = productId;
bin.Status = startb0;
list.Add(bin);
}
var startb4 = obj_SidePanel.plc.ReadBool("M142");
if (startb4)
{
string productId = obj_SidePanel.plc.ReadInt16("D1450").ToString();
Bin bin = new Bin();
bin.ProductId = productId;
bin.Status = startb4;
list.Add(bin);
}
var startb6 = obj_SidePanel.plc.ReadBool("M143");
if (startb6)
{
string productId = obj_SidePanel.plc.ReadInt16("D1474").ToString();
Bin bin = new Bin();
bin.ProductId = productId;
bin.Status = startb6;
list.Add(bin);
}
return list;
}
///
/// 前板下线数量
///
public async Task ReadSideBlanking()
{
while (true)
{
string stationCode = Appsettings.app("StationInfo", "StationCode");
string productLineCode = Appsettings.app("StationInfo", "ProductLineCode");
Thread.Sleep(5000);
obj_sidePanel = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("SidePanelPlc"));
if (obj_sidePanel.plc.IsConnected)
{
byte[] info = obj_sidePanel.plc.Read("D2100", 20);
if (info == null)
{
Thread.Sleep(1000);
continue;
}
//计划编号
string planCode = Encoding.ASCII.GetString(info.Skip(0).Take(20).ToArray()).Replace("\n","").Trim();
var offLineAmount = obj_sidePanel.plc.ReadInt16("D6051");
RefreshExecInfoEvent?.Invoke($"下线计划号:{planCode}》》》》下线数量:{offLineAmount}", "White");
Console.WriteLine($"计划号:{planCode}》》》》下线数量:{offLineAmount}");
List sidePanelComplates = _sidePanelComplateServices.Query(x => x.ProductlineCode == stationCode && x.PlanCode == planCode);
sidePanelComplates = sidePanelComplates.OrderByDescending(d=>d.RecordTime).ToList();
RecordSidePanelComplate recordSidePanelComplate = sidePanelComplates.First();
int sumSidePanelAmount = recordSidePanelComplate.OffLineAmount;
if (recordSidePanelComplate.OffLineAmount < offLineAmount)
{
//更新计划数量
ExecutePlanInfo executePlanInfo = _executePlanInfoServices.FirstAsync(x => x.TaskCode == planCode).Result;
var productPlanInfoList = _productPlanInfoServices.FirstAsync(d => d.ProductLineCode.Contains(stationCode) && d.PlanCode.Contains(executePlanInfo.ProductPlanCode)).Result;
productPlanInfoList.CompleteAmount = productPlanInfoList.CompleteAmount + (offLineAmount - recordSidePanelComplate.OffLineAmount);
await _productPlanInfoServices.UpdateAsync(productPlanInfoList);//更新计划
}
}
}
}
///
/// 后板下线数量
///
public void ReadBackBlanking()
{
while (true)
{
string stationCode = Appsettings.app("StationInfo", "StationCode");
string productLineCode = Appsettings.app("StationInfo", "ProductLineCode");
Thread.Sleep(5000);
obj_sidePanel = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("SidePanelPlc"));
if (obj_sidePanel.plc.IsConnected)
{
byte[] info = obj_sidePanel.plc.Read("D2100", 20);
if (info == null)
{
Thread.Sleep(1000);
continue;
}
//计划编号
string planCode = Encoding.ASCII.GetString(info.Skip(0).Take(20).ToArray()).Replace("\n", "").Trim();
var offLineAmount = obj_sidePanel.plc.ReadInt16("D6051");
RefreshExecInfoEvent?.Invoke($"下线计划号:{planCode}》》》》下线数量:{offLineAmount}", "White");
Console.WriteLine($"计划号:{planCode}》》》》下线数量:{offLineAmount}");
List sidePanelComplates = _sidePanelComplateServices.Query(x => x.ProductlineCode == stationCode && x.PlanCode == planCode);
sidePanelComplates = sidePanelComplates.OrderByDescending(d => d.RecordTime).ToList();
RecordSidePanelComplate recordSidePanelComplate = sidePanelComplates.First();
int sumSidePanelAmount = recordSidePanelComplate.OffLineAmount;
if (recordSidePanelComplate.OffLineAmount < offLineAmount)
{
//更新计划数量
ExecutePlanInfo executePlanInfo = _executePlanInfoServices.FirstAsync(x => x.TaskCode == planCode).Result;
var productPlanInfoList = _productPlanInfoServices.FirstAsync(d => d.ProductLineCode.Contains(stationCode) && d.PlanCode.Contains(executePlanInfo.ProductPlanCode)).Result;
productPlanInfoList.CompleteAmount = productPlanInfoList.CompleteAmount + (offLineAmount - recordSidePanelComplate.OffLineAmount);
_= _productPlanInfoServices.UpdateAsync(productPlanInfoList).Result;//更新计划
}
}
}
}
}
public class Bin
{
///
/// 料仓Id
///
public string ProductId { get; set; }
///
/// 是否启用
///
public bool Status { get; set; }
}
}