using Autofac.Core; using Microsoft.AspNetCore.Components.Routing; using Microsoft.AspNetCore.Hosting; using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime; using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup; using OfficeOpenXml.FormulaParsing.Excel.Functions.Text; using Quartz; using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel.Design; using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Eventing.Reader; using System.Linq; using System.Net; using System.Reflection.Metadata; using System.Runtime.CompilerServices; using System.Text; using System.Threading.Tasks; using WIDESEA_Common.Log; using WIDESEAWCS_Common.TaskEnum; using WIDESEAWCS_Core; using WIDESEAWCS_Core.Enums; using WIDESEAWCS_DTO.Enum; using WIDESEAWCS_ISystemServices; using WIDESEAWCS_ITaskInfoRepository; using WIDESEAWCS_ITaskInfoService; using WIDESEAWCS_Model.Models; using WIDESEAWCS_Model.Models.System; using WIDESEAWCS_QuartzJob; using WIDESEAWCS_QuartzJob.DeviceBase; using WIDESEAWCS_QuartzJob.DTO; using WIDESEAWCS_QuartzJob.Models; using WIDESEAWCS_QuartzJob.Service; using WIDESEAWCS_QuartzJob.StackerCrane; using WIDESEAWCS_QuartzJob.StackerCrane.Enum; using WIDESEAWCS_TaskInfoService; using WIDESEAWCS_Tasks.ConveyorLineJob; using WIDESEAWCS_Tasks.StackerCraneJob; namespace WIDESEAWCS_Tasks { [DisallowConcurrentExecution] public class SpeStackerCraneJob : IJob { private readonly ITaskService _taskService; private readonly ITaskExecuteDetailService _taskExecuteDetailService; private readonly ITaskRepository _taskRepository; private readonly IRouterService _routerService; private readonly IAgvStationService _agvStationService; public SpeStackerCraneJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, ITaskRepository taskRepository, IRouterService routerService, IAgvStationService agvStationService) { _taskService = taskService; _taskExecuteDetailService = taskExecuteDetailService; _taskRepository = taskRepository; _routerService = routerService; _agvStationService = agvStationService; } public Task Execute(IJobExecutionContext context) { try { SpeStackerCrane speStackerCrane = (SpeStackerCrane)context.JobDetail.JobDataMap.Get("JobParams"); if (speStackerCrane != null) { GetStackerObject getStackerObject = new GetStackerObject(speStackerCrane); if (getStackerObject.RGVInitializationValue == RGVInitialize.Initialized) { //读取设备完成信息 if (getStackerObject.StaclerkJobJobStatusValue == RGV_Rgvtaskstutas.Completed || getStackerObject.StaclerkJobJobStatusValue == RGV_Rgvtaskstutas.AbnormalCompletion) { CommonStackerCrane_AGVTaskCompletedEventHandler(getStackerObject, speStackerCrane); } //判断当前设备是入库还是出库 /*if (GetDeviceAddress.OutbounMotherChildCartbool(speStackerCrane.DeviceCode)) { //判断当前安全门是否为绿色灯 if (GetDeviceAddress.ReadAqmDecicStice(1)) { return null; } } else { //判断入库端安全门是否正常 if (GetDeviceAddress.ReadAqmDecicStice(2)) { return null; } }*/ if (getStackerObject.RgvCraneAutoStatusValue == RgvCraneAutoStatus.Automatic && getStackerObject.StaclerkJobJobStatusValue == RGV_Rgvtaskstutas.Ready && getStackerObject.RgvCraneWorkStatusValue == RGVStepprocess.NoAction) { //查找RGV进行下发任务 Dt_Task task = GetTask(speStackerCrane.DeviceCode, getStackerObject); if (task != null) { //调取写入RGV小车任务 RgvCraneTaskCommand? stackerCraneTaskCommand = ConvertToStackerCraneTaskCommand(task); if (stackerCraneTaskCommand != null) { bool sendFlag = getStackerObject.SendCommand(stackerCraneTaskCommand); if (sendFlag) { //修改任务状态 _taskService.UpdateTaskStatusToNext(task); } } } else { if (GetDeviceAddress.OutbounMotherChildCartbool(speStackerCrane.DeviceCode)) { //当没任务的时候,则进行移动 Returnposition(speStackerCrane.DeviceCode, getStackerObject.RGVCurrentlocation, (int)getStackerObject.RgvCraneStatusValue); } else if (GetDeviceAddress.OutbounMotherChildCartbool2(speStackerCrane.DeviceCode)) { InReturnposition(speStackerCrane.DeviceCode, getStackerObject.RGVCurrentlocation, (int)getStackerObject.RgvCraneStatusValue); } } } } } } catch (Exception ex) { //Console.WriteLine(nameof(CommonStackerCraneJob) + ":" + ex.ToString()); } return Task.CompletedTask; } #region 任务完成 private void CommonStackerCrane_AGVTaskCompletedEventHandler(GetStackerObject getStackerObject, SpeStackerCrane speStackerCrane) { if (getStackerObject.StaclerkJobJobStatusValue == RGV_Rgvtaskstutas.Completed && getStackerObject.CurrentRgvtaskid == 30001) { speStackerCrane.SetValue(RGV_taskcoDBName.RGV_taskcomplete, 1); speStackerCrane.SetValue(RGV_taskcoDBName.RGV_taskcomplete, 0); } else if (getStackerObject.StaclerkJobJobStatusValue == RGV_Rgvtaskstutas.Completed && getStackerObject.CurrentRgvtaskid != 0 && getStackerObject.CurrentRgvtaskid != 30001) { _taskService.UpdateTaskStatus(getStackerObject.CurrentRgvtaskid); //正常任务完成 speStackerCrane.SetValue(RGV_taskcoDBName.RGV_taskcomplete, 1); speStackerCrane.SetValue(RGV_taskcoDBName.RGV_taskcomplete, 0); } else if (getStackerObject.StaclerkJobJobStatusValue == RGV_Rgvtaskstutas.AbnormalCompletion && getStackerObject.CurrentRgvtaskid != 0 && getStackerObject.CurrentRgvtaskid != 30001) { //修改任务状态为异常完成 _taskService.HandleInAbnormal(getStackerObject.CurrentRgvtaskid); //写入异常完成报警信息 speStackerCrane.Communicator.Write("DB101.36", 1); //写入报警 } } #endregion private Dt_Task? GetTask(string DeviceCode, GetStackerObject getStackerObject) { // 根据设备名称,获取到设备相关数据 AGVStation RGVTaskdevice = _agvStationService.Corridorequipment(DeviceCode); //根据设备获取到内容 return RGVTaskdevice.Station_tasktype switch { (int)RGVTasktype.Inbound => HandleInboundTask(RGVTaskdevice, getStackerObject), (int)RGVTasktype.Outbound => OutboundEquipmentTask(RGVTaskdevice, getStackerObject), //出库 _ => null }; } #region 入库方法 private Dt_Task? HandleInboundTask(AGVStation RGVTaskdevice, GetStackerObject getStackerObject) { return (RGVTaskdevice.Station_material, getStackerObject.RgvCraneStatusValue) switch { ((int)RGVEquipment.InRGVForklift, RgvEquipmentStatus.NoCargo) //叉车式RGV无货,下发取货任务 => _taskService.PickupWarehouse(RGVTaskdevice.ChildPosiDeviceCode), ((int)RGVEquipment.InRGVForklift, RgvEquipmentStatus.HasCargo) => ForkliftUnloading(RGVTaskdevice), //叉车式进行放货(已完成) ((int)RGVEquipment.Corridorcar, RgvEquipmentStatus.NoCargo) => ZichePickUpAisle(RGVTaskdevice, getStackerObject), //过道子车进行取货(已完成) ((int)RGVEquipment.Corridorcar, RgvEquipmentStatus.HasCargo) => GoodsPlacedCorridor(RGVTaskdevice), //子车放货任务(已完成) ((int)RGVEquipment.Mothertrailer, RgvEquipmentStatus.HasCargo) => MotherVehicleMovement(RGVTaskdevice), //母车移动(已完成) _ => null }; } #region 叉车式进行放货(已完成) public Dt_Task? ForkliftUnloading(AGVStation RGVTaskdevice) { Dt_Task dt_Task = _taskService.GetInkouFinhuoTask(RGVTaskdevice.ChildPosiDeviceCode); //判断HCJ是否有货 if (GetDeviceAddress.HCJIsstock(dt_Task.NextAddress)) { //判断子车是否在接驳台下 var zichestation = _agvStationService.OutGetZicheDeepHCJ(1061); int ziche = GetDeviceAddress.GetEquipmentlocation(zichestation.ChildPosiDeviceCode); if ((ziche == zichestation.WaitmomentOne || ziche == zichestation.WaitmomentTwo || ziche == zichestation.MotherCarDeviceCode || ziche == zichestation.MotherCardeputy || ziche == zichestation.HCJStorageaddress) && ziche != 1021) { //获取这个接驳台是否有取货任务 Dt_Task zitask = _taskService.ViceChariotPickupTask2(RGVTaskdevice.ChildPosiDeviceCode); if (zitask == null) { return dt_Task; } } } return null; } #endregion #region 过道子车进行取货(已完成) public Dt_Task? ZichePickUpAisle(AGVStation RGVTaskdevice, GetStackerObject getStackerObject) { //获取子车取货任务 Dt_Task dt_Task = _taskService.ViceChariotPickupTask(RGVTaskdevice.ChildPosiDeviceCode); if (dt_Task == null) return null; if (RGVTaskdevice.Station_Area == 6) //外侧进取货,则需要判断子车当前位置 { if (getStackerObject.RGVCurrentlocation == RGVTaskdevice.WaitmomentOne) { //还需要判断入库口叉车是否收回叉车了 //在等待点1,则需要判断1号母车在堆垛机取货口 var mu1rgv = _agvStationService.GetMothervehicle(RGVTaskdevice.MotherCarDeviceCode); int mu1 = GetDeviceAddress.GetEquipmentlocation(mu1rgv.ChildPosiDeviceCode); //此时的RGV应该无货 bool ywh = GetDeviceAddress.Mucheywhaddres(mu1rgv.ChildPosiDeviceCode); if (mu1 == mu1rgv.Motherinlaw || (ywh && mu1 == mu1rgv.ZicheMotherinlaw)) //在堆垛机取货口 { //=============================新增当去取货时进行判断巷道,看能不能提前拉出母车 if (int.Parse(dt_Task.TargetAddress) == (int)StorageAisleEnum.LaneTwo) { int taraddress = int.Parse(dt_Task.TargetAddress); var InMotherVehicle = _agvStationService.ObtainCcordingTunnel(taraddress); //获取到需要入库的母车(2巷道) int mu2 = GetDeviceAddress.GetEquipmentlocation(InMotherVehicle.ChildPosiDeviceCode); //此时的RGV应该无货 if (GetDeviceAddress.Mucheywhaddres(InMotherVehicle.ChildPosiDeviceCode)) //判断无货 { if (mu2 == InMotherVehicle.ZicheMotherinlaw) { return dt_Task; } else if (mu2 == InMotherVehicle.Motherinlaw) { RGVMovetask(InMotherVehicle.ZicheMotherinlaw, InMotherVehicle.ChildPosiDeviceCode); } } } //=============================新增当去取货时进行判断巷道,看能不能提前拉出母车 return dt_Task; } //去掉原因:在该出子车去取货,可直接穿过无货母车,拖车 /*else { Dt_Task task = _taskService.MothermachinemovementTask2(RGVTaskdevice.ChildPosiDeviceCode); if (task == null) { RGVMovetask(mu1rgv.Motherinlaw, mu1rgv.ChildPosiDeviceCode); } }*/ } else if (getStackerObject.RGVCurrentlocation == RGVTaskdevice.WaitmomentTwo) //则需要判断两个母车的位子 { //判断两个子车是否在堆垛机取货口 //母车1 var mu1rgv = _agvStationService.GetMothervehicle(RGVTaskdevice.MotherCarDeviceCode); int mu1 = GetDeviceAddress.GetEquipmentlocation(mu1rgv.ChildPosiDeviceCode); //此时的RGV应该无货 bool m1Isitstock1 = GetDeviceAddress.Mucheywhaddres(mu1rgv.ChildPosiDeviceCode); var mu2rgv = _agvStationService.GetMothervehicle(RGVTaskdevice.MotherCardeputy); int mu2 = GetDeviceAddress.GetEquipmentlocation(mu2rgv.ChildPosiDeviceCode); //此时的RGV应该无货 bool m1Isitstock2 = GetDeviceAddress.Mucheywhaddres(mu2rgv.ChildPosiDeviceCode); // 提取可读性变量 bool mu1AtHome = mu1 == mu1rgv.Motherinlaw; bool mu2AtHome = mu2 == mu2rgv.Motherinlaw; bool mu1Ready = mu1 == mu1rgv.ZicheMotherinlaw && m1Isitstock1; bool mu2Ready = mu2 == mu2rgv.ZicheMotherinlaw && m1Isitstock2; // 合并所有满足条件的情况 if ((mu1AtHome && mu2AtHome) || // 都在初始位置 (mu1Ready && mu2Ready) || // 都在就绪位置且无货 (mu1AtHome && mu2Ready) || // 1在初始位置,2就绪 (mu1Ready && mu2AtHome)) // 1就绪,2在初始位置 { return dt_Task; } /*else { //无需把母车移动至取货台,无货状态的子车无需踩托盘过去去取货 if (mu1 != mu1rgv.Motherinlaw) { Dt_Task task = _taskService.MothermachinemovementTask2(mu1rgv.ChildPosiDeviceCode); if (task == null) { RGVMovetask(mu1rgv.Motherinlaw, mu1rgv.ChildPosiDeviceCode); } } if (mu2 != mu2rgv.Motherinlaw) { Dt_Task task2 = _taskService.MothermachinemovementTask2(mu2rgv.ChildPosiDeviceCode); if (task2 == null) { RGVMovetask(mu2rgv.Motherinlaw, mu2rgv.ChildPosiDeviceCode); } } }*/ } } else if (RGVTaskdevice.Station_Area == 5) { if (getStackerObject.RGVCurrentlocation == RGVTaskdevice.WaitmomentOne) { //需要判断外侧小车是否在HCJ上 var zichestation = _agvStationService.OutGetZicheDeepHCJ(RGVTaskdevice.HCJStorageaddress); int waiziche = GetDeviceAddress.GetEquipmentlocation(zichestation.ChildPosiDeviceCode); if ((waiziche == zichestation.WaitmomentOne || waiziche == zichestation.WaitmomentTwo || waiziche == zichestation.MotherCardeputy || waiziche == zichestation.MotherCarDeviceCode || waiziche == 1021) && waiziche != zichestation.HCJStorageaddress) { return dt_Task; } } else if (getStackerObject.RGVCurrentlocation == RGVTaskdevice.WaitmomentTwo) //需要判断3巷道母车是否在取货站台 { //判断子车是否在HCJ站台 var zichestation = _agvStationService.OutGetZicheDeepHCJ(RGVTaskdevice.HCJStorageaddress); int waiziche = GetDeviceAddress.GetEquipmentlocation(zichestation.ChildPosiDeviceCode); if ((waiziche == zichestation.WaitmomentOne || waiziche == zichestation.WaitmomentTwo || waiziche == zichestation.MotherCardeputy || waiziche == zichestation.MotherCarDeviceCode || waiziche == 1021) && waiziche != zichestation.HCJStorageaddress) { //母车1 var mu1rgv = _agvStationService.GetMothervehicle(RGVTaskdevice.MotherCarDeviceCode); int mu1 = GetDeviceAddress.GetEquipmentInformation(mu1rgv.ChildPosiDeviceCode); //此时的RGV应该无货 if (mu1 == mu1rgv.Motherinlaw) { return dt_Task; } else { Dt_Task task = _taskService.MothermachinemovementTask2(mu1rgv.ChildPosiDeviceCode); if (task == null) { RGVMovetask(mu1rgv.Motherinlaw, mu1rgv.ChildPosiDeviceCode); } } } } } return null; } /// /// 判断外侧母车是否在入口口 /// /// /// /// private Dt_Task? HandleMedialCase(Dt_Task task, int currentStation) { AGVStation Muche = _agvStationService.GetMothervehicle(currentStation); int motherCarAddress = GetDeviceAddress.GetEquipmentlocation(Muche.ChildPosiDeviceCode); if (motherCarAddress == Muche.Motherinlaw) return task; RGVMovetask(Muche.Motherinlaw, Muche.ChildPosiDeviceCode); return null; } /// /// 判断内外侧母车是否在入库口 /// /// /// /// private Dt_Task? HandleMedialCase2(Dt_Task task, AGVStation currentStation) { AGVStation Muche = _agvStationService.GetMothervehicle(currentStation.MotherCarDeviceCode); //外侧母车 AGVStation Muche2 = _agvStationService.GetMothervehicle(currentStation.MotherCardeputy); //内侧母车 int motherCarAddress = GetDeviceAddress.GetEquipmentlocation(Muche.ChildPosiDeviceCode); int motherCarAddress2 = GetDeviceAddress.GetEquipmentlocation(Muche2.ChildPosiDeviceCode); if (motherCarAddress == 0 || motherCarAddress2 == 0) return null; // 如果母车不在预期位置,下发移动任务 if (motherCarAddress != Muche.Motherinlaw) { RGVMovetask(Muche.Motherinlaw, Muche.ChildPosiDeviceCode); } if (motherCarAddress2 != Muche2.Motherinlaw) { RGVMovetask(Muche2.Motherinlaw, Muche2.ChildPosiDeviceCode); } if (motherCarAddress == Muche.Motherinlaw && motherCarAddress2 == Muche2.Motherinlaw) return task; // 母车已在正确位置 return null; } #endregion #region 过道子车进行放货 public Dt_Task? GoodsPlacedCorridor(AGVStation RGVTaskdevice) { Dt_Task task = _taskService.ViceChariotPlacingTask(RGVTaskdevice.ChildPosiDeviceCode); //获取到放货任务 if (task == null) return null; int nexaddres = int.Parse(task.NextAddress); //判断是放货在哪的任务 switch (nexaddres) { case int Whcjaddress when Whcjaddress == RGVTaskdevice.MotherCarDeviceCode: //放货点在第一个过道点(已完成) return MotherCarMoves(task, RGVTaskdevice); case int Waddress when Waddress == RGVTaskdevice.MotherCardeputy: //放货点在第二个过道点(已完成) return MotherCarMovesinside(task, RGVTaskdevice); case int HCJaddress when HCJaddress == RGVTaskdevice.HCJStorageaddress: //放货点在HCJ上(已完成) return HCJMotherCarMovesinside(task, RGVTaskdevice); default: return null; } } //区域一判断母车是否到位,可立即放货 private Dt_Task? MotherCarMoves(Dt_Task _Task, AGVStation aGVStation) { AGVStation Muche = _agvStationService.GetMothervehicle(aGVStation.MotherCarDeviceCode); Dt_Task task = _taskService.MothermachinemovementTask2(Muche.ChildPosiDeviceCode); //获取到母车移动任务 if (task == null) { GetStackerObject getStackerObject = GetDeviceAddress.GetChildDeviceCode(Muche.ChildPosiDeviceCode); if (getStackerObject.RgvCraneStatusValue == RgvEquipmentStatus.NoCargo) //判断母车是否有货 { if (getStackerObject.RGVCurrentlocation == Muche.ZicheMotherinlaw) //判断母车是否在过道点, { return _Task; } else { //判断母车是否有任务 Dt_Task _Task1 = _taskService.MothermacTask(Muche.ChildPosiDeviceCode); if (task == null) { RGVMovetask(Muche.ZicheMotherinlaw, Muche.ChildPosiDeviceCode); //如果没有任务,则可以进行移动出来 } } } } return null; } /// /// 判断放第二个母车位置 /// /// /// /// private Dt_Task? MotherCarMovesinside(Dt_Task _Task, AGVStation aGVStation) { //判断外侧母车是否需要移动至堆垛机取货口 AGVStation Muche = _agvStationService.GetMothervehicle(aGVStation.MotherCarDeviceCode); int muche1objet = GetDeviceAddress.GetEquipmentlocation(Muche.ChildPosiDeviceCode); //判断内侧母车是否在放货点 AGVStation Muche2 = _agvStationService.GetMothervehicle(aGVStation.MotherCardeputy); //内侧母车 int muche2objet = GetDeviceAddress.GetEquipmentlocation(Muche2.ChildPosiDeviceCode); bool NoCargobool = GetDeviceAddress.Mucheywhaddres(Muche2.ChildPosiDeviceCode); //正常情况下,把信息反馈出去 if (muche1objet == Muche.Motherinlaw && muche2objet == Muche2.ZicheMotherinlaw && NoCargobool) { return _Task; } //母车1不在取货口 if (muche1objet != Muche.Motherinlaw) //判断母车是否在过道点, { Dt_Task task = _taskService.MothermachinemovementTask2(Muche.ChildPosiDeviceCode); //获取到母车移动任务 if (task == null) { RGVMovetask(Muche.Motherinlaw, Muche.ChildPosiDeviceCode); //如果没有任务,则可以进行移动出来 } } //母车2不在过道站点 if (muche2objet != Muche2.ZicheMotherinlaw) //判断母车是否在过道点, { Dt_Task task = _taskService.MothermachinemovementTask2(Muche2.ChildPosiDeviceCode); //获取到母车移动任务 if (task == null) { Dt_Task _Task1 = _taskService.MothermacTask(Muche.ChildPosiDeviceCode); if (task == null) { RGVMovetask(Muche2.ZicheMotherinlaw, Muche2.ChildPosiDeviceCode); //如果没有任务,则可以进行移动出来 } } } return null; } /// /// 判断放在HCJ上面 /// /// /// /// private Dt_Task? HCJMotherCarMovesinside(Dt_Task _Task, AGVStation aGVStation) { //先判断HCJ站台点是否有货,有任务 if (GetDeviceAddress.HCJIsstock(_Task.NextAddress)) { //判断内车子车是否在等待点 AGVStation neiziche = _agvStationService.GetZicheDeep(aGVStation.HCJStorageaddress); //内侧子车 int neizichecurraddres = GetDeviceAddress.GetEquipmentlocation(neiziche.ChildPosiDeviceCode); Dt_Task task = _taskService.ViceChariotPickupTask2(neiziche.ChildPosiDeviceCode); //获取到内侧子车取货任务 if ((neizichecurraddres != neiziche.WaitmomentOne && neizichecurraddres != neiziche.WaitmomentTwo) || task != null) //内侧子车不在两个缓存点 { return null; } AGVStation Muche = _agvStationService.GetMothervehicle(aGVStation.MotherCarDeviceCode); //外侧母车 int mucheaddre1 = GetDeviceAddress.GetEquipmentlocation(Muche.ChildPosiDeviceCode); AGVStation Muche2 = _agvStationService.GetMothervehicle(aGVStation.MotherCardeputy); //内侧母车 int mucheaddre2 = GetDeviceAddress.GetEquipmentlocation(Muche2.ChildPosiDeviceCode); if ((neizichecurraddres == neiziche.WaitmomentOne || neizichecurraddres == neiziche.WaitmomentTwo) && task == null && neizichecurraddres != neiziche.HCJStorageaddress && mucheaddre1 == Muche.Motherinlaw && mucheaddre2 == Muche2.Motherinlaw) { return _Task; } //判断两个母车位置 if (mucheaddre1 != Muche.Motherinlaw) //判断母车是否在过道点, { Dt_Task muche1task = _taskService.MothermachinemovementTask2(Muche.ChildPosiDeviceCode); //获取到母车移动任务 if (muche1task == null) { RGVMovetask(Muche.Motherinlaw, Muche.ChildPosiDeviceCode); //如果没有任务,则可以进行移动出来 } } if (mucheaddre2 != Muche2.Motherinlaw) //判断母车是否在过道点, { Dt_Task muche2task = _taskService.MothermachinemovementTask2(Muche2.ChildPosiDeviceCode); //获取到母车移动任务 if (muche2task == null) { RGVMovetask(Muche2.Motherinlaw, Muche2.ChildPosiDeviceCode); //如果没有任务,则可以进行移动出来 } } } return null; } #endregion #region 母车移动任务 public Dt_Task? MotherVehicleMovement(AGVStation RGVTaskdevice) { Dt_Task task = _taskService.MothermachinemovementTask(RGVTaskdevice.ChildPosiDeviceCode); if (task == null) return null; AGVStation GdZiche = _agvStationService.GetMotheaisle(RGVTaskdevice.ZicheMotherinlaw); int motherCarAddress = GetDeviceAddress.GetEquipmentlocation(GdZiche.ChildPosiDeviceCode); if (GdZiche.WaitmomentOne == motherCarAddress || GdZiche.WaitmomentTwo == motherCarAddress) { return task; } return null; } #endregion #endregion #region 出库方法(可进行测试) public Dt_Task? OutboundEquipmentTask(AGVStation RGVTaskdevice, GetStackerObject getStackerObject) { return (RGVTaskdevice.Station_material, getStackerObject.RgvCraneStatusValue) switch { ((int)RGVEquipment.Mothertrailer, RgvEquipmentStatus.HasCargo) //下发母车出来到过道上 => Mothertaskdistribution(RGVTaskdevice),//已完成 ((int)RGVEquipment.Corridorcar, RgvEquipmentStatus.NoCargo) //查找子车出来取货 => ChildPickupAddres(RGVTaskdevice, getStackerObject.RGVCurrentlocation), //已完成 ((int)RGVEquipment.Corridorcar, RgvEquipmentStatus.HasCargo) => Findshippingtask(RGVTaskdevice, getStackerObject.RGVCurrentlocation), //子车取货后,进行放货(已完成) ((int)RGVEquipment.OutRGVForklift, RgvEquipmentStatus.NoCargo) => OutboundGateVehicle(RGVTaskdevice), //出库口RGV取货(已完成) ((int)RGVEquipment.OutRGVForklift, RgvEquipmentStatus.HasCargo) => _taskService.GetOutkouFinhuoTask(RGVTaskdevice.ChildPosiDeviceCode, RGVTaskdevice.HCJStorageaddress.ToString()), _ => null }; } #region 下发母车任务,需要判断当前行小车在哪个位子(已完成) private Dt_Task? Mothertaskdistribution(AGVStation GdZiche) { // 提前检查无效的Area值 if (GdZiche.Station_Area < 1 || GdZiche.Station_Area > 4) return null; //根据母车地址,获取当前行道的子车 AGVStation ZicheinnerSide = _agvStationService.GetMotheaisle(GdZiche.ZicheMotherinlaw); int zichecurraddre = GetDeviceAddress.GetEquipmentlocation(ZicheinnerSide.ChildPosiDeviceCode); //获取到子车实例 if (zichecurraddre != ZicheinnerSide.WaitmomentOne && zichecurraddre != ZicheinnerSide.WaitmomentTwo) return null; //判断是哪个巷道的母车 return GdZiche.Station_Area switch { 4 => OutboundSideAisle4(zichecurraddre, ZicheinnerSide), //在4巷道进行出库的任务(已完成) 3 => OutboundSideAisle3(zichecurraddre, ZicheinnerSide), //在3巷道进行出库的任务(已完成) 2 => OutboundSideAisle2(ZicheinnerSide), //在二巷道进行出库的任务(已完成) 1 => _taskService.ObtainMuChetask(GdZiche.ZicheMotherinlaw.ToString()), //根据母车子地址,查找是否有需要移动的任务(已完成) _ => null }; } public Dt_Task? OutboundSideAisle1(AGVStation ZicheinnerSide) { //获取1巷道母车是否有任务 Dt_Task Muche1Task = _taskService.ObtainMuChetask(ZicheinnerSide.MotherCarDeviceCode.ToString()); if (Muche1Task == null) return null; Dt_Task zicheTASK = _taskService.GetChariotTaskBool(ZicheinnerSide.ChildPosiDeviceCode); if (zicheTASK != null) return null; return Muche1Task; } public Dt_Task? OutboundSideAisle2(AGVStation ZicheinnerSide) { //获取2巷道母车是否有任务 Dt_Task Muche2Task = _taskService.ObtainMuChetask(ZicheinnerSide.MotherCardeputy.ToString()); if (Muche2Task == null) return null; //获取子车是否有任务 Dt_Task zicheTASK = _taskService.GetChariotTaskBool(ZicheinnerSide.ChildPosiDeviceCode); if (zicheTASK != null) return null; //获取2巷道子车是否有任务 var muche1 = _agvStationService.GetMothervehicle(ZicheinnerSide.MotherCarDeviceCode); Dt_Task Muche1 = _taskService.GetChariotTaskBool(muche1.ChildPosiDeviceCode.ToString()); if(Muche1!=null) return null; return Muche2Task; } public Dt_Task? OutboundSideAisle3(int curraddZiChe, AGVStation ZicheinnerSide) { //获取3巷道母车是否有任务 Dt_Task Muche3Task = _taskService.ObtainMuChetask(ZicheinnerSide.MotherCarDeviceCode.ToString()); if (Muche3Task == null) return null; //判断子车是否有要取HCJ任务 Dt_Task zicheTASK = _taskService.GetHCJTaskBool(ZicheinnerSide.ChildPosiDeviceCode, ZicheinnerSide.HCJStorageaddress); if (zicheTASK != null) return null; return Muche3Task; } public Dt_Task? OutboundSideAisle4(int curraddZiChe, AGVStation ZicheinnerSide) { //获取当前母车是否有任务 Dt_Task Muche4Task = _taskService.ObtainMuChetask(ZicheinnerSide.MotherCardeputy.ToString()); if (Muche4Task == null) return null; //判断是否有需要取HCJ的任务 Dt_Task zicheTASK = _taskService.GetChariotTaskBool(ZicheinnerSide.ChildPosiDeviceCode); if (zicheTASK != null) return null; //判断3巷道是否有出库的任务 var muche3 = _agvStationService.GetMothervehicle(ZicheinnerSide.MotherCarDeviceCode); Dt_Task muchetask = _taskService.OutMothermaTask(muche3.ChildPosiDeviceCode); if (muchetask != null) return null; return Muche4Task; } #endregion #region 判断已移动出来的母车,再判断小车位置(已完成) public Dt_Task? ChildPickupAddres(AGVStation GdZiche, int curraderr) { if (curraderr == GdZiche.WaitmomentOne || curraderr == GdZiche.WaitmomentTwo) { Dt_Task dtTasks = _taskService.ChildVehicleMission(GdZiche); if (dtTasks == null) return null; if (GdZiche.Station_Area == 5) { if (dtTasks.CurrentAddress == GdZiche.MotherCardeputy.ToString()) //取货的点在2巷道,则子车无论在哪个等待点,都可以取货 { return dtTasks; } else if (dtTasks.CurrentAddress == GdZiche.MotherCarDeviceCode.ToString()) //取1巷道的货 { if (curraderr == GdZiche.WaitmomentOne) //子车刚好在旁边,可立马取货 { return dtTasks; } else if (curraderr == GdZiche.WaitmomentTwo) { var muchestation = _agvStationService.GetMothervehicle(GdZiche.MotherCardeputy); int muche2addres = GetDeviceAddress.GetEquipmentlocation(muchestation.ChildPosiDeviceCode); //获取2巷道母车实例 if (muche2addres == muchestation.Motherinlaw) { return dtTasks; } } } } else if (GdZiche.Station_Area == 6) { //HCJ站台没任务 if (dtTasks.CurrentAddress == GdZiche.MotherCardeputy.ToString()) //优先判断是否是最外面的任务 { if (curraderr == GdZiche.WaitmomentTwo) { return dtTasks; } else { var muchestation = _agvStationService.GetMothervehicle(GdZiche.MotherCarDeviceCode); int muche3x = GetDeviceAddress.GetEquipmentlocation(muchestation.ChildPosiDeviceCode); if (muche3x == muchestation.Motherinlaw) { return dtTasks; } } } else if (dtTasks.CurrentAddress == GdZiche.MotherCarDeviceCode.ToString()) //该任务为取3巷道 { if (curraderr == GdZiche.WaitmomentOne) { return dtTasks; } else if(curraderr == GdZiche.WaitmomentTwo) { var muchestation = _agvStationService.GetMothervehicle(GdZiche.MotherCardeputy); int muche4x = GetDeviceAddress.GetEquipmentlocation(muchestation.ChildPosiDeviceCode); if (muche4x == muchestation.Motherinlaw) { return dtTasks; } } } else if (dtTasks.CurrentAddress == GdZiche.HCJStorageaddress.ToString()) { //判断内侧子车的位置 AGVStation neiziche = _agvStationService.GetOutZicheDeep(GdZiche.HCJStorageaddress); //内侧子车 int neizichecurraddres = GetDeviceAddress.GetEquipmentlocation(neiziche.ChildPosiDeviceCode); if ((neiziche.WaitmomentOne == neizichecurraddres || neiziche.WaitmomentTwo == neizichecurraddres || neiziche.MotherCarDeviceCode == neizichecurraddres || neiziche.MotherCardeputy == neizichecurraddres) && neiziche.HCJStorageaddress != neizichecurraddres) { if (curraderr == GdZiche.WaitmomentTwo) { var mu1rgv = _agvStationService.GetMothervehicle(GdZiche.MotherCarDeviceCode); int mu1 = GetDeviceAddress.GetEquipmentlocation(mu1rgv.ChildPosiDeviceCode); var mu2rgv = _agvStationService.GetMothervehicle(GdZiche.MotherCardeputy); int mu2 = GetDeviceAddress.GetEquipmentlocation(mu2rgv.ChildPosiDeviceCode); if (mu1 == mu1rgv.Motherinlaw && mu2 == mu2rgv.Motherinlaw) { return dtTasks; } } else if (curraderr == GdZiche.WaitmomentOne) { return dtTasks; } } } } } return null; } #endregion #region 查找子车放货任务(已完成) public Dt_Task? Findshippingtask(AGVStation GdZiche, int curraderr) { Dt_Task task = _taskService.GetFinhuoTask(GdZiche.ChildPosiDeviceCode); if (task == null) return null; if (GetDeviceAddress.HCJIsstock(task.NextAddress)) { if (GdZiche.Station_Area == 5) { //需要判断外侧小车是否在HCJ上 var zichestation = _agvStationService.OutGetZicheDeepHCJ(GdZiche.HCJStorageaddress); int waiziche = GetDeviceAddress.GetEquipmentlocation(zichestation.ChildPosiDeviceCode); if ((waiziche == zichestation.WaitmomentOne || waiziche == zichestation.WaitmomentTwo || waiziche == zichestation.MotherCardeputy || waiziche == zichestation.MotherCarDeviceCode) && waiziche != zichestation.HCJStorageaddress) { //判断当前位置 if (task.CurrentAddress == GdZiche.MotherCarDeviceCode.ToString()) { var muchestation = _agvStationService.GetMothervehicle(GdZiche.MotherCardeputy); int muche2 = GetDeviceAddress.GetEquipmentlocation(muchestation.ChildPosiDeviceCode); if (muche2 == muchestation.Motherinlaw) { return task; } } else if (task.CurrentAddress == GdZiche.MotherCardeputy.ToString()) { return task; } } } else if (GdZiche.Station_Area == 6) { if (GdZiche.HCJStorageaddress == curraderr) { //判断3巷道母车 var muchestation = _agvStationService.GetMothervehicle(GdZiche.MotherCarDeviceCode); int mucboject3 = GetDeviceAddress.GetEquipmentlocation(muchestation.ChildPosiDeviceCode); if (mucboject3 == muchestation.Motherinlaw) { //判断4巷道母车 var muchestation2 = _agvStationService.GetMothervehicle(GdZiche.MotherCardeputy); int mucboject4 = GetDeviceAddress.GetEquipmentlocation(muchestation2.ChildPosiDeviceCode); if (mucboject4 == muchestation2.Motherinlaw) { return task; } } } else if (GdZiche.MotherCarDeviceCode == curraderr) { //判断4巷道母车 var muchestation2 = _agvStationService.GetMothervehicle(GdZiche.MotherCardeputy); int mucboject4 = GetDeviceAddress.GetEquipmentlocation(muchestation2.ChildPosiDeviceCode); if (mucboject4 == muchestation2.Motherinlaw) { return task; } } else if (GdZiche.MotherCardeputy == curraderr) return task; } } return null; } #endregion #region 出库口子车取货(已完成) public Dt_Task OutboundGateVehicle(AGVStation GdZiche) { //需要判断子车是否在HCJ上 var zichestation = _agvStationService.OutGetZicheDeepHCJ(1131); int ziche = GetDeviceAddress.GetEquipmentlocation(zichestation.ChildPosiDeviceCode); if (ziche != GdZiche.HCJStorageaddress && (ziche == zichestation.HCJStorageaddress || ziche == zichestation.WaitmomentOne || ziche == zichestation.WaitmomentTwo || ziche == zichestation.MotherCardeputy || ziche == zichestation.MotherCarDeviceCode)) { return _taskService.GetOutchachekouFinhuoTask(GdZiche.ChildPosiDeviceCode, GdZiche.HCJStorageaddress.ToString()); } return null; } #endregion #endregion #region 出库小车移动任务下发(已完成) public void Returnposition(string DeviceCode, int RGVCurrentlocation, int RgvCraneStatusValue) { AGVStation GdZiche = _agvStationService.Corridorequipment(DeviceCode); if (GdZiche.Station_material == (int)RGVEquipment.Mothertrailer) { if (GdZiche.Motherinlaw == RGVCurrentlocation) return; if (RgvCraneStatusValue == (int)RgvEquipmentStatus.HasCargo) return; //母亲回堆垛机口任务,判断子车的位置是否在母车上 var zichestation = _agvStationService.GetMotheaisle(GdZiche.ZicheMotherinlaw); //获取子车是否有任务来该位置取货 Dt_Task Muche2Task = _taskService.OutPickupZiche(zichestation.ChildPosiDeviceCode.ToString()); if (Muche2Task != null) return; GetStackerObject getStackerObject = GetDeviceAddress.GetChildDeviceCode(zichestation.ChildPosiDeviceCode); if (getStackerObject.StaclerkJobJobStatusValue != RGV_Rgvtaskstutas.Executing && getStackerObject.RgvCraneAutoStatusValue == RgvCraneAutoStatus.Automatic && (getStackerObject.RGVCurrentlocation == zichestation.WaitmomentOne || getStackerObject.RGVCurrentlocation == zichestation.WaitmomentTwo || getStackerObject.RGVCurrentlocation==1171) && getStackerObject.RGVCurrentlocation != zichestation.ZicheMotherinlaw) { RGVMovetask(GdZiche.Motherinlaw, GdZiche.ChildPosiDeviceCode); } } else if (GdZiche.Station_material == (int)RGVEquipment.Corridorcar) { if (RgvCraneStatusValue == (int)RgvEquipmentStatus.HasCargo) return; if (GdZiche.Station_Area == 5) { if (GdZiche.MotherCardeputy == RGVCurrentlocation || GdZiche.HCJStorageaddress == RGVCurrentlocation) { RGVMovetask(GdZiche.WaitmomentTwo, GdZiche.ChildPosiDeviceCode); } else if (GdZiche.MotherCarDeviceCode == RGVCurrentlocation) { RGVMovetask(GdZiche.WaitmomentOne, GdZiche.ChildPosiDeviceCode); } } else { if (GdZiche.MotherCarDeviceCode == RGVCurrentlocation || GdZiche.HCJStorageaddress == RGVCurrentlocation) { RGVMovetask(GdZiche.WaitmomentOne, GdZiche.ChildPosiDeviceCode); } else if (GdZiche.MotherCardeputy == RGVCurrentlocation || RGVCurrentlocation == 1171) { RGVMovetask(GdZiche.WaitmomentTwo, GdZiche.ChildPosiDeviceCode); } } } } #endregion #region 入库小车移动任务下发(已完成) public void InReturnposition(string DeviceCode, int RGVCurrentlocation, int RgvCraneStatusValue) { AGVStation GdZiche = _agvStationService.Corridorequipment(DeviceCode);//获取到要移动的子车 if (GdZiche.Station_material == (int)RGVEquipment.Corridorcar) { if (GdZiche.Station_Area == 5) { Dt_Task task = _taskService.GetChariotTaskBool(GdZiche.ChildPosiDeviceCode); if (task == null && RgvCraneStatusValue == (int)RgvEquipmentStatus.NoCargo) { if (GdZiche.MotherCarDeviceCode == RGVCurrentlocation || GdZiche.HCJStorageaddress == RGVCurrentlocation) { RGVMovetask(GdZiche.WaitmomentOne, GdZiche.ChildPosiDeviceCode); } else if (GdZiche.MotherCardeputy == RGVCurrentlocation) { RGVMovetask(GdZiche.WaitmomentTwo, GdZiche.ChildPosiDeviceCode); } } } else { Dt_Task task = _taskService.GetChariotTaskBool(GdZiche.ChildPosiDeviceCode); if (task == null && RgvCraneStatusValue == (int)RgvEquipmentStatus.NoCargo) { if (GdZiche.HCJStorageaddress == RGVCurrentlocation) { //如果在2巷道的母车,则可以放子车来1号等待点,如果在HCJ则可以让子车去2号 RGVMovetask(GdZiche.WaitmomentTwo, GdZiche.ChildPosiDeviceCode); } else if (GdZiche.MotherCarDeviceCode == RGVCurrentlocation || GdZiche.MotherCardeputy == RGVCurrentlocation) { RGVMovetask(GdZiche.WaitmomentOne, GdZiche.ChildPosiDeviceCode); } else if (RGVCurrentlocation == 1021) { //加入判断,如果在1021站台,则需要判断1号巷道母车是否在堆垛机取货口 var zichestation = _agvStationService.GetMothervehicle(GdZiche.MotherCarDeviceCode); int ziche = GetDeviceAddress.GetEquipmentlocation(zichestation.ChildPosiDeviceCode); if (GetDeviceAddress.Mucheywhaddres(zichestation.ChildPosiDeviceCode) && (ziche == zichestation.ZicheMotherinlaw || ziche == zichestation.Motherinlaw)) { RGVMovetask(GdZiche.WaitmomentOne, GdZiche.ChildPosiDeviceCode); } } } } } } #endregion /// /// 子母车移动任务 /// /// 目标地址 /// 设备编号 /// private bool RGVMovetask(int RGVAdders, string ChildPosiDeviceCode) { RgvCraneTaskCommand standardCommands = ConvertMotherCarTaskCommand(RGVAdders); bool sendFlag = SendCommand2(standardCommands, ChildPosiDeviceCode); return sendFlag; } /// /// 任务实体转换成命令Model /// /// 任务实体 /// /// public RgvCraneTaskCommand? ConvertToStackerCraneTaskCommand([NotNull] Dt_Task task) { RgvCraneTaskCommand stackerCraneTaskCommand = new RgvCraneTaskCommand(); short locaticurr = task.TaskType switch { _ when task.TaskType == (int)TaskInboundTypeEnum.Inbound => InRgvLocaaddres(task), _ when task.TaskType == (int)TaskOutboundTypeEnum.Outbound => RgvLocaaddres(task), _ => (short)0 }; if (locaticurr == 0) return null; stackerCraneTaskCommand.RGV_RGVTasklocation = locaticurr; stackerCraneTaskCommand.RGV_RGVtasktype = (short)task.RGVTaskType; stackerCraneTaskCommand.RGV_Rgvtaskid = (short)task.TaskNum; stackerCraneTaskCommand.RGV_Lanjiantaskid = (short)task.TaskNum; return stackerCraneTaskCommand; } public short InRgvLocaaddres(Dt_Task dt_Task) { if (dt_Task.RGVTaskType == (short)RGVTaskTypeEnum.PickingUp) return short.Parse(dt_Task.CurrentAddress); else if (dt_Task.RGVTaskType == (short)RGVTaskTypeEnum.Placing) return short.Parse(dt_Task.NextAddress); else if (dt_Task.RGVTaskType == (short)RGVTaskTypeEnum.TravelingOnly && dt_Task.TaskState == (int)TaskInStatusEnum.RGV_InZicheReleaseFinish) return short.Parse(dt_Task.NextAddress); return 0; } public short RgvLocaaddres(Dt_Task dt_Task) { if (dt_Task.RGVTaskType == (short)RGVTaskTypeEnum.PickingUp) return short.Parse(dt_Task.CurrentAddress); else if (dt_Task.RGVTaskType == (short)RGVTaskTypeEnum.Placing) return short.Parse(dt_Task.NextAddress); else if (dt_Task.RGVTaskType == (short)RGVTaskTypeEnum.TravelingOnly && dt_Task.TaskState == (int)TaskOutStatusEnum.OutNew) return short.Parse(dt_Task.NextAddress); return 0; } /// /// 下发移动任务 /// /// 任务实体 /// /// public RgvCraneTaskCommand? ConvertMotherCarTaskCommand(int RGVAddress) { RgvCraneTaskCommand stackerCraneTaskCommand = new RgvCraneTaskCommand(); stackerCraneTaskCommand.RGV_RGVTasklocation = (short)RGVAddress; stackerCraneTaskCommand.RGV_RGVtasktype = 3; stackerCraneTaskCommand.RGV_Rgvtaskid = 30001; //rgv任务号 stackerCraneTaskCommand.RGV_Lanjiantaskid = 30001; //兰剑任务id return stackerCraneTaskCommand; } public bool SendCommand2(RgvCraneTaskCommand command, string DeviceCode) { try { IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceCode == DeviceCode); SpeStackerCrane Commonstacker = (SpeStackerCrane)device; DeviceProDTO? deviceProDTO = GetDeviceAddress.GetRGVDeviceProDTO(Commonstacker, DeviceCode, "RGV_Rgvtaskstutas"); int MCGStatus = GetDeviceAddress.RGVGetLine(Commonstacker, deviceProDTO.DeviceProAddress); if (MCGStatus == 0) { if (MCGStatus == (int)RGV_Rgvtaskstutas.Ready) { Commonstacker.SetValue(RgvCraneDBName.RGV_RGVTasklocationt, command.RGV_RGVTasklocation); Commonstacker.SetValue(RgvCraneDBName.RGV_RGVtasktypet, command.RGV_RGVtasktype); Commonstacker.SetValue(RgvCraneDBName.RGV_Rgvtaskidt, command.RGV_Rgvtaskid); Commonstacker.SetValue(RgvCraneDBName.RGV_Lanjiantaskidt, command.RGV_Lanjiantaskid); return true; } } return false; } catch (Exception ex) { return false; } } } }