DoorControl.cs 6.9 KB
using DeviceLibrary;
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 DoorControl : IDisposable
    {
        string Name;
        Robot_Config Config;
        Thread DoorRunMonitorThread;
        public DoorControl(string name , Robot_Config config) {
            Name = name;
            Config = config;
            InitDoorRunMonitor();
        }
        void InitDoorRunMonitor() {
            DoorRunMonitorThread = new Thread(new ThreadStart(DoorRunMonitor));
            DoorRunMonitorThread.Start();
            //GC.KeepAlive(DoorRunMonitorThread);
            LogUtil.info(Name + "出料门运行监控开始");

        }
        bool DoorRunMonitorEnable = false;
        public void OpenDoor(MoveInfo moveInfo)
        {
            if (DoorIsOpen())
            {
                LogUtil.info(Name + "出料门开门,已在开闭状态");
                return; }


            if (_doorRunState != 0)
            {
                LogUtil.info(Name + "出料门正在运行");
                return;
            }
            _doorRunState = 1;
            CheckDoorState();
            starttime = DateTime.Now;
            AxisManager.RelMove(Config.Door_Axis.DeviceName, Config.Door_Axis.GetAxisValue(), Config.Door_Length, Config.Door_Length_speed, Config.Door_Length_speed * 4, Config.Door_Length_speed * 4);
            LogUtil.info(Name + "出料门开门,速度: " + Config.Door_Length_speed);

            DoorRunMonitorEnable = true;
            if (moveInfo != null)
            {
                moveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Door_Down, IO_VALUE.LOW));
                moveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Door_Up, IO_VALUE.HIGH));
            }
        }
        /// <summary>
        /// 记录是否是因为开门打开的吹气
        /// </summary>
        public void CloseDoor(MoveInfo moveInfo)
        {
            if (DoorIsClose())
            {
                LogUtil.info(Name + "出料门关门,已在关闭状态");
                return;
            }

            if (_doorRunState != 0)
            {
                LogUtil.info(Name + "出料门正在运行");
                return;
            }
            CheckDoorState();
            _doorRunState = -1;
            starttime = DateTime.Now;
            AxisManager.RelMove(Config.Door_Axis.DeviceName, Config.Door_Axis.GetAxisValue(), Config.Door_Length* -1, Config.Door_Length_speed, Config.Door_Length_speed * 4, Config.Door_Length_speed * 4);
            LogUtil.info(Name + "出料门关门,速度: -" + Config.Door_Length_speed);
            DoorRunMonitorEnable = true;
            if (moveInfo != null)
            {
                moveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Door_Down, IO_VALUE.HIGH));
                moveInfo.WaitList.Add(WaitResultInfo.WaitIO(IO_Type.Door_Up, IO_VALUE.LOW));
            }
        }
        void CheckDoorState() {
            if (!AxisManager.IsServeoOn(Config.Door_Axis.DeviceName, Config.Door_Axis.GetAxisValue()))
            {
                AxisManager.AlarmClear(Config.Door_Axis.DeviceName, Config.Door_Axis.GetAxisValue());
                Thread.Sleep(100);
                AxisManager.ServoOn(Config.Door_Axis.DeviceName, Config.Door_Axis.GetAxisValue());
            }
            var isAlarm = HuichuanLibrary.HCBoardManager.GetAxisSts(Config.Door_Axis.GetAxisValue()).ALM == 1;
            if (isAlarm) {
                AxisManager.ServoOff(Config.Door_Axis.DeviceName, Config.Door_Axis.GetAxisValue());
                Thread.Sleep(100);
                AxisManager.AlarmClear(Config.Door_Axis.DeviceName, Config.Door_Axis.GetAxisValue());
                Thread.Sleep(100);
                AxisManager.ServoOn(Config.Door_Axis.DeviceName, Config.Door_Axis.GetAxisValue());
            }

        }
        public bool DoorIsClose()
        {
            return IOManager.IOValue(IO_Type.Door_Down,Config).Equals(IO_VALUE.HIGH);
        }
        public bool DoorIsOpen()
        {
            return IOManager.IOValue(IO_Type.Door_Up,Config).Equals(IO_VALUE.HIGH);
        }
        void DoorStop(bool ResetState=true) {
            if (Config.Door_Axis != null)
            {
                AxisManager.SuddenStop(Config.Door_Axis);
                LogUtil.info(Name + "出料门停止");
                DoorRunMonitorEnable = false;
                if (ResetState)
                    _doorRunState = 0;
            }
        }
        int _doorRunState = 0;
        /// <summary>
        /// 
        /// </summary>
        /// <returns>1:开门,-1:关门,0:不在运动</returns>
        int DoorRunState()
        {
            return _doorRunState;
            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;

        }
        bool ServiceRun = true;
        ~DoorControl() {
            ServiceRun = false;
        }
        DateTime starttime;
        void DoorRunMonitor()
        {
            while (ServiceRun)
            {
                if (DoorRunMonitorEnable)
                {
                    Thread.Sleep(5);
                }
                else
                {
                    //检测到门在运行立刻开始监控
                    if (DoorRunState() != 0)
                    {
                        DoorRunMonitorEnable = true;
                        continue;
                    }
                    Thread.Sleep(200);
                    continue;
                }

                //开门检测
                if (DoorRunState() == 1 && IOManager.IOValue(IO_Type.Door_Up, Config).Equals(IO_VALUE.HIGH))
                {
                    DoorStop();
                    DoorRunMonitorEnable = false;
                    continue;
                }
                //关门检测
                if (DoorRunState() == -1 && IOManager.IOValue(IO_Type.Door_Down, Config).Equals(IO_VALUE.HIGH))
                {
                    DoorStop();
                    DoorRunMonitorEnable = false;
                    continue;
                }
                if ((DateTime.Now - starttime).TotalSeconds > 3) {
                    DoorStop();
                    DoorRunMonitorEnable = false;
                    LogUtil.info(Name + "出料门运动超时,停止");
                    continue;
                }
                //var b = HuichuanLibrary.HCBoardManager.GetAxisSts(Config.Door_Axis.GetAxisValue()).BUSY == 0;
                //if (b) { 
                
                //};
            }
            LogUtil.info(Name + "出料门运行监控退出");
        }

        public void Dispose()
        {
            ServiceRun = false;
        }
    }
}