EnteryDoorBean.cs 4.1 KB
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace OnlineStore.DeviceLibrary
{
    public class EnteryDoorBean
    {
        public bool IsRun = false;
        private string LastMoveDO = "";
        private string LastCheckDI = "";
        private int subType = 0;
        internal DateTime LastEndTime = DateTime.Now;

        public EnteryDoorBean(int subType)
        {
            this.subType = subType;
        }
        public void Stop()
        {
            if (IsRun)
            {
                IsRun = false;
            }
        }
        private bool Start(string moveDO, string checkDI, int timeOutMS = 30000)
        {
            if (IsRun)
            {
                LogUtil.error("启动[" + moveDO + "] [" + checkDI + "] 失败");
                return false;
            }
            IsRun = true;
            Task.Factory.StartNew(delegate
            {
                WriteAndWait(moveDO, checkDI, timeOutMS);
            });
            return true;
        }

        private string WriteAndWait(string moveDO, string checkDI, int timeOutMS = 30000)
        {
            LastMoveDO = moveDO;
            LastCheckDI = checkDI;
            LogUtil.debug("写入信号:" + moveDO + ",等待信号:" + checkDI + "");
            //if (moveDO.Equals(IO_Type.EntranceDoor_Open))
            //{
            //    IOManager.IOMove(IO_Type.EntranceDoor_Close, IO_VALUE.LOW, subType);
            //}
            //else
            //{
            //    IOManager.IOMove(IO_Type.EntranceDoor_Open, IO_VALUE.LOW, subType);
            //}
            IOManager.IOMove(moveDO, IO_VALUE.HIGH, subType);

            Thread.Sleep(50);
            IsRun = true;
            DateTime startTime = DateTime.Now;
            string result = "";
            bool isStop = false;
            while (true)
            {
                Thread.Sleep(50);
                TimeSpan span = DateTime.Now - startTime;
                if (!IsRun)
                {
                    isStop = true;
                    result = "手动停止";
                }
                else if (span.TotalMilliseconds > timeOutMS)
                {
                    isStop = true;
                    result = "转动超时";
                }
                //判断Buzy及位置是否结束
                else if (IOManager.IOValue(checkDI, subType).Equals(IO_VALUE.HIGH))
                {
                    isStop = true;
                }
                if (isStop)
                {
                    if (result.Equals(""))
                    {
                        LogUtil.info("停止运动:" + result + " [" + moveDO + "] [" + checkDI + "] " );
                    }
                    else
                    {
                        LogUtil.info("[" + moveDO + "] [" + checkDI + "] 停止运动:" + result + " " + moveDO);
                    }
                    LastEndTime = DateTime.Now;
                    IOManager.IOMove(moveDO, IO_VALUE.LOW, subType);

                    IsRun = false;
                    return result;
                }
            }
        }

        public  bool  StartOpen(StoreMoveInfo moveInfo)
        {
           // return false;
            if (moveInfo != null)
            {
                moveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.EntranceDoor_Open, IO_VALUE.HIGH));
                moveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.EntranceDoor_Close, IO_VALUE.LOW));
            }
            return Start(IO_Type.EntranceDoor_Open, IO_Type.EntranceDoor_Open);

        }
        public bool StartClose(StoreMoveInfo moveInfo)
        {
       //     return false;
            if (moveInfo != null)
            {
                moveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.EntranceDoor_Close, IO_VALUE.HIGH));
                moveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.EntranceDoor_Open, IO_VALUE.LOW));
            }
            return Start(IO_Type.EntranceDoor_Close, IO_Type.EntranceDoor_Close);
        }
    } 
}