|
@@ -10,16 +10,39 @@ using WCS.Entity;
|
|
|
|
|
|
namespace WCS.Core
|
|
|
{
|
|
|
+ /// <summary>
|
|
|
+ /// 逻辑处理器
|
|
|
+ /// </summary>
|
|
|
public abstract class LogicHandler
|
|
|
{
|
|
|
+ /// <summary>
|
|
|
+ /// 停止
|
|
|
+ /// </summary>
|
|
|
protected bool Stoped = false;
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 描述
|
|
|
+ /// </summary>
|
|
|
protected string Description { get; private set; }
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 所有对象
|
|
|
+ /// </summary>
|
|
|
public static List<object> AllObjects = new List<object>();
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 所有处理器
|
|
|
+ /// </summary>
|
|
|
private static List<LogicHandler> Handlers = new List<LogicHandler>();
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ /// 日志委托
|
|
|
+ /// </summary>
|
|
|
public static Action<string, string, string> DbLog;
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 逻辑处理器
|
|
|
+ /// </summary>
|
|
|
public LogicHandler()
|
|
|
{
|
|
|
var attr = this.GetType().GetCustomAttributes(false).OfType<DescriptionAttribute>().FirstOrDefault();
|
|
@@ -29,8 +52,14 @@ namespace WCS.Core
|
|
|
Description = this.GetType().Name;
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 开始
|
|
|
+ /// </summary>
|
|
|
public abstract void Start();
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 是否并行
|
|
|
+ /// </summary>
|
|
|
public virtual bool ParallelRun
|
|
|
{
|
|
|
get
|
|
@@ -45,16 +74,26 @@ namespace WCS.Core
|
|
|
/// <param name="milliseconds">离上次触发的间隔时间(毫秒)</param>
|
|
|
public abstract void Update(double milliseconds);
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 停止
|
|
|
+ /// </summary>
|
|
|
public void Stop()
|
|
|
{
|
|
|
Stoped = true;
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 添加处理器
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="handler">处理器</param>
|
|
|
public static void AddManager(LogicHandler handler)
|
|
|
{
|
|
|
Handlers.Add(handler);
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 启动所有的处理器
|
|
|
+ /// </summary>
|
|
|
public static void StartAll()
|
|
|
{
|
|
|
foreach (var h in Handlers)
|
|
@@ -62,15 +101,25 @@ namespace WCS.Core
|
|
|
h.Start();
|
|
|
}
|
|
|
var th = new Thread(new ThreadStart(Loop));
|
|
|
- th.IsBackground = true;
|
|
|
+ th.IsBackground = true; //前台线程即主线程关闭,立即结束该线程
|
|
|
th.Start();
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 最后一次执行结束的时间
|
|
|
+ /// </summary>
|
|
|
private static DateTime last = DateTime.Now;
|
|
|
- private static DateTime last2 = DateTime.Now;
|
|
|
+
|
|
|
+ /// <summary>
|
|
|
+ ///逻辑耗时
|
|
|
+ /// </summary>
|
|
|
private static int logicTimes;
|
|
|
+
|
|
|
public static DateTime Frame { get; private set; }
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 主循环体,用于PLC数据的读取与逻辑执行
|
|
|
+ /// </summary>
|
|
|
private static void Loop()
|
|
|
{
|
|
|
var arr = AllObjects.OfType<WCS_DEVICE>().Where(v => v.ENABLED).SelectMany(v => v.PROTOCOLS)
|
|
@@ -82,7 +131,7 @@ namespace WCS.Core
|
|
|
{
|
|
|
var dd = DateTime.Now;
|
|
|
Frame = DateTime.Now;
|
|
|
- Parallel.ForEach<WCS_DATABLOCK>(arr, db =>
|
|
|
+ Parallel.ForEach(arr, db =>
|
|
|
{
|
|
|
try
|
|
|
{
|
|
@@ -102,6 +151,7 @@ namespace WCS.Core
|
|
|
Thread.Sleep(s);
|
|
|
total = (DateTime.Now - last).TotalMilliseconds;
|
|
|
Console.ForegroundColor = ConsoleColor.Blue;
|
|
|
+ //此处打印的logicTimes实际是上一个周期的业务处理时长
|
|
|
Console.WriteLine("------刷新DB块数据耗时:" + ((int)dbTimes).ToString().PadRight(4, ' ') + ";业务逻辑耗时:" + ((int)logicTimes).ToString().PadRight(4, ' ') + ";周期总耗时" + ((int)total).ToString().PadRight(4, ' ') + "");
|
|
|
Console.ResetColor();
|
|
|
last = DateTime.Now;
|
|
@@ -125,6 +175,9 @@ namespace WCS.Core
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 停止所有的处理器
|
|
|
+ /// </summary>
|
|
|
public static void StopAll()
|
|
|
{
|
|
|
foreach (var h in Handlers)
|
|
@@ -138,12 +191,20 @@ namespace WCS.Core
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 逻辑处理器 泛型
|
|
|
+ /// </summary>
|
|
|
+ /// <typeparam name="T"></typeparam>
|
|
|
public abstract class LogicHandler<T> : LogicHandler where T : EntityEx<WCS_DEVICE>
|
|
|
{
|
|
|
- private string logPath = "";
|
|
|
-
|
|
|
+ /// <summary>
|
|
|
+ /// 业务类集合
|
|
|
+ /// </summary>
|
|
|
protected List<WorkInfo<T>> Works = new List<WorkInfo<T>>();
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// TODO:?
|
|
|
+ /// </summary>
|
|
|
private IEnumerable<T> _Objects = null;
|
|
|
|
|
|
protected IEnumerable<T> Objects
|
|
@@ -167,7 +228,6 @@ namespace WCS.Core
|
|
|
|
|
|
public LogicHandler()
|
|
|
{
|
|
|
- logPath = @"D:\WCSLog\Log\" + this.Description + @"\";
|
|
|
}
|
|
|
|
|
|
public void AddWork(Func<T, bool> condition, Action<T> work, bool parallel = false)
|
|
@@ -300,15 +360,18 @@ namespace WCS.Core
|
|
|
protected abstract void Execute(T dev);
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 工作处理器
|
|
|
+ /// </summary>
|
|
|
public abstract class WorkHandler : LogicHandler
|
|
|
{
|
|
|
- private string logPath = "";
|
|
|
-
|
|
|
+ /// <summary>
|
|
|
+ /// 所有被申明的工作处理器
|
|
|
+ /// </summary>
|
|
|
protected List<WorkInfo> Works = new List<WorkInfo>();
|
|
|
|
|
|
public WorkHandler()
|
|
|
{
|
|
|
- logPath = @"Log\" + this.Description + @"\";
|
|
|
var arr = Assembly.GetEntryAssembly().GetTypes().Where(v => v.IsSubclassOf(typeof(Work))).Where(v =>
|
|
|
{
|
|
|
var attr = v.GetCustomAttribute<WorkTitleAttribute>();
|
|
@@ -326,9 +389,12 @@ namespace WCS.Core
|
|
|
|
|
|
public override sealed void Start()
|
|
|
{
|
|
|
- //throw new NotImplementedException();
|
|
|
}
|
|
|
|
|
|
+ /// <summary>
|
|
|
+ /// 执行处理中心
|
|
|
+ /// </summary>
|
|
|
+ /// <param name="milliseconds"></param>
|
|
|
public override void Update(double milliseconds)
|
|
|
{
|
|
|
if (ParallelRun)
|