using PlcSiemens.Core.Extension; using ServiceCenter.Logs; using ServiceCenter.Redis; using WCS.Core; using WCS.WorkEngineering.Protocol.BCR; using WCS.WorkEngineering.Protocol.Station; namespace WCS.WorkEngineering.Extensions { /// /// 设备扩展 /// public static class DeviceExtension { #region 设备类型 public static List ProtocolInfos = new List(); /// /// 是否是巷道 /// /// 设备信息 /// public static bool IsTunnel(this Device source) { return source.HasFlag(DeviceFlags.巷道); } #endregion 设备类型 #region 标签判断 public static bool HasFlag(this Device device, params DeviceFlags[] flag) { foreach (var item in flag) { if (device.HasFlag(item)) continue; return false; } return true; } #endregion 标签判断 #region 协议操作扩展 public static void AddProtocol(this Device device, int position, ushort db, string ip) { var info = new ProtocolInfo { Position = position, DBInfo = new DBInfo { No = db, PLCInfo = new PLCInfo { IP = ip, Port = 102, Rack = 0, Slot = 1, Type = PLCType.Siemens } } }; ProtocolInfos.Add(info); device.AddProtocol(info); } #endregion 协议操作扩展 #region 设备扩展方法 /// /// 入库站点是否被禁止 /// /// public static void 入库站点是否被禁止(this Device device) { var config = RedisHub.Default.Check("ForbidTubuEnter") ?? throw new Exception("请在Redis中配置入库口禁用"); var configs = config.Split(","); if (configs.Contains(device.Entity.Code)) throw new KnownException("当前入库口已被禁用,请联系运维人员了解具体情况", LogLevelEnum.High); } /// /// 入库站点是否被禁止 /// /// public static void 入库站点是否被禁止(this Device device) { var config = RedisHub.Default.Check("ForbidTubuEnter") ?? throw new Exception("请在Redis中配置入库口禁用"); var configs = config.Split(","); if (configs.Contains(device.Entity.Code)) throw new KnownException("当前入库口已被禁用,请联系运维人员了解具体情况", LogLevelEnum.High); } /// /// 入库站点是否被禁止 /// /// public static void 入库站点是否被禁止(this Device device) { var config = RedisHub.Default.Check("ForbidTubuEnter") ?? throw new Exception("请在Redis中配置入库口禁用"); var configs = config.Split(","); if (configs.Contains(device.Entity.Code)) throw new KnownException("当前入库口已被禁用,请联系运维人员了解具体情况", LogLevelEnum.High); } /// /// 入库站点是否满足执行条件 /// /// public static void 入库站点是否满足执行条件(this Device device) { if (device.Data.VoucherNo != device.Data2.VoucherNo) throw new KnownException($"凭证号不一致,DB520:{device.Data.VoucherNo}-DB521:{device.Data2.VoucherNo}", LogLevelEnum.High); if (device.Data3.Status.HasFlag(StationStatus.Run)) throw new KnownException("设备运行中", LogLevelEnum.Low); if (device.Data3.Status.HasFlag(StationStatus.PH_Status) && device.Data2.Request == 0) throw new KnownException("有光电无请求", LogLevelEnum.Mid); if (!device.Data3.Status.HasFlag(StationStatus.PH_Status) && device.Data2.Request == 1) throw new KnownException("无光电有请求", LogLevelEnum.Mid); if (!device.Data3.Status.HasFlag(StationStatus.OT_Status)) throw new KnownException("站台货物信息与实际占用不一致", LogLevelEnum.Low); } /// /// 入库站点是否满足执行条件 /// /// public static void 入库站点是否满足执行条件(this Device device) { if (device.Data.VoucherNo != device.Data2.VoucherNo) throw new KnownException($"凭证号不一致,DB520:{device.Data.VoucherNo}-DB521:{device.Data2.VoucherNo}", LogLevelEnum.High); if (device.Data3.Status.HasFlag(StationStatus.Run)) throw new KnownException("设备运行中", LogLevelEnum.Low); if (device.Data3.Status.HasFlag(StationStatus.PH_Status) && device.Data2.Request == 0) throw new KnownException("有光电无请求", LogLevelEnum.Mid); if (!device.Data3.Status.HasFlag(StationStatus.PH_Status) && device.Data2.Request == 1) throw new KnownException("无光电有请求", LogLevelEnum.Mid); if (!device.Data3.Status.HasFlag(StationStatus.OT_Status)) throw new KnownException("站台货物信息与实际占用不一致", LogLevelEnum.Low); } /// /// 入库站点是否满足执行条件 /// /// public static void 入库站点是否满足执行条件(this Device device) { if (device.Data.VoucherNo != device.Data2.VoucherNo) throw new KnownException($"凭证号不一致,DB520:{device.Data.VoucherNo}-DB521:{device.Data2.VoucherNo}", LogLevelEnum.High); if (device.Data3.Status.HasFlag(StationStatus.Run)) throw new KnownException("设备运行中", LogLevelEnum.Low); if (device.Data3.Status.HasFlag(StationStatus.PH_Status) && device.Data2.Request == 0) throw new KnownException("有光电无请求", LogLevelEnum.Mid); if (!device.Data3.Status.HasFlag(StationStatus.PH_Status) && device.Data2.Request == 1) throw new KnownException("无光电有请求", LogLevelEnum.Mid); if (!device.Data3.Status.HasFlag(StationStatus.OT_Status)) throw new KnownException("站台货物信息与实际占用不一致", LogLevelEnum.Low); } /// /// 获取BCR码 /// /// public static string GetBCRCode(this IBCR81 bCR) { var barcode = bCR.Content.Trim('\0'); if (barcode.IsNullOrWhiteSpace()) throw new KnownException($"扫码失败,内容为空", LogLevelEnum.High); return barcode; } #endregion 设备扩展方法 } /// /// 设备标签 /// [Flags] public enum DeviceFlags { 扫码 = 1 << 0, 称重 = 1 << 1, 外检 = 1 << 2, 顶升 = 1 << 3, 移栽 = 1 << 4, 旋转 = 1 << 5, 入库 = 1 << 6, 出库 = 1 << 7, 巷道口 = 1 << 8, RGV口 = 1 << 9, AGV口 = 1 << 10, 直轨 = 1 << 11, 弯轨 = 1 << 12, 环轨 = 1 << 13, 巷道 = 1 << 14, 堆垛机 = 1 << 15, 输送机 = 1 << 16, #region 一轨双车堆垛机 一列堆垛机 = 1 << 23, 二列堆垛机 = 1 << 24, #endregion 一轨双车堆垛机 RGV = 1 << 25, 桁架 = 1 << 26, 一楼扫码 = 1 << 27, 满轮主线第一次扫码 = 1 << 28, 主线分流点 = 1 << 29, 一楼叠盘机 = 1 << 30, } /// /// 输送机段信息 /// public class StationSegmentInfo { /// /// 构造函数 /// /// 起始设备号 /// 结束设备号 /// ip public StationSegmentInfo(int start, int end, string ip) { Start = start; End = end; IP = ip; } /// /// 起始设备编号 /// public int Start { get; set; } /// ///结束设备编号 /// public int End { get; set; } /// /// 输送机段所属IP /// public string IP { get; set; } } /// /// RGV信息 /// public class RGVSegmentInfo { /// /// 构造函数 /// /// 起始设备号 /// 结束设备号 /// ip public RGVSegmentInfo(int code, string ip) { Code = code; IP = ip; } /// /// 设备编号 /// public int Code { get; set; } /// /// 输送机段所属IP /// public string IP { get; set; } } /// /// 桁架信息 /// public class TrussSegmentInfo { /// /// 构造函数 /// /// /// ip public TrussSegmentInfo(int code, string ip) { Code = code; IP = ip; } /// /// 设备编号 /// public int Code { get; set; } /// /// 输送机段所属IP /// public string IP { get; set; } } /// /// 扫码器信息 /// public class BcrInfo { /// /// 构造函数 /// /// 设备编号 /// ip public BcrInfo(int[] deviceNo, string ip) { DeviceNo = deviceNo; IP = ip; } /// /// 设备编号 /// public int[] DeviceNo { get; set; } /// /// ip /// public string IP { get; set; } } /// /// 外形信息 /// public class ShapeInfo { /// /// 构造函数 /// /// 设备编号 /// ip public ShapeInfo(int[] deviceNo, string ip) { DeviceNo = deviceNo; IP = ip; } /// /// 设备编号 /// public int[] DeviceNo { get; set; } /// /// ip /// public string IP { get; set; } } /// /// 路径信息 /// public class RouteInfo { /// /// 构造函数 /// /// 起始点设备号 /// 下一个设备集合 public RouteInfo(string deviceCode, string[] nextList) { DeviceCode = deviceCode; NextList = nextList; } /// /// 设备号 /// public string DeviceCode { get; set; } /// /// 下一个设备 /// public string[] NextList { get; set; } } }