肖洋
2025-01-19 d59b540dd78d49ddf1f2e1c6dfb7b19a7d3e3d7c
Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/StackerCrane/Common/CommonStackerCrane.cs
@@ -41,6 +41,17 @@
    public class CommonStackerCrane : IStackerCrane
    {
        #region Private Member
        /// <summary>
        /// 完成信号等待时间
        /// </summary>
        private const int WaitTimeout = 20 * 6000;
        /// <summary>
        /// 完成信号读取频率
        /// </summary>
        private const int ReadTimeout = 100;
        /// <summary>
        /// 堆垛机通讯对象
        /// </summary>
@@ -229,8 +240,11 @@
        private int GetCurrentTaskNum()
        {
            DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(CurrentTaskNum));
            return devicePro == null ? throw new Exception() : (int)Communicator.ReadAsObj(devicePro.DeviceProAddress, devicePro.DeviceDataType);
            //DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(CurrentTaskNum));
            //return devicePro == null ? throw new Exception() : (int)Communicator.ReadAsObj(devicePro.DeviceProAddress, devicePro.DeviceDataType);
            DeviceProDTO devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(CurrentTaskNum))?? throw new Exception("未获取到当前任务号的信息");
            return (int)Communicator.ReadAsObj(devicePro.DeviceProAddress, devicePro.DeviceDataType);
        }
        /// <summary>
@@ -326,7 +340,7 @@
        private void CheckConnect()
        {
            Task.Run(() =>
            Task.Run(async () =>
            {
                while (_heartStatr)
                {
@@ -343,7 +357,8 @@
                    {
                        _isConnected = false;
                    }
                    Thread.Sleep(500);
                    //Thread.Sleep(500);
                    await Task.Delay(500);
                }
            });
        }
@@ -372,69 +387,74 @@
            return false;
        }
        private readonly object _lockObject = new();
        /// <summary>
        /// 监测堆垛机任务是否完成(防止任务完成事件监测超时,定义手动触发功能)
        /// </summary>
        public void CheckStackerCraneTaskCompleted()
        {
            if (_isChecked)
                return;
            Task.Run(() =>
            // 使用锁确保同一时间只有一个线程可以进入该方法
            lock (_lockObject)
            {
                if (_isChecked)
                    return;
                _isChecked = true;
                try
                Task.Run(() =>
                {
                    DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(StackerCraneWorkStatus));
                    if (devicePro != null)
                    try
                    {
                        DeviceProtocolDetailDTO? deviceProtocolDetail = _deviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == devicePro.DeviceProParamName && x.ProtocolDetailType == StackerCraneWorkStatus.WorkCompleted.ToString());
                        if (deviceProtocolDetail != null)
                        DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(StackerCraneWorkStatus));
                        if (devicePro != null)
                        {
                            OperateResult<TimeSpan> operateResult = new OperateResult<TimeSpan>();
                            TypeCode typeCode = SiemensDBDataType.GetTypeCode(devicePro.DeviceDataType);
                            switch (typeCode)
                            DeviceProtocolDetailDTO? deviceProtocolDetail = _deviceProtocolDetailDTOs.FirstOrDefault(x => x.DeviceProParamName == devicePro.DeviceProParamName && x.ProtocolDetailType == StackerCraneWorkStatus.WorkCompleted.ToString());
                            if (deviceProtocolDetail != null)
                            {
                                case TypeCode.Boolean:
                                    operateResult = Communicator.Wait(devicePro.DeviceProAddress, 500, 10 * 6000, Convert.ToBoolean(deviceProtocolDetail.ProtocalDetailValue));
                                    break;
                                case TypeCode.Byte:
                                    operateResult = Communicator.Wait(devicePro.DeviceProAddress, 500, 10 * 6000, Convert.ToByte(deviceProtocolDetail.ProtocalDetailValue));
                                    break;
                                case TypeCode.Int16:
                                    operateResult = Communicator.Wait(devicePro.DeviceProAddress, 500, 10 * 6000, Convert.ToInt16(deviceProtocolDetail.ProtocalDetailValue));
                                    break;
                                case TypeCode.Int32:
                                    operateResult = Communicator.Wait(devicePro.DeviceProAddress, 500, 10 * 6000, Convert.ToInt32(deviceProtocolDetail.ProtocalDetailValue));
                                    break;
                                case TypeCode.UInt16:
                                    operateResult = Communicator.Wait(devicePro.DeviceProAddress, 500, 10 * 6000, Convert.ToUInt16(deviceProtocolDetail.ProtocalDetailValue));
                                    break;
                                case TypeCode.UInt32:
                                    operateResult = Communicator.Wait(devicePro.DeviceProAddress, 500, 10 * 6000, Convert.ToUInt32(deviceProtocolDetail.ProtocalDetailValue));
                                    break;
                                default:
                                    break;
                            }
                            int taskNum = CurrentTaskNum;
                            if (operateResult.IsSuccess /*&& LastTaskNum != taskNum*/)
                            {
                                StackerCraneTaskCompletedEventArgs args = new(taskNum);
                                StackerCraneTaskCompletedEventHandler?.Invoke(this, args);
                                _lastTaskNum = taskNum;
                                OperateResult<TimeSpan> operateResult = new OperateResult<TimeSpan>();
                                TypeCode typeCode = SiemensDBDataType.GetTypeCode(devicePro.DeviceDataType);
                                switch (typeCode)
                                {
                                    case TypeCode.Boolean:
                                        operateResult = Communicator.Wait(devicePro.DeviceProAddress, ReadTimeout, WaitTimeout, Convert.ToBoolean(deviceProtocolDetail.ProtocalDetailValue));
                                        break;
                                    case TypeCode.Byte:
                                        operateResult = Communicator.Wait(devicePro.DeviceProAddress, ReadTimeout, WaitTimeout, Convert.ToByte(deviceProtocolDetail.ProtocalDetailValue));
                                        break;
                                    case TypeCode.Int16:
                                        operateResult = Communicator.Wait(devicePro.DeviceProAddress, ReadTimeout, WaitTimeout, Convert.ToInt16(deviceProtocolDetail.ProtocalDetailValue));
                                        break;
                                    case TypeCode.Int32:
                                        operateResult = Communicator.Wait(devicePro.DeviceProAddress, ReadTimeout, WaitTimeout, Convert.ToInt32(deviceProtocolDetail.ProtocalDetailValue));
                                        break;
                                    case TypeCode.UInt16:
                                        operateResult = Communicator.Wait(devicePro.DeviceProAddress, ReadTimeout, WaitTimeout, Convert.ToUInt16(deviceProtocolDetail.ProtocalDetailValue));
                                        break;
                                    case TypeCode.UInt32:
                                        operateResult = Communicator.Wait(devicePro.DeviceProAddress, ReadTimeout, WaitTimeout, Convert.ToUInt32(deviceProtocolDetail.ProtocalDetailValue));
                                        break;
                                    default:
                                        break;
                                }
                                int taskNum = CurrentTaskNum;
                                if (operateResult.IsSuccess /*&& LastTaskNum != taskNum*/)
                                {
                                    StackerCraneTaskCompletedEventArgs args = new(taskNum);
                                    StackerCraneTaskCompletedEventHandler?.Invoke(this, args);
                                    _lastTaskNum = taskNum;
                                }
                            }
                        }
                    }
                }
                catch (Exception ex)
                {
                    catch (Exception ex)
                    {
                }
                finally
                {
                    _isChecked = false;
                }
            });
                    }
                    finally
                    {
                        _isChecked = false;
                    }
                });
            }
        }
        /// <summary>