| | |
| | | /// <summary> |
| | | /// 一般堆垛机实现类,实现堆垛机接口层 |
| | | /// </summary> |
| | | [Description("通用堆垛机")] |
| | | [Description("堆垛机")] |
| | | public class CommonStackerCrane : IStackerCrane |
| | | { |
| | | #region Private Member |
| | | /// <summary> |
| | | /// 堆垛机通讯对象 |
| | | /// </summary> |
| | | private readonly BaseCommunicator _communicator; |
| | | private BaseCommunicator _communicator; |
| | | /// <summary> |
| | | /// 堆垛机协议信息 |
| | | /// </summary> |
| | |
| | | /// </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 |
| | |
| | | /// <summary> |
| | | /// 通讯是否已连接 |
| | | /// </summary> |
| | | public bool IsConnected => Communicator.IsConnected; |
| | | public bool IsConnected => Communicator.IsConnected && _isConnected; |
| | | |
| | | /// <summary> |
| | | /// 堆垛机任务完成事件 |
| | |
| | | _deviceProtocolDetailDTOs = deviceProtocolDetailDTOs; |
| | | _deviceCode = deviceCode; |
| | | _deviceName = deviceName; |
| | | CheckConnect(); |
| | | } |
| | | #endregion |
| | | |
| | |
| | | { |
| | | 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 |
| | |
| | | /// </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) |
| | | { |
| | |
| | | break; |
| | | } |
| | | int taskNum = CurrentTaskNum; |
| | | if (operateResult.IsSuccess && LastTaskNum != taskNum) |
| | | if (operateResult.IsSuccess /*&& LastTaskNum != taskNum*/) |
| | | { |
| | | StackerCraneTaskCompletedEventArgs args = new(taskNum); |
| | | StackerCraneTaskCompletedEventHandler?.Invoke(this, args); |
| | |
| | | /// <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); |
| | | } |
| | |
| | | public void Heartbeat() |
| | | { |
| | | |
| | | //todo 心跳写入 |
| | | throw new NotImplementedException(); |
| | | } |
| | | |
| | | |
| | | |
| | | /// <summary> |
| | | /// 根据参数名称写入堆垛机对应的数据。 |
| | |
| | | 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 |
| | | } |
| | | } |