BoxEquip_AutoFindPos.cs 7.8 KB
using CodeLibrary;
using HuichuanLibrary;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms.VisualStyles;
using static eyemLib_Sharp.EyemLibDemo;

namespace OnlineStore.DeviceLibrary
{
    public partial class BoxEquip
    {
        //public Dictionary<string, List<DrawerInfo>> DrawerNums = new Dictionary<string, List<DrawerInfo>>();
        AutoFindPos autoFindPos;
        private bool autoFindPosMode = false;
        private void InitDrawInfos()
        {
            autoFindPos = new AutoFindPos(Config);
            //DrawerNums.Add("A", new List<DrawerInfo>());
            //DrawerNums.Add("B", new List<DrawerInfo>());
            //List<DrawerPosition> drawerPositions = CSVPositionReader<DrawerPosition>.getPositionList();

            //foreach (DrawerPosition position in drawerPositions)
            //{
            //    if (position.StoreId.Equals(DeviceID))
            //    {

            //        DrawerNums[PosSide(position.PositionNum)].Add(new DrawerInfo(position.PositionNum,PositionNumList));
            //    }
            //}
        }
        /// <summary>
        /// 获取抽屉/仓位所在面
        /// </summary>
        /// <param name="pos">位置</param>
        /// <returns></returns>
        private string PosSide(string pos)
        {
            if (pos.Substring(2, 2).Equals("AA")) return "A";
            else if (pos.Substring(2, 2).Equals("BB")) return "B";
            return "";
        }
        /// <summary>
        /// 获取轴的负限位
        /// </summary>
        /// <param name="axisNo"></param>
        /// <returns></returns>

        public bool GetAxisNelSts(short axisNo)
        {
            AxisSts sts = HCBoardManager.GetAxisSts(axisNo);
            return sts.NEL == 1;
        }
        /// <summary>
        /// 获取轴的正限位
        /// </summary>
        /// <param name="axisNo"></param>
        /// <returns></returns>

        public bool GetAxisPelSts(short axisNo)
        {
            AxisSts sts = HCBoardManager.GetAxisSts(axisNo);
            return sts.PEL == 1;
        }
        public void AutoFindPosProcess()
        {
            if (MoveInfo.IsInWait)
            {
                CheckWait(MoveInfo);
            }
            if (MoveInfo.IsInWait)
            {
                return;
            }
            switch(MoveInfo.MoveStep)
            {
                case StepEnum.SA_Drawer_Start_Find_Pos:
                    MoveInfo.NextMoveStep(StepEnum.SA_01_To_Drawer_StartPoint);
                    LogInfo($"存储机构-视觉对位 {MoveInfo.SLog}:到抽屉起始点," +
                        $"行走机构到进出料机构取放点P2,移栽升降轴到上暂存区取料低点P3/P9,移栽压紧轴到压紧前点P2,移栽旋转轴到进出料暂存区取放料水平点P2[{MoveInfo.MoveParam.PosInfo.PosSide}面]");
                    MoveAxis.AbsMove(MoveInfo, Config.MoveAxis_P2, Config.MoveAxis_P2_Speed);
                    break;
                case StepEnum.SA_01_To_Drawer_StartPoint:

                    break;
                case StepEnum.SA_02_Pos_AcqImg:

                    break;
                case StepEnum.SA_03_Pos_AdjPos:

                    break;
                case StepEnum.SA_04_Pos_NextDrawer:

                    break;
                case StepEnum.SA_05_Neg_AcqImg:

                    break;
                case StepEnum.SA_06_Neg_AdjPos:

                    break;
                case StepEnum.SA_07_Neg_NextDrawer:

                    break;
                //case StepEnum.:
                //    //如果行>抽屉行数,直接退出。否则获取图片、得到mark的坐标,并与模板坐标比较。根据误差范围外对行走机构和移栽升降轴移动
                //    //在误差范围内,保存该位置脉冲同时生成库位位置信息。列加1进行第二步
                //    break;
                //case StepEnum.:
                //    //如果列>抽屉列数,判断行是否大于抽屉的行数?大于则结束;否则行加1,移栽升降轴运动,到第三步
                //    //否则行走机构移动一个行间距的距离,到第一步
                //    break;
                //case StepEnum.:
                //    //如果行>抽屉行数,直接退出。否则获取图片、得到mark的坐标,并与模板坐标比较。根据误差范围外对行走机构和移栽升降轴移动
                //    //在误差范围内,保存该位置脉冲同时生成库位位置信息。列减1进行第四步
                //    break;
                //case StepEnum.:
                //    //如果列《1,判断行是否大于抽屉的行数?大于则结束;否则行加1,移栽升降轴运动,到第一步
                //    //否则行走机构移动一个行间距的距离,到第三步
                //    break;
                //case StepEnum.:

                //    break;
            }
        }
    }

    public class AutoFindPos
    {
        /// <summary>
        /// 当前行
        /// </summary>
        public int CurRow { get; set; } = 1;
        /// <summary>
        /// 当前行脉冲
        /// </summary>
        public int CurRowPulse { get; set; } = 0;
        /// <summary>
        /// 当前列脉冲
        /// </summary>
        public int CurColumnPulse { get; set; } = 0;
        /// <summary>
        /// 坐标到脉冲的转换系数
        /// </summary>
        public float CoeffOfCoorToPulse { get; set; } = 1;
        /// <summary>
        /// 当前列
        /// </summary>
        public int CurColumn { get; set; } = 1;
        /// <summary>
        /// 抽屉行数
        /// </summary>
        public int Rows { get; private set; }
        /// <summary>
        /// 抽屉列数
        /// </summary>

        public int Columns { get; private set; }

        
        /// <summary>
        /// 抽屉间行间距
        /// </summary>
        public int Row_Spacing { get; private set; }
        /// <summary>
        /// 抽屉间列间距
        /// </summary>
        public int Column_Spacing { get; private set; }
        public AutoFindPos(BoxEquip_Config boxEquip_Config)
        {
            Row_Spacing = boxEquip_Config.Row_Spacing;
            Column_Spacing = boxEquip_Config.Column_Spacing;
            Rows = boxEquip_Config.Drawer_Rows;
            Columns = boxEquip_Config.Drawer_Columns;
        }
        /// <summary>
        /// Mark点坐标信息 
        /// </summary>
        /// <param name="bitmap">输入图片</param>
        /// <param name="markCoor">mark点坐标信息</param>
        /// <returns>0 正常 -4未定位到 </returns>
        public static int GetMarkInfo(Bitmap bitmap,out EyemOcsFXYR markCoor)
        {
            int flag;
            markCoor = new EyemOcsFXYR();
            EyemImage image = eyemCvtToEyemImage(bitmap);
            flag = eyemMarkerTracing(image, 130, ref markCoor);
            Marshal.FreeHGlobal(image.vpImage);
            return flag;
        }
    }
    public class DrawerInfo
    {
        /// <summary>
        /// 抽屉信息
        /// </summary>
        /// <param name="pos">抽屉位置</param>
        /// <param name="posNums">仓位列表</param>
        public DrawerInfo(string pos, List<string> posNums)
        {
            PositionNum = pos;
            Positions = posNums.FindAll(s => s.StartsWith(pos));
        }
        /// <summary>
        /// 抽屉位置
        /// </summary>
        public string PositionNum { get; private set; }
        /// <summary>
        /// 抽屉内的仓位位置
        /// </summary>
        public List<string> Positions { get; private set; }

    }
}