LineWidthManager.cs 9.1 KB
using PUSICANLibrary;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using TSA_V.Common;

namespace TSA_V.DeviceLibrary
{
    /// <summary>
    /// 流水线宽度
    /// </summary>
    public class LWidthManager
    {
        public static int Line_ChangeValue = ConfigAppSettings.GetIntValue(Setting_Init.Line_ChangeValue);
        public static int Line_HomeWidth = ConfigAppSettings.GetIntValue(Setting_Init.Line_HomeWidth);
        public static uint Line_NodeAddr =(uint) ConfigAppSettings.GetIntValue(Setting_Init.Line_NodeAddr);
        public static int Line_LastWidth = ConfigAppSettings.GetIntValue(Setting_Init.Line_LastWidth);
        private static string Line_WidthPosition = ConfigAppSettings.GetValue(Setting_Init.Line_WidthPosition);
        public  static int DefaultPosition = 0;

        public static bool LineInitOk = false;
        public static void Init()
        {
            LaodMap();
            DefaultPosition = GetWidthPosition(Line_LastWidth);
        }

    

        public static bool CanStartChWidth(out  string msg)
        {
            msg = "";

            if (!LineInitOk)
            {
                msg = ResourceControl.GetString("LineNotInitOk", "设备未初始化完成");
                return false;
            }

            //是否可以开始调宽
            if (IOManager.IOValue(IOManager.LineInCheck).Equals(IO_VALUE.HIGH) ||
                IOManager.IOValue(IOManager.LineOutCheck).Equals(IO_VALUE.HIGH) ||
                IOManager.IOValue(IOManager.LineWorkCheck).Equals(IO_VALUE.HIGH))
            {
                msg = msg = ResourceControl.GetString("LineCheckHigh", "线体检测信号亮");
                return false;
            }

            //如果已经在调宽中
            if (!IsStop)
            {
                msg = msg = ResourceControl.GetString("PreNotEnd", "上次调宽还未结束");
                return false ;
            }


            return true ;

        }
         
        public static bool IsStop = true ;
       

        public static void StopChangeWidth()
        {
            if (!IsStop)
            { 
                IsStop = true;
                PUSICANControl.StopMove(LWidthManager.Line_NodeAddr);
                LogUtil.info("StopChangeWidth ,停止调宽电机运动");
            }
        }
        public static string StartChangeWidth(int targetWidth, int targetPosition, int timeOutSeconds = 600)
        {
            string result = "";
            if (targetWidth <= 0)
            {
                return result =ResourceControl.GetString(ResourceControl.WidthInvalid, "宽度无效");
            }
            if (!CanStartChWidth(out string msg))
            {
                return result = ResourceControl.GetString(ResourceControl.ChangeWFail, "启动调宽失败")+" : "+msg;
            }
            if (!IsStop)
            {
                return result = ResourceControl.GetString(ResourceControl.InChangeW, "已在调宽中");
            }
            IsStop = false;
            string logName = "轨道调宽[" + targetWidth + "][" + targetPosition + "][" + timeOutSeconds + "]:";
            try
            {
                LogUtil.info(logName+ "开始"  );
                Line_LastWidth = targetWidth;
                DefaultPosition = targetPosition;

                ConfigAppSettings.SaveValue(Setting_Init.Line_LastWidth, Line_LastWidth);

                //   PUSICANLibrary.PUSICANControl.AbsMove(Line_NodeAddr, targetPosition);
                Stopwatch stopwatch = new Stopwatch();
                stopwatch.Start();

                if (PUSICANControl.IsBusy(Line_NodeAddr))
                {
                    LogUtil.info(logName + " Node[" + Line_NodeAddr + "]开始原点返回前发现在忙碌中,先停止运动");
                    PUSICANControl.StopMove(Line_NodeAddr);
                }

                LogUtil.info(logName + " Node[" + Line_NodeAddr + "]开始原点返回");
                PUSICANControl.HomeMove(LWidthManager.Line_NodeAddr,true); 
                while (true)
                {
                    Thread.Sleep(200);
                    if (IsStop || TSAVBean.IsInSuddenDown)
                    { 
                        result = ResourceControl.GetString(ResourceControl.UserStop, "用户中止");
                        break;
                    }
                    else if (stopwatch.ElapsedMilliseconds / 1000 > timeOutSeconds)
                    { 
                        result = ResourceControl.GetString(ResourceControl.HomeMoveTimeout, "等待原点完成超时");
                        break;
                    }
                    else if (PUSICANControl.IsHomeEnd(LWidthManager.Line_NodeAddr))
                    { 
                        result = "";
                        break;
                    }
                }
                if (!String.IsNullOrEmpty(result))
                {
                    IsStop = true;
                    LogUtil.info(logName + " Node[" + Line_NodeAddr + "] 原点返回失败,直接返回 [" + result + "] ");
                    return result; 
                }
                else
                {
                    IsStop = false;
                    LogUtil.info(logName + " Node[" + Line_NodeAddr + "] 原点返回完成 , 开始移动到目标位置 [" + targetPosition + "]"); 
                }
               
                PUSICANControl.DefatutPosMove(Line_NodeAddr, targetPosition,0,true);

                while (true)
                {
                    Thread.Sleep(200);
                    
                    if (IsStop || TSAVBean.IsInSuddenDown)
                    {
                        IsStop = true;
                        result = ResourceControl.GetString(ResourceControl.UserStop, "用户中止");
                        break;
                    }
                    else if (stopwatch.ElapsedMilliseconds / 1000 > timeOutSeconds)
                    {
                        IsStop = true;
                        result = ResourceControl.GetString(ResourceControl.WaitChangeWOk, "等待目标位置{0}超时", DefaultPosition);
                        break;
                    }
                    else
                    {
                        int positiona = PUSICANControl.GetPosition(LWidthManager.Line_NodeAddr); 
                        if (positiona.Equals(LWidthManager.DefaultPosition))
                        {
                            IsStop = true;
                            result = "";
                            break;
                        }

                    }
                }
                LogUtil.info(logName + " Node[" + Line_NodeAddr + "]  到 [" + targetPosition + "] 结束 ["+result+"]");
            }
            catch (Exception ex)
            {
                LogUtil.error(logName+"出错:" + ex.ToString());
            }
            finally
            {
                IsStop = true;
               // result = "异常中止";
            }
            return result;
        }
     
        public static int GetWidthPosition(int targetWidth)
        {
          //  LaodMap();
            if (WPositionMap.ContainsKey(targetWidth))
            {
                return WPositionMap[targetWidth];
            }
            int targetP = (targetWidth - Line_HomeWidth) * Line_ChangeValue;
            return targetP;
        }
        public  static Dictionary<int , int> WPositionMap = null; 
        private static Dictionary<int, int> LaodMap()
        {
            try
            {
                if (WPositionMap == null)
                {
                    WPositionMap = new Dictionary<int, int>();
                    string[] arrayList = Line_WidthPosition.Split(';');
                    foreach (string str in arrayList)
                    {
                        string[] arrStr = str.Split('=');
                        if (arrStr.Length == 2)
                        {
                            int  key =Convert.ToInt32( arrStr[0].Trim());
                            if (key.Equals(0))
                            {
                                continue;
                            }
                            int value = Convert.ToInt32(arrStr[1].Trim());
                            WPositionMap.Add(key, value);
                        }
                    }
                }
            }
            catch (Exception ex)
            {

            }
            return WPositionMap;
        }
 
        public static void UpdateWPosition(int width,int position)
        { 
            if (WPositionMap.ContainsKey(width))
            {
                WPositionMap[width] = position;
            }
            else
            { 
                WPositionMap.Add(width, position);
            }
            string newStr = "";
            foreach (int  key in WPositionMap.Keys)
            {
                newStr += key + "=" + WPositionMap[key] + ";";
            }
            newStr = newStr.Substring(0, newStr.Length - 1);
            Line_WidthPosition = newStr;
            ConfigAppSettings.SaveValue(Setting_Init.Line_WidthPosition, Line_WidthPosition);
        }
    }
}