master
1 year ago
parent 2f62066c04
commit 0864cd9cfd

@ -19,7 +19,7 @@ namespace Khd.Core.Api.Controllers
} }
/// <summary> /// <summary>
/// 接收agv接收任务通知接口 /// 接收agv接收任务通知接口三楼和五楼Agv接口
/// </summary> /// </summary>
/// <param name="agvCallbackDto"></param> /// <param name="agvCallbackDto"></param>
/// <returns></returns> /// <returns></returns>
@ -33,7 +33,7 @@ namespace Khd.Core.Api.Controllers
} }
/// <summary> /// <summary>
/// 接收agv接收任务通知接口 /// 接收agv接收任务通知接口二楼Agv接口
/// </summary> /// </summary>
/// <param name="agvCallbackDto"></param> /// <param name="agvCallbackDto"></param>
/// <returns></returns> /// <returns></returns>

@ -29,31 +29,31 @@ namespace Khd.Core.Domain.Models
/// wcs_warehouse_order 主键id /// wcs_warehouse_order 主键id
/// </summary> /// </summary>
[Column("master_id")] [Column("master_id")]
public long? masterId { get; set; } public long? masterId { get; set; }//暂时不用
/// <summary> /// <summary>
/// wms出入库记录表id /// wms出入库记录表id
/// </summary> /// </summary>
[Column("order_id")] [Column("order_id")]
public long? orderId { get; set; } public long? orderId { get; set; }//申请单的主键id
/// <summary> /// <summary>
/// 流水号 /// 流水号
/// </summary> /// </summary>
[Column("serial_no")] [Column("serial_no")]
public long? serialNo { get; set; } public long? serialNo { get; set; }//提升机专用流水号
/// <summary> /// <summary>
/// 设备编号 /// 设备编号
/// </summary> /// </summary>
[Column("equipment_no")] [Column("equipment_no")]
public string equipmentNo { get; set; } public string equipmentNo { get; set; }//设备编号
/// <summary> /// <summary>
/// 容器号(托盘或者箱号) /// 容器号(托盘或者箱号)
/// </summary> /// </summary>
[Column("container_no")] [Column("container_no")]
public string containerNo { get; set; } public string containerNo { get; set; }//RFID料箱号
/// <summary> /// <summary>
/// 任务类型,字典表 /// 任务类型,字典表
@ -70,11 +70,9 @@ namespace Khd.Core.Domain.Models
/// 38成品区-提升机输送线对接点 /// 38成品区-提升机输送线对接点
/// 46原材料-柜体拆分区 /// 46原材料-柜体拆分区
/// 47接驳位-原材料周转区 /// 47接驳位-原材料周转区
///
///
/// </summary> /// </summary>
[Column("task_type")] [Column("task_type")]
public int? taskType { get; set; } public int? taskType { get; set; }//对照数据库wcs_base_dictionary表的主键27开始
/// <summary> /// <summary>
/// 任务状态,字典表 /// 任务状态,字典表

@ -29,7 +29,7 @@ namespace Khd.Core.Library.Mapper
config.NewConfig<string, string>().MapWith(dest => dest.Trim()); config.NewConfig<string, string>().MapWith(dest => dest.Trim());
// config.ForType<string, Guid>().Map(member: guid => guid, source: @string => string.IsNullOrEmpty(@string) ? Guid.Empty : new Guid(@string)); // config.ForType<string, Guid>().Map(member: guid => guid, source: @string => string.IsNullOrEmpty(@string) ? Guid.Empty : new Guid(@string));
// config.ForType<Guid, String>().Map(member: @string => @string, source: guid => ("wode")); // config.ForType<Guid, String>().Map(member: @string => @string, source: guid => ("wode"));
config.Default.IgnoreNullValues(true);//忽略null config.Default.IgnoreNullValues(true);//忽略null原本的类字段的值是null映射出来是"",int? null
config.Default.NameMatchingStrategy(NameMatchingStrategy.IgnoreCase);//忽略大小写 config.Default.NameMatchingStrategy(NameMatchingStrategy.IgnoreCase);//忽略大小写
var destination = source.Adapt<TDestination>(config); var destination = source.Adapt<TDestination>(config);
return destination; return destination;

@ -45,15 +45,16 @@ namespace Khd.Core.Plc
return null; return null;
} }
string res = Encoding.UTF8.GetString(result).Replace("\0", "").Replace("$", "").Replace("\\u", "").Trim(); string res = Encoding.UTF8.GetString(result).Replace("\0", "").Replace("$", "").Replace("\\u", "").Trim();
if (res.Contains("JYHB")) if (res.Contains("JYHB"))
{ {
return res[res.IndexOf('J')..]; return res[res.IndexOf('J')..];
} }
else if(res.Contains('C')) else if (res.Contains('C'))
{ {
return res[res.IndexOf('C')..]; return res[res.IndexOf('C')..];
}else }
else
{ {
return ""; return "";
} }

@ -1,5 +1,4 @@
using Khd.Core.Domain.Models; using Khd.Core.EntityFramework;
using Khd.Core.EntityFramework;
using Khd.Core.Wcs.Global; using Khd.Core.Wcs.Global;
using Khd.Core.Wcs.Wcs; using Khd.Core.Wcs.Wcs;
using Masuit.Tools.Logging; using Masuit.Tools.Logging;
@ -35,21 +34,13 @@ namespace Khd.Core.Wcs
using var scope = _host.Services.CreateScope(); using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>(); using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
using var dbContextTransaction = dbContext.Database.BeginTransaction();
try try
{ {
//加载配置项 StaticData.BasePlcpointList = dbContext.BasePlcpoint.Where(t => t.isDelete == 0).ToList();//设备交互用
//设置程序启动时清空点位的数据=>0为 Int16位 StaticData.basePlcs = dbContext.BasePlc.ToList();//陈工Agv和设备信息推送
QingKongDianWei = StaticPlcHelper.GetValue("2", "0"); StaticData.BaseEquip = dbContext.BaseEquip.ToList();//设备信息
//设置默认处理完成=>1为 Int16位 StaticData.BaseDictionary = dbContext.BaseDictionary.ToList();//字典表Agv任务模板
WcsChuLiWanCheng = StaticPlcHelper.GetValue("2", "1");
//设置默认去向=>1为 Int16位
WcsMoRenQuXiang = StaticPlcHelper.GetValue("2", "1");
StaticData.BasePlcpointList = dbContext.BasePlcpoint.Where(t => t.isDelete == 0).ToList();
StaticData.basePlcs = dbContext.BasePlc.ToList();
StaticData.BaseEquip = dbContext.BaseEquip.ToList();
StaticData.BaseDictionary = dbContext.BaseDictionary.ToList();
foreach (var plcConfig in StaticData.PlcConfigs) foreach (var plcConfig in StaticData.PlcConfigs)
{ {
if (!StaticData.PlcDic.Any(t => t.Key == plcConfig.Code)) if (!StaticData.PlcDic.Any(t => t.Key == plcConfig.Code))
@ -68,8 +59,8 @@ namespace Khd.Core.Wcs
StaticData.PlcDic.TryAdd(plcConfig.Code, plc); StaticData.PlcDic.TryAdd(plcConfig.Code, plc);
} }
} }
//SystemTimer systemTimer = new SystemTimer(_host); SystemTimer systemTimer = new SystemTimer(_host);
//systemTimer.Start(); systemTimer.Start();
//创建任务 //创建任务
CreateTaskByRecord createTaskByRecord = new(_host); CreateTaskByRecord createTaskByRecord = new(_host);
createTaskByRecord.StartPoint(); createTaskByRecord.StartPoint();
@ -78,40 +69,40 @@ namespace Khd.Core.Wcs
FirstFloor firstFloor = new(_host, StaticData.PlcDic[0]); FirstFloor firstFloor = new(_host, StaticData.PlcDic[0]);
firstFloor.StartPoint(); firstFloor.StartPoint();
////二层接驳位 //二层接驳位
//var SecondBaseFloorEquip = StaticData.BaseEquip.Where(t => t.floorNo == 2 && t.equipType == 1).First(); 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, StaticData.PlcDic[0], SecondBaseFloorEquip.floorNo.Value);
//secondFloorPoint.StartPoint(); secondFloorPoint.StartPoint();
////二层AGV //二层AGV
//var SecondFloorAgvEquip = StaticData.BaseEquip.Where(t => t.floorNo == 2 && t.equipType == 4).First(); 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, StaticData.PlcDic[0], SecondFloorAgvEquip.floorNo.Value);
//secondFloorAGV.StartPoint(); secondFloorAGV.StartPoint();
////二楼线体 //二楼线体
//var SecondFloorLineEquip = StaticData.BaseEquip.Where(t => t.floorNo == 2 && t.equipType == 17).First(); 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, StaticData.PlcDic[2], SecondFloorLineEquip.floorNo.Value);
//secondFloorLine.StartPoint(); secondFloorLine.StartPoint();
////三层接驳位 //三层接驳位
//var ThirdBaseFloorEquip = StaticData.BaseEquip.Where(t => t.floorNo == 3 && t.equipType == 1).First(); 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, StaticData.PlcDic[0], ThirdBaseFloorEquip.floorNo.Value);
//thirdFloorPoint.StartPoint(); thirdFloorPoint.StartPoint();
////三层AGV //三层AGV
//var ThirdFloorAgvEquip = StaticData.BaseEquip.Where(t => t.floorNo == 3 && t.equipType == 4).First(); 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, StaticData.PlcDic[2], ThirdFloorAgvEquip.floorNo.Value);
//thirdFloorAGV.StartPoint(); thirdFloorAGV.StartPoint();
//五层接驳位 //五层接驳位
var FifthBaseFloorEquip = StaticData.BaseEquip.Where(t => t.floorNo == 5 && t.equipType == 1).First(); 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, StaticData.PlcDic[0], FifthBaseFloorEquip.floorNo.Value);
fifthFloorPoint.StartPoint(); fifthFloorPoint.StartPoint();
////五层CTU //五层CTU
//var FiveFloorCTUEquip = StaticData.BaseEquip.Where(t => t.floorNo == 5 && t.equipType == 6).First(); 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, StaticData.PlcDic[1], FiveFloorCTUEquip.floorNo.Value);
//fiveFloorCTU.StartPoint(); fiveFloorCTU.StartPoint();
//五层AGV //五层AGV
var FifthFloorAgvEquip = StaticData.BaseEquip.Where(t => t.floorNo == 5 && t.equipType == 5).First(); var FifthFloorAgvEquip = StaticData.BaseEquip.Where(t => t.floorNo == 5 && t.equipType == 5).First();
@ -125,7 +116,6 @@ namespace Khd.Core.Wcs
} }
catch (Exception ex) catch (Exception ex)
{ {
dbContextTransaction.Rollback();
Console.WriteLine(ex.Message); Console.WriteLine(ex.Message);
LogManager.Error(ex); LogManager.Error(ex);
} }

@ -29,9 +29,9 @@ namespace Khd.Core.Wcs.Wcs
/// </summary> /// </summary>
public void StartPoint() public void StartPoint()
{ {
////背负式Agv返库任务 //背负式Agv返库任务
//var createBearAgvReturnThread = new Thread(CreateBearAgvReturnLogic); var createBearAgvReturnThread = new Thread(CreateBearAgvReturnLogic);
//createBearAgvReturnThread.Start(); createBearAgvReturnThread.Start();
//五楼半成品入库任务 //五楼半成品入库任务
var createFiveProductInTaskThread = new Thread(CreateFiveProductInTaskLogic); var createFiveProductInTaskThread = new Thread(CreateFiveProductInTaskLogic);
createFiveProductInTaskThread.Start(); createFiveProductInTaskThread.Start();
@ -44,18 +44,18 @@ namespace Khd.Core.Wcs.Wcs
//五楼柜体拆分返库任务 //五楼柜体拆分返库任务
var createRawInThread = new Thread(CreateRawInTaskLogic); var createRawInThread = new Thread(CreateRawInTaskLogic);
createRawInThread.Start(); createRawInThread.Start();
////三楼去翻转机任务 //三楼去翻转机任务
//var createThirdOutTaskThread = new Thread(CreateThirdOutTaskLogic); var createThirdOutTaskThread = new Thread(CreateThirdOutTaskLogic);
//createThirdOutTaskThread.Start(); createThirdOutTaskThread.Start();
////二楼成品出库任务 //二楼成品出库任务
//var CreateSecondProductTaskThread = new Thread(CreateSecondProductTaskLogic); var CreateSecondProductTaskThread = new Thread(CreateSecondProductTaskLogic);
//CreateSecondProductTaskThread.Start(); CreateSecondProductTaskThread.Start();
////三楼托盘收集架满5个或10个时出库合盘任务 //三楼托盘收集架满5个或10个时出库合盘任务
//var createEmptyTrayThread = new Thread(CreateEmptyTrayLogic); var createEmptyTrayThread = new Thread(CreateEmptyTrayLogic);
//createEmptyTrayThread.Start(); createEmptyTrayThread.Start();
////二楼废品区人工调度任务 //二楼废品区人工调度任务
//var createThirdWasterTaskThread = new Thread(CreateThirdWasterTaskLogic); var createThirdWasterTaskThread = new Thread(CreateThirdWasterTaskLogic);
//createThirdWasterTaskThread.Start(); createThirdWasterTaskThread.Start();
Console.WriteLine(DateTime.Now + ":出库任务监听启动成功"); Console.WriteLine(DateTime.Now + ":出库任务监听启动成功");
LogManager.Info("出库任务监听启动成功"); LogManager.Info("出库任务监听启动成功");
@ -1481,7 +1481,7 @@ namespace Khd.Core.Wcs.Wcs
int qty = 0; int qty = 0;
if (stock.totalAmount - stock.frozenAmount <= needNumber)//该料箱全部出 if (stock.totalAmount - stock.frozenAmount <= needNumber)//该料箱全部出
{ {
needNumber-= stock.totalAmount - stock.frozenAmount; needNumber -= stock.totalAmount - stock.frozenAmount;
RealOutNumber += stock.totalAmount - stock.frozenAmount; RealOutNumber += stock.totalAmount - stock.frozenAmount;
qty = Convert.ToInt32(stock.totalAmount - stock.frozenAmount); qty = Convert.ToInt32(stock.totalAmount - stock.frozenAmount);
stock.updateDate = DateTime.Now; stock.updateDate = DateTime.Now;

@ -64,7 +64,6 @@ namespace Khd.Core.Wcs.Wcs
this.RFID001 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("FirstFloorLine") && t.plcpointNo.Contains("RFID001")); this.RFID001 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("FirstFloorLine") && t.plcpointNo.Contains("RFID001"));
//到位信号 读 //到位信号 读
this.linesignal01 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("FirstFloorLine") && t.plcpointNo.Contains("linesignal01")); this.linesignal01 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("FirstFloorLine") && t.plcpointNo.Contains("linesignal01"));
//一楼提升机流水号 读 //一楼提升机流水号 读
this.serialno06 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("Hoister") && t.plcpointNo.Contains("serialno06")); this.serialno06 = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("Hoister") && t.plcpointNo.Contains("serialno06"));
this.mesClose = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("Hoister") && t.plcpointNo.Contains("mesclose")); this.mesClose = StaticData.BasePlcpointList.First(t => t.equipmentNo.Contains("Hoister") && t.plcpointNo.Contains("mesclose"));
@ -87,27 +86,19 @@ namespace Khd.Core.Wcs.Wcs
/// </summary> /// </summary>
public void StartPoint() public void StartPoint()
{ {
Thread firstFloorLine = new(FirstFloorLine) Thread firstFloorLine = new(FirstFloorLine)//一楼接驳位线程
{ {
IsBackground = true IsBackground = true
}; };
firstFloorLine.Start(); firstFloorLine.Start();
Console.WriteLine(DateTime.Now + ":一楼接驳位线程启动成功");
LogManager.Info("一楼接驳位线程启动成功");
Thread firstFloorHoister = new(FirstFloorHoister) Thread firstFloorHoister = new(FirstFloorHoister)//提升机
{ {
IsBackground = true IsBackground = true
}; };
firstFloorHoister.Start(); firstFloorHoister.Start();
//Thread CallEmptyThread = new Thread(CallEmpty) Thread equipStatusThread = new Thread(EquipStatusLogic)//设备状态1-5楼接驳位能不能送货提升机和小车任务
//{
// IsBackground = true
//};
//CallEmptyThread.Start();
Thread equipStatusThread = new Thread(EquipStatusLogic)
{ {
IsBackground = true IsBackground = true
}; };
@ -134,28 +125,28 @@ namespace Khd.Core.Wcs.Wcs
if (Convert.ToInt32(lineSignal) == 1) if (Convert.ToInt32(lineSignal) == 1)
{ {
BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == i); BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == i);
if (baseEquip.equipStatus != 1) if (baseEquip.equipStatus != 1)//不是忙碌状态,改为忙碌状态
{ {
baseEquip.equipStatus = 1; baseEquip.equipStatus = 1;
dbContext.Update(baseEquip); dbContext.Update(baseEquip);
dbContext.SaveChanges(); dbContext.SaveChanges();
} }
else //else
{ //{
bool hasTask = dbContext.WcsTask.Where(t => t.endPointId == i || t.currPointId == i).Any(); // bool hasTask = dbContext.WcsTask.Where(t => t.endPointId == i || t.currPointId == i).Any();
if (!hasTask) // if (!hasTask)
{ // {
baseEquip.equipStatus = 0; // baseEquip.equipStatus = 0;
dbContext.Update(baseEquip); // dbContext.Update(baseEquip);
dbContext.SaveChanges(); // dbContext.SaveChanges();
} // }
} //}
} }
else else
{ {
BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == i); BaseEquip baseEquip = dbContext.BaseEquip.First(t => t.objid == i);
bool hasCmd = dbContext.WcsCmd.Where(t => t.nextPointId == i || t.currPointId == i).Any(); bool hasCmd = dbContext.WcsCmd.Where(t => t.nextPointId == i || t.currPointId == i).Any();//小车任务
bool hasTask = dbContext.WcsTask.Where(t => (t.currPointId == i || t.endPointId == i) && t.taskStatus >= 1 && t.nextPointId == 6).Any(); bool hasTask = dbContext.WcsTask.Where(t => (t.currPointId == i || t.endPointId == i) && t.taskStatus >= 1 && t.nextPointId == 6).Any();//提升机任务,有没有正在执行的往这个接驳位送的
if (!hasCmd || !hasTask) if (!hasCmd || !hasTask)
{ {
baseEquip.containerNo = null; baseEquip.containerNo = null;
@ -163,7 +154,7 @@ namespace Khd.Core.Wcs.Wcs
dbContext.Update(baseEquip); dbContext.Update(baseEquip);
dbContext.SaveChanges(); dbContext.SaveChanges();
} }
else else//接驳位改为忙碌状态
{ {
baseEquip.containerNo = null; baseEquip.containerNo = null;
baseEquip.equipStatus = 1; baseEquip.equipStatus = 1;
@ -305,7 +296,7 @@ namespace Khd.Core.Wcs.Wcs
{ {
try try
{ {
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload()); dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());//上次查出1不加这行数据库实际2查出1
var RFID001Value = StaticData.PlcDic[0].ReadRFID(this.RFID001.plcpointAddress); //一楼RFID 读 var RFID001Value = StaticData.PlcDic[0].ReadRFID(this.RFID001.plcpointAddress); //一楼RFID 读
var linesignal01Value = StaticData.PlcDic[0].Read(this.linesignal01.plcpointAddress); //到位信号 读 var linesignal01Value = StaticData.PlcDic[0].Read(this.linesignal01.plcpointAddress); //到位信号 读
//正常读到plc值 //正常读到plc值
@ -400,7 +391,7 @@ namespace Khd.Core.Wcs.Wcs
} }
else else
{ {
if (string.IsNullOrEmpty(task.containerNo)) if (string.IsNullOrEmpty(task.containerNo))//人工调出
{ {
if (task.useFlag == 1) if (task.useFlag == 1)
{ {
@ -514,7 +505,7 @@ namespace Khd.Core.Wcs.Wcs
BasePlcpoint floorPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "RFID00" + wcsTask.fromFloorNo); BasePlcpoint floorPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "RFID00" + wcsTask.fromFloorNo);
if (wcsTask.containerNo == StaticData.PlcDic[0].ReadRFID(floorPoint.plcpointAddress) || (string.IsNullOrEmpty(wcsTask.containerNo) && wcsTask.qty > 1)) if (wcsTask.containerNo == StaticData.PlcDic[0].ReadRFID(floorPoint.plcpointAddress) || (string.IsNullOrEmpty(wcsTask.containerNo) && wcsTask.qty > 1))
{ {
if (Convert.ToInt32(currentfloor06Value) == wcsTask.fromFloorNo) if (Convert.ToInt32(currentfloor06Value) == wcsTask.fromFloorNo)//当前楼层和起始楼层一致
{ {
wcsTask.taskStatus = 2; wcsTask.taskStatus = 2;
wcsTask.updateBy = "提升机线程"; wcsTask.updateBy = "提升机线程";
@ -531,7 +522,7 @@ namespace Khd.Core.Wcs.Wcs
dbContext.Update(lineEquip); dbContext.Update(lineEquip);
dbContext.SaveChanges(); dbContext.SaveChanges();
} }
else else//当前楼层和起始楼层不一致
{ {
wcsTask.taskStatus = 1; wcsTask.taskStatus = 1;
wcsTask.updateBy = "提升机线程"; wcsTask.updateBy = "提升机线程";
@ -589,20 +580,20 @@ namespace Khd.Core.Wcs.Wcs
} }
if (wcsTask.taskStatus == 3 && Convert.ToInt32(currentfloor06Value) == wcsTask.floorNo && Convert.ToInt32(reserialno06) == wcsTask.serialNo)//任务状态为3且当前楼层为任务的目的楼层 if (wcsTask.taskStatus == 3 && Convert.ToInt32(currentfloor06Value) == wcsTask.floorNo && Convert.ToInt32(reserialno06) == wcsTask.serialNo)//任务状态为3且当前楼层为任务的目的楼层
{ {
if (wcsTask.floorNo == 1) if (wcsTask.floorNo == 1)//目的楼层是1
{ {
if (ReadEmptyLocation()) if (ReadEmptyLocation())//托盘库是否有任务没有任务返回true
{ {
var linesignal = StaticData.PlcDic[0].Read(StaticData.BasePlcpointList.First(t => t.plcpointNo == $"linesignal0{wcsTask.floorNo}").plcpointAddress); var linesignal = StaticData.PlcDic[0].Read(StaticData.BasePlcpointList.First(t => t.plcpointNo == $"linesignal0{wcsTask.floorNo}").plcpointAddress);
if (linesignal != null && Convert.ToInt32(linesignal) == 0) if (linesignal != null && Convert.ToInt32(linesignal) == 0)//接驳位外侧没有东西
{ {
BasePlcpoint clearPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == $"clear0{wcsTask.floorNo}"); BasePlcpoint clearPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == $"clear0{wcsTask.floorNo}");
var clearValue = StaticData.PlcDic[0].Read(clearPoint.plcpointAddress); var clearValue = StaticData.PlcDic[0].Read(clearPoint.plcpointAddress);
if (clearPoint != null && Convert.ToBoolean(clearValue) == true) if (clearPoint != null && Convert.ToBoolean(clearValue) == true)//是否有报警
{ {
Console.WriteLine(DateTime.Now + ":提升机下发报警消除指令"); Console.WriteLine(DateTime.Now + ":提升机下发报警消除指令");
LogManager.Info("提升机下发报警消除指令"); LogManager.Info("提升机下发报警消除指令");
StaticData.PlcDic[0].WriteToPoint(clearPoint.plcpointAddress, false, clearPoint.plcpointLength.ToString()); StaticData.PlcDic[0].WriteToPoint(clearPoint.plcpointAddress, false, clearPoint.plcpointLength.ToString());//清除报警
} }
wcsTask.taskStatus = 4; wcsTask.taskStatus = 4;
wcsTask.updateBy = "提升机线程"; wcsTask.updateBy = "提升机线程";
@ -616,11 +607,11 @@ namespace Khd.Core.Wcs.Wcs
dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 4, updateBy = "提升机线程", updateTime = DateTime.Now, remark = "提升机任务执行完成" }); dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 4, updateBy = "提升机线程", updateTime = DateTime.Now, remark = "提升机任务执行完成" });
dbContext.SaveChanges(); dbContext.SaveChanges();
} }
else else//接驳位外侧有东西
{ {
BasePlcpoint clearPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == $"clear0{wcsTask.floorNo}"); BasePlcpoint clearPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == $"clear0{wcsTask.floorNo}");
var clearValue = StaticData.PlcDic[0].Read(clearPoint.plcpointAddress); var clearValue = StaticData.PlcDic[0].Read(clearPoint.plcpointAddress);
if (clearPoint != null && Convert.ToBoolean(clearValue)==false) if (clearPoint != null && Convert.ToBoolean(clearValue) == false)
{ {
StaticData.PlcDic[0].WriteToPoint(clearPoint.plcpointAddress, true, clearPoint.plcpointLength.ToString()); StaticData.PlcDic[0].WriteToPoint(clearPoint.plcpointAddress, true, clearPoint.plcpointLength.ToString());
} }
@ -651,16 +642,16 @@ namespace Khd.Core.Wcs.Wcs
} }
else else
{ {
BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.equipmentNo == $"clear0{wcsTask.floorNo}"); BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == $"clear0{wcsTask.floorNo}");
StaticData.PlcDic[0].WriteToPoint(basePlcpoint.plcpointAddress, "1", basePlcpoint.plcpointLength.ToString()); StaticData.PlcDic[0].WriteToPoint(basePlcpoint.plcpointAddress, "1", basePlcpoint.plcpointLength.ToString());
} }
} }
} }
else if (wcsTask.taskStatus == 4) else if (wcsTask.taskStatus == 4)//提升机任务结束
{ {
BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.floorNo == wcsTask.floorNo && t.plcpointNo.Contains("wcsrun")); BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.floorNo == wcsTask.floorNo && t.plcpointNo.Contains("wcsrun"));
var wcsRun = StaticData.PlcDic[0].Read(basePlcpoint.plcpointAddress); var wcsRun = StaticData.PlcDic[0].Read(basePlcpoint.plcpointAddress);
if (wcsRun != null && Convert.ToInt32(wcsRun) == 0) if (wcsRun != null && Convert.ToInt32(wcsRun) == 0)//判断当前接驳位的任务状态wcsrrun如果是1代表入库2是出库0是空闲
{ {
BaseEquip floorEquip = StaticData.BaseEquip.First(t => t.objid == wcsTask.floorNo); BaseEquip floorEquip = StaticData.BaseEquip.First(t => t.objid == wcsTask.floorNo);
wcsTask.nextPointId = floorEquip.objid; wcsTask.nextPointId = floorEquip.objid;
@ -683,7 +674,7 @@ namespace Khd.Core.Wcs.Wcs
} }
} }
} }
else else//同步楼层,屏蔽状态
{ {
if (currentfloor06Value != null && targetfloor06Value != null) if (currentfloor06Value != null && targetfloor06Value != null)
{ {

@ -9,7 +9,6 @@ using Masuit.Tools.Logging;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using Newtonsoft.Json; using Newtonsoft.Json;
using System.Transactions;
using Z.EntityFramework.Plus; using Z.EntityFramework.Plus;
namespace Khd.Core.Wcs.Wcs namespace Khd.Core.Wcs.Wcs

@ -417,12 +417,12 @@ namespace Khd.Core.Wcs.Wcs
new() new()
{ {
positionCode = wcsCmd.currPointNo, positionCode = wcsCmd.currPointNo,
type = "05" type = "05"//05库位
}, },
new() new()
{ {
positionCode = wcsCmd.nextPointNo, positionCode = wcsCmd.nextPointNo,
type = "00" type = "00"//设备
}, },
}, },
ctnrTyp = "1", ctnrTyp = "1",
@ -479,12 +479,12 @@ namespace Khd.Core.Wcs.Wcs
new() new()
{ {
positionCode = wcsCmd.currPointNo, positionCode = wcsCmd.currPointNo,
type = "05" type = "05"//设备
}, },
new() new()
{ {
positionCode = wcsCmd.nextPointNo, positionCode = wcsCmd.nextPointNo,
type = "05" type = "05"//库位
}, },
}, },
ctnrTyp = "1", ctnrTyp = "1",

@ -873,7 +873,7 @@ namespace Khd.Core.Wcs.Wcs
{ {
var wmsBaseLocation = dbContext.WmsBaseLocation.Where(t => t.locationId == item.currPointId).First(); var wmsBaseLocation = dbContext.WmsBaseLocation.Where(t => t.locationId == item.currPointId).First();
WmsProductStock wmsProductStock = dbContext.WmsProductStock.First(t => t.locationCode == wmsBaseLocation.locationCode); WmsProductStock wmsProductStock = dbContext.WmsProductStock.First(t => t.locationCode == wmsBaseLocation.locationCode);
wmsProductOutstock.outstockQty ++; wmsProductOutstock.outstockQty++;
if (wmsProductOutstock.applyQty <= wmsProductOutstock.outstockQty) if (wmsProductOutstock.applyQty <= wmsProductOutstock.outstockQty)
{ {
wmsProductOutstock.endTime = DateTime.Now; wmsProductOutstock.endTime = DateTime.Now;

@ -40,12 +40,12 @@ namespace Khd.Core.Wcs.Wcs
{ {
using var scope = _host.Services.CreateScope(); using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>(); using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
BaseEquip inEquip = StaticData.BaseEquip.First(t => t.objid == 36); BaseEquip inEquip = StaticData.BaseEquip.First(t => t.objid == 36);//小包入口
BaseEquip outEquip = StaticData.BaseEquip.First(t => t.objid == 37); BaseEquip outEquip = StaticData.BaseEquip.First(t => t.objid == 37);//小包出口
BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.objid == 2); BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.objid == 2);//二楼接驳位
BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == 8); BaseEquip agvEquip = StaticData.BaseEquip.First(t => t.objid == 8);//二楼叉车
BaseEquip tsjEquip = StaticData.BaseEquip.First(t => t.objid == 6); BaseEquip tsjEquip = StaticData.BaseEquip.First(t => t.objid == 6);//提升机
var agvPutPoint = StaticData.BasePlcpointList.First(t => t.id == 54); var agvPutPoint = StaticData.BasePlcpointList.First(t => t.id == 54);//二楼小包入口点位
while (true) while (true)
{ {
try try
@ -54,8 +54,7 @@ namespace Khd.Core.Wcs.Wcs
//入库任务 //入库任务
var rfid = StaticData.PlcDic[0].ReadRFID(LineRFID.plcpointAddress); var rfid = StaticData.PlcDic[0].ReadRFID(LineRFID.plcpointAddress);
var isSignal = StaticData.PlcDic[0].Read(LineSignal.plcpointAddress); var isSignal = StaticData.PlcDic[0].Read(LineSignal.plcpointAddress);
//var agvPutValue = StaticData.PlcDic[2].Read(agvPutPoint.plcpointAddress); var agvPutValue = StaticData.PlcDic[2].Read(agvPutPoint.plcpointAddress);
var agvPutValue = "";
if (rfid != null && isSignal != null) if (rfid != null && isSignal != null)
{ {
@ -64,30 +63,29 @@ namespace Khd.Core.Wcs.Wcs
{ {
//获取条码信息 //获取条码信息
BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.objid == 2); BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.objid == 2);
var wcsTask = dbContext.WcsTask.Where(t => t.nextPointId == 2).OrderBy(t => t.createTime) var wcsTask = dbContext.WcsTask.Where(t => t.nextPointId == 2).OrderBy(t => t.createTime).FirstOrDefault();
.FirstOrDefault();
if (wcsTask != null) if (wcsTask != null)
{ {
if (wcsTask.taskStatus == 5 && (wcsTask.nextPointId == 6 || wcsTask.nextPointId == 2))//入托盘入口,提升机任务是完成状态 if (wcsTask.taskStatus == 5 && (wcsTask.nextPointId == 6 || wcsTask.nextPointId == 2))//入托盘入口,提升机任务是完成状态
{ {
if (wcsTask.taskType != 99) if (wcsTask.taskType != 99)//不是人工任务
{ {
if (agvPutValue != null && Convert.ToInt32(agvPutValue) == 0)//小包入口要料 if (agvPutValue != null && Convert.ToInt32(agvPutValue) == 0)//小包入口要料
{ {
dbContext.WcsTask.Remove(wcsTask); dbContext.WcsTask.Remove(wcsTask);//删除原本的任务
WcsTask newTask = CoreMapper.Map<WcsTask>(wcsTask); WcsTask newTask = CoreMapper.Map<WcsTask>(wcsTask);
newTask.taskStatus = 0; newTask.taskStatus = 0;
newTask.objid = StaticData.SnowId.NextId(); newTask.objid = StaticData.SnowId.NextId();
newTask.nextPointId = agvEquip.objid; newTask.nextPointId = agvEquip.objid;//小车执行该任务
newTask.nextPointNo = agvEquip.equipNo; newTask.nextPointNo = agvEquip.equipNo;
newTask.createTime = DateTime.Now; newTask.createTime = DateTime.Now;
newTask.updateTime = DateTime.Now; newTask.updateTime = DateTime.Now;
newTask.containerNo = rfid; newTask.containerNo = rfid;//容器号
newTask.currPointId = lineEquip.objid; newTask.currPointId = lineEquip.objid;//起始地为二楼接驳位
newTask.currPointNo = lineEquip.equipNo; newTask.currPointNo = lineEquip.equipNo;
newTask.endPointId = inEquip.objid; newTask.endPointId = inEquip.objid;//终点为小包入口
newTask.endPointNo = inEquip.equipNo; newTask.endPointNo = inEquip.equipNo;
newTask.taskType = 51;//到小包入口 newTask.taskType = 51;//提升机到小包入口的任务类型
newTask.useFlag = 1; newTask.useFlag = 1;
dbContext.WcsTask.Add(newTask); dbContext.WcsTask.Add(newTask);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(newTask); WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(newTask);
@ -98,23 +96,23 @@ namespace Khd.Core.Wcs.Wcs
} }
else if (agvPutValue != null && Convert.ToInt32(agvPutValue) == 1) else if (agvPutValue != null && Convert.ToInt32(agvPutValue) == 1)
{ {
BaseEquip? endEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipType == 20 && t.equipStatus == 0 && t.emptyCount == 0); BaseEquip? endEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipType == 20 && t.equipStatus == 0 && t.emptyCount == 0);//二楼周转位
if (endEquip != null) if (endEquip != null)
{ {
dbContext.WcsTask.Remove(wcsTask); dbContext.WcsTask.Remove(wcsTask);//删除原本的任务
WcsTask newTask = CoreMapper.Map<WcsTask>(wcsTask); WcsTask newTask = CoreMapper.Map<WcsTask>(wcsTask);
newTask.taskStatus = 0; newTask.taskStatus = 0;
newTask.objid = StaticData.SnowId.NextId(); newTask.objid = StaticData.SnowId.NextId();
newTask.nextPointId = agvEquip.objid; newTask.nextPointId = agvEquip.objid;//小车执行该任务
newTask.nextPointNo = agvEquip.equipNo; newTask.nextPointNo = agvEquip.equipNo;
newTask.createTime = DateTime.Now; newTask.createTime = DateTime.Now;
newTask.updateTime = DateTime.Now; newTask.updateTime = DateTime.Now;
newTask.containerNo = rfid; newTask.containerNo = rfid;//容器号
newTask.currPointId = lineEquip.objid; newTask.currPointId = lineEquip.objid;//起始地为二楼接驳位
newTask.currPointNo = lineEquip.equipNo; newTask.currPointNo = lineEquip.equipNo;
newTask.endPointId = endEquip.objid; newTask.endPointId = endEquip.objid;//终点为周转位
newTask.endPointNo = endEquip.equipNo; newTask.endPointNo = endEquip.equipNo;
newTask.taskType = 58;//到周转位 newTask.taskType = 58;//提升机到周转位的任务类型
newTask.useFlag = 1; newTask.useFlag = 1;
dbContext.WcsTask.Add(newTask); dbContext.WcsTask.Add(newTask);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(newTask); WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(newTask);
@ -127,7 +125,7 @@ namespace Khd.Core.Wcs.Wcs
} }
else else
{ {
if (wcsTask.endPointId == 36) if (wcsTask.endPointId == 36)//目的地是小包入口
{ {
if (agvPutValue != null && Convert.ToInt32(agvPutValue) == 1)//小包入口要料 if (agvPutValue != null && Convert.ToInt32(agvPutValue) == 1)//小包入口要料
{ {
@ -182,10 +180,10 @@ namespace Khd.Core.Wcs.Wcs
} }
} }
} }
else if (wcsTask.endPointId == 38) else if (wcsTask.endPointId == 38)//目的地是废料区
{ {
var endEquip = dbContext.BaseEquip.First(t => t.objid == 38); var endEquip = dbContext.BaseEquip.First(t => t.objid == 38);//废料区
if (endEquip.emptyCount == 0) if (endEquip.emptyCount == 0)//废料区没有托盘
{ {
dbContext.WcsTask.Remove(wcsTask); dbContext.WcsTask.Remove(wcsTask);
WcsTask newTask = CoreMapper.Map<WcsTask>(wcsTask); WcsTask newTask = CoreMapper.Map<WcsTask>(wcsTask);
@ -209,7 +207,7 @@ namespace Khd.Core.Wcs.Wcs
} }
else else
{ {
endEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipType == 20 && t.equipStatus == 0 && t.emptyCount == 0); endEquip = dbContext.BaseEquip.FirstOrDefault(t => t.equipType == 20 && t.equipStatus == 0 && t.emptyCount == 0);//周转位
if (endEquip != null) if (endEquip != null)
{ {
dbContext.WcsTask.Remove(wcsTask); dbContext.WcsTask.Remove(wcsTask);

@ -29,25 +29,19 @@ namespace Khd.Core.Wcs.Wcs
{ {
IsBackground = true IsBackground = true
}; };
messageSynchronousThread.Start(); messageSynchronousThread.Start();//陈工设备信息推送
//var baseEquipThread = new Thread(BaseEquipLogic) var PlcHeartBeat30Thread = new Thread(PlcHeartBeat30Logic)
//{ {
// IsBackground = true IsBackground = true
//}; };
//baseEquipThread.Start(); PlcHeartBeat30Thread.Start();//脉冲
//var PlcHeartBeat30Thread = new Thread(PlcHeartBeat30Logic)
//{
// IsBackground = true
//};
//PlcHeartBeat30Thread.Start();
var PlcHeartBeat31Thread = new Thread(PlcHeartBeat31Logic) var PlcHeartBeat31Thread = new Thread(PlcHeartBeat31Logic)
{ {
IsBackground = true IsBackground = true
}; };
PlcHeartBeat31Thread.Start(); PlcHeartBeat31Thread.Start();//脉冲
Console.WriteLine($"{DateTime.Now}: SystemTimer started"); Console.WriteLine($"{DateTime.Now}: SystemTimer started");
} }
@ -192,7 +186,6 @@ namespace Khd.Core.Wcs.Wcs
{ {
try try
{ {
HositerLogic(); HositerLogic();
CtuLineLogic(); CtuLineLogic();
ThirdAgvLogic(); ThirdAgvLogic();

@ -747,7 +747,7 @@ namespace Khd.Core.Wcs.Wcs
{ {
rawStockId = StaticData.SnowId.NextId(), rawStockId = StaticData.SnowId.NextId(),
activeFlag = "1", activeFlag = "1",
saleOrderId = mesBaseBarcodeInfo.saleOrderId==null?0:mesBaseBarcodeInfo.saleOrderId, saleOrderId = mesBaseBarcodeInfo.saleOrderId == null ? 0 : mesBaseBarcodeInfo.saleOrderId,
stockType = "1", stockType = "1",
supplierId = mesBaseBarcodeInfo.manufacturerId, supplierId = mesBaseBarcodeInfo.manufacturerId,
qualityStatus = "1", qualityStatus = "1",

@ -13,15 +13,15 @@
"Rack": 0, "Rack": 0,
"Slot": 1, "Slot": 1,
"Code": 0 "Code": 0
}, },//
//{ {
// "IP": "192.168.2.31", "IP": "192.168.2.31",
// "Port": 102, //102 "Port": 102, //102
// "CpuType": 40, "CpuType": 40,
// "Rack": 0, "Rack": 0,
// "Slot": 1, "Slot": 1,
// "Code": 1 "Code": 1
//}, },//U线
{ {
"IP": "192.168.2.220", "IP": "192.168.2.220",
"Port": 102, //102 "Port": 102, //102
@ -29,7 +29,7 @@
"Rack": 0, "Rack": 0,
"Slot": 1, "Slot": 1,
"Code": 2 "Code": 2
} }//
], ],
"PLCSetting": { "PLCSetting": {
"Mode": "0", "Mode": "0",

@ -2902,7 +2902,7 @@ namespace Khd.Core.Wpf.Form
private void SelectOutBtn_Click(object sender, RoutedEventArgs e) private void SelectOutBtn_Click(object sender, RoutedEventArgs e)
{ {
SelectOutRawForm selectOutRawForm=new SelectOutRawForm(this._host); SelectOutRawForm selectOutRawForm = new SelectOutRawForm(this._host);
selectOutRawForm.ShowDialog(); selectOutRawForm.ShowDialog();
} }
} }

Loading…
Cancel
Save