RobotManage.cs 10.3 KB
using Asa.RFID;
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;

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 static bool DisableUpdownProtect {
            get => Setting_Init.Device_DisableUpdownProtect;
        }
        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, ACStorePosition> allPositionMap { get => CSVPositionReader<ACStorePosition>.allPositionMap; }

        static List<string> _positionNumList=null;
        public static List<string> PositionNumList { get {
                if (_positionNumList == null)
                     _positionNumList = CSVPositionReader<ACStorePosition>.allPositionMap.Keys.ToList();
                return _positionNumList;
            }
        }
        static List<string> _storepositionNumList=null;
        public static List<string> StorePositionNumList { get {
                if (_storepositionNumList == null)
                {
                    _storepositionNumList = CSVPositionReader<ACStorePosition>.allPositionMap.Keys.ToList().Where(x =>x.StartsWith("S")).ToList() ;
                }
                return _storepositionNumList;
            }
        }
        static List<string> _allPositionMapNumList = null;
        public static List<string> AllPositionMapNumList
        {
            get
            {
                if (_allPositionMapNumList == null)
                {
                    _allPositionMapNumList = CSVPositionReader<ACStorePosition>.allPositionMap.Keys.ToList();
                }
                return _allPositionMapNumList;
            }
        }
        static string baseDir = Application.StartupPath;
        static Thread mainThread;
        public static bool haveFixpos=false;
        /// <summary>
        /// 入口相机
        /// </summary>
        public static HIKCamera CameraA=new HIKCamera();
        ///// <summary>
        ///// 出口相机
        ///// </summary>
        //public static HIKCamera CameraB=new HIKCamera();
        ///// <summary>
        ///// 左侧相机
        ///// </summary>
        //public static HIKCamera CameraC=new HIKCamera();
        ///// <summary>
        ///// 右侧相机
        ///// </summary>
        //public static HIKCamera CameraD=new HIKCamera();
        public static DauxiKS107Controller dauxiKS107 = new DauxiKS107Controller();
        public static PuYueRFID_FR540SP_C2S RFID = new PuYueRFID_FR540SP_C2S();
        public static PrinterHelper printerHelper = new PrinterHelper();
        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 EntryPostionFile = "config\\EntryPostion.csv";
                string OutPostionFile = "config\\OutPostion.csv";
                string StoragePostionFile = "config\\StoragePostion.csv";

                //var EntryPostion = CSVPositionReader<ACStorePosition>.LoadCSVFile(EntryPostionFile);
               // var OutPostion = CSVPositionReader<ACStorePosition>.LoadCSVFile(OutPostionFile);
                //var StoragePostion = CSVPositionReader<ACStorePosition>.LoadCSVFile(StoragePostionFile);
                if (File.Exists(EntryPostionFile))
                {
                    LogUtil.info("加载位置文件:" + EntryPostionFile);
                    CSVPositionReader<ACStorePosition>.AddCSVFile(EntryPostionFile);
                }
                else {
                    IsLoadOk = false;
                    msg += crc.GetString("Res0117","找不到库位配置文件:")+ EntryPostionFile + "\n";
                }
                if (File.Exists(OutPostionFile))
                {
                    haveFixpos = true;
                    LogUtil.info("加载库位文件:" + OutPostionFile);
                    CSVPositionReader<ACStorePosition>.AddCSVFile(OutPostionFile);
                }
                else
                {
                    IsLoadOk = false;
                    msg += crc.GetString("Res0117","找不到库位配置文件:") + OutPostionFile + "\n";
                }
                if (File.Exists(StoragePostionFile))
                {
                    haveFixpos = true;
                    LogUtil.info("加载库位文件:" + StoragePostionFile);
                    CSVPositionReader<ACStorePosition>.AddCSVFile(StoragePostionFile);
                }
                else
                {
                    IsLoadOk = false;
                    msg += crc.GetString("Res0117","找不到库位配置文件:") + StoragePostionFile + "\n";
                }
                CodeManager.LoadConfig();
                CodeManager.CameraScan(CodeManager.hikNameList);
                mainMachine = new MainMachine(RobotManage.Config);
                
                //mainMachine.ScanCode();
                //Thread.Sleep(5000);
                if (!IOManager.ConnectionIOList(new List<string>()))
                {
                    IsLoadOk = false;
                    msg += crc.GetString("Res0118","IO板卡初始化失败")+ "\n";
                }

                if (!CameraA.LoadCameraConfig("CameraA", out string errmsg))
                {
                    IsLoadOk = false;
                    msg += errmsg + "\r\n";
                }
                else
                {
                    CameraA.Open();
                }

                if (!dauxiKS107.OpenPort(Setting_Init.Device_DauxiKS107_Port, out _)) {
                    IsLoadOk = false;
                    msg += crc.GetString("Res0119","液位传感器初始化失败,端口:") + $"{Setting_Init.Device_DauxiKS107_Port}\n";
                }
                dauxiKS107.Quary(out int value, out _);
                LogUtil.info("读取到液位:"+ value+"mm");
                if (!printerHelper.Connection(Setting_Init.Printer_IP))
                {
                    msg += crc.GetString("Res0120","标签打印机打开失败") + "\n";
                    IsLoadOk = false;
                }
                else
                    LogUtil.info("标签打印机打开成功");

                RFID.IP = Setting_Init.Device_RFID_IP;
                RFID.Open(Setting_Init.Device_RFID_IP);
                if (!RFID.IsConn)
                {
                    IsLoadOk = false;
                    msg += "RFID连接失败,IP:" + $"{Setting_Init.Device_RFID_IP}\n";
                }
                else
                    LogUtil.info("RFID连接成功,IP:"+ Setting_Init.Device_RFID_IP);
                //RFID.Init();
                //RFID.AntennaPower = 4;
                IOManager.IOMove(IO_Type.Camera_Led, IO_VALUE.HIGH);

            }
            catch (Exception ex) {
                LoadFinishEvent?.Invoke(false, ex.Message);
                return;
            }
            LoadFinishEvent?.Invoke(IsConfigMode ? IsConfigMode : IsLoadOk, msg);
        }
        public static void LoadDebug() {
            LoadFinishEvent?.Invoke(true, crc.GetString("Res0121","打开调试模式"));
        }
        public static void Start() {
            //Init();
            if (!IsLoadOk)
            {
                LogUtil.info("系统还未加载完毕,无法启动");
                if (!IsConfigMode)
                    return;
            }
            mainThread = new Thread(new ThreadStart(mainMachine.Start));
            mainThread.Start();

            isRunning = true;
            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("开始关闭系统.");
            RFID.Close();
            IOManager.CloseAllConnection();
            CameraA.stopCamera();
            //CameraB.stopCamera();
            //CameraC.stopCamera();
            //CameraD.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
    }
}