using AutoMapper;
|
using Quartz;
|
using WIDESEA_Common.Log;
|
using WIDESEAWCS_Core;
|
using WIDESEAWCS_DTO.Enum;
|
using WIDESEAWCS_ISystemServices;
|
using WIDESEAWCS_ITaskInfoService;
|
using WIDESEAWCS_Model.Models;
|
using WIDESEAWCS_QuartzJob;
|
using WIDESEAWCS_QuartzJob.DTO;
|
using WIDESEAWCS_QuartzJob.Service;
|
using WIDESEAWCS_Tasks.ConveyorLineJob;
|
using WIDESEAWCS_Tasks.StackerCraneJob;
|
|
namespace WIDESEAWCS_Tasks
|
{
|
[DisallowConcurrentExecution]
|
public class CommonConveyorLineJob : IJob
|
{
|
private readonly ITaskService _taskService;
|
private readonly ITaskExecuteDetailService _taskExecuteDetailService;
|
private readonly IRouterService _routerService;
|
private readonly IAgvStationService _agvStationService;
|
private readonly IMapper _mapper;
|
private readonly IRgvOperationService _gvOperationService;
|
private readonly IEquipmentStatusService _equipmentStatusService;
|
|
public CommonConveyorLineJob(ITaskService taskService, ITaskExecuteDetailService taskExecuteDetailService, IRouterService routerService, IAgvStationService agvStation, IMapper mapper, IRgvOperationService gvOperationService, IEquipmentStatusService equipmentStatusService)
|
{
|
_taskService = taskService;
|
_taskExecuteDetailService = taskExecuteDetailService;
|
_routerService = routerService;
|
_agvStationService = agvStation;
|
_mapper = mapper;
|
_gvOperationService = gvOperationService;
|
_equipmentStatusService=equipmentStatusService;
|
}
|
|
public async Task Execute(IJobExecutionContext context)
|
{
|
try
|
{
|
CommonConveyorLine conveyorLine = (CommonConveyorLine)context.JobDetail.JobDataMap.Get("JobParams");
|
if (conveyorLine != null)
|
{
|
|
|
//根据设备查找出对应的站台信息
|
List<AGVStation> aGVStations = _agvStationService.GetYljSide(conveyorLine.DeviceCode);
|
foreach (var Stations in aGVStations)
|
{
|
if (Stations.Station_material == (int)RGVEquipment.AQMexit)
|
{
|
|
bool Security = SecurityDoorEquipment(conveyorLine, Stations);
|
if (Security) continue;
|
|
}
|
else
|
{
|
bool HCJPlat=PlatformEquipmentInformation(conveyorLine, Stations);
|
if (HCJPlat) continue;
|
}
|
|
}
|
}
|
}
|
catch (Exception ex)
|
{
|
WriteLog.Write_Log("安全门", "运行状况", "故障", new { 信息 = ex.Message });
|
}
|
return;
|
}
|
|
|
//处理安全门的逻辑
|
private void HandleDoorRequest(AQMReturnnormal aQMConveyor, AGVStation aGVStation,int tasktype) //1:入库 2:出库
|
{
|
if (_gvOperationService.AQMReadAlarminform(tasktype) && _equipmentStatusService.GetSCstatus())
|
{
|
//写入报警
|
GetDeviceAddress.WriteSecurityDoorpolice(aGVStation.ChildPosiDeviceCode, "AlarmSummary", 1);
|
_gvOperationService.WriteOutbuttonpause(null);
|
}
|
|
if (aQMConveyor.DoorRequest == 1 && aQMConveyor.IndicatorStatus == (int)SafetyDoorStatus.YellowBlink2Hz)
|
{
|
if (aQMConveyor.EmergencyStopStatus == 1)
|
{
|
bool AQMzckm = tasktype == 1 ? GetDeviceAddress.InRGVRGVStepprocess() : GetDeviceAddress.OutRGVRGVStepprocess(); //判断是否有进程任务
|
if (AQMzckm)
|
{
|
//写入停止的信息
|
bool RGVRGV_DWorkingmode = tasktype == 1 ? _gvOperationService.InWriteOutbuttonpause(null).Status : _gvOperationService.WriteOutbuttonpause(null).Status;
|
|
bool RGVstate = tasktype == 1 ? GetDeviceAddress.InRGVStatice() : GetDeviceAddress.OutRGVStatice(); //判断是否全为手动
|
if (RGVstate)
|
{
|
//写入开门信号
|
GetDeviceAddress.WriteSecurityDoorpolice(aGVStation.ChildPosiDeviceCode, "OpenDoor", 1);
|
}
|
}
|
|
}
|
else
|
{
|
bool AQMkm = tasktype == 1 ? GetDeviceAddress.InRGVStatice() : GetDeviceAddress.OutRGVStatice();
|
if (AQMkm)
|
{
|
GetDeviceAddress.WriteSecurityDoorpolice(aGVStation.ChildPosiDeviceCode, "OpenDoor", 1);
|
}
|
|
}
|
}
|
}
|
|
//安全门设备信息管理
|
private bool SecurityDoorEquipment(CommonConveyorLine conveyorLine, AGVStation Stations)
|
{
|
try
|
{
|
// 获取安全门信息
|
AQMReturnnormal aQMConveyor = AQMStoticCommand(conveyorLine, Stations.ChildPosiDeviceCode);
|
|
if (aQMConveyor.SafetyLockStatus == 1)
|
{
|
//写入报警
|
GetDeviceAddress.WriteSecurityDoorpolice(Stations.ChildPosiDeviceCode, "AlarmSummary", 0);
|
//写入开门信号
|
GetDeviceAddress.WriteSecurityDoorpolice(Stations.ChildPosiDeviceCode, "OpenDoor", 0);
|
}
|
|
// 根据任务类型选择处理策略
|
if (Stations.Station_tasktype == (int)RGVTasktype.Outbound)
|
{
|
if (aQMConveyor.EmergencyStopStatus == 0) _gvOperationService.WriteOutbuttonpause(null);
|
HandleDoorRequest(aQMConveyor, Stations, 2);
|
}
|
else
|
{
|
if (aQMConveyor.EmergencyStopStatus == 0) _gvOperationService.InWriteOutbuttonpause(null);
|
HandleDoorRequest(aQMConveyor, Stations, 1);
|
}
|
return false;
|
}
|
catch (Exception ex)
|
{
|
return true;
|
throw;
|
}
|
}
|
|
private bool PlatformEquipmentInformation(CommonConveyorLine conveyorLine, AGVStation Stations)
|
{
|
try
|
{
|
PlatformStatus aQMConveyor = StoticCommand(conveyorLine, Stations.ChildPosiDeviceCode);
|
if (aQMConveyor.HCJ_GoodsStatus == 0) //可进行放货
|
{
|
WebResponseContent webResponseContent = new WebResponseContent();
|
//根据类型查找任务
|
if (Stations.Station_material == (int)RGVEquipment.AbnormalOutbound)
|
{
|
//查找是否有异常搬运任务
|
webResponseContent = _taskService.UpdateDeliveryAddress(Stations.HCJStorageaddress.ToString(), 1); //还需要传入地址
|
}
|
else
|
{
|
//出库站台的任务
|
webResponseContent = _taskService.UpdateDeliveryAddress(Stations.HCJStorageaddress.ToString(), 2);
|
}
|
}
|
return false;
|
}
|
catch (Exception ex)
|
{
|
return true;
|
throw;
|
}
|
}
|
|
/// <summary>
|
/// 安全门信号
|
/// </summary>
|
public AQMReturnnormal AQMStoticCommand(CommonConveyorLine conveyorLine, string kladder)
|
{
|
try
|
{
|
AQMReturnnormal conveyorRgvCommand = new AQMReturnnormal();
|
List<DeviceProDTO> deviceProDTO6 = conveyorLine.DeviceProDTOs
|
.Where(x => x.DeviceChildCode == kladder
|
//&& DBLine.ConveyorAQMReturnnormal.Contains(x.DeviceProParamName)
|
&& x.DeviceProParamType == "ReadDeviceCommand")
|
.ToList();
|
foreach (var item in deviceProDTO6)
|
{
|
var paramName = item.DeviceProParamName;
|
var propertyInfo = typeof(AQMReturnnormal).GetProperty(paramName);
|
|
if (propertyInfo != null)
|
{
|
if (item.DeviceDataType == "short")
|
{
|
var value = conveyorLine.Communicator.Read<short>(item.DeviceProAddress);
|
propertyInfo.SetValue(conveyorRgvCommand, value);
|
}
|
}
|
}
|
return conveyorRgvCommand;
|
}
|
catch (Exception ex)
|
{
|
return null;
|
throw;
|
}
|
}
|
|
public DeviceProDTO? GetDeviceProDTO(CommonConveyorLine conveyorLine, string PLCmanipula, string DeviceProParamName, string DeviceProParamType)
|
{
|
return conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceChildCode == PLCmanipula && x.DeviceProParamName == DeviceProParamName && x.DeviceProParamType == DeviceProParamType);
|
}
|
|
//站台信号
|
public PlatformStatus StoticCommand(CommonConveyorLine conveyorLine, string kladder)
|
{
|
PlatformStatus conveyorRgvCommand = new PlatformStatus();
|
List<DeviceProDTO> deviceProDTO6 = conveyorLine.DeviceProDTOs
|
.Where(x => x.DeviceChildCode == kladder
|
&& x.DeviceProParamName== "HCJ_GoodsStatus"
|
&& x.DeviceProParamType == "ReadDeviceCommand")
|
.ToList();
|
foreach (var item in deviceProDTO6)
|
{
|
var paramName = item.DeviceProParamName;
|
var propertyInfo = typeof(PlatformStatus).GetProperty(paramName);
|
|
if (propertyInfo != null)
|
{
|
if (item.DeviceDataType == "short")
|
{
|
var value = conveyorLine.Communicator.Read<short>(item.DeviceProAddress);
|
propertyInfo.SetValue(conveyorRgvCommand, value);
|
}
|
}
|
}
|
return conveyorRgvCommand;
|
}
|
|
|
}
|
}
|