ShelfMoveBean.cs 4.8 KB
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace OnlineStore.DeviceLibrary
{
    public class ShelfMoveBean
    {
        public bool IsRun = false;
        private int ShelfType = 1;
        internal DateTime LastEndTime = DateTime.Now;

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

        private string WriteAndWait(string moveDO, string closeDO, string checkDI, int timeOutMS = 30000)
        {
            //LastMoveDO = moveDO;
            //LastCheckDI = checkDI;
            LogUtil.debug("写入:" + moveDO + ",关闭:" + closeDO + ",等待信号:" + checkDI + "");

            IOManager.IOMove(closeDO, IO_VALUE.LOW);

            IOManager.IOMove(moveDO, IO_VALUE.HIGH);

            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).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);

                    IsRun = false;
                    return result;
                }
            }
        }

        public bool StartForward(StoreMoveInfo moveInfo)
        {
            //string forwardIO = IO_Type.LeftShelf_Forward;
            //string backIO = IO_Type.LeftShelf_Back;
            //if (this.ShelfType.Equals(2))
            //{
            //    forwardIO = IO_Type.RightShelf_Forward;
            //    backIO = IO_Type.RightShelf_Back;
            //}
            ////如果门已打开直接返回
            //if (IOManager.IOValue(forwardIO).Equals(IO_VALUE.HIGH) &&
            //    IOManager.IOValue(backIO).Equals(IO_VALUE.LOW))
            //{
            //    return true;
            //}

            //if (moveInfo != null)
            //{
            //    moveInfo.WaitList.Add(WaitResultInfo.WaitIO(forwardIO, IO_VALUE.HIGH));
            //    moveInfo.WaitList.Add(WaitResultInfo.WaitIO(backIO, IO_VALUE.LOW));
            //}
            //return Start(forwardIO, backIO, forwardIO);
            return true;

        }
        public bool StartBack(StoreMoveInfo moveInfo)
        {

            //string forwardIO = IO_Type.LeftShelf_Forward;
            //string backIO = IO_Type.LeftShelf_Back;
            //if (this.ShelfType.Equals(2))
            //{
            //    forwardIO = IO_Type.RightShelf_Forward;
            //    backIO = IO_Type.RightShelf_Back;
            //}
            ////如果门已打开直接返回
            //if (IOManager.IOValue(backIO).Equals(IO_VALUE.HIGH) &&
            //    IOManager.IOValue(forwardIO).Equals(IO_VALUE.LOW))
            //{
            //    return true;
            //}

            //if (moveInfo != null)
            //{
            //    moveInfo.WaitList.Add(WaitResultInfo.WaitIO(backIO, IO_VALUE.HIGH));
            //    moveInfo.WaitList.Add(WaitResultInfo.WaitIO(forwardIO, IO_VALUE.LOW));
            //}
            //return Start(backIO, forwardIO, backIO);
            return true;
        }
    }
}