BoxAutoPoint.cs 17.7 KB
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace OnlineStore.DeviceLibrary
{
    public class BoxAutoPoint
    { 
        private StoreMoveInfo MoveInfo;
        private AC_SA_BoxBean box = null;
        private System.Timers.Timer toolTimer = new System.Timers.Timer();
        public PToolInfo paramInfo = new PToolInfo();
        private string LogName = "";
        public string WarnMsg = "";
        public BoxAutoPoint(AC_SA_BoxBean box)
        {
            toolTimer.Enabled = false;
            toolTimer.Interval = 500;
            toolTimer.AutoReset = true;
            toolTimer.Elapsed += ToolTimer_Elapsed;
            this.box = box;
            LogName = box.StoreName + "校准点位 ";
            MoveInfo = new StoreMoveInfo(box.StoreID);
            MoveInfo.NextMoveStep( StoreMoveStep.Wait);
        }

        public bool IsStop()
        {
            return !toolTimer.Enabled;
        }

        public void Start()
        {
            LoadStr();
            WarnMsg = "";
            MoveInfo.NextMoveStep(StoreMoveStep.AP_01_InoutHome);
            LogUtil.info(LogName + MoveInfo + "第" + paramInfo.CurrIndex + "列,旋转轴位置[" + paramInfo.GetCurrMiddleP() + "] :进出轴先原点返回");
            ConfigMoveAxis axis = box.Config.InOut_Axis;
            ACServerManager.HomeMove(axis.DeviceName, (short)axis.GetAxisValue(), axis.HomeHighSpeed);
            toolTimer.Interval = 500;
            toolTimer.Start();
        }
        private bool isInProcesss = false;

        private bool HomeIsEnd(ConfigMoveAxis moveAxis)
        {
            if (ACServerManager.IsHomeMoveEnd(moveAxis.DeviceName, moveAxis.GetAxisValue()))
            {
                //原点完成并且位置=0
                int outCount = ACServerManager.GetActualtPosition(moveAxis.DeviceName, moveAxis.GetAxisValue());
                int errorCount = Math.Abs(outCount);
                if (errorCount <= moveAxis.CanErrorCountMax)
                {
                    return true;
                }
            }
            return false;
        }
        private bool AbsMoveIsEnd(ConfigMoveAxis moveAxis, int targetP)
        { 
            string deviceName = moveAxis.DeviceName;
            short axisNo = moveAxis.GetAxisValue();
  
            bool isOk = ACServerManager.GetBusyStatus(deviceName, axisNo).Equals(0);
            int outCount = ACServerManager.GetActualtPosition(deviceName, axisNo);
            int errorCount = Math.Abs(outCount - targetP);
            if (isOk)
            {
                if (errorCount <= moveAxis.CanErrorCountMax)
                {
                    return true;
                }  
            }
            return false;
        }
        public DateTime LastTime = DateTime.Now;

        private string timeOut = ResourceControl.GetString("超时");
        private string homeM = ResourceControl.GetString("原点返回");
        private string wait = ResourceControl.GetString("等待");
        private string targetP = ResourceControl.GetString("到目标位置");
        private string startP = ResourceControl.GetString("到开始位置");
        private string sec = ResourceControl.GetString("秒");


        private void LoadStr()
        {

        }

        private void ToolTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            TimeSpan span = DateTime.Now - LastTime;
            if (isInProcesss && span.TotalSeconds < 1)
            {
                return;
            }
            isInProcesss = true; 
            LastTime = DateTime.Now;
            try
            {
                int currIndex = paramInfo.CurrIndex;
                if (MoveInfo.MoveStep.Equals(StoreMoveStep.AP_01_InoutHome))
                {
                    if (HomeIsEnd(box.Config.InOut_Axis))
                    {
                        MoveInfo.NextMoveStep(StoreMoveStep.AP_02_UpdownHome);

                        LogUtil.info(LogName + MoveInfo + " " + currIndex + ":升降轴原点返回");
                        ConfigMoveAxis axis = box.Config.UpDown_Axis;
                        ACServerManager.HomeMove(axis.DeviceName, (short)axis.GetAxisValue(), axis.HomeHighSpeed);
                    }
                    else if (MoveInfo.IsTimeOut(60))
                    {
                        WarnMsg = LogName +$"[{ MoveInfo.MoveStep }]{wait}{box.Config.InOut_Axis.DisplayStr}{homeM}{timeOut} [{Math.Round(MoveInfo.StepSpan().TotalSeconds, 1) }]{sec} ";
                        LogUtil.error(WarnMsg,(int)MoveInfo.MoveStep);
                    }
                }
                else if (MoveInfo.MoveStep.Equals(StoreMoveStep.AP_02_UpdownHome))
                {
                    if (HomeIsEnd(box.Config.UpDown_Axis))
                    {
                        if (paramInfo.UpdownStartPosition.Equals(0))
                        {
                            MoveInfo.NextMoveStep(StoreMoveStep.AP_04_MiddleMove);
                            ConfigMoveAxis axis = box.Config.Middle_Axis;
                            int p = paramInfo.GetCurrMiddleP();
                            LogUtil.info(LogName + MoveInfo + " " + currIndex + ":旋转轴移动到目标位置:" + p);
                            ACServerManager.AbsMove(axis.DeviceName, (short)axis.GetAxisValue(), p, box.Config.MiddleAxis_P1_Speed);
                        }
                        else
                        {
                            MoveInfo.NextMoveStep(StoreMoveStep.AP_03_UpdownMove);
                            ConfigMoveAxis iaxis = box.Config.UpDown_Axis;

                            LogUtil.info(LogName + MoveInfo + " " + currIndex + ":升降轴移动到开始位置:" + paramInfo.UpdownStartPosition);
                            ACServerManager.AbsMove(iaxis.DeviceName, (short)iaxis.GetAxisValue(), paramInfo.UpdownStartPosition, box.Config.UpDownAxis_P1_Speed );

                        }
                    }
                    else if (MoveInfo.IsTimeOut(120))
                    {
                        WarnMsg = LogName +$"[{ MoveInfo.MoveStep }]{wait}{box.Config.UpDown_Axis.DisplayStr}{homeM}{timeOut}[{ Math.Round(MoveInfo.StepSpan().TotalSeconds, 1) }]{sec}  ";
                        LogUtil.error(WarnMsg, (int)MoveInfo.MoveStep);
                    }
                }
                else if (MoveInfo.MoveStep.Equals(StoreMoveStep.AP_03_UpdownMove))
                {
                    if (AbsMoveIsEnd(box.Config.UpDown_Axis, paramInfo.UpdownStartPosition))
                    {
                        MoveInfo.NextMoveStep(StoreMoveStep.AP_04_MiddleMove);
                        ConfigMoveAxis axis = box.Config.Middle_Axis;
                        int p = paramInfo.GetCurrMiddleP();
                        LogUtil.info(LogName + MoveInfo + " " + currIndex + ":旋转轴移动到目标位置:" + p);
                        ACServerManager.AbsMove(axis.DeviceName, (short)axis.GetAxisValue(), p, box.Config.MiddleAxis_P1_Speed);
                    }
                    else if (MoveInfo.IsTimeOut(120))
                    {
                        WarnMsg = LogName + $"[{ MoveInfo.MoveStep }]{wait}{box.Config.UpDown_Axis.DisplayStr}{startP}[{paramInfo.UpdownStartPosition}]{timeOut} [{ Math.Round(MoveInfo.StepSpan().TotalSeconds, 1) }]{sec}  ";
                        LogUtil.error(WarnMsg, (int)MoveInfo.MoveStep);
                    }
                }
                else if (MoveInfo.MoveStep.Equals(StoreMoveStep.AP_04_MiddleMove))
                {
                    int p = paramInfo.GetCurrMiddleP();

                    if (AbsMoveIsEnd(box.Config.Middle_Axis, p))
                    {
                        MoveInfo.NextMoveStep(StoreMoveStep.AP_05_InoutToP);
                        ConfigMoveAxis iaxis = box.Config.InOut_Axis;

                        LogUtil.info(LogName + MoveInfo + " " + currIndex + ":进出轴移动到目标位置:" + paramInfo.InoutTargetPosition);
                        ACServerManager.AbsMove(iaxis.DeviceName, (short)iaxis.GetAxisValue(), paramInfo.InoutTargetPosition, box.Config.InOutAxis_P1_Speed );
                    }
                    else if (MoveInfo.IsTimeOut(120))
                    {
                        WarnMsg = LogName + $"[{ MoveInfo.MoveStep }]{box.Config.Middle_Axis.DisplayStr}{targetP}[{p}]{timeOut} [{ Math.Round(MoveInfo.StepSpan().TotalSeconds, 1) }]{sec}  ";
                        LogUtil.error(WarnMsg, (int)MoveInfo.MoveStep);
                    }
                }
                else if (MoveInfo.MoveStep.Equals(StoreMoveStep.AP_05_InoutToP))
                {
                    if (AbsMoveIsEnd(box.Config.InOut_Axis, paramInfo.InoutTargetPosition))
                    {
                        MoveInfo.NextMoveStep(StoreMoveStep.AP_06_UpdownMove);
                        ConfigMoveAxis axis = box.Config.UpDown_Axis;
                        LogUtil.info(LogName + MoveInfo + " " + currIndex + ":升降轴移动到目标位置:" + paramInfo.UpdownTargetPosition);
                        ACServerManager.AbsMove(axis.DeviceName, (short)axis.GetAxisValue(), paramInfo.UpdownTargetPosition, paramInfo.UpdownSpeed);
                        toolTimer.Interval = 50;
                    }
                    else if (MoveInfo.IsTimeOut(60))
                    {
                        WarnMsg = LogName + $"[{ MoveInfo.MoveStep }]{box.Config.InOut_Axis.DisplayStr}{targetP}[{ paramInfo.InoutTargetPosition}] {timeOut} [{ Math.Round(MoveInfo.StepSpan().TotalSeconds, 1) }]{sec}  ";
                         LogUtil.error(WarnMsg, (int)MoveInfo.MoveStep);
                    }
                }
                else if (MoveInfo.MoveStep.Equals(StoreMoveStep.AP_06_UpdownMove))
                {
                    try
                    {
                        ConfigMoveAxis axis = box.Config.UpDown_Axis;
                        int moveS = ACServerManager.GetBusyStatus(axis.DeviceName, axis.GetAxisValue());
                        if (moveS.Equals(1))
                        {
                            IO_VALUE currValue = IOManager.IOValue(IO_Type.CheckPos);
                            TimeSpan checkSpan = DateTime.Now - paramInfo.LastGetPTime;
                            //间隔两秒以上才有效
                            if (paramInfo.LastValue.Equals(IO_VALUE.LOW) && currValue.Equals(IO_VALUE.HIGH) && checkSpan.TotalSeconds > 2)
                            {
                                int currPos = ACServerManager.GetActualtPosition(axis.DeviceName, axis.GetAxisValue());
                                paramInfo.PositionList.Add(currPos);
                                int num = paramInfo.PositionList.Count;
                                int preValue = 0;
                                if (paramInfo.PositionList.Count > 1)
                                {
                                    preValue = paramInfo.PositionList[num - 2];
                                }
                                LogUtil.info(LogName + MoveInfo + " " + currIndex + "【" + num + "】【" + currPos + "】【" + Math.Abs(currPos - preValue) + "】");

                                paramInfo.LastValue = IO_VALUE.HIGH;
                                paramInfo.LastGetPTime = DateTime.Now;
                            }

                            paramInfo.LastValue = currValue;
                        }
                        else
                        {
                            //TODO 下一个
                            SaveAndNext(true);
                        }
                    }

                    catch (Exception ex)
                    {
                        LogUtil.error(LogName + "ToolTimer_Elapsed" + ex.ToString());
                    }
                }
                else
                {
                    LogUtil.error(LogName + "BoxAutoPoint ToolTimer_Elapsed 出错:未找到" + MoveInfo.MoveStep + "的处理");
                }
            }catch(Exception ex)
            {
                LogUtil.error(LogName + "BoxAutoPoint ToolTimer_Elapsed 出错:" + ex.ToString());
            }
            isInProcesss = false;
        }

        private void SaveAndNext(bool needNext = true)
        {
            toolTimer.Stop();
            if (paramInfo.PositionList.Count > 0)
            {

                LogUtil.info(LogName + "当前第"+paramInfo.CurrIndex+"列运动结束,停止定时器,记录数据");
                List<string> strList = new List<string>();
                strList.Add("编号,旋转轴位置,标准位置,库位差值,升降轴库位出料前点P5,升降轴库位出料缓冲点P6,升降轴库位入料前点P3,升降轴库位入料缓冲点P4");
                int index = 1;
                foreach (int p in paramInfo.PositionList)
                {
                    int P3 = p + paramInfo.P3Offset;
                    int P4 = p + paramInfo.P4Offset;
                    int P5 = p + paramInfo.P5Offset;
                    int P6 = p + paramInfo.P6Offset;
                    int cha = 0;
                    if (index > 1)
                    {
                        cha = p - paramInfo.PositionList[index - 2];
                    }
                    string spilt = ",";
                    string resultstr = index + spilt + paramInfo.GetCurrMiddleP()+ spilt + p + spilt + cha+ spilt + P5 + spilt + P6 + spilt + P3 + spilt + P4 + "";
                    strList.Add(resultstr);
                    index++;
                }
                int count = paramInfo.CurrIndex + 1;
                string fileName = "position"+count+"_" + paramInfo.GetCurrMiddleP()+ ".csv";
                string filePath = paramInfo.FileTargetPath + fileName;
                try
                {
                    File.WriteAllLines(filePath, strList.ToArray(), Encoding.UTF8);
                    LogUtil.error(LogName + "保存位置到文件【" + filePath + "】成功");
                }
                catch (Exception ex)
                {
                    LogUtil.error(LogName + "保存位置到文件【" + filePath + "】出错:" + ex.ToString());
                }
            }
            else
            {
                LogUtil.info(LogName + "当前第" + paramInfo.CurrIndex + "列运动结束,停止定时器,暂无点位需要保存");
            }

            if (needNext)
            {
                int nextIndex = paramInfo.CurrIndex + 1;

                if (nextIndex < paramInfo.MiddlePositionList.Count)
                {
                    LogUtil.info(LogName + "开始下一列点位校准");
                    paramInfo.PositionList = new List<int>();
                    paramInfo.CurrIndex = nextIndex;
                    Start();
                }
                else
                {
                    LogUtil.info(LogName + "已经是最后一列,位置校准结束");
                }
            }
            //workMoveStatus(true);
        }
        public void StopMove()
        {
            SaveAndNext(false);
            ACServerManager.SuddenStop(box.Config.UpDown_Axis.DeviceName, box.Config.UpDown_Axis.GetAxisValue());
            ACServerManager.SuddenStop(box.Config.InOut_Axis.DeviceName, box.Config.InOut_Axis.GetAxisValue());
            ACServerManager.SuddenStop(box.Config.Middle_Axis.DeviceName, box.Config.Middle_Axis.GetAxisValue());
        }
        public string CurrStr()
        { 
            string str= "位置校准中:"+MoveInfo.MoveStep + " "+MoveInfo.LastSetpTime.ToLongTimeString()+"\r\n" +
                "当前第" + (paramInfo.CurrIndex + 1) + "/" + paramInfo.MiddlePositionList.Count + "列,已校准库位" + paramInfo.PositionList.Count + "个"; 
            return str;
        }
    }
    public class PToolInfo
    {
        public int P3Offset = 0;
        public int P4Offset = 0;
        public int P5Offset = 0;
        public int P6Offset = 0;

        public int UpdownSpeed = 20;
        /// <summary>
        /// 升降轴开始位置
        /// </summary>
        public int UpdownStartPosition = 0;
        /// <summary>
        /// 升降轴目标位置
        /// </summary>
        public int UpdownTargetPosition = 0;
        /// <summary>
        /// 进出轴目标位置
        /// </summary>
        public int InoutTargetPosition = 0;

        /// <summary>
        /// 旋转轴位置
        /// </summary>
        public List<int> MiddlePositionList = new List<int>();

        /// <summary>
        /// 当前列
        /// </summary>
        public int CurrIndex = 0;

        public int GetCurrMiddleP()
        {
            return MiddlePositionList[CurrIndex];
        }

        public string FileTargetPath = "";

        public  List<int> PositionList = new List<int>();
        public IO_VALUE LastValue = IO_VALUE.LOW;
        public DateTime LastGetPTime = DateTime.Now;

        public string ParamStr()
        {
            string msgStr = "请确认以下对点位参数,点击“确定”按钮开始自动校准点位:\r\n";
            msgStr += "    进出轴前进位置:" + InoutTargetPosition + "\r\n";
            msgStr += "    升降轴开始位置:"+UpdownStartPosition+",目标位置:" + UpdownTargetPosition + ",速度:"+UpdownSpeed+"\r\n";
            msgStr += "    旋转轴位置列表:";

            foreach (int mP in MiddlePositionList)
            {
                msgStr += mP + ",";
            }

            if (msgStr.EndsWith(","))
            {
                msgStr = msgStr.Substring(0, msgStr.Length - 1);
            }
            msgStr += "\r\n";
            msgStr += "    点位偏移量:P3[" + P3Offset+"],P4["+P4Offset+"],P5["+P5Offset+"],P6["+P6Offset+"]\r\n";
            msgStr += "    文件保存位置:" + FileTargetPath;

            return msgStr;
        }
    }
}