LineRunMonitor.cs 3.9 KB
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;

namespace DeviceLibrary
{
    public class LineRunMonitor
    {
        Timer lineTimer = null;
        Dictionary<string, DateTime> linrunlist = new Dictionary<string, DateTime>();
        string Name;
        ushort LineIO;
        public LineRunMonitor(string name, ushort io) {
            Name = name;
            LineIO = io;
            LineInit();
        }

        void LineInit()
        {
            if (lineTimer == null)
            {
                lineTimer = new Timer(100);
                lineTimer.Elapsed += LineTimer_Elapsed;
                lineTimer.Start();
                GC.KeepAlive(lineTimer);
            }
        }

        private void LineTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            lock (linrunlist)
            {
                if (canStopLine(out _) && DOValue(LineIO).Equals(IO_VALUE.HIGH))
                {
                    DOMove(LineIO, IO_VALUE.LOW);
                    LogUtil.info(Name + $" 线体管理器 停止线体.");
                }
            }
        }

        private void DOMove(ushort LineIO, IO_VALUE iovalue)
        {
            IOManager.WriteSingleDO("", 0x00, LineIO, iovalue);
        }

        private object DOValue(ushort LineIO)
        {
            return IOManager.GetDOValue("", 0x00, LineIO);
        }


        /// <summary>
        /// 控制线体运转
        /// </summary>
        /// <param name="id">需求方标识</param>
        /// <param name="seconds">秒数</param>
        public void LineRun(string id, int seconds, string parentname = "")
        {
            LineInit();

            DOMove(LineIO, IO_VALUE.HIGH);
            lock (linrunlist)
            {
                DOMove(LineIO, IO_VALUE.HIGH);
                if (!string.IsNullOrEmpty(id) && seconds > 0)
                {
                    if (linrunlist.ContainsKey(id))
                        linrunlist[id] = DateTime.Now.AddSeconds(seconds);
                    else
                    {
                        linrunlist.Add(id, DateTime.Now.AddSeconds(seconds));
                    }
                    LogUtil.info(Name + $" 线体管理器 {id},{parentname} 请求链条运行 {seconds}秒.");
                }
            }
        }
        public void LineStop(string id, string parentname = "")
        {
            lock (linrunlist)
            {
                if (!string.IsNullOrEmpty(id))
                {
                    if (linrunlist.ContainsKey(id))
                        linrunlist.Remove(id);
                    LogUtil.info(Name + $" 线体管理器 {id},{parentname} 请求立刻停止线体.");
                }
            }
            if (!canStopLine(out string msg))
                LogUtil.info(Name + $" {Name}");
            //    IOMove(IO_Type.Line_Run, IO_VALUE.LOW);
        }
        bool canStopLine(out string msg)
        {
            msg = "";
            bool canStop = true;
            lock (linrunlist)
            {
                foreach (var x in linrunlist.ToList())
                {
                    if (x.Value > DateTime.Now)
                    {
                        canStop = false;
                        msg = Name + $" 线体管理器 {x.Key} 不允许停止线体 需求停止时间 {x.Value.ToString()}.";
                        //LogUtil.info(Name + $" {x.Key} 不允许停止线体 需求停止时间 {x.Value.ToString()}.");
                    }
                    else
                    {
                        LogUtil.info(Name + $" 线体管理器 {x.Key} 请求时间已过期,删除.");
                        linrunlist.Remove(x.Key);

                    }
                }
            }
            return canStop;
        }
    }
}