huanghongfeng
7 天以前 8c8a68df710d568f5f2b358c1e8c4b4799547d0b
´úÂë¹ÜÀí/WCS/WCS/WIDESEAWCS_Server/WIDESEAWCS_Tasks/ConveyorLineJob/CommonConveyorLineJob.cs
@@ -1,24 +1,16 @@
using Autofac.Core;
using AutoMapper;
using AutoMapper;
using Quartz;
using System.Diagnostics.CodeAnalysis;
using System.Reflection;
using System.Threading.Tasks;
using WIDESEA_Common.Log;
using WIDESEAWCS_Common.TaskEnum;
using WIDESEAWCS_Core;
using WIDESEAWCS_Core.Helper;
using WIDESEAWCS_DTO.Enum;
using WIDESEAWCS_ISystemServices;
using WIDESEAWCS_ITaskInfoService;
using WIDESEAWCS_Model.Models;
using WIDESEAWCS_Model.Models.System;
using WIDESEAWCS_QuartzJob;
using WIDESEAWCS_QuartzJob.DTO;
using WIDESEAWCS_QuartzJob.Service;
using WIDESEAWCS_Tasks.ConveyorLineJob;
using WIDESEAWCS_Tasks.StackerCraneJob;
using static System.Collections.Specialized.BitVector32;
namespace WIDESEAWCS_Tasks
{
@@ -30,14 +22,18 @@
        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)
        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)
@@ -47,56 +43,26 @@
                CommonConveyorLine conveyorLine = (CommonConveyorLine)context.JobDetail.JobDataMap.Get("JobParams");
                if (conveyorLine != null)
                {
                    //根据设备查找出对应的站台信息
                    /*List<AGVStation> aGVStations = _agvStationService.GetYljSide(conveyorLine.DeviceCode);
                    List<AGVStation> aGVStations = _agvStationService.GetYljSide(conveyorLine.DeviceCode);
                    foreach (var Stations in aGVStations)
                    {
                        PlatformStatus aQMConveyor = StoticCommand(conveyorLine, Stations.ChildPosiDeviceCode);
                        if(aQMConveyor.HCJ_GoodsStatus==0)    //可进行放货
                        if (Stations.Station_material == (int)RGVEquipment.AQMexit)
                        {
                            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);
                            }
                            bool Security = SecurityDoorEquipment(conveyorLine, Stations);
                            if (Security) continue;
                        }
                    }*/
                    /*
                    //安全门开门申请+安全门状态  1
                    if(aQMConveyor.DoorRequest==1)
                    {
                        if(aQMConveyor.ResetStatus == 1)
                        else
                        {
                            //写入输送线进行切换信号
                            var deviceProDtqh = GetDeviceProDTO(conveyorLine, "AQM001", "IndicatorStatus", "DeviceCommand");
                            bool handoffbool = conveyorLine.Communicator.Write(deviceProDtqh.DeviceProDataBlock, (short)3);
                            if (handoffbool)
                            {
                                //需要判断rgv,堆垛机是否允许开门
                                //如果允许开门,则写入4,表示切换成功,
                                bool Maintenancebool = conveyorLine.Communicator.Write(deviceProDtqh.DeviceProDataBlock, (short)4);
                            }
                            bool HCJPlat=PlatformEquipmentInformation(conveyorLine, Stations);
                            if (HCJPlat) continue;
                        }
                    }
                    else
                    {
                        //读取DBW8=1,DBW6=1,DBW10=1,DBW4=1,符合后,进行写入切换状态DBW0=3
                        AQMReturnnormal aQMReturnnormal=AQMStoticCommand(conveyorLine, "AQM001");   //判断
                    }*/
                }
            }
            catch (Exception ex)
@@ -106,55 +72,147 @@
            return;
        }
        public AQMConveyorRgvommand AQMCommand(CommonConveyorLine conveyorLine, string kladder)
        //处理安全门的逻辑
        private void HandleDoorRequest(AQMReturnnormal aQMConveyor, AGVStation aGVStation,int tasktype)  //1:入库  2:出库
        {
            AQMConveyorRgvommand conveyorRgvCommand = new AQMConveyorRgvommand();
            List<DeviceProDTO> deviceProDTO6 = conveyorLine.DeviceProDTOs
                .Where(x => x.DeviceChildCode == kladder
                            && DBLine.ConveyorAQMCommand.Contains(x.DeviceProParamName)
                            && x.DeviceProParamType == "ReadDeviceCommand")
                .ToList();
            foreach (var item in deviceProDTO6)
            if (_gvOperationService.AQMReadAlarminform(tasktype) && _equipmentStatusService.GetSCstatus())
            {
                var paramName = item.DeviceProParamName;
                var propertyInfo = typeof(AQMConveyorRgvommand).GetProperty(paramName);
                //写入报警
                GetDeviceAddress.WriteSecurityDoorpolice(aGVStation.ChildPosiDeviceCode, "AlarmSummary", 1);
                _gvOperationService.WriteOutbuttonpause(null);
            }
                if (propertyInfo != null)
            if (aQMConveyor.DoorRequest == 1 && aQMConveyor.IndicatorStatus == (int)SafetyDoorStatus.YellowBlink2Hz)
            {
                if (aQMConveyor.EmergencyStopStatus == 1)
                {
                    if (item.DeviceDataType == "int")
                    bool AQMzckm = tasktype == 1 ? GetDeviceAddress.InRGVRGVStepprocess() : GetDeviceAddress.OutRGVRGVStepprocess();    //判断是否有进程任务
                    if (AQMzckm)
                    {
                        var value = conveyorLine.Communicator.Read<short>(item.DeviceProAddress);
                        propertyInfo.SetValue(conveyorRgvCommand, value);
                        //写入停止的信息
                        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);
                    }
                }
            }
            return conveyorRgvCommand;
        }
        public AQMReturnnormal AQMStoticCommand(CommonConveyorLine conveyorLine, string kladder)
        //安全门设备信息管理
        private bool SecurityDoorEquipment(CommonConveyorLine conveyorLine, AGVStation Stations)
        {
            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)
            try
            {
                var paramName = item.DeviceProParamName;
                var propertyInfo = typeof(AQMReturnnormal).GetProperty(paramName);
                // èŽ·å–å®‰å…¨é—¨ä¿¡æ¯
                AQMReturnnormal aQMConveyor = AQMStoticCommand(conveyorLine, Stations.ChildPosiDeviceCode);
                if (propertyInfo != null)
                if (aQMConveyor.SafetyLockStatus == 1)
                {
                    if (item.DeviceDataType == "int")
                    //写入报警
                    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)
                    {
                        var value = conveyorLine.Communicator.Read<short>(item.DeviceProAddress);
                        propertyInfo.SetValue(conveyorRgvCommand, value);
                        //查找是否有异常搬运任务
                        webResponseContent = _taskService.UpdateDeliveryAddress(Stations.HCJStorageaddress.ToString(), 1);   //还需要传入地址
                    }
                    else
                    {
                        //出库站台的任务
                        webResponseContent = _taskService.UpdateDeliveryAddress(Stations.HCJStorageaddress.ToString(), 2);
                    }
                }
                return false;
            }
            return conveyorRgvCommand;
            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)
@@ -162,11 +220,13 @@
            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)
@@ -176,7 +236,7 @@
                if (propertyInfo != null)
                {
                    if (item.DeviceDataType == "int")
                    if (item.DeviceDataType == "short")
                    {
                        var value = conveyorLine.Communicator.Read<short>(item.DeviceProAddress);
                        propertyInfo.SetValue(conveyorRgvCommand, value);