| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196 | 
							- using DBHelper;
 
- using System;
 
- using System.Collections.Generic;
 
- using System.Linq;
 
- using WCS.Core;
 
- using WCS.Entity;
 
- using WCS.Entity.Protocol;
 
- using WCS.Entity.Protocol.RGV;
 
- using WCS.Service.Helpers;
 
- using WCS.Service.Log;
 
- namespace WCS.Service.Extensions
 
- {
 
-     /// <summary>
 
-     /// 输送机设备组
 
-     /// </summary>
 
-     public class StationDeviceGroup : DeviceGroup<IStation520, IStation521, IStation523>
 
-     {
 
-         /// <summary>
 
-         /// 当前设备可用的RGV
 
-         /// </summary>
 
-         private static List<RGVDevice> AllRGVList;
 
-         static StationDeviceGroup()
 
-         {
 
-             AllRGVList = Device.Where(v => v.IsRGV() && v.CODE != "RGV8").Select(v => v.Create<RGVDevice>()).ToList();
 
-         }
 
-         public StationDeviceGroup(WCS_DEVICE entity) : base(entity)
 
-         {
 
-         }
 
-         /// <summary>
 
-         /// 执行输送机设备组任务 单例锁
 
-         /// </summary>
 
-         /// <param name="act"></param>
 
-         public void EX(Action<StationDeviceGroup> act)
 
-         {
 
-             var key = $"WCS:Lock:{Entity.CODE}";
 
-             try
 
-             {
 
-                 if (ProtocolProxy.YG150Redis.Get(key) != null) throw new WarnException($"[{Entity.CODE}]--触发并发管控");
 
-                 ProtocolProxy.YG150Redis.Set(key, Entity.CODE);
 
-                 act(this);
 
-             }
 
-             catch (DoException ex)
 
-             {
 
-                 ex.DoExceptionEX(Entity);
 
-             }
 
-             catch (WarnException ex)
 
-             {
 
-                 ex.WarnExceptionEX(Entity);
 
-             }
 
-             catch (Exception ex)
 
-             {
 
-                 ex.ExceptionEx(Entity);
 
-             }
 
-             finally
 
-             {
 
-                 ProtocolProxy.YG150Redis.Del(key);
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// 当前设备可用的RGV
 
-         /// </summary>
 
-         public List<RGVDevice> RgvList
 
-         {
 
-             get
 
-             {
 
-                 return AllRGVList.Where(v => v.LocationList.Any(p => p.Entity == Entity) && v.Data2.WorkMode != 0).ToList();
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// 当前设备环穿组
 
-         /// </summary>
 
-         private List<StationLocation> LoncationList
 
-         {
 
-             get
 
-             {
 
-                 var dev = StationLocation.ALLlocations.FirstOrDefault(v => v.Station == Entity.CODE);
 
-                 return StationLocation.ALLlocations.Where(v => v.PLC == dev.PLC).ToList();
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// 设备组自身的位置
 
-         /// </summary>
 
-         public float Position
 
-         {
 
-             get
 
-             {
 
-                 return StationLocation.ALLlocations.FirstOrDefault(v => v.Station == Entity.CODE).Location;
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// 设备组所在环穿的总长度
 
-         /// </summary>
 
-         public float Length
 
-         {
 
-             get
 
-             {
 
-                 return StationLocation.ALLlocations.FirstOrDefault(v => v.Station == Entity.CODE).Length;
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// 设备组是否满足任务执行条件
 
-         /// </summary>
 
-         /// <param name="type">给当前设备组下发任务时需要的请求</param>
 
-         /// <returns>true:不满足执行条件需要进行停止执行  false:表示满足条件不需要停止执行 </returns>
 
-         /// <exception cref="Exception"></exception>
 
-         public void WhetherToExecute(IstationRequest type = IstationRequest.无)
 
-         {
 
-             foreach (var item in Items)
 
-             {
 
-                 if (item.Data.VoucherNo != item.Data2.VoucherNo) throw new WarnException($"等待{item.Entity.CODE}执行任务{item.Data.Tasknum},凭证号不一致");
 
-                 if (item.Data3.Status.HasFlag(StationStatus.运行状态位)) throw new DoException($"{item.Entity.CODE}运行中");
 
-                 if (!item.Data2.Status.HasFlag(IstationStatus.光电状态)) throw new DoException($"[{item.Entity.CODE}]无光电");
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// 获取设备组中需要取货的设备
 
-         /// </summary>
 
-         /// <returns></returns>
 
-         public List<Device<IStation520, IStation521, IStation523>> RGVGetTaskedDevice()
 
-         {
 
-             var a = Items.Where(v => v.Data2.Status.HasFlag(IstationStatus.光电状态) && v.Data2.Tasknum > 10000)
 
-                          .Where(v => v.Entity.CODE.ToShort() != v.Data2.Goodsend && v.Data2.Goodsend != 0)
 
-                         .ToList();
 
-             return a.Count == 0 ? null : a;
 
-         }
 
-         /// <summary>
 
-         /// 是否可以取货
 
-         /// </summary>
 
-         /// <returns></returns>
 
-         public bool IsPickUp(RGVDevice rgvDevice)
 
-         {
 
-             if (Entity.CODE is "G2" or "G3") return true;
 
-             var dCount = Device.Where(v => v.CODE is "G1" or "G1340" or "G1337").Select(v => v.Create<StationDeviceGroup>()).Count(v =>
 
-             {
 
-                 var count = v.Items.Count(v => !v.Data3.Status.HasFlag(StationStatus.运行状态位) && !v.Data2.Status.HasFlag(IstationStatus.光电状态) && v.Data2.Tasknum < 10000
 
-                   && v.Data3.Status.HasFlag(StationStatus.自动));
 
-                 return count == 2 ? true : false;
 
-             });
 
-             var rCount = rgvDevice.RGVList.Count(v => v.Data.DestPosition_1 == 1);
 
-             return rCount < dCount;
 
-         }
 
-         /// <summary>
 
-         /// 入库位置获取需要生产任务的设备及条码信息
 
-         /// </summary>
 
-         /// <returns></returns>
 
-         public List<FinishTaskList<string>> GetBcrValid()
 
-         {
 
-             var list = new List<FinishTaskList<string>>();
 
-             //获取需要执行的设备信息
 
-             foreach (var dev in Items)
 
-             {
 
-                 if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态))
 
-                 {
 
-                     InfoLog.INFO_INFO($"{dev.Entity.CODE}--没有光电");
 
-                     continue;
 
-                 }
 
-                 if (dev.Data2.Request != IstationRequest.扫码入库)
 
-                 {
 
-                     InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电没有扫码入库请求--1", Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
 
-                     continue;
 
-                 };
 
-                 if (dev.Data2.Tasknum > 10000)
 
-                 {
 
-                     InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电有请求,但已有任务号", Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
 
-                     continue;
 
-                 }
 
-                 var bcr = dev.Entity.BCR();
 
-                 var barcode = bcr.Content.Trim('\r');
 
-                 if (barcode == "")
 
-                 {
 
-                     InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--扫码失败,内容为空", Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
 
-                     continue;
 
-                 };
 
-                 list.Add(new FinishTaskList<string>(barcode, dev.Entity.Create<StationDevice>()));
 
-             }
 
-             return list;
 
-         }
 
-         /// <summary>
 
-         /// 获取下一个地址的有效设备
 
-         /// </summary>
 
-         /// <returns></returns>
 
-         public List<FinishTaskList<string>> GetAddressValid()
 
-         {
 
-             var list = new List<FinishTaskList<string>>();
 
-             //获取需要执行的设备信息
 
-             foreach (var dev in Items)
 
-             {
 
-                 if (!dev.Data2.Status.HasFlag(IstationStatus.光电状态))
 
-                 {
 
-                     InfoLog.INFO_INFO($"{dev.Entity.CODE}--没有光电");
 
-                     continue;
 
-                 }
 
-                 if (dev.Data2.Request != IstationRequest.请求分配目标地址)
 
-                 {
 
-                     InfoLog.INFO_INFO($"{dev.Entity.CODE}--有光电没有分配目标地址请求--2");
 
-                     continue;
 
-                 };
 
-                 if (dev.Data2.Tasknum < 10000)
 
-                 {
 
-                     InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--有光电有请求没有任务号", Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
 
-                     continue;
 
-                 }
 
-                 list.Add(new FinishTaskList<string>(dev.Entity.CODE, dev.Entity.Create<StationDevice>()));
 
-             }
 
-             return list;
 
-         }
 
-         /// <summary>
 
-         /// 最近的RGV
 
-         /// </summary>
 
-         /// <returns></returns>
 
-         public RGVDevice RecentRGV()
 
-         {
 
-             return RgvList.OrderBy(v => v.Distance(this)).FirstOrDefault();
 
-         }
 
-         /// <summary>
 
-         /// 计算目标RGV与站台自身的距离
 
-         /// </summary>
 
-         /// <param name="rgv"></param>
 
-         /// <returns></returns>
 
-         public float Distance(RGVDevice rgv)
 
-         {
 
-             return DevEX.Distance(Position, rgv.Position, Length);
 
-         }
 
-         /// <summary>
 
-         /// 计算两个站台之间的距离
 
-         /// </summary>
 
-         /// <param name="rgv"></param>
 
-         /// <returns></returns>
 
-         public float Distance(StationDeviceGroup dev)
 
-         {
 
-             return DevEX.Distance(Position, dev.Position, Length);
 
-         }
 
-         /// <summary>
 
-         /// 当前RGV
 
-         /// </summary>
 
-         /// <returns></returns>
 
-         public RGVDevice CurrentRGV()
 
-         {
 
-             //RGV与站台距离误差为 正负50
 
-             var max = Position + 500;
 
-             var min = Position - 500;
 
-             return RgvList?.FirstOrDefault(v => v.Data2.Position < max && v.Data2.Position > min);
 
-         }
 
-         /// <summary>
 
-         /// 是否需要RGV
 
-         /// </summary>
 
-         /// <returns>true:需要RGV false:不需要RGV</returns>
 
-         public bool NeedRgv()
 
-         {
 
-             var rgvs = Device.Where(v => v.IsRGV()).Select(v => v.Device<IRGV521>());
 
-             var code = Entity.CODE.Replace("G", "").ToShort();
 
-             if (rgvs.Any(v => v.Data.DestPosition_1 == code && v.Data.SystemStatus != RGVRunStatus.空闲))
 
-                 throw new WarnException("已有RGV执行中");
 
-             foreach (var item in Items)
 
-             {
 
-                 if (item.Data3.Status.HasFlag(StationStatus.运行状态位)) return false;
 
-                 if (!item.Data2.Status.HasFlag(IstationStatus.光电状态)) return false;
 
-             }
 
-             return true;
 
-         }
 
-         /// <summary>
 
-         /// BCR 站点是否被禁止
 
-         /// </summary>
 
-         /// <returns></returns>
 
-         public bool BcrStationIsForbid()
 
-         {
 
-             var res = true;
 
-             var config = ProtocolProxy.YGWMS150Redis.Get("ForbidTubuEnter").Split(",");
 
-             if (config.Contains(Entity.CODE))
 
-             {
 
-                 InfoLog.INFO_WarnDb("当前入库口已被禁用,请联系机修人员了解具体情况", Entity.CODE, WCS_EXCEPTIONTYPE.逻辑异常);
 
-                 res = false;
 
-             };
 
-             return res;
 
-         }
 
-     }
 
-     /// <summary>
 
-     /// 输送机设备
 
-     /// </summary>
 
-     public class StationDevice : Device<IStation520, IStation521, IStation523>
 
-     {
 
-         public StationDevice(WCS_DEVICE entity) : base(entity)
 
-         {
 
-         }
 
-         /// <summary>
 
-         /// 设备组是否满足任务执行条件
 
-         /// </summary>
 
-         /// <param name="type">给当前设备组下发任务时需要的请求</param>
 
-         /// <returns>true:不满足执行条件需要进行停止执行  false:表示满足条件不需要停止执行 </returns>
 
-         /// <exception cref="Exception"></exception>
 
-         public void WhetherToExecute(IstationRequest type = IstationRequest.无)
 
-         {
 
-             //正在运行
 
-             if (Data3.Status.HasFlag(StationStatus.运行状态位)) throw new DoException("运行中");
 
-             //上一次的任务还未执行
 
-             if (Data.VoucherNo != Data2.VoucherNo)
 
-                 throw new WarnException($"等待任务[{Data2.Tasknum}]执行");
 
-             //没有光电
 
-             if (!Data2.Status.HasFlag(IstationStatus.光电状态)) throw new DoException("无光电"); ;
 
-             //没有任务号
 
-             switch (type)
 
-             {
 
-                 case IstationRequest.无:
 
-                     if (Data2.Tasknum < 10000 && Data.Tasknum < 10000)
 
-                         throw new WarnException($"设备无任务");
 
-                     break;
 
-                 case IstationRequest.扫码入库:
 
-                     if (Data2.Tasknum > 10000 && Data.Tasknum > 10000)
 
-                         throw new WarnException($"设备已有任务任务");
 
-                     break;
 
-                 case IstationRequest.堆垛机放货完成请求目标地址:
 
-                     if (Data2.Tasknum < 10000 && Data.Tasknum < 10000)
 
-                         throw new WarnException($"设备无任务信息");
 
-                     break;
 
-                 case IstationRequest.请求分配目标地址:
 
-                     if (Data2.Tasknum < 10000 && Data.Tasknum < 10000)
 
-                         throw new WarnException($"设备无任务信息");
 
-                     break;
 
-             }
 
-             //没有请求
 
-             if (type != IstationRequest.无 && Data2.Request != type)
 
-                 throw new WarnException($"有光电无{type}请求");
 
-         }
 
-         /// <summary>
 
-         /// 执行输送机任务 单例锁
 
-         /// </summary>
 
-         /// <param name="act"></param>
 
-         public void EX(Action<StationDevice> act)
 
-         {
 
-             var key = $"WCS:Lock:{Entity.CODE}";
 
-             try
 
-             {
 
-                 if (ProtocolProxy.YG150Redis.Get(key) != null) throw new WarnException($"[{Entity.CODE}]--触发并发管控");
 
-                 ProtocolProxy.YG150Redis.Set(key, Entity.CODE);
 
-                 act(this);
 
-             }
 
-             catch (DoException ex)
 
-             {
 
-                 ex.DoExceptionEX(Entity);
 
-             }
 
-             catch (WarnException ex)
 
-             {
 
-                 ex.WarnExceptionEX(Entity);
 
-             }
 
-             catch (Exception ex)
 
-             {
 
-                 ex.ExceptionEx(Entity);
 
-             }
 
-             finally
 
-             {
 
-                 ProtocolProxy.YG150Redis.Del(key);
 
-             }
 
-         }
 
-     }
 
-     /// <summary>
 
-     /// RGV设备
 
-     /// </summary>
 
-     public class RGVDevice : Device<IRGV520, IRGV521, IRGV523>
 
-     {
 
-         static RGVDevice()
 
-         {
 
-             AllRGVList = Device.Where(v => v.IsRGV() && v.CODE != "RGV8").Select(v => v.Create<RGVDevice>()).ToList();
 
-         }
 
-         public RGVDevice(WCS_DEVICE entity) : base(entity)
 
-         {
 
-         }
 
-         /// <summary>
 
-         /// 所有环穿RGV
 
-         /// </summary>
 
-         private static List<RGVDevice> AllRGVList { get; set; }
 
-         /// <summary>
 
-         /// 与当前RGV处于同一环穿的RGV
 
-         /// </summary>
 
-         public List<RGVDevice> RGVList
 
-         {
 
-             get
 
-             {
 
-                 //利用WorkMode来排除的环穿维护设备
 
-                 return AllRGVList.Where(v => v.Entity.PROTOCOLS.Any(d => Entity.PROTOCOLS.Any(e => e.DB.PLC.IP == d.DB.PLC.IP)))
 
-                     .Where(v => v.Data2.WorkMode != 0)
 
-                     .Where(v => v.Entity.CODE != Entity.CODE).ToList();
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// RGV当前位置
 
-         /// </summary>
 
-         public float Position
 
-         {
 
-             get
 
-             {
 
-                 return Data2.Position;
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// 与当前RGV处于同一环穿的站台
 
-         /// </summary>
 
-         public List<StationDeviceGroup> LocationList
 
-         {
 
-             get
 
-             {
 
-                 return StationLocation.ALLlocations.Where(v => Entity.PROTOCOLS.Any(p => p.DB.PLC.CODE == v.PLC))
 
-                                       .Select(v => Device.Find(v.Station).Create<StationDeviceGroup>()).ToList();
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// 总长度
 
-         /// </summary>
 
-         public float Length
 
-         {
 
-             get
 
-             {
 
-                 return LocationList.FirstOrDefault().Length;
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// 执行RGV任务 单例锁
 
-         /// </summary>
 
-         /// <param name="act"></param>
 
-         public void EX(Action<RGVDevice> act)
 
-         {
 
-             var key = $"WCS:Lock:{Entity.CODE}";
 
-             try
 
-             {
 
-                 if (ProtocolProxy.YG150Redis.Get(key) != null) throw new WarnException($"[{Entity.CODE}]--触发并发管控");
 
-                 ProtocolProxy.YG150Redis.Set(key, Entity.CODE);
 
-                 act(this);
 
-             }
 
-             catch (DoException ex)
 
-             {
 
-                 ex.DoExceptionEX(Entity);
 
-             }
 
-             catch (WarnException ex)
 
-             {
 
-                 ex.WarnExceptionEX(Entity);
 
-             }
 
-             catch (Exception ex)
 
-             {
 
-                 ex.ExceptionEx(Entity);
 
-             }
 
-             finally
 
-             {
 
-                 ProtocolProxy.YG150Redis.Del(key);
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// 获取前一个取货点
 
-         /// </summary>
 
-         /// <returns></returns>
 
-         public StationDeviceGroup BeforeStation()
 
-         {
 
-             var a = LocationList.Where(v => v.Entity.Is(DF.涂布RGV取货设备组) || v.Entity.Is(DF.BOPPRGV取货设备组));
 
-             return LocationList.Where(v => v.Entity.Is(DF.涂布RGV取货设备组) || v.Entity.Is(DF.BOPPRGV取货设备组) && v.Entity.CODE != this.CurrentStation().Entity.CODE).OrderBy(v => Distance(v)).FirstOrDefault();
 
-         }
 
-         /// <summary>
 
-         /// 前一个RGV
 
-         /// </summary>
 
-         /// <returns></returns>
 
-         public RGVDevice Before()
 
-         {
 
-             //按照位置排序
 
-             var arr = RGVList.OrderBy(v => v.Position);
 
-             var rgv = arr.FirstOrDefault(v => v.Position > Position);
 
-             if (rgv == null)
 
-                 rgv = arr.LastOrDefault(v => v.Position < Position);
 
-             return rgv;
 
-         }
 
-         /// <summary>
 
-         /// 后一个RGV
 
-         /// </summary>
 
-         /// <returns></returns>
 
-         public RGVDevice After()
 
-         {
 
-             //到当前RGV最近的一个RGV
 
-             return RGVList.OrderBy(v => v.Distance(this)).FirstOrDefault();
 
-         }
 
-         /// <summary>
 
-         /// 获取当前所在的取货站台
 
-         /// </summary>
 
-         /// <returns></returns>
 
-         public StationDeviceGroup CurrentStation()
 
-         {
 
-             return LocationList.Where(v => v.Entity.Is(DF.涂布RGV取货设备组) || v.Entity.Is(DF.涂布RGV放货设备组) || v.Entity.Is(DF.BOPPRGV取货设备组) || v.Entity.Is(DF.BOPPRGV放货设备组)).Where(v =>
 
-                 {
 
-                     //RGV与站台距离误差为 正负50500
 
-                     var max = v.Position + 500;
 
-                     var min = v.Position - 500;
 
-                     return Data2.Position < max && Data2.Position > min;
 
-                 }).FirstOrDefault();
 
-         }
 
-         /// <summary>
 
-         /// 计算当前RGV与指定RGV之间的距离
 
-         /// </summary>
 
-         /// <param name="rgv"></param>
 
-         /// <returns></returns>
 
-         public float Distance(RGVDevice rgv)
 
-         {
 
-             //return Math.Abs((Position - rgv.Position + Length) % Length);
 
-             return DevEX.Distance(Position, rgv.Position, Length);
 
-         }
 
-         /// <summary>
 
-         /// 计算当前RGV与指定站台之间的距离
 
-         /// </summary>
 
-         /// <param name="after"></param>
 
-         /// <returns></returns>
 
-         public float Distance(StationDeviceGroup after)
 
-         {
 
-             if (after == null) throw new WarnException($"不是一个有效的StationDeviceGroup,{Entity.CODE}");
 
-             return DevEX.Distance(Position, after.Position, Length);
 
-         }
 
-         /// <summary>
 
-         /// 是否需要执行放货任务
 
-         /// </summary>
 
-         /// <returns></returns>
 
-         public bool IsPut()
 
-         {
 
-             if (Data2.TaskType_1 != RGVTaskType.取货) return false;
 
-             if (!Data2.Status_1.HasFlag(WCS.Entity.Protocol.RGVStatus.RGV到站)) return false;
 
-             if (!Data2.Status_1.HasFlag(WCS.Entity.Protocol.RGVStatus.任务完成)) return false;
 
-             if (!Data2.Status_1.HasFlag(WCS.Entity.Protocol.RGVStatus.光电)) return false;
 
-             return true;
 
-         }
 
-         /// <summary>
 
-         /// 写入移动任务
 
-         /// </summary>
 
-         /// <param name="addr">目标地址</param>
 
-         public void Move(StationDeviceGroup addr)
 
-         {
 
-             if (Data.TaskType_1 == RGVTaskType.取货) throw new WarnException($"当前有{Data.TaskType_1}任务,无法执行移动任务");
 
-             if (Data2.WorkMode != RGVMode.自动) throw new WarnException($"RGV状态{Data2.WorkMode},无法执行移动任务");
 
-             if (Data2.SystemStatus != RGVRunStatus.空闲) throw new WarnException($"rgv状态为{Data2.SystemStatus},无法执行移动任务");
 
-             if (Data2.Status_1.HasFlag(WCS.Entity.Protocol.RGVStatus.光电)) throw new WarnException("RGV有光电,无法执行移动任务");
 
-             if (Data2.TaskID_1 == addr.Entity.CODE.GetShortCode() && Data.TaskType_1 == RGVTaskType.移动)
 
-             {
 
-                 InfoLog.INFO_RGVINFO($"{Entity.CODE}]--已有目标地址相同的移动任务");
 
-                 return;
 
-             }
 
-             InfoLog.INFO_RGVINFO($"[{Entity.CODE}]--写入RGV移动任务-开始:{Data.TaskID_1},{Data.TaskType_1},{Data.DestPosition_1},{Data.Trigger_1}");
 
-             Data.TaskID_1 = addr.Entity.CODE.GetShortCode();
 
-             Data.TaskID_2 = 0;
 
-             Data.TaskType_1 = RGVTaskType.移动;
 
-             Data.DestPosition_1 = addr.Entity.CODE.GetShortCode();
 
-             Data.Trigger_1++;
 
-             InfoLog.INFO_RGVINFO($"[{Entity.CODE}]--写入RGV移动任务-结束:{Data.TaskID_1},{Data.TaskType_1},{Data.DestPosition_1},{Data.Trigger_1}");
 
-         }
 
-         /// <summary>
 
-         /// 写入取货任务
 
-         /// </summary>
 
-         /// <param name="addr">目标地址</param>
 
-         public void Pick(StationDeviceGroup addr, int task1, int task2)
 
-         {
 
-             InfoLog.INFO_RGVINFO($"[{Entity.CODE}]--写入RGV取货任务-开始:{Data.TaskID_1},{Data.TaskID_2},{Data.TaskType_1},{Data.DestPosition_1},{Data.Trigger_1}");
 
-             Data.TaskType_1 = RGVTaskType.取货;
 
-             Data.DestPosition_1 = addr.Entity.CODE.GetShortCode();
 
-             Data.TaskID_1 = task1;
 
-             Data.TaskID_2 = task2;
 
-             Data.Trigger_1++;
 
-             InfoLog.INFO_RGVINFO($"[{Entity.CODE}]--写入RGV取货任务-结束:{Data.TaskID_1},{Data.TaskID_2},{Data.TaskType_1},{Data.DestPosition_1},{Data.Trigger_1}");
 
-         }
 
-         ///// <summary>
 
-         ///// 写入取货任务
 
-         ///// </summary>
 
-         ///// <param name="addr">目标地址</param>
 
-         //public void Pick(StationDeviceGroup addr, int task1 = 0, int task2 = 0)
 
-         //{
 
-         //    InfoLog.INFO_RGVINFO($"[{Entity.CODE}]--写入RGV取货任务-开始:{Data.TaskID_1},{Data.TaskID_2},{Data.TaskType_1},{Data.DestPosition_1},{Data.Trigger_1}");
 
-         //    Data.TaskType_1 = RGVTaskType.取货;
 
-         //    Data.DestPosition_1 = addr.Entity.CODE.GetShortCode();
 
-         //    if (task1 != 0) Data.TaskID_1 = task1;
 
-         //    if (task2 != 0) Data.TaskID_2 = task2;
 
-         //    Data.Trigger_1++;
 
-         //    InfoLog.INFO_RGVINFO($"[{Entity.CODE}]--写入RGV取货任务-结束:{Data.TaskID_1},{Data.TaskID_2},{Data.TaskType_1},{Data.DestPosition_1},{Data.Trigger_1}");
 
-         //}
 
-         /// <summary>
 
-         /// 写入放货任务
 
-         /// </summary>
 
-         /// <param name="addr">目标地址</param>
 
-         public void Put(StationDeviceGroup addr, int task1 = 0, int task2 = 0)
 
-         {
 
-             InfoLog.INFO_RGVINFO($"[{Entity.CODE}]--写入RGV放货任务-开始:{Data.TaskID_1},{Data.TaskID_2},{Data.TaskType_1},{Data.DestPosition_1},{Data.Trigger_1}");
 
-             Data.TaskType_1 = RGVTaskType.放货;
 
-             Data.DestPosition_1 = addr.Entity.CODE.GetShortCode();
 
-             if (task1 != 0) Data.TaskID_1 = task1;
 
-             if (task2 != 0) Data.TaskID_2 = task2;
 
-             Data.Trigger_1++;
 
-             InfoLog.INFO_RGVINFO($"[{Entity.CODE}]--写入RGV放货任务-结束:{Data.TaskID_1},{Data.TaskID_2},{Data.TaskType_1},{Data.DestPosition_1},{Data.Trigger_1}");
 
-         }
 
-         /// <summary>
 
-         /// 筛选出所有与当前RGV距离小于指定长度的RGV
 
-         /// </summary>
 
-         /// <param name="distance">指定长度</param>
 
-         /// <returns></returns>
 
-         public RGVDevice[] RgvAfter(float distance)
 
-         {
 
-             return RGVList.Where(v => Distance(v) < distance).ToArray();
 
-         }
 
-         /// <summary>
 
-         /// 当前RGV是否有拦住指定RGV
 
-         /// </summary>
 
-         /// <param name="rgv">RGV</param>
 
-         /// <returns></returns>
 
-         public bool StopedByMe(RGVDevice rgv)
 
-         {
 
-             //目标站台
 
-             var target = rgv.Data2.DestPosition_1;
 
-             //获取目标站台的设备组信息
 
-             var station = Device.Find($"G{target}").Create<StationDeviceGroup>();
 
-             if (station.Distance(rgv) < 5000) return false;
 
-             //当前RGV与目标站台的距离小于传入RGV到达目标站台的距离
 
-             return (this.Distance(station) < rgv.Distance(station)) || station.CurrentRGV()?.Entity.CODE == this.Entity.CODE;
 
-         }
 
-         /// <summary>
 
-         /// 当前站台rgv是否挡住放货任务需要移动
 
-         /// </summary>
 
-         /// <param name="rgv">RGV</param>
 
-         /// <returns></returns>
 
-         public bool NeedToMove(RGVDevice rgv)
 
-         {
 
-             return (rgv.Position > 1777767 && rgv.Position < 2714350);
 
-         }
 
-         /// <summary>
 
-         /// 获取当前RGV的下一个站台,即距离最近的一个站台
 
-         /// </summary>
 
-         /// <returns></returns>
 
-         public StationDeviceGroup NextStation()
 
-         {
 
-             //先取当前RGV与所有站台的距离
 
-             var dev = LocationList.OrderBy(v => v.Distance(this)).FirstOrDefault();
 
-             return dev;
 
-         }
 
-     }
 
-     /// <summary>
 
-     /// 堆垛机设备
 
-     /// </summary>
 
-     public class SRMDevice : Device<ISRM520, ISRM521, ISRM537>
 
-     {
 
-         public SRMDevice(WCS_DEVICE entity) : base(entity)
 
-         {
 
-         }
 
-         /// <summary>
 
-         /// 获取放货点
 
-         /// </summary>
 
-         public List<StationDevice> GetDeliveryPoint()
 
-         {
 
-             return Entity.ROUTES.Select(v => v.NEXT) //巷道
 
-                                 .SelectMany(v => v.ROUTES.Select(d => d.NEXT)) //放货点
 
-                                 .Where(v => v.IsConv()) //必须是输送线
 
-                                 .Select(v => v.Create<StationDevice>()).ToList();
 
-         }
 
-         /// <summary>
 
-         /// 获取取货点
 
-         /// </summary>
 
-         public List<StationDevice> GetPickPoint()
 
-         {
 
-             return Device.Where(v => v.Is(DF.SRM二级品取货) || v.Is(DF.SRM涂布取货) || v.Is(DF.SRMBOPP取货))
 
-                          .Where(v => v.ROUTES.Any(p => p.NEXT.ROUTES.Any(d => d.NEXT.CODE == Entity.CODE)))
 
-                          .Select(v => v.Create<StationDevice>())
 
-                          .ToList();
 
-         }
 
-         /// <summary>
 
-         /// 处理完成任务
 
-         /// </summary>
 
-         public void FinishedTaskHandle()
 
-         {
 
-             WCS_TASK task = new WCS_TASK();
 
-             DB.Do(db =>
 
-             {
 
-                 var taskIds = new List<int>() { Data2.FinishedTask_1, Data2.FinishedTask_2 }.ToArray();
 
-                 for (int i = 0; i < taskIds.Length; i++)
 
-                 {
 
-                     //判断当前工位是否有完成任务
 
-                     if (taskIds[i] == 0) continue;
 
-                     task = db.Default.Set<WCS_TASK>().Single(v => taskIds[i] == v.ID);
 
-                     if (task.STATUS != TaskStatus.堆垛机执行 && task.STATUS != TaskStatus.堆垛机完成)
 
-                     {
 
-                         InfoLog.INFO_WarnDb($"任务{task.ID},状态位{task.STATUS}", Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
 
-                         continue;
 
-                     };
 
-                     if (task.STATUS == TaskStatus.堆垛机完成)
 
-                     {
 
-                         if (i == 0)
 
-                         {
 
-                             Data.FinishedACK_1 = 1;
 
-                             Data.TaskID_1 = 0;
 
-                         }
 
-                         else
 
-                         {
 
-                             Data.FinishedACK_2 = 1;
 
-                             Data.TaskID_2 = 0;
 
-                         }
 
-                         throw new DoException("二次处理堆垛机完成任务");
 
-                     }
 
-                     switch (task.TYPE)
 
-                     {
 
-                         case TaskType.入库:
 
-                             task.ENDTIME = DateTime.Now;
 
-                             task.STATUS = TaskStatus.已完成;
 
-                             task.UPDATETIME = DateTime.Now;
 
-                             break;
 
-                         case TaskType.出库:
 
-                             task.STATUS = TaskStatus.堆垛机完成;
 
-                             task.UPDATETIME = DateTime.Now;
 
-                             break;
 
-                         case TaskType.移库:
 
-                             {
 
-                                 if (task.STATUS == TaskStatus.堆垛机执行)
 
-                                 {
 
-                                     task.STATUS = TaskStatus.已完成;
 
-                                     task.UPDATETIME = DateTime.Now;
 
-                                 }
 
-                                 break;
 
-                             }
 
-                         case TaskType.倒库:
 
-                             if (task.DEVICEDL == Entity.CODE)
 
-                             {
 
-                                 task.STATUS = TaskStatus.已完成;
 
-                                 task.UPDATETIME = DateTime.Now;
 
-                             }
 
-                             else
 
-                             {
 
-                                 task.STATUS = TaskStatus.堆垛机完成;
 
-                                 task.UPDATETIME = DateTime.Now;
 
-                             }
 
-                             break;
 
-                         default:
 
-                             throw new Exception($"[{Entity.CODE}]任务类型错误,{task.ID}");
 
-                     }
 
-                     task.CreateStatusLog(db, $"堆垛机完成任务", this.GetType());
 
-                 }
 
-                 db.Default.SaveChanges();
 
-             });
 
-             DB.Do(db =>
 
-             {
 
-                 var taskIds = new List<int>() { Data2.FinishedTask_1, Data2.FinishedTask_2 }.ToArray();
 
-                 for (int i = 0; i < taskIds.Length; i++)
 
-                 {
 
-                     //判断当前工位是否有完成任务
 
-                     if (taskIds[i] == 0) continue;
 
-                     //获取当前工位的目标地址
 
-                     task = db.Default.Set<WCS_TASK>().Single(v => taskIds[i] == v.ID);
 
-                     if (i == 0)
 
-                     {
 
-                         Data.FinishedACK_1 = 1;
 
-                         Data.TaskID_1 = 0;
 
-                     }
 
-                     else
 
-                     {
 
-                         Data.FinishedACK_2 = 1;
 
-                         Data.TaskID_2 = 0;
 
-                     }
 
-                 }
 
-             });
 
-         }
 
-         /// <summary>
 
-         /// 执行堆垛机任务 单例锁
 
-         /// </summary>
 
-         /// <param name="act"></param>
 
-         public void EX(Action<SRMDevice> act)
 
-         {
 
-             var key = $"WCS:Lock:{Entity.CODE}";
 
-             try
 
-             {
 
-                 if (ProtocolProxy.YG150Redis.Get(key) != null) throw new WarnException($"[{Entity.CODE}]--触发并发管控");
 
-                 ProtocolProxy.YG150Redis.Set(key, Entity.CODE);
 
-                 act(this);
 
-             }
 
-             catch (DoException ex)
 
-             {
 
-                 ex.DoExceptionEX(Entity);
 
-             }
 
-             catch (WarnException ex)
 
-             {
 
-                 ex.WarnExceptionEX(Entity);
 
-             }
 
-             catch (Exception ex)
 
-             {
 
-                 ex.ExceptionEx(Entity);
 
-             }
 
-             finally
 
-             {
 
-                 ProtocolProxy.YG150Redis.Del(key);
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// 执行出库任务 出库单例锁
 
-         /// </summary>
 
-         /// <param name="act"></param>
 
-         public void EXOutStock(Action<SRMDevice> act)
 
-         {
 
-             var key = "WCS:Lock:";
 
-             try
 
-             {
 
-                 if (Entity.CODE == "SRM3" || Entity.CODE == "SRM4")
 
-                 {
 
-                     key += "SRM3-SRM4-Out";
 
-                     if (ProtocolProxy.YG150Redis.Get(key) != null) throw new WarnException($"触发出库并发管控--[{Entity.CODE}]");
 
-                     ProtocolProxy.YG150Redis.Set(key, Entity.CODE);
 
-                 }
 
-                 if (Entity.CODE == "SRM5" || Entity.CODE == "SRM6")
 
-                 {
 
-                     key += "SRM5-SRM6-Out";
 
-                     if (ProtocolProxy.YG150Redis.Get(key) != null) throw new WarnException($"触发出库并发管控--[{Entity.CODE}]");
 
-                     ProtocolProxy.YG150Redis.Set(key, Entity.CODE);
 
-                 }
 
-                 if (Entity.CODE == "SRM7" || Entity.CODE == "SRM8")
 
-                 {
 
-                     key += "SRM7-SRM8-Out";
 
-                     if (ProtocolProxy.YG150Redis.Get(key) != null) throw new WarnException($"触发出库并发管控--[{Entity.CODE}]");
 
-                     ProtocolProxy.YG150Redis.Set(key, Entity.CODE);
 
-                 }
 
-                 act(this);
 
-             }
 
-             finally
 
-             {
 
-                 if (Entity.CODE == "SRM3" || Entity.CODE == "SRM4") ProtocolProxy.YG150Redis.Del($"{key}SRM3-SRM4-Out");
 
-                 if (Entity.CODE == "SRM5" || Entity.CODE == "SRM6") ProtocolProxy.YG150Redis.Del($"{key}SRM5-SRM6-Out");
 
-                 if (Entity.CODE == "SRM7" || Entity.CODE == "SRM8") ProtocolProxy.YG150Redis.Del($"{key}SRM7-SRM8-Out");
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// 一工位写任务
 
-         /// </summary>
 
-         /// <param name="task"></param>
 
-         /// <param name="goodsnum">货物数量</param>
 
-         public void WriteTask1(Task task, short goodsnum)
 
-         {
 
-             InfoLog.INFO_SRMINFO($"出库--写入堆垛机[{Entity.CODE}]1工位-开始:[{Data.TaskID_1}][{Data.SLine_1}][{Data.SCol_1}][{Data.SLayer_1}][{Data.ELine_1}][{Data.VoucherNo_1}]--[{Data.RES1_1}]");
 
-             Data.TaskID_1 = task.ID;
 
-             Data.SLine_1 = task.Line;
 
-             Data.SCol_1 = task.Col;
 
-             Data.SLayer_1 = task.Layer;
 
-             if (task.TYPE == TaskType.移库)
 
-             {
 
-                 Data.ELine_1 = task.EndLine;
 
-                 Data.ECol_1 = task.EndCol;
 
-                 Data.ELayer_1 = task.EndLayer;
 
-             }
 
-             else
 
-             {
 
-                 Data.ELine_1 = task.SRMSTATION.ToShort();
 
-                 Data.ECol_1 = 0;
 
-                 Data.ELayer_1 = 0;
 
-             }
 
-             Data.RES1_1 = goodsnum;
 
-             Data.VoucherNo_1++;
 
-             InfoLog.INFO_SRMINFO($"出库--写入堆垛机[{Entity.CODE}]1工位-结束:[{Data.TaskID_1}][{Data.SLine_1}][{Data.SCol_1}][{Data.SLayer_1}][{Data.ELine_1}][{Data.VoucherNo_1}]--[{Data.RES1_1}]");
 
-         }
 
-         /// <summary>
 
-         /// 二工位写任务
 
-         /// </summary>
 
-         /// <param name="task"></param>
 
-         /// <param name="goodsnum">货物数量</param>
 
-         public void WriteTask2(Task task, short goodsnum)
 
-         {
 
-             InfoLog.INFO_SRMINFO($"出库--写入堆垛机[{Entity.CODE}]2工位-开始:[{Data.TaskID_2}][{Data.SLine_2}][{Data.SCol_2}][{Data.SLayer_2}][{Data.ELine_2}][{Data.VoucherNo_2}]--[{Data.RES1_2}]");
 
-             Data.TaskID_2 = task.ID;
 
-             Data.SLine_2 = task.Line;
 
-             Data.SCol_2 = task.Col;
 
-             Data.SLayer_2 = task.Layer;
 
-             if (task.TYPE == TaskType.移库)
 
-             {
 
-                 Data.ELine_2 = task.EndLine;
 
-                 Data.ECol_2 = task.EndCol;
 
-                 Data.ELayer_2 = task.EndLayer;
 
-             }
 
-             else
 
-             {
 
-                 Data.ELine_2 = task.SRMSTATION.ToShort();
 
-                 Data.ECol_2 = 0;
 
-                 Data.ELayer_2 = 0;
 
-             }
 
-             Data.RES1_2 = goodsnum;
 
-             Data.VoucherNo_2++;
 
-             InfoLog.INFO_SRMINFO($"出库--写入堆垛机[{Entity.CODE}]2工位-结束:[{Data.TaskID_2}][{Data.SLine_2}][{Data.SCol_2}][{Data.SLayer_2}][{Data.ELine_2}][{Data.VoucherNo_2}]--[{Data.RES1_2}]");
 
-         }
 
-         /// <summary>
 
-         /// 获取任务对应的货叉
 
-         /// </summary>
 
-         /// <param name="task">任务信息</param>
 
-         /// <param name="index">任务在下发任务集合中的索引</param>
 
-         /// <returns></returns>
 
-         public SrmFork GetFork(Task task, int index)
 
-         {
 
-             return index switch
 
-             {
 
-                 > 1 => throw new WarnException("一次最多下发两个任务"),
 
-                 //如果索引是1,直接返回货叉2
 
-                 1 => SrmFork.货叉2,
 
-                 _ => task.Col switch
 
-                 {
 
-                     102 => Entity.CODE switch
 
-                     {
 
-                         "SRM1" => SrmFork.货叉1,
 
-                         _ => SrmFork.货叉2,
 
-                     },
 
-                     112 => SrmFork.货叉2,
 
-                     _ => SrmFork.货叉1,
 
-                 }
 
-             };
 
-         }
 
-         /// <summary>
 
-         /// 检查同组堆垛机是否有出库任务正在执行
 
-         /// </summary>
 
-         public void CheckOutTask()
 
-         {
 
-             //检查同组堆垛机是否有正在执行出库任务的
 
-             DB.Do(db =>
 
-             {
 
-                 try
 
-                 {
 
-                     var srm = Device.Find("SRM4").Create<SRMDevice>();
 
-                     var task = db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM4" && v.TYPE == TaskType.出库);
 
-                     switch (Entity.CODE)
 
-                     {
 
-                         case "SRM3":
 
-                             if (srm.Data3.SCAlarm != 0 || srm.Data2.SRMMode != WCS.Entity.Protocol.SRM.SCMode.远程 || task)
 
-                                 throw new DoException("SRM4正在执行出库任务");
 
-                             break;
 
-                         case "SRM4":
 
-                             srm = Device.Find("SRM3").Create<SRMDevice>();
 
-                             task = db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM3" && v.TYPE == TaskType.出库);
 
-                             if (srm.Data3.SCAlarm != 0 || srm.Data2.SRMMode != WCS.Entity.Protocol.SRM.SCMode.远程 || task)
 
-                                 throw new DoException("SRM3正在执行出库任务");
 
-                             break;
 
-                         case "SRM5":
 
-                             srm = Device.Find("SRM6").Create<SRMDevice>();
 
-                             task = db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM6" && v.TYPE == TaskType.出库);
 
-                             if (srm.Data3.SCAlarm != 0 || srm.Data2.SRMMode != WCS.Entity.Protocol.SRM.SCMode.远程 || task)
 
-                                 throw new DoException("SRM6正在执行出库任务");
 
-                             break;
 
-                         case "SRM6":
 
-                             srm = Device.Find("SRM5").Create<SRMDevice>();
 
-                             task = db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM5" && v.TYPE == TaskType.出库);
 
-                             if (srm.Data3.SCAlarm != 0 || srm.Data2.SRMMode != WCS.Entity.Protocol.SRM.SCMode.远程 || task)
 
-                                 throw new DoException("SRM5正在执行出库任务");
 
-                             break;
 
-                         case "SRM7":
 
-                             srm = Device.Find("SRM8").Create<SRMDevice>();
 
-                             task = db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM8" && v.TYPE == TaskType.出库);
 
-                             if (srm.Data3.SCAlarm != 0 || srm.Data2.SRMMode != WCS.Entity.Protocol.SRM.SCMode.远程 || task)
 
-                                 throw new DoException("SRM8正在执行出库任务");
 
-                             break;
 
-                         case "SRM8":
 
-                             srm = Device.Find("SRM7").Create<SRMDevice>();
 
-                             task = db.Default.Set<WCS_TASK>().Any(v => v.STATUS == TaskStatus.堆垛机执行 && v.DEVICE == "SRM7" && v.TYPE == TaskType.出库);
 
-                             if (srm.Data3.SCAlarm != 0 || srm.Data2.SRMMode != WCS.Entity.Protocol.SRM.SCMode.远程 || task)
 
-                                 throw new DoException("SRM7正在执行出库任务");
 
-                             break;
 
-                     }
 
-                 }
 
-                 catch (Exception e)
 
-                 {
 
-                     InfoLog.INFO_WarnDb(e.Message, Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
 
-                 }
 
-             });
 
-         }
 
-     }
 
-     /// <summary>
 
-     /// 异常处理
 
-     /// </summary>
 
-     public static class DevEX
 
-     {
 
-         /// <summary>
 
-         /// 计算两点距离
 
-         /// </summary>
 
-         /// <param name="start">起始点</param>
 
-         /// <param name="end">结束点</param>
 
-         /// <param name="total">总长</param>
 
-         /// <returns></returns>
 
-         public static float Distance(float start, float end, float total)
 
-         {
 
-             float distance = 0;
 
-             if (start > end) distance = (total - start) + end;
 
-             else distance = end - start;
 
-             return distance;
 
-         }
 
-         public static void DoExceptionEX(this DoException ex, WCS_DEVICE Entity)
 
-         {
 
-             InfoLog.INFO_INFO($"[{Entity.CODE}]--{ex.Message}");
 
-         }
 
-         /// <summary>
 
-         /// 警报执行记录
 
-         /// </summary>
 
-         /// <param name="ex">警报信息</param>
 
-         /// <param name="Entity">发生设备</param>
 
-         /// <param name="reportMonitor">是否上报监控</param>
 
-         /// <exception cref="Exception"></exception>
 
-         public static void WarnExceptionEX(this WarnException ex, WCS_DEVICE Entity, bool reportMonitor = true)
 
-         {
 
-             InfoLog.INFO_WARN($"[{Entity.CODE}]--{ex.Message}");
 
-             if (ex.Message.Contains("The database operation was expected")) return;
 
-             if (!reportMonitor)
 
-             {
 
-                 LogHelper.AddWCS_EXCEPTION(ex.Message, Entity.CODE, WCS_EXCEPTIONTYPE.无.ToString());
 
-             }
 
-             //排除部分频繁触发的异常上报
 
-             if (ex.Message.Contains("触发并发管控")) return;
 
-             if (reportMonitor)
 
-             {
 
-                 throw new Exception($"[{Entity.CODE}]--{ex.Message}");
 
-             }
 
-         }
 
-         public static void ExceptionEx(this Exception ex, WCS_DEVICE Entity)
 
-         {
 
-             InfoLog.INFO_ERROR($"[{Entity.CODE}]--{ex.Message}--{ex.StackTrace}");
 
-             //排除部分频繁触发的异常上报
 
-             if (ex.Message.Contains("Collection was modified; enumeration operation may not execute.")) return;
 
-             Ltc.Log(ex.GetBaseException().Message);
 
-         }
 
-     }
 
-     /// <summary>
 
-     /// 堆垛机货叉/工位
 
-     /// </summary>
 
-     public enum SrmFork
 
-     {
 
-         货叉1 = 0,
 
-         货叉2 = 1,
 
-     }
 
-     /// <summary>
 
-     /// 站台位置信息
 
-     /// </summary>
 
-     public class StationLocation
 
-     {
 
-         /// <summary>
 
-         /// 所有环穿站台的信息
 
-         /// </summary>
 
-         public static List<StationLocation> ALLlocations { get; set; } = new List<StationLocation>();
 
-         static StationLocation()
 
-         {
 
-             ALLlocations.AddRange(new List<StationLocation>() {
 
-                 new StationLocation("G1",486326,"RGV3",1567770),
 
-                 new StationLocation("G2",693631,"RGV3",1567770),
 
-                 new StationLocation("G3",789931,"RGV3",1567770),
 
-                 new StationLocation("G4",961595,"RGV3",1567770),
 
-                 new StationLocation("G5",1013350,"RGV3",1567770),
 
-                 new StationLocation("G6",1069938,"RGV3",1567770),
 
-                 new StationLocation("G7",1126338,"RGV3",1567770),
 
-                 new StationLocation("G8",1178355,"RGV3",1567770),
 
-                 new StationLocation("G9",1256875,"RGV3",1567770),
 
-                 new StationLocation("G10",1313239,"RGV3",1567770),
 
-                 new StationLocation("G11",1369970,"RGV3",1567770),
 
-                 new StationLocation("G12",636770,"RGV1",3719290),
 
-                 new StationLocation("G13",749520,"RGV1",3719290),
 
-                 new StationLocation("G14",879930,"RGV1",3719290),
 
-                 new StationLocation("G15",936310,"RGV1",3719290),
 
-                 new StationLocation("G16",988000,"RGV1",3719290),
 
-                 //new StationLocation("G17",1607000,"RGV1",3719290),
 
-                 //new StationLocation("G18",1667000,"RGV1",3719290),
 
-                 new StationLocation("G19",1777767,"RGV1",3719290),
 
-                 //new StationLocation("G20",2548012,"RGV1",3719290),
 
-                 //new StationLocation("G21",2606033,"RGV1",3719290),
 
-                 //new StationLocation("G22",2660833,"RGV1",3719290),
 
-                 new StationLocation("G23",2714350,"RGV1",3719290),
 
-             });
 
-         }
 
-         public StationLocation(string station, int location, string plc, int length)
 
-         {
 
-             Station = station;
 
-             Location = location;
 
-             PLC = plc;
 
-             Length = length;
 
-         }
 
-         /// <summary>
 
-         /// 输送机设备组编号
 
-         /// </summary>
 
-         public string Station { get; set; }
 
-         /// <summary>
 
-         /// 输送机在环轨中的位置
 
-         /// </summary>
 
-         public int Location { get; set; }
 
-         /// <summary>
 
-         /// 所属RGV组 PLC名称
 
-         /// </summary>
 
-         public string PLC { get; set; }
 
-         /// <summary>
 
-         /// 所属环穿轨道的长度
 
-         /// </summary>
 
-         public int Length { get; set; }
 
-     }
 
-     /// <summary>
 
-     /// 巷道信息
 
-     /// </summary>
 
-     public class TunnelInfo
 
-     {
 
-         public WCS_DEVICE Tunnel;
 
-         public WCS_DEVICE taskIN;
 
-         public Device<ISRM520, ISRM521, ISRM537> SRM;
 
-     }
 
- }
 
 
  |