肖洋
2025-01-11 87cc1c0d71fe6c6000ac6523bbb367d5ac29b5d2
Code Management/WCS/WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/StackerCrane/Common/CommonStackerCrane.cs
@@ -41,6 +41,11 @@
    public class CommonStackerCrane : IStackerCrane
    {
        #region Private Member
        // 常量
        private const int WaitTimeout = 20 * 6000;
        private const int ReadTimeout = 1500;
        /// <summary>
        /// 堆垛机通讯对象
        /// </summary>
@@ -229,8 +234,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 +334,7 @@
        private void CheckConnect()
        {
            Task.Run(() =>
            Task.Run(async () =>
            {
                while (_heartStatr)
                {
@@ -343,7 +351,8 @@
                    {
                        _isConnected = false;
                    }
                    Thread.Sleep(500);
                    //Thread.Sleep(500);
                    await Task.Delay(500);
                }
            });
        }
@@ -372,17 +381,21 @@
            return false;
        }
        private readonly object _lockObject = new();
        /// <summary>
        /// 监测堆垛机任务是否完成(防止任务完成事件监测超时,定义手动触发功能)
        /// </summary>
        public void CheckStackerCraneTaskCompleted()
        {
            // 使用锁确保同一时间只有一个线程可以进入该方法
            lock (_lockObject)
            {
            if (_isChecked)
                return;
                _isChecked = true;
            Task.Run(() =>
            {
                _isChecked = true;
                try
                {
                    DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(StackerCraneWorkStatus));
@@ -396,22 +409,22 @@
                            switch (typeCode)
                            {
                                case TypeCode.Boolean:
                                    operateResult = Communicator.Wait(devicePro.DeviceProAddress, 1500, 20 * 6000, Convert.ToBoolean(deviceProtocolDetail.ProtocalDetailValue));
                                        operateResult = Communicator.Wait(devicePro.DeviceProAddress, ReadTimeout, WaitTimeout, Convert.ToBoolean(deviceProtocolDetail.ProtocalDetailValue));
                                    break;
                                case TypeCode.Byte:
                                    operateResult = Communicator.Wait(devicePro.DeviceProAddress, 1500, 20 * 6000, Convert.ToByte(deviceProtocolDetail.ProtocalDetailValue));
                                        operateResult = Communicator.Wait(devicePro.DeviceProAddress, ReadTimeout, WaitTimeout, Convert.ToByte(deviceProtocolDetail.ProtocalDetailValue));
                                    break;
                                case TypeCode.Int16:
                                    operateResult = Communicator.Wait(devicePro.DeviceProAddress, 1500, 20 * 6000, Convert.ToInt16(deviceProtocolDetail.ProtocalDetailValue));
                                        operateResult = Communicator.Wait(devicePro.DeviceProAddress, ReadTimeout, WaitTimeout, Convert.ToInt16(deviceProtocolDetail.ProtocalDetailValue));
                                    break;
                                case TypeCode.Int32:
                                    operateResult = Communicator.Wait(devicePro.DeviceProAddress, 1500, 20 * 6000, Convert.ToInt32(deviceProtocolDetail.ProtocalDetailValue));
                                        operateResult = Communicator.Wait(devicePro.DeviceProAddress, ReadTimeout, WaitTimeout, Convert.ToInt32(deviceProtocolDetail.ProtocalDetailValue));
                                    break;
                                case TypeCode.UInt16:
                                    operateResult = Communicator.Wait(devicePro.DeviceProAddress, 1500, 20 * 6000, Convert.ToUInt16(deviceProtocolDetail.ProtocalDetailValue));
                                        operateResult = Communicator.Wait(devicePro.DeviceProAddress, ReadTimeout, WaitTimeout, Convert.ToUInt16(deviceProtocolDetail.ProtocalDetailValue));
                                    break;
                                case TypeCode.UInt32:
                                    operateResult = Communicator.Wait(devicePro.DeviceProAddress, 1500, 20 * 6000, Convert.ToUInt32(deviceProtocolDetail.ProtocalDetailValue));
                                        operateResult = Communicator.Wait(devicePro.DeviceProAddress, ReadTimeout, WaitTimeout, Convert.ToUInt32(deviceProtocolDetail.ProtocalDetailValue));
                                    break;
                                default:
                                    break;
@@ -436,6 +449,7 @@
                }
            });
        }
        }
        /// <summary>
        /// 根据参数名称读取堆垛机对应的数据。