LimitedRotary.cs 11.7 KB
using OnlineStore;
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 DeviceLibrary
{
    public class LimitedRotary : ISafetyDevice
    {
        string up;
        string down;
        string release;
        string clamp;
        AxisBean axisBean;
        int upspeed;
        int StrokeLength;
        bool paused = false;
        MoveInfo moveInfo = new MoveInfo(crc.GetString("Res0058","锡膏贴标旋转机构"), false);

        public LimitedRotary(string _up, string _down,string _release,string _clamp, AxisBean _axisBean, int _StrokeLength, int _upspeed)
        {
            up = _up;
            down = _down;
            release = _release;
            clamp = _clamp;
            axisBean = _axisBean;
            upspeed = _upspeed;
            StrokeLength = _StrokeLength;
            SafetyDevice.AddDevice(this);
            TurnWork = Task.Run(() => { });
        }
        public bool isAtTOP
        {
            get
            {
                return IOManager.IOValue(up.ToString()).Equals(IO_VALUE.HIGH);
            }
        }
        public bool isAtBOTTOM
        {
            get
            {
                return IOManager.IOValue(down.ToString()).Equals(IO_VALUE.HIGH);
            }
        }
        Task<bool> work;
        public Task<bool> TurnToEnd(bool isHorizontal,bool needclamp=false)
        {
            return work = Task.Run(() =>
            {
                string checkio = up;
                if (!isHorizontal)
                {
                    checkio = down;
                }
                if (IOManager.IOValue(IO_Type.SuddenStop_BTN).Equals(IO_VALUE.LOW))
                {
                    moveInfo.log($"急停未解除");
                    return false;
                }
                if (IOManager.IOValue(checkio).Equals(IO_VALUE.HIGH))
                {
                    moveInfo.log($"{axisBean.AxisName},{checkio},已在位置,无需运动");
                    return true;
                }
                try
                {
                    if (needclamp)
                    {
                        RobotManage.mainMachine.CylinderMove(null, IO_Type.Tin_Dock_Rotate_Release, IO_Type.Tin_Dock_Rotate_Clamp, IO_VALUE.HIGH);
                        while (!IOManager.IOValue(IO_Type.Tin_Dock_Rotate_Clamp).Equals(IO_VALUE.HIGH))
                        {
                            Task.Delay(100).Wait();
                        }
                    }
                    else {
                        RobotManage.mainMachine.CylinderMove(null, IO_Type.Tin_Dock_Rotate_Release, IO_Type.Tin_Dock_Rotate_Clamp, IO_VALUE.LOW);
                        while (!IOManager.IOValue(IO_Type.Tin_Dock_Rotate_Clamp).Equals(IO_VALUE.LOW))
                        {
                            Task.Delay(100).Wait();
                        }
                    }
                    var len = (int)(StrokeLength * 1.6);
                    if (isHorizontal)
                        len = len * -1;
                    if (!axisBean.IsServeoOn)
                        axisBean.Open(true, out string msg);
                    axisBean.RelMove(len, (double)upspeed);
                    //moveInfo.log($"{checkio}");
                    while (!IOManager.IOValue(checkio).Equals(IO_VALUE.HIGH))
                    {
                        Task.Delay(30).Wait();
                        if (paused)
                        {
                            paused = false;
                            return false;
                        }
                        if (IOManager.IOValue(IO_Type.SuddenStop_BTN).Equals(IO_VALUE.LOW))
                        {
                            LogUtil.info("设备急停");
                            Pause();
                            return true;
                        }
                        if (!axisBean.IsBusy) {
                            axisBean.RelMove(len, (double)upspeed);
                        }
                    }
                    Task.Delay(100).Wait();
                    axisBean.SuddenStop();
                    moveInfo.log($"{axisBean.AxisName},转到位");
                    degreeAdd = 0;
                    return true;
                }
                finally
                {
                    RobotManage.mainMachine.CylinderMove(moveInfo, IO_Type.Tin_Dock_Rotate_Release, IO_Type.Tin_Dock_Rotate_Clamp, IO_VALUE.LOW);
                    while (!IOManager.IOValue(IO_Type.Tin_Dock_Rotate_Release).Equals(IO_VALUE.HIGH))
                    {
                        Task.Delay(100).Wait();
                    }
                }
            });
        }
        public Task TurnWork;
        public Task TurnDegree(int degree) {
           return TurnWork=Task.Run(()=>
            {

                if (IOManager.IOValue(IO_Type.SuddenStop_BTN).Equals(IO_VALUE.LOW))
                {
                    moveInfo.log($"急停未解除");
                    return;
                }
                
                if (!axisBean.IsServeoOn)
                    axisBean.Open(true, out string msg);
                var len = (int)(StrokeLength / 90* degree);
                if (len > 0)
                {
                    TurnToEnd(false).Wait();
                }
                else if (len < 0)
                {
                    TurnToEnd(true).Wait();
                }
                //moveInfo.log($"len:{len}");
                axisBean.RelMove(len*-1, (double)upspeed);
                Task.Delay(50).Wait();
                while (axisBean.IsBusy) {
                    Task.Delay(50).Wait();
                }
                if (len > 0)
                {
                    TurnToEnd(false,true).Wait();
                }
                else if (len < 0)
                {
                    TurnToEnd(true, true).Wait();
                    //Task.Delay(500).Wait();
                    //TurnToEnd(false, false).Wait();
                }
                
            });
        }
        public void TurnRound()
        {
            TurnWork = Task.Run(() =>
            {

                if (IOManager.IOValue(IO_Type.SuddenStop_BTN).Equals(IO_VALUE.LOW))
                {
                    moveInfo.log($"急停未解除");
                    return;
                }

                if (!axisBean.IsServeoOn)
                    axisBean.Open(true, out string msg);
                var len = (int)(StrokeLength / 90 * 45);
                if (len > 0)
                {
                    TurnToEnd(false).Wait();
                }

                RobotManage.mainMachine.CylinderMove(null, IO_Type.Tin_Dock_Rotate_Release, IO_Type.Tin_Dock_Rotate_Clamp, IO_VALUE.HIGH);
                while (!IOManager.IOValue(IO_Type.Tin_Dock_Rotate_Clamp).Equals(IO_VALUE.HIGH))
                {
                    Task.Delay(100).Wait();
                }
                TurnToEnd(true, true).Wait();
                TurnToEnd(false, true).Wait();
                RobotManage.mainMachine.CylinderMove(null, IO_Type.Tin_Dock_Rotate_Release, IO_Type.Tin_Dock_Rotate_Clamp, IO_VALUE.LOW);
                while (!IOManager.IOValue(IO_Type.Tin_Dock_Rotate_Release).Equals(IO_VALUE.HIGH))
                {
                    Task.Delay(100).Wait();
                }

                TurnToEnd(false).Wait();
            });
        }
        public void TurnDouble()
        {
            TurnWork = Task.Run(() =>
            {

                if (IOManager.IOValue(IO_Type.SuddenStop_BTN).Equals(IO_VALUE.LOW))
                {
                    moveInfo.log($"急停未解除");
                    return;
                }

                if (!axisBean.IsServeoOn)
                    axisBean.Open(true, out string msg);
                var len = (int)(StrokeLength / 90 * 45);
                if (len > 0)
                {
                    TurnToEnd(false).Wait();
                }

                RobotManage.mainMachine.CylinderMove(null, IO_Type.Tin_Dock_Rotate_Release, IO_Type.Tin_Dock_Rotate_Clamp, IO_VALUE.HIGH);
                while (!IOManager.IOValue(IO_Type.Tin_Dock_Rotate_Clamp).Equals(IO_VALUE.HIGH))
                {
                    Task.Delay(100).Wait();
                }
                TurnToEnd(true, true).Wait();
                TurnToEnd(false, false).Wait();
                TurnToEnd(true, true).Wait();
                //TurnToEnd(false, false).Wait();
                //TurnDegree(-20).Wait();
                RobotManage.mainMachine.CylinderMove(null, IO_Type.Tin_Dock_Rotate_Release, IO_Type.Tin_Dock_Rotate_Clamp, IO_VALUE.LOW);
                while (!IOManager.IOValue(IO_Type.Tin_Dock_Rotate_Release).Equals(IO_VALUE.HIGH))
                {
                    Task.Delay(100).Wait();
                }

                TurnToEnd(false).Wait();
            });
        }

        int degreeAdd = 0;
        public Task LockAndTurnDegree(int degree)
        {
            return TurnWork = Task.Run(() =>
            {

                if (IOManager.IOValue(IO_Type.SuddenStop_BTN).Equals(IO_VALUE.LOW))
                {
                    moveInfo.log($"急停未解除");
                    return;
                }

                if (!axisBean.IsServeoOn)
                    axisBean.Open(true, out string msg);
                var len = (int)(StrokeLength / 90 * degree);
                if (Math.Abs(degreeAdd + degree) > 90)
                {
                    RobotManage.mainMachine.CylinderMove(null, IO_Type.Tin_Dock_Rotate_Release, IO_Type.Tin_Dock_Rotate_Clamp, IO_VALUE.LOW);
                    while (!IOManager.IOValue(IO_Type.Tin_Dock_Rotate_Clamp).Equals(IO_VALUE.HIGH))
                    {
                        Task.Delay(30).Wait();
                    }
                    if (len > 0)
                    {
                        TurnToEnd(true).Wait();                        
                    }
                    else if (len < 0)
                    {
                        TurnToEnd(false).Wait();
                    }
                }
                RobotManage.mainMachine.CylinderMove(null, IO_Type.Tin_Dock_Rotate_Release, IO_Type.Tin_Dock_Rotate_Clamp, IO_VALUE.HIGH);
                while (!IOManager.IOValue(IO_Type.Tin_Dock_Rotate_Clamp).Equals(IO_VALUE.HIGH))
                {
                    Task.Delay(30).Wait();
                }
                //moveInfo.log($"len:{len}");
                axisBean.RelMove(len, (double)upspeed);
                Task.Delay(50).Wait();
                while (axisBean.IsBusy)
                {
                    Task.Delay(50).Wait();
                }
                degreeAdd += degree;
            });
        }
        public Task UnLock()
        {
            return TurnWork = Task.Run(() =>
            {
                if (IOManager.IOValue(IO_Type.SuddenStop_BTN).Equals(IO_VALUE.LOW))
                {
                    moveInfo.log($"急停未解除");
                    return;
                }

                if (!axisBean.IsServeoOn)
                    axisBean.Open(true, out string msg);
                TurnToEnd(false).Wait();
            });

        }
                public void SetWaitResultInfo(MoveInfo moveInfo)
        {
            moveInfo.WaitList.Add(WaitResultInfo.WaitAction(new Func<WaitResultInfo, bool>(WaitStatus), $"等待[{axisBean.Config.Explain}]机构完成"));
        }

        public bool WaitStatus(WaitResultInfo w) {
            if (!work.IsCompleted) {
                return false;
            }

            return work.Result;
        }
        
        public void Pause()
        {
            //paused = true;
            axisBean.SuddenStop();

        }

        public void Resume()
        {
            //throw new NotImplementedException();
        }
    }
}