RobotManage.cs 8.9 KB
using Asa;
using OnlineStore;
using OnlineStore.Common;
using OnlineStore.LoadCSVLibrary;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using X_Ray;

namespace DeviceLibrary
{
    public static class RobotManage
    {
        public static MainMachine mainMachine;
        public static Robot_Config Config;
        public static bool IsLoadOk = true;
        public static bool IsConfigMode = false;
        public static bool InoutDebugMode = false;

        public delegate void LoadFinish(bool state,string msg);
        public static event LoadFinish LoadFinishEvent;

        public static event EventHandler<bool> UserPauseSet;
        public static volatile bool  isRunning = false;
        public static Dictionary<string, InCarReelPostion> InCarReelPostion;
        public static Dictionary<string, OutCarReelPostion> OutCarReelPostion;
        public static Dictionary<string, LabellingPostion> LabellingPostion;

        static List<string> _positionNumList=null;
        public static List<string> PositionNumList { get {
                if (_positionNumList == null)
                {
                    _positionNumList =new List<string>();
                    _positionNumList =_positionNumList.Union(InCarReelPostion.Keys.ToArray()).ToList();
                    _positionNumList =_positionNumList.Union(OutCarReelPostion.Keys.ToArray()).ToList();
                    _positionNumList =_positionNumList.Union(LabellingPostion.Keys.ToArray()).ToList();
                    
                }
                return _positionNumList;
            }
        }
        static readonly string baseDir = Application.StartupPath;
        static Thread mainThread;

        public static HIKCamera CameraA=new HIKCamera();
        public static PrinterHelper printerHelper = new PrinterHelper();

        public static XRay XRay = new XRay("XRay", XRayType.Spellman);
        public static XrayImage xrayImage;

        public static void Init() {
            string msg = "";
            try
            {
                mainMachine = null;
                string configFile = Path.Combine(baseDir, "config\\Config.csv");
                Config = new Robot_Config(0, "", configFile);
                Config = (Robot_Config)CSVConfigReader.LoadConfig(Config);

                string carReelPostionFile = "config\\InCarReelPostion.csv";
                if (File.Exists(carReelPostionFile))
                {
                    LogUtil.info("加载In料串位置文件:" + carReelPostionFile);
                    InCarReelPostion = CSVPositionReader<InCarReelPostion>.LoadCSVFile(carReelPostionFile);
                }
                else {
                    IsLoadOk = false;
                    msg += "找不到料串位置文件" + "\n";
                }
                string outcarReelPostionFile = "config\\OutCarReelPostion.csv";
                if (File.Exists(carReelPostionFile))
                {
                    LogUtil.info("加载Out料串位置文件:" + outcarReelPostionFile);
                    OutCarReelPostion = CSVPositionReader<OutCarReelPostion>.LoadCSVFile(outcarReelPostionFile);
                }
                else
                {
                    IsLoadOk = false;
                    msg += "找不到料串位置文件" + "\n";
                }
                xrayImage = new XrayImage("XrayImage", XrayImage.DeviceType.HAOBO_V2);
                string labellingPostionFile = "config\\LabellingPostion.csv";
                if (File.Exists(labellingPostionFile))
                {
                    LogUtil.info("加载贴标位置:" + labellingPostionFile);
                    LabellingPostion = CSVPositionReader<LabellingPostion>.LoadCSVFile(labellingPostionFile);
                }
                else
                {
                    IsLoadOk = false;
                    msg += "找不到贴标位置" + "\n";
                }
                CodeManager.LoadConfig();
                mainMachine = new MainMachine(RobotManage.Config);
                LogUtil.info("load 50%");
                if (!IOManager.ConnectionIOList(new List<string>()))
                {
                    IsLoadOk = false;
                    msg += crc.GetString(L.iocard_init_fail, "IO板卡初始化失败")+ "\n";
                }else
                    LogUtil.info("IO板卡初始化完成");

                if (!XRay.Open(Setting_Init.XRay_Port, string.Format("{0:yyyy-MM-dd}", DateTime.Now)))
                {
                    msg +=  "X光管通讯失败:"+ Setting_Init.XRay_Port+"\n";
                    IsLoadOk = false;
                }
                else
                    LogUtil.info("xray init ok");

                Thread.Sleep(500);

                if (!XRay.SetVC(Setting_Init.XRay_Voltage.ToString(), Setting_Init.XRay_Current.ToString()))
                {
                    msg += string.Format("X光电压电流设置失败:{0},{1}", Setting_Init.XRay_Voltage, Setting_Init.XRay_Current) + "\n";
                    IsLoadOk = false;
                }
                else
                    LogUtil.info($"xray V:{Setting_Init.XRay_Voltage} ,C:{Setting_Init.XRay_Current} set ok");

                if (!xrayImage.Open())
                {
                    msg += "图像平板打开失败"+ "\n";
                    IsLoadOk = false;
                }else
                    LogUtil.info("图像平板打开成功");

                if (!printerHelper.Connection(Setting_Init.Printer_IP))
                {
                    msg += "标签打印机打开失败" + "\n";
                    IsLoadOk = false;
                }
                else
                {
                    LogUtil.info("标签打印机打开成功");
                }

                LogUtil.info("设备初始化完成");
            }
            catch (Exception ex) {
                LoadFinishEvent?.Invoke(false, ex.Message);
                LogUtil.error(ex.ToString());
                return;
            }
            LoadFinishEvent?.Invoke(IsConfigMode ? IsConfigMode : IsLoadOk, msg);
        }
        public static void LoadDebug() {
            LoadFinishEvent?.Invoke(true, crc.GetString(L.open_debug_mode,"打开调试模式"));
        }
        public static void Start() {
            //Init();
            if (!IsLoadOk)
            {
                LogUtil.info("系统还未加载完毕,无法启动");
                if (!IsConfigMode)
                    return;
            }
            lock (mainMachine)
            {
                if (isRunning)
                {
                    LogUtil.info("系统已经在运行");
                    return;
                }
                isRunning = true;
                mainThread = new Thread(new ThreadStart(mainMachine.Start));
                mainThread.Start();
            }
            GC.KeepAlive(mainThread);
            Task.Run(()=> {
                AxisBean.List.ForEach((x) => { AxisManager.AlarmClear(x.Config.DeviceName, x.Config.GetAxisValue()); });

                Task.Delay(1000).Wait();
                if (mainMachine.DeviceCheck())
                    mainMachine.BeginHomeReset(true);
            });
            
        }

        public static void Stop()
        {
            LogUtil.info("开始停止系统.");
            if (mainMachine != null)
            {
                mainMachine.Stop();
                mainMachine.UserPause = false;
            }
            isRunning = false;
        }
        public static void ShutDown()
        {
            LogUtil.info("开始关闭系统.");
            IOManager.CloseAllConnection();
            CameraA.stopCamera();
        }
        public static void UserPause(bool userpause)
        {
            UserPause("", userpause);
        }
        public static void UserPause(string msg="",bool userpause=true) {
            UserPauseSet?.Invoke(null, userpause);
            mainMachine.UserPause = userpause;
            if (userpause)
            {
                if(string.IsNullOrEmpty(msg))
                    LogUtil.info("用户暂停");
                else
                    LogUtil.info("系统暂停: "+msg);
            }
            else
                LogUtil.info("用户取消暂停:"+ msg);
        }
        public static void IgnoreSafecheck(bool s)
        {
            mainMachine.IgnoreSafecheck = s;
            if (s)
                LogUtil.info("用户设置忽略安全检查");
            else
                LogUtil.info("用户取消忽略安全检查");
        }
        public static void IgnoreGratingSignal(bool s)
        {
            mainMachine.IgnoreGratingSignal = s;
            if (s)
                LogUtil.info("用户设置忽略安全光栅");
            else
                LogUtil.info("用户取消忽略安全光栅");
        }
    }

    public enum StoreType { 
    TypeA,TypeB
    }
}