CylinderManger.cs 3.0 KB
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DeviceLibrary
{
    public class CylinderManger : ISafetyDevice
    {
        string High;
        string Low;
        string Name;
        IO_VALUE currentIOvalue = IO_VALUE.None;
        public CylinderManger(string name,string high,string low) {
            High = high;
            Low = low;
            Name = name;
            SafetyDevice.AddDevice(this);
        }
        bool IsHigh = true;
        public void ToHigh(MoveInfo moveInfo) {
            currentIOvalue = IO_VALUE.HIGH;
            if (moveInfo != null)
            {
                moveInfo.WaitList.Add(WaitResultInfo.WaitIO(Low, IO_VALUE.LOW));
                moveInfo.WaitList.Add(WaitResultInfo.WaitIO(High, IO_VALUE.HIGH));
            }
            Resume();
            LogUtil.info($"{Name},设置{High}=High");
        }
        public void ToLow(MoveInfo moveInfo)
        {
            currentIOvalue = IO_VALUE.LOW;
            if (moveInfo != null)
            {
                moveInfo.WaitList.Add(WaitResultInfo.WaitIO(Low, IO_VALUE.HIGH));
                moveInfo.WaitList.Add(WaitResultInfo.WaitIO(High, IO_VALUE.LOW));
            }
            Resume();
            LogUtil.info($"{Name},设置{High}=Low");
        }

        public void Pause()
        {
            LogUtil.info($"{Name},停止运行");
            IOManager.IOMove(Low, IO_VALUE.LOW);
            IOManager.IOMove(High, IO_VALUE.LOW);
            if (currentIOvalue == IO_VALUE.None) {
                LogUtil.info($"{Name},没有在运行");
                return;
            }
            else if (currentIOvalue == IO_VALUE.HIGH && IOManager.IOValue(High).Equals(IO_VALUE.HIGH))
            {
                LogUtil.info($"{Name},currentIOvalue:{currentIOvalue},暂停是IO已到位");
                return;
            }else if (currentIOvalue == IO_VALUE.LOW && IOManager.IOValue(Low).Equals(IO_VALUE.HIGH))
            {
                LogUtil.info($"{Name},currentIOvalue:{currentIOvalue},暂停是IO已到位");
                return;
            }
        }

        public void Resume()
        {
            if (currentIOvalue == IO_VALUE.None)
                return;

            if (!SafetyDevice.IsSafe())
                return;

            IOManager.IOMove(Low, currentIOvalue == IO_VALUE.LOW ? IO_VALUE.HIGH : IO_VALUE.LOW);
            IOManager.IOMove(High, currentIOvalue == IO_VALUE.HIGH ? IO_VALUE.HIGH : IO_VALUE.LOW);
            LogUtil.info($"{Name},恢复运行");
            Task.Run(()=> {
                while (IOManager.IOValue(currentIOvalue == IO_VALUE.LOW?Low:High).Equals(IO_VALUE.HIGH))
                {
                    Task.Delay(50).Wait();
                    if (!SafetyDevice.IsSafe())
                    { 
                        Pause();
                        return;
                    }
                }
            });
        }

    }
}