更新设备通讯超时设置及优化代码结构
此次提交包括以下主要更改:
- 更新 `.gitignore` 文件,排除调试、临时文件及 HTML 报告。
- 在 `CommonStackerCrane` 和 `CommonStackerStationCrane` 类中添加 `WaitTimeout` 和 `ReadTimeout` 常量,统一设备通讯超时设置。
- 修改 `GetCurrentTaskNum` 方法,引入空合并运算符并增强异常处理。
- 使用 `await Task.Delay` 替代 `Thread.Sleep`,优化异步执行。
- 在 `CheckStackerCraneTaskCompleted` 方法中增加锁实现线程安全,改进任务完成逻辑。
- 清理 `CommonStackerCraneJob` 和 `CommonStackerStationCraneJob` 中的注释代码,提升任务逻辑的组织性及日志记录。
- 引入 `System.Threading.Tasks` 命名空间,支持异步编程。
- 重构代码,提高可读性和维护性,增强通讯鲁棒性。
| | |
| | | /Code Management/WMS/WIDESEA_WMSServer/.vs/WIDESEA_WMSServer/copilot-chat/bef6627e/sessions/22de66c6-d93f-400b-aaa1-cc12e218c2e7 |
| | | /Code Management/WCS/WIDESEAWCS_Server/.vs/WIDESEAWCS_Server/copilot-chat/bef6627e/sessions/36708593-3f69-4656-815a-651b3ad17c7d |
| | | *.xml |
| | | /Code Management/WMS/WIDESEA_WMSClient/report_form_rollup-plugin-visualizer.html |
| | |
| | | public class CommonStackerCrane : IStackerCrane |
| | | { |
| | | #region Private Member |
| | | |
| | | // 常é |
| | | private const int WaitTimeout = 20 * 6000; |
| | | private const int ReadTimeout = 1500; |
| | | |
| | | /// <summary> |
| | | /// å åæºé讯对象 |
| | | /// </summary> |
| | |
| | | |
| | | 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> |
| | |
| | | |
| | | private void CheckConnect() |
| | | { |
| | | Task.Run(() => |
| | | Task.Run(async () => |
| | | { |
| | | while (_heartStatr) |
| | | { |
| | |
| | | { |
| | | _isConnected = false; |
| | | } |
| | | Thread.Sleep(500); |
| | | //Thread.Sleep(500); |
| | | await Task.Delay(500); |
| | | } |
| | | }); |
| | | } |
| | |
| | | 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, 1500, 20 * 6000, Convert.ToBoolean(deviceProtocolDetail.ProtocalDetailValue)); |
| | | break; |
| | | case TypeCode.Byte: |
| | | operateResult = Communicator.Wait(devicePro.DeviceProAddress, 1500, 20 * 6000, Convert.ToByte(deviceProtocolDetail.ProtocalDetailValue)); |
| | | break; |
| | | case TypeCode.Int16: |
| | | operateResult = Communicator.Wait(devicePro.DeviceProAddress, 1500, 20 * 6000, Convert.ToInt16(deviceProtocolDetail.ProtocalDetailValue)); |
| | | break; |
| | | case TypeCode.Int32: |
| | | operateResult = Communicator.Wait(devicePro.DeviceProAddress, 1500, 20 * 6000, Convert.ToInt32(deviceProtocolDetail.ProtocalDetailValue)); |
| | | break; |
| | | case TypeCode.UInt16: |
| | | operateResult = Communicator.Wait(devicePro.DeviceProAddress, 1500, 20 * 6000, Convert.ToUInt16(deviceProtocolDetail.ProtocalDetailValue)); |
| | | break; |
| | | case TypeCode.UInt32: |
| | | operateResult = Communicator.Wait(devicePro.DeviceProAddress, 1500, 20 * 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> |
| | |
| | | public class CommonStackerStationCrane : IStackerCrane |
| | | { |
| | | #region Private Member |
| | | |
| | | // 常é |
| | | private const int WaitTimeout = 20 * 6000; |
| | | private const int ReadTimeout = 1500; |
| | | |
| | | /// <summary> |
| | | /// å åæºé讯对象 |
| | | /// </summary> |
| | |
| | | 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; |
| | |
| | | { |
| | | try |
| | | { |
| | | // speStackerCrane.GetStackerCraneStatus<StackerCraneAutoStatus>(); |
| | | // speStackerCrane.GetStackerCraneStatus<StackerCraneWorkStatus>(); |
| | | // speStackerCrane.GetStackerCraneStatus<StackerCraneStatus>(); |
| | | |
| | | CommonStackerCrane commonStackerCrane = (CommonStackerCrane)context.JobDetail.JobDataMap.Get("JobParams"); |
| | | if (commonStackerCrane != null) |
| | | { |
| | | //EqptAlive(commonStackerCrane); |
| | | //Console.Out.WriteLine(commonStackerCrane.DeviceName); |
| | | if (!commonStackerCrane.IsEventSubscribed) |
| | | { |
| | | commonStackerCrane.StackerCraneTaskCompletedEventHandler += CommonStackerCrane_StackerCraneTaskCompletedEventHandler;//订é
ä»»å¡å®æäºä»¶ |
| | |
| | | { |
| | | if (commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.WorkType) != 5) |
| | | { |
| | | //Console.Out.WriteLine("TaskCompleted" + e.TaskNum); |
| | | ConsoleHelper.WriteColorLine($"ã{commonStackerCrane.DeviceName}ãä»»å¡å®æ,ä»»å¡å·ï¼ã{e.TaskNum}ã", ConsoleColor.Blue); |
| | | string str = $"ã{commonStackerCrane.DeviceName}ãä»»å¡å®æ,ä»»å¡å·ï¼ã{e.TaskNum}ã"; |
| | | WriteInfo(commonStackerCrane.DeviceName, str); |
| | | ConsoleHelper.WriteColorLine(str, ConsoleColor.Blue); |
| | | var task = _taskRepository.QueryFirst(x => x.TaskNum == e.TaskNum); |
| | | |
| | | if (task == null) commonStackerCrane.SetValue(StackerCraneDBName.WorkType, 5); |
| | |
| | | return; |
| | | } |
| | | |
| | | _taskService.StackCraneTaskCompleted(e.TaskNum); |
| | | var content = _taskService.StackCraneTaskCompleted(e.TaskNum); |
| | | if (commonStackerCrane.DeviceCode.Contains("CH") && task.TaskType == (int)TaskOutboundTypeEnum.Outbound) |
| | | { |
| | | task = _taskRepository.QueryFirst(x => x.TaskNum == e.TaskNum); |
| | |
| | | _taskRepository.DeleteData(task); |
| | | _htyRepository.AddData(TASKHTY); |
| | | } |
| | | commonStackerCrane.SetValue(StackerCraneDBName.WorkType, 5); |
| | | var isWorkType = commonStackerCrane.SetValue(StackerCraneDBName.WorkType, 5); |
| | | str = $"WMS|WCSä»»å¡å®æï¼ã{content.Status}ã,å åæºå®æä¿¡å·åå
¥ï¼ã{isWorkType}ã,ä»»å¡å·ï¼ã{e.TaskNum}ã,æçå·ï¼ã{task.PalletCode}ã"; |
| | | WriteInfo(commonStackerCrane.DeviceName, str); |
| | | ConsoleHelper.WriteColorLine(str, ConsoleColor.Blue); |
| | | } |
| | | } |
| | | } |
| | |
| | | using Newtonsoft.Json; |
| | | using Quartz; |
| | | using System.Diagnostics.CodeAnalysis; |
| | | using System.Threading.Tasks; |
| | | using WIDESEAWCS_BasicInfoRepository; |
| | | using WIDESEAWCS_Common.TaskEnum; |
| | | using WIDESEAWCS_Core.Caches; |
| | |
| | | { |
| | | if (commonStackerCrane.GetValue<StackerCraneDBName, short>(StackerCraneDBName.WorkType) != 5) |
| | | { |
| | | Console.Out.WriteLine("TaskCompleted" + e.TaskNum); |
| | | _taskService.StackCraneTaskCompletedByStation(e.TaskNum); |
| | | string str = $"ã{commonStackerCrane.DeviceName}ãä»»å¡å®æ,ä»»å¡å·ï¼ã{e.TaskNum}ã"; |
| | | WriteInfo(commonStackerCrane.DeviceName, str); |
| | | ConsoleHelper.WriteColorLine(str, ConsoleColor.Blue); |
| | | |
| | | var content = _taskService.StackCraneTaskCompletedByStation(e.TaskNum); |
| | | commonStackerCrane.SetValue(StackerCraneDBName.WorkType, 5); |
| | | |
| | | var isWorkType = commonStackerCrane.SetValue(StackerCraneDBName.WorkType, 5); |
| | | str = $"WMS|WCSä»»å¡å®æï¼ã{content.Status}ã,å åæºå®æä¿¡å·åå
¥ï¼ã{isWorkType}ã,ä»»å¡å·ï¼ã{e.TaskNum}ã"; |
| | | WriteInfo(commonStackerCrane.DeviceName, str); |
| | | ConsoleHelper.WriteColorLine(str, ConsoleColor.Blue); |
| | | } |
| | | } |
| | | } |