MoveInfo.cs 11.4 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 MoveInfo
    {
        public static List<MoveInfo> List = new List<MoveInfo>();
        public int TimeOutSeconds = 60;
        public MoveInfo(string name)
        {
            MoveParam = new BoxParam();
            this.moveStep = MoveStep.Wait;
            IsInWait = false;
            this.Name = name;

            List.Add(this);
        }

        public string Name { get; set; }
        public DateTime LastSetpTime { get; set; }
        public bool OneWaitCanEndStep = false;

        public BoxParam MoveParam { get; set; }

        public bool IsInWait { get; set; }

        MoveStep moveStep;
        public int CanWhileCount = 0;

        delegate string StateDelegate();
        StateDelegate stateDelegate;

        public void SetStateDelegate(Func<string> target) {
            stateDelegate = new StateDelegate(target);
        }
        public String GetStateStr() {
            if (stateDelegate != null)
                return stateDelegate.Invoke();

            return "";
        }
        public MoveStep MoveStep
        {
            get { return moveStep; }
        }

        public void NewMove(MoveStep step)
        {
            this.MoveParam = new BoxParam();
            NextMoveStep(step);
        }
        public void NextMoveStep(MoveStep step)
        {
            //  PreMoveStep = moveStep;
            moveStep = step;
            LastSetpTime = DateTime.Now;
            IsInWait = true;
            WaitList = new List<WaitResultInfo>();
            OneWaitCanEndStep = false;
            CanWhileCount = 5;
        }
        /// <summary>
        /// 当前步骤执行完成
        /// </summary>
        public void EndStepWait()
        {
            IsInWait = false;
            WaitList = new List<WaitResultInfo>();
        }

        public void EndMove()
        {
            this.MoveParam = new BoxParam();
            moveStep = MoveStep.Wait;
            LastSetpTime = DateTime.Now;
            IsInWait = false;
            WaitList = new List<WaitResultInfo>();
            CanWhileCount = 0;
        }

        public List<WaitResultInfo> WaitList = new List<WaitResultInfo>();

        public bool IsStep(MoveStep step)
        {
            return moveStep.Equals(step);
        }
        public bool IsTimeOut(int timeOutSeconds = 60)
        {
            TimeSpan span = DateTime.Now - LastSetpTime;
            if (span.TotalSeconds > timeOutSeconds)
            {
                return true;
            }
            return false;
        }
        public TimeSpan StepSpan()
        {
            TimeSpan span = DateTime.Now - LastSetpTime;
            return span;
        }
        string lastmsg = "";
        public void log(string msg) {
            msg = $"[{Name}][{moveStep}][{MoveParam.PosID}-{MoveParam.WareCode}]{msg}";

            if (String.Compare(lastmsg,msg, StringComparison.Ordinal)!=0)
            {
                lastmsg = msg;
                LogUtil.info(msg);
            }
        }

        string lasterrmsg = "";
        public void errlog(string msg)
        {
            msg = $"[{Name}][{moveStep}][{MoveParam.WareCode}]{msg}";

            if (String.Compare(lasterrmsg, msg, StringComparison.Ordinal) != 0)
            {
                lasterrmsg = msg;
                LogUtil.error(msg);
            }
        }
    }

    public class WaitResultInfo
    {
        private WaitResultInfo()
        {
            IsEnd = false;
            CanWhileMoveCount = 0;
        }

        public static WaitResultInfo WaitIO(string ioType, IO_VALUE ioValue)
        {
            WaitResultInfo wait = new WaitResultInfo();
            wait.WaitType = WaitEnum.W002_IOValue;
            wait.IoType = ioType;
            wait.IoValue = ioValue;
            return wait;
        }
        public static WaitResultInfo WaitAxis(ConfigMoveAxis axis, int targetPosition, int targetSpeed)
        {
            WaitResultInfo wait = new WaitResultInfo();
            wait.WaitType = WaitEnum.W001_AxisMove;
            wait.AxisInfo = axis;
            wait.IsHomeMove = false;
            wait.TargetPosition = targetPosition;
            wait.TargetSpeed = targetSpeed;
            return wait;
        }
        public static WaitResultInfo WaitAxis(ConfigMoveAxis axis, bool isHomeMove)
        {
            WaitResultInfo wait = new WaitResultInfo();
            wait.WaitType = WaitEnum.W001_AxisMove;
            wait.AxisInfo = axis;
            wait.IsHomeMove = true;
            return wait;
        }

        public static WaitResultInfo WaitTime(int MScends)
        {
            WaitResultInfo wait = new WaitResultInfo();
            wait.CanWhileMoveCount = 0;
            wait.WaitType = WaitEnum.W003_Time;
            wait.TimeMSeconds = MScends;
            wait.IsEnd = false;
            return wait;
        }
        public static WaitResultInfo WaitAxisOrg(ConfigMoveAxis axis, IO_VALUE value)
        {
            WaitResultInfo wait = new WaitResultInfo();
            wait.WaitType = WaitEnum.W006_AxisOrg;
            wait.AxisInfo = axis;
            wait.IsHomeMove = true;
            wait.IoValue = value;
            wait.IsEnd = false;
            return wait;
        }
        public static WaitResultInfo WaitBatchAxisMove(ConfigMoveAxis axis, int targetPosition, int targetSpeed)
        {
            WaitResultInfo wait = new WaitResultInfo();
            wait.WaitType = WaitEnum.W008_BatchAxis;
            wait.AxisInfo = axis;
            wait.IsHomeMove = false;
            wait.TargetPosition = targetPosition;
            wait.TargetSpeed = targetSpeed;
            return wait;
        }

        internal static WaitResultInfo WaitScanCode()
        {
            WaitResultInfo wait = new WaitResultInfo();
            wait.WaitType = WaitEnum.W009_ScanCode;
            wait.IsHomeMove = false;
            return wait;
        }
        public static WaitResultInfo WaitAction(Func<WaitResultInfo, bool> a,string msg)
        {
            WaitResultInfo wait = new WaitResultInfo();
            wait.WaitType = WaitEnum.W013_Action;
            wait.Action = a;
            wait.ActionMsg = msg;
            return wait;
        }

        public string ToStr()
        {
            if (WaitType.Equals(WaitEnum.W001_AxisMove))
            {
                if (IsHomeMove)
                {
                    return "轴【" + AxisInfo.DisplayStr + "】原点返回";
                }
                else
                {
                    return "轴【" + AxisInfo.DisplayStr + "】绝对运动,目标位置【" + TargetPosition + "】";
                }
            }
            else if (WaitType.Equals(WaitEnum.W002_IOValue))
            {
                return "等待【" + IoType + "】=【" + IoValue + "】";
            }
            else if (WaitType.Equals(WaitEnum.W003_Time))
            {
                return "时间等待:【" + TimeMSeconds + "】毫秒";
            }
            else if (WaitType.Equals(WaitEnum.W005_ShuoKe))
            {
                return "硕科电机目标位置:【" + TargetPosition + "】 ";
            }
            else if (WaitType.Equals(WaitEnum.W006_AxisOrg))
            {
                return "轴【" + AxisInfo.DisplayStr + "】ORG信号:【" + IoValue + "】 ";
            }
            else if (WaitType.Equals(WaitEnum.W007_ReelHeight))
            {
                return "料盘高度【" + TargetPosition + "】  ";
            }
            else if (WaitType.Equals(WaitEnum.W008_BatchAxis))
            {
                return "批量轴上升到上料点";
            }
            else if (WaitType.Equals(WaitEnum.W009_ScanCode))
            {
                return "扫码完成";
            }
            else if (WaitType.Equals(WaitEnum.W013_Action))
            {
                return ActionMsg;
            }
            else
            {
                return "Wait位置类型:WaitType=【" + WaitType + "】";
            }
        }
        /// <summary>
        /// 当未结束时可以重复运动的次数
        /// </summary>
        public int CanWhileMoveCount { get; set; }
        /// <summary>
        /// 等待结果,1=轴运动,2=IO运动,3=时间,4=电钢,5=硕科电机,6=等待轴原点信号,8=等待压紧轴压紧到位
        /// </summary>
        public int WaitType { get; set; }
        /// <summary>
        /// 轴运动时表示轴信息
        /// </summary>
        public ConfigMoveAxis AxisInfo { get; set; }
        /// <summary>
        /// IO类型
        /// </summary>
        public String IoType { get; set; }
        /// <summary>
        /// IO值
        /// </summary>
        public IO_VALUE IoValue { get; set; }
        /// <summary>
        /// 等待的毫秒
        /// </summary>
        public int TimeMSeconds { get; set; }
        /// <summary>
        /// 是否是原点返回
        /// </summary>
        public bool IsHomeMove = false;

        /// <summary>
        /// 轴目标位置
        /// </summary>
        public int TargetPosition { get; set; }
        /// <summary>
        /// 轴目标速度
        /// </summary>
        public int TargetSpeed { get; set; }
        /// <summary>
        /// 是否已经结束
        /// </summary>
        public bool IsEnd { get; set; }

        /// <summary>
        /// 等待事件代理
        /// </summary>
        public Func<WaitResultInfo, bool> Action { get; set; }
        public string ActionMsg { get; set; }

    }
    internal class WaitEnum
    {
        /// <summary>
        /// 伺服运动
        /// </summary>
        internal static int W001_AxisMove = 1;
        /// <summary>
        /// 信号到达
        /// </summary>
        internal static int W002_IOValue = 2;
        /// <summary>
        /// 时间等待
        /// </summary>
        internal static int W003_Time = 3;
        /// <summary>
        /// 硕科电机
        /// </summary>
        internal static int W005_ShuoKe = 5;
        /// <summary>
        /// 轴原点信号
        /// </summary>
        internal static int W006_AxisOrg = 6;
        /// <summary>
        /// 料盘高度
        /// </summary>
        internal static int W007_ReelHeight = 7;
        /// <summary>
        /// 批量轴上升到上料点
        /// </summary>
        internal static int W008_BatchAxis = 8;
        /// <summary>
        /// 扫码完成
        /// </summary>
        internal static int W009_ScanCode = 9;
        /// <summary>
        /// 通用代理等待方法
        /// </summary>
        internal static int W013_Action = 13;
    }


    public enum StoreMoveType
    {
        /// <summary>
        /// 没有任何操作
        /// </summary>
        None = 0,
        /// <summary>
        /// 入库
        /// </summary>
        InStore = 1,
        /// <summary>
        /// 出库
        /// </summary>
        OutStore = 2,
        /// <summary>
        /// 原点返回
        /// </summary>
        ReturnHome = 3,
        /// <summary>
        /// 重置
        /// </summary>
        StoreReset = 4,
        ///// <summary>
        ///// 移栽装置的停止,需要先远点返回,然后停止
        ///// </summary>
        //StopMove=5,
        ///// <summary>
        ///// 移栽检测托盘
        ///// </summary>
        //CheckFixture=6,
    }
}