liuwf 11 months ago
parent 029695687f
commit 4bd2b6f2da

@ -3011,6 +3011,16 @@
更新时间
</summary>
</member>
<member name="P:Admin.Core.Model.ProductPlanInfo.SideCount">
<summary>
前板完成数量
</summary>
</member>
<member name="P:Admin.Core.Model.ProductPlanInfo.BackCount">
<summary>
后板完成数量
</summary>
</member>
<member name="T:Admin.Core.Model.RealTaskInfo">
<summary>
库存任务实时处理
@ -4216,6 +4226,16 @@
完成数量
</summary>
</member>
<member name="P:Admin.Core.Model.ViewModels.SheetMetaPlanInfoView.SideAmount">
<summary>
前板完成数量
</summary>
</member>
<member name="P:Admin.Core.Model.ViewModels.SheetMetaPlanInfoView.BackAmount">
<summary>
后板完成数量
</summary>
</member>
<member name="P:Admin.Core.Model.ViewModels.SheetMetaPlanInfoView.BeginTime">
<summary>
开始时间

@ -111,5 +111,16 @@ namespace Admin.Core.Model
[SugarColumn(ColumnName = "UPDATED_TIME")]
public DateTime UpdatedTime { get; set; }
/// <summary>
/// 前板完成数量
/// </summary>
[SugarColumn(ColumnName = "SIDE_COUNT")]
public int SideCount { get; set; }
/// <summary>
/// 后板完成数量
/// </summary>
[SugarColumn(ColumnName = "BACK_COUNT")]
public int BackCount { get; set; }
}
}

@ -53,6 +53,16 @@ namespace Admin.Core.Model.ViewModels
[SugarColumn(ColumnName = "COMPLETE_AMOUNT")]
public int CompleteAmount { get; set; }
/// <summary>
/// 前板完成数量
/// </summary>
[SugarColumn(ColumnName = "SIDE_COUNT")]
public int SideAmount { get; set; }
/// <summary>
/// 后板完成数量
/// </summary>
[SugarColumn(ColumnName = "BACK_COUNT")]
public int BackAmount { get; set; }
/// <summary>
/// 开始时间
/// </summary>
[SugarColumn(ColumnName = "BEGIN_TIME")]

@ -55,7 +55,7 @@ namespace Admin.Core.Repository
}
catch (Exception ex)
{
}
return result;
}
@ -98,8 +98,11 @@ namespace Admin.Core.Repository
P.PRODUCTLINE_CODE,
P.PLAN_AMOUNT,
P.COMPLETE_AMOUNT,
P.SIDE_COUNT,
P.BACK_COUNT,
P.BEGIN_TIME,
P.END_TIME
FROM C##AUCMA_MES.PRODUCT_PLANINFO P
INNER JOIN C##AUCMA_MES.BASE_ORDERINFO C ON P.ORDER_CODE = C.ORDER_CODE
INNER JOIN C##AUCMA_MES.BASE_MATERIALINFO m ON P.MATERIAL_CODE = m.MATERIAL_CODE where P.PRODUCTLINE_CODE='{stationCode}'
@ -112,6 +115,8 @@ namespace Admin.Core.Repository
P.PRODUCTLINE_CODE,
P.PLAN_AMOUNT,
P.COMPLETE_AMOUNT,
P.SIDE_COUNT,
P.BACK_COUNT,
P.BEGIN_TIME,
P.END_TIME
order by p.OBJ_ID";
@ -161,7 +166,7 @@ LEFT JOIN C##AUCMA_MES.BASE_ORDERINFO O ON E.ORDER_CODE = O.ORDER_CODE
WHERE E.PRODUCTLINE_CODE = '{stationCode}'
AND E.IS_FLAG = 0 AND E.EXECUTE_STATUS<>3
ORDER BY TABLE_SORT, EXECUTE_ORDER";
return await Db.CopyNew().SqlQueryable<SheetMetaSendPlanInfoView>(sql).ToListAsync();
}
catch { return null; }

@ -76,6 +76,14 @@ namespace Aucma.Core.SheetMetal.Models
/// </summary>
public int CompleteAmount { get; set; }
/// <summary>
/// 前板完成数量
/// </summary>
public int SideCompleteAmount { get; set; }
/// <summary>
/// 后板完成数量
/// </summary>
public int BackCompleteAmount { get; set; }
/// <summary>
/// 开始日期
/// </summary>
public DateTime StartDate { get; set; }

@ -47,6 +47,8 @@ namespace Aucma.Core.SheetMetal.ViewModels
private readonly ISysUserInfoServices _sysUserInfoServices;
private readonly IRecordInStoreServices _recordInstoreServices;
private readonly IBaseOrderInfoServices _baseOrderInfoServices;
protected readonly IProductPlanInfoServices? _productPlanInfoServices;
#endregion
#region 初始化下拉数据
@ -74,6 +76,7 @@ namespace Aucma.Core.SheetMetal.ViewModels
_stationName = Appsettings.app("StationInfo", "StationName");//工位名称
_baseOrderInfoServices = App.ServiceProvider.GetService<IBaseOrderInfoServices>();
_executePlanInfoServices = App.ServiceProvider.GetService<IExecutePlanInfoServices>();
_taskExecutionPlanInfoServices = App.ServiceProvider.GetService<IExecutePlanInfoServices>();
_recordBackPanelComplateServices = App.ServiceProvider.GetService<IRecordBackPanelComplateServices>();
_recordSidePanelComplateServices = App.ServiceProvider.GetService<IRecordSidePanelComplateServices>();

@ -44,7 +44,7 @@ namespace Aucma.Core.SheetMetal.ViewModels
_spaceDetailServices = App.ServiceProvider.GetService<IBaseSpaceDetailServices>();
_executePlanInfoServices = App.ServiceProvider.GetService<IExecutePlanInfoServices>();
_productPlanInfoServices = App.ServiceProvider.GetService<IProductPlanInfoServices>();
PlanInfo = productPlanInfo;
}
#endregion
@ -81,12 +81,32 @@ namespace Aucma.Core.SheetMetal.ViewModels
MessageBox.Show("下发数量不能大于计划数量!", "系统提醒");
return;
}
//根据传入的订单号查询 前后板完成清理,如果数量超出给出提醒
var productPlanInfo = _PlanInfo;
if (productPlanInfo != null)
{
//下传到PLC
string stationCode = Appsettings.app("StationInfo", "StationCode");
//判断联合计划数量
if (productPlanInfo.PlanType==3)
{
int maxCompleteAmount = Math.Max(productPlanInfo.SideCompleteAmount, productPlanInfo.BackCompleteAmount);
if(productPlanInfo.PlanAmount- maxCompleteAmount< Convert.ToInt32(TransmitAmount))
{
MessageBox.Show($"联合下发数量不能大于计划剩余数量{productPlanInfo.PlanAmount - maxCompleteAmount}", "系统提醒");
return;
}
}
else
{
if(productPlanInfo.PlanAmount-productPlanInfo.CompleteAmount < Convert.ToInt32(TransmitAmount))
{
MessageBox.Show($"下发数量不能大于计划剩余数量{productPlanInfo.PlanAmount - productPlanInfo.CompleteAmount}", "系统提醒");
return;
}
}
//下传到PLC
string stationCode = Appsettings.app("StationInfo", "StationCode");
var list = await _executePlanInfoServices.QueryAsync(d => d.ProductLineCode.Equals(stationCode));
ExecutePlanInfo task = new ExecutePlanInfo();

@ -42,7 +42,7 @@ namespace Aucma.Core.SheetMetal.ViewModels
#endregion
#region 加载DataGrid数据
private async Task LoadData()
public async Task LoadData()
{
try
{
@ -53,8 +53,9 @@ namespace Aucma.Core.SheetMetal.ViewModels
if (execList == null) return;
foreach (var item in execList)
{
int residue = (execList.Where(d => d.MaterialCode.Equals(item.MaterialCode))).Sum(d => d.PlanAmount);
MaterialDataGrid.Add(new ProductPlanInfoModel()
ProductPlanInfoModel mode = new ProductPlanInfoModel()
{
No = i,
PlanCode = item.PlanCode,
@ -62,12 +63,17 @@ namespace Aucma.Core.SheetMetal.ViewModels
MaterialCode = item.MaterialCode,
MaterialName = item.MaterialName,
PlanAmount = item.PlanAmount,
ResidueAmount = item.PlanAmount - item.CompleteAmount,
SpliteResidueAmount = item.PlanAmount - residue,
MaterialSpecificatons = item.MaterialSpecificatons,
CompleteAmount = item.CompleteAmount,
// if(item.SideAmount)
SideCompleteAmount = item.SideAmount,
BackCompleteAmount = item.BackAmount,
StartDate = item.BeginTime
});
};
MaterialDataGrid.Add(mode);
i++;
}

@ -6,7 +6,7 @@
xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
mc:Ignorable="d"
Background="#1152AC"
Title="计划维护" FontFamily="Microsoft YaHei" Height="800" Width="1100"
Title="计划维护" FontFamily="Microsoft YaHei" Height="800" Width="1500"
d:DesignHeight="800" WindowStartupLocation="CenterScreen"
d:DesignWidth="1500" ResizeMode="NoResize" Topmost="False" >
@ -243,8 +243,10 @@
<DataGridTextColumn Binding="{Binding OrderCode}" Header="SAP计划编号" Width="1.5*" IsReadOnly="True" ElementStyle="{StaticResource DataGridTextColumnCenterSytle}"/>
<DataGridTextColumn Binding="{Binding MaterialName}" Header="产品型号" Width="3*" IsReadOnly="True" ElementStyle="{StaticResource DataGridTextColumnCenterSytle}"/>
<DataGridTextColumn Binding="{Binding MaterialSpecificatons}" Header="产品型号" Width="*" IsReadOnly="True" ElementStyle="{StaticResource DataGridTextColumnCenterSytle}" Visibility="Collapsed"/>
<DataGridTextColumn Binding="{Binding PlanAmount}" Header="计划数量" Width="1*" IsReadOnly="True" ElementStyle="{StaticResource DataGridTextColumnCenter}"/>
<DataGridTextColumn Binding="{Binding CompleteAmount}" Header="完成数量" Width="1*" IsReadOnly="True" ElementStyle="{StaticResource DataGridTextColumnCenter}"/>
<DataGridTextColumn Binding="{Binding PlanAmount}" Header="计划数量" Width="0.8*" IsReadOnly="True" ElementStyle="{StaticResource DataGridTextColumnCenter}"/>
<DataGridTextColumn Binding="{Binding CompleteAmount}" Header="完成数量" Width="0.8*" IsReadOnly="True" ElementStyle="{StaticResource DataGridTextColumnCenter}"/>
<DataGridTextColumn Binding="{Binding SideCompleteAmount}" Header="前板完成数" Width="1*" IsReadOnly="True" ElementStyle="{StaticResource DataGridTextColumnCenter}"/>
<DataGridTextColumn Binding="{Binding BackCompleteAmount}" Header="后板完成数" Width="1*" IsReadOnly="True" ElementStyle="{StaticResource DataGridTextColumnCenter}"/>
<DataGridTextColumn Binding="{Binding StartDate,StringFormat=\{0:MM-dd HH:mm\}}" Header="开始时间" Width="1*" IsReadOnly="True" ElementStyle="{StaticResource DataGridTextColumnCenterSytle}"/>
</DataGrid.Columns>
</DataGrid>

@ -133,6 +133,7 @@
"EquipName": "SidePanelPlc",
"PlcType": "Melsec",
"Enabled": true,
// "IP": "127.0.0.1",
"IP": "10.10.91.1",
"Port": 5552
},
@ -141,7 +142,8 @@
"EquipName": "BackPanelPLC",
"PlcType": "Melsec",
"Enabled": true,
"IP":"10.10.91.6",
// "IP": "127.0.0.1",
"IP": "10.10.91.6",
"Port": 5553
}
]

@ -65,7 +65,7 @@ namespace Aucma.Core.SheetMetalTasks
protected readonly IProductPlanInfoServices _productPlanInfoServices;
protected readonly ISysUserInfoServices? _sysUserInfoServices;
protected readonly IMaterialCompletionServices? _materialCompletionServices;
protected readonly ISmSyncModelServices? _smSyncModelServices;
protected readonly ISmSyncModelServices? _smSyncModelServices;
public HwPLc.PlcModel obj_backPanel = null;
public HwPLc.PlcModel obj_sidePanel = null;
bool backFlag = true;//后板标识
@ -134,11 +134,11 @@ namespace Aucma.Core.SheetMetalTasks
#region 完成任务执行
public async Task ExecUpdateComplatePlan()
{
System.Timers.Timer timer = new System.Timers.Timer(1000);
timer.Elapsed += new System.Timers.ElapsedEventHandler(UpdateComplatePlan);
timer.AutoReset = true;
timer.Enabled = true;
timer.Start();
//System.Timers.Timer timer = new System.Timers.Timer(1000);
//timer.Elapsed += new System.Timers.ElapsedEventHandler(UpdateComplatePlan);
//timer.AutoReset = true;
//timer.Enabled = true;
//timer.Start();
await Task.CompletedTask;
}
@ -155,12 +155,12 @@ namespace Aucma.Core.SheetMetalTasks
timer.Start();
await Task.CompletedTask;
}
}
#endregion
public Task SheetMetalTasks()
{
return Task.CompletedTask;
}
@ -191,56 +191,61 @@ namespace Aucma.Core.SheetMetalTasks
Console.WriteLine($"【{DateTime.Now.ToString("HH:m:s")}】===>未获取到需要下发的前板任务");
return;
}
planInfoList = planInfoList.Where(d => d.PlanAmount > d.SidePanelAmount && (d.ExecuteStatus == 1 || d.ExecuteStatus == 2) && d.PlanType == 2).ToList();
planInfoList = planInfoList.Where(d => d.PlanAmount > d.SidePanelAmount && (d.ExecuteStatus == 1 || d.ExecuteStatus == 2)).ToList();
if (planInfoList == null || planInfoList.Count == 0) return;
planInfoList = planInfoList.Where(d => d.ExecuteStatus == 1 || d.ExecuteStatus == 2).ToList();
if (planInfoList == null || planInfoList.Count == 0) return;
var planInfos = planInfoList.Where(d => d.PlanType == 2).ToList();
//planInfoList = planInfoList.Where(d => d.ExecuteStatus == 1 || d.ExecuteStatus == 2).ToList();
//if (planInfoList == null || planInfoList.Count == 0) return;
var planInfos = planInfoList.Where(d => d.PlanType == 2 || d.PlanType == 1).ToList();
if (planInfos != null)
{
if (planInfos.Count > 0)
{
SheetMetaSendPlanInfoView planInfo = planInfos.FirstOrDefault(d => d.SidePanelAmount != d.PlanAmount);
if (planInfo == null) return;
if (planInfo.PlanType == 2)//如果类型为2,前板计划单独下发
do
{
List<Bin> binList = GetSideBinStatus(obj_sidePanel);
SmSyncModel smSyncModel = _smSyncModelServices.FirstAsync(d => d.MaterialSpecifications.Equals(planInfo.MaterialSpecificatons) && d.Category == "0").Result;
if (smSyncModel == null) return;
Bin bin = binList.SingleOrDefault(d => d.ProductId.Equals(smSyncModel.SmProductId));
if (bin == null) return;
SendPlanTaskToSidPanel(planInfo, obj_sidePanel, smSyncModel.SmProductId.ObjToInt());
SheetMetaSendPlanInfoView planInfo = planInfos.FirstOrDefault(d => d.SidePanelAmount != d.PlanAmount);
if (planInfo == null) return;
if (planInfo.PlanType == 2)//如果类型为2,前板计划单独下发
{
List<Bin> binList = GetSideBinStatus(obj_sidePanel);
//UpdateSidPanelPlanTaskByComplate(planInfo);
// sideFlag = false;
}
if (planInfo.PlanType == 1)
{
//联合下发,检测前后板是否都设置了此型号,如果没有执行下一条任务
List<Bin> backBinList = GetBackBinStatus(obj_backPanel);
List<Bin> sideBinList = GetSideBinStatus(obj_sidePanel);
if (backBinList != null && sideBinList != null)
SmSyncModel smSyncModel = _smSyncModelServices.FirstAsync(d => d.MaterialSpecifications.Equals(planInfo.MaterialSpecificatons) && d.Category == "0").Result;
if (smSyncModel == null) return;
Bin bin = binList.FirstOrDefault(d => d.ProductId.Equals(smSyncModel.SmProductId));
if (bin == null) return;
SendPlanTaskToSidPanel(planInfo, obj_sidePanel, smSyncModel.SmProductId.ObjToInt());
//UpdateSidPanelPlanTaskByComplate(planInfo);
// sideFlag = false;
}
if (planInfo.PlanType == 1)
{
SmSyncModel smSyncModel = _smSyncModelServices.FirstAsync(d => d.MaterialSpecifications.Equals(planInfo.MaterialSpecificatons) && d.Category == "2").Result;
Bin backBin = backBinList.FirstOrDefault(d => d.ProductId.Equals(smSyncModel.SmProductId));
Bin sideBin = sideBinList.FirstOrDefault(d => d.ProductId.Equals(smSyncModel.SmProductId));
if (backBin == null || sideBin == null)
//联合下发,检测前后板是否都设置了此型号,如果没有执行下一条任务
List<Bin> backBinList = GetBackBinStatus(obj_backPanel);
List<Bin> sideBinList = GetSideBinStatus(obj_sidePanel);
if (backBinList != null && sideBinList != null)
{
planInfos.Remove(planInfo);//移除list中当前的对象执行下一个计划
SmSyncModel smSyncModel = _smSyncModelServices.FirstAsync(d => d.MaterialSpecifications.Equals(planInfo.MaterialSpecificatons) && d.Category == "1").Result;
Bin backBin = backBinList.FirstOrDefault(d => d.ProductId.Equals(smSyncModel.SmProductId));
Bin sideBin = sideBinList.FirstOrDefault(d => d.ProductId.Equals(smSyncModel.SmProductId));
if (backBin == null || sideBin == null)
{
planInfos.Remove(planInfo);//移除list中当前的对象执行下一个计划
Console.WriteLine($"移除数据:{planInfo.ToJson()}");
//sideFlag = true;
}
else
{
SendPlanTaskToSidPanel(planInfo, obj_sidePanel, smSyncModel.SmProductId.ObjToInt());
//UpdateSidPanelPlanTaskByComplate(planInfo);
// sideFlag = false;
Console.WriteLine($"移除数据:{planInfo.ToJson()}");
sideFlag = true;
}
else
{
SendPlanTaskToSidPanel(planInfo, obj_sidePanel, smSyncModel.SmProductId.ObjToInt());
//UpdateSidPanelPlanTaskByComplate(planInfo);
sideFlag = false;
}
}
}
}
} while (sideFlag);
}
else
{
@ -279,35 +284,38 @@ namespace Aucma.Core.SheetMetalTasks
{
//Task.Run(() =>
//{
//循环读取PLC应答信号PLC应答后复位应答信号、更新计划状态为执行中
bool isFlag = true;
bool isTaskFlag = true;
DateTime startTime = DateTime.Now;
if (obj_sidePanel != null)
{
//判断当前是否有手动下发的任务,有退出当前方法
isTaskFlag = GetNewTask(planInfo.ObjId);
if (isTaskFlag)
{
return;
}
//计划编号10个字D6000-D6009、物料编号10个字D6010-D6019、计划数量1个字D6020、应答字1个字D6021
obj_sidePanel.plc.WriteString("D6000", planInfo.TaskCode);
obj_sidePanel.plc.WriteInt16("D6022", SmProductId.ToString());//产品号
string processNumber = GetProcessNumberBy(planInfo.MaterialCode);
obj_sidePanel.plc.WriteString("D6010", planInfo.MaterialSpecificatons);
int surplus = planInfo.PlanAmount - planInfo.SidePanelAmount;
// int surplus = planInfo.PlanAmount-planInfo.CompleteAmount;
int surplus = planInfo.PlanAmount;
obj_sidePanel.plc.WriteInt16("D6020", surplus.ToString());
Thread.Sleep(500);
obj_sidePanel.plc.WriteInt16("D6021", "1");
Console.WriteLine($"【{DateTime.Now.ToString("HH:m:s")}】===>下发机头号为:{planInfo.MaterialSpecificatons}");
Console.WriteLine($"{DateTime.Now.ToString("HH:m:s")}===>计划【{planInfo.TaskCode}】已下发,等待前板设备应答.......");
RefreshExecInfoEvent?.Invoke($"计划【{planInfo.TaskCode}】已下发,等待前板设备应答.......", "White");
#region PLC反馈信号逻辑处理
//循环读取PLC应答信号PLC应答后复位应答信号、更新计划状态为执行中
bool isFlag = true;
bool isTaskFlag = true;
DateTime startTime = DateTime.Now;
do
{
//判断当前是否有手动下发的任务,有退出当前方法
isTaskFlag = GetNewTask(planInfo.ObjId);
if (isTaskFlag)
{
break;
}
int answer = obj_sidePanel.plc.ReadInt16("D6021");
if (answer == 2)
@ -319,12 +327,11 @@ namespace Aucma.Core.SheetMetalTasks
isFlag = false;
break;
}
Thread.Sleep(3000);
} while (isFlag);
if (isTaskFlag) return ;
if (isTaskFlag) return;
//更新计划状态为2执行中
planInfo.ExecuteStatus = 2;
@ -466,7 +473,7 @@ namespace Aucma.Core.SheetMetalTasks
/// </summary>
public void InitSendBackPanelPlan(object sender, System.Timers.ElapsedEventArgs e)
{
var obj_backPanel = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("BackPanelPLC"));
if (obj_backPanel == null) return;
var obj_sidePanel = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("SidePanelPlc"));
@ -476,7 +483,7 @@ namespace Aucma.Core.SheetMetalTasks
backFlag = false;
try
{
var planInfoList = _executePlanInfoServices.QuerySheetMetalSendPlanData("1001").Result;
var planInfoList = _executePlanInfoServices.QuerySheetMetalSendPlanData("1001").Result;
if (planInfoList == null || planInfoList.Count == 0)
{
Console.WriteLine("未获取到需要下发的后板任务");
@ -500,11 +507,11 @@ namespace Aucma.Core.SheetMetalTasks
List<Bin> binList = GetBackBinStatus(obj_backPanel);
SmSyncModel smSyncModel = _smSyncModelServices.FirstAsync(d => d.MaterialSpecifications.Equals(planInfo.MaterialSpecificatons) && d.Category == "1").Result;
if (smSyncModel == null) return;
Bin bin = binList.FirstOrDefault(d => d.ProductId.Equals(smSyncModel.SmProductId));
Bin bin = binList.FirstOrDefault(d => d.ProductId.Equals(smSyncModel.SmProductId) );
if (bin == null)
{
Console.WriteLine($"未查询到钣金设备对计划!当前计划【{planInfo.TaskCode}】");
// backFlag = true;
// backFlag = true;
Thread.Sleep(1000);
return;
};
@ -534,18 +541,18 @@ namespace Aucma.Core.SheetMetalTasks
{
planInfos.Remove(planInfo);
Console.WriteLine($"移除数据:{planInfo.ToJson()}");
// backFlag = true;
// backFlag = true;
}
else
{
SendPlanTaskToBackPanel(planInfo, obj_backPanel, smSyncModel.SmProductId.ObjToInt());
UpdateBackPanelPlanTaskByComplate(planInfo);
// backFlag = false;
// backFlag = false;
}
}
else
{
// backFlag = false;
// backFlag = false;
}
}
@ -587,36 +594,40 @@ namespace Aucma.Core.SheetMetalTasks
{
try
{
bool isFlag = true;
bool isTaskFlag = true;
DateTime startTime = DateTime.Now;
//Task.Run(() =>
//{
if (obj_backPanel != null)
{
//判断当前是否有手动下发的任务,有退出当前方法
isTaskFlag = GetNewTask(planInfo.ObjId);
if (isTaskFlag)
{
return;
}
//计划编号10个字D6000-D6009、物料编号10个字D6010-D6019、计划数量1个字D6020、应答字1个字D6021
obj_backPanel.plc.WriteString("D4000", planInfo.TaskCode);
obj_backPanel.plc.WriteInt16("D4022", productId.ToString());
string processNumber = GetProcessNumberBy(planInfo.MaterialCode);
obj_backPanel.plc.WriteString("D4010", planInfo.MaterialSpecificatons);
int surplus = planInfo.PlanAmount - planInfo.CompleteAmount;//剩余计划数量
// int surplus = planInfo.PlanAmount - planInfo.CompleteAmount;//剩余计划数量
int surplus = planInfo.PlanAmount;//剩余计划数量
obj_backPanel.plc.WriteInt16("D4020", surplus.ToString());
Thread.Sleep(500);
obj_backPanel.plc.WriteInt16("D4021", "1");
Console.WriteLine($"【{DateTime.Now.ToString("HH:m:s")}】===>下发机头号为:{planInfo.MaterialSpecificatons}");
Console.WriteLine($"【{DateTime.Now.ToString("HH:m:s")}】===>计划【{planInfo.TaskCode}】已下发,等待背板设备应答.......");
RefreshExecInfoEvent?.Invoke($"计划【{planInfo.TaskCode}】已下发,等待背板设备应答......", "White");
#region PLC反馈信号逻辑处理
//循环读取PLC应答信号PLC应答后复位应答信号、更新计划状态为执行中
bool isFlag = true;
bool isTaskFlag = true;
DateTime startTime = DateTime.Now;
do
{
//判断当前是否有手动下发的任务,有退出当前方法
isTaskFlag = GetNewTask(planInfo.ObjId);
if (isTaskFlag)
{
break;
}
int backPalnelAnswer = obj_backPanel.plc.ReadInt16("D4021");
Console.WriteLine($"【{DateTime.Now.ToString("HH:m:s")}】===>应答信号:{backPalnelAnswer}");
@ -1116,7 +1127,7 @@ namespace Aucma.Core.SheetMetalTasks
{
try
{
//D6030
//计划编号D6030-D6039物料编号D6040-D6049计划完成数D6050计划下线数D6051设备状态D6052-D6056,生产节拍D6057-D6058
byte[] info = obj.plc.Read("D6030", 59);
@ -1155,12 +1166,12 @@ namespace Aucma.Core.SheetMetalTasks
Thread.Sleep(3000);
continue;
}
if (planInfo.ExecuteStatus !=2)
if (planInfo.ExecuteStatus != 2) // 还需要考虑联合计划任务状态
{
isFlag = false;
break;
}
//添加完工记录
//添加完工记录 wan
RecordSidePanelComplate sidePanelComplate = new RecordSidePanelComplate()
{
ProductlineCode = "1001",
@ -1187,8 +1198,9 @@ namespace Aucma.Core.SheetMetalTasks
lastComplateAmount = sidePanelComplates.First().CompleteAmount;
sidePanelComplate.OutPutAmount = complateAmount - lastComplateAmount;
sumComplateAmount = sidePanelComplates.Sum(x => x.OutPutAmount) + sidePanelComplate.OutPutAmount;
sumComplateAmount = sidePanelComplates.Sum(x => x.OutPutAmount) + sidePanelComplate.OutPutAmount;
// sumComplateAmount = complateAmount; // 改为plc读取的数量
if (sidePanelComplate.OutPutAmount == 0)
{
Thread.Sleep(5000);
@ -1206,9 +1218,10 @@ namespace Aucma.Core.SheetMetalTasks
RefreshExecInfoEvent?.Invoke($"前板计划执行完成,计划数量:{planInfo.PlanAmount};实际产量:{sumComplateAmount};差异值:{planInfo.PlanAmount - sumComplateAmount}", "White");
planInfo.CompleteAmount = planInfo.PlanAmount;
_ = _sidePanelComplateServices.InsertSidePanelCimplate(sidePanelComplate).Result;
_ = _executePlanInfoServices.UpdateAsync(planInfo).Result;
UpdateProductPlanInfo(planInfo);
//更新前端展示图表
RefreshCreatePlanInfoEvent?.Invoke();//更新界面
RefreshChatEvent?.Invoke();//刷新图表
@ -1216,14 +1229,22 @@ namespace Aucma.Core.SheetMetalTasks
}
else
{
planInfo.CompleteAmount = sumComplateAmount;
var r =await _executePlanInfoServices.UpdateAsync(planInfo);
RefreshExecInfoEvent?.Invoke($"前板计划执行完成,:{planInfo.CompleteAmount}", "White");
var r = _executePlanInfoServices.UpdateAsync(planInfo).Result;
_ = _sidePanelComplateServices.InsertSidePanelCimplate(sidePanelComplate).Result;
UpdateProductPlanInfo(planInfo);
RefreshCreatePlanInfoEvent?.Invoke();//更新界面
RefreshChatEvent?.Invoke();//刷新图表
RefreshCreatePlanInfoEvent?.Invoke();
//任务没有完成但是已经暂停、退出系统
if (planInfo.ExecuteStatus==0)
if (planInfo.ExecuteStatus == 0)
{
isFlag = false;
}
@ -1235,9 +1256,10 @@ namespace Aucma.Core.SheetMetalTasks
else
{
//如果没有完成记录插入一条默认完成数量为0
sidePanelComplate.OffLineAmount = 0;
_ = _sidePanelComplateServices.InsertSidePanelCimplate(sidePanelComplate).Result;
}
Thread.Sleep(5000);
Thread.Sleep(5000);
}
catch (Exception e)
{
@ -1248,7 +1270,47 @@ namespace Aucma.Core.SheetMetalTasks
}
#endregion
/// <summary>
/// 更新生产计划
/// </summary>
/// <param name="planInfo"></param>
public void UpdateProductPlanInfo(ExecutePlanInfo planInfo)
{
// 更新生产计划
try
{
ProductPlanInfo productInfo = _productPlanInfoServices.FirstAsync(x => x.PlanCode == planInfo.ProductPlanCode).Result;
if (productInfo != null)
{
var planInfoList = _executePlanInfoServices.QuerySheetMetalSendPlanData("1001").Result;
if (planInfoList == null || planInfoList.Count == 0)
{
Console.WriteLine("未获取到需要下发的后板任务");
Thread.Sleep(3000);
return;
}
var plan = planInfoList.FirstOrDefault(d => d.TaskCode == planInfo.TaskCode);
productInfo.SideCount = plan.SidePanelAmount;
productInfo.BackCount = plan.BackPanelAmount;
if (productInfo.CompleteAmount <= productInfo.SideCount && productInfo.CompleteAmount <= plan.BackPanelAmount)
{
productInfo.CompleteAmount = Math.Min(plan.SidePanelAmount, plan.BackPanelAmount);
_ = _productPlanInfoServices.UpdateAsync(productInfo).Result;
if (productInfo.CompleteAmount == 1)
{
_sysUserInfoServices.UpdateSapPlan(productInfo.OrderCode);//第一次执行更新日历表
}
}
}
}
catch (Exception ex)
{
RefreshExecInfoEvent?.Invoke($"更新工位生产计划数异常:{ex.Message}", "Red");
}
}
#region 下发背板生产计划
/// <summary>
/// 下发背板生产计划
@ -1363,7 +1425,7 @@ namespace Aucma.Core.SheetMetalTasks
Thread.Sleep(5000);
continue;
}
var planInfo = _executePlanInfoServices.FirstAsync(x => x.TaskCode == planCode && x.ExecuteStatus == 2).Result;
var planInfo = _executePlanInfoServices.FirstAsync(x => x.TaskCode == planCode).Result;
if (planInfo == null)
{
Console.WriteLine($"未查询到【{planCode}】运行任务!");
@ -1371,6 +1433,13 @@ namespace Aucma.Core.SheetMetalTasks
Thread.Sleep(5000);
continue;
}
if (planInfo.ExecuteStatus != 2) // 还需要考虑联合计划任务状态
{
isFlag = false;
break;
}
//var planInfoStatus = _executePlanInfoServices.FirstAsync(x => x.TaskCode == planCode && x.ExecuteStatus == 3).Result;
//if (planInfoStatus != null)
//{
@ -1425,14 +1494,17 @@ namespace Aucma.Core.SheetMetalTasks
planInfo.CompleteAmount = planInfo.PlanAmount;
_backPanelComplateServices.InsertBackPanelCimplate(backPanelComplate);
_executePlanInfoServices.UpdateAsync(planInfo);
UpdateProductPlanInfo(planInfo);
}
else
{
planInfo.CompleteAmount = sumComplateAmount;
_executePlanInfoServices.UpdateAsync(planInfo);
_backPanelComplateServices.InsertBackPanelCimplate(backPanelComplate);
UpdateProductPlanInfo(planInfo);
RefreshCreatePlanInfoEvent?.Invoke();//更新界面
RefreshChatEvent?.Invoke();//刷新图表
RefreshCreatePlanInfoEvent?.Invoke();
@ -1565,7 +1637,7 @@ namespace Aucma.Core.SheetMetalTasks
}
}
if (pPlanInfoList.Count != 0 && pPlanInfoList != null)
// if (pPlanInfoList.Count != 0 && pPlanInfoList != null)
{
_ = _productPlanInfoServices.UpdateAsync(t).Result;
}
@ -1615,7 +1687,7 @@ namespace Aucma.Core.SheetMetalTasks
string mode = string.Empty;
List<SmSyncModel> addList = new List<SmSyncModel>();
List<SmSyncModel> updateList = new List<SmSyncModel>();
var smSyncModelList = _smSyncModelServices.QueryAsync(d=>d.Category=="0").Result;
var smSyncModelList = _smSyncModelServices.QueryAsync(d => d.Category == "0").Result;
for (int i = 1; i <= 600; i++)
{
@ -1657,7 +1729,7 @@ namespace Aucma.Core.SheetMetalTasks
obj.Category = "0";
updateList.Add(obj);
}
if (!string.IsNullOrEmpty(obj.SmModel) && !string.IsNullOrEmpty(mode) && obj.SmModel!= mode)
if (!string.IsNullOrEmpty(obj.SmModel) && !string.IsNullOrEmpty(mode) && obj.SmModel != mode)
{
obj.SmProductId = j.ToString();
obj.SmModel = mode.Trim();
@ -1671,7 +1743,7 @@ namespace Aucma.Core.SheetMetalTasks
}
}
if (addList != null && addList.Count > 0) await _smSyncModelServices.AddAsync(addList);
if (updateList != null&&updateList.Count > 0) await _smSyncModelServices.UpdateAsync(updateList);
if (updateList != null && updateList.Count > 0) await _smSyncModelServices.UpdateAsync(updateList);
RefreshExecInfoEvent?.Invoke($"===============采集前板配置结束===============", "White");
Console.WriteLine("===============采集结束===============");
}
@ -1703,7 +1775,7 @@ namespace Aucma.Core.SheetMetalTasks
string mode = string.Empty;
List<SmSyncModel> addList = new List<SmSyncModel>();
List<SmSyncModel> updateList = new List<SmSyncModel>();
var smSyncModelList = _smSyncModelServices.QueryAsync(d=>d.Category=="1").Result;
var smSyncModelList = _smSyncModelServices.QueryAsync(d => d.Category == "1").Result;
for (int i = 1; i <= 600; i++)
{
@ -1992,7 +2064,7 @@ namespace Aucma.Core.SheetMetalTasks
{
if (statusFlag)
{
statusFlag=false;
statusFlag = false;
try
{
var result = _executePlanInfoServices.QueryAsync(d => d.ExecuteStatus == 2 && d.PlanAmount == d.CompleteAmount).Result;
@ -2011,7 +2083,7 @@ namespace Aucma.Core.SheetMetalTasks
}
catch (Exception ex)
{
Console.WriteLine( );
Console.WriteLine();
logHelper.Error($"更新钣金计划任务状态异常:{ex.Message}");
}
finally
@ -2019,7 +2091,7 @@ namespace Aucma.Core.SheetMetalTasks
statusFlag = true;
}
}
}
}
#endregion
@ -2027,7 +2099,7 @@ namespace Aucma.Core.SheetMetalTasks
{
List<SheetMetaSendPlanInfoView> planInfoList = _executePlanInfoServices.QuerySheetMetalSendPlanData("1001").Result;
if (planInfoList == null || planInfoList.Count == 0) return false;
var task= planInfoList.FirstOrDefault(d=>d.ExecuteStatus==2&& d.ObjId!= Id);
var task = planInfoList.FirstOrDefault(d => d.ExecuteStatus == 2 && d.ObjId != Id);
if (task == null) return false;
else return true;

Loading…
Cancel
Save