DoorControl.cs 7.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
{
    partial class AC_SA_BoxBean
    {
        Thread DoorRunMonitorThread;
        int DoorAccSpeed = 0;
        
        void InitDoorRunMonitor() {
            DoorRunMonitorThread = new Thread(new ThreadStart(DoorRunMonitor));
            DoorRunMonitorThread.Start();
            GC.KeepAlive(DoorRunMonitorThread);
            LogUtil.info(StoreName + "出料门运行监控开始");
            if (Config.Door_Axis != null)
            {
                DoorAccSpeed = (int)(Config.DoorAxis_Run_Speed * 3);
            }
        }
        bool DoorRunMonitorEnable = false;
        public void OpenDoor(bool needwait = true)
        {
            if (DoorIsOpen())
                return;
            if (Config.Door_Axis != null)
            { 
                CheckDoorState();
                ACServerManager.RelMove(Config.Door_Axis.DeviceName, Config.Door_Axis.GetAxisValue(),600000, Config.DoorAxis_Run_Speed, DoorAccSpeed, DoorAccSpeed);
                LogUtil.info(StoreName + "出料门开门,速度: " + Config.DoorAxis_Run_Speed.ToString());
            }
            else
            {
                IOManager.IOMove(IO_Type.Door_Moto_Rev, IO_VALUE.LOW);
                IOManager.IOMove(IO_Type.Door_Moto_Run, IO_VALUE.HIGH);
            }
            _doorRunState = 1;

            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;
            if (Config.Door_Axis != null)
            {
                CheckDoorState();
                //ACServerManager.SpeedMove(Config.Door_Axis.DeviceName,Config.Door_Axis.GetAxisValue(),-Config.DoorAxis_Run_Speed, DoorAccSpeed, DoorAccSpeed);
                ACServerManager.RelMove(Config.Door_Axis.DeviceName, Config.Door_Axis.GetAxisValue(), -600000, Config.DoorAxis_Run_Speed, DoorAccSpeed, DoorAccSpeed);
                LogUtil.info(StoreName + "出料门关门,速度: -"+Config.DoorAxis_Run_Speed.ToString());

            }
            else
            {
                IOManager.IOMove(IO_Type.Door_Moto_Rev, IO_VALUE.HIGH);
                IOManager.IOMove(IO_Type.Door_Moto_Run, IO_VALUE.HIGH);
            }
            _doorRunState = -1;
            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));
            }
        }
        void CheckDoorState() {
            for (int i = 0; i < 10; i++)
            {
                if (!ACServerManager.ServerOnStatus(Config.Door_Axis.DeviceName, Config.Door_Axis.GetAxisValue()))
                {
                    ACServerManager.AlarmClear(Config.Door_Axis.DeviceName, Config.Door_Axis.GetAxisValue());
                    Thread.Sleep(100);
                    ACServerManager.ServoOn(Config.Door_Axis.DeviceName, Config.Door_Axis.GetAxisValue());
                }
                else
                    break;
                var isAlarm = HuichuanLibrary.HCBoardManager.GetAxisSts(Config.Door_Axis.GetAxisValue()).ALM == 1;
                if (isAlarm)
                {
                    ACServerManager.ServoOff(Config.Door_Axis.DeviceName, Config.Door_Axis.GetAxisValue());
                    Thread.Sleep(100);
                    ACServerManager.AlarmClear(Config.Door_Axis.DeviceName, Config.Door_Axis.GetAxisValue());
                    Thread.Sleep(100);
                    ACServerManager.ServoOn(Config.Door_Axis.DeviceName, Config.Door_Axis.GetAxisValue());
                }
            }

        }
        private bool DoorIsClose()
        {
            return IOManager.IOValue(IO_Type.Door_Down).Equals(IO_VALUE.HIGH);
        }
        private bool DoorIsOpen()
        {
            return IOManager.IOValue(IO_Type.Door_Up).Equals(IO_VALUE.HIGH);
        }
        void DoorStop(bool ResetState=true) {
            if (Config.Door_Axis != null)
            {
                ACServerManager.SuddenStop(Config.Door_Axis);
                LogUtil.info(StoreName + "出料门停止");
                DoorRunMonitorEnable = false;

            }
            else
            {
                IOManager.IOMove(IO_Type.Door_Moto_Run, IO_VALUE.LOW);
                IOManager.IOMove(IO_Type.Door_Moto_Rev, IO_VALUE.LOW);
            }
            if (ResetState)
                _doorRunState = 0;
        }
        int _doorRunState = 0;
        /// <summary>
        /// 
        /// </summary>
        /// <returns>1:开门,-1:关门,0:不在运动</returns>
        int DoorRunState() {
            return _doorRunState;
            if (Config.Door_Axis != null)
            {                
                var b = HuichuanLibrary.HCBoardManager.GetAxisSts(Config.Door_Axis.GetAxisValue()).BUSY == 0;
                if (b)
                    return 0;
                var s=HuichuanLibrary.HCBoardManager.GetAxisPrfVel(Config.Door_Axis.GetAxisValue());
                return s > 0 ? 1 : -1;
            }
            else
            {
                if (IOManager.DOValue(IO_Type.Door_Moto_Run).Equals(IO_VALUE.LOW))
                    return 0;

                return IOManager.DOValue(IO_Type.Door_Moto_Rev).Equals(IO_VALUE.LOW) ? 1 : -1;
            }
        
        }
        bool SafetyLightCurtains = false;
        void DoorRunMonitor()
        {
            while (true) {                
                if (DoorRunMonitorEnable)
                {
                    Thread.Sleep(5);
                }
                else {
                    //检测到门在运行立刻开始监控
                    if (DoorRunState()!=0) {
                        DoorRunMonitorEnable = true;
                        continue;
                    }
                    Thread.Sleep(200);
                    continue;
                }
                if (Config.Door_Axis==null && IOManager.IOValue(IO_Type.Motor_Error).Equals(IO_VALUE.HIGH)) {
                    SetWarnMsg(ResourceControl.WaitSingleTimeOut, "Motor_Error","Low");//1084
                    continue;
                }
                if (!SafetyLightCurtains && IOManager.IOValue(IO_Type.SafetyLightCurtains).Equals(IO_VALUE.LOW))
                {
                    DoorStop(false);
                    SafetyLightCurtains = true;
                }
                else if (SafetyLightCurtains && IOManager.IOValue(IO_Type.SafetyLightCurtains).Equals(IO_VALUE.HIGH))
                {
                    SafetyLightCurtains = false;
                    if (DoorRunState() == 1)
                    {
                        OpenDoor();
                    }
                    else if (DoorRunState() == -1)
                    {
                        CloseDoor();
                    }
                }

                //开门检测
                if (DoorRunState()==1 && IOManager.IOValue(IO_Type.Door_Up).Equals(IO_VALUE.HIGH))
                {
                    DoorStop();
                    DoorRunMonitorEnable = false;
                    continue;
                }
                //关门检测
                if (DoorRunState() == -1 && IOManager.IOValue(IO_Type.Door_Down).Equals(IO_VALUE.HIGH))
                {
                    DoorStop();
                    DoorRunMonitorEnable = false;
                    continue;
                }

            }
        }
    }
}