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; }
}
}