HoisterCylinder.cs 4.9 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 HoisterCylinder
    {
        public bool IsRun = false;
        private string LastMoveDO = "";
        private string LastCheckDI = "";
        private int subType = 0;
        internal DateTime LastEndTime = DateTime.Now;

        public HoisterCylinder(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.Hoister_Back))
            {
                IOManager.IOMove(IO_Type.Hoister_Forward, IO_VALUE.LOW, subType);
            }
            else
            {
                IOManager.IOMove(IO_Type.Hoister_Back, 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 StartBack(StoreMoveInfo moveInfo)
        {
            bool UseDoor = ConfigAppSettings.GetIntValue(Setting_Init.UseDoor).Equals(1);
            if (!UseDoor)
            {
                return false;
            }

            //如果门已打开直接返回
            if (IOManager.IOValue(IO_Type.Hoister_Back, subType).Equals(IO_VALUE.HIGH) &&
                IOManager.IOValue(IO_Type.Hoister_Forward, subType).Equals(IO_VALUE.LOW))
            {
                return true;
            }

            if (moveInfo != null)
            {
                moveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Hoister_Back, IO_VALUE.HIGH));
                moveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Hoister_Forward, IO_VALUE.LOW));
            }
            return Start(IO_Type.Hoister_Back, IO_Type.Hoister_Back);

        }
        public bool StartForward(StoreMoveInfo moveInfo)
        {
            bool UseDoor = ConfigAppSettings.GetIntValue(Setting_Init.UseDoor).Equals(1);
            if (!UseDoor)
            {
                return false;
            }   
            
            //如果门已关闭直接返回
            if (IOManager.IOValue(IO_Type.Hoister_Forward, subType).Equals(IO_VALUE.HIGH) &&
                IOManager.IOValue(IO_Type.Hoister_Back, subType).Equals(IO_VALUE.LOW))
            {
                return true;
            }
            if (moveInfo != null)
            {
                moveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Hoister_Forward, IO_VALUE.HIGH));
                moveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Hoister_Back, IO_VALUE.LOW));
            }
            return Start(IO_Type.Hoister_Forward, IO_Type.Hoister_Forward);
        }
    } 
}