master
2 years ago
parent 4583eb27bb
commit 1c71df8c8a

@ -3,6 +3,7 @@ using Khd.Core.Domain.Dto.webapi;
using Masuit.Tools;
using Masuit.Tools.Logging;
using Microsoft.AspNetCore.Mvc;
using System.Threading;
namespace Khd.Core.Api.Controllers
{
@ -25,15 +26,49 @@ namespace Khd.Core.Api.Controllers
public ReponseagvCallbackDto agvCallback(agvCallbackDto agvCallbackDto)
{
LogManager.Info($"RecieveRcsController接口信息{agvCallbackDto.ToJsonString()}");
if (agvCallbackDto.method == "start")
{
Thread.Sleep(1000);
}
return _application.AgvCallback(agvCallbackDto);
}
[HttpPost("MesToAgvComplete")]
/// <summary>
/// 背负式Agv通知任务完成
/// </summary>
/// <param name="agvCompeletedRequest"></param>
/// <returns></returns>
[HttpPost("agvComplete")]
public AgvCompeletedResponse MesToAgvComplete(AgvCompeleted agvCompeletedRequest)
{
LogManager.Info($"RecieveRcsController接口信息{agvCompeletedRequest.ToJsonString()}");
return _application.MesToAgvComplete(agvCompeletedRequest);
}
/// <summary>
/// 原材料入口任务继续通知
/// </summary>
/// <param name="taskContinue"></param>
/// <returns></returns>
[HttpPost("taskContinue")]
public AgvCompeletedResponse TaskContinue(TaskContinue taskContinue)
{
LogManager.Info($"TaskContinue 接口收到消息: {taskContinue}");
return _application.TaskContinue(taskContinue);
}
/// <summary>
/// 柜体拆分验收区通知返库接口
/// </summary>
/// <param name="taskReturn"></param>
/// <returns></returns>
[HttpPost("taskReturn")]
public AgvCompeletedResponse TaskReturn(TaskReturn taskReturn)
{
LogManager.Info($"TaskReturn 接口收到消息: {taskReturn}");
return _application.TaskReturn(taskReturn);
}
}
}

@ -24,5 +24,10 @@ namespace Khd.Core.Application.Interface
AgvCompeletedResponse MesToAgvComplete(AgvCompeleted agvCompeletedRequest);
AgvCompeletedResponse TaskContinue(TaskContinue taskContinue);
AgvCompeletedResponse TaskReturn(TaskReturn taskReturn);
}
}

@ -2,6 +2,7 @@
using Khd.Core.Domain.Dto.webapi;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Linq;
@ -47,18 +48,19 @@ namespace Khd.Core.Application
ReponseagvCallbackDto reponseagvCallbackDto = new ReponseagvCallbackDto();
try
{
_dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
var wcscmd = _dbContext.WcsCmd
.Where(t=>t.taskCode==agvCallbackDto.taskCode)
.Where(t => t.taskCode == agvCallbackDto.taskCode)
.FirstOrDefault();
if (wcscmd != null)
{
WcsTask wcsTask = _dbContext.WcsTask.FirstOrDefault(t => t.objid == wcscmd.taskId);
if(wcsTask != null)
if (wcsTask != null)
{
//start 开始 end结束 continue继续
//待取货
if (agvCallbackDto.method.ToLower() == "start")
{
{
wcscmd.cmdStatus = 2;
wcscmd.sendFlag = 1;
wcsTask.taskStatus = 2;
@ -87,7 +89,7 @@ namespace Khd.Core.Application
{
wcscmd.cmdStatus = 5;
wcscmd.sendFlag = 1;
wcsTask.taskStatus= 5;
wcsTask.taskStatus = 5;
_dbContext.WcsCmd.Update(wcscmd);
_dbContext.Update(wcsTask);
_dbContext.SaveChanges();
@ -129,13 +131,19 @@ namespace Khd.Core.Application
return "";
}
/// <summary>
/// 背负式Agv通知完成
/// </summary>
/// <param name="agvCompeletedRequest"></param>
/// <returns></returns>
public AgvCompeletedResponse MesToAgvComplete(AgvCompeleted agvCompeletedRequest)
{
AgvCompeletedResponse agvCompeletedResponse = new AgvCompeletedResponse();
try
{
string stationId = agvCompeletedRequest.stationId;
BaseEquip baseEquip = _dbContext.BaseEquip.FirstOrDefault(t=>t.equipNo==stationId);
_dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
string stationId = agvCompeletedRequest.stationNo;
BaseEquip baseEquip = _dbContext.BaseEquip.FirstOrDefault(t => t.equipNo == stationId);
if (baseEquip != null)
{
var wcsCmd = _dbContext.WcsCmd.Where(t => t.nextPointId == baseEquip.objid).FirstOrDefault();
@ -172,5 +180,78 @@ namespace Khd.Core.Application
}
return agvCompeletedResponse;
}
/// <summary>
/// 4楼到5楼原材料入口继续
/// </summary>
/// <param name="taskContinue"></param>
/// <returns></returns>
public AgvCompeletedResponse TaskContinue(TaskContinue taskContinue)
{
AgvCompeletedResponse compeletedResponse = new AgvCompeletedResponse();
try
{
_dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
WcsTask wcsTask = _dbContext.WcsTask
.Where(t => t.materialId == taskContinue.materialId)
.Where(t => t.taskType == 47)
.FirstOrDefault();
if (wcsTask != null)
{
wcsTask.useFlag = 1;
_dbContext.WcsTask.Update(wcsTask);
_dbContext.SaveChanges();
compeletedResponse.code = "0";
compeletedResponse.message = "成功";
}
else
{
compeletedResponse.code = "1";
compeletedResponse.message = "未找到当前任务";
}
}
catch (Exception ex)
{
compeletedResponse.code = "1";
compeletedResponse.message = ex.Message;
}
return compeletedResponse;
}
/// <summary>
/// 柜体拆分区通知返库
/// </summary>
/// <param name="taskReturn"></param>
/// <returns></returns>
public AgvCompeletedResponse TaskReturn(TaskReturn taskReturn)
{
AgvCompeletedResponse compeletedResponse = new AgvCompeletedResponse();
try
{
_dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
WcsTask wcsTask = _dbContext.WcsTask
.Where(t => t.taskType == 28)
.Where(t => t.materialId == taskReturn.materialId)
.FirstOrDefault();
if (wcsTask != null)
{
wcsTask.useFlag = 1;
_dbContext.WcsTask.Update(wcsTask);
_dbContext.SaveChanges();
compeletedResponse.code = "0";
compeletedResponse.message = "成功";
}
else
{
compeletedResponse.code = "1";
compeletedResponse.message = "未找到当前任务";
}
}
catch (Exception ex)
{
compeletedResponse.code = "1";
compeletedResponse.message = ex.Message;
}
return compeletedResponse;
}
}
}

@ -9,10 +9,21 @@ namespace Khd.Core.Domain.Dto.webapi
public class AgvCompeleted
{
public string stationId { get; set; }
public string stationNo { get; set; }
public string stationState { get; set; }
public string method { get; set; }
}
public class TaskContinue
{
public long? materialId { get; set; }
}
public class TaskReturn
{
public long? materialId { get; set; }
}
public class AgvCompeletedResponse
{
public string code { get; set; }

@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Khd.Core.Domain.Dto.webapi
{
public class AgvStatusDto
{
public string code { get; set; }
public List<cardStatus> data { get; set; }
}
public class cardStatus
{
public string battery { get; set; }
public string exclType { get; set; }
public string mapCode { get; set; }
public string online { get; set; }
public string[] path { get; set; }
public string podCode { get; set; }
public string podDir { get; set; }
public string posX { get; set; }
public string posY { get; set; }
public string robotCode { get; set; }
public string robotDir { get; set; }
public string robotIp { get; set; }
public string speed { get; set; }
public string status { get; set; }
public string stop { get; set; }
public string timestamp { get; set; }
}
}

@ -91,20 +91,20 @@ namespace Khd.Core.Domain.Models
/// <summary>
/// 备用字段1
/// </summary>
[Column("ud1")]
public string ud1 { get; set; }
[Column("agv_type")]
public string agvType { get; set; }
/// <summary>
/// 备用字段2
/// </summary>
[Column("ud2")]
public string ud2 { get; set; }
[Column("agv_task_type")]
public string agvTaskType { get; set; }
/// <summary>
/// 备用字段3
/// </summary>
[Column("ud3")]
public string ud3 { get; set; }
[Column("to_plc")]
public string ToPlc { get; set; }
/// <summary>
/// 备注

@ -17,6 +17,9 @@ namespace Khd.Core.Domain.Models
[Table("wcs_base_equip")]
public class BaseEquip
{
[Column("empty_count")]
public int? emptyCount;
[Column("agv_position_code")]
public string agvPositionCode { get; set; }
@ -125,6 +128,7 @@ namespace Khd.Core.Domain.Models
/// </summary>
[Column("remark")]
public string remark { get; set; }
}
}

@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace Khd.Core.Domain.Models
{
[Table("base_plcpoint")]
public class BasePlc
{
[Column("id")]
public int Id { get; set; }
[Column("name")]
public string Name { get; set; }
[Column("station")]
public string Station { get; set; }
[Column("address")]
public string Address { get; set; }
[Column("value")]
public string Value { get; set; }
[Column("type")]
public string type { get; set; }
}
}

@ -56,6 +56,21 @@ namespace Khd.Core.Domain.Models
/// <summary>
/// 任务类型,字典表
/// 27提升机输送线对接位-验收拆分区
/// 28验收拆分区-原材料周转区
/// 29回转输送线回库口-辅料库货架
/// 30辅料库货架-回转输送线出库口
/// 31回转输送线回库口-辅料库货架
/// 32物料分拣位-装配区领料工位
/// 33原材料周转区-背板安装区
/// 34背板安装区-半成品周转区
/// 35半成品周转区-检测台
/// 37检验台-成品区
/// 38成品区-提升机输送线对接点
/// 46原材料-柜体拆分区
/// 47接驳位-原材料周转区
///
///
/// </summary>
[Column("task_type")]
public int? taskType { get; set; }

@ -17,17 +17,13 @@ namespace Khd.Core.Domain.Models
[Table("wcs_task_log")]
public class WcsTaskLog
{
[Column("from_floor_no")]
public int? fromFloorNo { get; set; }
[Key]
[Column("objid")]
public long objid { get; set; }
/// <summary>
/// 任务ID
/// </summary>
[Column("taskid")]
public long? taskid { get; set; }
/// <summary>
/// wcs_warehouse_order 主键id
/// </summary>
@ -60,6 +56,21 @@ namespace Khd.Core.Domain.Models
/// <summary>
/// 任务类型,字典表
/// 27提升机输送线对接位-验收拆分区
/// 28验收拆分区-原材料周转区
/// 29回转输送线回库口-辅料库货架
/// 30辅料库货架-回转输送线出库口
/// 31回转输送线回库口-辅料库货架
/// 32物料分拣位-装配区领料工位
/// 33原材料周转区-背板安装区
/// 34背板安装区-半成品周转区
/// 35半成品周转区-检测台
/// 37检验台-成品区
/// 38成品区-提升机输送线对接点
/// 46原材料-柜体拆分区
/// 47接驳位-原材料周转区
///
///
/// </summary>
[Column("task_type")]
public int? taskType { get; set; }
@ -80,7 +91,7 @@ namespace Khd.Core.Domain.Models
/// 物料号
/// </summary>
[Column("material_no")]
public int? materialNo { get; set; }
public string? materialNo { get; set; }
/// <summary>
/// 数量
@ -112,11 +123,14 @@ namespace Khd.Core.Domain.Models
[Column("curr_point_id")]
public long? currPointId { get; set; }
/// <summary>
/// 下一点位id
/// </summary>
[Column("next_point_id")]
public long? nextPointId { get; set; }
/// <summary>
/// 结束点编号
/// 下一点位编号
/// </summary>
[Column("next_point_no")]
public string nextPointNo { get; set; }
@ -131,7 +145,7 @@ namespace Khd.Core.Domain.Models
/// 结束点id
/// </summary>
[Column("end_point_id")]
public Guid endPointId { get; set; }
public long? endPointId { get; set; }
/// <summary>
/// 所属楼层
@ -192,6 +206,9 @@ namespace Khd.Core.Domain.Models
/// </summary>
[Column("remark")]
public string remark { get; set; }
[Column("is_delete")]
public int? IsDelete { get; set; }
}
}

@ -40,7 +40,7 @@ namespace Khd.Core.Domain.Models
public string agvPositionCode { get; set; }
[Column("warehouse_floor")]
public int warehouseFloor { get; set; }
public int? warehouseFloor { get; set; }
/// <summary>
/// 库位编码
@ -221,6 +221,9 @@ namespace Khd.Core.Domain.Models
/// </summary>
[Column("height")]
public decimal? height { get; set; }
[Column("container_status")]
public string ContainerStatus { get; set; }
}
}

@ -106,11 +106,11 @@ namespace Khd.Core.Domain.Models
[Column("active_flag")]
public string activeFlag { get; set; }
/// <summary>
/// 审核标识 1是0否
/// </summary>
[Column("audit_flag")]
public string auditFlag { get; set; }
///// <summary>
///// 审核标识 1是0否
///// </summary>
//[Column("audit_flag")]
//public string auditFlag { get; set; }
/// <summary>
/// 返库标识(1是0否)

@ -22,6 +22,11 @@ namespace Khd.Core.Domain.Models
[Column("product_instock_id")]
public long productInstockId { get; set; }
[Column("sale_order_id")]
public long? SaleOrderId { get; set; }
[Column("saleorder_code")]
public string saleorderCode { get; set; }
/// <summary>
/// 任务编号
/// </summary>
@ -33,7 +38,11 @@ namespace Khd.Core.Domain.Models
/// </summary>
[Column("warehouse_id")]
public long warehouseId { get; set; }
/// <summary>
/// 仓库ID
/// </summary>
[Column("warehouse_floor")]
public int? warehouseFloor { get; set; }
/// <summary>
/// 库位编码
/// </summary>

@ -110,7 +110,7 @@ namespace Khd.Core.Domain.Models
/// 出库目的地
/// </summary>
[Column("end_station_code")]
public long? endStationCode { get; set; }
public string endStationCode { get; set; }
/// <summary>
/// 申请数量

@ -68,7 +68,7 @@ namespace Khd.Core.Domain.Models
/// 产品ID关联物料信息的物料ID
/// </summary>
[Column("product_id")]
public long productId { get; set; }
public long? productId { get; set; }
/// <summary>
/// 计划编号,关联pd_base_plan_info的plan_code

@ -90,7 +90,7 @@ namespace Khd.Core.Domain.Models
/// 已出库数量
/// </summary>
[Column("real_outstock_amount")]
public decimal realOutstockAmount { get; set; }
public decimal? realOutstockAmount { get; set; }
/// <summary>
/// 出库目的地

@ -0,0 +1,168 @@
//-----------------------------------------------------------------------
//<copyright>
// * Copyright (C) 2021 KEHAIDASOFT All Rights Reserved
// * version : 4.0.30319.42000
// * author : khd by t4-2
// </copyright>
//-----------------------------------------------------------------------
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Khd.Core.Domain.Models
{
[Table("wms_raw_return")]
public class WmsRawReturn
{
[Key]
[Column("raw_return_id")]
public long rawReturnId { get; set; }
/// <summary>
/// 任务编号
/// </summary>
[Column("task_code")]
public string taskCode { get; set; }
/// <summary>
/// 仓库ID;领料时需要保存
/// </summary>
[Column("warehouse_id")]
public long? warehouseId { get; set; }
/// <summary>
/// 库位编码
/// </summary>
[Column("location_code")]
public string locationCode { get; set; }
/// <summary>
/// 计划编号,关联mes_product_plan_info的plan_code
/// </summary>
[Column("plan_code")]
public string planCode { get; set; }
/// <summary>
/// 计划明细编号,关联mes_product_plan_detail的plan_detail_code
/// </summary>
[Column("plan_detail_code")]
public string planDetailCode { get; set; }
[Column("material_id")]
public long? materialId { get; set; }
/// <summary>
/// 物料批次
/// </summary>
[Column("material_batch")]
public string materialBatch { get; set; }
/// <summary>
/// 计划出库数量
/// </summary>
[Column("plan_amount")]
public decimal planAmount { get; set; }
/// <summary>
/// 已出库数量
/// </summary>
[Column("return_amount")]
public decimal returnAmount { get; set; }
/// <summary>
/// 出库目的地
/// </summary>
[Column("end_station_code")]
public string endStationCode { get; set; }
/// <summary>
/// 操作类型(0自动,1人工,2强制,3调度)
/// </summary>
[Column("operation_type")]
public string operationType { get; set; }
/// <summary>
/// 任务类型(1生产领料,2拆分出库,3组装出库,9其他)
/// </summary>
[Column("task_type")]
public string taskType { get; set; }
/// <summary>
/// 申请原因
/// </summary>
[Column("apply_reason")]
public string applyReason { get; set; }
/// <summary>
/// 审核原因
/// </summary>
[Column("audit_reason")]
public string auditReason { get; set; }
/// <summary>
/// 审核状态(0待审核,1审核通过,2审核未通过)
/// </summary>
[Column("audit_status")]
public string auditStatus { get; set; }
/// <summary>
/// 执行状态(0待执行,1执行中,2执行完成)
/// </summary>
[Column("execute_status")]
public string executeStatus { get; set; }
/// <summary>
/// 申请人
/// </summary>
[Column("apply_by")]
public string applyBy { get; set; }
/// <summary>
/// 申请时间
/// </summary>
[Column("apply_date")]
public DateTime? applyDate { get; set; }
/// <summary>
/// 审核人
/// </summary>
[Column("audit_by")]
public string auditBy { get; set; }
/// <summary>
/// 审核时间
/// </summary>
[Column("audit_date")]
public DateTime? auditDate { get; set; }
/// <summary>
/// 最后更新人
/// </summary>
[Column("update_by")]
public string updateBy { get; set; }
/// <summary>
/// 最后更新时间
/// </summary>
[Column("update_date")]
public DateTime? updateDate { get; set; }
/// <summary>
/// 执行开始时间
/// </summary>
[Column("begin_time")]
public DateTime? beginTime { get; set; }
/// <summary>
/// 执行结束时间
/// </summary>
[Column("end_time")]
public DateTime? endTime { get; set; }
}
}

@ -50,7 +50,7 @@ namespace Khd.Core.Domain.Models
/// 物料ID
/// </summary>
[Column("material_id")]
public long materialId { get; set; }
public long? materialId { get; set; }
/// <summary>
/// 入库批次号
@ -92,19 +92,19 @@ namespace Khd.Core.Domain.Models
/// 总数量;库位存放的总数量
/// </summary>
[Column("total_amount")]
public decimal totalAmount { get; set; }
public decimal? totalAmount { get; set; }
/// <summary>
/// 冻结数量;手动冻结的,暂时可不用
/// </summary>
[Column("frozen_amount")]
public decimal frozenAmount { get; set; }
public decimal? frozenAmount { get; set; }
/// <summary>
/// 占用数量;申请时占用的数量,在出库时要减去出库数量,并且总数量要同步更新;
/// </summary>
[Column("occupy_amount")]
public decimal occupyAmount { get; set; }
public decimal? occupyAmount { get; set; }
/// <summary>
/// 供应商ID

@ -1,4 +1,5 @@
using Khd.Core.Domain.Models;
using Khd.Core.Domain.Dto.wcs;
using Khd.Core.Domain.Models;
using Microsoft.EntityFrameworkCore;
namespace Khd.Core.EntityFramework
@ -8,12 +9,16 @@ namespace Khd.Core.EntityFramework
public DefaultDbContext(DbContextOptions<DefaultDbContext> options) : base(options)
{
}
public DbSet<WmsRawReturn> WmsRawReturn { get; set; }
public DbSet<BaseDictionary> BaseDictionary { get; set; }
public DbSet<BaseEquip> BaseEquip { get; set; }
public DbSet<BasePlcpoint> BasePlcpoint { get; set; }
public DbSet<BasePlc> BasePlc { get; set; }
public DbSet<MesBasePalletInfo> MesBasePalletInfo { get; set; }
public DbSet<WcsCmd> WcsCmd { get; set; }

@ -5,6 +5,7 @@
</PropertyGroup>
<ItemGroup>
<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="Swashbuckle.AspNetCore" Version="6.5.0" />

@ -0,0 +1,42 @@
using Mapster;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Khd.Core.Library.Mapper
{
public class CoreMapper
{
/// <summary>
/// Map source object to destination object
/// </summary>
/// <typeparam name="TDestination"> The type of the destination. </typeparam>
/// <param name="source"> The source object. </param>
/// <returns>The destination object. </returns>
/// <exception cref="ArgumentNullException"> Thrown when source is null. </exception>
public static TDestination Map<TDestination>(object source)
{
if(source == null)
throw new ArgumentNullException("Map Error : source is null");
TypeAdapterConfig config = new TypeAdapterConfig();
config.NewConfig<string, Guid>().MapWith(dest => string.IsNullOrEmpty(dest.Trim()) ? Guid.Empty : new Guid(dest));
config.NewConfig<string, Guid?>().MapWith(dest => string.IsNullOrEmpty(dest.Trim()) ? null : new Guid(dest));
config.NewConfig<Guid, string>().MapWith(dest => dest.ToString());
config.NewConfig<string, DateTime>().MapWith(dest => string.IsNullOrEmpty(dest) ? DateTime.Now : Convert.ToDateTime(dest));
config.NewConfig<string, DateTime?>().MapWith(dest => string.IsNullOrEmpty(dest) ? null : Convert.ToDateTime(dest));
config.NewConfig<DateTime, string>().MapWith(dest => dest.ToString());
// var c = source.Adapt(destination, config2);
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<Guid, String>().Map(member: @string => @string, source: guid => ("wode"));
config.Default.IgnoreNullValues(true);//忽略null
config.Default.NameMatchingStrategy(NameMatchingStrategy.IgnoreCase);//忽略大小写
var destination = source.Adapt<TDestination>(config);
return destination;
}
}
}

@ -260,5 +260,6 @@ namespace Khd.Core.Plc.S7
return package.ToArray();
}
}
}

@ -79,7 +79,7 @@ namespace Khd.Core.Plc.S7
return Read(adr.DataType, adr.DbNumber, adr.StartByte, adr.VarType, 1, (byte)adr.BitNumber);
}
public object? Read(string variable,VarType varType)
public object? Read(string variable, VarType varType)
{
var adr = new PLCAddress(variable);
return Read(adr.DataType, adr.DbNumber, adr.StartByte, varType, 1, (byte)adr.BitNumber);
@ -316,7 +316,7 @@ namespace Khd.Core.Plc.S7
}
catch (Exception exc)
{
throw new PlcException(ErrorCode.ReadData, exc);
throw new PlcException(ErrorCode.ReadData, this.IP, exc);
}
}
@ -348,7 +348,7 @@ namespace Khd.Core.Plc.S7
}
catch (Exception exc)
{
throw new PlcException(ErrorCode.WriteData, exc);
throw new PlcException(ErrorCode.WriteData, this.IP, exc);
}
}

@ -72,6 +72,10 @@ namespace Khd.Core.Plc
{
return Convert.ToByte(value);
}
if (len == "8")
{
return Convert.ToString(value);
}
return 0;
}
}

@ -5,9 +5,8 @@ namespace Khd.Core.Wcs
public class HttpHelper
{
public static string SendPostMessage(string ip, int port, string url, string message)
public static string SendPostMessage(string ip, int port, string url, string message,string contentType="application/Text")
{
var contentType = "application/Text";
string retsult = HttpPost("http://" + ip + ":" + port + "/" + url, message, contentType, 30, null);
return retsult;
}

@ -36,13 +36,32 @@ namespace Khd.Core.Wcs.Global
public static List<WmsWarehouseMaterial> WmsWarehouseMaterial = new List<WmsWarehouseMaterial>();
public static List<MesBasePalletInfo> MesBasePalletInfo = new List<MesBasePalletInfo>();
public static List<BaseDictionary> BaseDictionary = new List<BaseDictionary>();
public static List<BaseEquip> BaseEquip = new List<BaseEquip>();
private static object baseEquipLock = new object();
private static List<BaseEquip> _baseEquip= new List<BaseEquip>();
public static List<BaseEquip> BaseEquip
{
get
{
lock (baseEquipLock)
{
return _baseEquip;
}
}
set
{
lock (baseEquipLock)
{
_baseEquip = value;
}
}
}
public static List<WcsCmd> WcsCmd = new List<WcsCmd>();
public static List<WcsCmdLog> WcsCmdLog = new List<WcsCmdLog>();
public static List<WcsStock> WcsStock = new List<WcsStock>();
public static List<WcsInWareOrder> WcsInWareOrder = new List<WcsInWareOrder>();
public static List<WcsOutWareOrder> WcsOutWareOrder = new List<WcsOutWareOrder>();
public static List<BasePlc> basePlcs = new List<BasePlc>();
public static List<PlcConfig> PlcConfigs { get; set; }
public static Dictionary<int,Dictionary<string,PlcPoint>> PlcPoints = new Dictionary<int, Dictionary<string, PlcPoint>>();
public static Dictionary<int, Plc.S7.Plc> PlcDic = new Dictionary<int, Plc.S7.Plc>();

@ -1,4 +1,5 @@
using Khd.Core.EntityFramework;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Plc;
using Khd.Core.Plc.S7;
using Khd.Core.Wcs.Global;
@ -9,6 +10,7 @@ using Microsoft.Extensions.Hosting;
using System.Data;
using System.Net.Http.Headers;
using System.Text;
using Z.EntityFramework.Plus;
namespace Khd.Core.Wcs
{
@ -46,19 +48,31 @@ namespace Khd.Core.Wcs
//设置默认去向=>1为 Int16位
WcsMoRenQuXiang = StaticPlcHelper.GetValue("2", "1");
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
StaticData.BasePlcpointList = dbContext.BasePlcpoint.Where(t => t.isDelete == 0).ToList();
StaticData.BaseEquip = dbContext.BaseEquip.ToList();
StaticData.basePlcs = dbContext.BasePlc.ToList();
StaticData.BaseDictionary = dbContext.BaseDictionary.ToList();
foreach (var plcConfig in StaticData.PlcConfigs)
{
if (!StaticData.PlcDic.Any(t => t.Key == plcConfig.Code))
{
Plc.S7.Plc plc;
plc = new Plc.S7.Plc(plcConfig.CpuType, plcConfig.IP, plcConfig.Port, plcConfig.Rack, plcConfig.Slot);
plc.Open();
try
{
plc.Open();
Console.WriteLine(DateTime.Now + ":连接到PLC" + plcConfig.IP);
}
catch
{
Console.WriteLine(DateTime.Now + ":连接Plc" + plcConfig.IP + "失败~~~~~~~");
}
StaticData.PlcDic.TryAdd(plcConfig.Code, plc);
}
}
////创建任务
//////创建任务
//CreateTaskByRecord createTaskByRecord = new(_host, StaticData.PlcDic[0], "");
//createTaskByRecord.StartPoint();
@ -101,10 +115,10 @@ namespace Khd.Core.Wcs
//FiveFloorLine fiveFloorLine = new(_host, StaticData.PlcDic[0], FiveFloorLineEquip.floorNo.Value, FiveFloorLineEquip.equipNo);
//fiveFloorLine.StartPoint();
//五层CTU
var FiveFloorCTUEquip = StaticData.BaseEquip.Where(t => t.floorNo == 5 && t.equipType == 6).First();
FiveFloorCTU fiveFloorCTU = new(_host, StaticData.PlcDic[0], FiveFloorCTUEquip.floorNo.Value, FiveFloorCTUEquip.equipNo);
fiveFloorCTU.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, FiveFloorCTUEquip.equipNo);
//fiveFloorCTU.StartPoint();
////五层AGV
//var FifthFloorAgvEquip = StaticData.BaseEquip.Where(t => t.floorNo == 5 && t.equipType == 5).First();

File diff suppressed because it is too large Load Diff

@ -2,12 +2,14 @@
using Khd.Core.Application.Interface;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library.Mapper;
using Khd.Core.Plc;
using Khd.Core.Plc.S7;
using Khd.Core.Wcs.Global;
using Masuit.Tools.Logging;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System.Diagnostics;
using Z.EntityFramework.Plus;
namespace Khd.Core.Wcs.Wcs
@ -133,12 +135,25 @@ namespace Khd.Core.Wcs.Wcs
var task = dbContext.WcsTask.Where(t => t.containerNo == RFID001Value && t.taskStatus < 1).FirstOrDefault();
if (task == null)
{
//入库
//根据托盘号获取物料码
var material = dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == RFID001Value).FirstOrDefault();
if (material != null)
{
var lastTask = dbContext.WcsTaskLog.Where(t => t.containerNo == RFID001Value).OrderByDescending(t => t.createTime).FirstOrDefault();
if (lastTask != null)
{
if (lastTask.materialId == material.materialId && lastTask.ud3 != "10")
{
lastTask.ud2 = "1";
lastTask.ud3 = "1";
dbContext.Update(lastTask);
dbContext.SaveChanges();
LogManager.Info("一楼接驳位线程:托盘" + RFID001Value + "绑定信息未更新,请人工确认是否再次入库");
Console.WriteLine(DateTime.Now + ":一楼接驳位线程:托盘" + RFID001Value + "绑定信息未更新,请人工确认是否再次入库");
Thread.Sleep(3000);
continue;
}
}
var warehouseId = dbContext.WmsWarehouseMaterial.Where(t => t.storageType == "1" && t.storageId == material.materialId).FirstOrDefault()?.warehouseId;
if (warehouseId != null)
{
@ -147,7 +162,7 @@ namespace Khd.Core.Wcs.Wcs
{
//插入task表
var dic = StaticData.BaseDictionary.Where(t => t.dicKey == "TaskType" && t.ud1 == "I" && t.dicField == TargetFloor.warehouseInstockType).FirstOrDefault();
var dic = StaticData.BaseDictionary.Where(t => t.dicKey == "TaskType" && t.agvType == "I" && t.dicField == TargetFloor.warehouseInstockType).FirstOrDefault();
if (dic != null)
{
var newTask = new WcsTask()
@ -175,7 +190,10 @@ namespace Khd.Core.Wcs.Wcs
createTime = DateTime.Now,
remark = "一楼创建入库任务"
};
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(newTask);
dbContext.Add(wcsTaskLog);
dbContext.Add(newTask);
dbContext.SaveChanges();
}
}
}
@ -193,28 +211,50 @@ namespace Khd.Core.Wcs.Wcs
task.updateBy = "一楼接驳位线程";
task.updateTime = DateTime.Now;
task.remark = "一楼创建入库任务";
dbContext.WcsTask.Update(task);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(task);
dbContext.Update(wcsTaskLog);
dbContext.Update(task);
dbContext.SaveChanges();
}
}
//出库
else
{
//清空托盘绑定
var material = dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == RFID001Value).FirstOrDefault();
if (material != null)
{
material.bindAmount = 0;
material.materialBarcode = null;
material.materialCode = null;
material.materialId = null;
material.materialName = null;
material.updateBy = "SYS";
material.updateTime = DateTime.Now;
dbContext.Update(material);
//dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == RFID001Value).Delete();
dbContext.SaveChanges();
}
dbContext.WcsTask.Where(t => t.objid == task.objid).Delete();
dbContext.WcsTaskLog.Where(t => t.objid == task.objid).Update(t => new WcsTaskLog { taskStatus = 4 });
//没有绑定信息
//WmsProductOutstock? wmsProductOutstock = dbContext.WmsProductOutstock.FirstOrDefault(t => t.palletInfoCode == RFID001Value&& t.executeStatus =="1");
//WmsRawOutstock? wmsRawOutstock = dbContext.WmsRawOutstock.FirstOrDefault(t => t.palletInfoCode == RFID001Value && t.executeStatus == "1");
//if (wmsProductOutstock != null || wmsRawOutstock != null)
//{
// //清空托盘绑定
// var material = dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == RFID001Value).FirstOrDefault();
// if (material != null)
// {
// material.bindAmount = 0;
// material.materialBarcode = null;
// material.materialCode = null;
// material.materialId = null;
// material.materialName = null;
// material.updateBy = "WCS";
// material.updateTime = DateTime.Now;
// dbContext.Update(material);
// if (wmsRawOutstock != null)
// {
// wmsRawOutstock.executeStatus = "2";
// dbContext.Update(wmsRawOutstock);
// }
// else if(wmsProductOutstock != null)
// {
// wmsProductOutstock.executeStatus = "2";
// dbContext.Update(wmsProductOutstock);
// }
// //dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == RFID001Value).Delete();
// dbContext.SaveChanges();
// }
//}
}
}
}
@ -223,14 +263,13 @@ namespace Khd.Core.Wcs.Wcs
{
if (ex is PlcException)
{
try
foreach (var item in StaticData.PlcDic)
{
this._plc = new Plc.S7.Plc(this._plc.CPU, this._plc.IP, this._plc.Port, this._plc.Rack, this._plc.Slot);
this._plc.Open();
}
catch
{
if (item.Value.IP == ex.Message)
{
StaticData.PlcDic[item.Key] = new Plc.S7.Plc(item.Value.CPU, item.Value.IP, item.Value.Port, item.Value.Rack, item.Value.Slot);
StaticData.PlcDic[item.Key].Open();
}
}
}
LogManager.Error(ex);
@ -265,11 +304,22 @@ namespace Khd.Core.Wcs.Wcs
//提升机空闲
if (Convert.ToInt32(equipstate06Value) == 0)
{
var wcsTasks = dbContext.WcsTask.Where(t => t.nextPointId == T01).OrderBy(t => t.createTime);
var wcsTasks = dbContext.WcsTask.Where(t => t.nextPointId == T01).OrderBy(t => t.createTime).ToList();
foreach (var wcsTask in wcsTasks)
{
if (wcsTasks.Where(t => t.taskStatus > 0).Where(t => t.objid != wcsTask.objid).Any())
{
LogManager.Info("提升机线程:有其他任务正在执行,跳过当前任务");
continue;
}
BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.objid == wcsTask.floorNo);
if (wcsTask.taskStatus == 0 && Convert.ToInt32(hoisterTrayIn06Value) == 0)//创建状态,并且里面没有货物
{
if (lineEquip.equipStatus == 1)
{
LogManager.Info("提升机线程:" + wcsTask.floorNo + "楼接驳位有AGV任务跳过当前任务");
continue;
}
BasePlcpoint floorPoint = StaticData.BasePlcpointList.First(t => t.plcpointNo == "RFID00" + wcsTask.fromFloorNo);
if (wcsTask.containerNo == this._plc.ReadRFID(floorPoint.plcpointAddress))
{
@ -285,6 +335,9 @@ namespace Khd.Core.Wcs.Wcs
this._plc.WriteToPoint(basePlcpoint.plcpointAddress, "1", basePlcpoint.plcpointLength.ToString());
this._plc.WriteToPoint(this.serialno06.plcpointAddress, wcsTask.serialNo.ToString(), this.serialno06.plcpointLength.ToString());
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;
dbContext.Update(lineEquip);
dbContext.SaveChanges();
}
}
@ -297,6 +350,9 @@ namespace Khd.Core.Wcs.Wcs
this._plc.WriteToPoint(this.targetfloor06.plcpointAddress, wcsTask.fromFloorNo.ToString(), this.targetfloor06.plcpointLength.ToString());//目的地楼层
this._plc.WriteToPoint(this.serialno06.plcpointAddress, wcsTask.serialNo.ToString(), this.serialno06.plcpointLength.ToString());
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;
dbContext.Update(lineEquip);
dbContext.SaveChanges();
}
}
@ -318,6 +374,7 @@ namespace Khd.Core.Wcs.Wcs
this._plc.WriteToPoint(basePlcpoint.plcpointAddress, "1", basePlcpoint.plcpointLength.ToString());
this._plc.WriteToPoint(this.serialno06.plcpointAddress, wcsTask.serialNo.ToString(), this.serialno06.plcpointLength.ToString());
dbContext.Update(wcsTask);
dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 2, updateBy = "提升机线程", updateTime = DateTime.Now, remark = "提升机任务执行中" });
dbContext.SaveChanges();
}
}
@ -333,6 +390,7 @@ namespace Khd.Core.Wcs.Wcs
wcsTask.remark = "提升机任务执行完成";
this._plc.WriteToPoint(this.targetfloor06.plcpointAddress, wcsTask.floorNo.ToString(), this.targetfloor06.plcpointLength.ToString());//目的地楼层
dbContext.Update(wcsTask);
dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 3, updateBy = "提升机线程", updateTime = DateTime.Now, remark = "提升机任务执行完成" });
dbContext.SaveChanges();
}
}
@ -347,9 +405,26 @@ namespace Khd.Core.Wcs.Wcs
BasePlcpoint basePlcpoint = StaticData.BasePlcpointList.First(t => t.floorNo == wcsTask.fromFloorNo && t.plcpointNo.Contains("wcsrun"));
this._plc.WriteToPoint(basePlcpoint.plcpointAddress, "2", basePlcpoint.plcpointLength.ToString());//去向为2表示提升机已到达目的地让货出去
dbContext.Update(wcsTask);
dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid).Update(t => new WcsTaskLog { taskStatus = 4, updateBy = "提升机线程", updateTime = DateTime.Now, remark = "提升机任务执行完成" });
dbContext.SaveChanges();
}
}
else if (wcsTask.taskStatus == 4)
{
BaseEquip floorEquip = StaticData.BaseEquip.First(t => t.objid == wcsTask.floorNo);
wcsTask.nextPointId = floorEquip.objid;
wcsTask.nextPointNo = floorEquip.equipNo;
wcsTask.taskStatus = 5;
wcsTask.updateBy = "提升机线程";
wcsTask.updateTime = DateTime.Now;
wcsTask.remark = "提升机任务执行完成";
lineEquip.equipStatus = 0;
dbContext.Update(lineEquip);
dbContext.SaveChanges();
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 = "提升机任务执行完成" });
dbContext.SaveChanges();
}
break;
}
}
@ -361,8 +436,14 @@ namespace Khd.Core.Wcs.Wcs
{
try
{
this._plc = new Plc.S7.Plc(this._plc.CPU, this._plc.IP, this._plc.Port, this._plc.Rack, this._plc.Slot);
this._plc.Open();
foreach (var item in StaticData.PlcDic)
{
if (item.Value.IP == ex.Message)
{
StaticData.PlcDic[item.Key] = new Plc.S7.Plc(item.Value.CPU, item.Value.IP, item.Value.Port, item.Value.Rack, item.Value.Slot);
StaticData.PlcDic[item.Key].Open();
}
}
}
catch
{

@ -2,6 +2,7 @@
using Khd.Core.Domain.Dto.webapi;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library.Mapper;
using Khd.Core.Wcs.Global;
using Masuit.Tools.Logging;
using Microsoft.Extensions.DependencyInjection;
@ -64,6 +65,7 @@ namespace Khd.Core.Wcs.Wcs
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
List<int?> taskType = new() { 1, 3, 5, 7 };
BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.objid == agvID);
while (true)
{
try
@ -78,12 +80,17 @@ namespace Khd.Core.Wcs.Wcs
}
foreach (var item in taskList)
{
if (taskList.Where(t => t.taskStatus > 0).Where(t => t.objid != item.objid).Any())
{
LogManager.Info($"5楼AGV线程有其他任务正在执行跳过当前任务{item.objid}");
continue;
}
if (item.taskStatus == 0)//下发任务
{
if (item.taskType == 37)//入库任务
{
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.endPointId);
BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.floorNo == 5 && t.equipType == 1);
BaseEquip currentEquip = StaticData.BaseEquip.First(t => t.floorNo == 5 && t.equipType == 1);
WcsCmd wcsCmd = new()
{
objid = StaticData.SnowId.NextId(),
@ -95,7 +102,7 @@ namespace Khd.Core.Wcs.Wcs
createTime = DateTime.Now,
createBy = FloorNo + "楼AGV",
currPointId = item.currPointId,
currPointNo = baseEquip.agvPositionCode,
currPointNo = currentEquip.agvPositionCode,
nextPointId = item.endPointId,
nextPointNo = wmsBaseLocation.agvPositionCode,
};
@ -118,7 +125,7 @@ namespace Khd.Core.Wcs.Wcs
ctnrTyp = "2",
};
string message = JsonConvert.SerializeObject(agvTask);
string result = HttpHelper.SendPostMessage("172.16.12.24", 8182, "rcms/services/rest/hikRpcService/genAgvSchedulingTask", message);
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 == "成功")
{
@ -126,23 +133,33 @@ namespace Khd.Core.Wcs.Wcs
wcsCmd.cmdStatus = 1;
item.taskStatus = 1;
dbContext.Update(item);
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 1 });
WcsCmdLog wcsCmdLog = CoreMapper.Map<WcsCmdLog>(wcsCmd);
dbContext.Add(wcsCmdLog);
dbContext.Add(wcsCmd);
dbContext.SaveChanges();
}
else
{
LogManager.Info("五楼Agv下发任务失败" + item.taskType + message);
}
}
else if (item.taskType == 38)//出库任务
{
if (Convert.ToInt32(this._plc.Read(LineSignal.plcpointAddress)) == 1)
BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.objid == 5);
bool canSend = dbContext.WcsTask.Where(t => t.nextPointId == lineEquip.objid && t.taskStatus > 0).Any();
if (lineEquip.equipStatus == 1)
{
LogManager.Info("五楼AGV:接驳位有任务,无法下发出库任务");
continue;
}
if (Convert.ToInt32(this._plc.Read(LineSignal.plcpointAddress)) == 1 && !canSend)
{
Console.WriteLine($"{DateTime.Now}:5楼接驳位上有货无法下发Agv出库任务");
continue;
}
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.startPointId);
BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.floorNo == 5 && t.equipType == 1);
BaseEquip nextEquip = StaticData.BaseEquip.First(t => t.floorNo == 5 && t.equipType == 1);
WcsCmd wcsCmd = new()
{
objid = item.objid,
@ -156,7 +173,7 @@ namespace Khd.Core.Wcs.Wcs
currPointId = item.currPointId,
currPointNo = wmsBaseLocation.agvPositionCode,
nextPointId = item.endPointId,
nextPointNo = baseEquip.agvPositionCode,
nextPointNo = nextEquip.agvPositionCode,
};
RequestAGVTaskDto agvTask = new()
{
@ -178,7 +195,67 @@ namespace Khd.Core.Wcs.Wcs
ctnrTyp = "2"
};
string message = JsonConvert.SerializeObject(agvTask);
string result = HttpHelper.SendPostMessage("172.16.12.24", 8182, "rcms/services/rest/hikRpcService/genAgvSchedulingTask", message);
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 == "成功")
{
wcsCmd.taskCode = reponseMessage.data;
wcsCmd.cmdStatus = 1;
item.taskStatus = 1;
lineEquip.equipStatus = 1;
dbContext.Update(lineEquip);
dbContext.Update(item);
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 1 });
WcsCmdLog wcsCmdLog = CoreMapper.Map<WcsCmdLog>(wcsCmd);
dbContext.Add(wcsCmdLog);
dbContext.Add(wcsCmd);
dbContext.SaveChanges();
}
else
{
LogManager.Info("五楼Agv下发任务失败" + item.taskType + message);
}
}
else if (item.taskType == 33)//原材料到背板安装
{
BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == 30);
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.startPointId);
WcsCmd wcsCmd = new()
{
objid = item.objid,
cmdStatus = 0,
taskId = item.orderId,
useFlag = 1,
cmdType = item.taskType,
containerNo = item.containerNo,
createTime = DateTime.Now,
createBy = FloorNo + "楼AGV",
currPointId = item.currPointId,
currPointNo = wmsBaseLocation.agvPositionCode,
nextPointId = 30,
nextPointNo = endEquip.agvPositionCode,
};
RequestAGVTaskDto agvTask = new()
{
reqCode = item.objid.ToString(),
positionCodePath = new List<Position>
{
new ()
{
positionCode=wcsCmd.currPointNo,
type="00"
},
new ()
{
positionCode=wcsCmd.nextPointNo,
type="00"
}
},
taskTyp = "",
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 == "成功")
{
@ -186,14 +263,249 @@ namespace Khd.Core.Wcs.Wcs
wcsCmd.cmdStatus = 1;
item.taskStatus = 1;
dbContext.Update(item);
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 1 });
WcsCmdLog wcsCmdLog = CoreMapper.Map<WcsCmdLog>(wcsCmd);
dbContext.Add(wcsCmdLog);
dbContext.Add(wcsCmd);
dbContext.SaveChanges();
}
else
{
LogManager.Info("五楼Agv下发任务失败" + item.taskType + message);
}
}
else if (item.taskType == 34)//背板安装到半成品
{
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.endPointId);
BaseEquip currentEquip = StaticData.BaseEquip.First(t => t.objid == 30);
WcsCmd wcsCmd = new()
{
objid = StaticData.SnowId.NextId(),
cmdStatus = 0,
taskId = item.objid,
useFlag = 1,
cmdType = item.taskType,
containerNo = item.containerNo,
createTime = DateTime.Now,
createBy = FloorNo + "楼AGV",
currPointId = item.currPointId,
currPointNo = currentEquip.agvPositionCode,
nextPointId = item.endPointId,
nextPointNo = wmsBaseLocation.agvPositionCode,
};
var agvTask = new RequestAGVTaskDto
{
reqCode = item.objid.ToString(),
positionCodePath = new List<Position>
{
new ()
{
positionCode=wcsCmd.currPointNo,
type="00"
},
new ()
{
positionCode=wcsCmd.nextPointNo,
type="00"
}
},
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 == "成功")
{
wcsCmd.taskCode = reponseMessage.data;
wcsCmd.cmdStatus = 1;
item.taskStatus = 1;
dbContext.Update(item);
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 1 });
WcsCmdLog wcsCmdLog = CoreMapper.Map<WcsCmdLog>(wcsCmd);
dbContext.Add(wcsCmdLog);
dbContext.Add(wcsCmd);
dbContext.SaveChanges();
}
else
{
LogManager.Info("五楼Agv下发任务失败" + item.taskType + message);
}
}
else if (item.taskType == 46)//原材料到拆分区
{
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.startPointId);
BaseEquip currentEquip = StaticData.BaseEquip.First(t => t.objid == 29);
WcsCmd wcsCmd = new()
{
objid = item.objid,
cmdStatus = 0,
taskId = item.orderId,
useFlag = 1,
cmdType = item.taskType,
containerNo = item.containerNo,
createTime = DateTime.Now,
createBy = FloorNo + "楼AGV",
currPointId = item.currPointId,
currPointNo = wmsBaseLocation.agvPositionCode,
nextPointId = 29,
nextPointNo = currentEquip.agvPositionCode,
};
RequestAGVTaskDto agvTask = new()
{
reqCode = item.objid.ToString(),
positionCodePath = new List<Position>
{
new ()
{
positionCode=wcsCmd.currPointNo,
type="00"
},
new ()
{
positionCode=wcsCmd.nextPointNo,
type="00"
}
},
taskTyp = "",
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 == "成功")
{
wcsCmd.taskCode = reponseMessage.data;
wcsCmd.cmdStatus = 1;
item.taskStatus = 1;
dbContext.Update(item);
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 1 });
WcsCmdLog wcsCmdLog = CoreMapper.Map<WcsCmdLog>(wcsCmd);
dbContext.Add(wcsCmdLog);
dbContext.Add(wcsCmd);
dbContext.SaveChanges();
}
else
{
LogManager.Info("五楼Agv下发任务失败" + item.taskType + message);
}
}
else if (item.taskType == 28)//拆分区返库
{
BaseEquip currentEquip = StaticData.BaseEquip.First(t => t.objid == 29);
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.endPointId);
WcsCmd wcsCmd = new()
{
objid = item.objid,
cmdStatus = 0,
taskId = item.orderId,
useFlag = 1,
cmdType = item.taskType,
containerNo = item.containerNo,
createTime = DateTime.Now,
createBy = FloorNo + "楼AGV",
currPointId = item.currPointId,
currPointNo = currentEquip.agvPositionCode,
nextPointId = item.endPointId,
nextPointNo = wmsBaseLocation.agvPositionCode,
};
RequestAGVTaskDto agvTask = new()
{
reqCode = item.objid.ToString(),
positionCodePath = new List<Position>
{
new()
{
positionCode = wcsCmd.currPointNo,
type = "00"
},
new()
{
positionCode = wcsCmd.nextPointNo,
type = "00"
}
}
};
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 == "成功")
{
wcsCmd.taskCode = reponseMessage.data;
wcsCmd.cmdStatus = 1;
item.taskStatus = 1;
dbContext.Update(item);
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 1 });
WcsCmdLog wcsCmdLog = CoreMapper.Map<WcsCmdLog>(wcsCmd);
dbContext.Add(wcsCmdLog);
dbContext.Add(wcsCmd);
dbContext.SaveChanges();
}
else
{
LogManager.Info("五楼Agv下发任务失败" + item.taskType + message);
}
}
else if (item.taskType == 47)//原材料入库
{
BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == 5);
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.endPointId);
WcsCmd wcsCmd = new WcsCmd
{
objid = StaticData.SnowId.NextId(),
cmdStatus = 0,
taskId = item.objid,
useFlag = 1,
cmdType = item.taskType,
containerNo = item.containerNo,
createTime = DateTime.Now,
createBy = FloorNo + "楼AGV",
currPointId = startEquip.objid,
currPointNo = startEquip.agvPositionCode,
nextPointId = item.endPointId,
nextPointNo = wmsBaseLocation.agvPositionCode,
};
var agvTask = new RequestAGVTaskDto
{
reqCode = item.objid.ToString(),
positionCodePath = new List<Position>
{
new ()
{
positionCode=wcsCmd.currPointNo,
type="00"
},
new ()
{
positionCode=wcsCmd.nextPointNo,
type="00"
}
},
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 == "成功")
{
wcsCmd.taskCode = reponseMessage.data;
wcsCmd.cmdStatus = 1;
item.taskStatus = 1;
dbContext.Update(item);
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 1 });
WcsCmdLog wcsCmdLog = CoreMapper.Map<WcsCmdLog>(wcsCmd);
dbContext.Add(wcsCmdLog);
dbContext.Add(wcsCmd);
dbContext.SaveChanges();
}
else
{
LogManager.Info("五楼Agv下发任务失败" + item.taskType + message);
}
}
}
else
{
WcsCmd? wcsCmd = dbContext.WcsCmd.FirstOrDefault(t => t.objid == item.objid);
WcsCmd? wcsCmd = dbContext.WcsCmd.FirstOrDefault(t => t.taskId == item.objid);
if (wcsCmd != null)
{
if (wcsCmd.cmdStatus == 3)
@ -204,86 +516,254 @@ namespace Khd.Core.Wcs.Wcs
taskCode = wcsCmd.taskCode
};
string message = JsonConvert.SerializeObject(agvTask);
string result = HttpHelper.SendPostMessage("172.16.12.24", 8182, "rcms/services/rest/hikRpcService/continueTask", message);
string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/continueTask", message);
ReponseMessage? reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
wcsCmd.cmdStatus = 4;
dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmd() { cmdStatus = 4 });
dbContext.Update(wcsCmd);
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 });
dbContext.SaveChanges();
}
}
else if (wcsCmd.cmdStatus == 5)
{
//任务完成
//如果是入库任务,更新库存信息,并删除任务
if (taskType.Contains(item.taskType))
if (item.taskType == 37)//入库
{
//WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation
// .First(t => t.locationId == item.startPointId && t.warehouseFloor == 5);
//wmsBaseLocation.locationStatus = "1";
//wmsBaseLocation.instockFlag = "0";
//wmsBaseLocation.containerCode = item.containerNo;
//wmsBaseLocation.updateTime = DateTime.Now;
//wmsBaseLocation.updateBy = "WCS";
//MesBasePalletInfo? mesBasePalletInfo = dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == item.containerNo).FirstOrDefault();
//if (mesBasePalletInfo != null)
//{
// WmsProductStock wmsProductStock = new WmsProductStock()
// {
// productBatch = mesBasePalletInfo.materialBarcode,
// palletInfoCode = mesBasePalletInfo.palletInfoCode,
// activeFlag = "1",
// createBy = "WCS",
// createDate = DateTime.Now,
// frozenAmount = 0,
// instockDate = DateTime.Now,
// locationCode = wmsBaseLocation.locationCode,
// occupyAmount = 0,
// warehouseFloor = 5,
// saleorderCode = mesBasePalletInfo.materialBarcode,
// stockType = "3",
// totalAmount = 1,
// };
// dbContext.Update(wmsBaseLocation);
// dbContext.WcsTask.Where(t => t.objid == item.objid).Delete();
// dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6 });
// dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog { cmdStatus = 6 });
// dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Delete();
// dbContext.SaveChanges();
//}
}
else if (item.taskType == 38)//出库
{
BaseEquip lineEquip = StaticData.BaseEquip.First(t=>t.objid==5);
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation
.First(t => t.locationId == item.startPointId && t.warehouseFloor == 5);
.First(t => t.locationId == item.endPointId && t.warehouseFloor == 5);
wmsBaseLocation.outstockFlag = "0";
wmsBaseLocation.locationStatus = "1";
wmsBaseLocation.containerCode = "";
wmsBaseLocation.updateTime = DateTime.Now;
wmsBaseLocation.updateBy = "WCS";
dbContext.Update(wmsBaseLocation);
dbContext.WmsProductStock.Where(t => t.locationCode == wmsBaseLocation.locationCode).Delete();
BaseEquip floorLineEquip = StaticData.BaseEquip.First(t => t.equipType == 1 && t.floorNo == 5);
item.nextPointId = floorLineEquip.objid;
item.nextPointNo = floorLineEquip.equipNo;
item.fromFloorNo = 5;
item.floorNo = 1;
item.taskStatus = 6;
lineEquip.equipStatus = 0;
dbContext.Update(lineEquip);
dbContext.Update(item);
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6, nextPointId = floorLineEquip.objid, nextPointNo = floorLineEquip.equipNo, fromFloorNo = 5, floorNo = 1 });
dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog { cmdStatus = 6 });
dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Delete();
dbContext.WcsTask.Where(t => t.objid == item.objid).Delete();
dbContext.SaveChanges();
}
else//如果是出库任务,更新库存信息,下一个任务为提升机
else if (item.taskType == 33)//原材料到背板安装
{
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation
.First(t => t.locationId == item.startPointId && t.warehouseFloor == 5);
if (item.taskType == 38)//出库
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.startPointId);
wmsBaseLocation.locationStatus = "1";
wmsBaseLocation.outstockFlag = "0";
wmsBaseLocation.containerCode = "";
wmsBaseLocation.updateTime = DateTime.Now;
wmsBaseLocation.updateBy = "WCS";
dbContext.Update(wmsBaseLocation);
dbContext.WmsRawStock.Where(t => t.locationCode == wmsBaseLocation.locationCode).Delete();
dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Delete();
dbContext.WcsTask.Where(t => t.objid == item.objid).Delete();
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6 });
dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog { cmdStatus = 6 });
dbContext.SaveChanges();
}
else if (item.taskType == 34)//半成品入库
{
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.endPointId);
wmsBaseLocation.locationStatus = "1";
wmsBaseLocation.instockFlag = "0";
wmsBaseLocation.containerCode = item.containerNo;
wmsBaseLocation.updateTime = DateTime.Now;
wmsBaseLocation.updateBy = "WCS";
var mesBasePalletInfo = dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == item.containerNo).FirstOrDefault();
var wmsProductInstock = dbContext.WmsProductInstock
.Where(t => t.palletInfoCode == item.containerNo)
.Where(t => t.instockType == "2" && t.executeStatus == "1" && t.productType == "2" && t.warehouseFloor == 5)
.FirstOrDefault();
if (mesBasePalletInfo != null && wmsProductInstock != null)
{
wmsBaseLocation.outstockFlag = "0";
wmsBaseLocation.locationStatus = "1";
wmsBaseLocation.containerCode = "";
wmsBaseLocation.updateTime = DateTime.Now;
wmsBaseLocation.updateBy = "SYS";
WmsProductStock wmsProductStock = new WmsProductStock()
{
productId = wmsProductInstock.productId,
activeFlag = "1",
updateBy = "WCS",
updateDate = DateTime.Now,
saleorderCode = wmsProductInstock.saleorderCode,
saleOrderId = wmsProductInstock.SaleOrderId,
stockType = "2",
productStockId = wmsProductInstock.productInstockId,
qualityStatus = "0",
createBy = "WCS",
createDate = DateTime.Now,
locationCode = wmsBaseLocation.locationCode,
warehouseFloor = 5,
totalAmount = 1,
instockDate = DateTime.Now,
productBatch = mesBasePalletInfo.materialBarcode,
palletInfoCode = mesBasePalletInfo.palletInfoCode,
frozenAmount = 0,
occupyAmount = 0,
planCode = wmsProductInstock.planCode,
planDetailCode = wmsProductInstock.planDetailCode,
warehouseId = 512
};
dbContext.Add(wmsProductStock);
dbContext.Update(wmsBaseLocation);
BaseEquip floorLineEquip = StaticData.BaseEquip.First(t => t.equipType == 1 && t.floorNo == 5);
BaseEquip eletorEquip = StaticData.BaseEquip.First(t => t.equipType == 2);
item.nextPointId = floorLineEquip.objid;
item.nextPointNo = floorLineEquip.equipNo;
item.fromFloorNo = 5;
item.floorNo = 1;
item.taskStatus = 6;
dbContext.Update(item);
dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Delete();
dbContext.WcsTask.Where(t => t.objid == item.objid).Delete();
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6 });
dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog { cmdStatus = 6 });
dbContext.SaveChanges();
}
}
else if (item.taskType == 46)//该任务结束后立刻生成一个新的返库任务但是是否使用标志未0等待mes通知
{
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.startPointId);
wmsBaseLocation.outstockFlag = "0";
wmsBaseLocation.instockFlag = "1";
wmsBaseLocation.containerCode = "";
wmsBaseLocation.updateTime = DateTime.Now;
wmsBaseLocation.updateBy = "WCS";
dbContext.Update(wmsBaseLocation);
dbContext.WcsTask.Where(t => t.objid == item.objid).Delete();
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6 });
dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog { cmdStatus = 6 });
dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Delete();
item.objid = StaticData.SnowId.NextId();
item.currPointId = item.endPointId;
item.currPointNo = item.endPointNo;
item.endPointId = item.startPointId;
item.endPointNo = item.startPointNo;
item.startPointId = item.currPointId;
item.startPointNo = item.currPointNo;
item.taskType = 28;
item.taskStatus = 0;
item.useFlag = 0;
dbContext.Add(item);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(item);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
}
else if (item.taskType == 28)//柜体拆分到原材料
{
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.endPointId);
wmsBaseLocation.locationStatus = "1";
wmsBaseLocation.instockFlag = "0";
wmsBaseLocation.containerCode = item.containerNo;
wmsBaseLocation.updateTime = DateTime.Now;
wmsBaseLocation.updateBy = "WCS";
wmsBaseLocation.returnFlag = "1";
var wmsRawStock = dbContext.WmsRawStock.FirstOrDefault(t => t.locationCode == wmsBaseLocation.locationCode);
if (wmsRawStock != null)
{
wmsRawStock.completeFlag = "0";
wmsRawStock.updateDate = DateTime.Now;
wmsRawStock.updateBy = "WCS";
dbContext.Update(wmsRawStock);
dbContext.Update(wmsBaseLocation);
dbContext.WcsTask.Where(t => t.objid == item.objid).Delete();
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6 });
dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog { cmdStatus = 6 });
dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Delete();
dbContext.SaveChanges();
}
else if (item.taskType == 37)//入库
}
else if (item.taskType == 47)
{
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.endPointId);
wmsBaseLocation.instockFlag = "0";
wmsBaseLocation.locationStatus = "1";
wmsBaseLocation.containerCode = item.containerNo;
var mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == item.containerNo);
if (mesBasePalletInfo != null)
{
wmsBaseLocation.locationStatus = "1";
wmsBaseLocation.instockFlag = "0";
dbContext.Update(wmsBaseLocation);
BaseEquip floorLineEquip = StaticData.BaseEquip.First(t => t.equipType == 1 && t.floorNo == 5);
BaseEquip eletorEquip = StaticData.BaseEquip.First(t => t.equipType == 2);
item.nextPointId = floorLineEquip.objid;
item.nextPointNo = floorLineEquip.equipNo;
item.fromFloorNo = 5;
item.floorNo = 1;
item.taskStatus = 6;
dbContext.Update(item);
dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Delete();
dbContext.SaveChanges();
var mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode);
if (mesBaseBarcodeInfo != null)
{
WmsRawStock wmsRawStock = new()
{
palletInfoCode = mesBasePalletInfo.palletInfoCode,
activeFlag = "1",
createBy = "WCS",
createDate = DateTime.Now,
frozenAmount = 0,
instockDate = DateTime.Now,
locationCode = wmsBaseLocation.locationCode,
occupyAmount = 0,
warehouseFloor = 5,
stockType = "1",
totalAmount = 1,
saleOrderId = 0,
supplierId = mesBaseBarcodeInfo.manufacturerId,
materialId = mesBasePalletInfo.materialId,
qualityStatus = "0",
rawStockId = StaticData.SnowId.NextId(),
completeFlag = "1",
instockBatch = mesBaseBarcodeInfo.batchCode,
updateBy = "WCS",
updateDate = DateTime.Now,
warehouseId = 511
};
dbContext.Add(wmsRawStock);
dbContext.Add(wmsBaseLocation);
dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Delete();
dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog { cmdStatus = 6 });
dbContext.WcsTask.Where(t => t.objid == item.objid).Delete();
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6 });
dbContext.SaveChanges();
}
}
}
}
}
}
break;
}
//foreach (var item in taskList)
//{
// SendAndUpdateTask(item);
//}
}
catch (Exception ex)
{
@ -297,102 +777,5 @@ namespace Khd.Core.Wcs.Wcs
}
public List<WcsTask> GetTask(int floorNo, string equipNo)
{
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
List<WcsTask> wcsTask = new List<WcsTask>();
var wareHouseList = StaticData.WmsBaseWarehouse.ToList();
var equip = StaticData.BaseEquip.Where(t => t.floorNo == floorNo && t.equipType == 4).FirstOrDefault();
//入库类型
List<int> taskInType = new() { 1, 3, 5, 7 };
List<int> taskOutType = new() { 2, 4, 6, 8 };
try
{
//获取条码号,如果该条码任务存在就继续任务,如果条码不存在,创建入库任务并调度agv
var taskList = StaticData.WcsTask.Where(t => t.nextPointId == equip.objid).ToList();
if (taskList.Count() == 0)
{ return null; }
wcsTask = taskList;
}
catch (Exception ex)
{
LogManager.Info(floorNo + "楼AGV异常" + ex.Message);
throw;
}
return wcsTask;
}
public void SendAndUpdateTask(WcsTask task)
{
//获取
if (task == null) return;
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
WcsToWms wcsToWms = new WcsToWms();
//首先判断是否已下发指令
var cmd = dbContext.WcsCmd.Where(t => t.taskId == task.objid).FirstOrDefault();
var locList = dbContext.WmsBaseLocation.Where(t => t.activeFlag == "1").ToList();
if (locList.Count == 0) return;
//指令表存在说明已下发
if (cmd == null)
{ //获取下发agv指令
string ip = ""; int port = 0; string url = "";
RequestAGVTaskDto agvtask = new RequestAGVTaskDto();
agvtask.reqCode = task.objid.ToString();
//var json = JsonConvert.SerializeObject(agvtask);
//HttpHelper.SendPostMessage(ip, port, url, json);
agvtask.positionCodePath = new List<Position>();
Position p = new Position();
WmsBaseLocation putPos = new WmsBaseLocation(); //放料点
WmsBaseLocation setPos = new WmsBaseLocation(); //取料点
if (task.taskType == 5) //入库
{
setPos = locList.Where(t => t.locationId == task.nextPointId).FirstOrDefault();
}
else
{
setPos = locList.Where(t => t.locationId == task.nextPointId).FirstOrDefault();
}
putPos = locList.Where(t => t.locationId == task.nextPointId).FirstOrDefault();
p.positionCode = setPos?.agvPositionCode;
p.type = "";
agvtask.positionCodePath.Add(p);
p.positionCode = putPos?.agvPositionCode;
p.type = "";
//取料点
agvtask.positionCodePath.Add(p);
agvtask.taskTyp = "";
//给agv创建任务
var reponseMessage = wcsToWms.genAgvSchedulingTask(agvtask);
if (reponseMessage != null)
{
}
//未下发给agv下发指令
WcsCmd taskCmd = new WcsCmd()
{
taskId = task.objid,
cmdType = task.taskType,
serialNo = task.serialNo,
equipmentNo = task.equipmentNo,
cmdStatus = 1,
createBy = FloorNo + "楼AGV",
createTime = DateTime.Now,
};
dbContext.Add(taskCmd);
dbContext.SaveChanges();
//更新任务表
dbContext.WcsTask.Where(t => t.objid == task.objid).Update(t => new WcsTask()
{
currPointId = task.currPointId,
currPointNo = task.currPointNo,
nextPointId = task.nextPointId,
nextPointNo = task.nextPointNo,
updateTime = DateTime.Now,
updateBy = "agv出库",
});
}
}
}
}

@ -1,6 +1,7 @@
using Khd.Core.Domain.Dto.webapi;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library.Mapper;
using Khd.Core.Wcs.Global;
using Masuit.Tools.Logging;
using Microsoft.Extensions.DependencyInjection;
@ -15,7 +16,10 @@ using Z.EntityFramework.Plus;
namespace Khd.Core.Wcs.Wcs
{
internal class FiveFloorBearAgv
/// <summary>
/// 背负式AGV
/// </summary>
public class FiveFloorBearAgv
{
List<BasePlcpoint> ScanPoint { get; set; }//点位信息
@ -66,26 +70,26 @@ namespace Khd.Core.Wcs.Wcs
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
List<int?> taskType = new() { 1, 3, 5, 7 };
BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.objid == agvID);
while (true)
{
try
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
var taskList = dbContext.WcsTask
.Where(t => t.useFlag == 1)
.Where(t => t.nextPointId == agvID)
.OrderBy(t => t.createTime).ToList();
if (taskList.Count == 0)
{
LogManager.Info(FloorNo + "楼AGV无任务");
}
foreach (var item in taskList)
foreach (var item in taskList)//出库
{
if (item.taskStatus == 0)//下发任务
{
BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == item.startPointId);
BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == item.endPointId);
BaseDictionary baseDictionary = dbContext.BaseDictionary.First(t=>t.objid==item.taskType);
BaseDictionary baseDictionary = dbContext.BaseDictionary.First(t => t.objid == item.taskType);
WcsCmd wcsCmd = new()
{
objid = StaticData.SnowId.NextId(),
@ -109,19 +113,19 @@ namespace Khd.Core.Wcs.Wcs
new ()
{
positionCode=wcsCmd.currPointNo,
type="00"
type=baseDictionary.agvType
},
new ()
{
positionCode=wcsCmd.nextPointNo,
type="00"
type=baseDictionary.agvType
}
},
taskTyp=baseDictionary.dicValue,
taskTyp = baseDictionary.dicValue,
ctnrTyp = "2",
};
string message = JsonConvert.SerializeObject(agvTask);
string result = HttpHelper.SendPostMessage("172.16.12.24", 8182, "rcms/services/rest/hikRpcService/genAgvSchedulingTask", message);
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.code == "0")
{
@ -129,6 +133,9 @@ namespace Khd.Core.Wcs.Wcs
wcsCmd.cmdStatus = 1;
item.taskStatus = 1;
dbContext.Update(item);
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 1 });
WcsCmdLog wcsCmdLog = CoreMapper.Map<WcsCmdLog>(wcsCmd);
dbContext.Add(wcsCmdLog);
dbContext.Add(wcsCmd);
dbContext.SaveChanges();
}
@ -139,56 +146,70 @@ namespace Khd.Core.Wcs.Wcs
}
else
{
WcsCmd? wcsCmd = dbContext.WcsCmd.FirstOrDefault(t => t.taskId == item.objid);
if (wcsCmd != null)
if (item.useFlag == 1)//接料位-工位默认为1工位到接料位需Mes通知
{
if (wcsCmd.cmdStatus == 3)
WcsCmd? wcsCmd = dbContext.WcsCmd.FirstOrDefault(t => t.taskId == item.objid);
if (wcsCmd != null)
{
var agvTask = new RequestAGVTaskDto
if (wcsCmd.cmdStatus == 3)
{
reqCode = StaticData.SnowId.NextId().ToString(),
taskCode = wcsCmd.taskCode
};
string message = JsonConvert.SerializeObject(agvTask);
string result = HttpHelper.SendPostMessage("172.16.12.24", 8182, "rcms/services/rest/hikRpcService/continueTask", message);
ReponseMessage? reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
var agvTask = new RequestAGVTaskDto
{
reqCode = StaticData.SnowId.NextId().ToString(),
taskCode = wcsCmd.taskCode
};
string message = JsonConvert.SerializeObject(agvTask);
string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/continueTask", message);
ReponseMessage? reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmd() { cmdStatus = 4 });
dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog() { cmdStatus = 4 });
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 });
dbContext.SaveChanges();
}
}
else if (wcsCmd.cmdStatus == 5)
{
dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Update(t => t.cmdStatus == 4);
dbContext.WcsTask.Where(t => t.objid == item.objid).Update(t => t.taskStatus == 4);
dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmd() { cmdStatus = 6 });
dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog() { cmdStatus = 6 });
dbContext.WcsTask.Where(t => t.objid == item.objid).Update(t => new WcsTask() { taskStatus = 6 });
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 6 });
dbContext.SaveChanges();
}
}
else if (wcsCmd.cmdStatus == 5)
{
dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Update(t=>t.cmdStatus==6);
dbContext.WcsTask.Where(t => t.objid == item.objid).Update(t => t.taskStatus == 6);
dbContext.SaveChanges();
}
else if (wcsCmd.cmdStatus == 7)
{
var agvTask = new RequestAGVTaskDto
else if (wcsCmd.cmdStatus == 7)
{
reqCode = StaticData.SnowId.NextId().ToString(),
taskCode = wcsCmd.taskCode
};
string message = JsonConvert.SerializeObject(agvTask);
string result = HttpHelper.SendPostMessage("172.16.12.24", 8182, "rcms/services/rest/hikRpcService/continueTask", message);
ReponseMessage? reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Delete();
dbContext.WcsTask.Where(t => t.objid == item.objid).Delete();
dbContext.SaveChanges();
var agvTask = new RequestAGVTaskDto
{
reqCode = StaticData.SnowId.NextId().ToString(),
taskCode = wcsCmd.taskCode
};
string message = JsonConvert.SerializeObject(agvTask);
string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/continueTask", message);
ReponseMessage? reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Delete();
dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog() { cmdStatus = 8 });
dbContext.WcsTask.Where(t => t.objid == item.objid).Delete();
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 8 });
if (item.taskType == 48)
{
dbContext.WmsRawReturn.Where(t => t.rawReturnId == item.orderId).Update(t => new WmsRawReturn { executeStatus = "2" });
}
else
{
}
dbContext.SaveChanges();
}
}
}
}
}
break;
}
//foreach (var item in taskList)
//{
// SendAndUpdateTask(item);
//}
}
catch (Exception ex)
{

@ -1,11 +1,18 @@
using Khd.Core.Domain.Dto.webapi;
using AngleSharp.Css.Dom;
using Castle.Core.Logging;
using Khd.Core.Domain.Dto.webapi;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library.Mapper;
using Khd.Core.Plc;
using Khd.Core.Plc.S7;
using Khd.Core.Wcs.Global;
using Masuit.Tools;
using Masuit.Tools.Logging;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Newtonsoft.Json;
using System;
using Z.EntityFramework.Plus;
namespace Khd.Core.Wcs.Wcs
@ -17,10 +24,12 @@ namespace Khd.Core.Wcs.Wcs
{
List<BasePlcpoint> ScanPoint { get; set; }//点位信息
private readonly IHost _host;
private readonly Plc.S7.Plc _plc;
private Plc.S7.Plc _plc;
private readonly BasePlcpoint LineRFID;
private readonly BasePlcpoint isarrive;
private readonly BasePlcpoint isput;
private bool isWait = false;
private bool isSendWait = false;
int FloorNo { get; set; }
string EquipNo = "";
int CTUID = 11;
@ -57,8 +66,12 @@ namespace Khd.Core.Wcs.Wcs
Thread FlowPointThread = new Thread(MonitorInLocatorPoint);
FlowPointThread.Start();
//Thread FlowCTUInWareThread = new Thread(MonitorInWare);
//FlowCTUInWareThread.Start();
Thread FlowCTUInWareThread = new Thread(MonitorInWare);
FlowCTUInWareThread.Start();
Thread CtuWaitThread = new Thread(CtuWaitLogic);
CtuWaitThread.Start();
Console.WriteLine(DateTime.Now + ":五楼CTU上件扫描监听启动");
LogManager.Info("五楼CTU上件扫描监听启动");
}
@ -72,71 +85,155 @@ namespace Khd.Core.Wcs.Wcs
try
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
var rfid = this._plc.Read(LineRFID.plcpointAddress);
var rfid = this._plc.ReadRFID(LineRFID.plcpointAddress);
var isArrive = this._plc.Read(isarrive.plcpointAddress);
if (rfid != null && isArrive != null && Convert.ToInt32(isArrive) == 1)
{
//根据rfid找到库位
//生成入库任务
var wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.containerCode == rfid.ToString());
BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.equipNo == "FL051");
BaseEquip ctuEquip = StaticData.BaseEquip.First(t => t.objid == 11);
if (wmsBaseLocation != null)
rfid = rfid[rfid.IndexOf('C')..];
WcsTask? task = dbContext.WcsTask.FirstOrDefault(t => t.containerNo == rfid);
if (task == null)
{
var wcsTask = new WcsTask()
//根据rfid找到库位
//生成入库任务
var wmsBaseLocation = dbContext.WmsBaseLocation.FirstOrDefault(t => t.containerCode == rfid);
if (wmsBaseLocation != null)
{
objid = StaticData.SnowId.NextId(),
startPointId = baseEquip.objid,
startPointNo = baseEquip.agvPositionCode,
currPointId = baseEquip.objid,
currPointNo = baseEquip.agvPositionCode,
nextPointId = ctuEquip.objid,
nextPointNo = ctuEquip.equipNo,
endPointId = wmsBaseLocation.locationId,
endPointNo = wmsBaseLocation.agvPositionCode,
taskType = 1,
taskStatus = 0,
floorNo = 5,
ud1 = "0",//是否是最后一个任务
containerNo = rfid.ToString(),
equipmentNo = baseEquip.equipNo,
createBy = FloorNo + "楼CTU",
createTime = DateTime.Now,
};
dbContext.Add(wcsTask);
dbContext.SaveChanges();
BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.equipNo == "FL051");
BaseEquip ctuEquip = StaticData.BaseEquip.First(t => t.objid == 11);
if (wmsBaseLocation != null)
{
var wcsTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
startPointId = baseEquip.objid,
startPointNo = baseEquip.agvPositionCode,
currPointId = baseEquip.objid,
currPointNo = baseEquip.agvPositionCode,
nextPointId = ctuEquip.objid,
nextPointNo = ctuEquip.equipNo,
endPointId = wmsBaseLocation.locationId,
endPointNo = wmsBaseLocation.agvPositionCode,
taskType = 29,
taskStatus = 0,
floorNo = 5,
containerNo = rfid.ToString(),
equipmentNo = baseEquip.equipNo,
createBy = FloorNo + "楼CTU",
createTime = DateTime.Now,
};
wmsBaseLocation.instockFlag = "1";
wmsBaseLocation.locationStatus = "2";
dbContext.Update(wmsBaseLocation);
dbContext.Add(wcsTask);
//WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
//dbContext.WcsTaskLog.Add(wcsTaskLog);
dbContext.SaveChanges();
}
}
}
}
}
catch
catch(Exception ex)
{
if (ex is PlcException)
{
try
{
this._plc = new Plc.S7.Plc(this._plc.CPU, this._plc.IP, this._plc.Port, this._plc.Rack, this._plc.Slot);
this._plc.Open();
}
catch
{
}
}
}
Thread.Sleep(1000);
}
}
/// <summary>
/// 预执行任务下发
/// </summary>
private void CtuWaitLogic()
{
BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.objid == CTUID);
BaseEquip Fl051 = StaticData.BaseEquip.First(t => t.objid == 19);//入库输送线
while (true)
{
try
{
while (isWait)
{
var waitTask = new
{
reqCode = StaticData.SnowId.NextId().ToString(),
positionCode = "CTU_IN",
nextTask = 1200
};
string waitMessage = JsonConvert.SerializeObject(waitTask);
string waitResult = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/genPreScheduleTask", waitMessage);
var waitReponse = JsonConvert.DeserializeObject<ReponseMessage>(waitResult);
if (waitReponse != null && waitReponse.code == "0")
{
isSendWait = true;
}
else
{
LogManager.Info("CTU下发预执行任务失败:\nwaitTask:" + waitMessage + "\nwaitResult:" + waitResult);
}
Thread.Sleep(1000 * 60 * 10);//每10分钟重新下发预执行任务
}
isSendWait = false;
}
catch (Exception ex)
{
LogManager.Error(ex);
}
Thread.Sleep(3000);
}
}
/// <summary>
/// 监控上件扫描点位
/// </summary>
public void MonitorInLocatorPoint()
{
List<int?> taskType = new() { 1, 3, 5, 7 };
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.objid == CTUID);
while (true)
{
try
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
var taskList = dbContext.WcsTask.Where(t => t.nextPointId == CTUID).ToList();
var taskList = dbContext.WcsTask.Where(t => t.nextPointId == CTUID).OrderBy(t=>t.createTime).ToList();
if (taskList.Count == 0)
{
LogManager.Info(FloorNo + "楼CTU无任务");
}
foreach (var item in taskList)
{
if (!taskList.Where(t => t.taskType == 29 && t.ud1 == "2").Any())
{
if (item.ud1 == "1")
{
ExecuteInTask(baseEquip);
WcsOutstockLock wcsOutstockLock = dbContext.WcsOutstockLock.Where(t => t.warehouseId == 512).First();
wcsOutstockLock.qty = 0;
wcsOutstockLock.boxStatus = 0;
dbContext.Update(wcsOutstockLock);
isWait = false;
item.ud1 = "2";
dbContext.Update(item);
}
}
if (item.taskStatus == 0)//CTU会同时生成多个任务生成就下发
{
if (item.taskType == 30)//出库任务
{
BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.objid == item.endPointId);
BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == item.endPointId);
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.startPointId);
var wcsCmd = new WcsCmd()
{
@ -150,8 +247,8 @@ namespace Khd.Core.Wcs.Wcs
createBy = FloorNo + "楼CTU",
currPointId = wmsBaseLocation.locationId,
currPointNo = wmsBaseLocation.agvPositionCode,
nextPointId = baseEquip.objid,
nextPointNo = baseEquip.agvPositionCode,
nextPointId = endEquip.objid,
nextPointNo = endEquip.agvPositionCode,
taskCode = null
};
var agvTask = new RequestAGVTaskDto
@ -174,21 +271,31 @@ namespace Khd.Core.Wcs.Wcs
taskTyp = "F504"
};
string message = JsonConvert.SerializeObject(agvTask);
string result = HttpHelper.HttpPost("http://172.16.12.24:8182/rcms/services/rest/hikRpcService/genAgvSchedulingTask", message);
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 == "成功")
if (reponseMessage != null && reponseMessage.code == "0")
{
wcsCmd.taskCode = reponseMessage.data;
wcsCmd.cmdStatus = 1;
item.taskStatus = 1;
dbContext.Update(item);
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 1 });
WcsCmdLog wcsCmdLog = CoreMapper.Map<WcsCmdLog>(wcsCmd);
dbContext.Add(wcsCmdLog);
WcsOutstockLock wcsOutstockLock = dbContext.WcsOutstockLock.Where(t => t.warehouseId == 512).First();
wcsOutstockLock.qty = wcsOutstockLock.qty + 1;
dbContext.Update(wcsOutstockLock);
dbContext.WcsCmd.Add(wcsCmd);
dbContext.SaveChanges();
}
else
{
LogManager.Info("CTU下发出库任务失败" + reponseMessage?.message);
}
}
else if (item.taskType == 29)//入库任务
{
BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.objid == item.startPointId);
BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == item.startPointId);
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.endPointId);
var wcsCmd = new WcsCmd()
{
@ -202,13 +309,16 @@ namespace Khd.Core.Wcs.Wcs
createBy = FloorNo + "楼CTU",
nextPointId = wmsBaseLocation.locationId,
nextPointNo = wmsBaseLocation.agvPositionCode,
currPointId = baseEquip.objid,
currPointNo = baseEquip.agvPositionCode,
currPointId = startEquip.objid,
currPointNo = startEquip.agvPositionCode,
};
var agvTask = new RequestAGVTaskDto
isWait = true;
if (isSendWait)
{
reqCode = StaticData.SnowId.NextId().ToString(),
positionCodePath = new List<Position>
var agvTask = new
{
reqCode = StaticData.SnowId.NextId().ToString(),
positionCodePath = new List<Position>
{
new()
{
@ -221,21 +331,38 @@ namespace Khd.Core.Wcs.Wcs
type = "05"
},
},
ctnrTyp = "1",
taskTyp = "F503"
};
string message = JsonConvert.SerializeObject(agvTask);
string result = HttpHelper.HttpPost("http://172.16.12.24:8182/rcms/services/rest/hikRpcService/genAgvSchedulingTask", message);
var reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
wcsCmd.taskCode = reponseMessage.data;
wcsCmd.cmdStatus = 1;
item.taskStatus = 1;
dbContext.Update(wmsBaseLocation);
dbContext.Update(item);
dbContext.Add(wcsCmd);
dbContext.SaveChanges();
ctnrTyp = "1",
taskTyp = "F503"
};
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.code == "0")
{
wcsCmd.taskCode = reponseMessage.data;
wcsCmd.cmdStatus = 1;
item.taskStatus = 1;
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 1 });
WcsCmdLog wcsCmdLog = CoreMapper.Map<WcsCmdLog>(wcsCmd);
dbContext.Add(wcsCmdLog);
dbContext.Update(item);
dbContext.Add(wcsCmd);
int ctuTaskCount = dbContext.WcsTask.Where(t => t.taskType == 29 || t.taskType == 30).Count();
WcsOutstockLock wcsOutstockLock = dbContext.WcsOutstockLock.Where(t => t.warehouseId == 512).First();
if (ctuTaskCount >= 6 || wcsOutstockLock.qty == ctuTaskCount)//如果CTU当前任务数量很多取消预执行任务
{
ExecuteInTask(baseEquip);
wcsOutstockLock.qty = 0;
wcsOutstockLock.boxStatus = 0;
dbContext.Update(wcsOutstockLock);
isWait = false;
}
dbContext.SaveChanges();
}
else
{
LogManager.Info("CTU下发入库任务失败" + reponseMessage?.message);
}
}
}
}
@ -246,10 +373,11 @@ namespace Khd.Core.Wcs.Wcs
{
if (wcsCmd.cmdStatus == 3)
{
var canOut = this._plc.Read("");
if (canOut != null && Convert.ToInt64(canOut) == 1)
if (item.taskType == 30)
{
if (item.taskType == 30)
var canOut = this._plc.Read(isput.plcpointAddress);
if (canOut != null && Convert.ToInt64(canOut) == 1)
{
var agvTask = new
{
@ -258,40 +386,52 @@ namespace Khd.Core.Wcs.Wcs
type = 2
};
string message = JsonConvert.SerializeObject(agvTask);
string result = HttpHelper.HttpPost("http://172.16.12.24:8182/rcms/services/rest/hikRpcService/boxApplyPass", message);
string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/boxApplyPass", message);
ReponseMessage? reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
if (reponseMessage != null && reponseMessage.code == "0")
{
wcsCmd.cmdStatus = 4;
dbContext.Update(wcsCmd);
dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmd() { cmdStatus = 4 });
dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog() { cmdStatus = 4 });
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 });
dbContext.SaveChanges();
}
else
{
LogManager.Info("CTU第一次下发继续任务失败" + reponseMessage?.message);
}
}
else if(item.taskType ==29)
}
if (item.taskType == 29)
{
var agvTask = new
{
var agvTask = new
{
reqCode = StaticData.SnowId.NextId().ToString(),
taskCode = wcsCmd.taskCode,
type = 1
};
string message = JsonConvert.SerializeObject(agvTask);
string result = HttpHelper.HttpPost("http://172.16.12.24:8182/rcms/services/rest/hikRpcService/boxApplyPass", message);
ReponseMessage? reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
wcsCmd.cmdStatus = 4;
dbContext.Update(wcsCmd);
dbContext.SaveChanges();
}
reqCode = StaticData.SnowId.NextId().ToString(),
taskCode = wcsCmd.taskCode,
type = 1
};
string message = JsonConvert.SerializeObject(agvTask);
string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/boxApplyPass", message);
ReponseMessage? reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.code == "0")
{
dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmd() { cmdStatus = 4 });
dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog() { cmdStatus = 4 });
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 });
dbContext.SaveChanges();
}
else
{
LogManager.Info("CTU第二次下发继续任务失败" + reponseMessage?.message);
}
}
}
else if (wcsCmd.cmdStatus == 5)
{
//任务完成
//如果是库任务,更新库存信息,并删除任务
if (taskType.Contains(item.taskType))
//如果是库任务,更新库存信息,并删除任务
if (item.taskType == 30)
{
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation
.First(t => t.locationId == item.startPointId && t.warehouseFloor == 5);
@ -300,29 +440,22 @@ namespace Khd.Core.Wcs.Wcs
dbContext.Update(wmsBaseLocation);
dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Delete();
dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog() { cmdStatus = 6 });
dbContext.WcsTask.Where(t => t.objid == item.objid).Delete();
dbContext.WcsTaskLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsTaskLog() { taskStatus = 6 });
dbContext.SaveChanges();
}
else//如果是库任务,更新库存信息,下一个任务为提升机
else//如果是库任务,更新库存信息,下一个任务为提升机
{
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation
.First(t => t.locationId == item.startPointId && t.warehouseFloor == 5);
if (item.taskType == 29)
{
wmsBaseLocation.outstockFlag = "0";
wmsBaseLocation.locationStatus = "1";
dbContext.Update(wmsBaseLocation);
}
BaseEquip floorLineEquip = StaticData.BaseEquip.First(t => t.equipType == 1 && t.floorNo == 5);
BaseEquip eletorEquip = StaticData.BaseEquip.First(t => t.equipType == 2);
item.nextPointId = floorLineEquip.objid;
item.nextPointNo = floorLineEquip.equipNo;
item.fromFloorNo = 5;
item.floorNo = 1;
item.taskStatus = 6;
dbContext.Update(item);
.First(t => t.locationId == item.endPointId && t.warehouseFloor == 5);
wmsBaseLocation.instockFlag = "0";
wmsBaseLocation.locationStatus = "1";
dbContext.Update(wmsBaseLocation);
dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Delete();
dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog() { cmdStatus = 6 });
dbContext.WcsTask.Where(t => t.objid == item.objid).Delete();
dbContext.WcsTaskLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsTaskLog() { taskStatus = 6 });
dbContext.SaveChanges();
}
}
@ -341,7 +474,34 @@ namespace Khd.Core.Wcs.Wcs
}
}
/// <summary>
/// 通知CTU取消预执行任务
/// </summary>
/// <param name="baseEquip"></param>
/// <param name="wcsCmd"></param>
private void ExecuteInTask(BaseEquip baseEquip)
{
//while (isWait)
{
var executeTask = new
{
reqCode = StaticData.SnowId.NextId().ToString(),
positionCode = "CTU_IN",
nextTask = -1
};
string executeMessage = JsonConvert.SerializeObject(executeTask);
string executeResult = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/genPreScheduleTask", executeMessage);
var executeReponse = JsonConvert.DeserializeObject<ReponseMessage>(executeResult);
if (executeReponse != null && executeReponse.code == "0")
{
LogManager.Info("下发CTU执行入库任务成功");
}
else
{
LogManager.Info("下发CTU执行入库任务失败");
}
}
}
/// <summary>
/// 下发任务

@ -1,120 +1,120 @@
using Khd.Core.Domain.Dto.webapi;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Wcs.Global;
using Masuit.Tools.Logging;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Z.EntityFramework.Plus;
//using Khd.Core.Domain.Dto.webapi;
//using Khd.Core.Domain.Models;
//using Khd.Core.EntityFramework;
//using Khd.Core.Wcs.Global;
//using Masuit.Tools.Logging;
//using Microsoft.Extensions.DependencyInjection;
//using Microsoft.Extensions.Hosting;
//using Z.EntityFramework.Plus;
namespace Khd.Core.Wcs.Wcs
{
/// <summary>
/// 五楼人工分拣输送线
/// </summary>
public class FiveFloorLine
{
List<BasePlcpoint> ScanPoint { get; set; }//点位信息
private readonly IHost _host;
private readonly Plc.S7.Plc _plc;
private readonly BasePlcpoint LineRFID;
private readonly BasePlcpoint IsArrive;
private readonly BasePlcpoint IsPut;
int FloorNo { get; set; }
string EquipNo = "";
int CTUID = 11;
public FiveFloorLine(IHost host, Plc.S7.Plc plc, int floor, string equipNo)
{
this._host = host;
this._plc = plc;
FloorNo = floor;
EquipNo = equipNo;
this.ScanPoint = StaticData.BasePlcpointList.Where(t => t.floorNo == floor).ToList();//加载当前站点所对应的点位
this.LineRFID = this.ScanPoint.First(t => t.plcpointNo == "RFID5001");
this.IsArrive = this.ScanPoint.First(t => t.plcpointNo.Contains("isarrive"));
this.IsPut = this.ScanPoint.First(t => t.plcpointNo == "isput");
//namespace Khd.Core.Wcs.Wcs
//{
// /// <summary>
// /// 五楼人工分拣输送线
// /// </summary>
// public class FiveFloorLine
// {
// List<BasePlcpoint> ScanPoint { get; set; }//点位信息
// private readonly IHost _host;
// private readonly Plc.S7.Plc _plc;
// private readonly BasePlcpoint LineRFID;
// private readonly BasePlcpoint IsArrive;
// private readonly BasePlcpoint IsPut;
// int FloorNo { get; set; }
// string EquipNo = "";
// int CTUID = 11;
// public FiveFloorLine(IHost host, Plc.S7.Plc plc, int floor, string equipNo)
// {
// this._host = host;
// this._plc = plc;
// FloorNo = floor;
// EquipNo = equipNo;
// this.ScanPoint = StaticData.BasePlcpointList.Where(t => t.floorNo == floor).ToList();//加载当前站点所对应的点位
// this.LineRFID = this.ScanPoint.First(t => t.plcpointNo == "RFID5001");
// this.IsArrive = this.ScanPoint.First(t => t.plcpointNo.Contains("isarrive"));
// this.IsPut = this.ScanPoint.First(t => t.plcpointNo == "isput");
//var lineRFID = this._plc.Read(NodeSettingCarNo.plcpointAddress);
try
{
//默认启动,清理plc的上位机写入点位值
this._plc.Write(LineRFID.plcpointAddress, MainCentralControl.QingKongDianWei);
}
catch (Exception ex)
{
Console.WriteLine("楼层" + floor + " 初始化数据异常" + ex.Message);
LogManager.Error(ex);
}
}
/// <summary>
/// 启动上件扫描监听
/// </summary>
public void StartPoint()
{
// //var lineRFID = this._plc.Read(NodeSettingCarNo.plcpointAddress);
// try
// {
// //默认启动,清理plc的上位机写入点位值
// this._plc.Write(LineRFID.plcpointAddress, MainCentralControl.QingKongDianWei);
// }
// catch (Exception ex)
// {
// Console.WriteLine("楼层" + floor + " 初始化数据异常" + ex.Message);
// LogManager.Error(ex);
// }
// }
// /// <summary>
// /// 启动上件扫描监听
// /// </summary>
// public void StartPoint()
// {
Thread FlowPointThread = new Thread(MonitorInLocatorPoint);
FlowPointThread.Start();
Console.WriteLine(DateTime.Now+":五楼人工分拣输送线启动成功");
LogManager.Info("五楼人工分拣输送线启动成功");
}
// Thread FlowPointThread = new Thread(MonitorInLocatorPoint);
// FlowPointThread.Start();
// Console.WriteLine(DateTime.Now+":五楼人工分拣输送线启动成功");
// LogManager.Info("五楼人工分拣输送线启动成功");
// }
public void MonitorInLocatorPoint()
{
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
while (true)
{
try
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
var rfid = this._plc.Read(LineRFID.plcpointAddress);
var isarrive = this._plc.Read(IsArrive.plcpointAddress);
//获取条码信息
var palletNo = Convert.ToString(rfid);
var taskid = 0;
WcsToWms wcsToWms = new WcsToWms();
continueTaskDto agvtask = new continueTaskDto();
//入库:待取料
if (rfid != null && isarrive != null)
{
//正常读到输送线信息 有到位信号,并且有托盘,获取条码信息
if (Convert.ToInt32(isarrive) == 1)
{
var wcsTaskList = dbContext.WcsTask.Where(t => t.taskType == 7).ToList();
var cmd = dbContext.WcsCmd.Where(t => t.containerNo == rfid && t.cmdStatus == 14).FirstOrDefault();
if (cmd != null)
{
agvtask.reqCode = cmd.taskId.ToString();
//给ctu下发继续任务指令
wcsToWms.continueTask(agvtask);
}
}
}
//出库:取料完成待放料
if (IsPut != null)
{
var cmdList = dbContext.WcsCmd.Where(t => t.cmdStatus == 15).ToList();
if (cmdList == null) return;
foreach (var item in cmdList)
{
if (item != null)
{
agvtask.reqCode = item.taskId.ToString();
//给ctu下发继续任务指令
wcsToWms.continueTask(agvtask);
}
}
}
}
catch (Exception ex)
{
LogManager.Error(ex);
}
finally
{
Thread.Sleep(1000);
}
}
}
}
}
// public void MonitorInLocatorPoint()
// {
// using var scope = _host.Services.CreateScope();
// using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
// while (true)
// {
// try
// {
// dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
// var rfid = this._plc.Read(LineRFID.plcpointAddress);
// var isarrive = this._plc.Read(IsArrive.plcpointAddress);
// //获取条码信息
// var palletNo = Convert.ToString(rfid);
// var taskid = 0;
// WcsToWms wcsToWms = new WcsToWms();
// continueTaskDto agvtask = new continueTaskDto();
// //入库:待取料
// if (rfid != null && isarrive != null)
// {
// //正常读到输送线信息 有到位信号,并且有托盘,获取条码信息
// if (Convert.ToInt32(isarrive) == 1)
// {
// var wcsTaskList = dbContext.WcsTask.Where(t => t.taskType == 7).ToList();
// var cmd = dbContext.WcsCmd.Where(t => t.containerNo == rfid && t.cmdStatus == 14).FirstOrDefault();
// if (cmd != null)
// {
// agvtask.reqCode = cmd.taskId.ToString();
// //给ctu下发继续任务指令
// wcsToWms.continueTask(agvtask);
// }
// }
// }
// //出库:取料完成待放料
// if (IsPut != null)
// {
// var cmdList = dbContext.WcsCmd.Where(t => t.cmdStatus == 15).ToList();
// if (cmdList == null) return;
// foreach (var item in cmdList)
// {
// if (item != null)
// {
// agvtask.reqCode = item.taskId.ToString();
// //给ctu下发继续任务指令
// wcsToWms.continueTask(agvtask);
// }
// }
// }
// }
// catch (Exception ex)
// {
// LogManager.Error(ex);
// }
// finally
// {
// 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.Mapper;
using Khd.Core.Plc;
using Khd.Core.Wcs.Global;
using Masuit.Tools.Logging;
@ -8,6 +9,7 @@ using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Newtonsoft.Json;
using System.Security.Cryptography;
using Z.EntityFramework.Plus;
namespace Khd.Core.Wcs.Wcs
{
@ -82,10 +84,10 @@ namespace Khd.Core.Wcs.Wcs
var palletNo = Convert.ToString(rfid);
BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.equipType == 1 && t.floorNo == FloorNo);
var wcsTask = dbContext.WcsTask.OrderBy(t => t.createTime)
.FirstOrDefault(t => t.floorNo == FloorNo && t.containerNo == palletNo);
.FirstOrDefault(t => t.containerNo == palletNo && t.nextPointId == baseEquip.objid);
if (wcsTask != null)
{
if (ITypes.Contains(wcsTask.taskType) && wcsTask.taskStatus == 4)//入库,提升机任务是完成状态
if (wcsTask.taskStatus == 5)//入库,提升机任务是完成状态
{
var wmsBaseLocations = dbContext.WmsBaseLocation.Where(t => t.warehouseFloor == FloorNo)
.Where(t => t.activeFlag == "1")
@ -96,69 +98,137 @@ namespace Khd.Core.Wcs.Wcs
//.Where(t => t.locationStatus == "1")
//.Where(t => string.IsNullOrEmpty(t.containerCode))
.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) 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
&& a.b.locRow == b.locRow
&& a.b.locColumn == b.locColumn
&& b.locationStatus == "1"
&& b.outstockFlag == "0"
&& b.instockFlag == "0"
&& 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.floorNo == 5 && t.equipType == 5);//背负Agv
if (wmsBaseLocations.Count > 0 && wmsBaseLocation != null)
if (wmsBaseLocations.Count > 0)
{
wcsTask.taskStatus = 0;//创建状态
wcsTask.updateTime = DateTime.Now;
wcsTask.currPointId = baseEquip.objid;
wcsTask.currPointNo = baseEquip.equipNo;
wcsTask.nextPointId = AgvEquip.objid;
wcsTask.nextPointNo = AgvEquip.equipNo;
wcsTask.endPointId = wmsBaseLocation.locationId;
wcsTask.endPointNo = wmsBaseLocation.locationCode;
wcsTask.useFlag = 0;//什么情况下需要确认
wmsBaseLocation.instockFlag = "1";
wmsBaseLocation.locationStatus = "2";
dbContext.Update(wmsBaseLocation);
dbContext.Update(wcsTask);
dbContext.SaveChanges();
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
&& a.b.locRow == b.locRow
&& a.b.locColumn == b.locColumn
&& b.locationStatus == "1"
&& b.outstockFlag == "0"
&& b.instockFlag == "0"
&& 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.floorNo == 5 && t.equipType == 5);//背负Agv
if (wmsBaseLocations.Count > 0 && wmsBaseLocation != null)
{
wcsTask.taskStatus = 0;//创建状态
wcsTask.updateTime = DateTime.Now;
wcsTask.currPointId = baseEquip.objid;
wcsTask.currPointNo = baseEquip.equipNo;
wcsTask.nextPointId = AgvEquip.objid;
wcsTask.nextPointNo = AgvEquip.equipNo;
wcsTask.endPointId = wmsBaseLocation.locationId;
wcsTask.endPointNo = wmsBaseLocation.locationCode;
if (wmsBaseLocation.warehouseId == 531)
{
wcsTask.taskType = 37;
wcsTask.useFlag = 1;
}
else if (wmsBaseLocation.warehouseId == 511 && wcsTask.fromFloorNo == 4)
{
wcsTask.taskType = 47;//?28?
wcsTask.useFlag = 0;
}
else if (wmsBaseLocation.warehouseId == 511)
{
wcsTask.taskType = 47;
wcsTask.useFlag = 1;
}
else
{
Console.WriteLine($"{DateTime.Now}:5楼接驳位查找入库类型失败");
Thread.Sleep(1000);
continue;
}
wmsBaseLocation.instockFlag = "1";
wmsBaseLocation.locationStatus = "2";
dbContext.Update(wmsBaseLocation);
dbContext.Update(wcsTask);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
}
else
{
Console.WriteLine(DateTime.Now + ":五楼接驳位调度入库任务,未找到库位");
LogManager.Info("五楼接驳位调度入库任务,未找到库位");
}
}
}
else if (wcsTask.taskStatus == 6) //出库任务,小车任务是完成状态
{
int? floor = 0;
var wmsProductOutstock = dbContext.WmsProductOutstock.FirstOrDefault(t => t.saleOrderId == wcsTask.orderId);
if (wmsProductOutstock != null)
{
var endEquip = StaticData.BaseEquip.FirstOrDefault(t => t.equipNo == wmsProductOutstock.endStationCode);
if (endEquip != null)
{
floor = endEquip.floorNo;
}
}
else
{
Console.WriteLine(DateTime.Now + ":五楼接驳位调度入库任务,未找到库位");
var wmsRawOutstock = dbContext.WmsRawOutstock.FirstOrDefault(t => t.orderId == wcsTask.orderId);
if (wmsRawOutstock != null)
{
BaseEquip 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;
}
}
else//出库
{
BaseEquip nextEquip = StaticData.BaseEquip.First(t => t.equipType == 2);//提升机
wcsTask.nextPointId = nextEquip.objid;
wcsTask.nextPointNo = nextEquip.equipNo;
wcsTask.currPointId = baseEquip.objid;
wcsTask.currPointNo = baseEquip.equipNo;
wcsTask.fromFloorNo = FloorNo;
wcsTask.floorNo = 1;//出库到一楼
wcsTask.taskType = 6;//成品出库
wcsTask.floorNo = floor;//出库到一楼
wcsTask.taskStatus = 0;
wcsTask.updateTime = DateTime.Now;
dbContext.Update(wcsTask);
dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid)
.Update(t => new WcsTaskLog
{
nextPointId = nextEquip.objid,
nextPointNo = nextEquip.equipNo,
currPointId = baseEquip.objid,
currPointNo = baseEquip.equipNo,
fromFloorNo = FloorNo,
floorNo = floor,
taskStatus = 0,
updateTime = DateTime.Now,
});
dbContext.SaveChanges();
}
}
@ -192,7 +262,7 @@ namespace Khd.Core.Wcs.Wcs
//查询该条码绑定的物料信息
var material = StaticData.WmsWarehouseMaterial.Where(t => t.storageId == palletInfo.materialId).FirstOrDefault();
var wareHouse = wareHouseList.Where(t => t.warehouseId == material.warehouseId).FirstOrDefault();
var dic = StaticData.BaseDictionary.Where(t => t.dicKey == "TaskType" && t.ud1 == "I" && t.dicField == wareHouse.warehouseInstockType).FirstOrDefault();
var dic = StaticData.BaseDictionary.Where(t => t.dicKey == "TaskType" && t.agvType == "I" && t.dicField == wareHouse.warehouseInstockType).FirstOrDefault();
var equip = StaticData.BaseEquip.ToList();
var startEquip = equip.Where(t => t.equipNo == equipNo).FirstOrDefault();
var endPoint = wareHouseList.Where(t => t.warehouseFloor == floorNo).FirstOrDefault();

@ -1,5 +1,7 @@
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library.Mapper;
using Khd.Core.Plc;
using Khd.Core.Plc.S7;
using Khd.Core.Wcs.Global;
using Masuit.Tools.Logging;
@ -21,7 +23,7 @@ namespace Khd.Core.Wcs.Wcs
{
private readonly int Floor;
private readonly Plc.S7.Plc _plc;
private readonly IHost host;
private readonly IHost _host;
private readonly BasePlcpoint LineRFID;
private readonly BasePlcpoint LineSignal;
private readonly BasePlcpoint WcsRun;
@ -29,7 +31,7 @@ namespace Khd.Core.Wcs.Wcs
{
Floor = floor;
_plc = plc;
this.host = host;
this._host = host;
this.LineRFID = StaticData.BasePlcpointList.First(t => t.floorNo == 4 && t.plcpointNo.Contains("RFID"));
this.LineSignal = StaticData.BasePlcpointList.First(t => t.floorNo == 4 && t.plcpointNo.Contains("signal"));
this.WcsRun = StaticData.BasePlcpointList.First(t => t.floorNo == 4 && t.plcpointNo.Contains("wcsrun"));
@ -37,103 +39,85 @@ namespace Khd.Core.Wcs.Wcs
public void StartPoint()
{
Thread MonitorInLocatorPointThread=new Thread(MonitorInLocatorPoint);
Thread MonitorInLocatorPointThread = new Thread(MonitorInLocatorPoint);
MonitorInLocatorPointThread.Start();
}
private void MonitorInLocatorPoint()
{
List<int?> Itpyes = new() { 1, 3, 5, 7 };
using var scope = host.Services.CreateScope();
List<int> ITypes = new List<int> { 1, 3, 5, 7 };
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
while (true)
{
try
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
var RFID004Value = this._plc.Read(this.LineRFID.plcpointAddress); //一楼RFID 读
var linesignal04Value = this._plc.Read(this.LineSignal.plcpointAddress); //到位信号 读
var wcsrun04Value = this._plc.Read(this.WcsRun.plcpointAddress); //去向 写
//正常读到plc值
if (linesignal04Value != null && RFID004Value != null)
//入库任务
var rfid = this._plc.ReadRFID(LineRFID.plcpointAddress);
var isSignal = this._plc.Read(LineSignal.plcpointAddress);
if (rfid != null && isSignal != null)
{
//正常托盘到位
if (Convert.ToInt32(linesignal04Value) == 1)
if (Convert.ToInt32(isSignal) == 1)//托盘到位
{
//判断task表里没有该rfid的未完成的入库信息未下发去向
var task = dbContext.WcsTask.Where(t => t.containerNo == RFID004Value.ToString() && t.taskStatus < 1).FirstOrDefault();
if (task == null)
BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.floorNo == 5 && t.equipType == 1);
var wcsTask = dbContext.WcsTask.FirstOrDefault(t => t.containerNo == rfid && t.nextPointId == baseEquip.objid);
if (wcsTask != null)//如果不是null
{
//入库
//根据托盘号获取物料码
var material = dbContext.MesBasePalletInfo.Where(t => t.palletInfoCode == RFID004Value.ToString()).FirstOrDefault();
if (material != null)
int? floor = 0;
var wmsProductOutstock = dbContext.WmsProductOutstock.FirstOrDefault(t => t.saleOrderId == wcsTask.orderId);
if (wmsProductOutstock != null)
{
var warehouseId = dbContext.WmsWarehouseMaterial.Where(t => t.storageType == "1" && t.storageId == material.materialId).FirstOrDefault()?.warehouseId;
if (warehouseId != null)
var endEquip = StaticData.BaseEquip.FirstOrDefault(t => t.equipNo == wmsProductOutstock.endStationCode);
if (endEquip != null)
{
var TargetFloor = dbContext.WmsBaseWarehouse.Where(t => t.warehouseId == warehouseId).FirstOrDefault();
if (TargetFloor != null)
floor = endEquip.floorNo;
}
}
else
{
var wmsRawOutstock = dbContext.WmsRawOutstock.FirstOrDefault(t => t.orderId == wcsTask.orderId);
if (wmsRawOutstock != null)
{
BaseEquip endEquip = StaticData.BaseEquip.FirstOrDefault(t => t.equipNo == wmsRawOutstock.endStationCode);
if (endEquip != null)
{
//插入task表
var dic = StaticData.BaseDictionary.Where(t => t.dicKey == "TaskType" && t.ud1 == "I" && t.dicField == TargetFloor.warehouseInstockType).FirstOrDefault();
if (dic != null)
{
var newTask = new WcsTask()
{
objid = StaticData.SnowId.NextId(),
serialNo = 1235,
equipmentNo = "F04",
taskType = Convert.ToInt32(dic.dicValue),
taskStatus = 0,
containerNo = RFID004Value.ToString(),
materialNo = material.materialCode,
materialId = material.materialId,
qty = Convert.ToInt32(material.bindAmount),
startPointId = 4,
startPointNo = "F04",
currPointId = 4,
currPointNo = "F04",
nextPointId = 6,
nextPointNo = "T01",
endPointId = warehouseId,
fromFloorNo = 4,
floorNo = TargetFloor.warehouseFloor,
useFlag = 1,
createBy = "四楼接驳位",
createTime = DateTime.Now,
remark = "四楼创建入库任务"
};
dbContext.Add(newTask);
}
floor = endEquip.floorNo;
}
}
}
}
else if (Itpyes.Contains(task.taskType))
{
if (task.nextPointId != 6)
if (floor == 0)
{
task.currPointId = 4;
task.currPointNo = "F04";
task.nextPointId = 6;
task.nextPointNo = "T01";
task.taskStatus = 0;
task.updateBy = "四楼接驳位线程";
task.updateTime = DateTime.Now;
task.remark = "四楼创建入库任务";
dbContext.WcsTask.Update(task);
dbContext.SaveChanges();
Console.WriteLine($"{DateTime.Now}:4楼接驳位未找到目的地楼层");
LogManager.Info("4楼接驳位未找到目的地楼层");
Thread.Sleep(1000);
continue;
}
}
//出库
else
{
BaseEquip nextEquip = StaticData.BaseEquip.First(t => t.equipType == 2);//提升机
wcsTask.nextPointId = nextEquip.objid;
wcsTask.nextPointNo = nextEquip.equipNo;
wcsTask.currPointId = baseEquip.objid;
wcsTask.currPointNo = baseEquip.equipNo;
wcsTask.fromFloorNo = 4;
wcsTask.taskType = 6;//成品出库
wcsTask.floorNo = floor;//出库到一楼
wcsTask.taskStatus = 0;
wcsTask.updateTime = DateTime.Now;
dbContext.Update(wcsTask);
dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid)
.Update(t => new WcsTaskLog
{
nextPointId = nextEquip.objid,
nextPointNo = nextEquip.equipNo,
currPointId = baseEquip.objid,
currPointNo = baseEquip.equipNo,
fromFloorNo = 4,
floorNo = floor,
taskStatus = 0,
updateTime = DateTime.Now,
});
dbContext.SaveChanges();
}
}
}
@ -142,7 +126,10 @@ namespace Khd.Core.Wcs.Wcs
{
LogManager.Error(ex);
}
Thread.Sleep(1000);
finally
{
Thread.Sleep(1000);
}
}
}
}

@ -74,113 +74,7 @@ namespace Khd.Core.Wcs.Wcs
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
//获取条码号,如果该条码任务存在就继续任务,如果条码不存在,创建入库任务并调度agv
var taskList = StaticData.WcsTask.Where(t => t.nextPointId == EquipID && t.currPointId != EquipID && (t.taskType == 11 || t.taskType == 5 || t.taskType == 6)).ToList();
if (taskList.Count == 0)
{
LogManager.Info(FloorNo + "楼AGV无任务");
}
foreach (var item in taskList)
{
if (item.taskType == 5 || item.taskType == 11)//入库
{
var loc = dbContext.WmsBaseLocation.Where(t => t.activeFlag == "1").ToList();
var stock = dbContext.WmsProductStock.Where(t => t.activeFlag == "1").ToList();
//获取有物料的库位
var locStock = from l in loc
join s in stock on l.locationCode equals s.locationCode
select new
{
LocId = l.locationId,
locCode = l.locationCode,
LocDeep = l.locDeep,
productBatch = s.productBatch
};
//获取空库位
var nullLocList = loc.Where(r => !locStock.Select(t => t.locCode).Contains(r.locationCode) && r.warehouseId == 1).ToList();
var location = nullLocList.OrderBy(t => t.locColumn).FirstOrDefault();
if (location == null) return;
item.currPointId = 8;
item.currPointNo = "AGV01";
item.nextPointId = location.locationId;
item.nextPointNo = location.locationCode;
//锁定库位
dbContext.WmsBaseLocation.Where(t => t.locRow == location.locRow && t.locColumn == location.locColumn && t.layerNum == location.layerNum).Update(t => new WmsBaseLocation()
{
locationStatus = "6",
updateTime = DateTime.Now,
updateBy = "agv出库",
});
//下发agv出库指令
SendAndUpdateTask(item);
}
else if (item.taskType == 6)
{
var locList = dbContext.WmsBaseLocation.Where(t => t.activeFlag == "1").ToList();
var outProStock = dbContext.WmsProductOutstock.Where(t => t.productOutstockId == item.orderId).FirstOrDefault();
//获取库存
var proStock = dbContext.WmsProductStock.Where(t => t.activeFlag == "1" && t.stockType == "3" && t.planCode == outProStock.planCode && t.saleorderCode == outProStock.saleorderCode).ToList();
var dic = dbContext.BaseDictionary.Where(t => t.dicKey == "OutStockDate").FirstOrDefault();
var DateRange = Convert.ToInt32(dic.dicValue);
var stockList = from t in proStock.Where(r => r.productId == item.materialId)
join b in locList on t.locationCode equals b.locationCode
into temp
from newStock in temp.DefaultIfEmpty()
select new
{
proID = t.productStockId,
locID = newStock.locationId,
locCode = t.locationCode,
layerNum = newStock.layerNum,
locColumn = newStock.locColumn,
locRow = newStock.locRow,
locDeep = newStock.locDeep,
inStockDate = newStock.createTime,
};
//先查出最早入库时间
var inStockModel = stockList.OrderBy(t => t.inStockDate).FirstOrDefault();
var inStockDate = inStockModel.inStockDate;
//查出符合条件的成品
var outStockList = stockList.Where(t => t.inStockDate >= inStockDate && t.inStockDate <= inStockDate.GetValueOrDefault().AddDays(DateRange)).ToList();
var outModel = outStockList.OrderBy(t => t.locColumn).ThenByDescending(t => t.locDeep).FirstOrDefault();
if (outModel.locDeep == 1)
{
//自动获取id
var objid = StaticData.SnowId.NextId();
var isExiStock = stockList.Where(t => t.locRow == outModel.locRow && t.locColumn == outModel.locColumn && t.locDeep == 2).FirstOrDefault();
if (isExiStock != null)
{
//创建成品移库任务
WcsTask newTask = new()
{
objid = objid,
taskType = 11,
containerNo = "",
taskStatus = 0,
materialId = isExiStock.locID,
qty = 1,
startPointId = isExiStock.locID,
currPointId = isExiStock.locID,
endPointId = 12,
endPointNo = "WH02",
};
dbContext.Add(newTask);
dbContext.SaveChanges();
return;
}
}
//锁定库位
dbContext.WmsBaseLocation.Where(t => t.locRow == outModel.locRow && t.locColumn == outModel.locColumn && t.layerNum == outModel.layerNum).Update(t => new WmsBaseLocation()
{
locationStatus = "6",
updateTime = DateTime.Now,
updateBy = "agv出库",
});
//下发agv出库指令
SendAndUpdateTask(item);
}
}
var taskList = dbContext.WcsTask.Where(t => t.nextPointId == EquipID).ToList();
}
catch (Exception ex)
{
@ -193,117 +87,5 @@ namespace Khd.Core.Wcs.Wcs
}
}
public void SendAndUpdateTask(WcsTask task)
{
//获取
if (task == null) return;
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
WcsToWms wcsToWms = new WcsToWms();
//首先判断是否已下发指令
var cmd = dbContext.WcsCmd.Where(t => t.taskId == task.objid).FirstOrDefault();
var locList = dbContext.WmsBaseLocation.Where(t => t.activeFlag == "1").ToList();
if (locList.Count == 0) return;
//指令表存在说明已下发
if (cmd == null)
{ //获取下发agv指令
string ip = ""; int port = 0; string url = "";
RequestAGVTaskDto agvtask = new RequestAGVTaskDto();
agvtask.reqCode = task.objid.ToString();
//var json = JsonConvert.SerializeObject(agvtask);
//HttpHelper.SendPostMessage(ip, port, url, json);
agvtask.positionCodePath = new List<Position>();
Position p = new Position();
WmsBaseLocation putPos = new WmsBaseLocation(); //放料点
WmsBaseLocation setPos = new WmsBaseLocation(); //取料点
if (task.taskType == 5) //入库
{
setPos = locList.Where(t => t.locationId == task.nextPointId).FirstOrDefault();
}
else
{
setPos = locList.Where(t => t.locationId == task.nextPointId).FirstOrDefault();
}
putPos = locList.Where(t => t.locationId == task.nextPointId).FirstOrDefault();
p.positionCode = setPos?.agvPositionCode;
p.type = "";
agvtask.positionCodePath.Add(p);
p.positionCode = putPos?.agvPositionCode;
p.type = "";
//取料点
agvtask.positionCodePath.Add(p);
agvtask.taskTyp = "";
//给agv创建任务
wcsToWms.genAgvSchedulingTask(agvtask);
//未下发给agv下发指令
WcsCmd taskCmd = new WcsCmd()
{
taskId = task.objid,
cmdType = task.taskType,
serialNo = task.serialNo,
equipmentNo = task.equipmentNo,
cmdStatus = 1,
createBy = FloorNo + "楼AGV",
createTime = DateTime.Now,
};
dbContext.Add(taskCmd);
dbContext.SaveChanges();
}
else
{
//获取接驳位是否有托盘
var IsPallet = this._plc.Read(this.LineIsPallet.plcpointAddress);
if (cmd.sendFlag == 0)
{
if (taskInType.Contains(task.taskType.GetValueOrDefault()))//入库
{
//入库时有托盘继续任务
if (Convert.ToInt32(IsPallet) == 1)
{
continueTaskDto continueTask = new continueTaskDto();
continueTask.taskCode = task.objid.ToString();
wcsToWms.continueTask(continueTask);
//未下发给agv下发指令
WcsCmd taskCmd = new WcsCmd()
{
taskId = task.objid,
sendFlag = 1,
createBy = FloorNo + "楼AGV",
createTime = DateTime.Now,
};
dbContext.Update(taskCmd);
dbContext.SaveChanges();
}
}
else
{
//出库时没有托盘继续任务
if (Convert.ToInt32(IsPallet) == 0)
{
continueTaskDto continueTask = new continueTaskDto();
continueTask.taskCode = task.objid.ToString();
wcsToWms.continueTask(continueTask);
//更新任务
dbContext.WcsCmd.Where(t => t.taskId == task.objid).Update(t => new WcsCmd()
{
sendFlag = 1,
updateTime = DateTime.Now,
updateBy = "agv出库",
});
}
}
}
}
//更新任务表
dbContext.WcsTask.Where(t => t.objid == task.objid).Update(t => new WcsTask()
{
currPointId = task.currPointId,
currPointNo = task.currPointNo,
nextPointId = task.nextPointId,
nextPointNo = task.nextPointNo,
updateTime = DateTime.Now,
updateBy = "agv出库",
});
}
}
}

@ -129,7 +129,7 @@ namespace Khd.Core.Wcs.Wcs
//查询该条码绑定的物料信息
var material = StaticData.WmsWarehouseMaterial.Where(t => t.storageId == palletInfo.materialId).FirstOrDefault();
var wareHouse = wareHouseList.Where(t => t.warehouseId == material.warehouseId).FirstOrDefault();
var dic = StaticData.BaseDictionary.Where(t => t.dicKey == "TaskType" && t.ud1 == "I" && t.dicField == wareHouse.warehouseInstockType).FirstOrDefault();
var dic = StaticData.BaseDictionary.Where(t => t.dicKey == "TaskType" && t.agvType == "I" && t.dicField == wareHouse.warehouseInstockType).FirstOrDefault();
var equip = StaticData.BaseEquip.ToList();
var startEquip = equip.Where(t => t.equipNo == equipNo).FirstOrDefault();
var endPoint = wareHouseList.Where(t => t.warehouseFloor == floorNo).FirstOrDefault();

@ -89,7 +89,7 @@ namespace Khd.Core.Wcs.Wcs
var wmsProductOutstock = dbContext.WmsProductOutstock.Where(t => t.saleOrderId == wcsTask.orderId).FirstOrDefault();
if (wmsProductOutstock != null)
{
long? endStationCode = wmsProductOutstock.endStationCode;
string endStationCode = wmsProductOutstock.endStationCode;
//找到目的地楼层
int floorNo=0;
//下发去提升机的去向

@ -0,0 +1,377 @@
using Khd.Core.Domain.Dto.webapi;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Plc;
using Khd.Core.Plc.S7;
using Khd.Core.Wcs.Global;
using Masuit.Tools;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Khd.Core.Wcs.Wcs
{
public class SystemTimer
{
private readonly IHost host;
private Plc.S7.Plc Plc30 = StaticData.PlcDic[0];
private Plc.S7.Plc Plc31 = StaticData.PlcDic[0];
private Plc.S7.Plc Plc220 = StaticData.PlcDic[2];
public SystemTimer(IHost host)
{
this.host = host;
}
public void Start()
{
Thread messageSynchronousThread = new(MessageSynchronousLogic);
messageSynchronousThread.Start();
Thread baseEquipThread = new Thread(BaseEquipLogic);
baseEquipThread.Start();
}
private void BaseEquipLogic(object? obj)
{
using var scope = host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
while (true)
{
try
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
List<BaseEquip> updateEquips = dbContext.BaseEquip.Where(t => t.remark == "99").ToList();
if (updateEquips.Count > 0)
{
foreach (var equip in updateEquips)
{
equip.remark = "0";
dbContext.BaseEquip.Update(equip);
dbContext.SaveChanges();
}
StaticData.BaseEquip = dbContext.BaseEquip.ToList();
}
}
catch
{
}
Thread.Sleep(5000);
}
}
private void MessageSynchronousLogic(object? obj)
{
try
{
using var scope = host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
HositerLogic();
CtuLineLogic();
ThirdAgvLogic(dbContext);
SecondAgvLogic(dbContext);
FiveAgvLogic(dbContext);
FiveBearAgvLogic(dbContext);
CtuCmdLogic(dbContext);
}
catch (Exception ex)
{
try
{
if (ex is PlcException)
{
foreach (var item in StaticData.PlcDic)
{
if (item.Value.IP == ex.Message)
{
StaticData.PlcDic[item.Key] = new Plc.S7.Plc(item.Value.CPU, item.Value.IP, item.Value.Port, item.Value.Rack, item.Value.Slot);
StaticData.PlcDic[item.Key].Open();
}
}
}
}
catch
{
}
}
Thread.Sleep(5000);
}
private void ThirdAgvLogic(DefaultDbContext dbContext)
{
var baseEquip = StaticData.BaseEquip.First(t => t.objid == 9);
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
var basePlcs = StaticData.basePlcs.Where(t => t.Station == "3楼AGV").ToList();
var data = new
{
reqCode = StaticData.SnowId.NextId(),
mapCode = "BB"
};
string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms-dps/rest/queryAgvStatus", data.ToJsonString());
var reponse = JsonConvert.DeserializeObject<AgvStatusDto>(result);
if (reponse != null && reponse.code == "0")
{
cardStatus cardStatus = reponse.data.First(t => t.robotCode == "2032");
var quantityPlc = basePlcs.First(t => t.Name.Contains("电量"));
this.Plc220.WriteToPoint(quantityPlc.Address, cardStatus.battery, quantityPlc.type);
var XPlc = basePlcs.First(t => t.Name.Contains('X'));
var Ylc = basePlcs.First(t => t.Name.Contains('Y'));
this.Plc220.WriteToPoint(XPlc.Address, cardStatus.posX.ToString(), XPlc.type);
this.Plc220.WriteToPoint(Ylc.Address, cardStatus.posY.ToString(), Ylc.type);
}
}
private void SecondAgvLogic(DefaultDbContext dbContext)
{
var baseEquip = StaticData.BaseEquip.First(t => t.objid == 8);
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
var basePlcs = StaticData.basePlcs.Where(t => t.Station == "2楼AGV").ToList();
var data = new
{
reqCode = StaticData.SnowId.NextId(),
mapCode = "CC"
};
string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms-dps/rest/queryAgvStatus", data.ToJsonString());
var reponse = JsonConvert.DeserializeObject<AgvStatusDto>(result);
if (reponse != null && reponse.code == "0")
{
cardStatus cardStatus = reponse.data.First(t => t.robotCode == "2033");
var quantityPlc = basePlcs.First(t => t.Name.Contains("电量"));
this.Plc220.WriteToPoint(quantityPlc.Address, cardStatus.battery, quantityPlc.type);
var XPlc = basePlcs.First(t => t.Name.Contains('X'));
var Ylc = basePlcs.First(t => t.Name.Contains('Y'));
this.Plc220.WriteToPoint(XPlc.Address, cardStatus.posX.ToString(), XPlc.type);
this.Plc220.WriteToPoint(Ylc.Address, cardStatus.posY.ToString(), Ylc.type);
}
}
private void FiveAgvLogic(DefaultDbContext dbContext)
{
var baseEquip = StaticData.BaseEquip.First(t => t.objid == 10);
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
var basePlcs = StaticData.basePlcs.Where(t => t.Station == "5楼AGV").ToList();
List<int?> type = new List<int?>() { 27, 28, 34, 35, 37, 38, 46, 47 };
var wcsCmds = dbContext.WcsCmd.Where(t => type.Contains(t.cmdType)).ToList();
if (wcsCmds.Count > 0)
{
WcsCmd wcsCmd = wcsCmds.First();
var endPlc = basePlcs.Where(t => t.Name.Contains("目的地")).First();
Plc220.WriteToPoint(endPlc.Address, wcsCmd.nextPointId.ToString(), endPlc.type);
var startPlc = basePlcs.First(t => t.Name.Contains("起始点"));
Plc220.WriteToPoint(startPlc.Address, wcsCmd.currPointId.ToString(), startPlc.type);
var cmdPlc = basePlcs.First(t => t.Name.Contains("任务代号"));
string cmdType = StaticData.BaseDictionary.First(t => t.objid == wcsCmd.cmdType).ToPlc;
Plc220.WriteToPoint(cmdPlc.Address, cmdType, cmdPlc.type);
}
else
{
var endPlc = basePlcs.Where(t => t.Name.Contains("目的地")).First();
this.Plc220.WriteToPoint(endPlc.Address, "0", endPlc.type);
var startPlc = basePlcs.First(t => t.Name.Contains("起始点"));
Plc220.WriteToPoint(startPlc.Address, "0", startPlc.type);
var cmdPlc = basePlcs.First(t => t.Name.Contains("任务代号"));
Plc220.WriteToPoint(cmdPlc.Address, "0", cmdPlc.type);
}
var data = new
{
reqCode = StaticData.SnowId.NextId(),
mapCode = "EE"
};
string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms-dps/rest/queryAgvStatus", data.ToJsonString());
var reponse = JsonConvert.DeserializeObject<AgvStatusDto>(result);
if (reponse != null && reponse.code == "0")
{
cardStatus cardStatus = reponse.data.First(t => t.robotCode == "2034");
var quantityPlc = basePlcs.First(t => t.Name.Contains("电量"));
this.Plc220.WriteToPoint(quantityPlc.Address, cardStatus.battery, quantityPlc.type);
var XPlc = basePlcs.First(t => t.Name.Contains('X'));
var Ylc = basePlcs.First(t => t.Name.Contains('Y'));
this.Plc220.WriteToPoint(XPlc.Address, cardStatus.posX.ToString(), XPlc.type);
this.Plc220.WriteToPoint(Ylc.Address, cardStatus.posY.ToString(), Ylc.type);
cardStatus = reponse.data.First(t => t.robotCode == "6011");
quantityPlc = basePlcs.First(t => t.Name.Contains("电量"));
this.Plc220.WriteToPoint(quantityPlc.Address, cardStatus.battery, quantityPlc.type);
XPlc = basePlcs.First(t => t.Name.Contains('X'));
Ylc = basePlcs.First(t => t.Name.Contains('Y'));
this.Plc220.WriteToPoint(XPlc.Address, cardStatus.posX.ToString(), XPlc.type);
this.Plc220.WriteToPoint(Ylc.Address, cardStatus.posY.ToString(), Ylc.type);
cardStatus = reponse.data.First(t => t.robotCode == "8161");
quantityPlc = basePlcs.First(t => t.Name.Contains("电量"));
this.Plc220.WriteToPoint(quantityPlc.Address, cardStatus.battery, quantityPlc.type);
XPlc = basePlcs.First(t => t.Name.Contains("X"));
Ylc = basePlcs.First(t => t.Name.Contains("Y"));
this.Plc220.WriteToPoint(XPlc.Address, cardStatus.posX.ToString(), XPlc.type);
this.Plc220.WriteToPoint(Ylc.Address, cardStatus.posY.ToString(), Ylc.type);
}
}
private void FiveBearAgvLogic(DefaultDbContext dbContext)
{
var baseEquip = StaticData.BaseEquip.First(t => t.objid == 10);
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
var basePlcs = StaticData.basePlcs.Where(t => t.Station == "5楼背负式").ToList();
var wcsCmds = dbContext.WcsCmd.Where(t => t.cmdType == 32 || t.cmdType == 48).ToList();
if (wcsCmds.Count > 0)
{
WcsCmd wcsCmd = wcsCmds.First();
var endPlc = basePlcs.Where(t => t.Name.Contains("目的地")).First();
Plc220.WriteToPoint(endPlc.Address, wcsCmd.nextPointId.ToString(), endPlc.type);
var startPlc = basePlcs.First(t => t.Name.Contains("起始点"));
Plc220.WriteToPoint(startPlc.Address, wcsCmd.currPointId.ToString(), startPlc.type);
var cmdPlc = basePlcs.First(t => t.Name.Contains("任务代号"));
string cmdType = StaticData.BaseDictionary.First(t => t.objid == wcsCmd.cmdType).ToPlc;
Plc220.WriteToPoint(cmdPlc.Address, cmdType, cmdPlc.type);
}
else
{
var endPlc = basePlcs.Where(t => t.Name.Contains("目的地")).First();
this.Plc220.WriteToPoint(endPlc.Address, "0", endPlc.type);
var startPlc = basePlcs.First(t => t.Name.Contains("起始点"));
Plc220.WriteToPoint(startPlc.Address, "0", startPlc.type);
var cmdPlc = basePlcs.First(t => t.Name.Contains("任务代号"));
Plc220.WriteToPoint(cmdPlc.Address, "0", cmdPlc.type);
}
}
private void CtuCmdLogic(DefaultDbContext dbContext)
{
var baseEquip = StaticData.BaseEquip.First(t => t.objid == 11);
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
var basePlcs = StaticData.basePlcs.Where(t => t.Station == "5楼CTU").ToList();
var wcsCmds = dbContext.WcsCmd.Where(t => t.cmdType == 29 || t.cmdType == 30 || t.cmdType == 31).ToList();
if (wcsCmds.Count > 0)
{
var wcsCmd = wcsCmds.First();
List<long?> startList = new List<long?>();
List<long?> endList = new List<long?>();
if (wcsCmd.cmdType != 30)
{
startList.Add(wcsCmd.currPointId);
endList.AddRange(wcsCmds.Select(t => t.nextPointId).ToList());
}
else
{
startList.Add(wcsCmd.nextPointId);
endList.AddRange(wcsCmds.Select(t => t.currPointId).ToList());
}
while (endList.Count < 6)
{
endList.Add(0);
}
var endPlcs = basePlcs.Where(t => t.Name.Contains("目的地")).OrderBy(t => t.Name).ToList();
for (int i = 0; i < endPlcs.Count; i++)
{
this.Plc220.WriteToPoint(endPlcs[i].Address, endList[i].ToString(), endPlcs[i].type);
}
var startPlc = basePlcs.First(t => t.Name.Contains("起始点"));
Plc220.WriteToPoint(startPlc.Address, wcsCmd.currPointId.ToString(), startPlc.type);
var cmdPlc = basePlcs.First(t => t.Name.Contains("任务代号"));
string cmdType = StaticData.BaseDictionary.First(t => t.objid == wcsCmd.cmdType).ToPlc;
Plc220.WriteToPoint(cmdPlc.Address, cmdType, cmdPlc.type);
}
else
{
var endPlcs = basePlcs.Where(t => t.Name.Contains("目的地")).OrderBy(t => t.Name).ToList();
for (int i = 0; i < endPlcs.Count; i++)
{
this.Plc220.WriteToPoint(endPlcs[i].Address, "0", endPlcs[i].type);
}
var startPlc = basePlcs.First(t => t.Name.Contains("起始点"));
Plc220.WriteToPoint(startPlc.Address, "0", startPlc.type);
var cmdPlc = basePlcs.First(t => t.Name.Contains("任务代号"));
Plc220.WriteToPoint(cmdPlc.Address, "0", cmdPlc.type);
}
}
private void CtuLineLogic()
{
var basePlcpoints = StaticData.BasePlcpointList.ToList();
var basePlcs = StaticData.basePlcs.ToList();
var bill = from a in basePlcpoints
from b in basePlcs
where a.plcpointNo == b.Name && b.Station == "U型线"
select new { a, b };
foreach (var item in bill)
{
if (item.a.plcpointNo.Contains("RFID"))
{
string? rfid = Plc31.ReadRFID(item.a.plcpointAddress);
if (!string.IsNullOrEmpty(rfid))
{
rfid = rfid[(rfid.IndexOf("C") + 1)..];
Plc220.WriteToPoint(item.b.Address, rfid, item.b.type);
}
else
{
Plc220.WriteToPoint(item.b.Address, "0", item.b.type);
}
}
else
{
var value = Plc31.Read(item.a.plcpointAddress);
if (value != null && !string.IsNullOrEmpty(value.ToString()))
{
Plc220.WriteToPoint(item.b.Address, value.ToString(), item.b.type);
}
else
{
Plc220.WriteToPoint(item.b.Address, "0", item.b.type);
}
}
}
}
/// <summary>
/// 提升机和接驳位信息同步
/// </summary>
private void HositerLogic()
{
var basePlcpoints = StaticData.BasePlcpointList.ToList();
var basePlcs = StaticData.basePlcs.ToList();
var bill = from a in basePlcpoints
from b in basePlcs
where a.plcpointNo == b.Name && b.Station != "U型线"
select new { a, b };
foreach (var item in bill)
{
if (item.a.plcpointNo.Contains("RFID"))
{
string? rfid = Plc30.ReadRFID(item.a.plcpointAddress);
if (!string.IsNullOrEmpty(rfid))
{
rfid = rfid[(rfid.IndexOf("JYHB") + 4)..];
Plc220.WriteToPoint(item.b.Address, rfid, item.b.type);
}
else
{
Plc220.WriteToPoint(item.b.Address, "0", item.b.type);
}
}
else
{
var value = Plc30.Read(item.a.plcpointAddress);
if (value != null && !string.IsNullOrEmpty(value.ToString()))
{
Plc220.WriteToPoint(item.b.Address, value.ToString(), item.b.type);
}
else
{
Plc220.WriteToPoint(item.b.Address, "0", item.b.type);
}
}
}
}
}
}

@ -1,10 +1,12 @@
using Khd.Core.Domain.Dto.webapi;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library.Mapper;
using Khd.Core.Wcs.Global;
using Masuit.Tools.Logging;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Newtonsoft.Json;
using Z.EntityFramework.Plus;
namespace Khd.Core.Wcs.Wcs
@ -68,119 +70,456 @@ namespace Khd.Core.Wcs.Wcs
{
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.objid == 9);
while (true)
{
try
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
//获取条码号,如果该条码任务存在就继续任务,如果条码不存在,创建入库任务并调度agv
var taskList = dbContext.WcsTask.Where(t => t.nextPointId == EquipID && t.currPointId != EquipID && (t.taskType == 1 || t.taskType == 2 || t.taskType == 9)).ToList();
if (taskList.Count == 0)
{
LogManager.Info(FloorNo + "楼AGV无任务");
}
var taskList = dbContext.WcsTask.Where(t => t.nextPointId == baseEquip.objid).OrderBy(t => t.createTime).ToList();
foreach (var item in taskList)
{
if (item.taskType == 1 || item.taskType == 9)//入库||移库
if (item.taskStatus == 0)
{
var loc = dbContext.WmsBaseLocation.Where(t => t.activeFlag == "1").ToList();
//3楼原材料
var stock = dbContext.WmsRawStock.Where(t => t.activeFlag == "1").ToList();
//获取有物料的库位
var locStock = from l in loc
join s in stock on l.locationCode equals s.locationCode
select new
{
LocId = l.locationId,
locCode = l.locationCode,
LocDeep = l.locDeep,
productBatch = s.instockBatch
};
//获取空库位
var nullLocList = loc.Where(r => !locStock.Select(t => t.locCode).Contains(r.locationCode) && r.warehouseId == 2).ToList();
var location = nullLocList.OrderBy(t => t.locColumn).FirstOrDefault();
item.currPointId = 9;
item.currPointNo = "AGV02";
item.nextPointId = location.locationId;
item.nextPointNo = location.locationCode;
dbContext.Update(item);
//锁定库位
dbContext.WmsBaseLocation.Where(t => t.locRow == location.locRow && t.locColumn == location.locColumn && t.layerNum == location.layerNum).Update(t => new WmsBaseLocation()
if (item.taskType == 39)
{
locationStatus = "6",
updateTime = DateTime.Now,
updateBy = "agv出库",
});
//下发agv出库指令
SendAndUpdateTask(item);
}
else if (item.taskType == 2)
{
var locList = dbContext.WmsBaseLocation.Where(t => t.activeFlag == "1").ToList();
//获取库存
var rawStock = dbContext.WmsRawStock.Where(t => t.activeFlag == "1" && t.stockType == "1" && t.materialId == item.materialId).ToList();
var dic = dbContext.BaseDictionary.Where(t => t.dicKey == "OutStockDate").FirstOrDefault();
var DateRange = Convert.ToInt32(dic.dicValue);
var stockList = from t in rawStock
join b in locList on t.locationCode equals b.locationCode
into temp
from newStock in temp.DefaultIfEmpty()
select new
{
rawID = t.rawStockId,
locID = newStock.locationId,
locCode = t.locationCode,
layerNum = newStock.layerNum,
locColumn = newStock.locColumn,
locRow = newStock.locRow,
locDeep = newStock.locDeep,
inStockDate = newStock.createTime,
};
//先查出最早入库时间
var inStockModel = stockList.OrderBy(t => t.inStockDate).FirstOrDefault();
var inStockDate = inStockModel.inStockDate;
//查出符合条件的成品
var outStockList = stockList.Where(t => t.inStockDate >= inStockDate && t.inStockDate <= inStockDate.GetValueOrDefault().AddDays(DateRange)).ToList();
var outModel = outStockList.OrderBy(t => t.locColumn).ThenByDescending(t => t.locDeep).FirstOrDefault();
if (outModel.locDeep == 1)
{
//自动获取id
var objid = StaticData.SnowId.NextId();
var isExiStock = stockList.Where(t => t.locRow == outModel.locRow && t.locColumn == outModel.locColumn && t.locDeep == 2).FirstOrDefault();
if (isExiStock != null)
BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == 3);
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.endPointId);
WcsCmd wcsCmd = new WcsCmd()
{
//创建成品移库任务
WcsTask newTask = new()
objid = StaticData.SnowId.NextId(),
cmdStatus = 0,
taskId = item.objid,
useFlag = 1,
cmdType = item.taskType,
containerNo = item.containerNo,
createTime = DateTime.Now,
createBy = FloorNo + "楼AGV",
currPointId = startEquip.objid,
currPointNo = startEquip.agvPositionCode,
nextPointId = item.endPointId,
nextPointNo = wmsBaseLocation.agvPositionCode,
};
var agvTask = new RequestAGVTaskDto
{
reqCode = StaticData.SnowId.NextId().ToString(),
positionCodePath = new List<Position>
{
objid = objid,
taskType = 11,
containerNo = "",
taskStatus = 0,
materialId = isExiStock.locID,
qty = 1,
startPointId = isExiStock.locID,
currPointId = isExiStock.locID,
endPointId = 12,
endPointNo = "WH02",
};
dbContext.Add(newTask);
new ()
{
positionCode=wcsCmd.currPointNo,
type="00"
},
new ()
{
positionCode=wcsCmd.nextPointNo,
type="00"
}
},
taskTyp = "F300",
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 == "成功")
{
wcsCmd.taskCode = reponseMessage.data;
wcsCmd.cmdStatus = 1;
item.taskStatus = 1;
dbContext.Update(item);
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 1 });
WcsCmdLog wcsCmdLog = CoreMapper.Map<WcsCmdLog>(wcsCmd);
dbContext.Add(wcsCmdLog);
dbContext.Add(wcsCmd);
dbContext.SaveChanges();
return;
}
else
{
LogManager.Info("三楼Agv下发任务失败" + item.taskType + message);
}
}
//锁定库位
dbContext.WmsBaseLocation.Where(t => t.locationCode == outModel.locCode).Update(t => new WmsBaseLocation()
else if (item.taskType == 41)
{
locationStatus = "1",
updateTime = DateTime.Now,
updateBy = "agv出库",
});
//下发agv出库指令
SendAndUpdateTask(item);
BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == 31);
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation.First(t => t.locationId == item.startPointId);
WcsCmd wcsCmd = new WcsCmd()
{
objid = StaticData.SnowId.NextId(),
cmdStatus = 0,
taskId = item.objid,
useFlag = 1,
cmdType = item.taskType,
containerNo = item.containerNo,
createTime = DateTime.Now,
createBy = FloorNo + "楼AGV",
currPointId = item.startPointId,
currPointNo = wmsBaseLocation.agvPositionCode,
nextPointId = endEquip.objid,
nextPointNo = endEquip.agvPositionCode,
};
var agvTask = new RequestAGVTaskDto
{
reqCode = StaticData.SnowId.NextId().ToString(),
positionCodePath = new List<Position>
{
new ()
{
positionCode=wcsCmd.currPointNo,
type="00"
},
new ()
{
positionCode=wcsCmd.nextPointNo,
type="00"
}
},
taskTyp="F301",
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 == "成功")
{
wcsCmd.taskCode = reponseMessage.data;
wcsCmd.cmdStatus = 1;
item.taskStatus = 1;
dbContext.Update(item);
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 1 });
WcsCmdLog wcsCmdLog = CoreMapper.Map<WcsCmdLog>(wcsCmd);
dbContext.Add(wcsCmdLog);
dbContext.Add(wcsCmd);
dbContext.SaveChanges();
}
else
{
LogManager.Info("三楼Agv下发任务失败" + item.taskType + message);
}
}
else if (item.taskType == 42)
{
BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == 31);
BaseEquip endEquip = StaticData.BaseEquip.First();
WcsCmd wcsCmd = new WcsCmd()
{
objid = StaticData.SnowId.NextId(),
cmdStatus = 0,
taskId = item.objid,
useFlag = 1,
cmdType = item.taskType,
containerNo = item.containerNo,
createTime = DateTime.Now,
createBy = FloorNo + "楼AGV",
currPointId = startEquip.objid,
currPointNo = startEquip.agvPositionCode,
nextPointId = endEquip.objid,
nextPointNo = endEquip.agvPositionCode,
};
var agvTask = new RequestAGVTaskDto
{
reqCode = StaticData.SnowId.NextId().ToString(),
positionCodePath = new List<Position>
{
new ()
{
positionCode=wcsCmd.currPointNo,
type="00"
},
new ()
{
positionCode=wcsCmd.nextPointNo,
type="00"
}
},
taskTyp="F302",
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 == "成功")
{
wcsCmd.taskCode = reponseMessage.data;
wcsCmd.cmdStatus = 1;
item.taskStatus = 1;
dbContext.Update(item);
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 1 });
WcsCmdLog wcsCmdLog = CoreMapper.Map<WcsCmdLog>(wcsCmd);
dbContext.Add(wcsCmdLog);
dbContext.Add(wcsCmd);
dbContext.SaveChanges();
}
else
{
LogManager.Info("三楼Agv下发任务失败" + item.taskType + message);
}
}
else if (item.taskType == 43)
{
BaseEquip emptyEquip = StaticData.BaseEquip.First(t => t.objid == item.startPointId);
BaseEquip endEquip = StaticData.BaseEquip.First(t => t.floorNo == 3 && t.equipType == 1);
WcsCmd wcsCmd = new WcsCmd()
{
objid = StaticData.SnowId.NextId(),
cmdStatus = 0,
taskId = item.objid,
useFlag = 1,
cmdType = item.taskType,
containerNo = item.containerNo,
createTime = DateTime.Now,
createBy = FloorNo + "楼AGV",
currPointId = item.startPointId,
currPointNo = emptyEquip.agvPositionCode,
nextPointId = endEquip.objid,
nextPointNo = endEquip.agvPositionCode,
};
var agvTask = new RequestAGVTaskDto
{
reqCode = StaticData.SnowId.NextId().ToString(),
positionCodePath = new List<Position>
{
new ()
{
positionCode=wcsCmd.currPointNo,
type="00"
},
new ()
{
positionCode=wcsCmd.nextPointNo,
type="00"
}
},
taskTyp="F303",
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 == "成功")
{
wcsCmd.taskCode = reponseMessage.data;
wcsCmd.cmdStatus = 1;
item.taskStatus = 1;
dbContext.Update(item);
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 1 });
WcsCmdLog wcsCmdLog = CoreMapper.Map<WcsCmdLog>(wcsCmd);
dbContext.Add(wcsCmdLog);
dbContext.Add(wcsCmd);
dbContext.SaveChanges();
}
else
{
LogManager.Info("三楼Agv下发任务失败" + item.taskType + message);
}
}
else if (item.taskType == 44)
{
BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == item.startPointId);
BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.objid == 3);
WcsCmd wcsCmd = new WcsCmd()
{
objid = StaticData.SnowId.NextId(),
cmdStatus = 0,
taskId = item.objid,
useFlag = 1,
cmdType = item.taskType,
containerNo = item.containerNo,
createTime = DateTime.Now,
createBy = FloorNo + "楼AGV",
currPointId = startEquip.objid,
currPointNo = startEquip.agvPositionCode,
nextPointId = lineEquip.objid,
nextPointNo = lineEquip.equipNo,
};
var agvTask = new RequestAGVTaskDto
{
reqCode = StaticData.SnowId.NextId().ToString(),
positionCodePath = new List<Position>
{
new()
{
positionCode = wcsCmd.currPointNo,
type = "00"
},
new()
{
positionCode = wcsCmd.nextPointNo,
type = "00"
}
},
taskTyp="F304",
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 == "成功")
{
wcsCmd.taskCode = reponseMessage.data;
wcsCmd.cmdStatus = 1;
item.taskStatus = 1;
dbContext.Update(item);
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog() { taskStatus = 1 });
WcsCmdLog wcsCmdLog = CoreMapper.Map<WcsCmdLog>(wcsCmd);
dbContext.Add(wcsCmdLog);
dbContext.Add(wcsCmd);
dbContext.SaveChanges();
}
else
{
LogManager.Info("三楼Agv下发任务失败" + item.taskType + message);
}
}
}
else
{
WcsCmd? wcsCmd = dbContext.WcsCmd.FirstOrDefault(t => t.taskId == item.objid);
if (wcsCmd != null)
{
if (item.taskStatus == 3)
{
var agvTask = new RequestAGVTaskDto
{
reqCode = StaticData.SnowId.NextId().ToString(),
taskCode = wcsCmd.taskCode
};
string message = JsonConvert.SerializeObject(agvTask);
string result = HttpHelper.SendPostMessage(baseEquip.serverIp, baseEquip.serverPort.Value, "rcms/services/rest/hikRpcService/continueTask", message);
ReponseMessage? reponseMessage = JsonConvert.DeserializeObject<ReponseMessage>(result);
if (reponseMessage != null && reponseMessage.message == "成功")
{
wcsCmd.cmdStatus = 4;
dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmd() { cmdStatus = 4 });
dbContext.Update(wcsCmd);
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 });
dbContext.SaveChanges();
}
}
else if (item.taskStatus == 5)
{
if (item.taskType == 39)
{
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation
.First(t => t.locationId == item.endPointId && t.warehouseFloor == 3);
wmsBaseLocation.locationStatus = "1";
wmsBaseLocation.instockFlag = "0";
wmsBaseLocation.containerCode = item.containerNo;
wmsBaseLocation.updateTime = DateTime.Now;
wmsBaseLocation.updateBy = "WCS";
var mesBasePalletInfo = dbContext.MesBasePalletInfo.FirstOrDefault(t => t.palletInfoCode == item.containerNo);
if (mesBasePalletInfo != null)
{
var mesBaseBarcodeInfo = dbContext.MesBaseBarcodeInfo.FirstOrDefault(t => t.barcodeInfo == mesBasePalletInfo.materialBarcode);
if (mesBaseBarcodeInfo != null)
{
var wmsRawStock = new WmsRawStock()
{
rawStockId = StaticData.SnowId.NextId(),
activeFlag = "1",
saleOrderId = item.orderId,
stockType = "1",
supplierId = mesBaseBarcodeInfo.manufacturerId,
qualityStatus = "1",
completeFlag = "1",
createBy = "WCS",
createDate = DateTime.Now,
frozenAmount = 0,
instockBatch = mesBaseBarcodeInfo.batchCode,
instockDate = DateTime.Now,
locationCode = wmsBaseLocation.locationCode,
materialId = mesBaseBarcodeInfo.materialId,
occupyAmount = 0,
palletInfoCode = item.containerNo,
totalAmount = 1,
warehouseFloor = 3,
warehouseId = 311
};
dbContext.Add(wmsRawStock);
dbContext.Update(wmsBaseLocation);
dbContext.WcsTask.Where(t => t.objid == item.objid).Delete();
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6 });
dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog { cmdStatus = 6 });
dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Delete();
dbContext.SaveChanges();
}
}
}
else if (item.taskType == 41)
{
WmsBaseLocation wmsBaseLocation = dbContext.WmsBaseLocation
.First(t => t.locationId == item.currPointId);
wmsBaseLocation.outstockFlag = "0";
wmsBaseLocation.locationStatus = "1";
wmsBaseLocation.containerCode = "";
wmsBaseLocation.updateTime = DateTime.Now;
wmsBaseLocation.updateBy = "WCS";
dbContext.WmsRawOutstock.Where(t => t.orderId == item.orderId).Update(t => new WmsRawOutstock
{
executeStatus = "2"
});
dbContext.Update(wmsBaseLocation);
dbContext.WmsRawStock.Where(t => t.locationCode == wmsBaseLocation.locationCode).Delete();
dbContext.WcsTask.Where(t => t.objid == item.objid).Delete();
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6 });
dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog { cmdStatus = 6 });
dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Delete();
dbContext.SaveChanges();
}
else if (item.taskType == 42)
{
BaseEquip emptyEquip = StaticData.BaseEquip.First(t => t.objid == 35);
BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.objid == 3);
emptyEquip.emptyCount += 1;
emptyEquip.updateTime = DateTime.Now;
emptyEquip.updateBy = "WCS";
dbContext.Update(emptyEquip);
dbContext.WcsTask.Where(t => t.objid == item.objid).Delete();
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6 });
dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog { cmdStatus = 6 });
dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Delete();
dbContext.SaveChanges();
}
else if (item.taskType == 43)
{
BaseEquip emptyEquip = StaticData.BaseEquip.First(t => t.objid == 35);
BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == item.endPointId);
emptyEquip.emptyCount = 0;
emptyEquip.updateTime = DateTime.Now;
emptyEquip.updateBy = "WCS";
endEquip.emptyCount = emptyEquip.emptyCount;
endEquip.updateTime = DateTime.Now;
endEquip.updateBy = "WCS";
dbContext.Update(endEquip);
dbContext.Update(emptyEquip);
}
else if (item.taskType == 44)
{
BaseEquip startEquip = StaticData.BaseEquip.First(t => t.objid == item.startPointId);
BaseEquip lineEquip = StaticData.BaseEquip.First(t => t.objid == 3);
startEquip.emptyCount = 0;
startEquip.updateTime = DateTime.Now;
startEquip.updateBy = "WCS";
dbContext.Update(startEquip);
BaseEquip endEquip = StaticData.BaseEquip.First(t => t.objid == item.endPointId);
item.nextPointId = lineEquip.objid;
item.nextPointNo = lineEquip.equipNo;
item.fromFloorNo = 3;
item.floorNo = endEquip.floorNo;
item.taskStatus = 6;
dbContext.Update(item);
dbContext.WcsTaskLog.Where(t => t.objid == item.objid).Update(t => new WcsTaskLog { taskStatus = 6, nextPointId = lineEquip.objid, nextPointNo = lineEquip.equipNo, fromFloorNo = 3, floorNo = endEquip.floorNo });
dbContext.WcsCmdLog.Where(t => t.objid == wcsCmd.objid).Update(t => new WcsCmdLog { cmdStatus = 6 });
dbContext.WcsCmd.Where(t => t.objid == wcsCmd.objid).Delete();
dbContext.SaveChanges();
}
}
}
}
break;
}
}
catch (Exception ex)
@ -194,219 +533,5 @@ namespace Khd.Core.Wcs.Wcs
}
}
public void SendAndUpdateTask(WcsTask task)
{
//获取
if (task == null) return;
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
WcsToWms wcsToWms = new WcsToWms();
//首先判断是否已下发指令
var cmd = dbContext.WcsCmd.Where(t => t.taskId == task.objid).FirstOrDefault();
var locList = dbContext.WmsBaseLocation.Where(t => t.activeFlag == "1").ToList();
if (locList.Count == 0) return;
//指令表存在说明已下发
if (cmd == null)
{ //获取下发agv指令
string ip = ""; int port = 0; string url = "";
RequestAGVTaskDto agvtask = new RequestAGVTaskDto();
agvtask.reqCode = task.objid.ToString();
//var json = JsonConvert.SerializeObject(agvtask);
//HttpHelper.SendPostMessage(ip, port, url, json);
agvtask.positionCodePath = new List<Position>();
Position p = new Position();
WmsBaseLocation putPos = new WmsBaseLocation(); //放料点
WmsBaseLocation setPos = new WmsBaseLocation(); //取料点
if (task.taskType == 5) //入库
{
setPos = locList.Where(t => t.locationId == task.nextPointId).FirstOrDefault();
}
else
{
setPos = locList.Where(t => t.locationId == task.nextPointId).FirstOrDefault();
}
putPos = locList.Where(t => t.locationId == task.nextPointId).FirstOrDefault();
p.positionCode = setPos?.agvPositionCode;
p.type = "";
agvtask.positionCodePath.Add(p);
p.positionCode = putPos?.agvPositionCode;
p.type = "";
//取料点
agvtask.positionCodePath.Add(p);
agvtask.taskTyp = "";
//给agv创建任务
wcsToWms.genAgvSchedulingTask(agvtask);
//未下发给agv下发指令
WcsCmd taskCmd = new WcsCmd()
{
taskId = task.objid,
cmdType = task.taskType,
serialNo = task.serialNo,
equipmentNo = task.equipmentNo,
cmdStatus = 1,
createBy = FloorNo + "楼AGV",
createTime = DateTime.Now,
};
dbContext.Add(taskCmd);
dbContext.SaveChanges();
}
else
{
//获取接驳位是否有托盘
var IsPallet = this._plc.Read(this.LineIsPallet.plcpointAddress);
if (cmd.sendFlag == 0)
{
if (taskInType.Contains(task.taskType.GetValueOrDefault()))//入库
{
//入库时有托盘继续任务
if (Convert.ToInt32(IsPallet) == 1)
{
continueTaskDto continueTask = new continueTaskDto();
continueTask.taskCode = task.objid.ToString();
wcsToWms.continueTask(continueTask);
//未下发给agv下发指令
WcsCmd taskCmd = new WcsCmd()
{
taskId = task.objid,
sendFlag = 1,
createBy = FloorNo + "楼AGV",
createTime = DateTime.Now,
};
dbContext.Update(taskCmd);
dbContext.SaveChanges();
}
}
else
{
//出库时没有托盘继续任务
if (Convert.ToInt32(IsPallet) == 0)
{
continueTaskDto continueTask = new continueTaskDto();
continueTask.taskCode = task.objid.ToString();
wcsToWms.continueTask(continueTask);
//更新任务
dbContext.WcsCmd.Where(t => t.taskId == task.objid).Update(t => new WcsCmd()
{
sendFlag = 1,
updateTime = DateTime.Now,
updateBy = "agv出库",
});
}
}
}
}
//更新任务表
dbContext.WcsTask.Where(t => t.objid == task.objid).Update(t => new WcsTask()
{
currPointId = task.currPointId,
currPointNo = task.currPointNo,
nextPointId = task.nextPointId,
nextPointNo = task.nextPointNo,
updateTime = DateTime.Now,
updateBy = "agv出库",
});
}
//public List<WcsTask> GetTask(int floorNo)
//{
// using var scope = _host.Services.CreateScope();
// using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
// List<WcsTask> wcsTask = new List<WcsTask>();
// var equip = StaticData.BaseEquip.Where(t => t.floorNo == floorNo && t.equipType == 4).FirstOrDefault();
// try
// {
// //获取条码号,如果该条码任务存在就继续任务,如果条码不存在,创建入库任务并调度agv
// var taskList = StaticData.WcsTask.Where(t => t.nextPointId == equip.objid && (t.taskType == 1 || t.taskType == 2 || t.taskType == 5 || t.taskType == 6)).ToList();
// if (taskList.Count() == 0)
// { return null; }
// wcsTask = taskList;
// }
// catch (Exception ex)
// {
// LogManager.Info(floorNo + "楼AGV异常" + ex.Message);
// throw;
// }
// return wcsTask;
//}
//public void SendTask(WcsTask task)
//{
// //获取
// if (task == null) return;
// using var scope = _host.Services.CreateScope();
// using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
// WcsToWms wcsToWms = new WcsToWms();
// //首先判断是否已下发指令
// var cmd = StaticData.WcsCmd.Where(t => t.taskId == task.objid).FirstOrDefault();
// //指令表存在说明已下发
// if (cmd == null)
// { //获取下发agv指令
// string ip = ""; int port = 0; string url = "";
// RequestAGVTaskDto agvtask = new RequestAGVTaskDto();
// agvtask.reqCode = task.serialNo.ToString();
// //var json = JsonConvert.SerializeObject(agvtask);
// //HttpHelper.SendPostMessage(ip, port, url, json);
// wcsToWms.genAgvSchedulingTask(agvtask);
// //未下发给agv下发指令
// WcsCmd taskCmd = new WcsCmd()
// {
// taskId = task.objid,
// cmdType = task.taskType,
// serialNo = task.serialNo,
// equipmentNo = task.equipmentNo,
// cmdStatus = 1,
// createBy = FloorNo + "楼AGV",
// createTime = DateTime.Now,
// };
// dbContext.Add(taskCmd);
// dbContext.SaveChanges();
// }
// else
// {
// //获取接驳位是否有托盘
// var IsPallet = this._plc.Read(this.LineIsPallet.plcpointAddress);
// if (cmd.sendFlag == 0)
// {
// if (taskInType.Contains(task.taskType.GetValueOrDefault()))//入库
// {
// //入库时有托盘继续任务
// if (Convert.ToInt32(IsPallet) == 1)
// {
// continueTaskDto continueTask = new continueTaskDto();
// continueTask.taskCode = task.objid.ToString();
// wcsToWms.continueTask(continueTask);
// //未下发给agv下发指令
// WcsCmd taskCmd = new WcsCmd()
// {
// taskId = task.objid,
// sendFlag = 1,
// createBy = FloorNo + "楼AGV",
// createTime = DateTime.Now,
// };
// dbContext.Update(taskCmd);
// dbContext.SaveChanges();
// }
// }
// else
// {
// //出库时没有托盘继续任务
// if (Convert.ToInt32(IsPallet) == 0)
// {
// continueTaskDto continueTask = new continueTaskDto();
// continueTask.taskCode = task.objid.ToString();
// wcsToWms.continueTask(continueTask);
// //更新任务
// dbContext.WcsCmd.Where(t => t.taskId == task.objid).Update(t => new WcsCmd()
// {
// sendFlag = 1,
// updateTime = DateTime.Now,
// updateBy = "agv出库",
// });
// }
// }
// }
// }
//}
}
}

@ -1,11 +1,14 @@
using Khd.Core.Domain.Dto.webapi;
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library.Mapper;
using Khd.Core.Plc;
using Khd.Core.Wcs.Global;
using Masuit.Tools.Logging;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Newtonsoft.Json;
using Z.EntityFramework.Plus;
namespace Khd.Core.Wcs.Wcs
{
@ -64,6 +67,7 @@ namespace Khd.Core.Wcs.Wcs
public void MonitorInLocatorPoint()
{
List<int> ITypes = new List<int> { 1, 3, 5, 7 };
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
while (true)
@ -72,26 +76,113 @@ namespace Khd.Core.Wcs.Wcs
{
dbContext.ChangeTracker.Entries().ToList().ForEach(e => e.Reload());
//入库任务
var rfid = this._plc.Read(LineRFID.plcpointAddress);
var rfid = this._plc.ReadRFID(LineRFID.plcpointAddress);
var isSignal = this._plc.Read(LineSignal.plcpointAddress);
var isPallet = this._plc.Read(LineIsPallet.plcpointAddress);
if (rfid != null && isSignal != null && isPallet != null)
if (rfid != null && isSignal != null)
{
//正常读到输送线信息 有到位信号,并且有托盘,获取条码信息
if (Convert.ToInt32(isSignal) > 0 && Convert.ToInt32(isPallet) == 1)
if (Convert.ToInt32(isSignal) == 1)//托盘到位
{
//获取条码信息
var palletNo = Convert.ToString(rfid);
//获取入库任务
var wcsTask = GetTask(palletNo, FloorNo, EquipNo);
var nextEquip = StaticData.BaseEquip.Where(t => t.floorNo == FloorNo && t.equipType == 4).FirstOrDefault();
//更新任务下一点位为AGV
wcsTask.nextPointId = nextEquip.objid;
wcsTask.nextPointNo = nextEquip.equipNo;
wcsTask.updateTime = DateTime.Now;
wcsTask.updateBy = FloorNo + "楼输送线";
dbContext.Update(wcsTask);
dbContext.SaveChanges();
BaseEquip baseEquip = StaticData.BaseEquip.First(t => t.floorNo == 3 && t.equipType == 1);
var wcsTask = dbContext.WcsTask.FirstOrDefault(t => t.containerNo == rfid && t.nextPointId == baseEquip.objid);
if (wcsTask != null)//如果不是null
{
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.instockFlag == "0")
.Where(t => t.outstockFlag == "0")
.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) 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
&& a.b.locRow == b.locRow
&& a.b.locColumn == b.locColumn
&& b.locationStatus == "1"
&& b.outstockFlag == "0"
&& b.instockFlag == "0"
&& 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.floorNo == 3 && t.equipType == 4);//背负Agv
if (wmsBaseLocations.Count > 0 && wmsBaseLocation != null)
{
wcsTask.taskStatus = 0;//创建状态
wcsTask.updateTime = DateTime.Now;
wcsTask.currPointId = baseEquip.objid;
wcsTask.currPointNo = baseEquip.equipNo;
wcsTask.nextPointId = AgvEquip.objid;
wcsTask.nextPointNo = AgvEquip.equipNo;
wcsTask.endPointId = wmsBaseLocation.locationId;
wcsTask.endPointNo = wmsBaseLocation.locationCode;
if (wmsBaseLocation.warehouseId == 311)
{
wcsTask.taskType = 39;
}
else
{
Console.WriteLine("查找入库库位失败");
Thread.Sleep(1000);
continue;
}
wcsTask.useFlag = 1;
wmsBaseLocation.instockFlag = "1";
wmsBaseLocation.locationStatus = "2";
dbContext.Update(wmsBaseLocation);
dbContext.Update(wcsTask);
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
}
else
{
Console.WriteLine(DateTime.Now + ":三楼楼接驳位调度入库任务,未找到库位");
LogManager.Info("三楼接驳位调度入库任务,未找到库位");
}
}
else if (wcsTask.taskStatus == 6)//小车任务是完成状态,说明是出库
{
BaseEquip nextEquip = StaticData.BaseEquip.First(t => t.equipType == 2);//提升机
wcsTask.nextPointId = nextEquip.objid;
wcsTask.nextPointNo = nextEquip.equipNo;
wcsTask.currPointId = baseEquip.objid;
wcsTask.currPointNo = baseEquip.equipNo;
wcsTask.fromFloorNo = FloorNo;
wcsTask.taskStatus = 0;
wcsTask.updateTime = DateTime.Now;
dbContext.Update(wcsTask);
dbContext.WcsTaskLog.Where(t => t.objid == wcsTask.objid)
.Update(t => new WcsTaskLog
{
nextPointId = nextEquip.objid,
nextPointNo = nextEquip.equipNo,
currPointId = baseEquip.objid,
currPointNo = baseEquip.equipNo,
taskStatus = 0,
updateTime = DateTime.Now,
});
dbContext.SaveChanges();
}
}
}
}
}
@ -105,121 +196,5 @@ namespace Khd.Core.Wcs.Wcs
}
}
}
//获取输送线上的任务
public WcsTask GetTask(string containerNo, int floorNo, string equipNo)
{
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
var wcsTask = new WcsTask();
var wareHouseList = StaticData.WmsBaseWarehouse.ToList();
try
{
//获取条码号,如果该条码任务存在就继续任务,如果条码不存在,创建入库任务并调度agv
var task = StaticData.WcsTask.Where(t => t.containerNo == containerNo).FirstOrDefault();
if (task == null)
{
var palletInfo = StaticData.MesBasePalletInfo.Where(t => t.palletInfoCode == containerNo).FirstOrDefault();
//查询该条码绑定的物料信息
var material = StaticData.WmsWarehouseMaterial.Where(t => t.storageId == palletInfo.materialId).FirstOrDefault();
var wareHouse = wareHouseList.Where(t => t.warehouseId == material.warehouseId).FirstOrDefault();
var dic = StaticData.BaseDictionary.Where(t => t.dicKey == "TaskType" && t.ud1 == "I" && t.dicField == wareHouse.warehouseInstockType).FirstOrDefault();
var equip = StaticData.BaseEquip.ToList();
var startEquip = equip.Where(t => t.equipNo == equipNo).FirstOrDefault();
var endPoint = wareHouseList.Where(t => t.warehouseFloor == floorNo).FirstOrDefault();
//var currEquip=
if (palletInfo != null)
{
//自动获取id
var objid = StaticData.SnowId.NextId();
WcsTask newTask = new()
{
objid = objid,
taskType = Convert.ToInt32(dic.dicValue),
containerNo = containerNo,
taskStatus = 0,
materialId = material.storageId,
qty = Convert.ToInt32(palletInfo.bindAmount),
startPointId = startEquip.objid,
startPointNo = equipNo,
currPointId = startEquip.objid,
currPointNo = equipNo,
endPointId = endPoint.warehouseId,
endPointNo = endPoint.warehouseCode,
};
dbContext.Add(newTask);
dbContext.SaveChanges();
wcsTask = newTask;
}
else
{
LogManager.Info(floorNo + "楼接驳位,托盘" + containerNo + "未绑定!");
}
}
else
{
wcsTask = StaticData.WcsTask.Where(t => t.currPointNo == equipNo).FirstOrDefault();
}
}
catch (Exception ex)
{
LogManager.Info(floorNo + "楼接驳位异常" + ex.Message);
throw;
}
return wcsTask;
}
/// <summary>
/// 下发任务
/// </summary>
/// <param name="task"></param>
public void SendTask(WcsTask task)
{
using var scope = _host.Services.CreateScope();
using var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
//入库类型
List<int> taskInType = new List<int> { 1, 3, 5, 7 };
List<int> taskOutType = new List<int> { 2, 4, 6, 8 };
try
{
//获取
if (task == null) return;
if (taskInType.Contains(task.taskType.GetValueOrDefault()))
{
//首先判断是否已下发指令
var cmd = StaticData.WcsCmd.Where(t => t.taskId == task.objid).FirstOrDefault();
//指令表存在说明已下发
if (cmd != null) return;
//获取下发agv指令
string ip = ""; int port = 0; string url = "";
RequestAGVTaskDto agvtask = new RequestAGVTaskDto();
agvtask.reqCode = task.serialNo.ToString();
var json = JsonConvert.SerializeObject(agvtask);
HttpHelper.SendPostMessage(ip, port, url, json);
//未下发给agv下发指令
WcsCmd taskCmd = new WcsCmd()
{
taskId = task.objid,
cmdType = task.taskType,
serialNo = task.serialNo,
equipmentNo = task.equipmentNo,
cmdStatus = 1,
createBy = "",
createTime = DateTime.Now,
};
dbContext.Add(taskCmd);
dbContext.SaveChanges();
}
else
{
}
}
catch (Exception)
{
throw;
}
}
}
}

@ -7,119 +7,6 @@ namespace Khd.Core.Wcs.Wcs
{
public class WcsToWms
{
/// <summary>
/// 手工出库调用
/// </summary>
/// <param name="requestManualOutWare"></param>
/// <returns></returns>
public bool ManualOutWare(RequestManualOutWare requestManualOutWare)
{
//手工出库调用
var url = "/api/Interface/ManualOutWare";
var concontentType = "application/json";
var result = HttpHelper.HttpPost(url, requestManualOutWare.ToJsonString(), concontentType, 60, null);
var model = (ReponseBase)JsonConvert.DeserializeObject(result.ToString(), typeof(ReponseBase));
if (model.CODE == "S")
{
LogManager.Info("调用成功。");
}
else
{
LogManager.Info("调用失败。");
}
return true;
}
/// <summary>
/// 盘盈调用
/// </summary>
/// <param name="requestCheck"></param>
/// <returns></returns>
public bool CheckProfit(RequestCheck requestCheck)
{
//盘盈调用
var url = "/api/Interface/CheckProfit";
var concontentType = "application/json";
var result = HttpHelper.HttpPost(url, requestCheck.ToJsonString(), concontentType, 60, null);
var model = (ReponseBase)JsonConvert.DeserializeObject(result.ToString(), typeof(ReponseBase));
if (model.CODE == "S")
{
LogManager.Info("调用成功。");
}
else
{
LogManager.Info("调用失败。");
}
return true;
}
/// <summary>
/// 盘亏调用
/// </summary>
/// <param name="requestCheck"></param>
/// <returns></returns>
public bool CheckLoss(RequestCheck requestCheck)
{
//盘亏调用
var url = "/api/Interface/CheckLoss";
var concontentType = "application/json";
var result = HttpHelper.HttpPost(url, requestCheck.ToJsonString(), concontentType, 60, null);
var model = (ReponseBase)JsonConvert.DeserializeObject(result.ToString(), typeof(ReponseBase));
if (model.CODE == "S")
{
LogManager.Info("调用成功。");
}
else
{
LogManager.Info("调用失败。");
}
return true;
}
/// <summary>
/// 生成任务单
/// </summary>
/// <param name="requestCheck"></param>
/// <returns></returns>
public ReponseMessage? genAgvSchedulingTask(RequestAGVTaskDto requestAGVTaskDto)
{
//生成任务单
var url = "http://IP:PORT/rcms/services/rest/hikRpcService/genAgvSchedulingTask";
var concontentType = "application/json";
var result = HttpHelper.HttpPost(url, requestAGVTaskDto.ToJsonString(), concontentType, 60, null);
return JsonConvert.DeserializeObject<ReponseMessage>(result.ToString());
}
/// <summary>
/// 继续执行
/// </summary>
/// <param name="requestCheck"></param>
/// <returns></returns>
public ReponseMessage? continueTask(continueTaskDto continueTaskDto)
{
//继续执行
var url = "http://IP:PORT/rcms/services/rest/hikRpcService/continueTask";
var concontentType = "application/json";
var result = HttpHelper.HttpPost(url, continueTaskDto.ToJsonString(), concontentType, 60, null);
return JsonConvert.DeserializeObject<ReponseMessage>(result.ToString());
}
/// <summary>
/// 继续执行
/// </summary>
/// <param name="requestCheck"></param>
/// <returns></returns>
public bool cancelTask(RequestAGVTaskDto requestAGVTaskDto)
{
//推送出库数据
var url = "http://IP:PORT/rcms/services/rest/hikRpcService/cancelTask";
var concontentType = "application/json";
var result = HttpHelper.HttpPost(url, requestAGVTaskDto.ToJsonString(), concontentType, 60, null);
var model = (ReponseMessage)JsonConvert.DeserializeObject(result.ToString(), typeof(ReponseMessage));
if (model.code == "0")
{
LogManager.Info("调用成功。");
}
else
{
LogManager.Info("调用失败。");
}
return true;
}
}
}

@ -12,7 +12,23 @@
"Rack": 0,
"Slot": 1,
"Code": 0
}
},
//{
// "IP": "192.168.2.31",
// "Port": 102, //102
// "CpuType": 40,
// "Rack": 0,
// "Slot": 1,
// "Code": 1
//},
//{
// "IP": "192.168.2.220",
// "Port": 102, //102
// "CpuType": 40,
// "Rack": 0,
// "Slot": 1,
// "Code": 2
//}
],
"PLCSetting": {
"Mode": "0",

@ -1,6 +1,8 @@
using Masuit.Tools;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
namespace Khd.Core.Wpf
@ -25,11 +27,8 @@ namespace Khd.Core.Wpf
.AddJsonFile("appsettings.json")
.Build();
PlcConfig.CpuType = configuration["PlcConfig:CpuType"].ToInt32(40);
PlcConfig.IP = configuration["PlcConfig:IP"].ToString();
PlcConfig.Port = configuration["PlcConfig:Port"].ToInt32(102);
PlcConfig.Rack = (short)(configuration["PlcConfig:Rack"].ToInt32(0));
PlcConfig.Slot = (short)(configuration["PlcConfig:Slot"].ToInt32(0));
SystemData.PlcConfigs = configuration.GetSection("PlcConfigs").Get<List<PlcConfig>>();
ConnectionStrings.ConnectionString = configuration["ConnectionStrings:DefaultConnection"].ToString();
//配置文件 加载 Thrift 推送端口
ThriftConfig.ThriftIpAddress = configuration["ThriftConfig:ThriftIpAddress"].ToString();

@ -208,6 +208,7 @@
</Setter>
<Setter Property="VerticalContentAlignment" Value="Center"></Setter>
<Setter Property="HorizontalContentAlignment" Value="Left"></Setter>
</Style>
<!--Plc信息TextBox样式-->
<Style x:Key="tbxStyle" TargetType="{x:Type TextBox}">

@ -66,18 +66,18 @@ namespace Khd.Core.Wpf.Form
}
//加载dategrid信息
LoadMaterial_GetMessage("");
//连接PLC判断
var plc = new Khd.Core.Plc.S7.Plc((CpuType)PlcConfig.CpuType, PlcConfig.IP, PlcConfig.Port,
PlcConfig.Rack, PlcConfig.Slot);
// plc.Open();
if (!plc.IsConnected)
{
MessageBox.Show("PLC连接失败,重新连接");
}
else
{
this._plc = plc;
}
////连接PLC判断
//var plc = new Khd.Core.Plc.S7.Plc((CpuType)PlcConfig.CpuType, PlcConfig.IP, PlcConfig.Port,
//PlcConfig.Rack, PlcConfig.Slot);
//// plc.Open();
//if (!plc.IsConnected)
//{
// MessageBox.Show("PLC连接失败,重新连接");
//}
//else
//{
// this._plc = plc;
//}
//ShowTimer = new System.Windows.Threading.DispatcherTimer();
//ShowTimer.Tick += new EventHandler(ShowCurTimer);//起个Timer一直获取当前时间

@ -3,24 +3,27 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Khd.Core.Wpf.Form"
xmlns:local="clr-namespace:Khd.Core.Wpf.myConverter"
mc:Ignorable="d" WindowStyle="None"
WindowStartupLocation="CenterOwner"
WindowState="Maximized"
Title="FormBoardT"
Loaded="FormBoard_Loaded"
Width="1920"
Height="1080">
Height="1080"
>
<Window.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<!--<hc:ThemeResources/>
<hc:Theme/>-->
<hc:Theme/>-->
<ResourceDictionary Source="/CSS/SearchBtnClass.xaml" />
<ResourceDictionary Source="/CSS/SearchTextClass.xaml" />
<ResourceDictionary Source="/CSS/DataGridClass.xaml" />
</ResourceDictionary.MergedDictionaries>
<local:TypeDataConverter x:Key="taskTypeConverter"/>
<local:EquipConverter x:Key="EquipConverter"/>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="Width" Value="120"></Setter>
<Setter Property="Template">
@ -67,7 +70,7 @@
<ContentPresenter IsHitTestVisible="False" Content="{TemplateBinding SelectionBoxItem}" ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}" VerticalAlignment="Center" Margin="3" />
<!--下拉显示面板HorizontalOffset:设置下拉面板的相对位置-->
<Popup HorizontalOffset="-1" Width="{TemplateBinding ActualWidth}"
IsOpen="{TemplateBinding IsDropDownOpen}" Focusable="False" PopupAnimation="Slide">
IsOpen="{TemplateBinding IsDropDownOpen}" Focusable="False" PopupAnimation="Slide">
<Grid SnapsToDevicePixels="True" HorizontalAlignment="Stretch">
<Border BorderThickness="1,1,1,1" BorderBrush="Gray" CornerRadius="5">
<Border.Background>
@ -85,6 +88,15 @@
</Setter.Value>
</Setter>
</Style>
<Style x:Key="CheckBoxStyle" TargetType="{x:Type CheckBox}">
<Setter Property="HorizontalAlignment" Value="Center" />
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="LayoutTransform">
<Setter.Value>
<ScaleTransform ScaleX="2.5" ScaleY="2.5" />
</Setter.Value>
</Setter>
</Style>
<Style TargetType="TabItem">
<Setter Property="Background" Value="#213269"/>
<!--设置背景色-->
@ -108,15 +120,15 @@
<ControlTemplate TargetType="{x:Type Button}">
<Grid>
<Border
x:Name="border"
Background="#213269"
BorderBrush="#172557"
BorderThickness="0,0,0,3" />
x:Name="border"
Background="#213269"
BorderBrush="#172557"
BorderThickness="0,0,0,3" />
<ContentPresenter
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
RecognizesAccessKey="True"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
RecognizesAccessKey="True"
SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
@ -143,6 +155,13 @@
</Setter.Value>
</Setter>
</Style>
<Style x:Key="MenuItemStype" TargetType="MenuItem">
<Setter Property="Width" Value="150"/>
<Setter Property="Header" Value="75"/>
<Setter Property="FontSize" Value="16"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
</Style>
<!-- TextBox默认样式 -->
<Style x:Key="DefaultTextBox" TargetType="{x:Type TextBox}" />
<Style x:Key="dgCell" TargetType="TextBlock">
@ -160,9 +179,9 @@
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border
BorderBrush="{TemplateBinding Control.BorderBrush}"
BorderThickness="0"
CornerRadius="30,30,30,30">
BorderBrush="{TemplateBinding Control.BorderBrush}"
BorderThickness="0"
CornerRadius="30,30,30,30">
<Border.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0.0" Color="#2c78fa" />
@ -171,9 +190,9 @@
</LinearGradientBrush>
</Border.Background>
<ContentPresenter
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="{TemplateBinding ContentControl.Content}" />
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="{TemplateBinding ContentControl.Content}" />
</Border>
</ControlTemplate>
</Setter.Value>
@ -189,9 +208,9 @@
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border
BorderBrush="{TemplateBinding Control.BorderBrush}"
BorderThickness="0"
CornerRadius="90,90,90,90">
BorderBrush="{TemplateBinding Control.BorderBrush}"
BorderThickness="0"
CornerRadius="90,90,90,90">
<Border.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0.0" Color="#2c78fa" />
@ -200,9 +219,9 @@
</LinearGradientBrush>
</Border.Background>
<ContentPresenter
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="{TemplateBinding ContentControl.Content}" />
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="{TemplateBinding ContentControl.Content}" />
</Border>
</ControlTemplate>
</Setter.Value>
@ -218,9 +237,9 @@
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border
BorderBrush="{TemplateBinding Control.BorderBrush}"
BorderThickness="0"
CornerRadius="90,90,90,90">
BorderBrush="{TemplateBinding Control.BorderBrush}"
BorderThickness="0"
CornerRadius="90,90,90,90">
<Border.Background>
<LinearGradientBrush StartPoint="0,0" EndPoint="0,1">
<GradientStop Offset="0.0" Color="Gray" />
@ -229,9 +248,9 @@
</LinearGradientBrush>
</Border.Background>
<ContentPresenter
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="{TemplateBinding ContentControl.Content}" />
HorizontalAlignment="Center"
VerticalAlignment="Center"
Content="{TemplateBinding ContentControl.Content}" />
</Border>
</ControlTemplate>
</Setter.Value>
@ -344,6 +363,12 @@
</ResourceDictionary>
</Window.Resources>
<Window.ContextMenu>
<ContextMenu>
<MenuItem Header="退出" Click="WindowClose_Click" Style="{StaticResource MenuItemStype}"/>
</ContextMenu>
</Window.ContextMenu>
<Grid Background="#172557">
<Grid>
<Grid.RowDefinitions>
@ -361,8 +386,8 @@
<Viewbox Stretch=" fill" >
<Canvas Width="1880" Height="1080" >
<Grid Width="1880" Height="1080">
<TabControl Background="Transparent" BorderThickness="0" HorizontalAlignment="Center" VerticalContentAlignment="Center" TabStripPlacement="Left" Width="1890" Margin="-10,0,0,0">
<TabItem Header="任务管理" Foreground="White" FontSize="25" Width="160" Height="125" Margin="0,-23,8,-23" >
<TabControl Background="Transparent" BorderThickness="0" HorizontalAlignment="Center" VerticalContentAlignment="Center" SelectionChanged="TabControl_SelectionChanged" TabStripPlacement="Left" Width="1890" Margin="-10,0,0,0">
<TabItem Header="任务管理" Foreground="White" FontSize="25" Width="160" Height="125" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="5" >
<StackPanel
x:Name="essentialData"
Canvas.Left="174"
@ -380,7 +405,7 @@
/>
<Border
></Border>
<TextBox x:Name="lba_ThrifTtitle1" Style="{StaticResource XingHaoBianMaYangShi}" IsEnabled="true"
<TextBox x:Name="lba_ThrifTtitle1" Style="{StaticResource XingHaoBianMaYangShi}" IsEnabled="true"
Width="180" Height="50" Margin="-1150,-8,0,-100"></TextBox>
<Label
Width="125"
@ -405,7 +430,7 @@
</Button.Template>
</Button>
<Button Content="创建任务" Margin="200,-8,0,-100" Foreground="White" Height="50" Width="132">
<Button Content="创建任务" Margin="200,-8,0,-100" Foreground="White" Height="50" Width="132" Click="AddTaskButton_Click">
<Button.Template >
<ControlTemplate TargetType="{x:Type Button}" >
<Border BorderBrush="{TemplateBinding Control.BorderBrush}" BorderThickness="1" CornerRadius="4,4,4,4">
@ -425,7 +450,7 @@
</ControlTemplate>
</Button.Template>
</Button>
<Button Content="手动完成" Margin="800,-8,0,-100" Foreground="White" Height="50" Width="132" Click="btnFinishTask_Click">
<Button Content="开始任务" Margin="800,-8,0,-100" Foreground="White" Height="50" Width="132" Click="btnEditTask_Click">
<Button.Template >
<ControlTemplate TargetType="{x:Type Button}" >
<Border BorderBrush="{TemplateBinding Control.BorderBrush}" BorderThickness="1" CornerRadius="4,4,4,4">
@ -435,6 +460,16 @@
</ControlTemplate>
</Button.Template>
</Button>
<!--<Button Content="手动完成" Margin="800,-8,0,-100" Foreground="White" Height="50" Width="132" Click="btnFinishTask_Click">
<Button.Template >
<ControlTemplate TargetType="{x:Type Button}" >
<Border BorderBrush="{TemplateBinding Control.BorderBrush}" BorderThickness="1" CornerRadius="4,4,4,4">
<Border.Background>#346DFF</Border.Background>
<ContentPresenter Content="{TemplateBinding ContentControl.Content}" HorizontalAlignment="Center" VerticalAlignment="Center" ></ContentPresenter>
</Border>
</ControlTemplate>
</Button.Template>
</Button>-->
<!-- 订单信息 -->
@ -462,6 +497,17 @@
RowHeaderWidth="0"
SelectionMode="Single" FontSize="16" HorizontalAlignment="Left" Width="1711" Margin="0,0,0,10">
<DataGrid.Columns>
<DataGridTemplateColumn Width="130*" Header="选择">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<CheckBox x:Name="SelectBox" Click="CheckBox_Click"
Style="{StaticResource CheckBoxStyle}"
/>
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn
x:Name="orderControlData0"
Width="100"
@ -487,7 +533,7 @@
ElementStyle="{StaticResource dgCell}"
FontSize="20"
Header="流水号"
IsReadOnly="True" />
IsReadOnly="True" Visibility="Hidden" />
<DataGridTextColumn
Width="250*"
@ -496,10 +542,10 @@
ElementStyle="{StaticResource dgCell}"
FontSize="20"
Header="设备编号"
IsReadOnly="True" />
IsReadOnly="True" Visibility="Hidden"/>
<DataGridTextColumn
Width="250*"
Width="300*"
Binding="{Binding containerNo}"
CanUserSort="False"
ElementStyle="{StaticResource dgCell}"
@ -507,8 +553,8 @@
Header="容器号"
IsReadOnly="True" />
<DataGridTextColumn
Width="200*"
Binding="{Binding taskType}"
Width="300*"
Binding="{Binding taskType,Converter={StaticResource taskTypeConverter}}"
CanUserSort="False"
ElementStyle="{StaticResource dgCell}"
FontSize="20"
@ -529,18 +575,18 @@
ElementStyle="{StaticResource dgCell}"
FontSize="20"
Header="数量"
IsReadOnly="True" />
IsReadOnly="True" Visibility="Hidden"/>
<DataGridTextColumn
Width="200*"
Binding="{Binding startPointNo}"
Width="300*"
Binding="{Binding startPointNo,Converter={StaticResource EquipConverter}}"
CanUserSort="False"
ElementStyle="{StaticResource dgCell}"
FontSize="20"
Header="起始站点"
IsReadOnly="True" />
<DataGridTextColumn
Width="200*"
Binding="{Binding currPointNo}"
Width="300*"
Binding="{Binding currPointNo,Converter={StaticResource EquipConverter}}"
CanUserSort="False"
ElementStyle="{StaticResource dgCell}"
FontSize="20"
@ -548,31 +594,39 @@
IsReadOnly="True" />
<DataGridTextColumn
Width="200*"
Binding="{Binding nextPointNo}"
Binding="{Binding nextPointNo,Converter={StaticResource EquipConverter}}"
CanUserSort="False"
ElementStyle="{StaticResource dgCell}"
FontSize="20"
Header="下一站点"
IsReadOnly="True" />
<DataGridTextColumn
Width="200*"
Binding="{Binding endPointNo}"
Width="300*"
Binding="{Binding endPointNo,Converter={StaticResource EquipConverter}}"
CanUserSort="False"
ElementStyle="{StaticResource dgCell}"
FontSize="20"
Header="目的站点"
IsReadOnly="True" />
<DataGridTextColumn
Width="200*"
Width="230*"
Binding="{Binding fromFloorNo}"
CanUserSort="False"
ElementStyle="{StaticResource dgCell}"
FontSize="20"
Header="起始楼层"
IsReadOnly="True" />
<DataGridTextColumn
Width="230*"
Binding="{Binding floorNo}"
CanUserSort="False"
ElementStyle="{StaticResource dgCell}"
FontSize="20"
Header="所属楼层"
Header="目的楼层"
IsReadOnly="True" />
<DataGridTextColumn
Width="220*"
Width="350*"
Binding="{Binding createTime,StringFormat='{}{0:yyyy-MM-dd HH:mm:ss}'}"
CanUserSort="False"
ElementStyle="{StaticResource dgCell}"
@ -621,7 +675,126 @@
</Grid>
</StackPanel>
</TabItem>
<TabItem Header="设备管理" Foreground="White" FontSize="25" Width="160" Height="125" Margin="0,23,8,-23">
<!--<TabItem Header="入库确认" Foreground="White" FontSize="25" Width="160" Height="125" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="5">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<StackPanel Orientation="Horizontal" >
<Button Content="搜素" Background="#346DFF" Foreground="White" Height="50" Width="150" Margin="10" Click="InSearchButton_Click"/>
<Button Content="确认入库" Background="#346DFF" Foreground="White" Height="50" Width="150" Margin="10" Click="ConfirmTaskButton_Click"/>
</StackPanel>
<DataGrid
Grid.Row="1"
x:Name="WcsTaskLogDataGrid"
AlternationCount="2"
AutoGenerateColumns="False"
Background="#172557"
CanUserAddRows="False"
CanUserReorderColumns="False"
CanUserResizeColumns="False"
CanUserResizeRows="False"
Focusable="False"
HeadersVisibility="Column"
IsReadOnly="True"
LoadingRow="dgData_LoadingRow"
RowHeaderWidth="0"
SelectionMode="Single" FontSize="16" HorizontalAlignment="Left"
>
<DataGrid.Columns>
<DataGridTemplateColumn Width="130*" Header="选择">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Grid>
<CheckBox x:Name="InSelectBox" Click="InCheckBox_Click"
Style="{StaticResource CheckBoxStyle}" />
</Grid>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn
Width="100"
MinWidth="10"
Header=" 序号"
IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock
Margin="0"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Focusable="False"
FontSize="20"
Text="{Binding Header, RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}, Mode=FindAncestor}}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn
Width="300*"
Binding="{Binding containerNo}"
CanUserSort="False"
ElementStyle="{StaticResource dgCell}"
FontSize="20"
Header="容器号"
IsReadOnly="True" />
<DataGridTextColumn
Width="300*"
Binding="{Binding ud2}"
CanUserSort="False"
ElementStyle="{StaticResource dgCell}"
FontSize="20"
Header="楼层"
IsReadOnly="True" />
<DataGridTextColumn
Width="300*"
Binding="{Binding materialId}"
CanUserSort="False"
ElementStyle="{StaticResource dgCell}"
FontSize="20"
Header="物料"
IsReadOnly="True" />
</DataGrid.Columns>
<DataGrid.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="Background" Value="#213269" />
<Setter Property="Foreground" Value="White" />
<Setter Property="Height" Value="50" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
</Style>
</DataGrid.CellStyle>
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="Background" Value="#213269" />
<Setter Property="Foreground" Value="White" />
<Setter Property="Height" Value="50" />
</Style>
</DataGrid.RowStyle>
<DataGrid.RowHeaderStyle>
<Style TargetType="{x:Type DataGridRowHeader}">
<Setter Property="Background" Value="#213269" />
<Setter Property="Foreground" Value="White" />
<Setter Property="Height" Value="50" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
</Style>
</DataGrid.RowHeaderStyle>
<DataGrid.ColumnHeaderStyle>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Background" Value="#172560" />
<Setter Property="Foreground" Value="White" />
<Setter Property="Height" Value="50" />
<Setter Property="HorizontalContentAlignment" Value="Center" />
<Setter Property="Margin" Value="0,0,0,0" />
<Setter Property="BorderThickness" Value="5" />
<Setter Property="BorderBrush" Value="#172540" />
<Setter Property="FontSize" Value="30" />
</Style>
</DataGrid.ColumnHeaderStyle>
</DataGrid>
</Grid>
</TabItem>-->
<TabItem Header="设备管理" Foreground="White" FontSize="25" Width="160" Height="125" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="5" >
<StackPanel
x:Name="materialBom"
Canvas.Left="174"
@ -784,7 +957,7 @@
<Label Content="Label"/>
</StackPanel>
</TabItem>
<TabItem Header="库存信息" Foreground="White" FontSize="25" Width="160" Height="125" Margin="0,46,8,-46" >
<TabItem Header="库存信息" Foreground="White" FontSize="25" Width="160" Height="125" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="5" >
<StackPanel
x:Name="orderControl"
Canvas.Left="174"
@ -812,11 +985,13 @@
FontSize="25"
Foreground="White"
/>
<Border
></Border>
<Border></Border>
<TextBox x:Name="lba_ThrifTtitle6" Style="{StaticResource XingHaoBianMaYangShi}" IsEnabled="true"
Width="180" Height="50" Margin="-550,-8,0,-100"></TextBox>
<Button Content="搜索" Margin="-100,-8,0,-100" Foreground="White" Height="50" Width="132" Click="btnGetStocK_Click">
<Label Width="125" Height="70" Margin="-100,20,0,-100" Content="仓库 :" FontSize="25" Foreground="White"/>
<Border></Border>
<ComboBox x:Name="WarehourseId" DisplayMemberPath="warehouseName" Height="50" Margin="140,0,0,-100" Width="200" FontSize="25" />
<Button Content="搜索" Margin="600,-8,0,-100" Foreground="White" Height="50" Width="132" Click="btnGetStocK_Click">
<Button.Template >
<ControlTemplate TargetType="{x:Type Button}" >
<Border BorderBrush="{TemplateBinding Control.BorderBrush}" BorderThickness="1" CornerRadius="4,4,4,4">
@ -870,8 +1045,8 @@
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn
Width="200"
Binding="{Binding materialCode}"
Width="200*"
Binding="{Binding materialId}"
CanUserSort="False"
ElementStyle="{StaticResource dgCell}"
FontSize="20"
@ -879,16 +1054,16 @@
IsReadOnly="True" />
<DataGridTextColumn
Width="200"
Binding="{Binding materialName}"
Width="200*"
Binding="{Binding instockBatch}"
CanUserSort="False"
ElementStyle="{StaticResource dgCell}"
FontSize="20"
Header="物料名称"
Header="批次号"
IsReadOnly="True" />
<DataGridTextColumn
Width="180"
Width="180*"
Binding="{Binding warehouseId}"
CanUserSort="False"
ElementStyle="{StaticResource dgCell}"
@ -897,56 +1072,45 @@
IsReadOnly="True" />
<DataGridTextColumn
Width="150"
Width="150*"
Binding="{Binding locationCode}"
CanUserSort="False"
ElementStyle="{StaticResource dgCell}"
FontSize="20"
Header="库位"
IsReadOnly="True" />
<DataGridTextColumn
Width="150"
Binding="{Binding layerNo}"
CanUserSort="False"
ElementStyle="{StaticResource dgCell}"
FontSize="20"
Header="层"
IsReadOnly="True" />
<DataGridTextColumn
Width="180"
Binding="{Binding colNo}"
CanUserSort="False"
ElementStyle="{StaticResource dgCell}"
FontSize="20"
Header="列"
IsReadOnly="True" />
<DataGridTextColumn
Width="180"
Binding="{Binding rowNo}"
CanUserSort="False"
ElementStyle="{StaticResource dgCell}"
FontSize="20"
Header="排"
IsReadOnly="True" />
<DataGridTextColumn
Width="180"
Binding="{Binding deepNo}"
CanUserSort="False"
ElementStyle="{StaticResource dgCell}"
FontSize="20"
Header="深位"
IsReadOnly="True" />
<DataGridTextColumn
Width="180"
<DataGridTextColumn
Width="180*"
Binding="{Binding floorNo}"
CanUserSort="False"
ElementStyle="{StaticResource dgCell}"
FontSize="20"
Header="楼层"
IsReadOnly="True" />
<DataGridTextColumn
Width="180*"
Binding="{Binding totalAmount}"
CanUserSort="False"
ElementStyle="{StaticResource dgCell}"
FontSize="20"
Header="总数"
IsReadOnly="True" />
<DataGridTextColumn
Width="180*"
Binding="{Binding occupyAmount}"
CanUserSort="False"
ElementStyle="{StaticResource dgCell}"
FontSize="20"
Header="占用数量"
IsReadOnly="True" />
<DataGridTextColumn
Width="180*"
Binding="{Binding frozenAmount}"
CanUserSort="False"
ElementStyle="{StaticResource dgCell}"
FontSize="20"
Header="冻结数量"
IsReadOnly="True" />
@ -993,7 +1157,7 @@
</Grid>
</StackPanel>
</TabItem>
<TabItem Header="指令管理" Foreground="White" FontSize="25" Width="160" Height="125" Margin="0,69,8,-69" >
<!--<TabItem Header="指令管理" Foreground="White" FontSize="25" Width="160" Height="125" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="5" >
<StackPanel
x:Name="UpperStart"
Canvas.Left="174"
@ -1240,9 +1404,9 @@
</DataGrid>
</StackPanel>
</StackPanel>
</TabItem>
<TabItem Header="物料扫描" FontSize="25" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Foreground="White" Width="160" Height="125" Margin="0,92,8,-92" >
<StackPanel x:Name="splMaterialCode" Height="1060" Width="1920" Background="#213269" Canvas.Left="175" Canvas.Top="110" Orientation="Horizontal" Margin="5,-15,0,0">
</TabItem>-->
<TabItem Header="物料扫描" FontSize="25" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Foreground="White" Width="160" Height="125" Margin="5">
<StackPanel x:Name="splMaterialCode" Height="1060" Width="1703" Background="#213269" Canvas.Left="175" Canvas.Top="110" Orientation="Horizontal">
<StackPanel Orientation="Horizontal" Width="1750">
<StackPanel Orientation="Vertical" Margin="20,5,0,0">
<StackPanel Orientation="Horizontal" Margin="0" HorizontalAlignment="Left">
@ -1258,6 +1422,16 @@
<StackPanel Margin="0,10,10,10">
<Label
Width="152"
Height="73"
Content="物料 :"
FontSize="25" Margin="0,0,750,-60"
Foreground="White" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
/>
<TextBox x:Name="callMaterialId" Style="{StaticResource XingHaoBianMaYangShi}" IsEnabled="true"
LostFocus="callMaterialId_LostFocus"
Width="180" Height="50" Margin="0,0,400,0"/>
<Label
Width="152"
Height="73"
Content="数量 :"
@ -1267,7 +1441,7 @@
<TextBox x:Name="txtNum" Style="{StaticResource XingHaoBianMaYangShi}" IsEnabled="true"
Width="180" Height="50" Margin="0,0,400,0"/>
<Button Content="呼叫料箱" Margin="0,-50,10,0" Foreground="White" Height="50" Width="132" Click="btnCallBox_Click">
<Button x:Name="btnCallMaterial" Content="呼叫料箱" Margin="0,-50,10,0" Foreground="White" Height="50" Width="132" Click="btnCallBox_Click">
<Button.Template >
<ControlTemplate TargetType="{x:Type Button}" >
<Border BorderBrush="{TemplateBinding Control.BorderBrush}" BorderThickness="1" CornerRadius="4,4,4,4">
@ -1299,7 +1473,7 @@
Foreground="White" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
/>
<ComboBox x:Name="cbxType" Margin="0,0,400,0" Width="180" Height="50" >
<ComboBoxItem Content="入库" />
<ComboBoxItem Content="入库" IsSelected="True"/>
<ComboBoxItem Content="出库" />
<ComboBoxItem Content="回库" />
</ComboBox>
@ -1321,7 +1495,27 @@
Foreground="White" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
/>
<TextBox x:Name="txtBarCode" Style="{StaticResource XingHaoBianMaYangShi}" IsEnabled="true"
Width="180" Height="50" Margin="0,0,400,0" KeyDown="txtBarCode_KeyDown"/>
Width="180" Height="50" Margin="0,0,400,0" TextChanged="txtBarCode_KeyDown"/>
<Button Content="清除料箱条码" Margin="400,-180,10,0" HorizontalAlignment="Left" Foreground="White" Height="50" Width="170" Click="clearRFID_Click">
<Button.Template >
<ControlTemplate TargetType="{x:Type Button}" >
<Border BorderBrush="{TemplateBinding Control.BorderBrush}" BorderThickness="1" CornerRadius="4,4,4,4">
<Border.Background>#346DFF</Border.Background>
<ContentPresenter Content="{TemplateBinding ContentControl.Content}" HorizontalAlignment="Center" VerticalAlignment="Center" ></ContentPresenter>
</Border>
</ControlTemplate>
</Button.Template>
</Button>
<Button Content="清除条码" Margin="400,-50,10,0" HorizontalAlignment="Left" Foreground="White" Height="50" Width="170" Click="clearBarCode_Click">
<Button.Template >
<ControlTemplate TargetType="{x:Type Button}" >
<Border BorderBrush="{TemplateBinding Control.BorderBrush}" BorderThickness="1" CornerRadius="4,4,4,4">
<Border.Background>#346DFF</Border.Background>
<ContentPresenter Content="{TemplateBinding ContentControl.Content}" HorizontalAlignment="Center" VerticalAlignment="Center" ></ContentPresenter>
</Border>
</ControlTemplate>
</Button.Template>
</Button>
<Label
Width="152"
Height="73"
@ -1330,9 +1524,20 @@
Foreground="White" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"
/>
<TextBox x:Name="txtScan" Style="{StaticResource XingHaoBianMaYangShi}" IsReadOnly="True"
Width="180" Height="50" Margin="0,0,400,0" IsEnabled="False"/>
Width="180" Height="50" Margin="0,0,400,0" IsEnabled="False" />
<Button Content="确认" Margin="0,-50,10,0" Foreground="White" Height="50" Width="132" Click="btnConfirmBox_Click">
<Button Content="确认" Margin="150,30,10,0" HorizontalAlignment="Left" Foreground="White" Height="50" Width="132" Click="btnConfirmBox_Click">
<Button.Template >
<ControlTemplate TargetType="{x:Type Button}" >
<Border BorderBrush="{TemplateBinding Control.BorderBrush}" BorderThickness="1" CornerRadius="4,4,4,4">
<Border.Background>#346DFF</Border.Background>
<ContentPresenter Content="{TemplateBinding ContentControl.Content}" HorizontalAlignment="Center" VerticalAlignment="Center" ></ContentPresenter>
</Border>
</ControlTemplate>
</Button.Template>
</Button>
<Button Content="背负式小车捡料完成" Margin="50,50,10,0" HorizontalAlignment="Left" Foreground="White" Height="50" Width="300" Click="btnBearConfirmBox_Click">
<Button.Template >
<ControlTemplate TargetType="{x:Type Button}" >
<Border BorderBrush="{TemplateBinding Control.BorderBrush}" BorderThickness="1" CornerRadius="4,4,4,4">
@ -1348,8 +1553,8 @@
</StackPanel>
</StackPanel>
</TabItem>
<TabItem Header="PLC信息看板" FontSize="25" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Foreground="White" Width="160" Height="125" Margin="0,112,0,-112" >
<StackPanel x:Name="splPlcMessage" Height="1060" Width="1920" Background="#213269" Canvas.Left="175" Canvas.Top="110" Orientation="Horizontal" Margin="5,-15,0,0">
<TabItem Header="PLC信息" FontSize="25" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Foreground="White" Width="160" Height="125" Margin="5">
<StackPanel x:Name="splPlcMessage" Height="1060" Width="1729" Background="#213269" Canvas.Left="175" Canvas.Top="110" Orientation="Horizontal">
<StackPanel Orientation="Horizontal" Width="1750">
<StackPanel Orientation="Vertical" Margin="20,5,0,0">
<StackPanel Orientation="Horizontal" Margin="0">
@ -1360,99 +1565,85 @@
Margin="60,0,0,0"
Source="..\Resources\chanpintiaoma.png" Visibility="Visible"/>
<Label Content="PLC交互信息" Foreground="White" FontSize="20" Width="150" Height="40" Margin="10,0,80,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<Button Content="刷新" Foreground="White" Height="50" Width="132" Click="btnRefreshPlc_Click">
<Button.Template >
<ControlTemplate TargetType="{x:Type Button}" >
<Border BorderBrush="{TemplateBinding Control.BorderBrush}" BorderThickness="1" CornerRadius="4,4,4,4">
<Border.Background>#346DFF</Border.Background>
<ContentPresenter Content="{TemplateBinding ContentControl.Content}" HorizontalAlignment="Center" VerticalAlignment="Center" ></ContentPresenter>
</Border>
</ControlTemplate>
</Button.Template>
</Button>
</StackPanel>
<Border Background="#213269" BorderBrush="Silver" BorderThickness="2" CornerRadius="10" Width="700" Margin="0,5,0,0">
<StackPanel Height="865" Width="800">
<StackPanel Orientation="Horizontal" Height="65">
<Label Content="交互点" Foreground="White" FontSize="20" Width="180" Height="60" Margin="40,0,70,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<Label Content="RFID" Foreground="White" FontSize="12" Width="60" Height="60" Margin="-20,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<Label Content="到位信号" Foreground="White" FontSize="12" Width="60" Height="60" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<Label Content="是否有托盘" Foreground="White" FontSize="12" Width="80" Height="60" Margin="-10,0,0,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<Label Content="去向" Foreground="White" FontSize="12" Width="60" Height="60" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<Label Content="流水号" Foreground="White" FontSize="10" Width="80" Height="60" Margin="-10,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Height="65">
<Label Content="一楼输送线" Foreground="White" FontSize="20" Width="200" Height="50" Margin="30,0,60,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<TextBox Text="0" x:Name="carno101" FontSize="15" Width="60" Height="50" Margin="-20,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="carstate101" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="plcsend101" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="carrun101" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" MaxLength="3" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="wcsend101" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" Style="{StaticResource tbxStyle}" MaxLength="1"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Height="65">
<Label Content="一楼提升机前输送线" Foreground="White" FontSize="20" Width="200" Height="50" Margin="30,0,60,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<TextBox Text="0" x:Name="carno102" FontSize="15" Width="60" Height="50" Margin="-20,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="carstate102" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="plcsend102" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="carrun102" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" MaxLength="3" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="wcsend102" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" MaxLength="1" Style="{StaticResource tbxStyle}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Height="65">
<Label Content="二楼输送线" Foreground="White" FontSize="20" Width="200" Height="50" Margin="30,0,60,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<TextBox Text="0" x:Name="carno103" FontSize="15" Width="60" Height="50" Margin="-20,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="carstate103" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}" />
<TextBox Text="0" x:Name="plcsend103" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="carrun103" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" MaxLength="3" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="wcsend103" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" MaxLength="1" Style="{StaticResource tbxStyle}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Height="65">
<Label Content="二楼提升机前输送线" Foreground="White" FontSize="20" Width="200" Height="50" Margin="30,0,60,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<TextBox Text="0" x:Name="carno201" FontSize="15" Width="60" Height="50" Margin="-20,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="carstate201" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="plcsend201" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="carrun201" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" MaxLength="3" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="wcsend201" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" MaxLength="1" Style="{StaticResource tbxStyle}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Height="65">
<Label Content="三楼输送线" Foreground="White" FontSize="20" Width="200" Height="50" Margin="30,0,60,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<TextBox Text="0" x:Name="carno202" FontSize="15" Width="60" Height="50" Margin="-20,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="carstate202" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="plcsend202" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="carrun202" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" MaxLength="3" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="wcsend202" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" MaxLength="1" Style="{StaticResource tbxStyle}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Height="65">
<Label Content="三楼提升机前输送线" Foreground="White" FontSize="20" Width="200" Height="50" Margin="30,0,60,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<TextBox Text="0" x:Name="carno203" FontSize="15" Width="60" Height="50" Margin="-20,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}" />
<TextBox Text="0" x:Name="carstate203" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="plcsend203" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="carrun203" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" MaxLength="3" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="wcsend203" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" MaxLength="1" Style="{StaticResource tbxStyle}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Height="65">
<Label Content="四楼输送线" Foreground="White" FontSize="20" Width="200" Height="50" Margin="30,0,60,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<TextBox Text="0" x:Name="carno501" FontSize="15" Width="60" Height="50" Margin="-20,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}" />
<TextBox Text="0" x:Name="carstate501" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="plcsend501" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="carrun501" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" MaxLength="3" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="wcsend501" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" MaxLength="1" Style="{StaticResource tbxStyle}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Height="65">
<Label Content="四楼提升机前输送线" Foreground="White" FontSize="20" Width="200" Height="50" Margin="30,0,60,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<TextBox Text="0" x:Name="carno502" FontSize="15" Width="60" Height="50" Margin="-20,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}" />
<TextBox Text="0" x:Name="carstate502" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="plcsend502" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="carrun502" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" MaxLength="3" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="wcsend502" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" MaxLength="1" Style="{StaticResource tbxStyle}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Height="65">
<Label Content="五楼输送线" Foreground="White" FontSize="20" Width="200" Height="50" Margin="30,0,60,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<TextBox Text="0" x:Name="carno503" FontSize="15" Width="60" Height="50" Margin="-20,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}" />
<TextBox Text="0" x:Name="carstate503" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="plcsend503" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="carrun503" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" MaxLength="3" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="wcsend503" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" MaxLength="1" Style="{StaticResource tbxStyle}"/>
</StackPanel>
<StackPanel Orientation="Horizontal" Height="65">
<Label Content="五楼提升机前输送线" Foreground="White" FontSize="20" Width="200" Height="50" Margin="30,0,60,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center"/>
<TextBox Text="0" x:Name="carno504" FontSize="15" Width="60" Height="50" Margin="-20,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}" />
<TextBox Text="0" x:Name="carstate504" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="plcsend504" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" IsReadOnly="True" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="carrun504" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" MaxLength="3" Style="{StaticResource tbxStyle}"/>
<TextBox Text="0" x:Name="wcsend504" FontSize="15" Width="60" Height="50" Margin="0,0,10,0" HorizontalContentAlignment="Center" VerticalContentAlignment="Center" MaxLength="1" Style="{StaticResource tbxStyle}"/>
</StackPanel>
</StackPanel>
<Border Background="#213269" BorderBrush="Silver" BorderThickness="2" CornerRadius="10" Width="700" Height="500" Margin="0,5,0,0">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="1.5*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock Text="接驳位" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.ColumnSpan="6" FontSize="40"/>
<TextBlock Text="RFID" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="1" Grid.Row="1" FontSize="25"/>
<TextBlock Text="到位" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="2" Grid.Row="1" FontSize="25"/>
<TextBlock Text="去向" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="3" Grid.Row="1" FontSize="25"/>
<TextBlock Text="一楼接驳位" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="0" Grid.Row="2" FontSize="25"/>
<TextBlock x:Name="RFID001" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="1" Grid.Row="2" FontSize="25"/>
<TextBlock x:Name="linesignal01" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="2" Grid.Row="2" FontSize="25"/>
<TextBlock x:Name="wcsrun01" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="3" Grid.Row="2" FontSize="25"/>
<TextBlock Text="二楼接驳位" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="0" Grid.Row="3" FontSize="25"/>
<TextBlock x:Name="RFID002" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="1" Grid.Row="3" FontSize="25"/>
<TextBlock x:Name="linesignal02" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="2" Grid.Row="3" FontSize="25"/>
<TextBlock x:Name="wcsrun02" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="3" Grid.Row="3" FontSize="25"/>
<TextBlock Text="三楼接驳位" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="0" Grid.Row="4" FontSize="25"/>
<TextBlock x:Name="RFID003" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="1" Grid.Row="4" FontSize="25"/>
<TextBlock x:Name="linesignal03" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="2" Grid.Row="4" FontSize="25"/>
<TextBlock x:Name="wcsrun03" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="3" Grid.Row="4" FontSize="25"/>
<TextBlock Text="四楼接驳位" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="0" Grid.Row="5" FontSize="25"/>
<TextBlock x:Name="RFID004" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="1" Grid.Row="5" FontSize="25"/>
<TextBlock x:Name="linesignal04" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="2" Grid.Row="5" FontSize="25"/>
<TextBlock x:Name="wcsrun04" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="3" Grid.Row="5" FontSize="25"/>
<TextBlock Text="五楼接驳位" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="0" Grid.Row="6" FontSize="25"/>
<TextBlock x:Name="RFID005" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="1" Grid.Row="6" FontSize="25"/>
<TextBlock x:Name="linesignal05" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="2" Grid.Row="6" FontSize="25"/>
<TextBlock x:Name="wcsrun05" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="3" Grid.Row="6" FontSize="25"/>
</Grid>
</Border>
<Border Background="#213269" BorderBrush="Silver" BorderThickness="2" CornerRadius="10" Width="700" Height="300" Margin="0,50,0,0">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock Text="五楼U型线" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.ColumnSpan="3" FontSize="40"/>
<TextBlock Text="允许放" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="0" Grid.Row="1" FontSize="25"/>
<TextBlock Text="允许取" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="2" Grid.Row="1" FontSize="25"/>
<TextBlock Text="RFID" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="1" Grid.Row="1" FontSize="25"/>
<TextBlock x:Name="isput" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="0" Grid.Row="2" FontSize="25"/>
<TextBlock x:Name="isarrive" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="2" Grid.Row="2" FontSize="25"/>
<TextBlock x:Name="RFID5001" HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Column="1" Grid.Row="2" FontSize="25"/>
</Grid>
</Border>
</StackPanel>
</StackPanel>

File diff suppressed because it is too large Load Diff

@ -1,14 +1,16 @@
using Jc.SnowId;
using Khd.Core.Plc.S7;
namespace Khd.Core.Wpf
{
public static class PlcConfig
public class PlcConfig
{
public static int CpuType { get; set; }
public static string IP { get; set; }
public static int Port { get; set; }
public static short Rack { get; set; }
public static short Slot { get; set; }
public CpuType CpuType { get; set; }
public string IP { get; set; }
public int Port { get; set; }
public short Rack { get; set; }
public short Slot { get; set; }
public int Code { get; set; }
}
public static class ConnectionStrings
{

@ -1,13 +1,41 @@
using System;
using Khd.Core.Domain.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media;
namespace Khd.Core.Wpf
{
public class SystemData
public static class SystemData
{
public static IEnumerable<Visual> GetChildren(this Visual parent, bool recurse = true)
{
if (parent != null)
{
int count = VisualTreeHelper.GetChildrenCount(parent);
for (int i = 0; i < count; i++)
{
// Retrieve child visual at specified index value.
var child = VisualTreeHelper.GetChild(parent, i) as Visual;
if (child != null)
{
yield return child;// 聚集函数,调用到这不会立刻结束方法,而是在集合中添加元素,直到方法结束,将集合返回
if (recurse)
{
foreach (var grandChild in child.GetChildren(true))
{
yield return grandChild;
}
}
}
}
}
}
public static string _message { get; set; }
public static object _lock = new object();
@ -51,5 +79,13 @@ namespace Khd.Core.Wpf
}
}
}
public static List<BasePlcpoint> BasePlcpoints { get; set; }
public static List<BaseEquip> BaseEquip { get; internal set; }
public static List<WmsBaseWarehouse> BaseWareHouse { get; internal set; }
public static List<BaseDictionary> BaseDictionary =new List<BaseDictionary>();
public static List<PlcConfig> PlcConfigs =new List<PlcConfig>();
public static Dictionary<int,Plc.S7.Plc> PlcDic=new Dictionary<int, Plc.S7.Plc>();
}
}

@ -0,0 +1,50 @@
<Window x:Class="Khd.Core.Wpf.TaskForm.AddTask"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:Khd.Core.Wpf.TaskForm"
mc:Ignorable="d"
WindowState="Normal"
WindowStartupLocation="CenterScreen"
Background="#333333"
Loaded="Window_Loaded"
Title="" Height="450" Width="800" ResizeMode="NoResize" WindowStyle="None">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock Text="人工调度任务下发" Foreground="White" FontSize="50" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<!--<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Center">
<TextBlock Text="托盘号:" Foreground="White" FontSize="25" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<TextBox x:Name="RFID" FontSize="25" Height="50" Width="400" VerticalAlignment="Center" HorizontalAlignment="Center"/>
</StackPanel>-->
<StackPanel Grid.Row="1" Orientation="Horizontal" HorizontalAlignment="Center">
<TextBlock Text="起始点:" Foreground="White" FontSize="25" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<ComboBox x:Name="StartPoint" DisplayMemberPath="equipName" Height="50" Width="160" FontSize="25" SelectionChanged="StartPoint_SelectionChanged">
<ComboBox.ItemContainerStyle>
<Style TargetType="{x:Type ComboBoxItem}">
<Setter Property="IsEnabled" Value="{Binding IsEnabled}"/>
<Setter Property="Tag" Value="{Binding objid}"/>
</Style>
</ComboBox.ItemContainerStyle>
</ComboBox>
<TextBlock Text="终点:" Foreground="White" FontSize="25" Margin="50,0,0,0" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<ComboBox x:Name="EndPoint" DisplayMemberPath="equipName" Height="50" Width="160" FontSize="25" SelectionChanged="EndPoint_SelectionChanged" >
<ComboBox.ItemContainerStyle>
<Style TargetType="{x:Type ComboBoxItem}">
<Setter Property="IsEnabled" Value="{Binding IsEnabled}"/>
<Setter Property="Tag" Value="{Binding objid}"/>
</Style>
</ComboBox.ItemContainerStyle>
</ComboBox>
</StackPanel>
<StackPanel Orientation="Horizontal" Grid.Row="2" HorizontalAlignment="Center">
<Button x:Name="AddTaskBtn" Content="下发任务" FontSize="25" Width="160" Height="50" Foreground="White" Background="#2196F3" VerticalAlignment="Center" HorizontalAlignment="Center" Click="AddTaskBtn_Click"/>
<Button x:Name="CancelBtn" Content="取消" FontSize="25" Width="160" Height="50" Foreground="White" Background="#F44336" Click="CancelBtn_Click" VerticalAlignment="Center" HorizontalAlignment="Center" Margin="100,0,0,0"/>
</StackPanel>
</Grid>
</Window>

@ -0,0 +1,270 @@
using Khd.Core.Domain.Models;
using Khd.Core.EntityFramework;
using Khd.Core.Library.Mapper;
using Khd.Core.Plc;
using Khd.Core.Plc.S7;
using Khd.Core.Wpf.Form;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
namespace Khd.Core.Wpf.TaskForm
{
/// <summary>
/// AddTask.xaml 的交互逻辑
/// </summary>
public partial class AddTask : Window
{
private List<EquipMessage> startEquips = new List<EquipMessage>();
private List<EquipMessage> endEquips = new List<EquipMessage>();
private List<BaseEquip> baseEquips = new List<BaseEquip>();
private readonly IHost _host;
public AddTask(IHost host)
{
InitializeComponent();
_host = host;
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
var scope = _host.Services.CreateScope();
var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
baseEquips = dbContext.BaseEquip.ToList();
foreach (var equip in baseEquips)
{
if (equip.equipType == 15)//0空闲1占用2锁定
{
if (equip.ud1 == "1")
{
startEquips.Add(new EquipMessage
{
Id = equip.objid,
equipName = equip.equipName,
equipNo = equip.equipNo,
equipType = equip.equipType,
equipStatus = equip.equipStatus,
floorNo = equip.floorNo,
IsEnabled = equip.ud3 == "1"
});
}
if (equip.ud2 == "1")
{
endEquips.Add(new EquipMessage
{
Id = equip.objid,
equipName = equip.equipName,
equipNo = equip.equipNo,
equipType = equip.equipType,
equipStatus = equip.equipStatus,
floorNo = equip.floorNo,
IsEnabled = equip.ud3 == "0"
});
}
}
else
{
if (equip.ud1 == "1")
{
startEquips.Add(new EquipMessage
{
Id = equip.objid,
equipName = equip.equipName,
equipNo = equip.equipNo,
equipType = equip.equipType,
equipStatus = equip.equipStatus,
floorNo = equip.floorNo,
IsEnabled = true
});
}
if (equip.ud2 == "1")
{
endEquips.Add(new EquipMessage
{
Id = equip.objid,
equipName = equip.equipName,
equipNo = equip.equipNo,
equipType = equip.equipType,
equipStatus = equip.equipStatus,
floorNo = equip.floorNo,
IsEnabled = true
});
}
}
}
this.StartPoint.ItemsSource = startEquips;
this.EndPoint.ItemsSource = endEquips;
}
private void AddTaskBtn_Click(object sender, RoutedEventArgs e)
{
try
{
using var scope = _host.Services.CreateScope();
var dbContext = scope.ServiceProvider.GetRequiredService<DefaultDbContext>();
if (StartPoint.SelectedItem is EquipMessage startEquip && EndPoint.SelectedItem is EquipMessage endEquip)
{
if (startEquip.equipType == 1)
{
BasePlcpoint basePlcpoint = SystemData.BasePlcpoints.First(t => t.plcpointNo == $"RFID00{startEquip.floorNo}");
string? rfid = SystemData.PlcDic[0].ReadRFID(basePlcpoint.plcpointAddress);
if (!string.IsNullOrEmpty(rfid))
{
WcsTask? task = dbContext.WcsTask.FirstOrDefault(t => t.containerNo == rfid);
if (task == null)
{
if (endEquip.equipType == 1)//入库
{
BaseEquip baseEquip = baseEquips.First(t => t.equipType == 2);//提升机
WcsTask wcsTask = new()
{
objid = FormBoardT._jcSnowId.NextId(),
taskType = 99,
startPointId = startEquip.Id,
startPointNo = startEquip.equipNo,
currPointId = startEquip.Id,
currPointNo = startEquip.equipNo,
nextPointId = baseEquip.objid,
nextPointNo = baseEquip.equipNo,
endPointId = endEquip.Id,
endPointNo = endEquip.equipNo,
fromFloorNo = startEquip.floorNo,
floorNo = endEquip.floorNo,
taskStatus = -1,
createBy = "人工",
createTime = DateTime.Now,
equipmentNo = startEquip.equipNo,
useFlag = 1,
};
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
dbContext.Add(wcsTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
}
else if (endEquip.equipType == 15)//空托盘到三楼
{
BaseEquip baseEquip = baseEquips.First(t => t.equipType == 2);//提升机
WcsTask wcsTask = new()
{
objid = FormBoardT._jcSnowId.NextId(),
taskType = 97,
startPointId = startEquip.Id,
startPointNo = startEquip.equipNo,
currPointId = startEquip.Id,
currPointNo = startEquip.equipNo,
nextPointId = baseEquip.objid,
nextPointNo = baseEquip.equipNo,
endPointId = endEquip.Id,
endPointNo = endEquip.equipNo,
fromFloorNo = startEquip.floorNo,
floorNo = endEquip.floorNo,
taskStatus = -1,
createBy = "人工",
createTime = DateTime.Now,
equipmentNo = startEquip.equipNo,
useFlag = 1,
};
WcsTaskLog wcsTaskLog = CoreMapper.Map<WcsTaskLog>(wcsTask);
dbContext.Add(wcsTask);
dbContext.Add(wcsTaskLog);
dbContext.SaveChanges();
}
}
else
{
MessageBox.Show("该RFID的任务已经存在");
}
}
else
{
MessageBox.Show("未读取到RFID");
}
}
this.Close();
}
else
{
MessageBox.Show("请选择起点和终点");
}
}
catch (Exception ex)
{
if (ex is PlcException)
{
try
{
SystemData.PlcDic[0] = new Plc.S7.Plc(SystemData.PlcDic[0].CPU, SystemData.PlcDic[0].IP, SystemData.PlcDic[0].Port, SystemData.PlcDic[0].Rack, SystemData.PlcDic[0].Slot);
SystemData.PlcDic[0].Open();
AddTaskBtn_Click(AddTaskBtn, null);
}
catch
{
MessageBox.Show("PLC连接失败,无法读取任务");
}
}
}
}
private void CancelBtn_Click(object sender, RoutedEventArgs e)
{
this.Close();
}
private void EndPoint_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (StartPoint.SelectedItem is EquipMessage startEquip)
{
}
else
{
if (EndPoint.SelectedItem != null)
{
MessageBox.Show("请先选择起点");
EndPoint.SelectedItem = null;
}
}
}
private void StartPoint_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (StartPoint.SelectedItem is EquipMessage startEquip)
{
foreach (var item in endEquips)
{
if (item.Id == startEquip.Id)
{
item.IsEnabled = false;
}
else
{
item.IsEnabled = true;
}
}
EndPoint.ItemsSource = endEquips;
EndPoint.Items.Refresh();
}
else
{
EndPoint.SelectedItem = null;
MessageBox.Show("请先选择起点");
}
}
}
public class EquipMessage
{
public long? Id { get; set; }
public string equipName { get; set; }
public string equipNo { get; set; }
public int? equipType { get; set; }
public int? equipStatus { get; set; }
public int? floorNo { get; set; }
public bool IsEnabled { get; set; } = true;
}
}

@ -3,16 +3,35 @@
//mysql
//"DefaultConnection": "server=106.12.13.113;port=3306;database=khd_jyhb;uid=root;pwd=root;charset='utf8';persistsecurityinfo=True;SslMode=none;Allow User Variables=True"
//khd
"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"
},
"PlcConfig": {
"IP": "127.0.0.1",
"Port": "102",
"CpuType": 30,
"Rack": "0",
"Slot": "0"
//"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=localhost;port=3306;database=jyhb;uid=root;pwd=root;charset='utf8';persistsecurityinfo=True;SslMode=None;Allow User Variables=True"
},
"PlcConfigs": [
{
"IP": "192.168.2.30",
"Port": 102, //102
"CpuType": 40,
"Rack": 0,
"Slot": 1,
"Code": 0
},
//{
// "IP": "192.168.2.31",
// "Port": 102, //102
// "CpuType": 40,
// "Rack": 0,
// "Slot": 1,
// "Code": 1
//},
//{
// "IP": "192.168.2.220",
// "Port": 102, //102
// "CpuType": 40,
// "Rack": 0,
// "Slot": 1,
// "Code": 2
//}
],
"PLCSetting": {
"Mode": "0",
"EquipCode": "H61,H62,H63",

@ -0,0 +1,43 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
namespace Khd.Core.Wpf.myConverter
{
[ValueConversion(typeof(int), typeof(string))]
public class AgvTaskStatusConverter : IValueConverter
{
Dictionary<int,string> dic=new Dictionary<int, string>()
{
{-1,"人工创建" },
{0,"未下发" },
{1,"已下发" },
{2,"任务开始" },
{3,"已到起始地" },
{4,"起始地继续任务" },
{5,"已到目的地" },
{6,"任务结束" },
};
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
int val = System.Convert.ToInt32(value);
if(dic.TryGetValue(val, out string result))
{
return result;
}
else
{
return value;
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;
}
}
}

@ -0,0 +1,23 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
namespace Khd.Core.Wpf.myConverter
{
//public class CtuTaskStatusConverter : IValueConverter
//{
// public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
// {
// }
// public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
// {
// return value;
// }
//}
}

@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
namespace Khd.Core.Wpf.myConverter
{
public class EquipConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
string? val = System.Convert.ToString(value);
var baseEquip = SystemData.BaseEquip.FirstOrDefault(t => t.equipNo == val);
if (baseEquip == null)
{
return val;
}
else
{
return baseEquip.equipName;
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;
}
}
}

@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
namespace Khd.Core.Wpf.myConverter
{
public class HoisterTaskStatusConverter : IValueConverter
{
Dictionary<int, string> dic = new Dictionary<int, string>()
{
{-1,"人工任务,未开始" },
{0,"未下发" },
{1,"前往起始地" },
{2,"入库中" },
{3,"前往目的地" },
{4,"出库中" },
};
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}

@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
namespace Khd.Core.Wpf.myConverter
{
[ValueConversion(typeof(int), typeof(string))]
public class TypeDataConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
int val = System.Convert.ToInt32(value);
var baseDictionary = SystemData.BaseDictionary.FirstOrDefault(t => t.objid == val);
if (baseDictionary == null)
{
return "未知";
}
else
{
return baseDictionary.dicName;
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;
}
}
}
Loading…
Cancel
Save