DoorControl.cs 4.5 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
{
    partial class AC_SA_BoxBean
    {
        Thread DoorRunMonitorThread;
        void InitDoorRunMonitor() {
            DoorRunMonitorThread = new Thread(new ThreadStart(DoorRunMonitor));
            DoorRunMonitorThread.Start();
            GC.KeepAlive(DoorRunMonitorThread);
            LogUtil.info(StoreName + "出料门运行监控开始");
        }
        bool DoorRunMonitorEnable = false;
        public void OpenDoor(bool needwait = true)
        {
            if (DoorIsOpen())
                return;

            IOManager.IOMove(IO_Type.Door_Moto_Rev, IO_VALUE.LOW);
            IOManager.IOMove(IO_Type.Door_Moto_Run, IO_VALUE.HIGH);

            //if (IOManager.DOValue(IO_Type.StartOrStopBlow).Equals(IO_VALUE.LOW))
            //{
            //    IOManager.IOMove(IO_Type.StartOrStopBlow, IO_VALUE.HIGH);
            //    openBlow = true;
            //}

            DoorRunMonitorEnable = true;
            if (needwait)
            {
                StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Door_Down, IO_VALUE.LOW));
                StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Door_Up, IO_VALUE.HIGH));
            }
        }
        /// <summary>
        /// 记录是否是因为开门打开的吹气
        /// </summary>
        bool openBlow = false;
        public void CloseDoor(bool needwait = true)
        {
            if (DoorIsClose())
                return;
            IOManager.IOMove(IO_Type.Door_Moto_Rev, IO_VALUE.HIGH);
            IOManager.IOMove(IO_Type.Door_Moto_Run, IO_VALUE.HIGH);

            //if (openBlow) {
            //    IOManager.IOMove(IO_Type.StartOrStopBlow, IO_VALUE.LOW);
            //    openBlow = false;
            //}
            DoorRunMonitorEnable = true;
            if (needwait)
            {
                StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Door_Down, IO_VALUE.HIGH));
                StoreMove.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Door_Up, IO_VALUE.LOW));
            }
        }
        private bool DoorIsClose()
        {
            //&& IOManager.IOValue(IO_Type.Door_Up).Equals(IO_VALUE.LOW)
            if (IOManager.IOValue(IO_Type.Door_Down).Equals(IO_VALUE.HIGH))
            {
                //IOManager.IOMove(IO_Type.StartOrStopBlow, IO_VALUE.LOW);
                return true;
            }
            return false;
        }
        private bool DoorIsOpen()
        {
            //IOManager.IOValue(IO_Type.Door_Down).Equals(IO_VALUE.LOW) &&
            if (IOManager.IOValue(IO_Type.Door_Up).Equals(IO_VALUE.HIGH))
            {
                return true;
            }
            return false;
        }
        void DoorRunMonitor()
        {
            while (true) {                
                if (DoorRunMonitorEnable)
                {
                    Thread.Sleep(5);
                }
                else {
                    //检测到门在运行立刻开始监控
                    if (IOManager.DOValue(IO_Type.Door_Moto_Run).Equals(IO_VALUE.HIGH)) {
                        DoorRunMonitorEnable = true;
                        continue;
                    }
                    Thread.Sleep(200);
                    continue;
                }
                if (IOManager.IOValue(IO_Type.Motor_Error).Equals(IO_VALUE.HIGH)) {
                    SetWarnMsg(ResourceControl.WaitSingleTimeOut);
                    continue;
                }
                //开门检测
                if (IOManager.DOValue(IO_Type.Door_Moto_Run).Equals(IO_VALUE.HIGH)
                    && IOManager.DOValue(IO_Type.Door_Moto_Rev).Equals(IO_VALUE.LOW)
                    && IOManager.IOValue(IO_Type.Door_Up).Equals(IO_VALUE.HIGH))
                {
                    IOManager.IOMove(IO_Type.Door_Moto_Run, IO_VALUE.LOW);
                    DoorRunMonitorEnable = false;
                    continue;
                }
                //关门检测
                if (IOManager.DOValue(IO_Type.Door_Moto_Run).Equals(IO_VALUE.HIGH)
                    && IOManager.DOValue(IO_Type.Door_Moto_Rev).Equals(IO_VALUE.HIGH)
                    && IOManager.IOValue(IO_Type.Door_Down).Equals(IO_VALUE.HIGH))
                {
                    IOManager.IOMove(IO_Type.Door_Moto_Run, IO_VALUE.LOW);
                    DoorRunMonitorEnable = false;
                    continue;
                }

            }
        }
    }
}