| | |
| | | public class ConveyorLineTargetAddressSelector |
| | | { |
| | | /// <summary> |
| | | /// æææºå称常é |
| | | /// 设å¤å±çº§ï¼ä¸å±/ä¸å±ï¼ |
| | | /// </summary> |
| | | private const string ConstraintMachineName = "æææº"; |
| | | /// <remarks> |
| | | /// ç¨äºåºåæææºåææéæºçä¸å±å·¥ä½åä¸å±å·¥ä½ã |
| | | /// å
¥åºä»»å¡å¯¹åºä¸å±ï¼MaterialRequestUpperï¼ï¼åºåºä»»å¡å¯¹åºä¸å±ï¼MaterialRequestLowerï¼ã |
| | | /// </remarks> |
| | | private enum Layer |
| | | { |
| | | /// <summary> |
| | | /// ä¸å±å·¥ä½ |
| | | /// </summary> |
| | | Upper, |
| | | |
| | | /// <summary> |
| | | /// ææéæºå称常é |
| | | /// ä¸å±å·¥ä½ |
| | | /// </summary> |
| | | private const string PinMachineName = "ææéæº"; |
| | | 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 List<string> ConstraintMachineCodes = new List<string> { "10180", "20090" }; |
| | | private static readonly HashSet<string> ConstraintMachineCodes = new HashSet<string> { "10180", "20090" }; |
| | | |
| | | /// <summary> |
| | | /// ææéæºå¯¹åºçç¹ä½ç¼ç å表 |
| | | /// ææéæºå¯¹åºçç¹ä½ç¼ç éå |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// å½ç®æ å°åå¨è¿äºç¼ç 䏿¶ï¼è¡¨ç¤ºéè¦ä¸ææéæºäº¤äºã |
| | | /// ä½¿ç¨ HashSet ä¿è¯ O(1) ç Contains æ¥æ¾æ§è½ã |
| | | /// </remarks> |
| | | private static readonly List<string> PinMachineCodes = new List<string> { "10190", "20100" }; |
| | | 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> |
| | | /// <remarks> |
| | | /// éè¿ Microsoft.Extensions.Logging æ¥å£æ³¨å
¥ï¼ç¨äºç»æåæ¥å¿è¾åºã |
| | | /// </remarks> |
| | | private readonly ILogger _logger; |
| | | |
| | | /// <summary> |
| | | /// æé 彿° |
| | | /// </summary> |
| | | /// <param name="logger">æ¥å¿è®°å½å¨</param> |
| | | /// <param name="logger">æ¥å¿è®°å½å¨ï¼ç±ä¾èµæ³¨å
¥å®¹å¨èªå¨æ³¨å
¥</param> |
| | | public ConveyorLineTargetAddressSelector(ILogger logger) |
| | | { |
| | | _logger = logger; |
| | | _logger = logger; // ä¿åæ¥å¿è®°å½å¨å®ä¾ï¼ä¾åç»æ¹æ³ä½¿ç¨ |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å¤çå
¥åºåºæ¯çä¸ä¸å°åè¯·æ± |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// å½å
¥åºä»»å¡æ§è¡å°æä¸ªä½ç½®æ¶è°ç¨æ¤æ¹æ³ã |
| | | /// å¤æç®æ è®¾å¤æ¯å¦éè¦ç©ææå¯ä»¥åºæã |
| | | /// å
¥åºä»»å¡å°è¾¾æä¸ªä½ç½®æ¶è°ç¨æ¤æ¹æ³ï¼å¤æç®æ è®¾å¤æ¯å¦éè¦ç©æã |
| | | /// å
¥åºå¯¹åºä¸å±å·¥ä½ï¼Layer.Upperï¼ï¼å ä¸ºç©æä»ä¸å±è¿å
¥ä»åºã |
| | | /// </remarks> |
| | | /// <param name="conveyorLine">è¾é线设å¤å¯¹è±¡</param> |
| | | /// <param name="nextAddress">ä¸ä¸å°å/ç®æ 设å¤ç¼ç </param> |
| | | /// <param name="childDeviceCode">å½åå设å¤ç¼ç </param> |
| | | /// <param name="conveyorLine">è¾é线设å¤å¯¹è±¡ï¼ç¨äºåå
¥ç®æ å°åå ACK ä¿¡å·</param> |
| | | /// <param name="nextAddress">ä¸ä¸å°å/ç®æ 设å¤ç¼ç ï¼ç¨äºè¯å«ç®æ 设å¤ç±»å</param> |
| | | /// <param name="childDeviceCode">å½åå设å¤ç¼ç ï¼ç¨äºç²¾ç¡®å®ä½åå
¥åªä¸ªå设å¤</param> |
| | | public void HandleInboundNextAddress(CommonConveyorLine conveyorLine, string nextAddress, string childDeviceCode) |
| | | { |
| | | _logger.LogDebug("HandleInboundNextAddressï¼å
¥åºä¸ä¸å°åï¼å设å¤: {ChildDeviceCode}ï¼ç®æ å°å: {NextAddress}", childDeviceCode, nextAddress); |
| | | QuartzLogger.Debug($"HandleInboundNextAddressï¼å
¥åºä¸ä¸å°åï¼å设å¤: {childDeviceCode}ï¼ç®æ å°å: {nextAddress}", conveyorLine.DeviceCode); |
| | | // è°ç¨éç¨å¤çæ¹æ³ï¼isUpper = true 表示å¤çä¸å± |
| | | HandleDeviceRequest(conveyorLine, nextAddress, childDeviceCode, isUpper: true); |
| | | // è®°å½å
¥åºåºæ¯çè°è¯æ¥å¿ï¼å
å«å设å¤åç®æ å°åä¿¡æ¯ |
| | | WriteDebug(conveyorLine, "å
¥åºä¸ä¸å°å", childDeviceCode, nextAddress); |
| | | // å§æéç¨å¤çæ¹æ³ï¼å
¥åºå¯¹åºä¸å±ï¼isUpper: trueï¼ |
| | | HandleDeviceRequest(conveyorLine, nextAddress, childDeviceCode, Layer.Upper); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// å¤çåºåºåºæ¯çä¸ä¸å°åè¯·æ± |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// å½åºåºä»»å¡æ§è¡å°æä¸ªä½ç½®æ¶è°ç¨æ¤æ¹æ³ã |
| | | /// å¤æç®æ è®¾å¤æ¯å¦éè¦ç©ææå¯ä»¥åºæã |
| | | /// åºåºä»»å¡å°è¾¾æä¸ªä½ç½®æ¶è°ç¨æ¤æ¹æ³ï¼å¤æç®æ è®¾å¤æ¯å¦éè¦åºæã |
| | | /// åºåºå¯¹åºä¸å±å·¥ä½ï¼Layer.Lowerï¼ï¼å ä¸ºç©æä»ä¸å±ç¦»å¼ä»åºã |
| | | /// </remarks> |
| | | /// <param name="conveyorLine">è¾é线设å¤å¯¹è±¡</param> |
| | | /// <param name="nextAddress">ä¸ä¸å°å/ç®æ 设å¤ç¼ç </param> |
| | | /// <param name="childDeviceCode">å½åå设å¤ç¼ç </param> |
| | | /// <param name="conveyorLine">è¾é线设å¤å¯¹è±¡ï¼ç¨äºåå
¥ç®æ å°åå ACK ä¿¡å·</param> |
| | | /// <param name="nextAddress">ä¸ä¸å°å/ç®æ 设å¤ç¼ç ï¼ç¨äºè¯å«ç®æ 设å¤ç±»å</param> |
| | | /// <param name="childDeviceCode">å½åå设å¤ç¼ç ï¼ç¨äºç²¾ç¡®å®ä½åå
¥åªä¸ªå设å¤</param> |
| | | public void HandleOutboundNextAddress(CommonConveyorLine conveyorLine, string nextAddress, string childDeviceCode) |
| | | { |
| | | _logger.LogDebug("HandleOutboundNextAddressï¼åºåºä¸ä¸å°åï¼å设å¤: {ChildDeviceCode}ï¼ç®æ å°å: {NextAddress}", childDeviceCode, nextAddress); |
| | | QuartzLogger.Debug($"HandleOutboundNextAddressï¼åºåºä¸ä¸å°åï¼å设å¤: {childDeviceCode}ï¼ç®æ å°å: {nextAddress}", conveyorLine.DeviceCode); |
| | | // è°ç¨éç¨å¤çæ¹æ³ï¼isUpper = false 表示å¤çä¸å± |
| | | HandleDeviceRequest(conveyorLine, nextAddress, childDeviceCode, isUpper: false); |
| | | // è®°å½åºåºåºæ¯çè°è¯æ¥å¿ï¼å
å«å设å¤åç®æ å°åä¿¡æ¯ |
| | | WriteDebug(conveyorLine, "åºåºä¸ä¸å°å", childDeviceCode, nextAddress); |
| | | // å§æéç¨å¤çæ¹æ³ï¼åºåºå¯¹åºä¸å±ï¼isUpper: falseï¼ |
| | | HandleDeviceRequest(conveyorLine, nextAddress, childDeviceCode, Layer.Lower); |
| | | } |
| | | |
| | | /// <summary> |
| | | /// éç¨è®¾å¤è¯·æ±å¤çæ¹æ³ |
| | | /// æ ¹æ®ç®æ å°åç±»åååå°å¯¹åºè®¾å¤å¤ç |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// æ ¹æ®ç®æ å°åç±»åï¼æææº/ææéæºï¼è°ç¨ç¸åºçå¤çé»è¾ã |
| | | /// å¤çä¸ä¸å±è®¾å¤çç©æè¯·æ±ååºæåè°ã |
| | | /// éè¿ AddressToDeviceType åå
¸å°ç®æ å°åæ å°å°è®¾å¤ç±»åï¼ |
| | | /// ç¶åååå°å¯¹åºçä¸ç¨å¤çæ¹æ³ï¼HandleConstraintMachine / HandlePinMachineï¼ã |
| | | /// å¦æç®æ å°åä¸å¨å·²ç¥æ å°è¡¨ä¸ï¼ç´æ¥è¿åï¼ä¸åä»»ä½å¤çã |
| | | /// </remarks> |
| | | /// <param name="conveyorLine">è¾é线设å¤å¯¹è±¡</param> |
| | | /// <param name="nextAddress">ä¸ä¸å°å/ç®æ 设å¤ç¼ç </param> |
| | | /// <param name="childDeviceCode">å½åå设å¤ç¼ç </param> |
| | | /// <param name="isUpper">æ¯å¦å¤çä¸å±ï¼true=ä¸å±ï¼false=ä¸å±ï¼</param> |
| | | private void HandleDeviceRequest(CommonConveyorLine conveyorLine, string nextAddress, string childDeviceCode, bool isUpper) |
| | | /// <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) |
| | | { |
| | | // è·åå
¨å±è®¾å¤å表 |
| | | var devices = Storage.Devices; |
| | | // éè¿åå
¸æ¥æ¾ç®æ å°å对åºç设å¤ç±»åï¼å¦ææ¾ä¸å°å deviceType 为 None |
| | | if (!AddressToDeviceType.TryGetValue(nextAddress, out var deviceType) || deviceType == TargetDeviceType.None) |
| | | { |
| | | // ç®æ å°åä¸å¨å·²ç¥æ å°è¡¨ä¸ï¼ç´æ¥è¿åï¼å¯è½æ¯å
¶ä»ç±»å设å¤ï¼ |
| | | return; |
| | | } |
| | | |
| | | // å¤æç®æ 设å¤ç±»å |
| | | if (ConstraintMachineCodes.Contains(nextAddress)) |
| | | // æ ¹æ®è¯å«åºç设å¤ç±»åååå°å¯¹åºçå¤çæ¹æ³ |
| | | switch (deviceType) |
| | | { |
| | | // æææºå¤ç忝 |
| | | // æ¥æ¾æææºè®¾å¤ |
| | | ConstraintMachine? constraint = devices.OfType<ConstraintMachine>().FirstOrDefault(d => d.DeviceName == ConstraintMachineName); |
| | | 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) |
| | | { |
| | | _logger.LogDebug("HandleDeviceRequestï¼æªæ¾å°æææºè®¾å¤"); |
| | | QuartzLogger.Debug("HandleDeviceRequestï¼æªæ¾å°æææºè®¾å¤", conveyorLine.DeviceCode); |
| | | // æªæ¾å°æææºè®¾å¤ï¼ç´æ¥è¿å |
| | | // æªæ¾å°æææºè®¾å¤ï¼å·²å¨ FindDevice ä¸è®°å½æ¥å¿ï¼æ¤å¤ç´æ¥è¿å |
| | | return; |
| | | } |
| | | |
| | | // å¤çæææºçè¯·æ± |
| | | ProcessDeviceRequest( |
| | | conveyorLine, |
| | | childDeviceCode, |
| | | // è·åç©æè¯·æ±æ å¿ï¼ä¸å±æä¸å±ï¼ |
| | | getMaterialRequest: () => isUpper |
| | | ? constraint.GetValue<ConstraintMachineDBName, short>(ConstraintMachineDBName.MaterialRequestUpper) != 0 |
| | | : constraint.GetValue<ConstraintMachineDBName, short>(ConstraintMachineDBName.MaterialRequestLower) != 0, |
| | | // è·ååºæè¯·æ±æ å¿ï¼ä¸å±æä¸å±ï¼ |
| | | getOutputRequest: () => isUpper |
| | | ? constraint.GetValue<ConstraintMachineDBName, short>(ConstraintMachineDBName.OutputRequestUpper) != 0 |
| | | : constraint.GetValue<ConstraintMachineDBName, short>(ConstraintMachineDBName.OutputRequestLower) != 0, |
| | | // 设置è¾åºå°±ç»ªæ å¿ï¼ä¸å±æä¸å±ï¼ |
| | | setOutputReady: outputReq => |
| | | { |
| | | if (isUpper) |
| | | { |
| | | constraint.SetValue(ConstraintMachineDBName.ConstraintTrayOutputReadyUpper, outputReq ? 1 : 0); |
| | | // è·åå½åå±çº§ï¼ä¸å±/ä¸å±ï¼çç©æè¯·æ±æ å¿ï¼éé¶è¡¨ç¤ºè®¾å¤éè¦ç©æ |
| | | 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, "æææº"); |
| | | } |
| | | else |
| | | |
| | | /// <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) |
| | | { |
| | | constraint.SetValue(ConstraintMachineDBName.ConstraintTrayOutputReadyLower, outputReq ? 1 : 0); |
| | | } |
| | | }, |
| | | "æææº"); |
| | | } |
| | | else if (PinMachineCodes.Contains(nextAddress)) |
| | | { |
| | | // ææéæºå¤ç忝 |
| | | // æ¥æ¾ææéæºè®¾å¤ |
| | | PinMachine? pinMachine = devices.OfType<PinMachine>().FirstOrDefault(d => d.DeviceName == PinMachineName); |
| | | // ä»å
¨å±è®¾å¤åè¡¨ä¸æ¥æ¾å为"ææéæº"çææéæºè®¾å¤å®ä¾ |
| | | var pinMachine = FindDevice<PinMachine>("ææéæº"); |
| | | if (pinMachine == null) |
| | | { |
| | | _logger.LogDebug("HandleDeviceRequestï¼æªæ¾å°ææéæºè®¾å¤"); |
| | | QuartzLogger.Debug("HandleDeviceRequestï¼æªæ¾å°ææéæºè®¾å¤", conveyorLine.DeviceCode); |
| | | // æªæ¾å°ææéæºè®¾å¤ï¼å·²å¨ FindDevice ä¸è®°å½æ¥å¿ï¼æ¤å¤ç´æ¥è¿å |
| | | return; |
| | | } |
| | | |
| | | // å¤çææéæºçè¯·æ± |
| | | ProcessDeviceRequest( |
| | | conveyorLine, |
| | | childDeviceCode, |
| | | // è·åç©æè¯·æ±æ å¿ï¼ä¸å±æä¸å±ï¼ |
| | | getMaterialRequest: () => isUpper |
| | | ? pinMachine.GetValue<PinMachineDBName, short>(PinMachineDBName.MaterialRequestUpper) != 0 |
| | | : pinMachine.GetValue<PinMachineDBName, short>(PinMachineDBName.MaterialRequestLower) != 0, |
| | | // è·ååºæè¯·æ±æ å¿ï¼ä¸å±æä¸å±ï¼ |
| | | getOutputRequest: () => isUpper |
| | | ? pinMachine.GetValue<PinMachineDBName, short>(PinMachineDBName.OutputRequestUpper) != 0 |
| | | : pinMachine.GetValue<PinMachineDBName, short>(PinMachineDBName.OutputRequestLower) != 0, |
| | | // 设置è¾åºå°±ç»ªæ å¿ï¼ä¸å±æä¸å±ï¼ |
| | | setOutputReady: outputReq => |
| | | { |
| | | if (isUpper) |
| | | { |
| | | pinMachine.SetValue(PinMachineDBName.PlugPinTrayOutputReadyUpper, outputReq ? 1 : 0); |
| | | // è·åå½åå±çº§ï¼ä¸å±/ä¸å±ï¼çç©æè¯·æ±æ å¿ï¼éé¶è¡¨ç¤ºè®¾å¤éè¦ç©æ |
| | | 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, "ææéæº"); |
| | | } |
| | | else |
| | | |
| | | /// <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 |
| | | { |
| | | pinMachine.SetValue(PinMachineDBName.PlugPinTrayOutputReadyLower, outputReq ? 1 : 0); |
| | | // OfType<T>() çéåºæå®ç±»åç设å¤ï¼FirstOrDefault æå称精确å¹é
|
| | | var device = Storage.Devices.OfType<T>().FirstOrDefault(d => GetDeviceName(d) == deviceName); |
| | | if (device == null) |
| | | { |
| | | // è®¾å¤æªæ¾å°æ¶è®°å½è°è¯æ¥å¿ï¼æ¹ä¾¿ææ¥é
ç½®é®é¢ |
| | | _logger.LogDebug("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> |
| | | /// æ ¹æ®ç©æè¯·æ±ååºæè¯·æ±çç¶æï¼ |
| | | /// - 妿æç©æè¯·æ±ï¼è®¾ç½®ç®æ å°åå¹¶åé ACK |
| | | /// - 妿æåºæè¯·æ±ï¼è®¾ç½®è®¾å¤çè¾åºå°±ç»ªæ å¿ |
| | | /// æ ¹æ®ç©æè¯·æ±ååºæè¯·æ±çç¶æå³å®è¡ä¸ºï¼ |
| | | /// - å¦æè®¾å¤éè¦ç©æï¼materialRequest=trueï¼ï¼è®¾ç½®è¾é线çç®æ å°å为 1ï¼ææè¿æ¥ï¼å¹¶åå¤ ACK ç¡®è®¤ä¿¡å· |
| | | /// - å¦æè®¾å¤ä¸éè¦ç©æï¼materialRequest=falseï¼ï¼åéç¥è®¾å¤å¯ä»¥ç»§ç»åºæï¼setOutputReadyï¼ |
| | | /// |
| | | /// è¿æ¯æææºåææéæºå
±ç¨çå¤çé»è¾ï¼è®¾å¤ç¹æçé¨å已卿¤æ¹æ³å¤å°è£
ã |
| | | /// </remarks> |
| | | /// <param name="conveyorLine">è¾é线设å¤å¯¹è±¡</param> |
| | | /// <param name="childDeviceCode">å½åå设å¤ç¼ç </param> |
| | | /// <param name="getMaterialRequest">è·åç©æè¯·æ±ç¶æçå§æ</param> |
| | | /// <param name="getOutputRequest">è·ååºæè¯·æ±ç¶æçå§æ</param> |
| | | /// <param name="setOutputReady">设置è¾åºå°±ç»ªæ å¿çå§æ</param> |
| | | /// <param name="deviceType">设å¤ç±»åæè¿°</param> |
| | | /// <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, |
| | | Func<bool> getMaterialRequest, |
| | | Func<bool> getOutputRequest, |
| | | bool materialRequest, |
| | | bool outputRequest, |
| | | Action<bool> setOutputReady, |
| | | string deviceType) |
| | | { |
| | | // è·åç©æè¯·æ±ç¶æ |
| | | bool materialReq = getMaterialRequest(); |
| | | |
| | | // è·ååºæè¯·æ±ç¶æ |
| | | bool outputReq = getOutputRequest(); |
| | | |
| | | // è®°å½å½å请æ±ç¶æçè°è¯æ¥å¿ï¼ä¾ææ¥é®é¢ä½¿ç¨ |
| | | _logger.LogDebug("ProcessDeviceRequestï¼{DeviceType}ï¼å设å¤: {ChildDeviceCode}ï¼ç©æè¯·æ±: {MaterialReq}ï¼åºæè¯·æ±: {OutputReq}", |
| | | deviceType, childDeviceCode, materialReq, outputReq); |
| | | QuartzLogger.Debug($"ProcessDeviceRequestï¼{deviceType}ï¼å设å¤: {childDeviceCode}ï¼ç©æè¯·æ±: {materialReq}ï¼åºæè¯·æ±: {outputReq}", conveyorLine.DeviceCode); |
| | | deviceType, childDeviceCode, materialRequest, outputRequest); |
| | | // 忥åå
¥ Quartz æ¥å¿æä»¶ï¼ååå¯è¿½æº¯ï¼è¿éä¿çä¸åé»è¾ä¸è´çè¡ä¸ºï¼ |
| | | QuartzLogger.Debug($"ProcessDeviceRequestï¼{deviceType}ï¼å设å¤: {childDeviceCode}ï¼ç©æè¯·æ±: {materialRequest}ï¼åºæè¯·æ±: {outputRequest}", conveyorLine.DeviceCode); |
| | | |
| | | // å¦æè®¾å¤éè¦ç©æ |
| | | if (materialReq) |
| | | // 忝夿ï¼è®¾å¤æ¯éè¦ç©æè¿æ¯éè¦åºæ |
| | | if (materialRequest) |
| | | { |
| | | // è®¾ç½®ç®æ å°å为 1ï¼è¡¨ç¤ºææè¿æ¥ï¼ |
| | | // 设å¤éè¦ç©æ -> éç¥è¾é线ææè¿æ¥ |
| | | // 1. è®¾ç½®ç®æ å°å为 1ï¼è¡¨ç¤º"ææè¿å
¥" |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.Target, 1, childDeviceCode); |
| | | |
| | | // åå¤ ACK ç¡®è®¤ä¿¡å· |
| | | // 2. åå¤ ACK 确认信å·ï¼åç¥è®¾å¤å·²æ¶å°è¯·æ± |
| | | conveyorLine.SetValue(ConveyorLineDBNameNew.WCS_ACK, 1, childDeviceCode); |
| | | |
| | | // 3. è®°å½ä¿¡æ¯æ¥å¿ï¼è¡¨æå·²å®æç®æ å°å设置å ACK åå¤ |
| | | _logger.LogInformation("ProcessDeviceRequestï¼{DeviceType} éè¦ç©æï¼å·²è®¾ç½®ç®æ å°ååACK", deviceType); |
| | | QuartzLogger.Info($"ProcessDeviceRequestï¼{deviceType} éè¦ç©æï¼å·²è®¾ç½®ç®æ å°ååACK", conveyorLine.DeviceCode); |
| | | } |
| | | else |
| | | { |
| | | // 设å¤ä¸éè¦ç©æï¼è®¾ç½®è¾åºå°±ç»ªæ å¿ |
| | | // éç¥è®¾å¤å¯ä»¥ç»§ç»åºæ |
| | | setOutputReady(outputReq); |
| | | // 设å¤ä¸éè¦ç©æ -> éç¥è®¾å¤å¯ä»¥ç»§ç»åºæï¼æ 论å½åæ¯å¦æè´§è¦åºï¼é½è¦éç¥ï¼ |
| | | // outputRequest 表示设å¤å½åæ¯å¦ç¡®å®æè´§ï¼å¦ææ²¡æè´§å outputReady=falseï¼è®¾å¤æ¶å°åçå¾
|
| | | setOutputReady(outputRequest); |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// åå
¥è°è¯æ¥å¿ï¼åæ¶è¾åºå°ä¸¤ä¸ªæ¥å¿ç³»ç»ï¼ |
| | | /// </summary> |
| | | /// <remarks> |
| | | /// ç»ä¸å
¥å£ç¹æ¥å¿æ ¼å¼ï¼åæ¶å Microsoft.Extensions.Logging å QuartzLogger åå
¥ï¼ |
| | | /// ä¿è¯æ¥å¿æ¢è½å¨æ§å¶å°æ¥çä¹è½å¨æä»¶ä¸è¿½æº¯ã |
| | | /// </remarks> |
| | | /// <param name="conveyorLine">è¾é线设å¤å¯¹è±¡ï¼ç¨äºè·å设å¤ç¼ç åå
¥ QuartzLogger</param> |
| | | /// <param name="scenario">åºæ¯æè¿°ï¼å¦"å
¥åºä¸ä¸å°å"æ"åºåºä¸ä¸å°å"</param> |
| | | /// <param name="childDeviceCode">å设å¤ç¼ç </param> |
| | | /// <param name="nextAddress">ç®æ 设å¤ç¼ç </param> |
| | | private void WriteDebug(CommonConveyorLine conveyorLine, string scenario, string childDeviceCode, string nextAddress) |
| | | { |
| | | // åå
¥ç»æåæ¥å¿ï¼å¯è¢« Serilog çæ¥å¿æ¡æ¶æè·ï¼ |
| | | _logger.LogDebug("Handle{Scenario}ï¼å设å¤: {ChildDeviceCode}ï¼ç®æ å°å: {NextAddress}", |
| | | scenario, childDeviceCode, nextAddress); |
| | | // åå
¥ Quartz ä¸ç¨æ¥å¿æä»¶ï¼ä¾å®æ¶ä»»å¡è½¨è¿¹è¿½è¸ªï¼ |
| | | QuartzLogger.Debug($"Handle{scenario}ï¼å设å¤: {childDeviceCode}ï¼ç®æ å°å: {nextAddress}", conveyorLine.DeviceCode); |
| | | } |
| | | } |
| | | } |