hutongqing
2024-09-03 9ffd50c8ed26e0be4ccdb500f261132c19600e96
WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/StackerCrane/CommonStackerCrane.cs
@@ -37,13 +37,14 @@
    /// <summary>
    /// 一般堆垛机实现类,实现堆垛机接口层
    /// </summary>
    [Description("堆垛机")]
    public class CommonStackerCrane : IStackerCrane
    {
        #region Private Member
        /// <summary>
        /// 堆垛机通讯对象
        /// </summary>
        private readonly BaseCommunicator _communicator;
        private BaseCommunicator _communicator;
        /// <summary>
        /// 堆垛机协议信息
        /// </summary>
@@ -65,7 +66,11 @@
        /// </summary>
        private int _lastTaskNum;
        private bool _isChecked;
        private bool _isChecked = false;
        private bool _heartStatr = true;
        private bool _isConnected = true;
        #endregion Private Member
        #region Public Member
@@ -147,7 +152,7 @@
        /// <summary>
        /// 通讯是否已连接
        /// </summary>
        public bool IsConnected => Communicator.IsConnected;
        public bool IsConnected => Communicator.IsConnected && _isConnected;
        /// <summary>
        /// 堆垛机任务完成事件
@@ -183,6 +188,7 @@
            _deviceProtocolDetailDTOs = deviceProtocolDetailDTOs;
            _deviceCode = deviceCode;
            _deviceName = deviceName;
            CheckConnect();
        }
        #endregion
@@ -313,6 +319,30 @@
        {
            return value.Equals(paramValue);
        }
        private void CheckConnect()
        {
            Task.Run(() =>
            {
                while (_heartStatr)
                {
                    try
                    {
                        DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault();
                        if (devicePro == null)
                            _isConnected = false;
                        else
                            Communicator.ReadAsObj(devicePro.DeviceProAddress, devicePro.DeviceDataType);
                        _isConnected = true;
                    }
                    catch (Exception ex)
                    {
                        _isConnected = false;
                    }
                    Thread.Sleep(500);
                }
            });
        }
        #endregion
        #region Public Method
@@ -321,8 +351,9 @@
        /// </summary>
        /// <param name="command">任务命令</param>
        /// <returns></returns>
        public bool SendCommand<T>(T command)where T : IDataTransfer, new()
        public bool SendCommand<T>(T command) where T : IDataTransfer, new()
        {
            if (!IsConnected) throw new Exception($"通讯连接错误,请检查网络");
            DeviceProDTO? devicePro = _deviceProDTOs.Where(x => x.DeviceProParamType == nameof(DeviceCommand)).OrderBy(x => x.DeviceProOffset).FirstOrDefault();
            if (devicePro == null)
            {
@@ -338,7 +369,7 @@
        }
        /// <summary>
        ///
        /// 监测堆垛机任务是否完成(防止任务完成事件监测超时,定义手动触发功能)
        /// </summary>
        public void CheckStackerCraneTaskCompleted()
        {
@@ -382,7 +413,7 @@
                                    break;
                            }
                            int taskNum = CurrentTaskNum;
                            if (operateResult.IsSuccess && LastTaskNum != taskNum)
                            if (operateResult.IsSuccess /*&& LastTaskNum != taskNum*/)
                            {
                                StackerCraneTaskCompletedEventArgs args = new(taskNum);
                                StackerCraneTaskCompletedEventHandler?.Invoke(this, args);
@@ -412,6 +443,7 @@
        /// <exception cref="Exception"></exception>
        public TRsult GetValue<TEnum, TRsult>(TEnum value) where TEnum : Enum
        {
            if (!IsConnected) throw new Exception($"通讯连接错误,请检查网络");
            DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == value.ToString());
            return devicePro == null ? throw new Exception() : (TRsult)Communicator.ReadAsObj(devicePro.DeviceProAddress, devicePro.DeviceDataType);
        }
@@ -422,8 +454,6 @@
        public void Heartbeat()
        {
            //todo 心跳写入
            throw new NotImplementedException();
        }
        /// <summary>
@@ -439,9 +469,17 @@
            where TEnum : Enum
            where TValue : notnull
        {
            if (!IsConnected) throw new Exception($"通讯连接错误,请检查网络");
            DeviceProDTO? devicePro = _deviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == @enum.ToString());
            return devicePro == null ? throw new Exception() : Communicator.WriteObj(devicePro.DeviceProAddress, devicePro.DeviceDataType, value);
        }
        public void Dispose()
        {
            _heartStatr = false;
            _communicator.Dispose();
            GC.SuppressFinalize(this);
        }
        #endregion
    }
}