1
hutongqing
2024-08-30 2cc4dfef234b47bef364edf798b5051a25f33217
WIDESEAWCS_Server/WIDESEAWCS_QuartzJob/StackerCrane/CommonStackerCrane.cs
@@ -37,14 +37,14 @@
    /// <summary>
    /// 一般堆垛机实现类,实现堆垛机接口层
    /// </summary>
    [Description("通用堆垛机")]
    [Description("堆垛机")]
    public class CommonStackerCrane : IStackerCrane
    {
        #region Private Member
        /// <summary>
        /// 堆垛机通讯对象
        /// </summary>
        private readonly BaseCommunicator _communicator;
        private BaseCommunicator _communicator;
        /// <summary>
        /// 堆垛机协议信息
        /// </summary>
@@ -66,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
@@ -148,7 +152,7 @@
        /// <summary>
        /// 通讯是否已连接
        /// </summary>
        public bool IsConnected => Communicator.IsConnected;
        public bool IsConnected => Communicator.IsConnected && _isConnected;
        /// <summary>
        /// 堆垛机任务完成事件
@@ -184,6 +188,7 @@
            _deviceProtocolDetailDTOs = deviceProtocolDetailDTOs;
            _deviceCode = deviceCode;
            _deviceName = deviceName;
            CheckConnect();
        }
        #endregion
@@ -314,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
@@ -322,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)
            {
@@ -413,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);
        }
@@ -423,9 +454,9 @@
        public void Heartbeat()
        {
            //todo 心跳写入
            throw new NotImplementedException();
        }
        /// <summary>
        /// 根据参数名称写入堆垛机对应的数据。
@@ -440,9 +471,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
    }
}