MoveInfo.cs 11.6 KB
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DeviceLibrary
{
    using crc = OnlineStore.CodeResourceControl;
    public class MoveInfo
    {
        
        public static List<MoveInfo> List = new List<MoveInfo>();
        public int TimeOutSeconds = 60;
        public bool Hide = false;
        Stopwatch Stopwatch = new Stopwatch();
        public MoveInfo(string name)
        {
            ReelParam = new ReelParam();
            this.moveStep = MoveStep.Wait;
            IsInWait = false;
            this.name = name;

            List.Add(this);
        }
        string name="";
        public string Name { get => crc.GetString(this.name, this.name); set => name = value; }
        public DateTime LastSetpTime { get; set; }
        public bool OneWaitCanEndStep = false;

        ReelParam _reelParam;
        public ReelParam ReelParam
        {
            get => _reelParam;
            set
            {
                if (value == null)
                    _reelParam = null;
                else
                    _reelParam = value.clone();
            }
        }

        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 ""+ ReelParam.ToStr();
        }
        public MoveStep MoveStep
        {
            get { return moveStep; }
        }

        public void NewMove(MoveStep step)
        {
            this.ReelParam = new ReelParam();
            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.ReelParam = new ReelParam();
            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}][{ReelParam.ReeID}]{msg}";

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

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

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

        public void StopwatchReset() {
            Stopwatch.Restart();
        }
        public void StopwatchLog(bool isend=true,string dec="")
        {

            log($"时间{(isend?"总计":"小计")} {dec}:"+Stopwatch.Elapsed.ToString());
        }

    }

    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, bool isRelMove=false)
        {
            WaitResultInfo wait = new WaitResultInfo();
            wait.WaitType = WaitEnum.W001_AxisMove;
            wait.AxisInfo = axis;
            wait.IsHomeMove = false;
            wait.TargetPosition = targetPosition;
            wait.TargetSpeed = targetSpeed;
            wait.IsRelMove = isRelMove;
            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 $"{crc.GetString("wait", "等待")}【" + 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 bool IsRelMove = 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;
    }
}