Пример #1
0
        static void Main(string[] args)
        {
            if (args?.Length == 0)
            {
                args = new string[] { "StartHmiPro", "update-app", "clear-task" };
            }
            var(s, d) = YUtil.CreateDynamic();
            s.hello   = "world";
            Console.WriteLine(d["hello"]);
            var cmd = new Cmd();

            cmd.Action = args[0];
            cmd.Args   = new { IsForced = true };

            var hmis = loadHmi(YUtil.GetAbsolutePath(".\\Global.xls"), "Ip配置");

            int asylumPort = 9988;
            int hmiPort    = 8899;

            foreach (var pair in hmis)
            {
                string ip        = pair.Value;
                var    name      = pair.Key;
                var    hmiProUrl = $"http://{ip}:{hmiPort}";
                var    asylumUrl = $"http://{ip}:{asylumPort}";
                var    url       = asylumUrl;
                SendToAsylum(url, cmd, name);
                //var url = hmiProUrl;
                //SendToHmiPro(url, args[2], name);
            }

            YUtil.ExitWithQ();
        }
Пример #2
0
 /// <summary>
 /// 通过 Global.xls中预定义的数据来加载配置
 /// </summary>
 void loadConfigByGlobal()
 {
     try {
         string hmiPath = "";
         if (!string.IsNullOrEmpty(CmdOptions.GlobalOptions.HmiName))
         {
             hmiPath = YUtil.GetAbsolutePath(CmdOptions.GlobalOptions.ConfigFolder + "\\Machines\\" + CmdOptions.GlobalOptions.HmiName + ".xls");
         }
         MachineConfig.LoadFromGlobal(hmiPath);
         App.StartupLog.HmiName = MachineConfig.HmiName;
         checkConfig();
         afterConfigLoaded();
     } catch (Exception e) {
         Logger.Error("程序配置出错", e);
         var message = "程序出错,请检查网络连接";
         updateLoadingMessage(message, 0.5, 0);
         shutdownAppAfterSec(10, 0.1, message);
     }
 }
Пример #3
0
        /// <summary>
        /// LoggerHelper 和 Assets Helper 已经在 App.xaml.cs 中初始化了,所以这里不必要初始化了
        /// </summary>
        bool globalConfigLoad()
        {
            updateLoadingMessage("正在准备系统资源文件", 0.15);
            Thread.Sleep(CmdOptions.GlobalOptions.WaitSec * 1000);

            updateLoadingMessage("正在检查系统启动环境...", 0.17);
            if (processIsStarted())
            {
                var message = "系统重复启动异常";
                App.Store.Dispatch(new SysActions.SetLoadingMessage(message, 0.18));
                shutdownAppAfterSec(10, 0.18, "重复启动系统异常");
                return(false);
            }

            updateLoadingMessage("正在初始化异常配置...", 0.20);
            ExceptionHelper.Init();

            updateLoadingMessage("正在加载系统配置...", 0.23);
            GlobalConfig.Load(YUtil.GetAbsolutePath(".\\Profiles\\Global.xls"));

            updateLoadingMessage("正在初始化 ActiveMq...", 0.27);
            ActiveMqHelper.Init(HmiConfig.MqConn, HmiConfig.MqUserName, HmiConfig.MqUserPwd);

            updateLoadingMessage("正在初始化 MongoDb...", 0.30);
            MongoHelper.Init(HmiConfig.MongoConn);

            updateLoadingMessage("正在初始化 InfluxDb...", 0.33);
            InfluxDbHelper.Init($"http://{HmiConfig.InfluxDbIp}:8086", HmiConfig.InfluxCpmDbName);

            updateLoadingMessage("正在同步时间...", 0.35);
            syncTime(!HmiConfig.IsDevUserEnv);

            Logger.Debug("当前操作系统:" + YUtil.GetOsVersion());
            Logger.Debug("当前版本:" + YUtil.GetAppVersion(Assembly.GetExecutingAssembly()));
            Logger.Debug("是否为开发环境:" + HmiConfig.IsDevUserEnv);
            Logger.Debug("浮点精度:" + HmiConfig.MathRound);

            return(true);
        }
Пример #4
0
        /// <summary>
        /// 对程序进行配置
        /// </summary>
        /// <param name="e"></param>
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            ReduxIoc.Init();
            if (!YUtil.CheckProcessIsExist(HmiConfig.AsylumProcessName))
            {
                string asylumnArgs = "";
                if (HmiConfig.IsDevUserEnv)
                {
                    asylumnArgs = "--autostart false --HmiPath " + YUtil.GetAbsolutePath(".\\HmiPro.exe");
                }
                //YUtil.Exec(YUtil.GetAbsolutePath(@".\Asylum\Asylum.exe"), asylumnArgs);
            }

            Store = UnityIocService.ResolveDepend <StorePro <AppState> >();
            //异步初始化,直接进入 DxWindow
            Task.Run(() => {
                hmiConfigInit(e);
                initSubscribe();
                //通知 DxWindow 初始化完毕
                Store.Dispatch(new SysActions.AppXamlInited(e));
            });
        }
Пример #5
0
        /// <summary>
        /// 根据ip来寻找其配置文件的路径
        /// 如果指定了 hmiXlsPath,则直接使用
        /// </summary>
        public static void LoadFromGlobal(string hmiXlsPath)
        {
            if (!string.IsNullOrEmpty(hmiXlsPath))
            {
                Load(hmiXlsPath);
                return;
            }
            string configPath = null;
            var    ips        = YUtil.GetAllIps();

            foreach (var ip in ips)
            {
                if (GlobalConfig.IpToHmiDict.TryGetValue(ip, out var hmi))
                {
                    configPath = YUtil.GetAbsolutePath(CmdOptions.GlobalOptions.ConfigFolder + "\\Machines\\" + hmi + ".xls");
                }
            }
            if (string.IsNullOrEmpty(configPath))
            {
                throw new Exception($"本机ip{string.Join(",", YUtil.GetAllIps())}未在 Global.xls中配置");
            }
            Load(configPath);
            Console.WriteLine("加载机台配置文件路径:-" + configPath);
        }
Пример #6
0
        /// <summary>
        /// 加载 Globa.xls 配置文件
        /// </summary>
        /// <param name="path"></param>
        public static void Load(string path)
        {
            path = YUtil.GetAbsolutePath(path);
            MachineSettingDict = new Dictionary <string, MachineSetting>();
            IpToHmiDict        = new Dictionary <string, string>();
            using (var xlsOp = new XlsService(path)) {
                var speedDt = xlsOp.ExcelToDataTable("逻辑配置", true);
                foreach (DataRow row in speedDt.Rows)
                {
                    MachineSetting setting = new MachineSetting();
                    setting.Code = row["Code"].ToString();
                    if (string.IsNullOrEmpty(setting.Code))
                    {
                        continue;
                    }
                    setting.OeeSpeed = row["OeeSpeed"].ToString();
                    var oeeSpeedMax = row["OeeSpeedMax"].ToString();
                    if (!string.IsNullOrEmpty(oeeSpeedMax) && !string.IsNullOrEmpty(setting.OeeSpeed))
                    {
                        //从Mq接受最大速度
                        if (oeeSpeedMax.ToUpper().StartsWith("MQ_"))
                        {
                            setting.OeeSpeedMax  = oeeSpeedMax.Split('_')[1];
                            setting.OeeSpeedType = OeeActions.CalcOeeSpeedType.MaxSpeedMq;
                            //从Plc中读取最大速度
                        }
                        else if (oeeSpeedMax.ToUpper().StartsWith("PLC_"))
                        {
                            setting.OeeSpeedMax  = oeeSpeedMax.Split('_')[1];
                            setting.OeeSpeedType = OeeActions.CalcOeeSpeedType.MaxSpeedPlc;
                            //最大速度为设定值
                        }
                        else if (float.TryParse(row["OeeSpeedMax"].ToString(), out var maxSettingVal))
                        {
                            if (maxSettingVal == 0)
                            {
                                throw new Exception($"机台{setting.Code} 的 OeeSpeedMax1Setting 为0,请检查");
                            }
                            setting.OeeSpeedMax  = maxSettingVal;
                            setting.OeeSpeedType = OeeActions.CalcOeeSpeedType.MaxSpeedSetting;
                        }
                    }
                    setting.MqNeedSpeed  = row["MqNeedSpeed"].ToString();
                    setting.StateSpeed   = row["StateSpeed"].ToString();
                    setting.NoteMeter    = row["NoteMeter"].ToString();
                    setting.Spark        = row["Spark"].ToString();
                    setting.Od           = row["Od"].ToString();
                    setting.CpmModuleIps = row["CpmModuleIps"].ToString().Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries);
                    setting.DPms         = row["Dpms"].ToString().Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries);
                    setting.ProcessName  = row["Process"]?.ToString();
                    //setting.StartTrayNum = int.Parse(row["StartTrayNum"].ToString());
                    MachineSettingDict[setting.Code] = setting;
                }

                var ipDt = xlsOp.ExcelToDataTable("Ip配置", true);
                foreach (DataRow row in ipDt.Rows)
                {
                    IpToHmiDict[row["Ip"].ToString()] = row["Hmi"].ToString();
                    var hmi = row["hmi"].ToString().Split('_');
                    //保证后续逻辑不会出现空指针
                    foreach (var s in hmi)
                    {
                        if (!MachineSettingDict.ContainsKey(s))
                        {
                            MachineSettingDict[s] = new MachineSetting();
                        }
                    }
                }

                var otherDt = xlsOp.ExcelToDataTable("其它配置", true);
                foreach (DataRow row in otherDt.Rows)
                {
                    var name  = row["Name"].ToString().ToUpper();
                    var value = row["Value"].ToString().ToUpper();
                    //RC、RF这种收线盘不贴卡,放栈板上面的
                    //即它们的收线盘的 Rfid 就是栈板的 Rfid,多个收线盘共用一个 Rfid
                    if (name == "栈板机台")
                    {
                        PalletMachineCodes = value.Split(new[] { "|" }, StringSplitOptions.RemoveEmptyEntries);
                    }
                    else if (name == "重启机台")
                    {
                        UpdateMustReartHmiNames = value.Split(new[] { "|" }, StringSplitOptions.RemoveEmptyEntries);
                    }
                }
            }
        }
Пример #7
0
        /// <summary>
        /// 处理命令
        /// </summary>
        /// <param name="e"></param>
        void hmiConfigInit(StartupEventArgs e)
        {
            StartupLog.StartArgs = string.Join(",", e.Args);
            updateLoadingMessage("正在解析命令...", 0.01);
            Parser.Default.ParseArguments <CmdOptions>(e.Args).WithParsed(opt => {
                //指定Hmi名称(调试的时候可用,方便启用某机台的配置)
                opt.HmiName = opt.HmiName.ToUpper();
                //Profiles 文件夹
                opt.ProfilesFolder = YUtil.GetAbsolutePath(opt.ProfilesFolder);
                //Profiles/Dev(Prod) 文件夹
                var configFolder = opt.ProfilesFolder + "\\" + opt.Mode;
                opt.ConfigFolder = configFolder;
                //Profiles/Assets 文件夹
                var assetsFolder = opt.ProfilesFolder + @"\Assets";

                updateLoadingMessage("正在唤醒终端...", 0.01);
                if (bool.Parse(opt.ShowConsole))
                {
                    ConsoleHelper.Show();
                }

                Console.WriteLine("当前系统环境:-" + YUtil.GetOsVersion());
                Console.WriteLine("开机自启动: -" + opt.AutoSatrt);
                Console.WriteLine("配置文件夹:-" + opt.ProfilesFolder);
                Console.WriteLine("当前运行模式:-" + opt.Mode);
                Console.WriteLine("当前程序版本:-" + YUtil.GetAppVersion(Assembly.GetExecutingAssembly()));
                Console.WriteLine("启用mock:-" + opt.Mock);
                Console.WriteLine("Sqlite数据库:-" + opt.SqlitePath);
                Console.WriteLine("资源文件夹:-" + assetsFolder);
                if (!string.IsNullOrEmpty(opt.HmiName))
                {
                    Console.WriteLine("指定 Hmi:-" + opt.HmiName);
                }

                updateLoadingMessage("配置开机自启...", 0.02);
                YUtil.SetAppAutoStart(GetType().ToString(), bool.Parse(opt.AutoSatrt));

                updateLoadingMessage("初始化Hmi配置...", 0.03);
                var configFile = configFolder + $@"\Hmi.Config.{opt.Config}.json";
                HmiConfig.Load(configFile);
                Console.WriteLine("指定配置文件:-" + configFile);

                updateLoadingMessage("初始化工艺字典...", 0.04);
                HmiConfig.InitCraftBomZhsDict(assetsFolder + @"\Dicts\工艺Bom.xls");

                updateLoadingMessage("初始化资源文件...", 0.05);
                AssetsHelper.Init(YUtil.GetAbsolutePath(assetsFolder));

                updateLoadingMessage("初始化日志服务...", 0.06);
                LoggerHelper.Init(YUtil.GetAbsolutePath(HmiConfig.LogFolder));

                updateLoadingMessage("初始化 Sqlite...", 0.08);
                HmiConfig.SqlitePath = YUtil.GetAbsolutePath(opt.SqlitePath);
                SqliteHelper.Init(YUtil.GetAbsolutePath(HmiConfig.SqlitePath));

                //保留启动参数
                CmdOptions.GlobalOptions    = opt;
                CmdOptions.StartupEventArgs = e;
            }).WithNotParsed(err => {
                var logger = new LoggerService(HmiConfig.LogFolder)
                {
                    DefaultLocation = "StartError"
                };
                updateLoadingMessage($"解析命令异常..", 0);
                string msg = "";
                err?.ToList()?.ForEach(r => {
                    msg += r.ToString();
                });
                logger.Error("解析命令参数异常:\r\n参数: " + string.Join(",", e.Args) + "\r\n内容:" + msg);
                throw new Exception("启动参数异常" + msg);
            });

            //记录程序崩溃日志
            AppDomain.CurrentDomain.UnhandledException += (s, ue) => {
                var logger = new LoggerService(HmiConfig.LogFolder)
                {
                    DefaultLocation = "UnhandleExp"
                };
                var message = $"程序崩溃:{ue.ExceptionObject}\r\n当前可用内存:{YUtil.GetAvaliableMemoryByte() / 1000000} M";
                //将错误日志写入mongoDb
                logger.ErrorWithDb(message, MongoHelper.LogsDb, MongoHelper.UnhandleExceptionCollection);
                //1 秒钟后重启程序
                if (!HmiConfig.IsDevUserEnv)
                {
                    YUtil.SetTimeout(1000, Restart);
                }
            };
        }