1 year ago
parent c20204a02f
commit 18f4c0a8a1

@ -394,6 +394,7 @@ namespace Khd.Core.Application
WcsTaskManual wcsTaskManual = new WcsTaskManual();
wcsTaskManual.taskType = 999;
wcsTaskManual.objid = _snowId.NextId();
wcsTaskManual.startPointNo = callMaterial.locationCode;
wcsTaskManual.orderId = Convert.ToInt64(callMaterial.rawOutstockId);
_dbContext.Add(wcsTaskManual);
_dbContext.SaveChanges();

@ -0,0 +1,35 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Khd.Core.Domain.Dto.waring
{
public enum WaringType
{
Plc = 5001,
U线Plc,
Plc,
,
,
,
,
,
CTU,
CTU,
,
,
,
,
,
,
,
,
,
,
,
}
}

@ -3,6 +3,7 @@
public class CallMaterial
{
public string rawOutstockId { get; set; }
public string locationCode { get; set; }
public string method { get; set; }
}

@ -35,20 +35,18 @@ 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
{
//dbContext.WmsBaseLocation.Update(t => new Dictionary<string, WmsBaseLocation>() { { "1", new WmsBaseLocation { locationStatus="1" } } });
StaticData.BasePlcpointList = dbContext.BasePlcpoint.Where(t => t.isDelete == 0).ToList();//设备交互用
StaticData.basePlcs = dbContext.BasePlc.ToList();//陈工Agv和设备信息推送
StaticData.BaseEquip = dbContext.BaseEquip.ToList();//设备信息
StaticData.BaseDictionary = dbContext.BaseDictionary.ToList();//字典表Agv任务模板
StaticData.DmsBaseAlarmRuleList = dbContext.DmsBaseAlarmRule.ToList();
foreach (var plcConfig in StaticData.PlcConfigs)
{
if (!StaticData.PlcDic.Any(t => t.Key == plcConfig.Code))
@ -67,11 +65,9 @@ namespace Khd.Core.Wcs
StaticData.PlcDic.TryAdd(plcConfig.Code, plc);
}
}
//创建定时器
SystemTimer systemTimer = new(_host);
systemTimer.Start();
//创建任务
CreateTaskByRecord createTaskByRecord = new(_host);
createTaskByRecord.StartPoint();
@ -125,12 +121,7 @@ namespace Khd.Core.Wcs
Console.WriteLine(ex.Message);
logger.Error(ex.Message + "\n" + ex.StackTrace);
}
}
}
}

@ -1,11 +1,15 @@
using Khd.Core.Domain.Models;
using Khd.Core.Domain.Dto.waring;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library.Mapper;
using Khd.Core.Wcs.Global;
using Z.EntityFramework.Plus;
namespace Khd.Core.Wcs
{
public class SystemData
{
public readonly static int maxTray = 5;
public readonly static int maxTray = 10;
private static long _serialNo { get; set; } = 1;
@ -98,8 +102,69 @@ namespace Khd.Core.Wcs
}
}
public static void InsertWaringLog(DefaultDbContext dbContext, WaringType WaringType, string message = "")
{
try
{
var alarmRule = StaticData.DmsBaseAlarmRuleList.Where(t => t.AlarmRuleId == (long)WaringType).FirstOrDefault();
if (alarmRule != null)
{
var alarmTime = dbContext.DmsRecordAlarmTime.Where(t => t.AlarmRuleId == (long)WaringType).FirstOrDefault();
if (alarmTime == null)
{
alarmTime = new DmsRecordAlarmTime()
{
AlarmId = StaticData.SnowId.NextId(),
AlarmRuleId = (long)WaringType,
DeviceId = alarmRule.DeviceId,
AlarmBeginTime = DateTime.Now,
ContinueTime = alarmRule.ContinueTime,
AlarmReason = alarmRule.AlarmReason,
HandleSuggest = alarmRule.HandleSuggest,
CreateBy = "WCS",
CreateTime = DateTime.Now,
AlarmData = message
};
var dmsRecordAlarmInfo = CoreMapper.Map<DmsRecordAlarmInfo>(alarmTime);
dmsRecordAlarmInfo.NoticeStatus = "0";
dmsRecordAlarmInfo.AlarmStatus = "0";
dbContext.Add(dmsRecordAlarmInfo);
dbContext.Add(alarmTime);
dbContext.SaveChanges();
}
}
}
catch
{
}
}
public static void DeleteWaringLog(DefaultDbContext dbContext, WaringType WaringType)
{
try
{
var alarmTime = dbContext.DmsRecordAlarmTime.Where(t => t.AlarmRuleId == (long)WaringType).FirstOrDefault();
if (alarmTime != null)
{
dbContext.Remove(alarmTime);
dbContext.DmsRecordAlarmInfo.Where(t => t.AlarmId == alarmTime.AlarmId)
.Update(t => new DmsRecordAlarmInfo() { AlarmStatus = "2" });
dbContext.SaveChanges();
}
}
catch
{
}
}
public readonly static object SecondTaskLock = new();
public readonly static object ThirdTaskLock = new();
public readonly static object FiveTaskLock = new();
}
}

@ -21,6 +21,7 @@ namespace Khd.Core.Wcs.Wcs
Thread OrderBakThread = new Thread(MonitorInLocatorPoint);
OrderBakThread.Start();
}
public void MonitorInLocatorPoint()
{
// 创建一个定时器对象设置时间间隔为24小时

@ -378,7 +378,7 @@ namespace Khd.Core.Wcs.Wcs
.Where(t => t.locationStatus == "1")
.OrderByDescending(t => t.locColumn)
.ToList();
List<string> containerCodes = wmsBaseLocations
.Where(t => t.locDeep == 1)
.Select(t => t.containerCode).ToList();//深库位的托盘
@ -551,77 +551,77 @@ namespace Khd.Core.Wcs.Wcs
{
BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == 35);
#region 原逻辑
//if (baseEquip.emptyCount == (SystemData.maxTray / 2))
//{
// var endEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipType == 15 && t.equipStatus == 1 && t.emptyCount == (SystemData.maxTray / 2));
// if (endEquip != null)
// {
// var wcsTask = new WcsTask()
// {
// objid = StaticData.SnowId.NextId(),
// serialNo = SystemData.GetSerialNo(dbContext),
// taskType = 40,
// nextPointId = agvEquip.objid,
// nextPointNo = agvEquip.equipNo,
// endPointId = baseEquip.objid,
// endPointNo = baseEquip.equipNo,
// currPointId = endEquip.objid,
// currPointNo = endEquip.equipNo,
// equipmentNo = agvEquip.equipNo,
// useFlag = 1,
// qty = 5,
// isEmpty = "1",
// taskStatus = 0,
// createBy = "WCS",
// createTime = DateTime.Now,
// floorNo = 3,
// fromFloorNo = 3,
// masterId = 0,
// orderId = 0,
// materialId = 0,
// };
// WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
// dbContext.Add(wcsTask);
// dbContext.Add(wcsTaskLog);
// dbContext.SaveChanges();
// }
// else
// {
// endEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipType == 15 && t.equipStatus == 0 && t.emptyCount == 0);
// if (endEquip != null)
// {
// var wcsTask = new WcsTask()
// {
// objid = StaticData.SnowId.NextId(),
// serialNo = SystemData.GetSerialNo(dbContext),
// taskType = 43,
// nextPointId = agvEquip.objid,
// nextPointNo = agvEquip.equipNo,
// endPointId = endEquip.objid,
// endPointNo = endEquip.equipNo,
// currPointId = baseEquip.objid,
// currPointNo = baseEquip.equipNo,
// equipmentNo = agvEquip.equipNo,
// useFlag = 1,
// qty = 5,
// isEmpty = "1",
// taskStatus = 0,
// createBy = "WCS",
// createTime = DateTime.Now,
// floorNo = 3,
// fromFloorNo = 3,
// masterId = 0,
// orderId = 0,
// materialId = 0,
// };
// WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
// dbContext.Add(wcsTask);
// dbContext.Add(wcsTaskLog);
// dbContext.SaveChanges();
// }
// }
//}
//else
if (baseEquip.emptyCount == (SystemData.maxTray / 2))
{
var endEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipType == 15 && t.equipStatus == 1 && t.emptyCount == (SystemData.maxTray / 2));
if (endEquip != null)
{
var wcsTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
serialNo = SystemData.GetSerialNo(dbContext),
taskType = 40,
nextPointId = agvEquip.objid,
nextPointNo = agvEquip.equipNo,
endPointId = baseEquip.objid,
endPointNo = baseEquip.equipNo,
currPointId = endEquip.objid,
currPointNo = endEquip.equipNo,
equipmentNo = agvEquip.equipNo,
useFlag = 1,
qty = 5,
isEmpty = "1",
taskStatus = 0,
createBy = "WCS",
createTime = DateTime.Now,
floorNo = 3,
fromFloorNo = 3,
masterId = 0,
orderId = 0,
materialId = 0,
};
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
dbContext.Add(wcsTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
}
else
{
endEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipType == 15 && t.equipStatus == 0 && t.emptyCount == 0);
if (endEquip != null)
{
var wcsTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
serialNo = SystemData.GetSerialNo(dbContext),
taskType = 43,
nextPointId = agvEquip.objid,
nextPointNo = agvEquip.equipNo,
endPointId = endEquip.objid,
endPointNo = endEquip.equipNo,
currPointId = baseEquip.objid,
currPointNo = baseEquip.equipNo,
equipmentNo = agvEquip.equipNo,
useFlag = 1,
qty = 5,
isEmpty = "1",
taskStatus = 0,
createBy = "WCS",
createTime = DateTime.Now,
floorNo = 3,
fromFloorNo = 3,
masterId = 0,
orderId = 0,
materialId = 0,
};
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
dbContext.Add(wcsTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
}
}
}
else
#endregion
if (baseEquip.emptyCount == SystemData.maxTray)//达到最大值
{
@ -936,8 +936,6 @@ namespace Khd.Core.Wcs.Wcs
{
WcsTaskManual? wcsTaskManual = dbContext.WcsTaskManual.Where(t => t.taskType == 999).FirstOrDefault();//调接口生成的任务
if (wcsTaskManual != null)
{
var wmsRawOutstock = dbContext.WmsRawOutstock.FirstOrDefault(t => t.rawOutstockId == wcsTaskManual.orderId);
@ -956,9 +954,11 @@ namespace Khd.Core.Wcs.Wcs
.Where(t => t.locationScrapType == "1")
.Where(t => t.warehouseId == 311)
.Where(t => t.locationStatus == "1").ToList();
var wmsBaseLocations = AllWmsBaseLocations
.Where(t => t.warehouseId == 311)
.Where(t => wmsRawStockLocations.Contains(t.locationCode))
.WhereIf(!string.IsNullOrEmpty(wcsTaskManual.startPointNo),t=>t.locationCode== wcsTaskManual.startPointNo)
.ToList();
var bill = from a in wmsBaseLocations
from b in wmsRawStocks
@ -966,17 +966,26 @@ namespace Khd.Core.Wcs.Wcs
select new { a, b };
WmsBaseLocation? wmsBaseLocation = null;
WmsRawStock? wmsRawStock = null;
bill = bill.OrderBy(t => t.b.instockDate.Value.Date);//按某个时间段
var inLocations = AllWmsBaseLocations.Where(t => t.locDeep == 1).Where(t => !string.IsNullOrEmpty(t.containerCode)).ToList();
var outLocations = AllWmsBaseLocations.Where(t => t.locDeep == 2).Where(t => string.IsNullOrEmpty(t.containerCode)).ToList();
var list = new List<string>();
foreach (var item in inLocations)
{
if (outLocations.Where(t => t.locRow == (item.locRow % 2 == 0 ? item.locRow - 1 : item.locRow + 1))
.Where(t => t.locColumn == item.locColumn).Any())
{
list.Add(item.locationCode);
}
}
bill = bill.OrderBy(t => list.Contains(t.a.locationCode) ? 0 : 1).OrderBy(t => t.b.instockDate.Value.Date);//按某个时间段
#region 如果有需要优先投料的库位,则该库位优先投料
List<string> PreferredOutsLocation = dbContext.WmsRawPreferredOut.Where(x=>x.WarehouseId==311).ToList().Select(x=>x.LocationCode).ToList();
if (PreferredOutsLocation!=null && PreferredOutsLocation.Count > 0)
List<string> PreferredOutsLocation = dbContext.WmsRawPreferredOut.Where(x => x.WarehouseId == 311).ToList().Select(x => x.LocationCode).ToList();
if (PreferredOutsLocation != null && PreferredOutsLocation.Count > 0)
{
bill.OrderBy(t => PreferredOutsLocation.Contains(t.a.locationCode) ? 0 : 1);
}
#endregion
#endregion
foreach (var item in bill)
{
@ -1108,7 +1117,7 @@ namespace Khd.Core.Wcs.Wcs
}
}
else if(fromBaseLocation != null&& fromBaseLocation.locationStatus != "1")
else if (fromBaseLocation != null && fromBaseLocation.locationStatus != "1")
{
//浅库位状态异常,找寻下一个可出库库存
continue;
@ -1177,6 +1186,7 @@ namespace Khd.Core.Wcs.Wcs
dbContext.Add(wcsTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
break;
}
}
}
@ -1344,6 +1354,18 @@ namespace Khd.Core.Wcs.Wcs
select new { a, b };
BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == 28);
var inLocations = AllWmsBaseLocations.Where(t => t.locDeep == 1).Where(t => !string.IsNullOrEmpty(t.containerCode)).ToList();
var outLocations = AllWmsBaseLocations.Where(t => t.locDeep == 2).Where(t => string.IsNullOrEmpty(t.containerCode)).ToList();
var list = new List<string>();
foreach (var location in inLocations)
{
if (outLocations.Where(t => t.locRow == (location.locRow % 2 == 0 ? location.locRow - 1 : location.locRow + 1))
.Where(t => t.locColumn == location.locColumn).Any())
{
list.Add(location.locationCode);
}
}
bill = bill.OrderBy(t => list.Contains(t.a.locationCode) ? 0 : 1);
foreach (var b in bill)
{
item.executeStatus = "1";
@ -1677,6 +1699,18 @@ namespace Khd.Core.Wcs.Wcs
WmsProductStock? stock = null;
BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == 8);
BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == 1);
var inLocations = AllWmsBaseLocations.Where(t => t.locDeep == 1).Where(t => !string.IsNullOrEmpty(t.containerCode)).ToList();
var outLocations = AllWmsBaseLocations.Where(t => t.locDeep == 2).Where(t => string.IsNullOrEmpty(t.containerCode)).ToList();
var list = new List<string>();
foreach (var loc in inLocations)
{
if (outLocations.Where(t => t.locRow == (loc.locRow % 2 == 0 ? loc.locRow - 1 : loc.locRow + 1))
.Where(t => t.locColumn == loc.locColumn).Any())
{
list.Add(loc.locationCode);
}
}
bill = bill.OrderBy(t => list.Contains(t.a.locationCode) ? 0 : 1);
foreach (var b in bill)
{
item.executeStatus = "1";
@ -2220,7 +2254,7 @@ namespace Khd.Core.Wcs.Wcs
tasks.Add(wcsTask);
location.locationStatus = "6";
location.updateBy = "WCS";
// location.ContainerStatus = "2";
// location.ContainerStatus = "2";
location.updateTime = DateTime.Now;
dbContext.Update(location);
dbContext.Update(stock);
@ -2336,6 +2370,18 @@ namespace Khd.Core.Wcs.Wcs
BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == 28);
BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.equipNo == item.endStationCode);
var inLocations = AllWmsBaseLocations.Where(t => t.locDeep == 1).Where(t => !string.IsNullOrEmpty(t.containerCode)).ToList();
var outLocations = AllWmsBaseLocations.Where(t => t.locDeep == 2).Where(t => string.IsNullOrEmpty(t.containerCode)).ToList();
var list = new List<string>();
foreach (var location in inLocations)
{
if (outLocations.Where(t => t.locRow == (location.locRow % 2 == 0 ? location.locRow - 1 : location.locRow + 1))
.Where(t => t.locColumn == location.locColumn).Any())
{
list.Add(location.locationCode);
}
}
bill = bill.OrderBy(t => list.Contains(t.a.locationCode) ? 0 : 1);
foreach (var b in bill)
{
item.executeStatus = "1";

@ -1,4 +1,5 @@
using Khd.Core.Domain.Models;
using Khd.Core.Domain.Dto.waring;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library;
using Khd.Core.Library.Mapper;
@ -421,8 +422,10 @@ namespace Khd.Core.Wcs.Wcs
}
}
else
{ //TODO 物料未绑定仓库,添加报警
{
//TODO 物料未绑定仓库,添加报警
SystemData.InsertWaringLog(dbContext,WaringType.);
continue;
}
}
}
@ -493,6 +496,7 @@ namespace Khd.Core.Wcs.Wcs
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
}
SystemData.DeleteWaringLog(dbContext,WaringType.);
Thread.Sleep(3000);
}
}
@ -737,6 +741,7 @@ namespace Khd.Core.Wcs.Wcs
transaction.Commit();
}
}
SystemData.DeleteWaringLog(dbContext, WaringType.);
break;
}
else
@ -764,6 +769,7 @@ namespace Khd.Core.Wcs.Wcs
}
catch
{
}
if (ex is PlcException)
{
@ -771,6 +777,7 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
SystemData.InsertWaringLog(dbContext, WaringType., ex.Message);
_logger.Error(ex.Message + "\n" + ex.StackTrace);
}
}

@ -1,4 +1,5 @@
using Khd.Core.Domain.Dto.TaskType;
using Khd.Core.Domain.Dto.waring;
using Khd.Core.Domain.Dto.webapi;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;

@ -290,21 +290,21 @@ namespace Khd.Core.Wcs.Wcs
}
}
}
if(wmsBaseLocation == null)
{ // 找深库位有库存的库位对应的浅库位
var stockLocations = wmsBaseLocations.Where(x => !string.IsNullOrEmpty(x.containerCode) && x.locDeep==1).ToList();
foreach (var item in stockLocations)
{
wmsBaseLocation = wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus == "1")
.Where(t => t.locDeep == 2 && t.locColumn == item.locColumn)
.Where(t => t.locRow == (item.locRow % 2 == 0 ? (item.locRow - 1) : (item.locRow + 1)))
.FirstOrDefault();
if (wmsBaseLocation != null)
{
break;
}
}
}
//if(wmsBaseLocation == null)
//{ // 找深库位有库存的库位对应的浅库位
// var stockLocations = wmsBaseLocations.Where(x => !string.IsNullOrEmpty(x.containerCode) && x.locDeep==1).ToList();
// foreach (var item in stockLocations)
// {
// wmsBaseLocation = wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus == "1")
// .Where(t => t.locDeep == 2 && t.locColumn == item.locColumn)
// .Where(t => t.locRow == (item.locRow % 2 == 0 ? (item.locRow - 1) : (item.locRow + 1)))
// .FirstOrDefault();
// if (wmsBaseLocation != null)
// {
// break;
// }
// }
//}
if(wmsBaseLocation == null)
{ // 在所有符合条件的库位里,找一个库位,优先深库位,但是如果是深库位,需要判断浅库位状态是否正常
var searchLocations = wmsBaseLocations.Where(x => string.IsNullOrEmpty(x.containerCode) && x.locationStatus == "1").OrderBy(x=>x.locDeep).ToList();

@ -84,7 +84,7 @@ namespace Khd.Core.Wcs.Wcs
if (wcsTask.taskType != 99)//不是人工任务
{
bool hasTask = dbContext.WcsTask.Where(t => t.endPointId == inEquip.objid).Any();
if (agvPutValue != null && Convert.ToInt32(agvPutValue) == 0 && !hasTask)//小包入口要料
if (agvPutValue != null && Convert.ToInt32(agvPutValue) == 1 && !hasTask)//小包入口要料
{
dbContext.WcsTask.Remove(wcsTask);//删除原本的任务
WcsTask newTask = CoreMapper.Map<WcsTask>(wcsTask);
@ -142,7 +142,7 @@ namespace Khd.Core.Wcs.Wcs
if (wcsTask.endPointId == 36)//目的地是小包入口
{
bool hasTask = dbContext.WcsTask.Where(t => t.endPointId == inEquip.objid).Any();
if (agvPutValue != null && Convert.ToInt32(agvPutValue) == 0 && !hasTask)//小包入口要料
if (agvPutValue != null && Convert.ToInt32(agvPutValue) == 1 && !hasTask)//小包入口要料
{
dbContext.WcsTask.Remove(wcsTask);
WcsTask newTask = CoreMapper.Map<WcsTask>(wcsTask);

@ -1,4 +1,6 @@
using Khd.Core.Domain.Dto.webapi;
using AngleSharp.Common;
using Khd.Core.Domain.Dto.waring;
using Khd.Core.Domain.Dto.webapi;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library;
@ -74,9 +76,83 @@ namespace Khd.Core.Wcs.Wcs
// IsBackground = true
//};
//AgvAlarmThread.Start();
var locationThread = new Thread(LocationLogic)
{
Name = "LocationThread",
IsBackground = true
};
locationThread.Start();
Console.WriteLine($"{DateTime.Now}: SystemTimer started");
}
private void LocationLogic()
{
using var scope = host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
List<BasePlc> basePlcs = dbContext.BasePlc.Where(t => t.Station.Contains("库位")).ToList();
var list = basePlcs.Select(t => new
{
t.Id,
Station = t.Station.Replace("库位", ""),
t.Address,
locRow = t.Name.Substring(t.Name.IndexOf('[') + 1, 1),
locColumn = t.Name.Substring(t.Name.IndexOf(',') + 1).Replace("]", "").Replace("五楼半成品[", ""),
}).Select(t => new
{
t.Id,
t.Station,
t.Address,
t.locRow,
locColumn = t.locColumn.Substring(0, t.locColumn.IndexOf(',') == -1 ? t.locColumn.Length : t.locColumn.IndexOf(',')),
layerNum = t.locColumn.IndexOf(',') == -1 ? "1" : t.locColumn.Substring(t.locColumn.IndexOf(',') == -1 ? 0 : t.locColumn.IndexOf(',') + 1)
});
while (true)
{
try
{
var locations = dbContext.WmsBaseLocation.OrderBy(t => t.locRow).OrderBy(t => t.locColumn).ToList();
foreach (var item in list)
{
WmsBaseLocation? wmsBaseLocation = locations.Where(t => t.locRow.ToString() == item.locRow)
.Where(t => t.locColumn.ToString() == item.locColumn)
.Where(t => t.layerNum.ToString() == item.layerNum)
.Where(t => t.warehouseId.ToString() == item.Station)
.FirstOrDefault();
if (wmsBaseLocation != null && !string.IsNullOrEmpty(wmsBaseLocation.containerCode))
{
if (wmsBaseLocation.warehouseId == 512)
{
if (wmsBaseLocation.ContainerStatus == "1")
{
StaticData.PlcDic[2].Write(item.Address, true);
}
else
{
StaticData.PlcDic[2].Write(item.Address, false);
}
}
else
{
StaticData.PlcDic[2].Write(item.Address, true);
}
}
else
{
StaticData.PlcDic[2].Write(item.Address, false);
}
}
}
catch
{
}
Thread.Sleep(1000 * 60 * 5);
}
}
private void AgvAlarmLogic()
{
using var scope = host.Services.CreateScope();
@ -288,6 +364,7 @@ namespace Khd.Core.Wcs.Wcs
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
BasePlcpoint HeartBeat30 = StaticData.BasePlcpointList.First(t => t.plcpointNo == "putTray");
int errorCount = 0;
bool isOver = false;
while (true)
{
try
@ -296,45 +373,47 @@ namespace Khd.Core.Wcs.Wcs
{
_logger.Error($"Plc220短线重连失败超过{errorCount}次");
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
var dmsRecordAlarmTime = dbContext.DmsRecordAlarmTime.Where(t => t.CreateBy == "WCS" && t.DeviceId == 15).FirstOrDefault();
if (dmsRecordAlarmTime == null)
{
var alarmTime = new DmsRecordAlarmTime
{
DeviceId = 15,
AlarmBeginTime = DateTime.Now,
AlarmReason = "Plc220短线重连失败",
HandleSuggest = "检查Plc220网络连接",
AlarmRuleId = 4,
ContinueTime = 10000,
CreateBy = "WCS",
CreateTime = DateTime.Now,
};
var dmsRecordAlarmInfo = CoreMapper.Map<DmsRecordAlarmInfo>(alarmTime);
dmsRecordAlarmInfo.AlarmStatus = "0";
dmsRecordAlarmInfo.NoticeStatus = "0";
dbContext.Add(dmsRecordAlarmInfo);
dbContext.SaveChanges();
}
SystemData.InsertWaringLog(dbContext, WaringType.Plc, $"Plc220短线重连失败超过{errorCount}次");
//var dmsRecordAlarmTime = dbContext.DmsRecordAlarmTime.Where(t => t.CreateBy == "WCS" && t.DeviceId == 15).FirstOrDefault();
//if (dmsRecordAlarmTime == null)
//{
// var alarmTime = new DmsRecordAlarmTime
// {
// DeviceId = 15,
// AlarmBeginTime = DateTime.Now,
// AlarmReason = "Plc220短线重连失败",
// HandleSuggest = "检查Plc220网络连接",
// AlarmRuleId = 4,
// ContinueTime = 10000,
// CreateBy = "WCS",
// CreateTime = DateTime.Now,
// };
// var dmsRecordAlarmInfo = CoreMapper.Map<DmsRecordAlarmInfo>(alarmTime);
// dmsRecordAlarmInfo.AlarmStatus = "0";
// dmsRecordAlarmInfo.NoticeStatus = "0";
// dbContext.Add(dmsRecordAlarmInfo);
// dbContext.SaveChanges();
//}
}
StaticData.PlcDic[2].Read(HeartBeat30.plcpointAddress);
if (errorCount > 0)
if (errorCount > 0 && isOver)
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
var dmsRecordAlarmTime = dbContext.DmsRecordAlarmTime.Where(t => t.CreateBy == "WCS" && t.DeviceId == 15).FirstOrDefault();
if (dmsRecordAlarmTime != null)
{
dbContext.DmsRecordAlarmTime.Remove(dmsRecordAlarmTime);
dbContext.DmsRecordAlarmInfo.Where(t => t.AlarmId == dmsRecordAlarmTime.AlarmId).Update(t => new DmsRecordAlarmInfo
{
AlarmEndTime = DateTime.Now,
AlarmStatus = "1",
UpdateBy = "WCS",
UpdateTime = DateTime.Now
});
dbContext.SaveChanges();
errorCount = 0;
}
SystemData.DeleteWaringLog(dbContext, WaringType.Plc);
//var dmsRecordAlarmTime = dbContext.DmsRecordAlarmTime.Where(t => t.CreateBy == "WCS" && t.DeviceId == 15).FirstOrDefault();
//if (dmsRecordAlarmTime != null)
//{
// dbContext.DmsRecordAlarmTime.Remove(dmsRecordAlarmTime);
// dbContext.DmsRecordAlarmInfo.Where(t => t.AlarmId == dmsRecordAlarmTime.AlarmId).Update(t => new DmsRecordAlarmInfo
// {
// AlarmEndTime = DateTime.Now,
// AlarmStatus = "1",
// UpdateBy = "WCS",
// UpdateTime = DateTime.Now
// });
// dbContext.SaveChanges();
// errorCount = 0;
//}
}
}
catch
@ -343,10 +422,12 @@ namespace Khd.Core.Wcs.Wcs
{
StaticData.PlcDic[2] = new Plc.S7.Plc(StaticData.PlcDic[2].CPU, StaticData.PlcDic[2].IP, StaticData.PlcDic[2].Port, StaticData.PlcDic[2].Rack, StaticData.PlcDic[2].Slot);
StaticData.PlcDic[2].Open();
isOver = true;
}
catch (Exception ex2)
{
errorCount++;
isOver = false;
_logger.Error("Plc短线重连失败" + ex2.Message);
}
}
@ -363,6 +444,7 @@ namespace Khd.Core.Wcs.Wcs
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
BasePlcpoint HeartBeat30 = StaticData.BasePlcpointList.First(t => t.plcpointNo == "HeartBeat30");
bool heartBeatCount = false;
bool isOver = false;
int errorCount = 0;
while (true)
{
@ -372,47 +454,49 @@ namespace Khd.Core.Wcs.Wcs
{
_logger.Error($"Plc30短线重连失败超过{errorCount}次");
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
var dmsRecordAlarmTime = dbContext.DmsRecordAlarmTime.Where(t => t.CreateBy == "WCS" && t.DeviceId == 13).FirstOrDefault();
if (dmsRecordAlarmTime == null)
{
var alarmTime = new DmsRecordAlarmTime
{
DeviceId = 13,
AlarmBeginTime = DateTime.Now,
AlarmReason = "Plc30短线重连失败",
HandleSuggest = "检查Plc30网络连接",
AlarmRuleId = 4,
ContinueTime = 10000,
CreateBy = "WCS",
CreateTime = DateTime.Now,
};
var dmsRecordAlarmInfo = CoreMapper.Map<DmsRecordAlarmInfo>(alarmTime);
dmsRecordAlarmInfo.AlarmStatus = "0";
dmsRecordAlarmInfo.NoticeStatus = "0";
dbContext.Add(dmsRecordAlarmTime);
dbContext.Add(dmsRecordAlarmInfo);
dbContext.SaveChanges();
}
SystemData.InsertWaringLog(dbContext, WaringType.Plc, $"Plc30短线重连失败超过{errorCount}次");
//var dmsRecordAlarmTime = dbContext.DmsRecordAlarmTime.Where(t => t.CreateBy == "WCS" && t.DeviceId == 13).FirstOrDefault();
//if (dmsRecordAlarmTime == null)
//{
// var alarmTime = new DmsRecordAlarmTime
// {
// DeviceId = 13,
// AlarmBeginTime = DateTime.Now,
// AlarmReason = "Plc30短线重连失败",
// HandleSuggest = "检查Plc30网络连接",
// AlarmRuleId = 4,
// ContinueTime = 10000,
// CreateBy = "WCS",
// CreateTime = DateTime.Now,
// };
// var dmsRecordAlarmInfo = CoreMapper.Map<DmsRecordAlarmInfo>(alarmTime);
// dmsRecordAlarmInfo.AlarmStatus = "0";
// dmsRecordAlarmInfo.NoticeStatus = "0";
// dbContext.Add(dmsRecordAlarmTime);
// dbContext.Add(dmsRecordAlarmInfo);
// dbContext.SaveChanges();
//}
}
heartBeatCount = !heartBeatCount;
StaticData.PlcDic[0].WriteToPoint(HeartBeat30.plcpointAddress, heartBeatCount, HeartBeat30.plcpointLength?.ToString());
if (errorCount > 0)
if (errorCount > 0 && isOver)
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
var dmsRecordAlarmTime = dbContext.DmsRecordAlarmTime.Where(t => t.CreateBy == "WCS" && t.DeviceId == 13).FirstOrDefault();
if (dmsRecordAlarmTime != null)
{
dbContext.DmsRecordAlarmTime.Remove(dmsRecordAlarmTime);
dbContext.DmsRecordAlarmInfo.Where(t => t.AlarmId == dmsRecordAlarmTime.AlarmId).Update(t => new DmsRecordAlarmInfo
{
AlarmEndTime = DateTime.Now,
AlarmStatus = "1",
UpdateBy = "WCS",
UpdateTime = DateTime.Now
});
dbContext.SaveChanges();
errorCount = 0;
}
SystemData.DeleteWaringLog(dbContext, WaringType.Plc);
//var dmsRecordAlarmTime = dbContext.DmsRecordAlarmTime.Where(t => t.CreateBy == "WCS" && t.DeviceId == 13).FirstOrDefault();
//if (dmsRecordAlarmTime != null)
//{
// dbContext.DmsRecordAlarmTime.Remove(dmsRecordAlarmTime);
// dbContext.DmsRecordAlarmInfo.Where(t => t.AlarmId == dmsRecordAlarmTime.AlarmId).Update(t => new DmsRecordAlarmInfo
// {
// AlarmEndTime = DateTime.Now,
// AlarmStatus = "1",
// UpdateBy = "WCS",
// UpdateTime = DateTime.Now
// });
// dbContext.SaveChanges();
// errorCount = 0;
//}
}
}
catch
@ -421,10 +505,12 @@ namespace Khd.Core.Wcs.Wcs
{
StaticData.PlcDic[0] = new Plc.S7.Plc(StaticData.PlcDic[0].CPU, StaticData.PlcDic[0].IP, StaticData.PlcDic[0].Port, StaticData.PlcDic[0].Rack, StaticData.PlcDic[0].Slot);
StaticData.PlcDic[0].Open();
isOver = true;
}
catch (Exception ex2)
{
errorCount++;
isOver = false;
_logger.Error("Plc短线重连失败" + ex2.Message);
}
}
@ -441,6 +527,7 @@ namespace Khd.Core.Wcs.Wcs
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
BasePlcpoint HeartBeat31 = StaticData.BasePlcpointList.First(t => t.plcpointNo == "CTUHeart");
bool heartBeatCount = false;
bool isOver = false;
int errorCount = 0;
while (true)
{
@ -450,46 +537,48 @@ namespace Khd.Core.Wcs.Wcs
{
_logger.Error($"Plc31短线重连失败超过{errorCount}次");
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
var dmsRecordAlarmTime = dbContext.DmsRecordAlarmTime.Where(t => t.CreateBy == "WCS" && t.DeviceId == 14).FirstOrDefault();
if (dmsRecordAlarmTime == null)
{
var alarmTime = new DmsRecordAlarmTime
{
DeviceId = 14,
AlarmBeginTime = DateTime.Now,
AlarmReason = "Plc31短线重连失败",
HandleSuggest = "检查Plc31网络连接",
AlarmRuleId = 4,
ContinueTime = 10000,
CreateBy = "WCS",
CreateTime = DateTime.Now,
};
var dmsRecordAlarmInfo = CoreMapper.Map<DmsRecordAlarmInfo>(alarmTime);
dmsRecordAlarmInfo.AlarmStatus = "0";
dmsRecordAlarmInfo.NoticeStatus = "0";
dbContext.Add(dmsRecordAlarmInfo);
dbContext.SaveChanges();
}
SystemData.InsertWaringLog(dbContext, WaringType.U线Plc, $"Plc31短线重连失败超过{errorCount}次");
//var dmsRecordAlarmTime = dbContext.DmsRecordAlarmTime.Where(t => t.CreateBy == "WCS" && t.DeviceId == 14).FirstOrDefault();
//if (dmsRecordAlarmTime == null)
//{
// var alarmTime = new DmsRecordAlarmTime
// {
// DeviceId = 14,
// AlarmBeginTime = DateTime.Now,
// AlarmReason = "Plc31短线重连失败",
// HandleSuggest = "检查Plc31网络连接",
// AlarmRuleId = 4,
// ContinueTime = 10000,
// CreateBy = "WCS",
// CreateTime = DateTime.Now,
// };
// var dmsRecordAlarmInfo = CoreMapper.Map<DmsRecordAlarmInfo>(alarmTime);
// dmsRecordAlarmInfo.AlarmStatus = "0";
// dmsRecordAlarmInfo.NoticeStatus = "0";
// dbContext.Add(dmsRecordAlarmInfo);
// dbContext.SaveChanges();
//}
}
heartBeatCount = !heartBeatCount;
StaticData.PlcDic[1].WriteToPoint(HeartBeat31.plcpointAddress, heartBeatCount, HeartBeat31.plcpointLength?.ToString());
if (errorCount > 0)
if (errorCount > 0 && isOver)
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
var dmsRecordAlarmTime = dbContext.DmsRecordAlarmTime.Where(t => t.CreateBy == "WCS" && t.DeviceId == 14).FirstOrDefault();
if (dmsRecordAlarmTime != null)
{
dbContext.DmsRecordAlarmTime.Remove(dmsRecordAlarmTime);
dbContext.DmsRecordAlarmInfo.Where(t => t.AlarmId == dmsRecordAlarmTime.AlarmId).Update(t => new DmsRecordAlarmInfo
{
AlarmEndTime = DateTime.Now,
AlarmStatus = "1",
UpdateBy = "WCS",
UpdateTime = DateTime.Now
});
dbContext.SaveChanges();
errorCount = 0;
}
SystemData.DeleteWaringLog(dbContext, WaringType.U线Plc);
//var dmsRecordAlarmTime = dbContext.DmsRecordAlarmTime.Where(t => t.CreateBy == "WCS" && t.DeviceId == 14).FirstOrDefault();
//if (dmsRecordAlarmTime != null)
//{
// dbContext.DmsRecordAlarmTime.Remove(dmsRecordAlarmTime);
// dbContext.DmsRecordAlarmInfo.Where(t => t.AlarmId == dmsRecordAlarmTime.AlarmId).Update(t => new DmsRecordAlarmInfo
// {
// AlarmEndTime = DateTime.Now,
// AlarmStatus = "1",
// UpdateBy = "WCS",
// UpdateTime = DateTime.Now
// });
// dbContext.SaveChanges();
// errorCount = 0;
//}
}
}
catch (Exception ex)
@ -500,10 +589,12 @@ namespace Khd.Core.Wcs.Wcs
{
StaticData.PlcDic[1] = new Plc.S7.Plc(StaticData.PlcDic[1].CPU, StaticData.PlcDic[1].IP, StaticData.PlcDic[1].Port, StaticData.PlcDic[1].Rack, StaticData.PlcDic[1].Slot);
StaticData.PlcDic[1].Open();
isOver = true;
}
catch (Exception ex2)
{
errorCount++;
isOver = false;
_logger.Error("Plc短线重连失败" + ex2.Message);
}
}
@ -710,7 +801,7 @@ namespace Khd.Core.Wcs.Wcs
/// <summary>
/// 定时更新三楼AGV信息
/// </summary>
private void ThirdAgvLogic()
public void ThirdAgvLogic()
{
try
{
@ -741,21 +832,20 @@ namespace Khd.Core.Wcs.Wcs
#region 经过走廊区域报警
var Agv3FLED = StaticData.BasePlcpointList.First(t => t.id == 76);
if(Agv3FLED != null)
if (Agv3FLED != null)
{
if (int.Parse(cardStatus.PosX) >= 53040 && int.Parse(cardStatus.PosX) <= 58090 && (int.Parse(cardStatus.PosY) >= 53520 && int.Parse(cardStatus.PosY) <= 64590))
{
// Console.WriteLine("=======>3F走廊区域预警");
//Console.WriteLine("=======>3F走廊区域预警");
StaticData.PlcDic[0].WriteToPoint(Agv3FLED.plcpointAddress, true, Agv3FLED.plcpointLength.ToString());
}
else
{
// Console.WriteLine("3F走廊区域正常");
//Console.WriteLine("3F走廊区域正常");
StaticData.PlcDic[0].WriteToPoint(Agv3FLED.plcpointAddress, false, Agv3FLED.plcpointLength.ToString());
}
}
#endregion
}
}
@ -813,7 +903,7 @@ namespace Khd.Core.Wcs.Wcs
StaticData.PlcDic[0].WriteToPoint(Agv2FLED.plcpointAddress, false, Agv2FLED.plcpointLength.ToString());
}
}
#endregion
}

@ -94,17 +94,18 @@ namespace Khd.Core.Wcs.Wcs
.Select(t => t.containerCode).ToList();
//相同型号及销售订单的深库位库存
List<WmsRawStock> wmsRawStocks = dbContext.WmsRawStock.Where(t => t.materialId == mesBaseBarcodeInfo.materialId)
.Where(t => t.saleOrderId == mesBaseBarcodeInfo.saleOrderId)
.Where(t => DeepContainerCodes.Contains(t.palletInfoCode))
.Where(t => t.saleOrderId == mesBaseBarcodeInfo.saleOrderId)
.Where(t => DeepContainerCodes.Contains(t.palletInfoCode))
.Where(t => t.warehouseId == 311).ToList();
if (wmsRawStocks.Count > 0)
{ //优先找同销售订单的有库存的深库位对应的浅库位
{
//优先找同销售订单的有库存的深库位对应的浅库位
foreach (var wmsRawStock in wmsRawStocks)
{
// 深库位库存对用的Location信息
var deepStockLocation = wmsBaseLocations.Where(t => t.containerCode == wmsRawStock.palletInfoCode).FirstOrDefault();
var deepStockLocation = wmsBaseLocations.Where(t => t.containerCode == wmsRawStock.palletInfoCode).First();
wmsBaseLocation = wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus == "1")
.Where(t => t.locDeep == 2 && t.locColumn == deepStockLocation.locColumn)
.Where(t => t.locRow == (deepStockLocation.locRow % 2 == 0 ? (deepStockLocation.locRow - 1) : (deepStockLocation.locRow + 1)))
@ -115,21 +116,22 @@ namespace Khd.Core.Wcs.Wcs
}
}
}
if (wmsBaseLocation == null)
{ // 找深库位有库存的库位对应的浅库位
var stockLocations = wmsBaseLocations.Where(x => !string.IsNullOrEmpty(x.containerCode) && x.locDeep == 1).ToList();
foreach (var item in stockLocations)
{
wmsBaseLocation = wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus == "1")
.Where(t => t.locDeep == 2 && t.locColumn == item.locColumn)
.Where(t => t.locRow == (item.locRow % 2 == 0 ? (item.locRow - 1) : (item.locRow + 1)))
.FirstOrDefault();
if (wmsBaseLocation != null)
{
break;
}
}
}
//if (wmsBaseLocation == null)
//{
// // 找深库位有库存的库位对应的浅库位
// var stockLocations = wmsBaseLocations.Where(x => !string.IsNullOrEmpty(x.containerCode) && x.locDeep == 1).ToList();
// foreach (var item in stockLocations)
// {
// wmsBaseLocation = wmsBaseLocations.Where(t => string.IsNullOrEmpty(t.containerCode) && t.locationStatus == "1")
// .Where(t => t.locDeep == 2 && t.locColumn == item.locColumn)
// .Where(t => t.locRow == (item.locRow % 2 == 0 ? (item.locRow - 1) : (item.locRow + 1)))
// .FirstOrDefault();
// if (wmsBaseLocation != null)
// {
// break;
// }
// }
//}
if (wmsBaseLocation == null)
{ // 在所有符合条件的库位里,找一个库位,优先深库位,但是如果是深库位,需要判断浅库位状态是否正常
var searchLocations = wmsBaseLocations.Where(x => string.IsNullOrEmpty(x.containerCode) && x.locationStatus == "1").OrderBy(x => x.locDeep).ToList();
@ -157,9 +159,9 @@ namespace Khd.Core.Wcs.Wcs
}
}
if ( wmsBaseLocation != null)
if (wmsBaseLocation != null)
{
dbContext.Remove(wcsTask);
WcsTask newTask = CoreMapper.Map<WcsTask>(wcsTask);
newTask.objid = StaticData.SnowId.NextId();
@ -190,7 +192,7 @@ namespace Khd.Core.Wcs.Wcs
_logger.Info("三楼接驳位调度入库任务,未找到库位");
// TODO: 没有找到库位,添加报警处理
Thread.Sleep(1000 * 5);
}
}
}

@ -1,20 +1,20 @@
{
"ConnectionStrings": {
//"DefaultConnection": "server=106.12.13.113;port=3336;database=khd_jyhb;uid=khd;pwd=khd@123;charset='utf8';persistsecurityinfo=True;SslMode=none;Allow User Variables=True",
//"DefaultConnection": "server=172.16.12.100;port=3306;database=hwjy-cloud;uid=kehaida;pwd=khdrkjy2024...;charset='utf8';persistsecurityinfo=True;SslMode=None;Allow User Variables=True"
"DefaultConnection": "server=172.16.12.100;port=3306;database=hwjy-cloud;uid=kehaida;pwd=khdrkjy2024...;charset='utf8';persistsecurityinfo=True;SslMode=None;Allow User Variables=True"
//"DefaultConnection": "server=localhost;port=3306;database=jyhb;uid=root;pwd=root;charset='utf8';persistsecurityinfo=True;SslMode=None;Allow User Variables=True"
"DefaultConnection": "server=175.27.215.92;port=3306;database=hwjy-cloud;uid=kehaida;pwd=khd2024;charset='utf8';persistsecurityinfo=True;SslMode=None;Allow User Variables=True"
//"DefaultConnection": "server=175.27.215.92;port=3306;database=hwjy-cloud;uid=kehaida;pwd=khd2024;charset='utf8';persistsecurityinfo=True;SslMode=None;Allow User Variables=True"
},
"DeleteLogDays": 10,//
"PlcConfigs": [
{
"IP": "192.168.2.30",
"Port": 102, //102
"CpuType": 40,
"Rack": 0,
"Slot": 1,
"Code": 0
}, //
//{
// "IP": "192.168.2.30",
// "Port": 102, //102
// "CpuType": 40,
// "Rack": 0,
// "Slot": 1,
// "Code": 0
//}, //
{
"IP": "192.168.2.31",
"Port": 102, //102

@ -1291,8 +1291,7 @@
<!-- 透明的正方形 -->
<Rectangle Width="50" Height="50" Fill="Transparent" Stroke="Black" StrokeThickness="1"/>
<!-- 中间的红点 -->
<Ellipse Width="10" Height="10" Fill="Red"
Canvas.Left="20" Canvas.Top="20" />
<Ellipse Width="10" Height="10" Fill="Red" Canvas.Left="20" Canvas.Top="20" />
</Canvas>
<TextBlock Text=" 库位锁定" FontSize="30"/>

@ -345,7 +345,6 @@ namespace Khd.Core.Wpf.Form
{
status = LocationStatus.EmptyInStock;
}
Visibility isFreeze = targetLocation.locationStatus == "1" ? Visibility.Collapsed : Visibility.Visible;
locations.Add(new Location { LocationId = targetLocation.locationId, Code = targetLocation.locColumn.ToString(), Status = status, isFreeze = isFreeze });
}

Loading…
Cancel
Save