Merge branch 'xiaoyang' into dev
| | |
| | | /// <summary> |
| | | /// æ¹éç»ç确认 |
| | | /// </summary> |
| | | GroupPalletConfirm |
| | | GroupPalletConfirm, |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®æçå·æ¥è¯¢åºåæç»æ°é |
| | | /// </summary> |
| | | GetStockDetailCount |
| | | |
| | | #endregion WMSæ¥å£ |
| | | } |
| | |
| | | #region << ç æ¬ 注 é >> |
| | | |
| | | /*---------------------------------------------------------------- |
| | | * å½å空é´ï¼WIDESEAWCS_Communicator |
| | | * å建è
ï¼è¡ç«¥åº |
| | |
| | | * ä¿®æ¹æ¶é´ï¼ |
| | | * çæ¬ï¼V1.0.1 |
| | | * ä¿®æ¹è¯´æï¼ |
| | | * |
| | | * |
| | | *----------------------------------------------------------------*/ |
| | | |
| | | #endregion << ç æ¬ 注 é >> |
| | | |
| | | using HslCommunication; |
| | |
| | | using HslCommunication.LogNet; |
| | | using HslCommunication.Profinet.Siemens; |
| | | using Newtonsoft.Json; |
| | | using Newtonsoft.Json.Linq; |
| | | using System; |
| | | using System.Collections; |
| | | using System.Collections.Generic; |
| | | using System.ComponentModel; |
| | | using System.Diagnostics.CodeAnalysis; |
| | | using System.Linq; |
| | | using System.Net; |
| | | using System.Net.NetworkInformation; |
| | | using System.Reflection; |
| | | using System.Text; |
| | | using System.Threading.Tasks; |
| | | using System.Xml.Linq; |
| | | |
| | | namespace WIDESEAWCS_Communicator |
| | | { |
| | |
| | | public class SiemensS7 : BaseCommunicator |
| | | { |
| | | #region Private Member |
| | | |
| | | /// <summary> |
| | | /// HSLCommunicationç西é¨åçS7åè®®çé讯类 |
| | | /// </summary> |
| | |
| | | private int _port; |
| | | |
| | | /// <summary> |
| | | /// å½åéè®¯å¨æ¯å¦å·²è¿æ¥å°PLCã |
| | | /// å½åéè®¯å¨æ¯å¦å·²è¿æ¥å°PLCã |
| | | /// </summary> |
| | | private bool _connected; |
| | | |
| | |
| | | private ILogNet _logNet; |
| | | |
| | | private bool _isPing = true; |
| | | |
| | | #endregion Private Member |
| | | |
| | | #region Public Member |
| | | /// <summary> |
| | | /// è·åå½åéè®¯å¨æ¯å¦å·²è¿æ¥å°PLCã |
| | | |
| | | /// <summary> |
| | | /// è·åå½åéè®¯å¨æ¯å¦å·²è¿æ¥å°PLCã |
| | | /// </summary> |
| | | public override bool IsConnected => _connected; |
| | | |
| | |
| | | /// <summary> |
| | | /// æ¯å¦å¨åå
¥æ°æ®åè¯»åæ°æ®ç¡®è®¤ã |
| | | /// </summary> |
| | | public override bool IsReadAfterWrite { get; set; } = false; |
| | | public override bool IsReadAfterWrite { get; set; } = true; |
| | | |
| | | #endregion Public Member |
| | | |
| | | #region Constructor Function |
| | | |
| | | /// <summary> |
| | | /// æé 彿° |
| | | /// </summary> |
| | |
| | | _port = port;//éè¿æé 彿°èµå¼è¿æ¥ä½¿ç¨ç端å£å· |
| | | _name = name; |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | #region Private Method |
| | | |
| | | /// <summary> |
| | | /// ä»OperateResult对象ä¸è·å读åçæ°æ®ã |
| | | /// </summary> |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// |
| | | /// |
| | | /// </summary> |
| | | /// <typeparam name="T"></typeparam> |
| | | /// <param name="operateResult"></param> |
| | |
| | | try |
| | | { |
| | | Type type = value.GetType(); |
| | | |
| | | switch (Type.GetTypeCode(type)) |
| | | { |
| | | case TypeCode.Int32: |
| | | return plc.Write(address, Convert.ToInt32(value)); |
| | | |
| | | case TypeCode.UInt32: |
| | | return plc.Write(address, Convert.ToUInt32(value)); |
| | | |
| | | case TypeCode.Int16: |
| | | return plc.Write(address, Convert.ToInt16(value)); |
| | | |
| | | case TypeCode.UInt16: |
| | | return plc.Write(address, Convert.ToUInt16(value)); |
| | | |
| | | case TypeCode.Single: |
| | | return plc.Write(address, Convert.ToSingle(value)); |
| | | |
| | | case TypeCode.Boolean: |
| | | return plc.Write(address, Convert.ToBoolean(value)); |
| | | |
| | | case TypeCode.Byte: |
| | | return plc.Write(address, Convert.ToByte(value)); |
| | | |
| | | case TypeCode.String: |
| | | return plc.Write(address, Convert.ToString(value)); |
| | | |
| | | case TypeCode.Char: |
| | | return plc.Write(address, Convert.ToChar(value)); |
| | | //case TypeCode.arr: |
| | |
| | | return (int[])GetContent(plc.ReadInt32(address, length), address); |
| | | else |
| | | return (int)GetContent(plc.ReadInt32(address), address); |
| | | |
| | | case TypeCode.UInt32: |
| | | if (length > 1) |
| | | return (uint[])GetContent(plc.ReadUInt32(address, length), address); |
| | | else |
| | | return (uint)GetContent(plc.ReadUInt32(address), address); |
| | | |
| | | case TypeCode.Int16: |
| | | if (length > 1) |
| | | return (short[])GetContent(plc.ReadInt16(address, length), address); |
| | | else |
| | | return (short)GetContent(plc.ReadInt16(address), address); |
| | | |
| | | case TypeCode.UInt16: |
| | | if (length > 1) |
| | | return (ushort[])GetContent(plc.ReadUInt16(address, length), address); |
| | | else |
| | | return (ushort)GetContent(plc.ReadUInt16(address), address); |
| | | |
| | | case TypeCode.Single: |
| | | if (length > 1) |
| | | return (float[])GetContent(plc.ReadFloat(address, length), address); |
| | | else |
| | | return (float)GetContent(plc.ReadFloat(address), address); |
| | | |
| | | case TypeCode.Boolean: |
| | | if (length > 1) |
| | | return (bool[])GetContent(plc.ReadBool(address, length), address); |
| | | else |
| | | return (bool)GetContent(plc.ReadBool(address), address); |
| | | |
| | | case TypeCode.Byte: |
| | | if (length > 1) |
| | | return (byte)GetContent(plc.Read(address, length), address); |
| | | return (byte)GetContent(plc.ReadByte(address), address); |
| | | |
| | | case TypeCode.String: |
| | | if (length > 1) |
| | | return (string)GetContent(plc.ReadString(address, length), address); |
| | | else |
| | | return (string)GetContent(plc.ReadString(address), address); |
| | | |
| | | case TypeCode.Char: |
| | | if (length > 1) |
| | | return Encoding.Default.GetString((byte[])GetContent(plc.Read(address, length), address)).ToArray(); |
| | | return (char)GetContent(plc.ReadByte(address), address); |
| | | |
| | | default: |
| | | throw new CommunicationException(string.Format(CommunicationExceptionMessage.DataTypeErrorException, typeCode.ToString(), address), CommunicationErrorType.TypeError); |
| | | } |
| | |
| | | } |
| | | } |
| | | }); |
| | | |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | #region Public Method |
| | | /// <summary> |
| | | |
| | | /// <summary> |
| | | /// è¿æ¥å°PLCã |
| | | /// </summary> |
| | | /// </summary> |
| | | /// <returns>å¦æè¿æ¥æååè¿åtrueï¼å¦åè¿åfalseã</returns> |
| | | /// <exception cref="CommunicationException">èªå®ä¹é讯å¼å¸¸ç±»</exception> |
| | | public override bool Connect() |
| | |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æå¼ä¸å·¥ä¸è®¾å¤çè¿æ¥ã |
| | | /// </summary> |
| | | /// <returns>妿æåæå¼è¿æ¥åè¿åtrueï¼å¦æå·²ç»æ¯æå¼ç¶æåè¿åfalseã</returns> |
| | | /// <summary> |
| | | /// æå¼ä¸å·¥ä¸è®¾å¤çè¿æ¥ã |
| | | /// </summary> |
| | | /// <returns>妿æåæå¼è¿æ¥åè¿åtrueï¼å¦æå·²ç»æ¯æå¼ç¶æåè¿åfalseã</returns> |
| | | public override bool Disconnect() |
| | | { |
| | | try |
| | |
| | | } |
| | | |
| | | #region Read |
| | | /// <summary> |
| | | /// ä»PLCè¯»åæ°æ®ã |
| | | /// </summary> |
| | | /// <param name="address">æºå°åï¼å
·ä½æ ¼å¼åå³äºä½¿ç¨çå·¥ä¸åè®®ã</param> |
| | | /// <param name="length">è¦è¯»åçæ°æ®é¿åº¦ã</param> |
| | | /// <returns>读åå°çæ°æ®ï¼å¦æè¯»å失败åå¯è½è¿ånullã空æ°ç»ææåºèªå®ä¹é讯å¼å¸¸ã</returns> |
| | | |
| | | /// <summary> |
| | | /// ä»PLCè¯»åæ°æ®ã |
| | | /// </summary> |
| | | /// <param name="address">æºå°åï¼å
·ä½æ ¼å¼åå³äºä½¿ç¨çå·¥ä¸åè®®ã</param> |
| | | /// <param name="length">è¦è¯»åçæ°æ®é¿åº¦ã</param> |
| | | /// <returns>读åå°çæ°æ®ï¼å¦æè¯»å失败åå¯è½è¿ånullã空æ°ç»ææåºèªå®ä¹é讯å¼å¸¸ã</returns> |
| | | /// <exception cref="CommunicationException">èªå®ä¹é讯å¼å¸¸ç±»</exception> |
| | | public override byte[] Read(string address, int length) |
| | | { |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// |
| | | /// |
| | | /// </summary> |
| | | /// <typeparam name="T"></typeparam> |
| | | /// <param name="address"></param> |
| | |
| | | else |
| | | return Read(address, SiemensDBDataType.GetTypeCode(dataType)); |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | #region Write |
| | | |
| | | /// <summary> |
| | | /// åPLCåå
¥æ°æ®ã |
| | | /// </summary> |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// |
| | | /// |
| | | /// </summary> |
| | | /// <typeparam name="T"></typeparam> |
| | | /// <param name="address"></param> |
| | |
| | | { |
| | | return GetResult(Write(address, value), address, value); |
| | | } |
| | | |
| | | |
| | | public override bool Write<T>(string address, T[] values) |
| | | { |
| | |
| | | obj = GetResult(Write(address, writeVal), address, writeVal); |
| | | } |
| | | break; |
| | | |
| | | case SiemensDBDataType.DataType_DW: |
| | | { |
| | | uint writeVal; |
| | |
| | | obj = GetResult(Write(address, writeVal), address, writeVal); |
| | | } |
| | | break; |
| | | |
| | | case SiemensDBDataType.DataType_Int: |
| | | { |
| | | short writeVal; |
| | |
| | | obj = GetResult(Write(address, writeVal), address, writeVal); |
| | | } |
| | | break; |
| | | |
| | | case SiemensDBDataType.DataType_W: |
| | | { |
| | | ushort writeVal; |
| | |
| | | obj = GetResult(Write(address, writeVal), address, writeVal); |
| | | } |
| | | break; |
| | | |
| | | case SiemensDBDataType.DataType_Float: |
| | | { |
| | | float writeVal; |
| | |
| | | obj = GetResult(Write(address, writeVal), address, writeVal); |
| | | } |
| | | break; |
| | | |
| | | case SiemensDBDataType.DataType_Bool: |
| | | { |
| | | bool writeVal; |
| | |
| | | obj = GetResult(Write(address, writeVal), address, writeVal); |
| | | } |
| | | break; |
| | | |
| | | case SiemensDBDataType.DataType_Byte: |
| | | { |
| | | byte writeVal; |
| | |
| | | obj = GetResult(Write(address, writeVal), address, writeVal); |
| | | } |
| | | break; |
| | | |
| | | case SiemensDBDataType.DataType_String: |
| | | { |
| | | string writeVal; |
| | |
| | | } |
| | | |
| | | break; |
| | | |
| | | case SiemensDBDataType.DataType_Char: |
| | | |
| | | break; |
| | |
| | | obj = GetResult(Write(address, writeVal), address, writeVal); |
| | | } |
| | | break; |
| | | |
| | | default: |
| | | throw new CommunicationException(string.Format(CommunicationExceptionMessage.DataTypeErrorException, dataType, address), CommunicationErrorType.TypeError); |
| | | } |
| | | return obj; |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | #region ReadCustomer |
| | | |
| | | /// <summary> |
| | | /// 读åèªå®ä¹çæ°æ®ç±»åï¼éè¦ç»§æ¿èªIDataTransferæ¥å£ï¼è¿åä¸ä¸ªæ°çç±»åçå®ä¾å¯¹è±¡ã |
| | | /// </summary> |
| | |
| | | throw new CommunicationException(ex.Message, CommunicationErrorType.ReadException, innerException: ex); |
| | | } |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | #region WriteCustomer |
| | | |
| | | /// <summary> |
| | | /// åå
¥èªå®ä¹ç±»åçæ°æ®ï¼è¯¥ç±»åå¿
须继æ¿èªIDataTransferæ¥å£ã |
| | | /// </summary> |
| | |
| | | LogNet.WriteInfo(Name, stringBuilder.ToString()); |
| | | } |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | /// <summary> |
| | |
| | | case TypeCode.Int16: |
| | | OperateResult<TimeSpan> operateResultShort = plc.Wait(address, Convert.ToInt16(value), readInterval, waitTimeout); |
| | | return operateResultShort; |
| | | |
| | | case TypeCode.Int32: |
| | | OperateResult<TimeSpan> operateResultInt = plc.Wait(address, Convert.ToInt16(value), readInterval, waitTimeout); |
| | | return operateResultInt; |
| | | |
| | | case TypeCode.UInt16: |
| | | OperateResult<TimeSpan> operateResultUShort = plc.Wait(address, Convert.ToInt16(value), readInterval, waitTimeout); |
| | | return operateResultUShort; |
| | | |
| | | case TypeCode.UInt32: |
| | | OperateResult<TimeSpan> operateResultUInt = plc.Wait(address, Convert.ToInt16(value), readInterval, waitTimeout); |
| | | return operateResultUInt; |
| | | |
| | | default: |
| | | throw new NotSupportedException(); |
| | | } |
| | | } |
| | | |
| | | #endregion |
| | | |
| | | #region Destruction Function |
| | | |
| | | /// <summary> |
| | | /// ææå½æ°ï¼ç¡®ä¿å¨ä¸åéè¦æ¶å
³éè¿æ¥ |
| | | /// ææå½æ°ï¼ç¡®ä¿å¨ä¸åéè¦æ¶å
³éè¿æ¥ |
| | | /// </summary> |
| | | ~SiemensS7() |
| | | { |
| | | Dispose(); |
| | | } |
| | | |
| | | #endregion |
| | | } |
| | | } |
| | | } |
| | |
| | | #region << ç æ¬ 注 é >> |
| | | |
| | | /*---------------------------------------------------------------- |
| | | * å½å空é´ï¼WIDESEAWCS_TaskInfoService |
| | | * å建è
ï¼è¡ç«¥åº |
| | | * å建æ¶é´ï¼2024/8/2 16:13:36 |
| | | * çæ¬ï¼V1.0.0 |
| | | * æè¿°ï¼ |
| | | * |
| | | * ---------------------------------------------------------------- |
| | | * ä¿®æ¹äººï¼ |
| | | * ä¿®æ¹æ¶é´ï¼ |
| | | * çæ¬ï¼V1.0.1 |
| | | * ä¿®æ¹è¯´æï¼ |
| | | * |
| | | *----------------------------------------------------------------*/ |
| | | |
| | | #endregion << ç æ¬ 注 é >> |
| | | |
| | | using MapsterMapper; |
| | | using Microsoft.Extensions.Configuration; |
| | | using Newtonsoft.Json; |
| | | using Serilog; |
| | | using SqlSugar; |
| | | using System.Diagnostics; |
| | | using System.Diagnostics.CodeAnalysis; |
| | | using WIDESEA_Core; |
| | | using WIDESEAWCS_Common.HttpEnum; |
| | | using WIDESEAWCS_Common.TaskEnum; |
| | | using WIDESEAWCS_Core; |
| | | using WIDESEAWCS_Core.BaseServices; |
| | | using WIDESEAWCS_Core.Enums; |
| | | using WIDESEAWCS_Core.Helper; |
| | | using WIDESEAWCS_Core.Utilities; |
| | | using WIDESEAWCS_DTO.Stock; |
| | | using WIDESEAWCS_DTO.TaskInfo; |
| | | using WIDESEAWCS_ITaskInfoRepository; |
| | | using WIDESEAWCS_ITaskInfoService; |
| | | using WIDESEAWCS_Model.Models; |
| | | using WIDESEAWCS_QuartzJob; |
| | | using WIDESEAWCS_QuartzJob.DTO; |
| | | using WIDESEAWCS_Tasks; |
| | | |
| | | namespace WIDESEAWCS_TaskInfoService |
| | | { |
| | | public class RobotTaskService : ServiceBase<Dt_RobotTask, IRobotTaskRepository>, IRobotTaskService |
| | | { |
| | | private readonly IMapper _mapper; |
| | | private readonly HttpClientHelper _httpClientHelper; |
| | | private readonly ITaskExecuteDetailService _taskExecuteDetailService; |
| | | private readonly ILogger _logger; |
| | | |
| | | private Dictionary<string, OrderByType> _taskOrderBy = new() |
| | | { |
| | | {nameof(Dt_RobotTask.RobotGrade),OrderByType.Desc }, |
| | | {nameof(Dt_RobotTask.CreateDate),OrderByType.Asc}, |
| | | }; |
| | | |
| | | public Dictionary<string, OrderByType> TaskOrderBy |
| | | { get { return _taskOrderBy; } set { _taskOrderBy = value; } } |
| | | |
| | | public List<int> TaskInboundTypes => typeof(TaskInboundTypeEnum).GetEnumIndexList(); |
| | | |
| | | public List<int> TaskOutboundTypes => typeof(TaskOutboundTypeEnum).GetEnumIndexList(); |
| | | |
| | | public List<int> TaskRobotTypes => typeof(TaskOtherTypeEnum).GetEnumIndexList(); |
| | | |
| | | public RobotTaskService(IRobotTaskRepository BaseDal, IMapper mapper, HttpClientHelper httpClientHelper, ITaskExecuteDetailService taskExecuteDetailService, ILogger logger) : base(BaseDal) |
| | | { |
| | | _mapper = mapper; |
| | | _httpClientHelper = httpClientHelper; |
| | | _taskExecuteDetailService = taskExecuteDetailService; |
| | | _logger = logger; |
| | | #region << ç æ¬ 注 é >>
|
| | |
|
| | | /*----------------------------------------------------------------
|
| | | * å½å空é´ï¼WIDESEAWCS_TaskInfoService
|
| | | * å建è
ï¼è¡ç«¥åº
|
| | | * å建æ¶é´ï¼2024/8/2 16:13:36
|
| | | * çæ¬ï¼V1.0.0
|
| | | * æè¿°ï¼
|
| | | *
|
| | | * ----------------------------------------------------------------
|
| | | * ä¿®æ¹äººï¼
|
| | | * ä¿®æ¹æ¶é´ï¼
|
| | | * çæ¬ï¼V1.0.1
|
| | | * ä¿®æ¹è¯´æï¼
|
| | | *
|
| | | *----------------------------------------------------------------*/
|
| | |
|
| | | #endregion << ç æ¬ 注 é >>
|
| | |
|
| | | using MapsterMapper;
|
| | | using Microsoft.Extensions.Configuration;
|
| | | using Newtonsoft.Json;
|
| | | using Serilog;
|
| | | using SqlSugar;
|
| | | using System.Diagnostics;
|
| | | using System.Diagnostics.CodeAnalysis;
|
| | | using WIDESEA_Core;
|
| | | using WIDESEAWCS_Common;
|
| | | using WIDESEAWCS_Common.HttpEnum;
|
| | | using WIDESEAWCS_Common.TaskEnum;
|
| | | using WIDESEAWCS_Core;
|
| | | using WIDESEAWCS_Core.BaseServices;
|
| | | using WIDESEAWCS_Core.Enums;
|
| | | using WIDESEAWCS_Core.Helper;
|
| | | using WIDESEAWCS_Core.Utilities;
|
| | | using WIDESEAWCS_DTO.Stock;
|
| | | using WIDESEAWCS_DTO.TaskInfo;
|
| | | using WIDESEAWCS_ITaskInfoRepository;
|
| | | using WIDESEAWCS_ITaskInfoService;
|
| | | using WIDESEAWCS_Model.Models;
|
| | | using WIDESEAWCS_QuartzJob;
|
| | | using WIDESEAWCS_QuartzJob.DTO;
|
| | | using WIDESEAWCS_Tasks;
|
| | |
|
| | | namespace WIDESEAWCS_TaskInfoService
|
| | | {
|
| | | public class RobotTaskService : ServiceBase<Dt_RobotTask, IRobotTaskRepository>, IRobotTaskService
|
| | | {
|
| | | private readonly IMapper _mapper;
|
| | | private readonly HttpClientHelper _httpClientHelper;
|
| | | private readonly ITaskExecuteDetailService _taskExecuteDetailService;
|
| | | private readonly ILogger _logger;
|
| | |
|
| | | private Dictionary<string, OrderByType> _taskOrderBy = new()
|
| | | {
|
| | | {nameof(Dt_RobotTask.RobotGrade),OrderByType.Desc },
|
| | | {nameof(Dt_RobotTask.CreateDate),OrderByType.Asc},
|
| | | };
|
| | |
|
| | | public Dictionary<string, OrderByType> TaskOrderBy
|
| | | { get { return _taskOrderBy; } set { _taskOrderBy = value; } }
|
| | |
|
| | | public List<int> TaskInboundTypes => typeof(TaskInboundTypeEnum).GetEnumIndexList();
|
| | |
|
| | | public List<int> TaskOutboundTypes => typeof(TaskOutboundTypeEnum).GetEnumIndexList();
|
| | |
|
| | | public List<int> TaskRobotTypes => typeof(TaskOtherTypeEnum).GetEnumIndexList();
|
| | |
|
| | | public RobotTaskService(IRobotTaskRepository BaseDal, IMapper mapper, HttpClientHelper httpClientHelper, ITaskExecuteDetailService taskExecuteDetailService, ILogger logger) : base(BaseDal)
|
| | | {
|
| | | _mapper = mapper;
|
| | | _httpClientHelper = httpClientHelper;
|
| | | _taskExecuteDetailService = taskExecuteDetailService;
|
| | | _logger = logger;
|
| | | }
|
| | | public override WebResponseContent DeleteData(object[] keys)
|
| | | {
|
| | |
| | | return WebResponseContent.Instance.OK($"æåå é¤{tasks.Count}æ¡æ°æ®");
|
| | |
|
| | | }
|
| | | public bool DeleteRobotTask(int id) |
| | | { |
| | | Dt_RobotTask task = BaseDal.QueryFirst(x => x.RobotTaskId == id); |
| | | return BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.èªå¨å®æ); |
| | | } |
| | | |
| | | public WebResponseContent ReceiveWMSTask([NotNull] WMSTaskDTO taskDTO, StockDTO stockDTO) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | | { |
| | | if (BaseDal.QueryFirst(x => x.RobotTaskNum == taskDTO.TaskNum || x.RobotSourceAddressPalletCode == taskDTO.PalletCode) != null) |
| | | { |
| | | return content.Error("ä»»å¡å·²åå¨"); |
| | | } |
| | | |
| | | Dt_RobotTask task = new Dt_RobotTask |
| | | { |
| | | RobotTaskNum = taskDTO.TaskNum, |
| | | RobotSourceAddressLineCode = stockDTO?.SourceLineNo ?? string.Empty, |
| | | RobotTargetAddressLineCode = stockDTO?.TargetLineNo ?? string.Empty, |
| | | RobotRoadway = stockDTO?.Roadway ?? string.Empty, |
| | | RobotSourceAddress = taskDTO.SourceAddress, |
| | | RobotTargetAddress = taskDTO.TargetAddress, |
| | | RobotSourceAddressPalletCode = stockDTO?.SourcePalletNo ?? string.Empty, |
| | | RobotTargetAddressPalletCode = stockDTO?.TargetPalletNo ?? string.Empty, |
| | | RobotTaskType = taskDTO.TaskType, |
| | | RobotTaskState = taskDTO.TaskStatus, |
| | | RobotGrade = taskDTO.Grade, |
| | | Creater = "WMS", |
| | | RobotTaskTotalNum = taskDTO.TaskQuantity, |
| | | }; |
| | | |
| | | BaseDal.AddData(task); |
| | | |
| | | _taskExecuteDetailService.AddTaskExecuteDetail(new List<int> { task.RobotTaskNum }, "æ¥æ¶WMSä»»å¡"); |
| | | |
| | | content = WebResponseContent.Instance.OK("æå", task); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | content = WebResponseContent.Instance.Error($"任塿¥æ¶é误,é误信æ¯:{ex.Message}"); |
| | | } |
| | | return content; |
| | | } |
| | | |
| | | public Dt_RobotTask? QueryRobotCraneTask(string deviceCode) |
| | | { |
| | | return BaseDal.QueryFirst(x => x.RobotRoadway == deviceCode && x.RobotTaskState != (int)TaskRobotStatusEnum.RobotExecuting, TaskOrderBy); |
| | | } |
| | | |
| | | public Dt_RobotTask? QueryRobotCraneExecutingTask(string deviceCode) |
| | | { |
| | | return BaseDal.QueryFirst(x => x.RobotRoadway == deviceCode && x.RobotTaskState == (int)TaskRobotStatusEnum.RobotExecuting, TaskOrderBy); |
| | | } |
| | | |
| | | public async Task<bool> UpdateRobotTaskAsync(Dt_RobotTask robotTask) |
| | | { |
| | | return await BaseDal.UpdateDataAsync(robotTask); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è·åWMSç³»ç»æºæ¢°æä»»å¡ |
| | | /// </summary> |
| | | /// <param name="task"></param> |
| | | /// <returns></returns> |
| | | public WebResponseContent GetWMSRobotTask(Dt_Task task) |
| | | { |
| | | string configKey = ResolveRobotTaskConfigKey(task.TargetAddress); |
| | | StockDTO stock = BuildRobotTaskStock(task, configKey); |
| | | string requestParam = stock.ToJson(); |
| | | var stopwatch = Stopwatch.StartNew(); |
| | | |
| | | var result = _httpClientHelper.Post<WebResponseContent>(configKey, requestParam); |
| | | stopwatch.Stop(); |
| | | if (!result.IsSuccess || !result.Data.Status) |
| | | { |
| | | QuartzLogHelper.LogError(_logger, $"è°ç¨WMSæ¥å£å¤±è´¥,æ¥å£:ã{configKey}ã,请æ±åæ°:ã{requestParam}ã,é误信æ¯:ã{result.Data?.Message}ã", "RobotTaskService"); |
| | | return WebResponseContent.Instance.Error($"è·åWMSç³»ç»æºæ¢°æä»»å¡å¤±è´¥,ä»»å¡å·:ã{task.TaskNum}ã,æçå·:ã{task.PalletCode}ã,ç®æ å°å:ã{task.TargetAddress}ã,æ¥å£:ã{configKey}ã,é误信æ¯:ã{result.Data?.Message}ã"); |
| | | } |
| | | |
| | | QuartzLogHelper.LogInfo(_logger, $"è°ç¨WMSæ¥å£æå,æ¥å£:ã{configKey}ã,ååºæ°æ®:ã{result.Data?.Data}ã,èæ¶:{stopwatch.ElapsedMilliseconds}ms", "RobotTaskService"); |
| | | |
| | | var wMSTask = JsonConvert.DeserializeObject<WMSTaskDTO>(result?.Data?.Data?.ToString() ?? string.Empty); |
| | | if (wMSTask == null) |
| | | return WebResponseContent.Instance.Error($"è·åWMSç³»ç»æºæ¢°æä»»å¡å¤±è´¥,ä»»å¡å·:ã{task.TaskNum}ã,æçå·:ã{task.PalletCode}ã,é误信æ¯:ãWMSæªè¿åææä»»å¡æ°æ®ã"); |
| | | |
| | | return ReceiveWMSTask(wMSTask, stock); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 卿¬å°ç´æ¥åå»ºæºæ¢°æä»»å¡ï¼ä¸è°ç¨WMSæ¥å£ã |
| | | /// æ ¹æ®ç®æ å°åè§£æä»»å¡ç±»åï¼æå»ºä»»å¡æ°æ®å¹¶åå
¥æ°æ®åºã |
| | | /// </summary> |
| | | /// <param name="task">åºåºä»»å¡å®ä½</param> |
| | | /// <returns>æä½ç»æ</returns> |
| | | public WebResponseContent CreateLocalRobotTask(Dt_Task task) |
| | | { |
| | | WebResponseContent content = new(); |
| | | try |
| | | { |
| | | // æ ¹æ®ç®æ å°åè§£æä»»å¡ç±»åé
ç½®é® |
| | | string configKey = ResolveRobotTaskConfigKey(task.TargetAddress); |
| | | |
| | | // æå»ºStockæ°æ® |
| | | StockDTO stock = BuildRobotTaskStock(task, configKey); |
| | | |
| | | // è·åæååæ¾ç½®å°åç线ä½é
ç½®ï¼å¦ææï¼ |
| | | var section = App.Configuration.GetSection("RobotAddressRules").GetSection(stock?.TargetLineNo ?? string.Empty).GetChildren().Select(c => c.Value).ToArray(); |
| | | if (section.Length < 2) |
| | | return WebResponseContent.Instance.Error($"æªæ¾å°çº¿ä½[{stock?.TargetLineNo}]çå°åé
ç½®"); |
| | | |
| | | int taskType = MapConfigKeyToRobotTaskType(configKey); |
| | | // å建æ¬å°æºå¨äººä»»å¡ |
| | | Dt_RobotTask robotTask = new() |
| | | { |
| | | RobotTaskNum = Random.Shared.Next(), |
| | | RobotSourceAddress = section[0]!, |
| | | RobotTargetAddress = section[1]!, |
| | | RobotSourceAddressLineCode = stock?.SourceLineNo ?? string.Empty, |
| | | RobotTargetAddressLineCode = stock?.TargetLineNo ?? string.Empty, |
| | | RobotRoadway = stock?.TargetLineNo == "11068" ? "注液ç»çæºæ¢°æ" : "æ¢çæºæ¢°æ" ?? string.Empty, // todo |
| | | RobotSourceAddressPalletCode = stock?.SourcePalletNo ?? string.Empty, |
| | | RobotTargetAddressPalletCode = stock?.TargetPalletNo ?? string.Empty, |
| | | RobotTaskType = taskType, |
| | | RobotTaskState = (int)TaskRobotStatusEnum.RobotNew, |
| | | RobotGrade = task.Grade, |
| | | Creater = "WCS_Local", |
| | | RobotTaskTotalNum = taskType == (int)RobotTaskTypeEnum.GroupPallet ? 48 : 1, |
| | | CreateDate = DateTime.Now |
| | | }; |
| | | |
| | | BaseDal.AddData(robotTask); |
| | | |
| | | _taskExecuteDetailService.AddTaskExecuteDetail(new List<int> { robotTask.RobotTaskNum }, "æ¬å°å建æºå¨äººä»»å¡"); |
| | | |
| | | QuartzLogHelper.LogInfo(_logger, $"æ¬å°å建æºå¨äººä»»å¡æå,ä»»å¡å·:ã{robotTask.RobotTaskNum}ã,æºå°å:ã{robotTask.RobotSourceAddress}ã,ç®æ å°å:ã{robotTask.RobotTargetAddress}ã,ä»»å¡ç±»å:ã{configKey}ã", "RobotTaskService"); |
| | | |
| | | content = WebResponseContent.Instance.OK("æ¬å°å建æºå¨äººä»»å¡æå", robotTask); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | QuartzLogHelper.LogError(_logger, $"æ¬å°å建æºå¨äººä»»å¡å¤±è´¥,ä»»å¡å·:ã{task.TaskNum}ã,é误信æ¯:{ex.Message}", "RobotTaskService"); |
| | | content = WebResponseContent.Instance.Error($"æ¬å°å建æºå¨äººä»»å¡å¤±è´¥,é误信æ¯:{ex.Message}"); |
| | | } |
| | | return content; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å°é
ç½®é®æ å°å°æºæ¢°æä»»å¡ç±»åæä¸¾å¼ã |
| | | /// </summary> |
| | | /// <param name="configKey">é
ç½®é®åç§°</param> |
| | | /// <returns>ä»»å¡ç±»åæä¸¾å¼</returns> |
| | | public int MapConfigKeyToRobotTaskType(string? configKey) |
| | | { |
| | | return configKey switch |
| | | { |
| | | nameof(ConfigKey.CreateRobotGroupPalletTask) => (int)RobotTaskTypeEnum.GroupPallet, |
| | | nameof(ConfigKey.CreateRobotSplitPalletTask) => (int)RobotTaskTypeEnum.SplitPallet, |
| | | _ => (int)RobotTaskTypeEnum.ChangePallet |
| | | }; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®è¾éçº¿ç®æ å°åè§£ææºæ¢°æä»»å¡æ¥å£ã |
| | | /// è§åï¼ |
| | | /// 1. ä»é
置读å精确å°åæ å°ï¼AddressMapï¼ |
| | | /// 2. æªå½ä¸æ¶é»è®¤æ¢ç |
| | | /// </summary> |
| | | public string ResolveRobotTaskConfigKey(string? targetAddress) |
| | | { |
| | | string address = (targetAddress ?? string.Empty).Trim(); |
| | | if (string.IsNullOrWhiteSpace(address)) |
| | | return nameof(ConfigKey.CreateRobotChangePalletTask); |
| | | |
| | | var section = App.Configuration.GetSection("RobotTaskAddressRules"); |
| | | var addressMap = ReadRobotRuleMap(section.GetSection("AddressMap")); |
| | | if (addressMap.TryGetValue(address, out string? exactTaskType)) |
| | | return MapRobotTaskTypeToConfigKey(exactTaskType); |
| | | |
| | | return nameof(ConfigKey.CreateRobotChangePalletTask); |
| | | } |
| | | |
| | | public int MapWarehouseIdConfigKey(string? targetAddress) |
| | | { |
| | | return targetAddress switch |
| | | { |
| | | "11068" => 1, |
| | | "11001" => 3, |
| | | "11010" => 3, |
| | | "10010" => 1, |
| | | "10030" => 1, |
| | | _ => 1 |
| | | }; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å°é
置任å¡ç±»å转æ¢ä¸ºæ¥å£é
ç½®é®ã |
| | | /// æ¯æå¼ï¼Split/Group/Changeï¼å¤§å°å䏿æï¼ |
| | | /// </summary> |
| | | public string MapRobotTaskTypeToConfigKey(string? taskType) |
| | | { |
| | | string type = (taskType ?? string.Empty).Trim().ToLowerInvariant(); |
| | | return type switch |
| | | { |
| | | "split" => nameof(ConfigKey.CreateRobotSplitPalletTask), |
| | | "group" => nameof(ConfigKey.CreateRobotGroupPalletTask), |
| | | _ => nameof(ConfigKey.CreateRobotChangePalletTask) |
| | | }; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®æ¥å£ç±»åæå»ºæºæ¢°æä»»å¡å
¥åã |
| | | /// </summary> |
| | | public StockDTO BuildRobotTaskStock(Dt_Task task, string configKey) |
| | | { |
| | | string targetAddress = task.TargetAddress ?? string.Empty; |
| | | string roadway = ResolveRobotRuleValue(targetAddress, "AddressRoadwayMap", task.Roadway); |
| | | string sourceLineNo = ResolveRobotRuleValue(targetAddress, "AddressSourceLineNoMap", task.SourceAddress); |
| | | |
| | | var stock = new StockDTO |
| | | { |
| | | Roadway = roadway, |
| | | SourceLineNo = sourceLineNo, |
| | | TargetLineNo = task.TargetAddress, |
| | | SourcePalletNo = task.PalletCode, |
| | | TargetPalletNo = task.PalletCode |
| | | }; |
| | | |
| | | if (configKey == nameof(ConfigKey.CreateRobotSplitPalletTask)) |
| | | { |
| | | stock.TargetPalletNo = string.Empty; |
| | | } |
| | | else if (configKey == nameof(ConfigKey.CreateRobotGroupPalletTask)) |
| | | { |
| | | stock.SourcePalletNo = string.Empty; |
| | | } |
| | | else if (configKey == nameof(ConfigKey.CreateRobotChangePalletTask)) |
| | | { |
| | | IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceProDTOs.Any(d => d.DeviceChildCode == sourceLineNo)); |
| | | if (device != null) |
| | | { |
| | | CommonConveyorLine conveyorLine = (CommonConveyorLine)device; |
| | | |
| | | DeviceProDTO? devicePro = conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(ConveyorLineDBNameNew.Barcode) && x.DeviceChildCode == sourceLineNo); |
| | | //ConveyorLineTaskCommandNew command = conveyorLine.ReadCustomer<ConveyorLineTaskCommandNew>(sourceLineNo); // æµè¯ç¨ |
| | | var barcode = conveyorLine.GetValue<ConveyorLineDBNameNew, string>(ConveyorLineDBNameNew.Barcode, sourceLineNo); |
| | | stock.SourcePalletNo = string.IsNullOrEmpty(barcode) ? string.Empty : barcode; |
| | | } |
| | | } |
| | | |
| | | return stock; |
| | | } |
| | | |
| | | public override WebResponseContent AddData(SaveModel saveModel) |
| | | { |
| | | try |
| | | { |
| | | if (saveModel == null || saveModel.MainData == null || saveModel.MainData.Count == 0) |
| | | { |
| | | return WebResponseContent.Instance.Error("ä¼ åé误,åæ°ä¸è½ä¸ºç©º"); |
| | | } |
| | | |
| | | string validResult = typeof(Dt_RobotTask).ValidateDicInEntity(saveModel.MainData, true, TProperties); |
| | | if (!string.IsNullOrEmpty(validResult)) |
| | | { |
| | | return WebResponseContent.Instance.Error(validResult); |
| | | } |
| | | |
| | | object? taskNumObj = saveModel.MainData[nameof(Dt_RobotTask.RobotTaskNum)]; |
| | | if (taskNumObj != null) |
| | | { |
| | | int taskNum = Convert.ToInt32(taskNumObj); |
| | | if (BaseDal.QueryFirst(x => x.RobotTaskNum == taskNum) != null) |
| | | { |
| | | return WebResponseContent.Instance.Error($"ä»»å¡ç¼å· {taskNum} å·²åå¨"); |
| | | } |
| | | } |
| | | |
| | | Dt_RobotTask entity = saveModel.MainData.DicToModel<Dt_RobotTask>(); |
| | | entity.Creater = "æå¨å建"; |
| | | entity.CreateDate = DateTime.Now; |
| | | |
| | | if (saveModel.DetailData == null || saveModel.DetailData.Count == 0) |
| | | { |
| | | BaseDal.AddData(entity); |
| | | return WebResponseContent.Instance.OK("æ°å¢æå", entity); |
| | | } |
| | | |
| | | return base.AddData(saveModel); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | return WebResponseContent.Instance.Error($"æ°å¢å¤±è´¥,é误信æ¯:{ex.Message}"); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®ç®æ å°åæã精确 > åéå¼ãè§£æè§åå¼ã |
| | | /// </summary> |
| | | public string ResolveRobotRuleValue(string? targetAddress, string addressSectionName, string? fallback) |
| | | { |
| | | string address = (targetAddress ?? string.Empty).Trim(); |
| | | string defaultValue = fallback ?? string.Empty; |
| | | if (string.IsNullOrWhiteSpace(address)) |
| | | return defaultValue; |
| | | |
| | | var section = App.Configuration.GetSection("RobotTaskAddressRules"); |
| | | var addressMap = ReadRobotRuleMap(section.GetSection(addressSectionName)); |
| | | if (addressMap.TryGetValue(address, out string? value)) |
| | | return value; |
| | | |
| | | return defaultValue; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 读åè§åæ å°æ®µã |
| | | /// </summary> |
| | | private Dictionary<string, string> ReadRobotRuleMap(IConfigurationSection section) |
| | | { |
| | | return section |
| | | .GetChildren() |
| | | .Where(x => !string.IsNullOrWhiteSpace(x.Key) && !string.IsNullOrWhiteSpace(x.Value)) |
| | | .ToDictionary(x => x.Key.Trim(), x => x.Value!.Trim()); |
| | | } |
| | | } |
| | | public bool DeleteRobotTask(int id)
|
| | | {
|
| | | Dt_RobotTask task = BaseDal.QueryFirst(x => x.RobotTaskId == id);
|
| | | return BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.èªå¨å®æ);
|
| | | }
|
| | |
|
| | | public WebResponseContent ReceiveWMSTask([NotNull] WMSTaskDTO taskDTO, StockDTO stockDTO)
|
| | | {
|
| | | WebResponseContent content = new WebResponseContent();
|
| | | try
|
| | | {
|
| | | if (BaseDal.QueryFirst(x => x.RobotTaskNum == taskDTO.TaskNum || x.RobotSourceAddressPalletCode == taskDTO.PalletCode) != null)
|
| | | {
|
| | | return content.Error("ä»»å¡å·²åå¨");
|
| | | }
|
| | |
|
| | | Dt_RobotTask task = new Dt_RobotTask
|
| | | {
|
| | | RobotTaskNum = taskDTO.TaskNum,
|
| | | RobotSourceAddressLineCode = stockDTO?.SourceLineNo ?? string.Empty,
|
| | | RobotTargetAddressLineCode = stockDTO?.TargetLineNo ?? string.Empty,
|
| | | RobotRoadway = stockDTO?.Roadway ?? string.Empty,
|
| | | RobotSourceAddress = taskDTO.SourceAddress,
|
| | | RobotTargetAddress = taskDTO.TargetAddress,
|
| | | RobotSourceAddressPalletCode = stockDTO?.SourcePalletNo ?? string.Empty,
|
| | | RobotTargetAddressPalletCode = stockDTO?.TargetPalletNo ?? string.Empty,
|
| | | RobotTaskType = taskDTO.TaskType,
|
| | | RobotTaskState = taskDTO.TaskStatus,
|
| | | RobotGrade = taskDTO.Grade,
|
| | | Creater = "WMS",
|
| | | RobotTaskTotalNum = taskDTO.TaskQuantity,
|
| | | };
|
| | |
|
| | | BaseDal.AddData(task);
|
| | |
|
| | | _taskExecuteDetailService.AddTaskExecuteDetail(new List<int> { task.RobotTaskNum }, "æ¥æ¶WMSä»»å¡");
|
| | |
|
| | | content = WebResponseContent.Instance.OK("æå", task);
|
| | | }
|
| | | catch (Exception ex)
|
| | | {
|
| | | content = WebResponseContent.Instance.Error($"任塿¥æ¶é误,é误信æ¯:{ex.Message}");
|
| | | }
|
| | | return content;
|
| | | }
|
| | |
|
| | | public Dt_RobotTask? QueryRobotCraneTask(string deviceCode)
|
| | | {
|
| | | return BaseDal.QueryFirst(x => x.RobotRoadway == deviceCode && x.RobotTaskState != (int)TaskRobotStatusEnum.RobotExecuting, TaskOrderBy);
|
| | | }
|
| | |
|
| | | public Dt_RobotTask? QueryRobotCraneExecutingTask(string deviceCode)
|
| | | {
|
| | | return BaseDal.QueryFirst(x => x.RobotRoadway == deviceCode && x.RobotTaskState == (int)TaskRobotStatusEnum.RobotExecuting, TaskOrderBy);
|
| | | }
|
| | |
|
| | | public async Task<bool> UpdateRobotTaskAsync(Dt_RobotTask robotTask)
|
| | | {
|
| | | return await BaseDal.UpdateDataAsync(robotTask);
|
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// è·åWMSç³»ç»æºæ¢°æä»»å¡
|
| | | /// </summary>
|
| | | /// <param name="task"></param>
|
| | | /// <returns></returns>
|
| | | public WebResponseContent GetWMSRobotTask(Dt_Task task)
|
| | | {
|
| | | string configKey = ResolveRobotTaskConfigKey(task.TargetAddress);
|
| | | StockDTO stock = BuildRobotTaskStock(task, configKey);
|
| | | string requestParam = stock.ToJson();
|
| | | var stopwatch = Stopwatch.StartNew();
|
| | |
|
| | | var result = _httpClientHelper.Post<WebResponseContent>(configKey, requestParam);
|
| | | stopwatch.Stop();
|
| | | if (!result.IsSuccess || !result.Data.Status)
|
| | | {
|
| | | QuartzLogHelper.LogError(_logger, $"è°ç¨WMSæ¥å£å¤±è´¥,æ¥å£:ã{configKey}ã,请æ±åæ°:ã{requestParam}ã,é误信æ¯:ã{result.Data?.Message}ã", "RobotTaskService");
|
| | | return WebResponseContent.Instance.Error($"è·åWMSç³»ç»æºæ¢°æä»»å¡å¤±è´¥,ä»»å¡å·:ã{task.TaskNum}ã,æçå·:ã{task.PalletCode}ã,ç®æ å°å:ã{task.TargetAddress}ã,æ¥å£:ã{configKey}ã,é误信æ¯:ã{result.Data?.Message}ã");
|
| | | }
|
| | |
|
| | | QuartzLogHelper.LogInfo(_logger, $"è°ç¨WMSæ¥å£æå,æ¥å£:ã{configKey}ã,ååºæ°æ®:ã{result.Data?.Data}ã,èæ¶:{stopwatch.ElapsedMilliseconds}ms", "RobotTaskService");
|
| | |
|
| | | var wMSTask = JsonConvert.DeserializeObject<WMSTaskDTO>(result?.Data?.Data?.ToString() ?? string.Empty);
|
| | | if (wMSTask == null)
|
| | | return WebResponseContent.Instance.Error($"è·åWMSç³»ç»æºæ¢°æä»»å¡å¤±è´¥,ä»»å¡å·:ã{task.TaskNum}ã,æçå·:ã{task.PalletCode}ã,é误信æ¯:ãWMSæªè¿åææä»»å¡æ°æ®ã");
|
| | |
|
| | | return ReceiveWMSTask(wMSTask, stock);
|
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// 卿¬å°ç´æ¥åå»ºæºæ¢°æä»»å¡ï¼ä¸è°ç¨WMSæ¥å£ã
|
| | | /// æ ¹æ®ç®æ å°åè§£æä»»å¡ç±»åï¼æå»ºä»»å¡æ°æ®å¹¶åå
¥æ°æ®åºã
|
| | | /// </summary>
|
| | | /// <param name="task">åºåºä»»å¡å®ä½</param>
|
| | | /// <returns>æä½ç»æ</returns>
|
| | | public WebResponseContent CreateLocalRobotTask(Dt_Task task)
|
| | | {
|
| | | WebResponseContent content = new();
|
| | | try
|
| | | {
|
| | | // æ ¹æ®ç®æ å°åè§£æä»»å¡ç±»åé
ç½®é®
|
| | | string configKey = ResolveRobotTaskConfigKey(task.TargetAddress);
|
| | |
|
| | | // æå»ºStockæ°æ®
|
| | | StockDTO stock = BuildRobotTaskStock(task, configKey);
|
| | |
|
| | | // è·åæååæ¾ç½®å°åç线ä½é
ç½®ï¼å¦ææï¼
|
| | | var section = App.Configuration.GetSection("RobotAddressRules").GetSection(stock?.TargetLineNo ?? string.Empty).GetChildren().Select(c => c.Value).ToArray();
|
| | | if (section.Length < 2)
|
| | | return WebResponseContent.Instance.Error($"æªæ¾å°çº¿ä½[{stock?.TargetLineNo}]çå°åé
ç½®");
|
| | |
|
| | | int taskType = MapConfigKeyToRobotTaskType(configKey);
|
| | | // å建æ¬å°æºå¨äººä»»å¡
|
| | | Dt_RobotTask robotTask = new()
|
| | | {
|
| | | RobotTaskNum = Random.Shared.Next(),
|
| | | RobotSourceAddress = section[0]!,
|
| | | RobotTargetAddress = section[1]!,
|
| | | RobotSourceAddressLineCode = stock?.SourceLineNo ?? string.Empty,
|
| | | RobotTargetAddressLineCode = stock?.TargetLineNo ?? string.Empty,
|
| | | RobotRoadway = stock?.TargetLineNo switch
|
| | | {
|
| | | "11068" => "注液ç»çæºæ¢°æ",
|
| | | "1000" => "æçæºæ¢°æ",
|
| | | "2000" => "æåç»çæºæ¢°æ",
|
| | | _ => "æ¢çæºæ¢°æ"
|
| | | },
|
| | | RobotSourceAddressPalletCode = stock?.SourcePalletNo ?? string.Empty,
|
| | | RobotTargetAddressPalletCode = stock?.TargetPalletNo ?? string.Empty,
|
| | | RobotTaskType = taskType,
|
| | | RobotTaskState = (int)TaskRobotStatusEnum.RobotNew,
|
| | | RobotGrade = task.Grade,
|
| | | Creater = "WCS_Local",
|
| | | RobotTaskTotalNum = GetRobotTaskTotalNum(taskType, stock.SourcePalletNo),
|
| | | CreateDate = DateTime.Now
|
| | | };
|
| | |
|
| | | BaseDal.AddData(robotTask);
|
| | |
|
| | | _taskExecuteDetailService.AddTaskExecuteDetail(new List<int> { robotTask.RobotTaskNum }, "æ¬å°å建æºå¨äººä»»å¡");
|
| | |
|
| | | QuartzLogHelper.LogInfo(_logger, $"æ¬å°å建æºå¨äººä»»å¡æå,ä»»å¡å·:ã{robotTask.RobotTaskNum}ã,æºå°å:ã{robotTask.RobotSourceAddress}ã,ç®æ å°å:ã{robotTask.RobotTargetAddress}ã,ä»»å¡ç±»å:ã{configKey}ã", "RobotTaskService");
|
| | |
|
| | | content = WebResponseContent.Instance.OK("æ¬å°å建æºå¨äººä»»å¡æå", robotTask);
|
| | | }
|
| | | catch (Exception ex)
|
| | | {
|
| | | QuartzLogHelper.LogError(_logger, $"æ¬å°å建æºå¨äººä»»å¡å¤±è´¥,ä»»å¡å·:ã{task.TaskNum}ã,é误信æ¯:{ex.Message}", "RobotTaskService");
|
| | | content = WebResponseContent.Instance.Error($"æ¬å°å建æºå¨äººä»»å¡å¤±è´¥,é误信æ¯:{ex.Message}");
|
| | | }
|
| | | return content;
|
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// è·åæºæ¢°æä»»å¡æ»æ°éã
|
| | | /// ç»çä»»å¡åºå®48ï¼æ¢çåæçä»»å¡éè¿æçå·æ¥è¯¢WMSåºåæç»æ°éã
|
| | | /// </summary>
|
| | | private int GetRobotTaskTotalNum(int taskType, string? palletCode)
|
| | | {
|
| | | if (taskType == (int)RobotTaskTypeEnum.GroupPallet)
|
| | | return 48;
|
| | |
|
| | | if (string.IsNullOrWhiteSpace(palletCode))
|
| | | return 1;
|
| | |
|
| | | try
|
| | | {
|
| | | string url = $"{BaseAPI.WMSBaseUrl}Stock/GetStockDetailCount?palletCode={Uri.EscapeDataString(palletCode)}";
|
| | | var result = _httpClientHelper.Get(url);
|
| | | if (!result.IsSuccess || string.IsNullOrEmpty(result.Content))
|
| | | return 1;
|
| | |
|
| | | var response = JsonConvert.DeserializeObject<WebResponseContent>(result.Content);
|
| | | if (response == null || !response.Status)
|
| | | return 1;
|
| | |
|
| | | var detailCount = response.Data?.GetType().GetProperty("DetailCount")?.GetValue(response.Data);
|
| | | return detailCount is int count and > 0 ? count : 1;
|
| | | }
|
| | | catch
|
| | | {
|
| | | return 1;
|
| | | }
|
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// å°é
ç½®é®æ å°å°æºæ¢°æä»»å¡ç±»åæä¸¾å¼ã
|
| | | /// </summary>
|
| | | /// <param name="configKey">é
ç½®é®åç§°</param>
|
| | | /// <returns>ä»»å¡ç±»åæä¸¾å¼</returns>
|
| | | public int MapConfigKeyToRobotTaskType(string? configKey)
|
| | | {
|
| | | return configKey switch
|
| | | {
|
| | | nameof(ConfigKey.CreateRobotGroupPalletTask) => (int)RobotTaskTypeEnum.GroupPallet,
|
| | | nameof(ConfigKey.CreateRobotSplitPalletTask) => (int)RobotTaskTypeEnum.SplitPallet,
|
| | | _ => (int)RobotTaskTypeEnum.ChangePallet
|
| | | };
|
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// æ ¹æ®è¾éçº¿ç®æ å°åè§£ææºæ¢°æä»»å¡æ¥å£ã
|
| | | /// è§åï¼
|
| | | /// 1. ä»é
置读å精确å°åæ å°ï¼AddressMapï¼
|
| | | /// 2. æªå½ä¸æ¶é»è®¤æ¢ç
|
| | | /// </summary>
|
| | | public string ResolveRobotTaskConfigKey(string? targetAddress)
|
| | | {
|
| | | string address = (targetAddress ?? string.Empty).Trim();
|
| | | if (string.IsNullOrWhiteSpace(address))
|
| | | return nameof(ConfigKey.CreateRobotChangePalletTask);
|
| | |
|
| | | var section = App.Configuration.GetSection("RobotTaskAddressRules");
|
| | | var addressMap = ReadRobotRuleMap(section.GetSection("AddressMap"));
|
| | | if (addressMap.TryGetValue(address, out string? exactTaskType))
|
| | | return MapRobotTaskTypeToConfigKey(exactTaskType);
|
| | |
|
| | | return nameof(ConfigKey.CreateRobotChangePalletTask);
|
| | | }
|
| | |
|
| | | public int MapWarehouseIdConfigKey(string? targetAddress)
|
| | | {
|
| | | return targetAddress switch
|
| | | {
|
| | | "11068" => 1,
|
| | | "11001" => 3,
|
| | | "11010" => 3,
|
| | | "10010" => 1,
|
| | | "10030" => 1,
|
| | | _ => 1
|
| | | };
|
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// å°é
置任å¡ç±»å转æ¢ä¸ºæ¥å£é
ç½®é®ã
|
| | | /// æ¯æå¼ï¼Split/Group/Changeï¼å¤§å°å䏿æï¼
|
| | | /// </summary>
|
| | | public string MapRobotTaskTypeToConfigKey(string? taskType)
|
| | | {
|
| | | string type = (taskType ?? string.Empty).Trim().ToLowerInvariant();
|
| | | return type switch
|
| | | {
|
| | | "split" => nameof(ConfigKey.CreateRobotSplitPalletTask),
|
| | | "group" => nameof(ConfigKey.CreateRobotGroupPalletTask),
|
| | | _ => nameof(ConfigKey.CreateRobotChangePalletTask)
|
| | | };
|
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// æ ¹æ®æ¥å£ç±»åæå»ºæºæ¢°æä»»å¡å
¥åã
|
| | | /// </summary>
|
| | | public StockDTO BuildRobotTaskStock(Dt_Task task, string configKey)
|
| | | {
|
| | | string targetAddress = task.TargetAddress ?? string.Empty;
|
| | | string roadway = ResolveRobotRuleValue(targetAddress, "AddressRoadwayMap", task.Roadway);
|
| | | string sourceLineNo = ResolveRobotRuleValue(targetAddress, "AddressSourceLineNoMap", task.SourceAddress);
|
| | |
|
| | | var stock = new StockDTO
|
| | | {
|
| | | Roadway = roadway,
|
| | | SourceLineNo = sourceLineNo,
|
| | | TargetLineNo = task.TargetAddress,
|
| | | SourcePalletNo = task.PalletCode,
|
| | | TargetPalletNo = task.PalletCode
|
| | | };
|
| | |
|
| | | if (configKey == nameof(ConfigKey.CreateRobotSplitPalletTask))
|
| | | {
|
| | | stock.TargetPalletNo = string.Empty;
|
| | | }
|
| | | else if (configKey == nameof(ConfigKey.CreateRobotGroupPalletTask))
|
| | | {
|
| | | stock.SourcePalletNo = string.Empty;
|
| | | }
|
| | | else if (configKey == nameof(ConfigKey.CreateRobotChangePalletTask))
|
| | | {
|
| | | IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceProDTOs.Any(d => d.DeviceChildCode == sourceLineNo));
|
| | | if (device != null)
|
| | | {
|
| | | CommonConveyorLine conveyorLine = (CommonConveyorLine)device;
|
| | |
|
| | | DeviceProDTO? devicePro = conveyorLine.DeviceProDTOs.FirstOrDefault(x => x.DeviceProParamName == nameof(ConveyorLineDBNameNew.Barcode) && x.DeviceChildCode == sourceLineNo);
|
| | | //ConveyorLineTaskCommandNew command = conveyorLine.ReadCustomer<ConveyorLineTaskCommandNew>(sourceLineNo); // æµè¯ç¨
|
| | | var barcode = conveyorLine.GetValue<ConveyorLineDBNameNew, string>(ConveyorLineDBNameNew.Barcode, sourceLineNo);
|
| | | stock.SourcePalletNo = string.IsNullOrEmpty(barcode) ? string.Empty : barcode;
|
| | | }
|
| | | }
|
| | |
|
| | | return stock;
|
| | | }
|
| | |
|
| | | public override WebResponseContent AddData(SaveModel saveModel)
|
| | | {
|
| | | try
|
| | | {
|
| | | if (saveModel == null || saveModel.MainData == null || saveModel.MainData.Count == 0)
|
| | | {
|
| | | return WebResponseContent.Instance.Error("ä¼ åé误,åæ°ä¸è½ä¸ºç©º");
|
| | | }
|
| | |
|
| | | string validResult = typeof(Dt_RobotTask).ValidateDicInEntity(saveModel.MainData, true, TProperties);
|
| | | if (!string.IsNullOrEmpty(validResult))
|
| | | {
|
| | | return WebResponseContent.Instance.Error(validResult);
|
| | | }
|
| | |
|
| | | object? taskNumObj = saveModel.MainData[nameof(Dt_RobotTask.RobotTaskNum)];
|
| | | if (taskNumObj != null)
|
| | | {
|
| | | int taskNum = Convert.ToInt32(taskNumObj);
|
| | | if (BaseDal.QueryFirst(x => x.RobotTaskNum == taskNum) != null)
|
| | | {
|
| | | return WebResponseContent.Instance.Error($"ä»»å¡ç¼å· {taskNum} å·²åå¨");
|
| | | }
|
| | | }
|
| | |
|
| | | Dt_RobotTask entity = saveModel.MainData.DicToModel<Dt_RobotTask>();
|
| | | entity.Creater = "æå¨å建";
|
| | | entity.CreateDate = DateTime.Now;
|
| | |
|
| | | if (saveModel.DetailData == null || saveModel.DetailData.Count == 0)
|
| | | {
|
| | | BaseDal.AddData(entity);
|
| | | return WebResponseContent.Instance.OK("æ°å¢æå", entity);
|
| | | }
|
| | |
|
| | | return base.AddData(saveModel);
|
| | | }
|
| | | catch (Exception ex)
|
| | | {
|
| | | return WebResponseContent.Instance.Error($"æ°å¢å¤±è´¥,é误信æ¯:{ex.Message}");
|
| | | }
|
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// æ ¹æ®ç®æ å°åæã精确 > åéå¼ãè§£æè§åå¼ã
|
| | | /// </summary>
|
| | | public string ResolveRobotRuleValue(string? targetAddress, string addressSectionName, string? fallback)
|
| | | {
|
| | | string address = (targetAddress ?? string.Empty).Trim();
|
| | | string defaultValue = fallback ?? string.Empty;
|
| | | if (string.IsNullOrWhiteSpace(address))
|
| | | return defaultValue;
|
| | |
|
| | | var section = App.Configuration.GetSection("RobotTaskAddressRules");
|
| | | var addressMap = ReadRobotRuleMap(section.GetSection(addressSectionName));
|
| | | if (addressMap.TryGetValue(address, out string? value))
|
| | | return value;
|
| | |
|
| | | return defaultValue;
|
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// 读åè§åæ å°æ®µã
|
| | | /// </summary>
|
| | | private Dictionary<string, string> ReadRobotRuleMap(IConfigurationSection section)
|
| | | {
|
| | | return section
|
| | | .GetChildren()
|
| | | .Where(x => !string.IsNullOrWhiteSpace(x.Key) && !string.IsNullOrWhiteSpace(x.Value))
|
| | | .ToDictionary(x => x.Key.Trim(), x => x.Value!.Trim());
|
| | | }
|
| | | }
|
| | | } |
| | |
| | | using MapsterMapper; |
| | | using System.Diagnostics.CodeAnalysis; |
| | | using WIDESEA_Core; |
| | | using WIDESEAWCS_Common.TaskEnum; |
| | | using WIDESEAWCS_Core; |
| | | using WIDESEAWCS_Core.Enums; |
| | | using WIDESEAWCS_DTO.TaskInfo; |
| | | using WIDESEAWCS_Model.Models; |
| | | using WIDESEAWCS_QuartzJob; |
| | | using WIDESEAWCS_QuartzJob.Models; |
| | | |
| | | namespace WIDESEAWCS_TaskInfoService; |
| | | |
| | |
| | | { |
| | | case TaskTypeGroup.OutbondGroup: |
| | | return _outboundTaskFlowService.InitializeOnReceive(task, source); |
| | | |
| | | case TaskTypeGroup.InboundGroup: |
| | | return _inboundTaskFlowService.InitializeOnReceive(task, source); |
| | | |
| | | case TaskTypeGroup.RelocationGroup: |
| | | return _relocationTaskFlowService.InitializeOnReceive(task, source); |
| | | |
| | | case TaskTypeGroup.OtherGroup: |
| | | return _robotTaskFlowService.InitializeOnReceive(task, source); |
| | | |
| | | default: |
| | | return WebResponseContent.Instance.Error("WCSä¸åå¨å½åä»»å¡çä»»å¡ç±»å"); |
| | | } |
| | |
| | | using Serilog.Core; |
| | | using System.Diagnostics.CodeAnalysis; |
| | | using WIDESEAWCS_Common.TaskEnum; |
| | | using WIDESEAWCS_Core; |
| | |
| | | using WIDESEAWCS_DTO.TaskInfo; |
| | | using WIDESEAWCS_Model.Models; |
| | | using WIDESEAWCS_QuartzJob.Models; |
| | | using WIDESEAWCS_Tasks; |
| | | |
| | | namespace WIDESEAWCS_TaskInfoService; |
| | | |
| | |
| | | /// <returns></returns> |
| | | public WebResponseContent UpdateTaskStatusToNext([NotNull] Dt_Task task) |
| | | { |
| | | int oldState = task.TaskStatus; |
| | | |
| | | var result = task.TaskType.GetTaskTypeGroup() switch |
| | | WebResponseContent content = new WebResponseContent(); |
| | | try |
| | | { |
| | | TaskTypeGroup.OutbondGroup => _outboundTaskFlowService.MoveToNextStatus(task), |
| | | TaskTypeGroup.InboundGroup => _inboundTaskFlowService.MoveToNextStatus(task), |
| | | TaskTypeGroup.RelocationGroup => _relocationTaskFlowService.MoveToNextStatus(task), |
| | | TaskTypeGroup.OtherGroup => _robotTaskFlowService.MoveToNextStatus(task), |
| | | _ => WebResponseContent.Instance.Error($"ä»»å¡ç±»åé误,æªæ¾å°è¯¥ä»»å¡ç±»å,ä»»å¡å·:ã{task.TaskNum}ã,ä»»å¡ç±»å:ã{task.TaskType}ã") |
| | | }; |
| | | int oldState = task.TaskStatus; |
| | | |
| | | if (!result.Status) |
| | | return result; |
| | | var result = task.TaskType.GetTaskTypeGroup() switch |
| | | { |
| | | TaskTypeGroup.OutbondGroup => _outboundTaskFlowService.MoveToNextStatus(task), |
| | | TaskTypeGroup.InboundGroup => _inboundTaskFlowService.MoveToNextStatus(task), |
| | | TaskTypeGroup.RelocationGroup => _relocationTaskFlowService.MoveToNextStatus(task), |
| | | TaskTypeGroup.OtherGroup => _robotTaskFlowService.MoveToNextStatus(task), |
| | | _ => content.Error($"ä»»å¡ç±»åé误,æªæ¾å°è¯¥ä»»å¡ç±»å,ä»»å¡å·:ã{task.TaskNum}ã,ä»»å¡ç±»å:ã{task.TaskType}ã") |
| | | }; |
| | | |
| | | // åºåºå®æçº¿ä½èç¹æ¶ï¼å¯è½éè¦æ¥æ¶å
¥åºæ°ä»»å¡ã |
| | | if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup |
| | | && result.Data is List<WMSTaskDTO> wmsTasks |
| | | && wmsTasks.Count > 0) |
| | | { |
| | | WebResponseContent content = ReceiveWMSTask(wmsTasks); |
| | | if (!content.Status) |
| | | return content; |
| | | if (!result.Status) |
| | | return result; |
| | | |
| | | // åºåºå®æçº¿ä½èç¹æ¶ï¼å¯è½éè¦æ¥æ¶å
¥åºæ°ä»»å¡ã |
| | | if (task.TaskType.GetTaskTypeGroup() == TaskTypeGroup.OutbondGroup |
| | | && result.Data is List<WMSTaskDTO> wmsTasks |
| | | && wmsTasks.Count > 0) |
| | | { |
| | | content = ReceiveWMSTask(wmsTasks); |
| | | if (!content.Status) |
| | | return content; |
| | | } |
| | | |
| | | // æ´æ°ä»»å¡æ°æ® |
| | | task.ModifyDate = DateTime.Now; |
| | | task.Modifier = "System"; |
| | | if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish) |
| | | { |
| | | BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.èªå¨å®æ); |
| | | } |
| | | else |
| | | { |
| | | BaseDal.UpdateData(task); |
| | | } |
| | | |
| | | // è®°å½ä»»å¡æ§è¡è¯¦æ
|
| | | string logMessage = App.User.UserId > 0 |
| | | ? $"人工æå¨å°ä»»å¡ç¶æä»ã{oldState}ã跳转å°ã{task.TaskStatus}ã" |
| | | : $"ç³»ç»èªå¨æµç¨ï¼ä»»å¡ç¶æä»ã{oldState}ã转å°ã{task.TaskStatus}ã"; |
| | | _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, logMessage); |
| | | |
| | | return content.OK(); |
| | | } |
| | | |
| | | // æ´æ°ä»»å¡æ°æ® |
| | | task.ModifyDate = DateTime.Now; |
| | | task.Modifier = "System"; |
| | | if (task.TaskStatus == (int)TaskOutStatusEnum.Line_OutFinish) |
| | | catch (Exception ex) |
| | | { |
| | | BaseDal.DeleteAndMoveIntoHty(task, OperateTypeEnum.èªå¨å®æ); |
| | | QuartzLogHelper.LogError(Logger.None, $"UpdateTaskStatusToNext æ´æ°å°ä»»å¡ç¶æä¿®æ¹ä¸ºä¸ä¸ä¸ªç¶æå¤±è´¥,ä»»å¡å·:ã{task.TaskNum}ã,é误信æ¯:ã{ex.Message}ã", "UpdateTaskStatusToNext"); |
| | | return content.Error(ex.Message); |
| | | } |
| | | else |
| | | { |
| | | BaseDal.UpdateData(task); |
| | | } |
| | | |
| | | // è®°å½ä»»å¡æ§è¡è¯¦æ
|
| | | string logMessage = App.User.UserId > 0 |
| | | ? $"人工æå¨å°ä»»å¡ç¶æä»ã{oldState}ã跳转å°ã{task.TaskStatus}ã" |
| | | : $"ç³»ç»èªå¨æµç¨ï¼ä»»å¡ç¶æä»ã{oldState}ã转å°ã{task.TaskStatus}ã"; |
| | | _taskExecuteDetailService.AddTaskExecuteDetail(task.TaskId, logMessage); |
| | | |
| | | return WebResponseContent.Instance.OK(); |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Console.WriteLine($"UpdatePosition æ´æ°ä»»å¡ä½ç½®å¤±è´¥,ä»»å¡å·:ã{taskNum}ã,é误信æ¯:ã{ex.Message}ã"); |
| | | QuartzLogHelper.LogError(Logger.None, $"UpdatePosition æ´æ°ä»»å¡ä½ç½®å¤±è´¥,ä»»å¡å·:ã{taskNum}ã,é误信æ¯:ã{ex.Message}ã", "UpdatePosition"); |
| | | //Console.WriteLine($"UpdatePosition æ´æ°ä»»å¡ä½ç½®å¤±è´¥,ä»»å¡å·:ã{taskNum}ã,é误信æ¯:ã{ex.Message}ã"); |
| | | } |
| | | return null; |
| | | } |
| | |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | | Console.WriteLine($"UpdatePosition æ´æ°ä»»å¡ä½ç½®å¤±è´¥,ä»»å¡å·:ã{taskNum}ã,é误信æ¯:ã{ex.Message}ã"); |
| | | QuartzLogHelper.LogError(Logger.None, $"UpdatePosition æ´æ°ä»»å¡ä½ç½®å¤±è´¥,ä»»å¡å·:ã{taskNum}ã,é误信æ¯:ã{ex.Message}ã", "UpdatePosition"); |
| | | } |
| | | return null; |
| | | } |
| | |
| | | using Serilog; |
| | | using SqlSugar; |
| | | using WIDESEA_Core; |
| | | using WIDESEAWCS_Common.HttpEnum; |
| | | using WIDESEAWCS_Common.TaskEnum; |
| | | using WIDESEAWCS_Core; |
| | | using WIDESEAWCS_Core.Helper; |
| | |
| | | return Task.CompletedTask; |
| | | } |
| | | |
| | | // å建并è¡é项ï¼é嶿大并忰 |
| | | //var parallelOptions = new ParallelOptions |
| | | //{ |
| | | // // éå¶å¹¶åæ°ï¼åè®¾å¤æ°éå CPU æ ¸å¿æ°*2 çè¾å°å¼ |
| | | // MaxDegreeOfParallelism = Math.Min(childDeviceCodes.Count, Environment.ProcessorCount * 2), |
| | | //}; |
| | | |
| | | // å¹¶è¡å¤çæ¯ä¸ªåè®¾å¤ |
| | | //Parallel.For(0, childDeviceCodes.Count, parallelOptions, i => |
| | | foreach (var childDeviceCode in childDeviceCodes) |
| | | { |
| | | //string childDeviceCode = childDeviceCodes[i]; |
| | |
| | | if (command.CV_State == 2) |
| | | { |
| | | // æ£æ¥è¯¥ä½ç½®æ¯å¦å·²æä»»å¡ |
| | | var existingTask = _taskService.Db.Queryable<Dt_Task>().First(x => x.TargetAddress == childDeviceCode); |
| | | if (existingTask.IsNullOrEmpty()) |
| | | var existingTask = _taskService.Db.Queryable<Dt_Task>().Count(x => x.TargetAddress == childDeviceCode); |
| | | if (existingTask < 5) |
| | | { |
| | | // 没æä»»å¡ï¼å WMS 请æ±åºåºæçä»»å¡ |
| | | var position = checkPalletPositions.FirstOrDefault(x => x.Code == childDeviceCode); |
| | |
| | | QuartzLogHelper.LogInfo(_logger, $"å¤çä»»å¡ {task.TaskNum}ï¼ç¶æ: {task.TaskStatus}", conveyorLine.DeviceCode); |
| | | // å¤çä»»å¡ç¶æï¼æ ¹æ®ç¶æååå°ä¸åæ¹æ³ï¼ |
| | | ProcessTaskState(conveyorLine, command, task, childDeviceCode); |
| | | return Task.CompletedTask; |
| | | continue; |
| | | } |
| | | // Todoï¼ ä¸é¢çé»è¾ä¸»è¦å¤çæ²¡ææ¥è¯¢å°ä»»å¡ä½ææ¡ç çæ
åµï¼å¯è½æ¯éè¦çææºæ¢°æä»»å¡æè
è°ç¨ WMS å建å
¥åºä»»å¡ ï¼ä¸´æ¶ä½¿ç¨ï¼ |
| | | else if (!command.Barcode.IsNullOrEmpty() && childDeviceCode == "11068") |
| | | { |
| | | var isWcsTask = _taskService.Db.Queryable<Dt_Task>().Any(x => x.PalletCode == command.Barcode && x.TaskStatus == (int)TaskOutStatusEnum.OutNew); |
| | | var isRobotTask = _robotTaskService.Db.Queryable<Dt_RobotTask>().Any(x => x.RobotTargetAddressPalletCode == command.Barcode); |
| | | var isWcsTask = _taskService.Db.Queryable<Dt_Task>().Any(x => x.PalletCode == command.Barcode && (x.TaskStatus == (int)TaskOutStatusEnum.OutNew || x.TaskStatus == (int)TaskInStatusEnum.InNew)); |
| | | var isRobotTask = _robotTaskService.Db.Queryable<Dt_RobotTask>().Any(x => x.RobotTargetAddressPalletCode == command.Barcode || x.RobotRoadway == "注液ç»çæºæ¢°æ"); |
| | | if (isWcsTask || isRobotTask) |
| | | { |
| | | return Task.CompletedTask; |
| | | continue; |
| | | } |
| | | |
| | | // ç´æ¥æ·»å æºæ¢°æç»çä»»å¡ |
| | |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode); |
| | | } |
| | | } |
| | | else if (!command.Barcode.IsNullOrEmpty() && (childDeviceCode == "11001" || childDeviceCode == "11010")) |
| | | { |
| | | var isWcsTask = _taskService.Db.Queryable<Dt_Task>().Any(x => x.PalletCode == command.Barcode && (x.TaskStatus == (int)TaskOutStatusEnum.OutNew || x.TaskStatus == (int)TaskInStatusEnum.InNew)); |
| | | var isRobotTask = _robotTaskService.Db.Queryable<Dt_RobotTask>().Any(x => x.RobotTargetAddressPalletCode == command.Barcode); |
| | | if (isWcsTask || isRobotTask) |
| | | { |
| | | continue; |
| | | } |
| | | |
| | | // è°ç¨ WMS å建空æçå
¥åºä»»å¡ |
| | | string configKey = nameof(ConfigKey.CreateTaskInboundAsync); |
| | | string requestParam = new CreateTaskDto() |
| | | { |
| | | PalletCode = command.Barcode, |
| | | SourceAddress = childDeviceCode, |
| | | TargetAddress = "GWSC1", // ç®æ å°å |
| | | Roadway = "GWSC1", // å··é |
| | | WarehouseId = 1, // ä»åº ID |
| | | PalletType = 1, // æçç±»åï¼é»è®¤ä¸º1ï¼ |
| | | TaskType = TaskTypeEnum.InEmpty.GetHashCode() // ä»»å¡ç±»åï¼å
¥åº/空æçå
¥åºï¼ |
| | | }.Serialize(); |
| | | DateTime startTime = DateTime.Now; |
| | | |
| | | var responseResult = _httpClientHelper.Post<WebResponseContent>(configKey, requestParam); |
| | | |
| | | if (responseResult.IsSuccess && responseResult.Data.Status) |
| | | { |
| | | QuartzLogHelper.LogInfo(_logger, $"è°ç¨WMSæ¥å£æå,æ¥å£:ã{configKey}ã,请æ±åæ°:ã{requestParam}ã,ååºæ°æ®:ã{responseResult.Data?.Data}ã,èæ¶:{(DateTime.Now - startTime).TotalMilliseconds}ms", conveyorLine.DeviceCode); |
| | | var wmsTask = JsonConvert.DeserializeObject<WMSTaskDTO>(responseResult?.Data?.Data?.ToString()); |
| | | List<WMSTaskDTO> taskDTOs = new List<WMSTaskDTO> { wmsTask }; |
| | | if (wmsTask == null) continue; |
| | | |
| | | if (_taskService.ReceiveWMSTask(taskDTOs).Status) |
| | | { |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode); |
| | | } |
| | | } |
| | | else |
| | | { |
| | | QuartzLogHelper.LogError(_logger, $"è°ç¨WMSæ¥å£å¤±è´¥,æ¥å£:ã{configKey}ã,请æ±åæ°:ã{requestParam}ã,é误信æ¯:ã{responseResult.Data?.Message}ã", conveyorLine.DeviceCode); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | catch (Exception innerEx) |
| | |
| | | } |
| | | |
| | | // 设置任å¡å·ãæçæ¡ç ãç®æ å°åãWCS_ACK |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.TaskNo, task.TaskNum, childDeviceCode); |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.Barcode, task.PalletCode, childDeviceCode); |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.Target, targetAddress, childDeviceCode); |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode); |
| | | var isTaskNoSet = conveyorLine.SetValue(ConveyorLineDBNameNew.TaskNo, task.TaskNum, childDeviceCode); |
| | | |
| | | Thread.Sleep(100); // ç¡®ä¿ PLC è½æ£ç¡®è¯»åä»»å¡å·åååå
¥æ¡ç |
| | | var isPalletSet = conveyorLine.SetValue(ConveyorLineDBNameNew.Barcode, task.PalletCode, childDeviceCode); |
| | | |
| | | bool isTargetSet = true; |
| | | if (targetAddress == "2217" && !isEmptyTask) |
| | | { |
| | | QuartzLogHelper.LogDebug(_logger, $"å设å¤: {childDeviceCode}ï¼åºåºç®æ å°å: {targetAddress}", conveyorLine.DeviceCode); |
| | | Thread.Sleep(100); // ç¡®ä¿ PLC è½æ£ç¡®è¯»åä»»å¡å·åååå
¥æ¡ç |
| | | isTargetSet = conveyorLine.SetValue(ConveyorLineDBNameNew.Target, targetAddress, childDeviceCode); |
| | | } |
| | | if (!isTargetSet || !isTaskNoSet || !isPalletSet) |
| | | { |
| | | QuartzLogHelper.LogError(_logger, $"RequestOutboundï¼ä¸ååºåºä»»å¡å¤±è´¥ï¼ä»»å¡å·: {task.TaskNum}ï¼å设å¤: {childDeviceCode}", conveyorLine.DeviceCode); |
| | | return Task.CompletedTask; |
| | | } |
| | | |
| | | bool isWmsResult = false; |
| | | // æ´æ°ä»»å¡ç¶ææä½ç½® |
| | | if (isEmptyTask && task.NextAddress == "2217") |
| | | { |
| | | task.TaskStatus = task.TaskStatus.GetNextNotCompletedStatus<TaskOutStatusEnum>(); |
| | | task.NextAddress = "2201"; |
| | | _taskService.Repository.UpdateData(task); |
| | | isWmsResult = _taskService.Repository.UpdateData(task); |
| | | } |
| | | else |
| | | { |
| | | _taskService.UpdateTaskStatusToNext(task); |
| | | isWmsResult = _taskService.UpdateTaskStatusToNext(task).Status; |
| | | } |
| | | |
| | | if(!isWmsResult) |
| | | { |
| | | QuartzLogHelper.LogError(_logger, $"RequestOutboundï¼æ´æ°ä»»å¡ç¶æå¤±è´¥ï¼ä»»å¡å·: {task.TaskNum}ï¼å设å¤: {childDeviceCode}", conveyorLine.DeviceCode); |
| | | return Task.CompletedTask; |
| | | } |
| | | |
| | | Thread.Sleep(100); // ç¡®ä¿ PLC è½æ£ç¡®è¯»åä»»å¡å·åååå
¥æ¡ç |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode); |
| | | |
| | | QuartzLogHelper.LogInfo(_logger, "RequestOutboundï¼åºåºä»»å¡å·²ä¸åï¼ä»»å¡å·: {TaskNum}ï¼å设å¤: {ChildDeviceCode}", $"åºåºä»»å¡å·²ä¸åï¼ä»»å¡å·: {task.TaskNum}", conveyorLine.DeviceCode, task.TaskNum, childDeviceCode); |
| | | return Task.CompletedTask; |
| | | } |
| | |
| | | namespace WIDESEAWCS_Tasks |
| | | { |
| | | /// <summary> |
| | | /// è¾éçº¿ç®æ å°åéæ©å¨ - å¤çæææº/ææéæºçä¸ä¸å±è¯·æ± |
| | | /// è¾éçº¿ç®æ å°åéæ©å¨ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// æ ¸å¿èè´£ï¼ |
| | | /// 1. å¤çå
¥åºåºæ¯çç®æ å°åéæ© |
| | | /// 2. å¤çåºåºåºæ¯çç®æ å°åéæ© |
| | | /// 3. å¤ææææºåææéæºçç©æè¯·æ±ç¶æ |
| | | /// 4. åè°è¾é线ä¸ä¸ä¸å±è®¾å¤ä¹é´çç©ææµè½¬ |
| | | /// |
| | | /// æææºåææéæºé½æä¸ä¸ä¸¤å±ç»æï¼ |
| | | /// æ¯å±é½æç¬ç«çç©æè¯·æ±ååºæä¿¡å·ï¼éè¦åå«å¤çã |
| | | /// </remarks> |
| | | public class ConveyorLineTargetAddressSelector |
| | | { |
| | | /// <summary> |
| | | /// 设å¤å±çº§ï¼ä¸å±/ä¸å±ï¼ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// ç¨äºåºåæææºåææéæºçä¸å±å·¥ä½åä¸å±å·¥ä½ã |
| | | /// å
¥åºä»»å¡å¯¹åºä¸å±ï¼MaterialRequestUpperï¼ï¼åºåºä»»å¡å¯¹åºä¸å±ï¼MaterialRequestLowerï¼ã |
| | | /// </remarks> |
| | | private enum Layer |
| | | { |
| | | /// <summary> |
| | | /// ä¸å±å·¥ä½ |
| | | /// </summary> |
| | | Upper, |
| | | |
| | | /// <summary> |
| | | /// ä¸å±å·¥ä½ |
| | | /// </summary> |
| | | Lower |
| | | } |
| | | |
| | | /// <summary> |
| | | /// ç®æ 设å¤ç±»åæä¸¾ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// ç¨äºæ ¹æ®ç®æ å°åç¼ç è¯å«éè¦å¯¹æ¥ç设å¤ç±»åã |
| | | /// </remarks> |
| | | private enum TargetDeviceType |
| | | { |
| | | /// <summary> |
| | | /// æ ææè®¾å¤ï¼å°åä¸å¨å·²ç¥èå´å
ï¼ |
| | | /// </summary> |
| | | None, |
| | | |
| | | /// <summary> |
| | | /// æææº |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// è´è´£åºå®/约æçµæ± æçç设å¤ï¼æä¸ä¸ä¸¤å±ã |
| | | /// </remarks> |
| | | ConstraintMachine, |
| | | |
| | | /// <summary> |
| | | /// ææéæº |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// è´è´£æéåæéæä½ç设å¤ï¼æä¸ä¸ä¸¤å±ã |
| | | /// </remarks> |
| | | PinMachine |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æææºå¯¹åºçç¹ä½ç¼ç éå |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// å½ç®æ å°åå¨è¿äºç¼ç 䏿¶ï¼è¡¨ç¤ºéè¦ä¸æææºäº¤äºã |
| | | /// ä½¿ç¨ HashSet ä¿è¯ O(1) ç Contains æ¥æ¾æ§è½ã |
| | | /// </remarks> |
| | | private static readonly HashSet<string> ConstraintMachineCodes = new HashSet<string> { "10180", "20090" }; |
| | | |
| | | /// <summary> |
| | | /// ææéæºå¯¹åºçç¹ä½ç¼ç éå |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// å½ç®æ å°åå¨è¿äºç¼ç 䏿¶ï¼è¡¨ç¤ºéè¦ä¸ææéæºäº¤äºã |
| | | /// ä½¿ç¨ HashSet ä¿è¯ O(1) ç Contains æ¥æ¾æ§è½ã |
| | | /// </remarks> |
| | | private static readonly HashSet<string> PinMachineCodes = new HashSet<string> { "10190", "20100" }; |
| | | |
| | | /// <summary> |
| | | /// ç®æ å°åå°è®¾å¤ç±»åçæ å° |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// éè¿åä¸åå
¸å®ç° O(1) æ¥æ¾ï¼æ¿ä»£åå
åå«ç¨ä¸¤ä¸ª List + Contains + if/else if çåæ³ã |
| | | /// Key: ç®æ å°åç¼ç ï¼Value: 对åºç设å¤ç±»åã |
| | | /// </remarks> |
| | | private static readonly Dictionary<string, TargetDeviceType> AddressToDeviceType = new Dictionary<string, TargetDeviceType> |
| | | { |
| | | // æææºç两个ç¹ä½ç¼ç 齿 å°å° ConstraintMachine ç±»å |
| | | { "10180", TargetDeviceType.ConstraintMachine }, |
| | | { "20090", TargetDeviceType.ConstraintMachine }, |
| | | // ææéæºç两个ç¹ä½ç¼ç 齿 å°å° PinMachine ç±»å |
| | | { "10190", TargetDeviceType.PinMachine }, |
| | | { "20100", TargetDeviceType.PinMachine } |
| | | }; |
| | | |
| | | /// <summary> |
| | | /// æ¥å¿è®°å½å¨ |
| | | /// </summary> |
| | |
| | | { |
| | | // è®°å½å
¥åºåºæ¯çè°è¯æ¥å¿ï¼å
å«å设å¤åç®æ å°åä¿¡æ¯ |
| | | WriteDebug(conveyorLine, "å
¥åºä¸ä¸å°å", childDeviceCode, nextAddress); |
| | | // å§æéç¨å¤çæ¹æ³ï¼å
¥åºå¯¹åºä¸å±ï¼isUpper: trueï¼ |
| | | //HandleDeviceRequest(conveyorLine, nextAddress, childDeviceCode, Layer.Upper); |
| | | |
| | | var cvState = conveyorLine.GetValue<ConveyorLineDBNameNew, byte>(ConveyorLineDBNameNew.CV_State, nextAddress); |
| | | bool isAvailable = cvState == 2; |
| | |
| | | { |
| | | // è®°å½åºåºåºæ¯çè°è¯æ¥å¿ï¼å
å«å设å¤åç®æ å°åä¿¡æ¯ |
| | | WriteDebug(conveyorLine, "åºåºä¸ä¸å°å", childDeviceCode, nextAddress); |
| | | // å§æéç¨å¤çæ¹æ³ï¼åºåºå¯¹åºä¸å±ï¼isUpper: falseï¼ |
| | | //HandleDeviceRequest(conveyorLine, nextAddress, childDeviceCode, Layer.Lower); |
| | | |
| | | var cvState = conveyorLine.GetValue<ConveyorLineDBNameNew, byte>(ConveyorLineDBNameNew.CV_State, nextAddress); |
| | | bool isAvailable = cvState == 2; |
| | |
| | | } |
| | | return false; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®ç®æ å°åç±»åååå°å¯¹åºè®¾å¤å¤ç |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// éè¿ AddressToDeviceType åå
¸å°ç®æ å°åæ å°å°è®¾å¤ç±»åï¼ |
| | | /// ç¶åååå°å¯¹åºçä¸ç¨å¤çæ¹æ³ï¼HandleConstraintMachine / HandlePinMachineï¼ã |
| | | /// å¦æç®æ å°åä¸å¨å·²ç¥æ å°è¡¨ä¸ï¼ç´æ¥è¿åï¼ä¸åä»»ä½å¤çã |
| | | /// </remarks> |
| | | /// <param name="conveyorLine">è¾é线设å¤å¯¹è±¡ï¼ä¼ éå°å
·ä½è®¾å¤å¤çæ¹æ³</param> |
| | | /// <param name="nextAddress">ç®æ 设å¤ç¼ç ï¼éè¿åå
¸æ¥æ¾è¯å«è®¾å¤ç±»å</param> |
| | | /// <param name="childDeviceCode">å设å¤ç¼ç ï¼ä¼ éå°å
·ä½è®¾å¤å¤çæ¹æ³</param> |
| | | /// <param name="layer">设å¤å±çº§ï¼ä¸å±æä¸å±ï¼ï¼å³å®è¯»ååªç»è¯·æ±æ å¿</param> |
| | | private void HandleDeviceRequest(CommonConveyorLine conveyorLine, string nextAddress, string childDeviceCode, Layer layer) |
| | | { |
| | | // éè¿åå
¸æ¥æ¾ç®æ å°å对åºç设å¤ç±»åï¼å¦ææ¾ä¸å°å deviceType 为 None |
| | | if (!AddressToDeviceType.TryGetValue(nextAddress, out var deviceType) || deviceType == TargetDeviceType.None) |
| | | { |
| | | // ç®æ å°åä¸å¨å·²ç¥æ å°è¡¨ä¸ï¼ç´æ¥è¿åï¼å¯è½æ¯å
¶ä»ç±»å设å¤ï¼ |
| | | return; |
| | | } |
| | | |
| | | // æ ¹æ®è¯å«åºç设å¤ç±»åååå°å¯¹åºçå¤çæ¹æ³ |
| | | switch (deviceType) |
| | | { |
| | | case TargetDeviceType.ConstraintMachine: |
| | | // æææºå¤ç忝ï¼è·åæææºå®ä¾å¹¶å¤çå
¶ä¸ä¸å±è¯·æ± |
| | | HandleConstraintMachine(conveyorLine, childDeviceCode, layer); |
| | | break; // å¤ç宿¯ï¼è·³åº switch |
| | | |
| | | case TargetDeviceType.PinMachine: |
| | | // ææéæºå¤ç忝ï¼è·åææéæºå®ä¾å¹¶å¤çå
¶ä¸ä¸å±è¯·æ± |
| | | HandlePinMachine(conveyorLine, childDeviceCode, layer); |
| | | break; // å¤ç宿¯ï¼è·³åº switch |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å¤çæææºçç©æ/åºæè¯·æ± |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// æ¥æ¾æææºè®¾å¤ï¼è·åå½åå±çº§çç©æè¯·æ±ååºæè¯·æ±ç¶æï¼ |
| | | /// ç¶åè°ç¨éç¨å¤çé»è¾ ProcessDeviceRequestã |
| | | /// </remarks> |
| | | /// <param name="conveyorLine">è¾é线设å¤å¯¹è±¡ï¼ç¨äºéç¥ç®æ å°åå ACK</param> |
| | | /// <param name="childDeviceCode">å设å¤ç¼ç ï¼ç¨äºç²¾ç¡®å®ä½</param> |
| | | /// <param name="layer">设å¤å±çº§ï¼å³å®è¯»åä¸å±è¿æ¯ä¸å±çè¯·æ±æ å¿</param> |
| | | private void HandleConstraintMachine(CommonConveyorLine conveyorLine, string childDeviceCode, Layer layer) |
| | | { |
| | | // ä»å
¨å±è®¾å¤åè¡¨ä¸æ¥æ¾å为"æææº"çæææºè®¾å¤å®ä¾ |
| | | var constraint = FindDevice<ConstraintMachine>("æææº"); |
| | | if (constraint == null) |
| | | { |
| | | // æªæ¾å°æææºè®¾å¤ï¼å·²å¨ FindDevice ä¸è®°å½æ¥å¿ï¼æ¤å¤ç´æ¥è¿å |
| | | return; |
| | | } |
| | | |
| | | // è·åå½åå±çº§ï¼ä¸å±/ä¸å±ï¼çç©æè¯·æ±æ å¿ï¼éé¶è¡¨ç¤ºè®¾å¤éè¦ç©æ |
| | | bool materialRequest = GetConstraintFlag(constraint, layer, isMaterial: true); |
| | | // è·åå½åå±çº§ï¼ä¸å±/ä¸å±ï¼çåºæè¯·æ±æ å¿ï¼éé¶è¡¨ç¤ºè®¾å¤æè´§è¦åº |
| | | bool outputRequest = GetConstraintFlag(constraint, layer, isMaterial: false); |
| | | |
| | | // æé 设置è¾åºå°±ç»ªæ å¿çå§æï¼æ ¹æ®å±çº§åå
¥ Upper æ Lower 对åºçå¯åå¨ï¼ |
| | | Action<bool> setOutputReady = outputReady => |
| | | SetConstraintOutputReady(constraint, layer, outputReady); |
| | | |
| | | // è°ç¨éç¨è¯·æ±å¤çé»è¾ï¼ä¼ å
¥è®¾å¤ç±»åæè¿°ç¨äºæ¥å¿è®°å½ |
| | | ProcessDeviceRequest(conveyorLine, childDeviceCode, materialRequest, outputRequest, setOutputReady, "æææº"); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å¤çææéæºçç©æ/åºæè¯·æ± |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// æ¥æ¾ææéæºè®¾å¤ï¼è·åå½åå±çº§çç©æè¯·æ±ååºæè¯·æ±ç¶æï¼ |
| | | /// ç¶åè°ç¨éç¨å¤çé»è¾ ProcessDeviceRequestã |
| | | /// </remarks> |
| | | /// <param name="conveyorLine">è¾é线设å¤å¯¹è±¡ï¼ç¨äºéç¥ç®æ å°åå ACK</param> |
| | | /// <param name="childDeviceCode">å设å¤ç¼ç ï¼ç¨äºç²¾ç¡®å®ä½</param> |
| | | /// <param name="layer">设å¤å±çº§ï¼å³å®è¯»åä¸å±è¿æ¯ä¸å±çè¯·æ±æ å¿</param> |
| | | private void HandlePinMachine(CommonConveyorLine conveyorLine, string childDeviceCode, Layer layer) |
| | | { |
| | | // ä»å
¨å±è®¾å¤åè¡¨ä¸æ¥æ¾å为"ææéæº"çææéæºè®¾å¤å®ä¾ |
| | | var pinMachine = FindDevice<PinMachine>("ææéæº"); |
| | | if (pinMachine == null) |
| | | { |
| | | // æªæ¾å°ææéæºè®¾å¤ï¼å·²å¨ FindDevice ä¸è®°å½æ¥å¿ï¼æ¤å¤ç´æ¥è¿å |
| | | return; |
| | | } |
| | | |
| | | // è·åå½åå±çº§ï¼ä¸å±/ä¸å±ï¼çç©æè¯·æ±æ å¿ï¼éé¶è¡¨ç¤ºè®¾å¤éè¦ç©æ |
| | | bool materialRequest = GetPinMachineFlag(pinMachine, layer, isMaterial: true); |
| | | // è·åå½åå±çº§ï¼ä¸å±/ä¸å±ï¼çåºæè¯·æ±æ å¿ï¼éé¶è¡¨ç¤ºè®¾å¤æè´§è¦åº |
| | | bool outputRequest = GetPinMachineFlag(pinMachine, layer, isMaterial: false); |
| | | |
| | | // æé 设置è¾åºå°±ç»ªæ å¿çå§æï¼æ ¹æ®å±çº§åå
¥ Upper æ Lower 对åºçå¯åå¨ï¼ |
| | | Action<bool> setOutputReady = outputReady => |
| | | SetPinMachineOutputReady(pinMachine, layer, outputReady); |
| | | |
| | | // è°ç¨éç¨è¯·æ±å¤çé»è¾ï¼ä¼ å
¥è®¾å¤ç±»åæè¿°ç¨äºæ¥å¿è®°å½ |
| | | ProcessDeviceRequest(conveyorLine, childDeviceCode, materialRequest, outputRequest, setOutputReady, "ææéæº"); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ¥æ¾æå®åç§°çè®¾å¤ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// ä»å
¨å±è®¾å¤å表 Storage.Devices ä¸éè¿è®¾å¤ç±»åååç§°æ¥æ¾è®¾å¤å®ä¾ã |
| | | /// è¿æ¯ä¸ä¸ªæ³åæ¹æ³ï¼å¯ä»¥éç¨äº ConstraintMachineãPinMachine çå¤ç§è®¾å¤ç±»åã |
| | | /// </remarks> |
| | | /// <typeparam name="T">设å¤ç±»åï¼å¿
é¡»æ¯å¼ç¨ç±»åï¼å¦ ConstraintMachineãPinMachineï¼</typeparam> |
| | | /// <param name="deviceName">设å¤åç§°ï¼ç¨äºç²¾ç¡®å¹é
设å¤ç DeviceName 屿§</param> |
| | | /// <returns>æ¾å°ç设å¤å®ä¾ï¼æªæ¾å°åè¿å null</returns> |
| | | private T? FindDevice<T>(string deviceName) where T : class |
| | | { |
| | | // OfType<T>() çéåºæå®ç±»åç设å¤ï¼FirstOrDefault æå称精确å¹é
|
| | | var device = Storage.Devices.OfType<T>().FirstOrDefault(d => GetDeviceName(d) == deviceName); |
| | | if (device == null) |
| | | { |
| | | // è®¾å¤æªæ¾å°æ¶è®°å½è°è¯æ¥å¿ï¼æ¹ä¾¿ææ¥é
ç½®é®é¢ |
| | | _logger.Debug("FindDeviceï¼æªæ¾å° {DeviceName}", deviceName); |
| | | } |
| | | return device; // å¯è½ä¸º nullï¼ç±è°ç¨æ¹è´è´£ null æ£æ¥ |
| | | } |
| | | |
| | | /// <summary> |
| | | /// éè¿å¤æè·åä»»æè®¾å¤çåç§° |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// ä½¿ç¨ switch è¡¨è¾¾å¼æ ¹æ®è®¾å¤çå
·ä½ç±»åè·åå
¶ DeviceName 屿§ï¼ |
| | | /// é¿å
为æ¯ç§è®¾å¤ç±»åç¼åç¬ç«çå尿屿§è®¿é®ä»£ç ã |
| | | /// å½åæ¯æ ConstraintMachine å PinMachine 两ç§ç±»åã |
| | | /// </remarks> |
| | | /// <typeparam name="T">设å¤ç±»å</typeparam> |
| | | /// <param name="device">设å¤å®ä¾ï¼é空</param> |
| | | /// <returns>设å¤çåç§°å符串ï¼å¦æç±»åä¸å¹é
åè¿å空å符串</returns> |
| | | private static string GetDeviceName<T>(T device) where T : class |
| | | { |
| | | // 模å¼å¹é
ï¼æ ¹æ®è®¾å¤çå
·ä½è¿è¡æ¶ç±»åè¿å对åºç DeviceName |
| | | return device switch |
| | | { |
| | | ConstraintMachine cm => cm.DeviceName, // æææºè¿åå
¶è®¾å¤åç§° |
| | | PinMachine pm => pm.DeviceName, // ææéæºè¿åå
¶è®¾å¤åç§° |
| | | _ => string.Empty // æªç¥ç±»åè¿å空å符串ï¼ç论ä¸ä¸ä¼èµ°å°è¿éï¼ |
| | | }; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è·åæææºçè¯·æ±æ å¿ï¼ç©æè¯·æ±æåºæè¯·æ±ï¼ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// æ ¹æ® isMaterial åæ°å³å®è¯»åç©æè¯·æ±è¿æ¯åºæè¯·æ±å¯åå¨ï¼ |
| | | /// åæ ¹æ® layer åæ°å³å®è¯»åä¸å±ï¼Upperï¼è¿æ¯ä¸å±ï¼Lowerï¼å¯åå¨ã |
| | | /// è¿åå¼è¡¨ç¤ºè¯·æ±æ¯å¦ææï¼éé¶ä¸ºææï¼ã |
| | | /// </remarks> |
| | | /// <param name="constraint">æææºè®¾å¤å®ä¾ï¼ç¨äºè¯»å PLC å¯åå¨å¼</param> |
| | | /// <param name="layer">设å¤å±çº§ï¼å³å®è¯»å Upper è¿æ¯ Lower å¯åå¨</param> |
| | | /// <param name="isMaterial">true=读åç©æè¯·æ±æ å¿ï¼false=读ååºæè¯·æ±æ å¿</param> |
| | | /// <returns>è¯·æ±æ å¿æ¯å¦ææï¼true=æè¯·æ±ï¼false=æ 请æ±ï¼</returns> |
| | | private bool GetConstraintFlag(ConstraintMachine constraint, Layer layer, bool isMaterial) |
| | | { |
| | | // æ ¹æ® isMaterial 鿩坹åºçå¯åå¨å称对ï¼ç©æè¯·æ±æåºæè¯·æ±ï¼ |
| | | var (materialKey, outputKey) = isMaterial |
| | | ? (ConstraintMachineDBName.MaterialRequestUpper, ConstraintMachineDBName.MaterialRequestLower) // ç©æè¯·æ± |
| | | : (ConstraintMachineDBName.OutputRequestUpper, ConstraintMachineDBName.OutputRequestLower); // åºæè¯·æ± |
| | | |
| | | // æ ¹æ® layer éæ©å
·ä½ä½¿ç¨ Upper è¿æ¯ Lower çæ¬çå¯åå¨ |
| | | var key = layer == Layer.Upper ? materialKey : outputKey; |
| | | // 读åå¯åå¨å¼ï¼éé¶è¡¨ç¤ºæè¯·æ±ï¼è¿åå¸å°å¼ |
| | | return constraint.GetValue<ConstraintMachineDBName, short>(key) != 0; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è·åææéæºçè¯·æ±æ å¿ï¼ç©æè¯·æ±æåºæè¯·æ±ï¼ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// ä¸ GetConstraintFlag é»è¾ç¸åï¼ä½æä½å¯¹è±¡æ¯ææéæºï¼PinMachineï¼ã |
| | | /// æ ¹æ® isMaterial åæ°å³å®è¯»åç©æè¯·æ±è¿æ¯åºæè¯·æ±å¯åå¨ï¼ |
| | | /// åæ ¹æ® layer åæ°å³å®è¯»åä¸å±ï¼Upperï¼è¿æ¯ä¸å±ï¼Lowerï¼å¯åå¨ã |
| | | /// </remarks> |
| | | /// <param name="pinMachine">ææéæºè®¾å¤å®ä¾ï¼ç¨äºè¯»å PLC å¯åå¨å¼</param> |
| | | /// <param name="layer">设å¤å±çº§ï¼å³å®è¯»å Upper è¿æ¯ Lower å¯åå¨</param> |
| | | /// <param name="isMaterial">true=读åç©æè¯·æ±æ å¿ï¼false=读ååºæè¯·æ±æ å¿</param> |
| | | /// <returns>è¯·æ±æ å¿æ¯å¦ææï¼true=æè¯·æ±ï¼false=æ 请æ±ï¼</returns> |
| | | private bool GetPinMachineFlag(PinMachine pinMachine, Layer layer, bool isMaterial) |
| | | { |
| | | // æ ¹æ® isMaterial 鿩坹åºçå¯åå¨å称对ï¼ç©æè¯·æ±æåºæè¯·æ±ï¼ |
| | | var (materialKey, outputKey) = isMaterial |
| | | ? (PinMachineDBName.MaterialRequestUpper, PinMachineDBName.MaterialRequestLower) // ç©æè¯·æ± |
| | | : (PinMachineDBName.OutputRequestUpper, PinMachineDBName.OutputRequestLower); // åºæè¯·æ± |
| | | |
| | | // æ ¹æ® layer éæ©å
·ä½ä½¿ç¨ Upper è¿æ¯ Lower çæ¬çå¯åå¨ |
| | | var key = layer == Layer.Upper ? materialKey : outputKey; |
| | | // 读åå¯åå¨å¼ï¼éé¶è¡¨ç¤ºæè¯·æ±ï¼è¿åå¸å°å¼ |
| | | return pinMachine.GetValue<PinMachineDBName, short>(key) != 0; |
| | | } |
| | | |
| | | /// <summary> |
| | | /// è®¾ç½®æææºçè¾åºå°±ç»ªæ å¿ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// åæææºç PLC å¯åå¨åå
¥è¾åºå°±ç»ªç¶æï¼åç¥æææºå¯ä»¥ç»§ç»åºæã |
| | | /// æ ¹æ® layer åæ°å³å®åå
¥ä¸å±ï¼ConstraintTrayOutputReadyUpperï¼è¿æ¯ä¸å±ï¼ConstraintTrayOutputReadyLowerï¼å¯åå¨ã |
| | | /// </remarks> |
| | | /// <param name="constraint">æææºè®¾å¤å®ä¾ï¼ç¨äºåå
¥ PLC å¯åå¨</param> |
| | | /// <param name="layer">设å¤å±çº§ï¼å³å®åå
¥ Upper è¿æ¯ Lower å¯åå¨</param> |
| | | /// <param name="outputReady">è¾åºå°±ç»ªç¶æï¼true=å¯ä»¥åºæï¼false=ä¸è½åºæ</param> |
| | | private void SetConstraintOutputReady(ConstraintMachine constraint, Layer layer, bool outputReady) |
| | | { |
| | | // æ ¹æ® layer 鿩坹åºçè¾åºå°±ç»ªå¯åå¨ï¼Upper æ Lowerï¼ |
| | | var key = layer == Layer.Upper |
| | | ? ConstraintMachineDBName.ConstraintTrayOutputReadyUpper // ä¸å±è¾åºå°±ç»ªå¯åå¨ |
| | | : ConstraintMachineDBName.ConstraintTrayOutputReadyLower; // ä¸å±è¾åºå°±ç»ªå¯åå¨ |
| | | // å PLC åå
¥å¼ï¼outputReady 为 true æ¶åå
¥ 1ï¼å¦ååå
¥ 0 |
| | | constraint.SetValue(key, outputReady ? true : false); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 设置ææéæºçè¾åºå°±ç»ªæ å¿ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// åææéæºç PLC å¯åå¨åå
¥è¾åºå°±ç»ªç¶æï¼åç¥ææéæºå¯ä»¥ç»§ç»åºæã |
| | | /// æ ¹æ® layer åæ°å³å®åå
¥ä¸å±ï¼PlugPinTrayOutputReadyUpperï¼è¿æ¯ä¸å±ï¼PlugPinTrayOutputReadyLowerï¼å¯åå¨ã |
| | | /// </remarks> |
| | | /// <param name="pinMachine">ææéæºè®¾å¤å®ä¾ï¼ç¨äºåå
¥ PLC å¯åå¨</param> |
| | | /// <param name="layer">设å¤å±çº§ï¼å³å®åå
¥ Upper è¿æ¯ Lower å¯åå¨</param> |
| | | /// <param name="outputReady">è¾åºå°±ç»ªç¶æï¼true=å¯ä»¥åºæï¼false=ä¸è½åºæ</param> |
| | | private void SetPinMachineOutputReady(PinMachine pinMachine, Layer layer, bool outputReady) |
| | | { |
| | | // æ ¹æ® layer 鿩坹åºçè¾åºå°±ç»ªå¯åå¨ï¼Upper æ Lowerï¼ |
| | | var key = layer == Layer.Upper |
| | | ? PinMachineDBName.PlugPinTrayOutputReadyUpper // ä¸å±è¾åºå°±ç»ªå¯åå¨ |
| | | : PinMachineDBName.PlugPinTrayOutputReadyLower; // ä¸å±è¾åºå°±ç»ªå¯åå¨ |
| | | // å PLC åå
¥å¼ï¼outputReady 为 true æ¶åå
¥ 1ï¼å¦ååå
¥ 0 |
| | | pinMachine.SetValue(key, outputReady ? true : false); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å¤ç设å¤è¯·æ±çæ ¸å¿é»è¾ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// æ ¹æ®ç©æè¯·æ±ååºæè¯·æ±çç¶æå³å®è¡ä¸ºï¼ |
| | | /// - å¦æè®¾å¤éè¦ç©æï¼materialRequest=trueï¼ï¼è®¾ç½®è¾é线çç®æ å°å为 1ï¼ææè¿æ¥ï¼å¹¶åå¤ ACK ç¡®è®¤ä¿¡å· |
| | | /// - å¦æè®¾å¤ä¸éè¦ç©æï¼materialRequest=falseï¼ï¼åéç¥è®¾å¤å¯ä»¥ç»§ç»åºæï¼setOutputReadyï¼ |
| | | /// |
| | | /// è¿æ¯æææºåææéæºå
±ç¨çå¤çé»è¾ï¼è®¾å¤ç¹æçé¨å已卿¤æ¹æ³å¤å°è£
ã |
| | | /// </remarks> |
| | | /// <param name="conveyorLine">è¾é线设å¤å¯¹è±¡ï¼ç¨äºåå
¥ç®æ å°åï¼Targetï¼å ACK ä¿¡å·</param> |
| | | /// <param name="childDeviceCode">å设å¤ç¼ç ï¼ç¨äºç²¾ç¡®å®ä½åå
¥åªä¸ªå设å¤</param> |
| | | /// <param name="materialRequest">ç©æè¯·æ±æ å¿ï¼true=设å¤å½åéè¦è¡¥å
ç©æ</param> |
| | | /// <param name="outputRequest">åºæè¯·æ±æ å¿ï¼true=设å¤å½åæç©æéè¦è¾åºï¼é
å materialRequest=false æ¶ä½¿ç¨ï¼</param> |
| | | /// <param name="setOutputReady">设置设å¤è¾åºå°±ç»ªæ å¿çå§æï¼æ ¹æ®å±çº§åå
¥ Upper æ Lower å¯åå¨</param> |
| | | /// <param name="deviceType">设å¤ç±»åæè¿°å符串ï¼ç¨äºæ¥å¿è¾åº</param> |
| | | private void ProcessDeviceRequest( |
| | | CommonConveyorLine conveyorLine, |
| | | string childDeviceCode, |
| | | bool materialRequest, |
| | | bool outputRequest, |
| | | Action<bool> setOutputReady, |
| | | string deviceType) |
| | | { |
| | | // è®°å½å½å请æ±ç¶æçè°è¯æ¥å¿ï¼ä¾ææ¥é®é¢ä½¿ç¨ |
| | | QuartzLogHelper.LogDebug(_logger, "ProcessDeviceRequestï¼{DeviceType}ï¼å设å¤: {ChildDeviceCode}ï¼ç©æè¯·æ±: {MaterialReq}ï¼åºæè¯·æ±: {OutputReq}", $"ProcessDeviceRequestï¼{deviceType}ï¼å设å¤: {childDeviceCode}ï¼ç©æè¯·æ±: {materialRequest}ï¼åºæè¯·æ±: {outputRequest}", conveyorLine.DeviceCode, deviceType, childDeviceCode, materialRequest, outputRequest); |
| | | |
| | | // 忝夿ï¼è®¾å¤æ¯éè¦ç©æè¿æ¯éè¦åºæ |
| | | if (materialRequest) |
| | | { |
| | | // 设å¤éè¦ç©æ -> éç¥è¾é线ææè¿æ¥ |
| | | // 1. è®¾ç½®ç®æ å°å为 1ï¼è¡¨ç¤º"ææè¿å
¥" |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.Target, 1, childDeviceCode); |
| | | // 2. åå¤ ACK 确认信å·ï¼åç¥è®¾å¤å·²æ¶å°è¯·æ± |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, 1, childDeviceCode); |
| | | // 3. è®°å½ä¿¡æ¯æ¥å¿ï¼è¡¨æå·²å®æç®æ å°å设置å ACK åå¤ |
| | | QuartzLogHelper.LogInfo(_logger, "ProcessDeviceRequestï¼{DeviceType} éè¦ç©æï¼å·²è®¾ç½®ç®æ å°ååACK", $"ProcessDeviceRequestï¼{deviceType} éè¦ç©æï¼å·²è®¾ç½®ç®æ å°ååACK", conveyorLine.DeviceCode, deviceType); |
| | | } |
| | | else |
| | | { |
| | | // 设å¤ä¸éè¦ç©æ -> éç¥è®¾å¤å¯ä»¥ç»§ç»åºæï¼æ 论å½åæ¯å¦æè´§è¦åºï¼é½è¦éç¥ï¼ |
| | | // outputRequest 表示设å¤å½åæ¯å¦ç¡®å®æè´§ï¼å¦ææ²¡æè´§å outputReady=falseï¼è®¾å¤æ¶å°åçå¾
|
| | | setOutputReady(outputRequest); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// åå
¥è°è¯æ¥å¿ï¼åæ¶è¾åºå°ä¸¤ä¸ªæ¥å¿ç³»ç»ï¼ |
| | | /// </summary> |
| | |
| | | var isTaskNum = conveyorLine.SetValue(ConveyorLineDBNameNew.TaskNo, (short)task.TaskNum, childDeviceCode); |
| | | if (!isTaskNum) return; |
| | | QuartzLogHelper.LogInfo(_logger, $"ä»»å¡å·åå
¥PLCæåï¼ä»»å¡å·ã{task.TaskNum}ã", conveyorLine.DeviceCode); |
| | | Thread.Sleep(500); |
| | | |
| | | //// åå
¥èµ·å§å°å |
| | | //conveyorLine.SetValue(ConveyorLineDBNameNew.Source, short.Parse(task.SourceAddress ?? "0"), childDeviceCode); |
| | | //QuartzLogHelper.LogInfo(_logger, $"ä»»å¡å·åå
¥PLCæåï¼ä»»å¡å·ã{task.TaskNum}ã", conveyorLine.DeviceCode); |
| | | //Thread.Sleep(500); |
| | | Thread.Sleep(100); |
| | | |
| | | // åå
¥ç®æ å°å |
| | | var isTarget = conveyorLine.SetValue(ConveyorLineDBNameNew.Target, short.Parse(task.NextAddress ?? "0"), childDeviceCode); |
| | | if (!isTarget) return; |
| | | QuartzLogHelper.LogInfo(_logger, $"ç®æ å°ååå
¥PLCæåï¼ç®æ å°åã{task.NextAddress}ã", conveyorLine.DeviceCode); |
| | | Thread.Sleep(500); |
| | | |
| | | // åå
¥æçå· |
| | | //conveyorLine.SetValue(ConveyorLineDBNameNew.Barcode, task.PalletCode, childDeviceCode); |
| | | Thread.Sleep(100); |
| | | |
| | | // æ´æ°ä»»å¡ç¶æå°ä¸ä¸é¶æ®µ |
| | | var updateResult = _taskService.UpdateTaskStatusToNext(task); |
| | |
| | | // åå
¥ACKæ å¿ |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, childDeviceCode); |
| | | |
| | | QuartzLogHelper.LogInfo(_logger, $"ManualInboundTaskHandler: æå¨ä»»å¡åå
¥PLCæåï¼ä»»å¡å·ã{task.TaskNum}ãï¼æºå°åã{task.SourceAddress}ãï¼ç®æ å°åã{task.NextAddress}ã", conveyorLine.DeviceCode); |
| | | QuartzLogHelper.LogInfo(_logger, $"ManualInboundTaskHandler: ä»»å¡åå
¥PLCæåï¼ä»»å¡å·ã{task.TaskNum}ãï¼æºå°åã{task.SourceAddress}ãï¼ç®æ å°åã{task.NextAddress}ã", conveyorLine.DeviceCode); |
| | | } |
| | | catch (Exception ex) |
| | | { |
| | |
| | | /// <param name="clientId">客æ·ç«¯æ è¯ï¼éå¸¸æ¯ IP å°åï¼</param> |
| | | /// <param name="cancellationToken">忶令ç</param> |
| | | /// <param name="robotCrane">æºå¨äººç¶æå¯¹è±¡</param> |
| | | Task HandleClientAsync(TcpClient client, string clientId, CancellationToken cancellationToken, RobotSocketState robotCrane); |
| | | Task HandleClientAsync(TcpClient client, string clientId, CancellationToken cancellationToken); |
| | | } |
| | | } |
| | |
| | | |
| | | // 弿¥å¯å¨å®¢æ·ç«¯æ¶æ¯å¤çå¾ªç¯ |
| | | // ä½¿ç¨ TaskContinuationOptions.OnlyOnFaulted æè·å¼å¸¸æ
åµ |
| | | _ = _tcpSocket.HandleClientAsync(tcpClient, robotCrane.IPAddress, _tcpSocket._cts.Token, latestStateForSubscribe) |
| | | _ = _tcpSocket.HandleClientAsync(tcpClient, robotCrane.IPAddress, _tcpSocket._cts.Token) |
| | | .ContinueWith(t => |
| | | { |
| | | // 妿å¤çåºç°å¼å¸¸ |
| | |
| | | return false; |
| | | } |
| | | |
| | | // è§£æè¿åçä»»å¡ä¿¡æ¯ |
| | | //var taskInfos = JsonConvert.DeserializeObject<List<Dt_Task>>(content.Data.ToJson() ?? string.Empty) ?? new List<Dt_Task>(); |
| | | //var taskInfo = taskInfos.FirstOrDefault(); |
| | | |
| | | //// è·åæºå°å |
| | | //string sourceAddress = taskDTO.SourceAddress; |
| | | |
| | | //// æ¥æ¾æºå°å对åºçè¾éçº¿è®¾å¤ |
| | | //IDevice? device = Storage.Devices.FirstOrDefault(x => x.DeviceProDTOs.Any(d => d.DeviceChildCode == sourceAddress)); |
| | | |
| | | //if (device != null) |
| | | //{ |
| | | // // å°è®¾å¤è½¬æ¢ä¸ºè¾é线类å |
| | | // CommonConveyorLine conveyorLine = (CommonConveyorLine)device; |
| | | |
| | | // // 设置è¾é线çç®æ å°å |
| | | // conveyorLine.SetValue(ConveyorLineDBNameNew.Target, taskInfo.NextAddress, sourceAddress); |
| | | |
| | | // // 设置è¾é线çä»»å¡å· |
| | | // conveyorLine.SetValue(ConveyorLineDBNameNew.TaskNo, taskInfo.TaskNum, sourceAddress); |
| | | |
| | | // // 触åè¾é线å¼å§æ§è¡ï¼åå
¥ WCS_ACK = 1ï¼ |
| | | // conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, (short)1, sourceAddress); |
| | | |
| | | // // æ´æ°ä»»å¡ç¶æå°ä¸ä¸é¶æ®µ |
| | | // if (_taskService.UpdateTaskStatusToNext(taskInfo).Status) |
| | | // { |
| | | // _logger.LogInformation("HandleInboundTaskAsyncï¼å
¥åºä»»å¡å¤çæåï¼ä»»å¡å·: {TaskNum}", taskInfo.TaskNum); |
| | | // QuartzLogger.Info($"HandleInboundTaskAsyncï¼å
¥åºä»»å¡å¤çæåï¼ä»»å¡å·: {taskInfo.TaskNum}", state.RobotCrane?.DeviceName ?? "Unknown"); |
| | | // return true; |
| | | // } |
| | | //} |
| | | |
| | | return true; |
| | | } |
| | | |
| | |
| | | /// <param name="cancellationToken">忶令ç</param> |
| | | /// <param name="robotCrane">æºå¨äººç¶æ</param> |
| | | /// <returns>ä»»å¡</returns> |
| | | public Task HandleClientAsync(TcpClient client, string clientId, CancellationToken cancellationToken, RobotSocketState robotCrane) |
| | | public Task HandleClientAsync(TcpClient client, string clientId, CancellationToken cancellationToken) |
| | | { |
| | | return _tcpSocket.HandleClientAsync(client, clientId, cancellationToken, robotCrane); |
| | | return _tcpSocket.HandleClientAsync(client, clientId, cancellationToken); |
| | | } |
| | | } |
| | | } |
| | |
| | | /// <param name="client">TCP 客æ·ç«¯è¿æ¥</param> |
| | | /// <param name="clientId">客æ·ç«¯å¯ä¸æ è¯</param> |
| | | /// <param name="cancellationToken">忶令ç</param> |
| | | /// <param name="robotCrane">æºå¨äººç¶æ</param> |
| | | public async Task HandleClientAsync(TcpClient client, string clientId, CancellationToken cancellationToken, RobotSocketState robotCrane) |
| | | public async Task HandleClientAsync(TcpClient client, string clientId, CancellationToken cancellationToken) |
| | | { |
| | | using (client) |
| | | using (NetworkStream networkStream = client.GetStream()) |
| | |
| | | break; |
| | | } |
| | | |
| | | if(message == lastMessage) |
| | | // æå®¢æ·ç«¯å»éï¼æ£æ¥æ¯å¦ä¸è¯¥å®¢æ·ç«¯ä¸æ¬¡æ¶æ¯ç¸å |
| | | lock (_syncRoot) |
| | | { |
| | | // é夿¶æ¯ï¼å¿½ç¥ |
| | | continue; |
| | | if (_clientLastMessage.TryGetValue(clientId, out var prev) && message == prev) |
| | | { |
| | | continue; |
| | | } |
| | | _clientLastMessage[clientId] = message; |
| | | } |
| | | |
| | | // æ´æ°å®¢æ·ç«¯ç¶æ |
| | |
| | | // ç§»é¤æ´»è·æ¶é´è®°å½ |
| | | _clientLastActive.Remove(clientId); |
| | | |
| | | // ç§»é¤ä¸æ¬¡æ¶æ¯è®°å½ |
| | | _clientLastMessage.Remove(clientId); |
| | | |
| | | // ç§»é¤ç¼ç è®°å½ |
| | | _clientEncodings.Remove(clientId); |
| | | |
| | |
| | | using Microsoft.Extensions.Options; |
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.IO; |
| | | using System.Net.Sockets; |
| | | using System.Text; |
| | | using System.Threading; |
| | | using System.Threading.Tasks; |
| | | using WIDESEAWCS_Model.Models; |
| | | using WIDESEAWCS_QuartzJob; |
| | | |
| | | namespace WIDESEAWCS_Tasks.SocketServer |
| | | { |
| | |
| | | public bool IsRunning { get; private set; } |
| | | |
| | | /// <summary> |
| | | /// 䏿¬¡æ¥æ¶æ¶æ¯æº |
| | | /// æ¯ä¸ªå®¢æ·ç«¯ä¸æ¬¡æ¥æ¶çæ¶æ¯ï¼ç¨äºå»é |
| | | /// </summary> |
| | | public string lastMessage; |
| | | /// <remarks> |
| | | /// Key: 客æ·ç«¯ ID |
| | | /// Value: 䏿¬¡æ¥æ¶çæ¶æ¯å
容 |
| | | /// </remarks> |
| | | public readonly Dictionary<string, string> _clientLastMessage = new(); |
| | | |
| | | /// <summary> |
| | | /// æ¶æ¯æ¥æ¶äºä»¶ |
| | |
| | | /// <param name="message">æ¥å¿æ¶æ¯</param> |
| | | private void Log(string message) |
| | | { |
| | | //Logger.None.Information(message); |
| | | Console.WriteLine(message); |
| | | try { File.AppendAllText(_logFile, message + Environment.NewLine); } catch { } |
| | | } |
| | | } |
| | | } |
| | | } |
| | |
| | | { |
| | | // å
è¿è¡æ¬å°ç«å°æ£æ¥ï¼PLC 读åï¼å¿«éï¼ï¼é¿å
ä¸å¿
è¦ç WMS HTTP è°ç¨ |
| | | |
| | | // 夿 TargetAddress è¾é线ç«å°æ¯å¦ç©ºé² |
| | | if (!IsTargetAddressConveyorStationAvailable(outboundTask)) |
| | | if (outboundTask.TaskType != (int)TaskOutboundTypeEnum.OutEmpty) |
| | | { |
| | | return null; |
| | | // 夿 TargetAddress è¾é线ç«å°æ¯å¦ç©ºé² |
| | | if (!IsTargetAddressConveyorStationAvailable(outboundTask)) |
| | | { |
| | | return null; |
| | | } |
| | | } |
| | | |
| | | // 夿 NextAddress åºåºç«å°æ¯å¦å¯ç¨ |
| | |
| | | /// <param name="deviceName">设å¤åç§°ï¼ç¨äºå¨æMESåè¯æ¥è¯¢ï¼</param> |
| | | /// <returns>æä½ç»æ</returns> |
| | | Task<WebResponseContent> GroupPalletConfirmAsync(string palletCode, string deviceName); |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®æçå·æ¥è¯¢åºåæç»æ°é |
| | | /// </summary> |
| | | /// <param name="palletCode">æçå·</param> |
| | | /// <returns>åºåæç»æ°é</returns> |
| | | Task<WebResponseContent> GetStockDetailCountByPalletCodeAsync(string palletCode); |
| | | } |
| | | } |
| | |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®æçå·æ¥è¯¢åºåæç»æ°é |
| | | /// </summary> |
| | | /// <param name="palletCode">æçå·</param> |
| | | /// <returns>åºåæç»æ°é</returns> |
| | | public async Task<WebResponseContent> GetStockDetailCountByPalletCodeAsync(string palletCode) |
| | | { |
| | | WebResponseContent content = new WebResponseContent(); |
| | | if (string.IsNullOrWhiteSpace(palletCode)) |
| | | return content.Error("æçå·ä¸è½ä¸ºç©º"); |
| | | |
| | | var stockInfo = StockInfoService.Repository.QueryFirst(s => s.PalletCode == palletCode); |
| | | if (stockInfo == null) |
| | | return content.Error("æçä¸åå¨"); |
| | | |
| | | var count = await StockInfoDetailService.Repository.Db.Queryable<Dt_StockInfoDetail>() |
| | | .CountAsync(d => d.StockId == stockInfo.Id); |
| | | return content.OK("æ¥è¯¢æå", new { PalletCode = palletCode, DetailCount = count }); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®è®¾å¤åç§°åæçå·è§£æMES设å¤é
ç½® |
| | | /// </summary> |
| | | /// <param name="deviceName">设å¤åç§°</param> |
| | |
| | | PalletType = stock.PalletType, |
| | | SourceAddress = stock.LocationCode, |
| | | CurrentAddress = stock.LocationCode, |
| | | NextAddress = TaskAddressConstants.DEFAULT_ADDRESS, |
| | | NextAddress = TaskAddressConstants.GRADING_OUTBOUND_ADDRESS, |
| | | TargetAddress = TaskAddressConstants.GRADING_OUTBOUND_ADDRESS, |
| | | Roadway = stock.LocationDetails.RoadwayNo, |
| | | TaskType = TaskOutboundTypeEnum.Outbound.GetHashCode(), |
| | |
| | | { |
| | | var result = await BaseDal.AddDataAsync(taskList) > 0; |
| | | var wmstaskDto = result ? _mapper.Map<WMSTaskDTO>(taskList) : null; |
| | | |
| | | var httpResponse = _httpClientHelper.Post<WebResponseContent>("http://logistics-service/api/logistics/notifyoutbound", JsonSerializer.Serialize(wmstaskDto)).Data; |
| | | var wmsTaskDtos = new List<WMSTaskDTO> { wmstaskDto }; |
| | | var httpResponse = _httpClientHelper.Post<WebResponseContent>("http://localhost:9292/api/Task/ReceiveTask", JsonSerializer.Serialize(wmsTaskDtos)).Data; |
| | | if (result && httpResponse != null) |
| | | { |
| | | return content.OK("åºåºè¯·æ±æå"); |
| | |
| | | // è¿æ»¤æä½ç½®ä¸ä½ç½®æåºåçè®°å½ |
| | | expiredStocks = expiredStocks |
| | | .Where(s => s.LocationDetails != null |
| | | && s.LocationDetails.LocationStatus == LocationStatusEnum.InStock.GetHashCode()) |
| | | && s.LocationDetails.LocationStatus == LocationStatusEnum.InStock.GetHashCode() |
| | | && s.LocationDetails.EnableStatus != EnableStatusEnum.Disable.GetHashCode()) |
| | | .ToList(); |
| | | |
| | | if (!expiredStocks.Any()) |
| | |
| | | var stockInfo = await _stockInfoService.GetStockInfoAsync(taskDto.PalletCode); |
| | | if (stockInfo == null) return WebResponseContent.Instance.Error("æªæ¾å°å¯¹åºåºåä¿¡æ¯"); |
| | | |
| | | stockInfo.LocationCode = location.LocationCode; |
| | | stockInfo.LocationId = location.Id; |
| | | stockInfo.StockStatus = StockStatusEmun.空æçåºå.GetHashCode(); |
| | | |
| | | location.LocationStatus = LocationStatusEnum.InStock.GetHashCode(); |
| | | |
| | | return await _unitOfWorkManage.BeginTranAsync(async () => |
| | | { |
| | | stockInfo.LocationCode = location.LocationCode; |
| | | stockInfo.LocationId = location.Id; |
| | | stockInfo.StockStatus = StockStatusEmun.空æçåºå.GetHashCode(); |
| | | |
| | | location.LocationStatus = LocationStatusEnum.InStock.GetHashCode(); |
| | | |
| | | var updateLocationResult = await _locationInfoService.UpdateLocationInfoAsync(location); |
| | | var updateStockResult = await _stockInfoService.UpdateStockAsync(stockInfo); |
| | | if (!updateLocationResult || !updateStockResult) |
| | |
| | | { |
| | | return await Service.GroupPalletConfirmAsync(dto.PalletCode, dto.DeviceName); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// æ ¹æ®æçå·æ¥è¯¢åºåæç»æ°é |
| | | /// </summary> |
| | | /// <param name="palletCode">æçå·</param> |
| | | /// <returns>åºåæç»æ°é</returns> |
| | | [HttpGet("GetStockDetailCount"), AllowAnonymous] |
| | | public async Task<WebResponseContent> GetStockDetailCount(string palletCode) |
| | | { |
| | | return await Service.GetStockDetailCountByPalletCodeAsync(palletCode); |
| | | } |
| | | } |
| | | } |
| | |
| | | "id": "1001", |
| | | "name": "A\u533A_\u4E00\u6CE8\u8F93\u9001\u7EBF", |
| | | "plcType": "S71500", |
| | | "port": 103, |
| | | "port": 102, |
| | | "activationKey": "", |
| | | "autoStart": false, |
| | | "protocolTemplateId": "protocol-1001", |
| | |
| | | "id": "1002", |
| | | "name": "A\u533A_\u6362\u76D8\u8F93\u9001\u7EBF", |
| | | "plcType": "S71500", |
| | | "port": 104, |
| | | "port": 102, |
| | | "activationKey": "", |
| | | "autoStart": false, |
| | | "protocolTemplateId": "protocol-1002", |
| | |
| | | "direction": 2 |
| | | } |
| | | ] |
| | | }, |
| | | { |
| | | "id": "protocol-1004", |
| | | "name": "B\u533A_\u5E38\u6E29\u5316\u6210\u8F93\u9001\u7EBF \u534F\u8BAE\u6A21\u677F", |
| | | "version": "1.0", |
| | | "fields": [ |
| | | { |
| | | "fieldKey": "2125_TaskNo", |
| | | "dbNumber": 50, |
| | | "offset": 960, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2125_Source", |
| | | "dbNumber": 50, |
| | | "offset": 962, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2125_Target", |
| | | "dbNumber": 50, |
| | | "offset": 964, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2125_BoxType", |
| | | "dbNumber": 50, |
| | | "offset": 966, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2125_CV_State", |
| | | "dbNumber": 50, |
| | | "offset": 967, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2125_CV_ERRCode", |
| | | "dbNumber": 50, |
| | | "offset": 968, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2125_WCS_STB", |
| | | "dbNumber": 50, |
| | | "offset": 969, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2125_WCS_ACK", |
| | | "dbNumber": 50, |
| | | "offset": 970, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2125_PLC_STB", |
| | | "dbNumber": 50, |
| | | "offset": 971, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2125_PLC_ACK", |
| | | "dbNumber": 50, |
| | | "offset": 972, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2125_PLC_REQ", |
| | | "dbNumber": 50, |
| | | "offset": 973, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2125_WCS_ERRCode", |
| | | "dbNumber": 50, |
| | | "offset": 974, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2125_WCS_Special", |
| | | "dbNumber": 50, |
| | | "offset": 975, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2125_Equ_Auto", |
| | | "dbNumber": 50, |
| | | "offset": 976, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2125_Last_pallet", |
| | | "dbNumber": 50, |
| | | "offset": 977, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2125_Barcode", |
| | | "dbNumber": 50, |
| | | "offset": 978, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 20, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2125_Spare_1", |
| | | "dbNumber": 50, |
| | | "offset": 998, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2125_Spare_2", |
| | | "dbNumber": 50, |
| | | "offset": 999, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2217_TaskNo", |
| | | "dbNumber": 50, |
| | | "offset": 4640, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2217_Source", |
| | | "dbNumber": 50, |
| | | "offset": 4642, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2217_Target", |
| | | "dbNumber": 50, |
| | | "offset": 4644, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2217_BoxType", |
| | | "dbNumber": 50, |
| | | "offset": 4646, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2217_CV_State", |
| | | "dbNumber": 50, |
| | | "offset": 4647, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2217_CV_ERRCode", |
| | | "dbNumber": 50, |
| | | "offset": 4648, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2217_WCS_STB", |
| | | "dbNumber": 50, |
| | | "offset": 4649, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2217_WCS_ACK", |
| | | "dbNumber": 50, |
| | | "offset": 4650, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2217_PLC_STB", |
| | | "dbNumber": 50, |
| | | "offset": 4651, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2217_PLC_ACK", |
| | | "dbNumber": 50, |
| | | "offset": 4652, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2217_PLC_REQ", |
| | | "dbNumber": 50, |
| | | "offset": 4653, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2217_WCS_ERRCode", |
| | | "dbNumber": 50, |
| | | "offset": 4654, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2217_WCS_Special", |
| | | "dbNumber": 50, |
| | | "offset": 4655, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2217_Equ_Auto", |
| | | "dbNumber": 50, |
| | | "offset": 4656, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2217_Last_pallet", |
| | | "dbNumber": 50, |
| | | "offset": 4657, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2217_Barcode", |
| | | "dbNumber": 50, |
| | | "offset": 4658, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 20, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2217_Spare_1", |
| | | "dbNumber": 50, |
| | | "offset": 4678, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2217_Spare_2", |
| | | "dbNumber": 50, |
| | | "offset": 4679, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2101_TaskNo", |
| | | "dbNumber": 50, |
| | | "offset": 0, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2101_Source", |
| | | "dbNumber": 50, |
| | | "offset": 2, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2101_Target", |
| | | "dbNumber": 50, |
| | | "offset": 4, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2101_BoxType", |
| | | "dbNumber": 50, |
| | | "offset": 6, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2101_CV_State", |
| | | "dbNumber": 50, |
| | | "offset": 7, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2101_CV_ERRCode", |
| | | "dbNumber": 50, |
| | | "offset": 8, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2101_WCS_STB", |
| | | "dbNumber": 50, |
| | | "offset": 9, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2101_WCS_ACK", |
| | | "dbNumber": 50, |
| | | "offset": 10, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2101_PLC_STB", |
| | | "dbNumber": 50, |
| | | "offset": 11, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2101_PLC_ACK", |
| | | "dbNumber": 50, |
| | | "offset": 12, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2101_PLC_REQ", |
| | | "dbNumber": 50, |
| | | "offset": 13, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2101_WCS_ERRCode", |
| | | "dbNumber": 50, |
| | | "offset": 14, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2101_WCS_Special", |
| | | "dbNumber": 50, |
| | | "offset": 15, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2101_Equ_Auto", |
| | | "dbNumber": 50, |
| | | "offset": 16, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2101_Last_pallet", |
| | | "dbNumber": 50, |
| | | "offset": 17, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2101_Barcode", |
| | | "dbNumber": 50, |
| | | "offset": 18, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 20, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2101_Spare_1", |
| | | "dbNumber": 50, |
| | | "offset": 38, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2101_Spare_2", |
| | | "dbNumber": 50, |
| | | "offset": 39, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2103_TaskNo", |
| | | "dbNumber": 50, |
| | | "offset": 80, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2103_Source", |
| | | "dbNumber": 50, |
| | | "offset": 82, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2103_Target", |
| | | "dbNumber": 50, |
| | | "offset": 84, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2103_BoxType", |
| | | "dbNumber": 50, |
| | | "offset": 86, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2103_CV_State", |
| | | "dbNumber": 50, |
| | | "offset": 87, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2103_CV_ERRCode", |
| | | "dbNumber": 50, |
| | | "offset": 88, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2103_WCS_STB", |
| | | "dbNumber": 50, |
| | | "offset": 89, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2103_WCS_ACK", |
| | | "dbNumber": 50, |
| | | "offset": 90, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2103_PLC_STB", |
| | | "dbNumber": 50, |
| | | "offset": 91, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2103_PLC_ACK", |
| | | "dbNumber": 50, |
| | | "offset": 92, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2103_PLC_REQ", |
| | | "dbNumber": 50, |
| | | "offset": 93, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2103_WCS_ERRCode", |
| | | "dbNumber": 50, |
| | | "offset": 94, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2103_WCS_Special", |
| | | "dbNumber": 50, |
| | | "offset": 95, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2103_Equ_Auto", |
| | | "dbNumber": 50, |
| | | "offset": 96, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2103_Last_pallet", |
| | | "dbNumber": 50, |
| | | "offset": 97, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2103_Barcode", |
| | | "dbNumber": 50, |
| | | "offset": 98, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 20, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2103_Spare_1", |
| | | "dbNumber": 50, |
| | | "offset": 118, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2103_Spare_2", |
| | | "dbNumber": 50, |
| | | "offset": 119, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2118_TaskNo", |
| | | "dbNumber": 50, |
| | | "offset": 680, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2118_Source", |
| | | "dbNumber": 50, |
| | | "offset": 682, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2118_Target", |
| | | "dbNumber": 50, |
| | | "offset": 684, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2118_BoxType", |
| | | "dbNumber": 50, |
| | | "offset": 686, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2118_CV_State", |
| | | "dbNumber": 50, |
| | | "offset": 687, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2118_CV_ERRCode", |
| | | "dbNumber": 50, |
| | | "offset": 688, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2118_WCS_STB", |
| | | "dbNumber": 50, |
| | | "offset": 689, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2118_WCS_ACK", |
| | | "dbNumber": 50, |
| | | "offset": 690, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2118_PLC_STB", |
| | | "dbNumber": 50, |
| | | "offset": 691, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2118_PLC_ACK", |
| | | "dbNumber": 50, |
| | | "offset": 692, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2118_PLC_REQ", |
| | | "dbNumber": 50, |
| | | "offset": 693, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2118_WCS_ERRCode", |
| | | "dbNumber": 50, |
| | | "offset": 694, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2118_WCS_Special", |
| | | "dbNumber": 50, |
| | | "offset": 695, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2118_Equ_Auto", |
| | | "dbNumber": 50, |
| | | "offset": 696, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2118_Last_pallet", |
| | | "dbNumber": 50, |
| | | "offset": 697, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2118_Barcode", |
| | | "dbNumber": 50, |
| | | "offset": 698, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 20, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2118_Spare_1", |
| | | "dbNumber": 50, |
| | | "offset": 718, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2118_Spare_2", |
| | | "dbNumber": 50, |
| | | "offset": 719, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2117_TaskNo", |
| | | "dbNumber": 50, |
| | | "offset": 640, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2117_Source", |
| | | "dbNumber": 50, |
| | | "offset": 642, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2117_Target", |
| | | "dbNumber": 50, |
| | | "offset": 644, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2117_BoxType", |
| | | "dbNumber": 50, |
| | | "offset": 646, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2117_CV_State", |
| | | "dbNumber": 50, |
| | | "offset": 647, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2117_CV_ERRCode", |
| | | "dbNumber": 50, |
| | | "offset": 648, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2117_WCS_STB", |
| | | "dbNumber": 50, |
| | | "offset": 649, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2117_WCS_ACK", |
| | | "dbNumber": 50, |
| | | "offset": 650, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2117_PLC_STB", |
| | | "dbNumber": 50, |
| | | "offset": 651, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2117_PLC_ACK", |
| | | "dbNumber": 50, |
| | | "offset": 652, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2117_PLC_REQ", |
| | | "dbNumber": 50, |
| | | "offset": 653, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2117_WCS_ERRCode", |
| | | "dbNumber": 50, |
| | | "offset": 654, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2117_WCS_Special", |
| | | "dbNumber": 50, |
| | | "offset": 655, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2117_Equ_Auto", |
| | | "dbNumber": 50, |
| | | "offset": 656, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2117_Last_pallet", |
| | | "dbNumber": 50, |
| | | "offset": 657, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2117_Barcode", |
| | | "dbNumber": 50, |
| | | "offset": 658, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 20, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2117_Spare_1", |
| | | "dbNumber": 50, |
| | | "offset": 678, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2117_Spare_2", |
| | | "dbNumber": 50, |
| | | "offset": 679, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2209_TaskNo", |
| | | "dbNumber": 50, |
| | | "offset": 4320, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2209_Source", |
| | | "dbNumber": 50, |
| | | "offset": 4322, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2209_Target", |
| | | "dbNumber": 50, |
| | | "offset": 4324, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2209_BoxType", |
| | | "dbNumber": 50, |
| | | "offset": 4326, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2209_CV_State", |
| | | "dbNumber": 50, |
| | | "offset": 4327, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2209_CV_ERRCode", |
| | | "dbNumber": 50, |
| | | "offset": 4328, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2209_WCS_STB", |
| | | "dbNumber": 50, |
| | | "offset": 4329, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2209_WCS_ACK", |
| | | "dbNumber": 50, |
| | | "offset": 4330, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2209_PLC_STB", |
| | | "dbNumber": 50, |
| | | "offset": 4331, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2209_PLC_ACK", |
| | | "dbNumber": 50, |
| | | "offset": 4332, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2209_PLC_REQ", |
| | | "dbNumber": 50, |
| | | "offset": 4333, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2209_WCS_ERRCode", |
| | | "dbNumber": 50, |
| | | "offset": 4334, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2209_WCS_Special", |
| | | "dbNumber": 50, |
| | | "offset": 4335, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2209_Equ_Auto", |
| | | "dbNumber": 50, |
| | | "offset": 4336, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2209_Last_pallet", |
| | | "dbNumber": 50, |
| | | "offset": 4337, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2209_Barcode", |
| | | "dbNumber": 50, |
| | | "offset": 4338, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 20, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2209_Spare_1", |
| | | "dbNumber": 50, |
| | | "offset": 4358, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2209_Spare_2", |
| | | "dbNumber": 50, |
| | | "offset": 4359, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2210_TaskNo", |
| | | "dbNumber": 50, |
| | | "offset": 4360, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2210_Source", |
| | | "dbNumber": 50, |
| | | "offset": 4362, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2210_Target", |
| | | "dbNumber": 50, |
| | | "offset": 4364, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2210_BoxType", |
| | | "dbNumber": 50, |
| | | "offset": 4366, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2210_CV_State", |
| | | "dbNumber": 50, |
| | | "offset": 4367, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2210_CV_ERRCode", |
| | | "dbNumber": 50, |
| | | "offset": 4368, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2210_WCS_STB", |
| | | "dbNumber": 50, |
| | | "offset": 4369, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2210_WCS_ACK", |
| | | "dbNumber": 50, |
| | | "offset": 4370, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2210_PLC_STB", |
| | | "dbNumber": 50, |
| | | "offset": 4371, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2210_PLC_ACK", |
| | | "dbNumber": 50, |
| | | "offset": 4372, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2210_PLC_REQ", |
| | | "dbNumber": 50, |
| | | "offset": 4373, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2210_WCS_ERRCode", |
| | | "dbNumber": 50, |
| | | "offset": 4374, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2210_WCS_Special", |
| | | "dbNumber": 50, |
| | | "offset": 4375, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2210_Equ_Auto", |
| | | "dbNumber": 50, |
| | | "offset": 4376, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2210_Last_pallet", |
| | | "dbNumber": 50, |
| | | "offset": 4377, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2210_Barcode", |
| | | "dbNumber": 50, |
| | | "offset": 4378, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 20, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2210_Spare_1", |
| | | "dbNumber": 50, |
| | | "offset": 4398, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2210_Spare_2", |
| | | "dbNumber": 50, |
| | | "offset": 4399, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2120_TaskNo", |
| | | "dbNumber": 50, |
| | | "offset": 760, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2120_Source", |
| | | "dbNumber": 50, |
| | | "offset": 762, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2120_Target", |
| | | "dbNumber": 50, |
| | | "offset": 764, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2120_BoxType", |
| | | "dbNumber": 50, |
| | | "offset": 766, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2120_CV_State", |
| | | "dbNumber": 50, |
| | | "offset": 767, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2120_CV_ERRCode", |
| | | "dbNumber": 50, |
| | | "offset": 768, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2120_WCS_STB", |
| | | "dbNumber": 50, |
| | | "offset": 769, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2120_WCS_ACK", |
| | | "dbNumber": 50, |
| | | "offset": 770, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2120_PLC_STB", |
| | | "dbNumber": 50, |
| | | "offset": 771, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2120_PLC_ACK", |
| | | "dbNumber": 50, |
| | | "offset": 772, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2120_PLC_REQ", |
| | | "dbNumber": 50, |
| | | "offset": 773, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2120_WCS_ERRCode", |
| | | "dbNumber": 50, |
| | | "offset": 774, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2120_WCS_Special", |
| | | "dbNumber": 50, |
| | | "offset": 775, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2120_Equ_Auto", |
| | | "dbNumber": 50, |
| | | "offset": 776, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2120_Last_pallet", |
| | | "dbNumber": 50, |
| | | "offset": 777, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2120_Barcode", |
| | | "dbNumber": 50, |
| | | "offset": 778, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 20, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2120_Spare_1", |
| | | "dbNumber": 50, |
| | | "offset": 798, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2120_Spare_2", |
| | | "dbNumber": 50, |
| | | "offset": 799, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2211_TaskNo", |
| | | "dbNumber": 50, |
| | | "offset": 4400, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2211_Source", |
| | | "dbNumber": 50, |
| | | "offset": 4402, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2211_Target", |
| | | "dbNumber": 50, |
| | | "offset": 4404, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2211_BoxType", |
| | | "dbNumber": 50, |
| | | "offset": 4406, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2211_CV_State", |
| | | "dbNumber": 50, |
| | | "offset": 4407, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2211_CV_ERRCode", |
| | | "dbNumber": 50, |
| | | "offset": 4408, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2211_WCS_STB", |
| | | "dbNumber": 50, |
| | | "offset": 4409, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2211_WCS_ACK", |
| | | "dbNumber": 50, |
| | | "offset": 4410, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2211_PLC_STB", |
| | | "dbNumber": 50, |
| | | "offset": 4411, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2211_PLC_ACK", |
| | | "dbNumber": 50, |
| | | "offset": 4412, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2211_PLC_REQ", |
| | | "dbNumber": 50, |
| | | "offset": 4413, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2211_WCS_ERRCode", |
| | | "dbNumber": 50, |
| | | "offset": 4414, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2211_WCS_Special", |
| | | "dbNumber": 50, |
| | | "offset": 4415, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2211_Equ_Auto", |
| | | "dbNumber": 50, |
| | | "offset": 4416, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2211_Last_pallet", |
| | | "dbNumber": 50, |
| | | "offset": 4417, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2211_Barcode", |
| | | "dbNumber": 50, |
| | | "offset": 4418, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 20, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2211_Spare_1", |
| | | "dbNumber": 50, |
| | | "offset": 4438, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2211_Spare_2", |
| | | "dbNumber": 50, |
| | | "offset": 4439, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2213_TaskNo", |
| | | "dbNumber": 50, |
| | | "offset": 4480, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2213_Source", |
| | | "dbNumber": 50, |
| | | "offset": 4482, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2213_Target", |
| | | "dbNumber": 50, |
| | | "offset": 4484, |
| | | "bit": 1, |
| | | "dataType": 1, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2213_BoxType", |
| | | "dbNumber": 50, |
| | | "offset": 4486, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2213_CV_State", |
| | | "dbNumber": 50, |
| | | "offset": 4487, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2213_CV_ERRCode", |
| | | "dbNumber": 50, |
| | | "offset": 4488, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2213_WCS_STB", |
| | | "dbNumber": 50, |
| | | "offset": 4489, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2213_WCS_ACK", |
| | | "dbNumber": 50, |
| | | "offset": 4490, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2213_PLC_STB", |
| | | "dbNumber": 50, |
| | | "offset": 4491, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2213_PLC_ACK", |
| | | "dbNumber": 50, |
| | | "offset": 4492, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2213_PLC_REQ", |
| | | "dbNumber": 50, |
| | | "offset": 4493, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2213_WCS_ERRCode", |
| | | "dbNumber": 50, |
| | | "offset": 4494, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2213_WCS_Special", |
| | | "dbNumber": 50, |
| | | "offset": 4495, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2213_Equ_Auto", |
| | | "dbNumber": 50, |
| | | "offset": 4496, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2213_Last_pallet", |
| | | "dbNumber": 50, |
| | | "offset": 4497, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2213_Barcode", |
| | | "dbNumber": 50, |
| | | "offset": 4498, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 20, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2213_Spare_1", |
| | | "dbNumber": 50, |
| | | "offset": 4518, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | }, |
| | | { |
| | | "fieldKey": "2213_Spare_2", |
| | | "dbNumber": 50, |
| | | "offset": 4519, |
| | | "bit": 1, |
| | | "dataType": 0, |
| | | "length": 1, |
| | | "direction": 2 |
| | | } |
| | | ] |
| | | } |
| | | ] |