master
1 year ago
parent c0b8234497
commit dcf1a92240

@ -17,6 +17,8 @@ namespace Khd.Core.Domain.Models
[Table("wcs_task_log")]
public class WcsTaskLog
{
[Column("taskCode")]
public string taskCode { get; set; }
[Column("from_floor_no")]
public int? fromFloorNo { get; set; }

@ -8,6 +8,7 @@
<PackageReference Include="Mapster" Version="7.4.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc" Version="2.2.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.21" />
<PackageReference Include="NLog" Version="5.3.2" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerGen" Version="6.5.0" />
</ItemGroup>

@ -0,0 +1,61 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Khd.Core.Library
{
public class LoggerUtils : IDisposable
{
NLog.Logger logger = NLog.LogManager.GetLogger("LoggerFile");
public LoggerUtils()
{
}
/// <summary>
/// 信息记录
/// </summary>
/// <param name="msg"></param>
public void Log(string msg)
{
logger.Info(msg);
}
/// <summary>
/// 信息记录
/// </summary>
/// <param name="msg"></param>
public void Info(string msg)
{
logger.Info(msg);
}
/// <summary>
/// 错误记录
/// </summary>
/// <param name="msg"></param>
public void Error(string msg)
{
logger.Error(msg);
}
public void Close()
{
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(true);
}
protected virtual void Dispose(bool disposing)
{
if (!disposing)
return;
}
}
}

@ -33,6 +33,9 @@
<None Update="appsettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="NLog.config">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
<ItemGroup>

@ -1,5 +1,6 @@
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library;
using Khd.Core.Wcs.Global;
using Khd.Core.Wcs.Wcs;
using Masuit.Tools.Logging;
@ -32,7 +33,7 @@ namespace Khd.Core.Wcs
/// </summary>
public void Start()
{
LoggerUtils logger=new LoggerUtils();
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
try
@ -50,7 +51,7 @@ namespace Khd.Core.Wcs
plc = new Plc.S7.Plc(plcConfig.CpuType, plcConfig.IP, plcConfig.Port, plcConfig.Rack, plcConfig.Slot);
try
{
plc.Open();
//plc.Open();
Console.WriteLine(DateTime.Now + ":连接到PLC" + plcConfig.IP);
}
catch
@ -67,58 +68,58 @@ namespace Khd.Core.Wcs
createTaskByRecord.StartPoint();
//一楼提升机以及接驳位
FirstFloor firstFloor = new(_host, StaticData.PlcDic[0]);
FirstFloor firstFloor = new(_host);
firstFloor.StartPoint();
//二层接驳位
var SecondBaseFloorEquip = StaticData.BaseEquip.Where(t => t.floorNo == 2 && t.equipType == 1).First();
SecondFloorPoint secondFloorPoint = new(_host, StaticData.PlcDic[0], SecondBaseFloorEquip.floorNo.Value);
SecondFloorPoint secondFloorPoint = new(_host, SecondBaseFloorEquip.floorNo.Value);
secondFloorPoint.StartPoint();
//二层AGV
var SecondFloorAgvEquip = StaticData.BaseEquip.Where(t => t.floorNo == 2 && t.equipType == 4).First();
SecondFloorAGV secondFloorAGV = new(_host, StaticData.PlcDic[0], SecondFloorAgvEquip.floorNo.Value);
SecondFloorAGV secondFloorAGV = new(_host, SecondFloorAgvEquip.floorNo.Value);
secondFloorAGV.StartPoint();
//二楼线体
var SecondFloorLineEquip = StaticData.BaseEquip.Where(t => t.floorNo == 2 && t.equipType == 17).First();
SecondFloorLine secondFloorLine = new(_host, StaticData.PlcDic[2], SecondFloorLineEquip.floorNo.Value);
SecondFloorLine secondFloorLine = new(_host, SecondFloorLineEquip.floorNo.Value);
secondFloorLine.StartPoint();
//三层接驳位
var ThirdBaseFloorEquip = StaticData.BaseEquip.Where(t => t.floorNo == 3 && t.equipType == 1).First();
ThirdFloorPoint thirdFloorPoint = new(_host, StaticData.PlcDic[0], ThirdBaseFloorEquip.floorNo.Value);
ThirdFloorPoint thirdFloorPoint = new(_host, ThirdBaseFloorEquip.floorNo.Value);
thirdFloorPoint.StartPoint();
//三层AGV
var ThirdFloorAgvEquip = StaticData.BaseEquip.Where(t => t.floorNo == 3 && t.equipType == 4).First();
ThirdFloorAGV thirdFloorAGV = new(_host, StaticData.PlcDic[2], ThirdFloorAgvEquip.floorNo.Value);
ThirdFloorAGV thirdFloorAGV = new(_host, ThirdFloorAgvEquip.floorNo.Value);
thirdFloorAGV.StartPoint();
//五层接驳位
var FifthBaseFloorEquip = StaticData.BaseEquip.Where(t => t.floorNo == 5 && t.equipType == 1).First();
FiveFloorPoint fifthFloorPoint = new(_host, StaticData.PlcDic[0], FifthBaseFloorEquip.floorNo.Value);
FiveFloorPoint fifthFloorPoint = new(_host, FifthBaseFloorEquip.floorNo.Value);
fifthFloorPoint.StartPoint();
//五层CTU
var FiveFloorCTUEquip = StaticData.BaseEquip.Where(t => t.floorNo == 5 && t.equipType == 6).First();
FiveFloorCTU fiveFloorCTU = new(_host, StaticData.PlcDic[1], FiveFloorCTUEquip.floorNo.Value);
FiveFloorCTU fiveFloorCTU = new(_host,FiveFloorCTUEquip.floorNo.Value);
fiveFloorCTU.StartPoint();
//五层AGV
var FifthFloorAgvEquip = StaticData.BaseEquip.Where(t => t.floorNo == 5 && t.equipType == 5).First();
FiveFloorAGV fifthFloorAGV = new(_host, StaticData.PlcDic[0], FifthFloorAgvEquip.floorNo.Value);
FiveFloorAGV fifthFloorAGV = new(_host, FifthFloorAgvEquip.floorNo.Value);
fifthFloorAGV.StartPoint();
//背负式Agv
var FifthFloorBearAgvEquip = StaticData.BaseEquip.Where(t => t.objid == 28).First();
FiveFloorBearAgv fiveFloorBearAgv = new(_host, StaticData.PlcDic[0], FifthFloorBearAgvEquip.floorNo.Value);
FiveFloorBearAgv fiveFloorBearAgv = new(_host, FifthFloorBearAgvEquip.floorNo.Value);
fiveFloorBearAgv.StartPoint();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
LogManager.Error(ex);
logger.Error(ex.Message+"\n"+ex.StackTrace);
}
}

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog"/>
</configSections>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<targets>
<!--<target xsi:type="File" name="LogFile" fileName="${basedir}/logs/logfile_${date:format=yyyyMMdd}.log"-->
<target xsi:type="File" name="LogFile" fileName="${basedir}/logs/${shortdate}/${threadname}.log"/>
</targets>
. <rules>
<Logger name="LoggerFile" minlevel="Info" writeTo="LogFile"></Logger>
</rules>
</nlog>
</configuration>

@ -1,4 +1,5 @@
using Khd.Core.EntityFramework;
using Khd.Core.Library;
using Khd.Core.Wcs;
using Khd.Core.Wcs.Global;
using Masuit.Tools.Logging;
@ -10,9 +11,10 @@ using System.Diagnostics;
internal class Program
{
private static LoggerUtils _logger = new LoggerUtils();
private static void Main(string[] args)
{
Console.ForegroundColor = ConsoleColor.Yellow;
Init(); //初始化加载配置文件
AppDomain.CurrentDomain.UnhandledException += GlobalExceptionHandler; //全局异常捕获
@ -30,14 +32,14 @@ internal class Program
{
IHost host = CreateHostBuilder(args).Build();
LogManager.Info("系统启动开始");
_logger.Info("系统启动开始");
Console.WriteLine($"{DateTime.Now}:系统启动开始");
MainCentralControl main = new(host);
main.Start();
mutex.ReleaseMutex(); // 释放 Mutex
LogManager.Info("系统启动成功");
_logger.Info("系统启动成功");
Console.WriteLine($"{DateTime.Now}:系统启动成功");
while (true)
@ -54,7 +56,7 @@ internal class Program
catch (Exception ex)
{
Console.Write("系统启动异常:" + ex.Message + "\n" + ex.StackTrace);
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
}
@ -65,13 +67,13 @@ internal class Program
Console.WriteLine("全局异常捕获:");
Console.WriteLine(exception.Message);
Console.WriteLine(exception.StackTrace);
LogManager.Info("全局异常捕获:" + exception.Message);
_logger.Info("全局异常捕获:" + exception.Message);
}
else
{
Console.WriteLine("未知异常捕获:");
Console.WriteLine(e.ExceptionObject);
LogManager.Info("未知异常捕获:" + e.ExceptionObject);
_logger.Info("未知异常捕获:" + e.ExceptionObject);
}
}

@ -27,5 +27,6 @@ namespace Khd.Core.Wcs
}
}
public static object outStockLock = new object();
}
}

@ -1,4 +1,5 @@
using Khd.Core.EntityFramework;
using Khd.Core.Library;
using Masuit.Tools.Logging;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
@ -41,6 +42,7 @@ namespace Khd.Core.Wcs.Wcs
/// <param name="e"></param>
private void OnTimerElapsed(object? sender, ElapsedEventArgs e)
{
LoggerUtils _logger = new LoggerUtils();
try
{
using var scope = _host.Services.CreateScope();
@ -64,11 +66,11 @@ namespace Khd.Core.Wcs.Wcs
est < date_add(NOW(), interval -1 DAY);";
var ret = dbContext.Database.ExecuteSqlRaw(sqlQuery);
string saveLog = ret == 0 ? "备份任务SQL语句存在问题!" : "备份任务SQL语句执行成功!";
LogManager.Info($"定时备份任务日志记录 >>> {saveLog}");
_logger.Info($"定时备份任务日志记录 >>> {saveLog}");
}
catch (Exception ex)
{
LogManager.Info($"定时备份任务方法报错 >>> {ex.Message}");
_logger.Info($"定时备份任务方法报错 >>> {ex.Message}");
}
}

@ -1,5 +1,6 @@
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library;
using Khd.Core.Library.Mapper;
using Khd.Core.Wcs.Global;
using Masuit.Tools;
@ -18,6 +19,7 @@ namespace Khd.Core.Wcs.Wcs
/// </summary>
public class CreateTaskByRecord
{
private readonly LoggerUtils _logger=new LoggerUtils();
private readonly IHost _host;
public CreateTaskByRecord(IHost host)
{
@ -31,37 +33,62 @@ namespace Khd.Core.Wcs.Wcs
{
//背负式Agv返库任务
var createBearAgvReturnThread = new Thread(CreateBearAgvReturnLogic);
createBearAgvReturnThread.IsBackground = true;
createBearAgvReturnThread.Name = "CreateBearAgvReturnLogic";
createBearAgvReturnThread.Start();
//五楼半成品入库任务
var createFiveProductInTaskThread = new Thread(CreateFiveProductInTaskLogic);
createFiveProductInTaskThread.IsBackground = true;
createFiveProductInTaskThread.Name = "CreateFiveProductInTaskLogic";
createFiveProductInTaskThread.Start();
//五楼成品出库任务
var createFiveProductTaskThread = new Thread(CreateFiveProductTaskLogic);
createFiveProductTaskThread.IsBackground = true;
createFiveProductTaskThread.Name = "CreateFiveProductTaskLogic";
createFiveProductTaskThread.Start();
//五楼CTU出库任务以及原材料出库任务
var createRawTaskThread = new Thread(CreateRawTaskLogic);
createRawTaskThread.IsBackground = true;
createRawTaskThread.Name = "CreateRawTaskLogic";
createRawTaskThread.Start();
//五楼柜体拆分返库任务
var createRawInThread = new Thread(CreateRawInTaskLogic);
createRawInThread.IsBackground = true;
createRawInThread.Name = "CreateRawInTaskLogic";
createRawInThread.Start();
//三楼去翻转机任务
var createThirdOutTaskThread = new Thread(CreateThirdOutTaskLogic);
createThirdOutTaskThread.IsBackground = true;
createThirdOutTaskThread.Name = "CreateThirdOutTaskLogic";
createThirdOutTaskThread.Start();
//二楼成品出库任务
var CreateSecondProductTaskThread = new Thread(CreateSecondProductTaskLogic);
CreateSecondProductTaskThread.IsBackground = true;
CreateSecondProductTaskThread.Name = "CreateSecondProductTaskLogic";
CreateSecondProductTaskThread.Start();
//三楼托盘收集架满5个或10个时出库合盘任务
var createEmptyTrayThread = new Thread(CreateEmptyTrayLogic);
createEmptyTrayThread.IsBackground = true;
createEmptyTrayThread.Name = "CreateEmptyTrayLogic";
createEmptyTrayThread.Start();
//二楼废品区人工调度任务
var createThirdWasterTaskThread = new Thread(CreateThirdWasterTaskLogic);
createThirdWasterTaskThread.IsBackground = true;
createThirdWasterTaskThread.Name = "CreateThirdWasterTaskLogic";
createThirdWasterTaskThread.Start();
//背负式退库
var BackReturnTaskThread= new Thread(BackReturnTaskLogic);
BackReturnTaskThread.IsBackground = true;
BackReturnTaskThread.Name = "BackReturnTaskLogic";
BackReturnTaskThread.Start();
Console.WriteLine(DateTime.Now + ":出库任务监听启动成功");
LogManager.Info("出库任务监听启动成功");
_logger.Info("出库任务监听启动成功");
}
private void CreateRawInTaskLogic(object? obj)
/// <summary>
/// 五楼柜体拆分返库任务
/// </summary>
private void CreateRawInTaskLogic()
{
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
@ -120,7 +147,7 @@ namespace Khd.Core.Wcs.Wcs
}
catch (Exception ex)
{
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
Thread.Sleep(5000);
}
@ -157,7 +184,7 @@ namespace Khd.Core.Wcs.Wcs
}
catch (Exception ex)
{
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
Thread.Sleep(5000);
}
@ -291,7 +318,7 @@ namespace Khd.Core.Wcs.Wcs
}
catch (Exception ex)
{
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
Thread.Sleep(5000);
}
@ -304,41 +331,45 @@ namespace Khd.Core.Wcs.Wcs
{
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
try
while (true)
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
WcsTask? wcsTask = dbContext.WcsTask.Where(t => t.taskType == 28).FirstOrDefault();
if (wcsTask != null)
try
{
WmsRawInstock? wmsRawInstock = dbContext.WmsRawInstock.Where(t => t.instockType == "2" && t.warehouseId == 511 && t.executeStatus == "0").FirstOrDefault();
if (wmsRawInstock != null)
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
WcsTask? wcsTask = dbContext.WcsTask.Where(t => t.taskType == 28).FirstOrDefault();
if (wcsTask != null)
{
wcsTask.useFlag = 1;
wcsTask.createTime = DateTime.Now;
wmsRawInstock.executeStatus = "1";
wmsRawInstock.beginTime = DateTime.Now;
WmsRawInstockDetail wmsRawInstockDetail = new WmsRawInstockDetail()
WmsRawInstock? wmsRawInstock = dbContext.WmsRawInstock.Where(t => t.instockType == "2" && t.warehouseId == 511 && t.executeStatus == "0").FirstOrDefault();
if (wmsRawInstock != null)
{
rawInstockDetailId = StaticData.SnowId.NextId(),
rawInstockId = wmsRawInstock.rawInstockId,
instockWay = "2",
activeFlag = "1",
stackAmount = 1,
createBy = "WCS",
createDate = DateTime.Now,
materialId = wmsRawInstock.materialId,
instockAmount = 1,
executeStatus = "0",
};
dbContext.Update(wmsRawInstock);
dbContext.Update(wcsTask);
dbContext.SaveChanges();
wcsTask.useFlag = 1;
wcsTask.createTime = DateTime.Now;
wmsRawInstock.executeStatus = "1";
wmsRawInstock.beginTime = DateTime.Now;
WmsRawInstockDetail wmsRawInstockDetail = new WmsRawInstockDetail()
{
rawInstockDetailId = StaticData.SnowId.NextId(),
rawInstockId = wmsRawInstock.rawInstockId,
instockWay = "2",
activeFlag = "1",
stackAmount = 1,
createBy = "WCS",
createDate = DateTime.Now,
materialId = wmsRawInstock.materialId,
instockAmount = 1,
executeStatus = "0",
};
dbContext.Update(wmsRawInstock);
dbContext.Update(wcsTask);
dbContext.SaveChanges();
}
}
}
}
catch
{
catch(Exception ex)
{
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
Thread.Sleep(5000);
}
}
@ -437,7 +468,7 @@ namespace Khd.Core.Wcs.Wcs
}
catch (Exception ex)
{
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
Thread.Sleep(5000);
}
@ -492,176 +523,179 @@ namespace Khd.Core.Wcs.Wcs
WmsBaseLocation? wmsBaseLocation = null;
WmsRawStock? wmsRawStock = null;
bill = bill.OrderBy(t => t.b.instockDate.Value.Date);//按某个时间段
var fistbill = bill.FirstOrDefault();
if (fistbill != null)
foreach (var item in bill)
{
int? locRow = 0;
if (fistbill.a.locRow % 2 == 1)
var fistbill = bill.First();
if (fistbill != null)
{
locRow = fistbill.a.locRow + 1;
}
else
{
locRow = fistbill.a.locRow - 1;
}
var lastbill = bill.Where(t => t.a.locRow == locRow)
.Where(t => t.a.locColumn == fistbill.a.locColumn)
.Where(t => t.a.locDeep == 2)
.FirstOrDefault();
wmsBaseLocation = fistbill.a;
if (lastbill != null)
{
if (lastbill.b.instockDate != null && fistbill.b.instockDate != null)
int? locRow = 0;
if (fistbill.a.locRow % 2 == 1)
{
if (wmsBaseLocation.locDeep == 1)
locRow = fistbill.a.locRow + 1;
}
else
{
locRow = fistbill.a.locRow - 1;
}
var lastbill = bill.Where(t => t.a.locRow == locRow)
.Where(t => t.a.locColumn == fistbill.a.locColumn)
.Where(t => t.a.locDeep == 2)
.FirstOrDefault();
wmsBaseLocation = fistbill.a;
if (lastbill != null)
{
if (lastbill.b.instockDate != null && fistbill.b.instockDate != null)
{
int? row = 0;
if (wmsBaseLocation.locRow % 2 == 1)
if (wmsBaseLocation.locDeep == 1)
{
row = wmsBaseLocation.locRow + 1;
}
else
{
row = wmsBaseLocation.locRow - 1;
}
var lowLocationBill = bill.Where(t => t.a.locRow == locRow).Where(t => t.a.locColumn == wmsBaseLocation.locColumn).Where(t => t.a.warehouseId == wmsBaseLocation.warehouseId).FirstOrDefault();
if (lowLocationBill != null)
{
wmsBaseLocation = lowLocationBill.a;
}
else
{
WmsBaseLocation? fromBaseLocation = AllWmsBaseLocations.Where(t => t.locRow == row)
.Where(t => t.locColumn == wmsBaseLocation.locColumn)
.Where(t => t.warehouseId == wmsBaseLocation.warehouseId).FirstOrDefault();
if (fromBaseLocation != null && !string.IsNullOrEmpty(fromBaseLocation.containerCode))
int? row = 0;
if (wmsBaseLocation.locRow % 2 == 1)
{
WmsRawStock? wmsRawStock1 = dbContext.WmsRawStock.FirstOrDefault(t => t.locationCode == fromBaseLocation.locationCode);
if (wmsRawStock1 != null)
row = wmsBaseLocation.locRow + 1;
}
else
{
row = wmsBaseLocation.locRow - 1;
}
var lowLocationBill = bill.Where(t => t.a.locRow == locRow).Where(t => t.a.locColumn == wmsBaseLocation.locColumn).Where(t => t.a.warehouseId == wmsBaseLocation.warehouseId).FirstOrDefault();
if (lowLocationBill != null)
{
wmsBaseLocation = lowLocationBill.a;
}
else
{
WmsBaseLocation? fromBaseLocation = AllWmsBaseLocations.Where(t => t.locRow == row)
.Where(t => t.locColumn == wmsBaseLocation.locColumn)
.Where(t => t.warehouseId == wmsBaseLocation.warehouseId).FirstOrDefault();
if (fromBaseLocation != null && !string.IsNullOrEmpty(fromBaseLocation.containerCode))
{
WmsBaseLocation? toLocation = AllWmsBaseLocations.Where(t => t.warehouseId == wmsBaseLocation.warehouseId)
.Where(t => t.locDeep == 1)
.Where(t => string.IsNullOrEmpty(t.containerCode))
.Where(t => t.locColumn > wmsBaseLocation.locColumn)
.OrderBy(t => t.locColumn)
.FirstOrDefault();
toLocation ??= AllWmsBaseLocations.Where(t => t.warehouseId == wmsBaseLocation.warehouseId)
.Where(t => t.locDeep == 1)
.Where(t => string.IsNullOrEmpty(t.containerCode))
.Where(t => t.locColumn < wmsBaseLocation.locColumn)
.OrderByDescending(t => t.locColumn)
.FirstOrDefault();
toLocation ??= AllWmsBaseLocations.Where(t => t.warehouseId == wmsBaseLocation.warehouseId)
.Where(t => t.warehouseId != wmsBaseLocation.locationId)
.Where(t => string.IsNullOrEmpty(t.containerCode))
.FirstOrDefault();
if (toLocation != null)
WmsRawStock? wmsRawStock1 = dbContext.WmsRawStock.FirstOrDefault(t => t.locationCode == fromBaseLocation.locationCode);
if (wmsRawStock1 != null)
{
var RemoveTask = new WcsTask()
WmsBaseLocation? toLocation = AllWmsBaseLocations.Where(t => t.warehouseId == wmsBaseLocation.warehouseId)
.Where(t => t.locDeep == 1)
.Where(t => string.IsNullOrEmpty(t.containerCode))
.Where(t => t.locColumn > wmsBaseLocation.locColumn)
.OrderBy(t => t.locColumn)
.FirstOrDefault();
toLocation ??= AllWmsBaseLocations.Where(t => t.warehouseId == wmsBaseLocation.warehouseId)
.Where(t => t.locDeep == 1)
.Where(t => string.IsNullOrEmpty(t.containerCode))
.Where(t => t.locColumn < wmsBaseLocation.locColumn)
.OrderByDescending(t => t.locColumn)
.FirstOrDefault();
toLocation ??= AllWmsBaseLocations.Where(t => t.warehouseId == wmsBaseLocation.warehouseId)
.Where(t => t.warehouseId != wmsBaseLocation.locationId)
.Where(t => string.IsNullOrEmpty(t.containerCode))
.FirstOrDefault();
if (toLocation != null)
{
objid = StaticData.SnowId.NextId(),
taskType = 67,
containerNo = wmsRawStock1.palletInfoCode,
createBy = "WCS",
createTime = DateTime.Now.AddSeconds(-10),
taskStatus = 0,
currPointId = fromBaseLocation.locationId,
currPointNo = fromBaseLocation.locationCode,
nextPointId = baseEquip.objid,
nextPointNo = baseEquip.equipNo,
endPointId = toLocation.locationId,
endPointNo = toLocation.locationCode,
equipmentNo = baseEquip.equipNo,
useFlag = 1,
qty = 1
};
toLocation.locationStatus = "4";
toLocation.updateBy = "WCS";
toLocation.updateTime = DateTime.Now;
fromBaseLocation.updateBy = "WCS";
fromBaseLocation.updateTime = DateTime.Now;
fromBaseLocation.locationStatus = "4";
dbContext.Update(toLocation);
dbContext.Update(fromBaseLocation);
dbContext.Add(RemoveTask);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(RemoveTask);
dbContext.Add(wcsTaskLog);
var RemoveTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
taskType = 67,
containerNo = wmsRawStock1.palletInfoCode,
createBy = "WCS",
createTime = DateTime.Now.AddSeconds(-10),
taskStatus = 0,
currPointId = fromBaseLocation.locationId,
currPointNo = fromBaseLocation.locationCode,
nextPointId = baseEquip.objid,
nextPointNo = baseEquip.equipNo,
endPointId = toLocation.locationId,
endPointNo = toLocation.locationCode,
equipmentNo = baseEquip.equipNo,
useFlag = 1,
qty = 1
};
toLocation.locationStatus = "4";
toLocation.updateBy = "WCS";
toLocation.updateTime = DateTime.Now;
fromBaseLocation.updateBy = "WCS";
fromBaseLocation.updateTime = DateTime.Now;
fromBaseLocation.locationStatus = "4";
dbContext.Update(toLocation);
dbContext.Update(fromBaseLocation);
dbContext.Add(RemoveTask);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(RemoveTask);
dbContext.Add(wcsTaskLog);
}
else
{
continue;
}
}
else
{
continue;
}
}
else
{
continue;
}
}
}
}
}
}
if (wmsBaseLocation != null)
{
wmsRawStock = wmsRawStocks.Where(t => t.locationCode == wmsBaseLocation.locationCode).First();
MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == wmsRawStock.palletInfoCode);
if (mesBasePalletInfo != null)
if (wmsBaseLocation != null)
{
MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode);
if (mesBaseBarcodeInfo != null)
wmsRawStock = wmsRawStocks.Where(t => t.locationCode == wmsBaseLocation.locationCode).First();
MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == wmsRawStock.palletInfoCode);
if (mesBasePalletInfo != null)
{
WmsRawOutstockDetail wmsRawOutstockDetail = new WmsRawOutstockDetail()
MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode);
if (mesBaseBarcodeInfo != null)
{
rawOutstockDetailId = StaticData.SnowId.NextId(),
createBy = "WCS",
createDate = DateTime.Now,
executeStatus = "0",
erpAmount = 0,
erpStatus = "0",
instockBatch = mesBaseBarcodeInfo.batchCode,
stackAmount = 1,
locationCode = wmsBaseLocation.locationCode,
rawOutstockId = wmsRawOutstock.rawOutstockId,
planAmount = 1,
outstockWay = "2",
outstockPerson = "WCS",
outstockTime = DateTime.Now,
materialProductionDate = mesBaseBarcodeInfo.productionDate,
materialBarcode = mesBasePalletInfo.materialBarcode,
materialId = wmsRawOutstock.materialId,
machineName = mesBaseBarcodeInfo.machineName,
outstockAmount = 1,
taskCode = wmsRawOutstock.taskCode
};
wcsTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
orderId = wmsRawOutstock.rawOutstockId,
taskType = 41,
containerNo = wmsBaseLocation.containerCode,
createBy = "WCS",
createTime = DateTime.Now,
taskStatus = 0,
materialId = wmsRawOutstock.materialId,
currPointId = wmsBaseLocation.locationId,
currPointNo = wmsBaseLocation.locationCode,
nextPointId = baseEquip.objid,
nextPointNo = baseEquip.equipNo,
endPointId = endEquip.objid,
endPointNo = endEquip.equipNo,
equipmentNo = endEquip.equipNo,
useFlag = 1,
qty = 1
};
wmsBaseLocation.locationStatus = "6";
dbContext.Update(wmsBaseLocation);
dbContext.Add(wmsRawOutstockDetail);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
dbContext.Remove(wcsTaskManual);
dbContext.Add(wcsTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
WmsRawOutstockDetail wmsRawOutstockDetail = new WmsRawOutstockDetail()
{
rawOutstockDetailId = StaticData.SnowId.NextId(),
createBy = "WCS",
createDate = DateTime.Now,
executeStatus = "0",
erpAmount = 0,
erpStatus = "0",
instockBatch = mesBaseBarcodeInfo.batchCode,
stackAmount = 1,
locationCode = wmsBaseLocation.locationCode,
rawOutstockId = wmsRawOutstock.rawOutstockId,
planAmount = 1,
outstockWay = "2",
outstockPerson = "WCS",
outstockTime = DateTime.Now,
materialProductionDate = mesBaseBarcodeInfo.productionDate,
materialBarcode = mesBasePalletInfo.materialBarcode,
materialId = wmsRawOutstock.materialId,
machineName = mesBaseBarcodeInfo.machineName,
outstockAmount = 1,
taskCode = wmsRawOutstock.taskCode
};
wcsTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
orderId = wmsRawOutstock.rawOutstockId,
taskType = 41,
containerNo = wmsBaseLocation.containerCode,
createBy = "WCS",
createTime = DateTime.Now,
taskStatus = 0,
materialId = wmsRawOutstock.materialId,
currPointId = wmsBaseLocation.locationId,
currPointNo = wmsBaseLocation.locationCode,
nextPointId = baseEquip.objid,
nextPointNo = baseEquip.equipNo,
endPointId = endEquip.objid,
endPointNo = endEquip.equipNo,
equipmentNo = endEquip.equipNo,
useFlag = 1,
qty = 1
};
wmsBaseLocation.locationStatus = "6";
dbContext.Update(wmsBaseLocation);
dbContext.Add(wmsRawOutstockDetail);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
dbContext.Remove(wcsTaskManual);
dbContext.Add(wcsTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
}
}
}
}
@ -674,7 +708,7 @@ namespace Khd.Core.Wcs.Wcs
}
catch (Exception ex)
{
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
}
}
@ -745,7 +779,7 @@ namespace Khd.Core.Wcs.Wcs
}
catch (Exception ex)
{
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
Thread.Sleep(5000);
}
@ -826,7 +860,6 @@ namespace Khd.Core.Wcs.Wcs
MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == stock.palletInfoCode);
if (mesBasePalletInfo != null)
{
if (location.locDeep == 1)
{
int? row = 0;
@ -969,7 +1002,7 @@ namespace Khd.Core.Wcs.Wcs
catch (Exception ex)
{
Console.WriteLine(ex.Message + ex.StackTrace);
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
Thread.Sleep(5000);
}
@ -1197,7 +1230,7 @@ namespace Khd.Core.Wcs.Wcs
catch (Exception ex)
{
Console.WriteLine(ex.Message + ex.StackTrace);
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
Thread.Sleep(5000);
}
@ -1815,7 +1848,7 @@ namespace Khd.Core.Wcs.Wcs
}
catch (Exception ex)
{
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
Thread.Sleep(1000);
}

@ -1,5 +1,6 @@
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library;
using Khd.Core.Library.Mapper;
using Khd.Core.Plc.S7;
using Khd.Core.Wcs.Global;
@ -15,6 +16,7 @@ namespace Khd.Core.Wcs.Wcs
/// </summary>
public class FirstFloor
{
private readonly LoggerUtils _logger = new LoggerUtils();
private readonly IHost _host;
private readonly long F01 = 1;
private readonly long T01 = 6;
@ -56,7 +58,7 @@ namespace Khd.Core.Wcs.Wcs
public FirstFloor(IHost host, Plc.S7.Plc plc)
public FirstFloor(IHost host)
{
this._host = host;
@ -88,24 +90,27 @@ namespace Khd.Core.Wcs.Wcs
{
Thread firstFloorLine = new(FirstFloorLine)//一楼接驳位线程
{
IsBackground = true
IsBackground = true,
Name = "FirstFloorLine"
};
firstFloorLine.Start();
Thread firstFloorHoister = new(FirstFloorHoister)//提升机
{
IsBackground = true
IsBackground = true,
Name = "FirstFloorHoister"
};
firstFloorHoister.Start();
Thread equipStatusThread = new Thread(EquipStatusLogic)//设备状态1-5楼接驳位能不能送货提升机和小车任务
{
IsBackground = true
IsBackground = true,
Name = "EquipStatusThread"
};
equipStatusThread.Start();
Console.WriteLine(DateTime.Now + ":一楼提升机线程启动成功");
LogManager.Info("一楼提升机线程启动成功");
_logger.Info("一楼提升机线程启动成功");
}
private void EquipStatusLogic(object? obj)
@ -185,7 +190,7 @@ namespace Khd.Core.Wcs.Wcs
}
}
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
}
@ -231,7 +236,7 @@ namespace Khd.Core.Wcs.Wcs
dbContext.Add(wcsTaskLog);
dbContext.Add(wcsTask);
dbContext.SaveChanges();
LogManager.Info("一楼接驳位线程:空托盘任务下发成功");
_logger.Info("一楼接驳位线程:空托盘任务下发成功");
Console.WriteLine(DateTime.Now + ":一楼接驳位线程:空托盘任务下发成功");
}
}
@ -258,7 +263,7 @@ namespace Khd.Core.Wcs.Wcs
}
}
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
Thread.Sleep(1000);
}
@ -357,14 +362,14 @@ namespace Khd.Core.Wcs.Wcs
baseEquip.containerNo = null;
dbContext.Update(baseEquip);
dbContext.SaveChanges();
LogManager.Info("一楼接驳位线程:托盘" + RFID001Value + "解绑信息更新成功");
_logger.Info("一楼接驳位线程:托盘" + RFID001Value + "解绑信息更新成功");
}
else if (baseEquip.containerNo != RFID001Value)
{
baseEquip.containerNo = RFID001Value;
dbContext.Update(baseEquip);
dbContext.SaveChanges();
LogManager.Info("一楼接驳位线程:托盘" + RFID001Value + "绑定信息更新成功");
_logger.Info("一楼接驳位线程:托盘" + RFID001Value + "绑定信息更新成功");
Console.WriteLine(DateTime.Now + ":一楼接驳位线程:托盘" + RFID001Value + "绑定信息更新成功");
Thread.Sleep(3000);
continue;
@ -483,7 +488,7 @@ namespace Khd.Core.Wcs.Wcs
}
}
}
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
Thread.Sleep(1000);
}
@ -522,7 +527,7 @@ namespace Khd.Core.Wcs.Wcs
wcsTask.serialNo ??= SystemData.GetSerialNo(dbContext);
if (wcsTasks.Where(t => t.taskStatus > 0).Where(t => t.objid != wcsTask.objid).Any())
{
LogManager.Info("提升机线程:有其他任务正在执行,跳过当前任务");
_logger.Info("提升机线程:有其他任务正在执行,跳过当前任务");
continue;
}
BaseEquip lineEquip = dbContext.BaseEquip.First(t => t.objid == wcsTask.floorNo);
@ -530,7 +535,7 @@ namespace Khd.Core.Wcs.Wcs
{
if (lineEquip.equipStatus == 1)
{
LogManager.Info("提升机线程:" + wcsTask.floorNo + "楼接驳位有AGV任务跳过当前任务");
_logger.Info("提升机线程:" + wcsTask.floorNo + "楼接驳位有AGV任务跳过当前任务");
continue;
}
BasePlcpoint floorPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "RFID00" + wcsTask.fromFloorNo);
@ -546,7 +551,7 @@ namespace Khd.Core.Wcs.Wcs
StaticData.PlcDic[0].WriteToPoint(basePlcpoint.plcpointAddress, "1", basePlcpoint.plcpointLength.ToString());
StaticData.PlcDic[0].WriteToPoint(this.serialno06.plcpointAddress, wcsTask.serialNo.ToString(), this.serialno06.plcpointLength.ToString());
Console.WriteLine(DateTime.Now + ":提升机下发" + wcsTask.fromFloorNo + "楼入库指令");
LogManager.Info("提升机下发" + wcsTask.fromFloorNo + "楼入库指令");
_logger.Info("提升机下发" + wcsTask.fromFloorNo + "楼入库指令");
dbContext.Update(wcsTask);
dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 2, updateBy = "提升机线程", updateTime = DateTime.Now, remark = "提升机任务执行中" });
lineEquip.equipStatus = 1;
@ -562,7 +567,7 @@ namespace Khd.Core.Wcs.Wcs
StaticData.PlcDic[0].WriteToPoint(this.targetfloor06.plcpointAddress, wcsTask.fromFloorNo.ToString(), this.targetfloor06.plcpointLength.ToString());//目的地楼层
StaticData.PlcDic[0].WriteToPoint(this.serialno06.plcpointAddress, wcsTask.serialNo.ToString(), this.serialno06.plcpointLength.ToString());
Console.WriteLine(DateTime.Now + ":提升机下发去往" + wcsTask.fromFloorNo + "楼指令");
LogManager.Info("提升机下发去往" + wcsTask.fromFloorNo + "楼指令");
_logger.Info("提升机下发去往" + wcsTask.fromFloorNo + "楼指令");
dbContext.Update(wcsTask);
dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 1, updateBy = "提升机线程", updateTime = DateTime.Now, remark = "提升机任务执行中" });
lineEquip.equipStatus = 1;
@ -586,7 +591,7 @@ namespace Khd.Core.Wcs.Wcs
StaticData.PlcDic[0].WriteToPoint(basePlcpoint.plcpointAddress, "1", basePlcpoint.plcpointLength.ToString());
StaticData.PlcDic[0].WriteToPoint(this.serialno06.plcpointAddress, wcsTask.serialNo.ToString(), this.serialno06.plcpointLength.ToString());
Console.WriteLine(DateTime.Now + ":提升机下发" + wcsTask.fromFloorNo + "楼入库指令");
LogManager.Info("提升机下发" + wcsTask.fromFloorNo + "楼入库指令");
_logger.Info("提升机下发" + wcsTask.fromFloorNo + "楼入库指令");
dbContext.Update(wcsTask);
dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 2, updateBy = "提升机线程", updateTime = DateTime.Now, remark = "提升机任务执行中" });
dbContext.SaveChanges();
@ -603,7 +608,7 @@ namespace Khd.Core.Wcs.Wcs
wcsTask.remark = "提升机任务执行完成";
StaticData.PlcDic[0].WriteToPoint(this.targetfloor06.plcpointAddress, wcsTask.floorNo.ToString(), this.targetfloor06.plcpointLength.ToString());//目的地楼层
Console.WriteLine(DateTime.Now + ":提升机下发去往" + wcsTask.floorNo + "楼目的地指令");
LogManager.Info("提升机下发去往" + wcsTask.floorNo + "楼目的地指令");
_logger.Info("提升机下发去往" + wcsTask.floorNo + "楼目的地指令");
dbContext.Update(wcsTask);
dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 3, updateBy = "提升机线程", updateTime = DateTime.Now, remark = "提升机任务执行完成" });
dbContext.SaveChanges();
@ -623,7 +628,7 @@ namespace Khd.Core.Wcs.Wcs
if (clearPoint != null && Convert.ToBoolean(clearValue) == true)//是否有报警
{
Console.WriteLine(DateTime.Now + ":提升机下发报警消除指令");
LogManager.Info("提升机下发报警消除指令");
_logger.Info("提升机下发报警消除指令");
StaticData.PlcDic[0].WriteToPoint(clearPoint.plcpointAddress, false, clearPoint.plcpointLength.ToString());//清除报警
}
wcsTask.taskStatus = 4;
@ -633,7 +638,7 @@ namespace Khd.Core.Wcs.Wcs
BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.floorNo == wcsTask.floorNo && t.plcpointNo.Contains("wcsrun"));
StaticData.PlcDic[0].WriteToPoint(basePlcpoint.plcpointAddress, "2", basePlcpoint.plcpointLength.ToString());//去向为2表示提升机已到达目的地让货出去
Console.WriteLine(DateTime.Now + ":提升机下发" + wcsTask.floorNo + "楼出库指令");
LogManager.Info("提升机下发" + wcsTask.floorNo + "楼出库指令");
_logger.Info("提升机下发" + wcsTask.floorNo + "楼出库指令");
dbContext.Update(wcsTask);
dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 4, updateBy = "提升机线程", updateTime = DateTime.Now, remark = "提升机任务执行完成" });
dbContext.SaveChanges();
@ -651,7 +656,7 @@ namespace Khd.Core.Wcs.Wcs
else
{
Console.WriteLine(DateTime.Now + ":一楼托盘库有任务正在执行,等待任务执行完成");
LogManager.Info("一楼托盘库有任务正在执行,等待任务执行完成");
_logger.Info("一楼托盘库有任务正在执行,等待任务执行完成");
}
}
else
@ -666,7 +671,7 @@ namespace Khd.Core.Wcs.Wcs
BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.floorNo == wcsTask.floorNo && t.plcpointNo.Contains("wcsrun"));
StaticData.PlcDic[0].WriteToPoint(basePlcpoint.plcpointAddress, "2", basePlcpoint.plcpointLength.ToString());//去向为2表示提升机已到达目的地让货出去
Console.WriteLine(DateTime.Now + ":提升机下发" + wcsTask.floorNo + "楼出库指令");
LogManager.Info("提升机下发" + wcsTask.floorNo + "楼出库指令");
_logger.Info("提升机下发" + wcsTask.floorNo + "楼出库指令");
dbContext.Update(wcsTask);
dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 4, updateBy = "提升机线程", updateTime = DateTime.Now, remark = "提升机任务执行完成" });
dbContext.SaveChanges();
@ -693,7 +698,7 @@ namespace Khd.Core.Wcs.Wcs
wcsTask.remark = "提升机任务执行完成";
lineEquip.equipStatus = 0;
Console.WriteLine(DateTime.Now + ":提升机任务完成" + wcsTask.fromFloorNo + "---" + wcsTask.floorNo + "楼指令");
LogManager.Info("提升机任务完成" + wcsTask.fromFloorNo + "---" + wcsTask.floorNo + "楼指令");
_logger.Info("提升机任务完成" + wcsTask.fromFloorNo + "---" + wcsTask.floorNo + "楼指令");
dbContext.Update(lineEquip);
dbContext.Update(wcsTask);
dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 5, nextPointId = floorEquip.objid, nextPointNo = floorEquip.equipNo, updateBy = "提升机线程", updateTime = DateTime.Now, remark = "提升机任务执行完成" });
@ -734,7 +739,7 @@ namespace Khd.Core.Wcs.Wcs
}
}
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
Thread.Sleep(5000);
}

@ -1,6 +1,7 @@
using Khd.Core.Domain.Dto.webapi;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library;
using Khd.Core.Library.Mapper;
using Khd.Core.Plc.S7;
using Khd.Core.Wcs.Global;
@ -20,11 +21,12 @@ namespace Khd.Core.Wcs.Wcs
/// </summary>
public class FiveFloorAGV
{
private readonly LoggerUtils _logger = new LoggerUtils();
private readonly IHost _host;
private readonly BasePlcpoint LineSignal;
int FloorNo { get; set; }
int agvID = 28;
public FiveFloorAGV(IHost host, Plc.S7.Plc plc, int floor)
public FiveFloorAGV(IHost host, int floor)
{
this._host = host;
FloorNo = floor;
@ -37,9 +39,11 @@ namespace Khd.Core.Wcs.Wcs
{
Thread FlowPointThread = new(MonitorInLocatorPoint);
FlowPointThread.IsBackground = true;
FlowPointThread.Name = "FiveFloorAGV";
FlowPointThread.Start();
Console.WriteLine(DateTime.Now + ":五楼AGV上件扫描监听启动成功");
LogManager.Info("五楼AGV上件扫描监听启动成功");
_logger.Info("五楼AGV上件扫描监听启动成功");
}
public void MonitorInLocatorPoint()
@ -60,7 +64,7 @@ namespace Khd.Core.Wcs.Wcs
{
if (taskList.Where(t => t.taskStatus > 0).Where(t => t.objid != item.objid).Any())
{
LogManager.Info($"5楼AGV线程有其他任务正在执行跳过当前任务{item.objid}");
_logger.Info($"5楼AGV线程有其他任务正在执行跳过当前任务{item.objid}");
continue;
}
if (item.taskStatus == 0)//下发任务
@ -74,7 +78,7 @@ namespace Khd.Core.Wcs.Wcs
bool canSend = dbContext.WcsTask.Where(t => t.nextPointId == lineEquip.objid && t.taskStatus > 0).Any();
if (lineEquip.equipStatus == 1)
{
LogManager.Info("五楼AGV:接驳位有任务,无法下发出库任务");
_logger.Info("五楼AGV:接驳位有任务,无法下发出库任务");
continue;
}
if (Convert.ToInt32(StaticData.PlcDic[0].Read(LineSignal.plcpointAddress)) == 1 && !canSend)
@ -109,7 +113,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("五楼Agv下发任务成功" + message);
_logger.Info("五楼Agv下发任务成功" + message);
Console.WriteLine(DateTime.Now + ":五楼Agv下发任务成功" + wmsBaseLocation.agvPositionCode + "," + nextEquip.agvPositionCode);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -121,7 +125,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("五楼Agv下发任务失败" + item.taskType + message);
_logger.Info("五楼Agv下发任务失败" + item.taskType + message);
}
}
@ -154,7 +158,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("五楼Agv下发任务成功" + message);
_logger.Info("五楼Agv下发任务成功" + message);
Console.WriteLine(DateTime.Now + ":五楼Agv下发任务成功" + wmsBaseLocation.agvPositionCode + "," + endEquip.agvPositionCode);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -164,7 +168,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("五楼Agv下发任务失败" + item.taskType + message);
_logger.Info("五楼Agv下发任务失败" + item.taskType + message);
}
}
else if (item.taskType == 34)//背板安装到半成品
@ -195,7 +199,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("五楼Agv下发任务成功" + message);
_logger.Info("五楼Agv下发任务成功" + message);
Console.WriteLine(DateTime.Now + ":五楼Agv下发任务成功" + currentEquip.agvPositionCode + "," + wmsBaseLocation.agvPositionCode);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -205,7 +209,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("五楼Agv下发任务失败" + item.taskType + message);
_logger.Info("五楼Agv下发任务失败" + item.taskType + message);
}
}
else if (item.taskType == 46)//原材料到拆分区
@ -236,7 +240,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("五楼Agv下发任务成功" + message);
_logger.Info("五楼Agv下发任务成功" + message);
Console.WriteLine(DateTime.Now + ":五楼Agv下发任务成功" + wmsBaseLocation.agvPositionCode + "," + currentEquip.agvPositionCode);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -246,7 +250,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("五楼Agv下发任务失败" + item.taskType + message);
_logger.Info("五楼Agv下发任务失败" + item.taskType + message);
}
}
else if (item.taskType == 28)//拆分区返库
@ -278,7 +282,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("五楼Agv下发任务成功" + message);
_logger.Info("五楼Agv下发任务成功" + message);
Console.WriteLine(DateTime.Now + ":五楼Agv下发任务成功" + currentEquip.agvPositionCode + "," + wmsBaseLocation.agvPositionCode);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -288,7 +292,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("五楼Agv下发任务失败" + item.taskType + message);
_logger.Info("五楼Agv下发任务失败" + item.taskType + message);
}
}
else if (item.taskType == 47)//原材料入库
@ -319,7 +323,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("五楼Agv下发任务成功" + message);
_logger.Info("五楼Agv下发任务成功" + message);
Console.WriteLine(DateTime.Now + ":五楼Agv下发任务成功" + startEquip.agvPositionCode + "," + wmsBaseLocation.agvPositionCode);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -329,7 +333,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("五楼Agv下发任务失败" + item.taskType + message);
_logger.Info("五楼Agv下发任务失败" + item.taskType + message);
}
}
else if (item.taskType == 66)//移库
@ -360,7 +364,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("五楼Agv下发任务成功" + message);
_logger.Info("五楼Agv下发任务成功" + message);
Console.WriteLine(DateTime.Now + ":五楼Agv下发任务成功" + fromBaseLocation.agvPositionCode + "," + toBaseLocation.agvPositionCode);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -370,7 +374,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("五楼Agv下发任务失败" + item.taskType + message);
_logger.Info("五楼Agv下发任务失败" + item.taskType + message);
}
}
}
@ -385,7 +389,7 @@ namespace Khd.Core.Wcs.Wcs
if (lineSignalValue == null || Convert.ToInt32(lineSignalValue) == 0)
{
Console.WriteLine(DateTime.Now + ":五楼Agv接驳位为空无法取货");
LogManager.Info("五楼Agv接驳位为空无法取货");
_logger.Info("五楼Agv接驳位为空无法取货");
continue;
}
}
@ -395,7 +399,7 @@ namespace Khd.Core.Wcs.Wcs
if (lineSignalValue == null || Convert.ToInt32(lineSignalValue) == 1)
{
Console.WriteLine(DateTime.Now + ":五楼Agv接驳位有货无法送货");
LogManager.Info("五楼Agv接驳位有货无法送货");
_logger.Info("五楼Agv接驳位有货无法送货");
continue;
}
}
@ -409,7 +413,7 @@ namespace Khd.Core.Wcs.Wcs
ReponseMessage? reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("五楼Agv下发继续任务成功" + message);
_logger.Info("五楼Agv下发继续任务成功" + message);
Console.WriteLine(DateTime.Now + ":五楼Agv继续任务" + item.currPointNo + "," + item.endPointNo);
item.taskStatus = 4;
dbContext.Update(item);
@ -420,7 +424,7 @@ namespace Khd.Core.Wcs.Wcs
else if (item.taskStatus == 5)
{
Console.WriteLine(DateTime.Now + ":五楼AGV线程完成任务" + item.currPointNo + "," + item.endPointNo);
LogManager.Info("五楼Agv完成任务成功" + item.ToJsonString());
_logger.Info("五楼Agv完成任务成功" + item.ToJsonString());
if (item.taskType == 66)//移库
{
using var dbContextTransaction = dbContext.Database.BeginTransaction();
@ -461,7 +465,7 @@ namespace Khd.Core.Wcs.Wcs
catch (Exception ex)
{
dbContextTransaction.Rollback();
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
}
else if (item.taskType == 38)//出库
@ -768,7 +772,7 @@ namespace Khd.Core.Wcs.Wcs
}
}
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
finally
{

@ -1,6 +1,7 @@
using Khd.Core.Domain.Dto.webapi;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library;
using Khd.Core.Library.Mapper;
using Khd.Core.Wcs.Global;
using Masuit.Tools;
@ -17,11 +18,11 @@ namespace Khd.Core.Wcs.Wcs
/// </summary>
public class FiveFloorBearAgv
{
private readonly LoggerUtils _logger = new LoggerUtils();
private readonly IHost _host;
int FloorNo { get; set; }
int agvID = 10;
public FiveFloorBearAgv(IHost host, Plc.S7.Plc plc, int floor)
public FiveFloorBearAgv(IHost host, int floor)
{
this._host = host;
FloorNo = floor;
@ -33,9 +34,11 @@ namespace Khd.Core.Wcs.Wcs
{
Thread FlowPointThread = new(MonitorInLocatorPoint);
FlowPointThread.IsBackground = true;
FlowPointThread.Name = "FiveFloorBearAgv";
FlowPointThread.Start();
Console.WriteLine(DateTime.Now + ":五楼AGV上件扫描监听启动成功");
LogManager.Info("五楼AGV上件扫描监听启动成功");
_logger.Info("五楼AGV上件扫描监听启动成功");
}
public void MonitorInLocatorPoint()
@ -54,7 +57,7 @@ namespace Khd.Core.Wcs.Wcs
.OrderBy(t => t.createTime).ToList();
if (taskList.Count == 0)
{
LogManager.Info(FloorNo + "楼AGV无任务");
_logger.Info(FloorNo + "楼AGV无任务");
}
foreach (var item in taskList)//出库
{
@ -87,7 +90,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.code == "0")
{
LogManager.Info("五楼背负式AGV线程下发任务" + agvTask.ToJsonString());
_logger.Info("五楼背负式AGV线程下发任务" + agvTask.ToJsonString());
Console.WriteLine(DateTime.Now + ":五楼背负式AGV线程下发任务" + startEquip.agvPositionCode + "," + endEquip.agvPositionCode);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -97,7 +100,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("下发小车任务失败" + result);
_logger.Info("下发小车任务失败" + result);
}
}
else
@ -117,7 +120,7 @@ namespace Khd.Core.Wcs.Wcs
ReponseMessage? reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("五楼背负式AGV线程完成任务" + item.objid);
_logger.Info("五楼背负式AGV线程完成任务" + item.objid);
Console.WriteLine(DateTime.Now + ":五楼背负式AGV线程完成任务" + item.currPointNo + "," + item.endPointNo);
item.taskStatus = 5;
dbContext.Update(item);
@ -127,7 +130,7 @@ namespace Khd.Core.Wcs.Wcs
}
else if (item.taskStatus == 7)//通知拿料完成
{
LogManager.Info("五楼背负式AGV线程完成任务" + item.objid);
_logger.Info("五楼背负式AGV线程完成任务" + item.objid);
Console.WriteLine(DateTime.Now + ":五楼背负式AGV线程完成任务" + item.currPointNo + "," + item.endPointNo);
var agvTask = new RequestAGVTaskDto
{
@ -161,7 +164,7 @@ namespace Khd.Core.Wcs.Wcs
}
catch (Exception ex)
{
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
finally
{

@ -1,6 +1,7 @@
using Khd.Core.Domain.Dto.webapi;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library;
using Khd.Core.Library.Mapper;
using Khd.Core.Plc.S7;
using Khd.Core.Wcs.Global;
@ -20,7 +21,7 @@ namespace Khd.Core.Wcs.Wcs
{
List<BasePlcpoint> ScanPoint { get; set; }//点位信息
private readonly IHost _host;
private readonly LoggerUtils _logger = new LoggerUtils();
private readonly BasePlcpoint LineRFID;
private readonly BasePlcpoint isarrive;
private readonly BasePlcpoint isput;
@ -29,7 +30,7 @@ namespace Khd.Core.Wcs.Wcs
private readonly BasePlcpoint CtuLineWaring;
int FloorNo { get; set; }
int CTUID = 11;
public FiveFloorCTU(IHost host, Plc.S7.Plc plc, int floor)
public FiveFloorCTU(IHost host, int floor)
{
this._host = host;
FloorNo = floor;
@ -48,16 +49,20 @@ namespace Khd.Core.Wcs.Wcs
{
Thread FlowPointThread = new Thread(MonitorInLocatorPoint);
FlowPointThread.IsBackground = true;
FlowPointThread.Name= "FiveFloorCTU";
FlowPointThread.Start();
Thread FlowCTUInWareThread = new Thread(MonitorInWare);
FlowCTUInWareThread.IsBackground = true;
FlowCTUInWareThread.Name = "FiveFloorCTULine";
FlowCTUInWareThread.Start();
Thread HeartThread = new Thread(HeartLogic);
HeartThread.Start();
Console.WriteLine(DateTime.Now + ":五楼CTU上件扫描监听启动");
LogManager.Info("五楼CTU上件扫描监听启动");
_logger.Info("五楼CTU上件扫描监听启动");
}
private void HeartLogic(object? obj)
@ -282,7 +287,7 @@ namespace Khd.Core.Wcs.Wcs
}
}
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
Thread.Sleep(1000);
}
@ -316,7 +321,7 @@ namespace Khd.Core.Wcs.Wcs
// }
// else
// {
// LogManager.Info("CTU下发预执行任务失败:\nwaitTask:" + waitMessage + "\nwaitResult:" + waitResult);
// _logger.Info("CTU下发预执行任务失败:\nwaitTask:" + waitMessage + "\nwaitResult:" + waitResult);
// }
// Thread.Sleep(1000 * 60 * 10);//每10分钟重新下发预执行任务
// }
@ -324,7 +329,7 @@ namespace Khd.Core.Wcs.Wcs
// }
// catch (Exception ex)
// {
// LogManager.Error(ex);
// _logger.Error(ex.Message + "\n" + ex.StackTrace);
// }
// Thread.Sleep(3000);
// }
@ -351,12 +356,12 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("CTU下发预执行任务失败:\nwaitTask:" + waitMessage + "\nwaitResult:" + waitResult);
_logger.Info("CTU下发预执行任务失败:\nwaitTask:" + waitMessage + "\nwaitResult:" + waitResult);
}
}
catch (Exception ex)
{
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
return false;
}
return false;
@ -380,7 +385,7 @@ namespace Khd.Core.Wcs.Wcs
.Where(t => t.nextPointId == CTUID).OrderByDescending(t => t.ud1).ToList();
if (taskList.Count == 0)
{
LogManager.Info(FloorNo + "楼CTU无任务");
_logger.Info(FloorNo + "楼CTU无任务");
}
foreach (var item in taskList)
{
@ -414,7 +419,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.code == "0")
{
LogManager.Info("五楼CTU线程开始任务" + item.objid);
_logger.Info("五楼CTU线程开始任务" + item.objid);
Console.WriteLine(DateTime.Now + ":五楼CTU线程开始任务" + item.currPointNo + "," + item.endPointNo);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -424,7 +429,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("CTU下发出库任务失败" + reponseMessage?.message);
_logger.Info("CTU下发出库任务失败" + reponseMessage?.message);
}
}
else if (item.taskType == 29)//入库任务
@ -458,7 +463,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.code == "0")
{
LogManager.Info("五楼CTU线程开始任务" + item.objid);
_logger.Info("五楼CTU线程开始任务" + item.objid);
Console.WriteLine(DateTime.Now + ":五楼CTU线程开始任务" + item.currPointNo + "," + item.endPointNo);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -480,7 +485,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("CTU下发入库任务失败" + reponseMessage?.message);
_logger.Info("CTU下发入库任务失败" + reponseMessage?.message);
}
}
}
@ -520,7 +525,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("CTU下发出库任务失败" + reponseMessage?.message);
_logger.Info("CTU下发出库任务失败" + reponseMessage?.message);
}
}
}
@ -545,14 +550,14 @@ namespace Khd.Core.Wcs.Wcs
ReponseMessage? reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.code == "0")
{
LogManager.Info("五楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
_logger.Info("五楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
Console.WriteLine(DateTime.Now + ":五楼CTU线程继续任务" + item.currPointId + "," + item.endPointNo);
dbContext.WcsTask.Where(t => t.objid == item.objid).Update(t => new WcsTask() { taskStatus = 4 });
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 4 });
}
else
{
LogManager.Info("CTU第一次下发继续任务失败" + reponseMessage?.message);
_logger.Info("CTU第一次下发继续任务失败" + reponseMessage?.message);
}
}
}
@ -569,7 +574,7 @@ namespace Khd.Core.Wcs.Wcs
ReponseMessage? reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.code == "0")
{
LogManager.Info("五楼CTU线程下发任务" + agvTask.ToJsonString() + "\n" + message);
_logger.Info("五楼CTU线程下发任务" + agvTask.ToJsonString() + "\n" + message);
Console.WriteLine(DateTime.Now + ":五楼CTU线程下发任务" + item.currPointId + "," + item.endPointNo);
dbContext.WcsTask.Where(t => t.objid == item.objid).Update(t => new WcsTask() { taskStatus = 4 });
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 4 });
@ -577,13 +582,13 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("CTU第二次下发继续任务失败" + reponseMessage?.message);
_logger.Info("CTU第二次下发继续任务失败" + reponseMessage?.message);
}
}
}
else if (item.taskStatus == 5)
{
LogManager.Info("五楼CTU线程完成任务" + item.objid);
_logger.Info("五楼CTU线程完成任务" + item.objid);
Console.WriteLine(DateTime.Now + ":五楼CTU线程完成任务" + item.currPointNo + "," + item.endPointNo);
if (item.taskType == 30)//出库任务
{
@ -594,7 +599,6 @@ namespace Khd.Core.Wcs.Wcs
wmsRawOutstockDetail.updateDate = DateTime.Now;
dbContext.Update(wmsRawOutstockDetail);
}
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation
.First(t => t.locationId == item.currPointId && t.warehouseFloor == 5);
wmsBaseLocation.locationStatus = "1";
@ -670,7 +674,7 @@ namespace Khd.Core.Wcs.Wcs
}
}
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
finally
{
@ -699,11 +703,11 @@ namespace Khd.Core.Wcs.Wcs
var executeReponse = JsonConvert.DeserializeObject<ReponseMessage>(executeResult);
if (executeReponse != null && executeReponse.code == "0")
{
LogManager.Info("下发CTU执行入库任务成功");
_logger.Info("下发CTU执行入库任务成功");
}
else
{
LogManager.Info("下发CTU执行入库任务失败");
_logger.Info("下发CTU执行入库任务失败");
Console.WriteLine($"{DateTime.Now}:下发CTU执行入库任务失败" + executeReponse?.message);
ExecuteInTask(baseEquip);
Thread.Sleep(1000);

@ -1,5 +1,6 @@
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library;
using Khd.Core.Library.Mapper;
using Khd.Core.Plc.S7;
using Khd.Core.Wcs.Global;
@ -18,10 +19,10 @@ namespace Khd.Core.Wcs.Wcs
private readonly IHost _host;
private readonly BasePlcpoint LineRFID;
private readonly BasePlcpoint LineSignal;
private readonly LoggerUtils _logger = new LoggerUtils();
int FloorNo { get; set; }
string EquipNo = "";
public FiveFloorPoint(IHost host, Plc.S7.Plc plc, int floor)
public FiveFloorPoint(IHost host, int floor)
{
this._host = host;
FloorNo = floor;
@ -37,9 +38,10 @@ namespace Khd.Core.Wcs.Wcs
var FlowPointThread = new Thread(MonitorInLocatorPoint);
FlowPointThread.IsBackground = true;
FlowPointThread.Name = "FiveFloorPoint";
FlowPointThread.Start();
Console.WriteLine(DateTime.Now + ":五楼接驳位调度启动成功");
LogManager.Info("五楼接驳位调度启动成功");
_logger.Info("五楼接驳位调度启动成功");
}
public void MonitorInLocatorPoint()
@ -83,104 +85,84 @@ namespace Khd.Core.Wcs.Wcs
.ToList();
if (wmsBaseLocations.Count > 0)
{
List<string> containerCodes = wmsBaseLocations
.Where(t => t.locDeep == 1)
.Select(t => t.containerCode).ToList();//深库位的托盘
List<MesBasePalletInfo> mesBasePalletInfos = dbContext.MesBasePalletInfo
.Where(t => t.materialId == wcsTask.materialId)
.Where(t => containerCodes.Contains(t.palletInfoCode)).ToList();//深库位的托盘的物料等于当前任务的物料
var bill = from a in mesBasePalletInfos
join b in wmsBaseLocations.Where(t => t.locDeep == 1) on a.palletInfoCode equals b.containerCode
select new { b };//等于当前任务的物料的托盘的库位信息
var outBill = from a in bill
from b in wmsBaseLocations
where a.b.layerNum == b.layerNum
&& b.locDeep == 2
&& b.locRow == (a.b.locRow % 2 == 0 ? a.b.locRow + 1 : a.b.locRow - 1)
&& a.b.locColumn == b.locColumn
&& b.locationStatus == "1"
&& string.IsNullOrEmpty(b.containerCode)
select new { a.b };//在上面的基础上获取对应托盘的外侧库位的空库位信息
WmsBaseLocation? wmsBaseLocation = null;
wmsBaseLocation ??= outBill.FirstOrDefault()?.b;//先找相同物料的外侧库位
wmsBaseLocation ??= wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault(t => t.locDeep == 2);//找不到再找深库位
wmsBaseLocation ??= wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault();//找不到再找任意库位
//深浅库位问题?库位入库优先级等
var AgvEquip = StaticData.BaseEquip.First(t => t.objid == 28);//5楼叉车
if (wmsBaseLocations.Count > 0 && wmsBaseLocation != null)
MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == rfid).FirstOrDefault();
if (mesBasePalletInfo != null)
{
WcsTask newTask = CoreMapper.Map<WcsTask>(wcsTask);
newTask.taskStatus = 0;//创建状态
newTask.updateTime = DateTime.Now;
newTask.currPointId = baseEquip.objid;
newTask.currPointNo = baseEquip.equipNo;
newTask.nextPointId = AgvEquip.objid;
newTask.nextPointNo = AgvEquip.equipNo;
newTask.endPointId = wmsBaseLocation.locationId;
newTask.endPointNo = wmsBaseLocation.locationCode;
newTask.objid = StaticData.SnowId.NextId();
newTask.createTime = DateTime.Now;
newTask.taskType = 47;
if (newTask.fromFloorNo != 1)//如果不是一楼来的,需要通过接口确认入库(质检通过后,点击继续入库)
MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode);
if (mesBaseBarcodeInfo != null)
{
newTask.useFlag = 0;
}
else
{
newTask.useFlag = 1;
}
wmsBaseLocation.locationStatus = "2";
dbContext.Update(wmsBaseLocation);
dbContext.Remove(wcsTask);
List<string> containerCodes = wmsBaseLocations
.Where(t => t.locDeep == 1)
.Select(t => t.containerCode).ToList();//深库位的托盘
List<MesBaseBarcodeInfo> mesBasePalletInfos = dbContext.MesBaseBarcodeInfo
.Where(t => t.materialId == wcsTask.materialId)
.Where(t => t.saleOrderId == mesBaseBarcodeInfo.saleOrderId)
.Where(t => containerCodes.Contains(t.palletInfoCode)).ToList();//深库位的托盘的物料等于当前任务的物料
dbContext.Add(newTask);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(newTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
}
else
{
Console.WriteLine(DateTime.Now + ":五楼接驳位调度入库任务,未找到库位");
LogManager.Info("五楼接驳位调度入库任务,未找到库位");
var bill = from a in mesBasePalletInfos
join b in wmsBaseLocations.Where(t => t.locDeep == 1) on a.palletInfoCode equals b.containerCode
select new { b };//等于当前任务的物料的托盘的库位信息
var outBill = from a in bill
from b in wmsBaseLocations
where a.b.layerNum == b.layerNum
&& b.locDeep == 2
&& b.locRow == (a.b.locRow % 2 == 0 ? a.b.locRow + 1 : a.b.locRow - 1)
&& a.b.locColumn == b.locColumn
&& b.locationStatus == "1"
&& string.IsNullOrEmpty(b.containerCode)
select new { a.b };//在上面的基础上获取对应托盘的外侧库位的空库位信息
WmsBaseLocation? wmsBaseLocation = null;
wmsBaseLocation ??= outBill.FirstOrDefault()?.b;//先找相同物料的外侧库位
wmsBaseLocation ??= wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault(t => t.locDeep == 2);//找不到再找深库位
wmsBaseLocation ??= wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault();//找不到再找任意库位
//深浅库位问题?库位入库优先级等
var AgvEquip = StaticData.BaseEquip.First(t => t.objid == 28);//5楼叉车
if (wmsBaseLocations.Count > 0 && wmsBaseLocation != null)
{
WcsTask newTask = CoreMapper.Map<WcsTask>(wcsTask);
newTask.taskStatus = 0;//创建状态
newTask.updateTime = DateTime.Now;
newTask.currPointId = baseEquip.objid;
newTask.currPointNo = baseEquip.equipNo;
newTask.nextPointId = AgvEquip.objid;
newTask.nextPointNo = AgvEquip.equipNo;
newTask.endPointId = wmsBaseLocation.locationId;
newTask.endPointNo = wmsBaseLocation.locationCode;
newTask.objid = StaticData.SnowId.NextId();
newTask.createTime = DateTime.Now;
newTask.taskType = 47;
if (newTask.fromFloorNo != 1)//如果不是一楼来的,需要通过接口确认入库(质检通过后,点击继续入库)
{
newTask.useFlag = 0;
}
else
{
newTask.useFlag = 1;
}
wmsBaseLocation.locationStatus = "2";
dbContext.Update(wmsBaseLocation);
dbContext.Remove(wcsTask);
dbContext.Add(newTask);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(newTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
}
else
{
Console.WriteLine(DateTime.Now + ":五楼接驳位调度入库任务,未找到库位");
_logger.Info("五楼接驳位调度入库任务,未找到库位");
}
}
}
}
}
else if (wcsTask.taskStatus == 6) //出库任务,小车任务是完成状态
{
//int? floor = 1;
//var wmsProductOutstock = dbContext.WmsProductOutstock.FirstOrDefault(t => t.productOutstockId == wcsTask.orderId);
//if (wmsProductOutstock != null)
//{
// var endEquip = StaticData.BaseEquip.FirstOrDefault(t => t.equipNo == wmsProductOutstock.endStationCode);
// if (endEquip != null)
// {
// floor = endEquip.floorNo;
// }
//}
//else
//{
// var wmsRawOutstock = dbContext.WmsRawOutstock.FirstOrDefault(t => t.rawOutstockId == wcsTask.orderId);
// if (wmsRawOutstock != null)
// {
// var endEquip = StaticData.BaseEquip.FirstOrDefault(t => t.equipNo == wmsRawOutstock.endStationCode);
// if (endEquip != null)
// {
// floor = endEquip.floorNo;
// }
// }
//}
//if (floor == 0)
//{
// Console.WriteLine($"{DateTime.Now}:5楼接驳位未找到目的地楼层");
// LogManager.Info("5楼接驳位未找到目的地楼层");
// Thread.Sleep(1000);
// continue;
//}
BaseEquip nextEquip = StaticData.BaseEquip.First(t => t.equipType == 2);//提升机
dbContext.Remove(wcsTask);
WcsTask newTask = CoreMapper.Map<WcsTask>(wcsTask);
@ -224,7 +206,7 @@ namespace Khd.Core.Wcs.Wcs
}
}
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
finally
{

@ -1,5 +1,6 @@
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library;
using Khd.Core.Plc.S7;
using Khd.Core.Wcs.Global;
using Masuit.Tools.Logging;
@ -14,6 +15,7 @@ namespace Khd.Core.Wcs.Wcs
/// </summary>
public class FourthFloorPoint
{
private readonly LoggerUtils _logger = new LoggerUtils();
private readonly int Floor;
private readonly IHost _host;
private readonly BasePlcpoint LineRFID;
@ -29,6 +31,8 @@ namespace Khd.Core.Wcs.Wcs
public void StartPoint()
{
Thread MonitorInLocatorPointThread = new Thread(MonitorInLocatorPoint);
MonitorInLocatorPointThread.IsBackground = true;
MonitorInLocatorPointThread.Name = "FourthFloorPoint";
MonitorInLocatorPointThread.Start();
}
@ -79,7 +83,7 @@ namespace Khd.Core.Wcs.Wcs
if (floor == 0)
{
Console.WriteLine($"{DateTime.Now}:4楼接驳位未找到目的地楼层");
LogManager.Info("4楼接驳位未找到目的地楼层");
_logger.Info("4楼接驳位未找到目的地楼层");
Thread.Sleep(1000);
continue;
}
@ -131,7 +135,7 @@ namespace Khd.Core.Wcs.Wcs
}
}
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
finally
{

@ -1,6 +1,7 @@
using Khd.Core.Domain.Dto.webapi;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library;
using Khd.Core.Library.Mapper;
using Khd.Core.Plc.S7;
using Khd.Core.Wcs.Global;
@ -19,11 +20,11 @@ namespace Khd.Core.Wcs.Wcs
public class SecondFloorAGV
{
private readonly IHost _host;
private readonly LoggerUtils _logger = new LoggerUtils();
int FloorNo { get; set; }
int EquipID = 8; //2楼AGV
public SecondFloorAGV(IHost host, Plc.S7.Plc plc, int floor)
public SecondFloorAGV(IHost host, int floor)
{
this._host = host;
FloorNo = floor;
@ -36,9 +37,11 @@ namespace Khd.Core.Wcs.Wcs
{
Thread FlowPointThread = new Thread(MonitorInLocatorPoint);
FlowPointThread.IsBackground = true;
FlowPointThread.Name = "SecondFloorAGV";
FlowPointThread.Start();
Console.WriteLine(DateTime.Now + ":二楼AGV上件扫描监听启动成功");
LogManager.Info("二楼AGV上件扫描监听启动成功");
_logger.Info("二楼AGV上件扫描监听启动成功");
}
public void MonitorInLocatorPoint()
@ -90,7 +93,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("二楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
_logger.Info("二楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
Console.WriteLine(DateTime.Now + ":二楼AGV线程下发任务" + item.currPointNo + "," + item.endPointNo);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -100,7 +103,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("五楼Agv下发任务失败" + item.taskType + message);
_logger.Info("五楼Agv下发任务失败" + item.taskType + message);
}
}
else if (item.taskType == 56)//废料工位-库位
@ -131,7 +134,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("二楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
_logger.Info("二楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
Console.WriteLine(DateTime.Now + ":二楼AGV线程下发任务" + item.currPointNo + "," + item.endPointNo);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -141,7 +144,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("五楼Agv下发任务失败" + item.taskType + message);
_logger.Info("五楼Agv下发任务失败" + item.taskType + message);
}
}
else if (item.taskType == 49)//小包出口-库位
@ -172,7 +175,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("二楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
_logger.Info("二楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
Console.WriteLine(DateTime.Now + ":二楼AGV线程下发任务" + item.currPointNo + "," + item.endPointNo);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -182,7 +185,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("二楼Agv下发任务失败" + item.taskType + message);
_logger.Info("二楼Agv下发任务失败" + item.taskType + message);
}
}
else if (item.taskType == 57)//周转位-小包入口
@ -212,7 +215,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("二楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
_logger.Info("二楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
Console.WriteLine(DateTime.Now + ":二楼AGV线程下发任务" + item.currPointNo + "," + item.endPointNo);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -222,7 +225,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("五楼Agv下发任务失败" + item.taskType + message);
_logger.Info("五楼Agv下发任务失败" + item.taskType + message);
}
}
else if (item.taskType == 50)//库位-提升机
@ -255,7 +258,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("二楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
_logger.Info("二楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
Console.WriteLine(DateTime.Now + ":二楼AGV线程下发任务" + item.currPointNo + "," + item.endPointNo);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -267,7 +270,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("五楼Agv下发任务失败" + item.taskType + message);
_logger.Info("五楼Agv下发任务失败" + item.taskType + message);
}
}
}
@ -300,7 +303,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("二楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
_logger.Info("二楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
Console.WriteLine(DateTime.Now + ":二楼AGV线程下发任务" + item.currPointNo + "," + item.endPointNo);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -310,7 +313,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("五楼Agv下发任务失败" + item.taskType + message);
_logger.Info("五楼Agv下发任务失败" + item.taskType + message);
}
}
else if (item.taskType == 53)//提升机-废料工位
@ -339,7 +342,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("二楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
_logger.Info("二楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
Console.WriteLine(DateTime.Now + ":二楼AGV线程下发任务" + item.currPointNo + "," + item.endPointNo);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -349,7 +352,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("五楼Agv下发任务失败" + item.taskType + message);
_logger.Info("五楼Agv下发任务失败" + item.taskType + message);
}
}
else if (item.taskType == 54)//周转位-废料工位
@ -381,7 +384,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("二楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
_logger.Info("二楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
Console.WriteLine(DateTime.Now + ":二楼AGV线程下发任务" + item.currPointNo + "," + item.endPointNo);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -391,7 +394,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("五楼Agv下发任务失败" + item.taskType + message);
_logger.Info("五楼Agv下发任务失败" + item.taskType + message);
}
}
}
@ -422,7 +425,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("二楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
_logger.Info("二楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
Console.WriteLine(DateTime.Now + ":二楼AGV线程下发任务" + item.currPointNo + "," + item.endPointNo);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -432,7 +435,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("五楼Agv下发任务失败" + item.taskType + message);
_logger.Info("五楼Agv下发任务失败" + item.taskType + message);
}
}
else if (item.taskType == 59)//周转位-小包入口
@ -464,7 +467,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("二楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
_logger.Info("二楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
Console.WriteLine(DateTime.Now + ":二楼AGV线程下发任务" + item.currPointNo + "," + item.endPointNo);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -474,14 +477,14 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("五楼Agv下发任务失败" + item.taskType + message);
_logger.Info("五楼Agv下发任务失败" + item.taskType + message);
}
}
}
else
{
{
LogManager.Info("二楼AGV线程完成任务" + item.objid);
_logger.Info("二楼AGV线程完成任务" + item.objid);
if (item.taskStatus == 3)
{
if (item.currPointId == lineEquip.objid)
@ -759,7 +762,7 @@ namespace Khd.Core.Wcs.Wcs
catch (Exception ex)
{
transaction.Rollback();
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
}
else if (item.taskType == 56)//废料区到周转区
@ -825,7 +828,7 @@ namespace Khd.Core.Wcs.Wcs
}
}
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
finally
{

@ -1,6 +1,7 @@
using Azure.Identity;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library;
using Khd.Core.Library.Mapper;
using Khd.Core.Plc.S7;
using Khd.Core.Wcs.Global;
@ -16,9 +17,10 @@ namespace Khd.Core.Wcs.Wcs
/// </summary>
public class SecondFloorLine
{
private readonly LoggerUtils _logger = new LoggerUtils();
private readonly IHost _host;
int FloorNo { get; set; }
public SecondFloorLine(IHost host, Plc.S7.Plc plc, int floor)
public SecondFloorLine(IHost host, int floor)
{
this._host = host;
FloorNo = floor;
@ -31,9 +33,11 @@ namespace Khd.Core.Wcs.Wcs
{
Thread FlowPointThread = new Thread(MonitorInLocatorPoint);
FlowPointThread.IsBackground = true;
FlowPointThread.Name = "SecondFloorLine";
FlowPointThread.Start();
Console.WriteLine(DateTime.Now + ":二楼码垛输送线调度启动成功");
LogManager.Info("二楼码垛输送线调度启动成功");
_logger.Info("二楼码垛输送线调度启动成功");
}
public void MonitorInLocatorPoint()
@ -89,7 +93,7 @@ namespace Khd.Core.Wcs.Wcs
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
Console.WriteLine(DateTime.Now + ":二楼码垛输送线生成请求空托盘任务成功:" + wcsTask.objid);
LogManager.Info("二楼码垛输送线生成请求空托盘任务成功:" + wcsTask.objid);
_logger.Info("二楼码垛输送线生成请求空托盘任务成功:" + wcsTask.objid);
}
else//二楼周转区没有空托盘
{
@ -126,7 +130,7 @@ namespace Khd.Core.Wcs.Wcs
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
Console.WriteLine(DateTime.Now + ":二楼码垛输送线生成3楼Agv出库任务成功:" + wcsTask.objid);
LogManager.Info("二楼码垛输送线生成3楼Agv出库任务成功:" + wcsTask.objid);
_logger.Info("二楼码垛输送线生成3楼Agv出库任务成功:" + wcsTask.objid);
}
}
else
@ -168,7 +172,7 @@ namespace Khd.Core.Wcs.Wcs
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
Console.WriteLine(DateTime.Now + ":二楼码垛输送线生成手动托盘任务成功:" + wcsTaskManual.objid);
LogManager.Info("二楼码垛输送线生成手动托盘任务成功:" + wcsTaskManual.objid);
_logger.Info("二楼码垛输送线生成手动托盘任务成功:" + wcsTaskManual.objid);
}
}
else if (startEquip.emptyCount > SystemData.maxTray)//如果托盘库大于五个,出一个
@ -207,14 +211,14 @@ namespace Khd.Core.Wcs.Wcs
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
Console.WriteLine(DateTime.Now + ":二楼码垛输送线生成手动托盘任务成功:" + wcsTaskManual.objid);
LogManager.Info("二楼码垛输送线生成手动托盘任务成功:" + wcsTaskManual.objid);
_logger.Info("二楼码垛输送线生成手动托盘任务成功:" + wcsTaskManual.objid);
}
}
else
{
//todo:没有空托盘
Console.WriteLine(DateTime.Now + ":二楼码垛输送线没有空托盘");
LogManager.Info("二楼码垛输送线没有空托盘");
_logger.Info("二楼码垛输送线没有空托盘");
}
}
}
@ -296,7 +300,7 @@ namespace Khd.Core.Wcs.Wcs
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
Console.WriteLine(DateTime.Now + ":二楼码垛输送线生成入库托盘任务成功:" + wcsTask.objid);
LogManager.Info("二楼码垛输送线生成入库托盘任务成功:" + wcsTask.objid);
_logger.Info("二楼码垛输送线生成入库托盘任务成功:" + wcsTask.objid);
}
else
{
@ -328,7 +332,7 @@ namespace Khd.Core.Wcs.Wcs
}
}
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
finally
{

@ -1,5 +1,6 @@
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library;
using Khd.Core.Library.Mapper;
using Khd.Core.Plc.S7;
using Khd.Core.Wcs.Global;
@ -13,11 +14,12 @@ namespace Khd.Core.Wcs.Wcs
/// </summary>
public class SecondFloorPoint
{
private readonly LoggerUtils _logger = new LoggerUtils();
private readonly IHost _host;
private readonly BasePlcpoint LineRFID;
private readonly BasePlcpoint LineSignal;
int FloorNo { get; set; }
public SecondFloorPoint(IHost host, Plc.S7.Plc plc, int floor)
public SecondFloorPoint(IHost host,int floor)
{
this._host = host;
FloorNo = floor;
@ -31,9 +33,11 @@ namespace Khd.Core.Wcs.Wcs
{
Thread FlowPointThread = new Thread(MonitorInLocatorPoint);
FlowPointThread.Name = "SecondFloorPoint";
FlowPointThread.IsBackground = true;
FlowPointThread.Start();
Console.WriteLine(DateTime.Now + ":二楼接驳位扫描线程启动");
LogManager.Info("二楼接驳位扫描线程启动");
_logger.Info("二楼接驳位扫描线程启动");
}
public void MonitorInLocatorPoint()
@ -91,7 +95,7 @@ namespace Khd.Core.Wcs.Wcs
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(newTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
LogManager.Info("二楼接驳位生成任务入库成功,托盘号:" + rfid);
_logger.Info("二楼接驳位生成任务入库成功,托盘号:" + rfid);
Console.WriteLine(DateTime.Now + ":二楼接驳位生成任务入库成功,托盘号:" + rfid);
}
else if (agvPutValue != null && Convert.ToInt32(agvPutValue) == 1)
@ -118,7 +122,7 @@ namespace Khd.Core.Wcs.Wcs
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(newTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
LogManager.Info("二楼接驳位生成任务入库成功,托盘号:" + rfid);
_logger.Info("二楼接驳位生成任务入库成功,托盘号:" + rfid);
Console.WriteLine(DateTime.Now + ":二楼接驳位生成任务入库成功,托盘号:" + rfid);
}
}
@ -148,7 +152,7 @@ namespace Khd.Core.Wcs.Wcs
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(newTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
LogManager.Info("二楼接驳位生成任务入库成功,托盘号:" + rfid);
_logger.Info("二楼接驳位生成任务入库成功,托盘号:" + rfid);
Console.WriteLine(DateTime.Now + ":二楼接驳位生成任务入库成功,托盘号:" + rfid);
}
else if (agvPutValue != null && Convert.ToInt32(agvPutValue) == 0)
@ -175,7 +179,7 @@ namespace Khd.Core.Wcs.Wcs
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(newTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
LogManager.Info("二楼接驳位生成任务入库成功,托盘号:" + rfid);
_logger.Info("二楼接驳位生成任务入库成功,托盘号:" + rfid);
Console.WriteLine(DateTime.Now + ":二楼接驳位生成任务入库成功,托盘号:" + rfid);
}
}
@ -202,7 +206,7 @@ namespace Khd.Core.Wcs.Wcs
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(newTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
LogManager.Info("二楼接驳位生成任务入库成功,托盘号:" + rfid);
_logger.Info("二楼接驳位生成任务入库成功,托盘号:" + rfid);
Console.WriteLine(DateTime.Now + ":二楼接驳位生成任务入库成功,托盘号:" + rfid);
}
else
@ -229,7 +233,7 @@ namespace Khd.Core.Wcs.Wcs
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(newTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
LogManager.Info("二楼接驳位生成任务入库成功,托盘号:" + rfid);
_logger.Info("二楼接驳位生成任务入库成功,托盘号:" + rfid);
Console.WriteLine(DateTime.Now + ":二楼接驳位生成任务入库成功,托盘号:" + rfid);
}
}
@ -262,7 +266,7 @@ namespace Khd.Core.Wcs.Wcs
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(newTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
LogManager.Info("二楼接驳位生成任务出库成功,托盘号:" + rfid);
_logger.Info("二楼接驳位生成任务出库成功,托盘号:" + rfid);
Console.WriteLine(DateTime.Now + ":二楼接驳位生成任务出库成功,托盘号:" + rfid);
}
else//一般情况下是废料的任务
@ -289,7 +293,7 @@ namespace Khd.Core.Wcs.Wcs
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(newTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
LogManager.Info("二楼接驳位生成任务出库成功,托盘号:" + rfid);
_logger.Info("二楼接驳位生成任务出库成功,托盘号:" + rfid);
Console.WriteLine(DateTime.Now + ":二楼接驳位生成任务出库成功,托盘号:" + rfid);
}
@ -318,7 +322,7 @@ namespace Khd.Core.Wcs.Wcs
}
}
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
finally
{

@ -1,6 +1,7 @@
using Khd.Core.Domain.Dto.webapi;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library;
using Khd.Core.Plc.S7;
using Khd.Core.Wcs.Global;
using Masuit.Tools;
@ -13,6 +14,7 @@ namespace Khd.Core.Wcs.Wcs
{
public class SystemTimer
{
private readonly LoggerUtils _logger = new LoggerUtils();
private readonly IHost host;
private Plc.S7.Plc Plc30 = StaticData.PlcDic[0];
private Plc.S7.Plc Plc31 = StaticData.PlcDic[1];
@ -27,18 +29,21 @@ namespace Khd.Core.Wcs.Wcs
{
var messageSynchronousThread = new Thread(MessageSynchronousLogic)
{
Name = "MessageSynchronousThread",
IsBackground = true
};
messageSynchronousThread.Start();//陈工设备信息推送
var PlcHeartBeat30Thread = new Thread(PlcHeartBeat30Logic)
{
Name="PlcHeartBeat30Thread",
IsBackground = true
};
PlcHeartBeat30Thread.Start();//脉冲
var PlcHeartBeat31Thread = new Thread(PlcHeartBeat31Logic)
{
Name = "PlcHeartBeat31Thread",
IsBackground = true
};
PlcHeartBeat31Thread.Start();//脉冲
@ -53,20 +58,13 @@ namespace Khd.Core.Wcs.Wcs
private void PlcHeartBeat30Logic(object? obj)
{
BasePlcpoint HeartBeat30 = StaticData.BasePlcpointList.First(t => t.plcpointNo == "HeartBeat30");
int heartBeatCount = 0;
bool heartBeatCount = false;
while (true)
{
try
{
if (heartBeatCount == 0)
{
heartBeatCount = 1;
}
else
{
heartBeatCount = 0;
}
StaticData.PlcDic[0].WriteToPoint(HeartBeat30.plcpointAddress, heartBeatCount.ToString(), HeartBeat30.plcpointType?.ToString());
heartBeatCount = !heartBeatCount;
StaticData.PlcDic[0].WriteToPoint(HeartBeat30.plcpointAddress, heartBeatCount, HeartBeat30.plcpointLength?.ToString());
}
catch (Exception ex)
{
@ -88,7 +86,6 @@ namespace Khd.Core.Wcs.Wcs
//报警
}
}
LogManager.Error(ex);
}
Thread.Sleep(1000);
}
@ -101,20 +98,13 @@ namespace Khd.Core.Wcs.Wcs
private void PlcHeartBeat31Logic(object? obj)
{
BasePlcpoint HeartBeat31 = StaticData.BasePlcpointList.First(t => t.plcpointNo == "CTUHeart");
int heartBeatCount = 0;
bool heartBeatCount =false;
while (true)
{
try
{
if (heartBeatCount == 0)
{
heartBeatCount = 1;
}
else
{
heartBeatCount = 0;
}
StaticData.PlcDic[1].WriteToPoint(HeartBeat31.plcpointAddress, heartBeatCount.ToString(), HeartBeat31.plcpointType?.ToString());
heartBeatCount = !heartBeatCount;
StaticData.PlcDic[1].WriteToPoint(HeartBeat31.plcpointAddress, heartBeatCount, HeartBeat31.plcpointLength?.ToString());
}
catch (Exception ex)
{
@ -136,7 +126,6 @@ namespace Khd.Core.Wcs.Wcs
}
}
LogManager.Error(ex);
}
Thread.Sleep(1000);
}

@ -1,6 +1,7 @@
using Khd.Core.Domain.Dto.webapi;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library;
using Khd.Core.Library.Mapper;
using Khd.Core.Plc.S7;
using Khd.Core.Wcs.Global;
@ -18,11 +19,12 @@ namespace Khd.Core.Wcs.Wcs
/// </summary>
public class ThirdFloorAGV
{
private readonly LoggerUtils _logger = new LoggerUtils();
private readonly IHost _host;
int FloorNo { get; set; }
private readonly BasePlcpoint putTrayPoint;
private readonly BasePlcpoint getTrayPoint;
public ThirdFloorAGV(IHost host, Plc.S7.Plc plc, int floor)
public ThirdFloorAGV(IHost host, int floor)
{
this._host = host;
FloorNo = floor;
@ -37,13 +39,17 @@ namespace Khd.Core.Wcs.Wcs
{
Thread FlowPointThread = new Thread(MonitorInLocatorPoint);
FlowPointThread.Name = "ThirdFloorAGVTrayIn";
FlowPointThread.IsBackground = true;
FlowPointThread.Start();
Thread FZJThread = new Thread(MonitorInFZJPoint);
FZJThread.Name = "ThirdFloorAGV";
FZJThread.IsBackground = true;
FZJThread.Start();
Console.WriteLine(DateTime.Now + ":三楼AGV 启动上件扫描监听");
LogManager.Info("三楼AGV 启动上件扫描监听");
_logger.Info("三楼AGV 启动上件扫描监听");
}
private void MonitorInFZJPoint(object? obj)
@ -56,9 +62,7 @@ namespace Khd.Core.Wcs.Wcs
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
var getTrayValue = StaticData.PlcDic[2].Read(getTrayPoint.plcpointAddress);
if (getTrayValue != null && Convert.ToInt32(getTrayValue) == 1)
//BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == 31);
//if (baseEquip.emptyCount == 1)
if (getTrayValue != null && Convert.ToBoolean(getTrayValue))
{
var task = dbContext.WcsTask.Where(t => t.taskType == 42 && t.useFlag == 0).FirstOrDefault();
if (task != null)
@ -85,7 +89,7 @@ namespace Khd.Core.Wcs.Wcs
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(task);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
LogManager.Info("三楼AGV 生成空托盘入收集架任务:" + task.objid);
_logger.Info("三楼AGV 生成空托盘入收集架任务:" + task.objid);
}
}
}
@ -110,7 +114,7 @@ namespace Khd.Core.Wcs.Wcs
}
}
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
Thread.Sleep(3000);
}
@ -161,7 +165,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("三楼楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
_logger.Info("三楼楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
Console.WriteLine(DateTime.Now + ":三楼AGV线程下发任务" + item.currPointNo + "," + item.endPointNo);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -171,7 +175,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("五楼Agv下发任务失败" + item.taskType + message);
_logger.Info("五楼Agv下发任务失败" + item.taskType + message);
}
}
else if (item.taskType == 39)//提升机-库位
@ -202,7 +206,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("三楼楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
_logger.Info("三楼楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
Console.WriteLine(DateTime.Now + ":三楼AGV线程下发任务" + item.currPointNo + "," + item.endPointNo);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -212,55 +216,60 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("三楼Agv下发任务失败" + item.taskType + message);
_logger.Info("三楼Agv下发任务失败" + item.taskType + message);
}
}
else if (item.taskType == 41)//库位-翻转机
{
WmsRawOutstockDetail? wmsRawOutstockDetail = dbContext.WmsRawOutstockDetail.FirstOrDefault(t => t.rawOutstockId == item.orderId && t.executeStatus == "0");
if (wmsRawOutstockDetail != null)
BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "putTray");
var callMaterial = StaticData.PlcDic[2].Read(basePlcpoint.plcpointAddress);
if (callMaterial != null&&Convert.ToBoolean(callMaterial))
{
wmsRawOutstockDetail.executeStatus = "1";
wmsRawOutstockDetail.outstockTime = DateTime.Now;
BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == 31);
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.currPointId);
WmsRawOutstockDetail? wmsRawOutstockDetail = dbContext.WmsRawOutstockDetail.FirstOrDefault(t => t.rawOutstockId == item.orderId && t.executeStatus == "0");
if (wmsRawOutstockDetail != null)
{
wmsRawOutstockDetail.executeStatus = "1";
wmsRawOutstockDetail.outstockTime = DateTime.Now;
BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == 31);
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.currPointId);
var agvTask = new RequestAGVTaskDto
{
reqCode =StaticData.SnowId.NextId().ToString(),
positionCodePath = new List<Position>
{
new ()
var agvTask = new RequestAGVTaskDto
{
positionCode=wmsBaseLocation.agvPositionCode,
type="00"
reqCode = StaticData.SnowId.NextId().ToString(),
positionCodePath = new List<Position>
{
new ()
{
positionCode=wmsBaseLocation.agvPositionCode,
type="00"
},
new ()
{
positionCode=endEquip.agvPositionCode,
type="00"
}
},
new ()
taskTyp = baseDictionary.dicValue,
ctnrTyp = "2",
};
string message = JsonConvert.SerializeObject(agvTask);
string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/genAgvSchedulingTask", message);
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
positionCode=endEquip.agvPositionCode,
type="00"
_logger.Info("三楼楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
Console.WriteLine(DateTime.Now + ":三楼AGV线程下发任务" + item.currPointNo + "," + item.endPointNo);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
dbContext.Update(wmsRawOutstockDetail);
dbContext.Update(item);
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 1 });
dbContext.SaveChanges();
}
else
{
_logger.Info("三楼Agv下发任务失败" + item.taskType + message);
}
},
taskTyp = baseDictionary.dicValue,
ctnrTyp = "2",
};
string message = JsonConvert.SerializeObject(agvTask);
string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/genAgvSchedulingTask", message);
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("三楼楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
Console.WriteLine(DateTime.Now + ":三楼AGV线程下发任务" + item.currPointNo + "," + item.endPointNo);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
dbContext.Update(wmsRawOutstockDetail);
dbContext.Update(item);
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 1 });
dbContext.SaveChanges();
}
else
{
LogManager.Info("三楼Agv下发任务失败" + item.taskType + message);
}
}
}
@ -293,7 +302,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("三楼楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
_logger.Info("三楼楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
Console.WriteLine(DateTime.Now + ":三楼AGV线程下发任务" + item.currPointNo + "," + item.endPointNo);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -303,7 +312,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("三楼Agv下发任务失败" + item.taskType + message);
_logger.Info("三楼Agv下发任务失败" + item.taskType + message);
}
}
else if (item.taskType == 42)//翻转机-收集架
@ -335,7 +344,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("三楼楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
_logger.Info("三楼楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
Console.WriteLine(DateTime.Now + ":三楼AGV线程下发任务" + item.currPointNo + "," + item.endPointNo);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -345,7 +354,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("三楼Agv下发任务失败" + item.taskType + message);
_logger.Info("三楼Agv下发任务失败" + item.taskType + message);
}
}
else if (item.taskType == 43)//收集架-周转区
@ -378,7 +387,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("三楼楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
_logger.Info("三楼楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
Console.WriteLine(DateTime.Now + ":三楼AGV线程下发任务" + item.currPointNo + "," + item.endPointNo);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -388,7 +397,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("三楼Agv下发任务失败" + item.taskType + message);
_logger.Info("三楼Agv下发任务失败" + item.taskType + message);
}
}
else if (item.taskType == 44)//周转区-提升机
@ -423,7 +432,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("三楼楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
_logger.Info("三楼楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
Console.WriteLine(DateTime.Now + ":三楼AGV线程下发任务" + item.currPointNo + "," + item.endPointNo);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -435,7 +444,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("三楼Agv下发任务失败" + item.taskType + message);
_logger.Info("三楼Agv下发任务失败" + item.taskType + message);
}
}
}
@ -470,7 +479,7 @@ namespace Khd.Core.Wcs.Wcs
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
LogManager.Info("三楼楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
_logger.Info("三楼楼AGV线程下发任务" + agvTask.ToJsonString() + "\n" + message);
Console.WriteLine(DateTime.Now + ":三楼AGV线程下发任务" + item.currPointNo + "," + item.endPointNo);
item.taskCode = reponseMessage.data;
item.taskStatus = 1;
@ -482,7 +491,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
LogManager.Info("三楼Agv下发任务失败" + item.taskType + message);
_logger.Info("三楼Agv下发任务失败" + item.taskType + message);
}
}
}
@ -501,7 +510,7 @@ namespace Khd.Core.Wcs.Wcs
var RfidValue = StaticData.PlcDic[0].ReadRFID(Rfid.plcpointAddress);
if (lineSignalValue == null || item.containerNo != RfidValue || Convert.ToInt32(lineSignalValue) == 0)
{
LogManager.Info($"三楼Agv继续任务失败,所取货物与任务不符,任务货物为{item.containerNo},RFID为{RfidValue},线路信号为{lineSignalValue}");
_logger.Info($"三楼Agv继续任务失败,所取货物与任务不符,任务货物为{item.containerNo},RFID为{RfidValue},线路信号为{lineSignalValue}");
Console.WriteLine($"{DateTime.Now}:三楼Agv继续任务失败,所取货物与任务不符,任务货物为{item.containerNo},RFID为{RfidValue},线路信号为{lineSignalValue}");
Thread.Sleep(1000);
continue;
@ -513,7 +522,7 @@ namespace Khd.Core.Wcs.Wcs
var lineSignalValue = StaticData.PlcDic[0].Read(lineSignal.plcpointAddress);
if (lineSignalValue == null || Convert.ToInt32(lineSignalValue) == 1)
{
LogManager.Info($"三楼Agv继续任务失败,提升机有货物");
_logger.Info($"三楼Agv继续任务失败,提升机有货物");
Console.WriteLine($"{DateTime.Now}:三楼Agv继续任务失败,提升机有货物");
Thread.Sleep(1000);
continue;
@ -572,7 +581,7 @@ namespace Khd.Core.Wcs.Wcs
catch (Exception ex)
{
transaction.Rollback();
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
}
if (item.taskType == 39)//入库
@ -773,7 +782,7 @@ namespace Khd.Core.Wcs.Wcs
}
}
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
finally
{

@ -1,5 +1,6 @@
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library;
using Khd.Core.Library.Mapper;
using Khd.Core.Plc.S7;
using Khd.Core.Wcs.Global;
@ -15,11 +16,12 @@ namespace Khd.Core.Wcs.Wcs
/// </summary>
public class ThirdFloorPoint
{
private readonly LoggerUtils _logger = new LoggerUtils();
private readonly IHost _host;
private readonly BasePlcpoint LineRFID;
private readonly BasePlcpoint LineSignal;
int FloorNo { get; set; }
public ThirdFloorPoint(IHost host, Plc.S7.Plc plc, int floor)
public ThirdFloorPoint(IHost host, int floor)
{
this._host = host;
FloorNo = floor;
@ -33,9 +35,11 @@ namespace Khd.Core.Wcs.Wcs
{
Thread FlowPointThread = new Thread(MonitorInLocatorPoint);
FlowPointThread.IsBackground = true;
FlowPointThread.Name = "ThirdFloorPoint";
FlowPointThread.Start();
Console.WriteLine(DateTime.Now + ":三楼接驳位调度启动成功");
LogManager.Info("三楼接驳位调度启动成功");
_logger.Info("三楼接驳位调度启动成功");
}
public void MonitorInLocatorPoint()
@ -63,66 +67,75 @@ namespace Khd.Core.Wcs.Wcs
{
if (wcsTask.taskStatus == 5)//提升机任务是完成状态
{
var wmsBaseLocations = dbContext.WmsBaseLocation.Where(t => t.warehouseFloor == FloorNo)
.Where(t => t.activeFlag == "1")
.Where(t => t.delFlag == "0")
.Where(t => t.locationScrapType == "1")
.Where(t => t.locationStatus == "1")
.OrderByDescending(t => t.locRow)
.ThenByDescending(t => t.locColumn)
.ToList();
List<string> containerCodes = wmsBaseLocations.Where(t => t.locDeep == 1).Select(t => t.containerCode).ToList();//深库位的托盘
List<MesBasePalletInfo> mesBasePalletInfos = dbContext.MesBasePalletInfo
.Where(t => t.materialId == wcsTask.materialId)
.Where(t => containerCodes.Contains(t.palletInfoCode)).ToList();//深库位的托盘的物料等于当前任务的物料
var bill = from a in mesBasePalletInfos
join b in wmsBaseLocations.Where(t => t.locDeep == 1 && !string.IsNullOrEmpty(t.containerCode)) on a.palletInfoCode equals b.containerCode
select new { b };//等于当前任务的物料的托盘的库位信息
var outBill = from b in wmsBaseLocations
from a in bill
where a.b.layerNum == b.layerNum
&& b.locDeep == 2
&& b.locRow == (a.b.locRow % 2 == 0 ? a.b.locRow - 1 : a.b.locRow + 1)
&& a.b.locColumn == b.locColumn
&& b.locationStatus == "1"
&& string.IsNullOrEmpty(b.containerCode)
select new { b };//在上面的基础上获取对应托盘的外侧库位的空库位信息
WmsBaseLocation? wmsBaseLocation = outBill.FirstOrDefault()?.b;//先找相同物料的外侧库位
wmsBaseLocation ??= wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault(t => t.locDeep == 1);//找不到再找深库位
wmsBaseLocation ??= wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault();//找不到再找任意库位
if (wmsBaseLocations.Count > 0 && wmsBaseLocation != null)
MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == rfid).FirstOrDefault();
if (mesBasePalletInfo != null)
{
dbContext.Remove(wcsTask);
WcsTask newTask = CoreMapper.Map<WcsTask>(wcsTask);
newTask.objid = StaticData.SnowId.NextId();
newTask.taskStatus = 0;//创建状态
newTask.updateTime = DateTime.Now;
newTask.currPointId = baseEquip.objid;
newTask.currPointNo = baseEquip.equipNo;
newTask.nextPointId = AgvEquip.objid;
newTask.nextPointNo = AgvEquip.equipNo;
newTask.endPointId = wmsBaseLocation.locationId;
newTask.endPointNo = wmsBaseLocation.locationCode;
newTask.taskType = 39;
newTask.useFlag = 1;
wmsBaseLocation.locationStatus = "2";
dbContext.Update(wmsBaseLocation);
dbContext.Add(newTask);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(newTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
}
else
{
Console.WriteLine(DateTime.Now + ":三楼楼接驳位调度入库任务,未找到库位");
LogManager.Info("三楼接驳位调度入库任务,未找到库位");
MesBaseBarcodeInfo? mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode);
if (mesBaseBarcodeInfo != null)
{
var wmsBaseLocations = dbContext.WmsBaseLocation.Where(t => t.warehouseFloor == FloorNo)
.Where(t => t.activeFlag == "1")
.Where(t => t.delFlag == "0")
.Where(t => t.locationScrapType == "1")
.Where(t => t.locationStatus == "1")
.OrderByDescending(t => t.locRow)
.ThenByDescending(t => t.locColumn)
.ToList();
List<string> containerCodes = wmsBaseLocations.Where(t => t.locDeep == 1).Select(t => t.containerCode).ToList();//深库位的托盘
List<MesBaseBarcodeInfo> mesBasePalletInfos = dbContext.MesBaseBarcodeInfo
.Where(t => t.materialId == wcsTask.materialId)
.Where(t=>t.saleOrderId== mesBaseBarcodeInfo.saleOrderId)
.Where(t => containerCodes.Contains(t.palletInfoCode)).ToList();//深库位的托盘的物料等于当前任务的物料
var bill = from a in mesBasePalletInfos
join b in wmsBaseLocations.Where(t => t.locDeep == 1 && !string.IsNullOrEmpty(t.containerCode)) on a.palletInfoCode equals b.containerCode
select new { b };//等于当前任务的物料的托盘的库位信息
var outBill = from b in wmsBaseLocations
from a in bill
where a.b.layerNum == b.layerNum
&& b.locDeep == 2
&& b.locRow == (a.b.locRow % 2 == 0 ? a.b.locRow - 1 : a.b.locRow + 1)
&& a.b.locColumn == b.locColumn
&& b.locationStatus == "1"
&& string.IsNullOrEmpty(b.containerCode)
select new { b };//在上面的基础上获取对应托盘的外侧库位的空库位信息
WmsBaseLocation? wmsBaseLocation = outBill.FirstOrDefault()?.b;//先找相同物料的外侧库位
wmsBaseLocation ??= wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault(t => t.locDeep == 1);//找不到再找深库位
wmsBaseLocation ??= wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode)).FirstOrDefault();//找不到再找任意库位
if (wmsBaseLocations.Count > 0 && wmsBaseLocation != null)
{
dbContext.Remove(wcsTask);
WcsTask newTask = CoreMapper.Map<WcsTask>(wcsTask);
newTask.objid = StaticData.SnowId.NextId();
newTask.taskStatus = 0;//创建状态
newTask.updateTime = DateTime.Now;
newTask.currPointId = baseEquip.objid;
newTask.currPointNo = baseEquip.equipNo;
newTask.nextPointId = AgvEquip.objid;
newTask.nextPointNo = AgvEquip.equipNo;
newTask.endPointId = wmsBaseLocation.locationId;
newTask.endPointNo = wmsBaseLocation.locationCode;
newTask.taskType = 39;
newTask.useFlag = 1;
wmsBaseLocation.locationStatus = "2";
dbContext.Update(wmsBaseLocation);
dbContext.Add(newTask);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(newTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
}
else
{
Console.WriteLine(DateTime.Now + ":三楼楼接驳位调度入库任务,未找到库位");
_logger.Info("三楼接驳位调度入库任务,未找到库位");
}
}
}
}
else if (wcsTask.taskStatus == 6)//小车任务是完成状态,说明是出库
{
@ -167,7 +180,7 @@ namespace Khd.Core.Wcs.Wcs
}
}
LogManager.Error(ex);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
finally
{

@ -1077,6 +1077,9 @@ namespace Khd.Core.Wpf.Form
{
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == 10);
baseEquip.endStationCode = string.Empty;
dbContext.Update(baseEquip);
var wcsCmd = dbContext.WcsCmd
.Where(t => t.cmdStatus == 6 || t.cmdStatus == 3)
.FirstOrDefault();

Loading…
Cancel
Save