using BarTenderPrint; using GeBoShi.ImageDefect; using HZH_Controls.Forms; using MaiMuControl.Device; using MaiMuControl.Device.IOCardDev; using MaiMuControl.Device.IOCardDev.Advantech; using MaiMuControl.Device.LightDev; using MaiMuControl.Device.LightDev.CST; using MaiMuControl.Device.LightDev.Rsee; using MaiMuControl.SysStatusMgr.CloudMgr; using MaiMuControl.SysStatusMgr.StatusMgr; using MaiMuControl.SysStatusMgr.UserMgr; using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using ToolKits.Disk; namespace GeBoShi.SysCtrl { /// /// 主系统控制 /// public class SysMgr { #region singleton实例化 private static SysMgr _instance; private static readonly object _lock = new object(); public static SysMgr Instance { get { if (_instance == null) { lock (_lock) { if (_instance == null) { _instance = new SysMgr(); } } } return _instance; } } #endregion #region 私有 //系统状态 private StatusMgr statusMgr; public StatusMgr StatusMgr { get { return statusMgr; } } //用户管理 private UserMgr userMgr; public UserMgr UserMgr { get { return userMgr; } } //系统配置管理 private ConfMgr confMgr; //图像处理 private DefectLib defectLib; public DefectLib DefectLib { get { return defectLib; } } //产品检测列表 private List productCodeList = new List(); public List ProductCodeList { get { return productCodeList; } } //产品ID列表 private List productIdList = new List(); public List ProductIdList { get { return productIdList; } } Service.ProductService PdtService = new Service.ProductService(); #endregion #region 公开字段 private bool _isInit; /// /// 是否初始化完成 /// public bool IsInit { get { return _isInit; } } private bool _isRuning; /// /// 设备正在运行 /// public bool IsRuning { get { return _isRuning; } } private bool _isAuto; /// /// 设备正在自动化流程中 /// public bool IsAuto { get { return _isAuto; } } #endregion #region 私有流程 //主流程 private Thread _mainThread; private CancellationTokenSource _cts; #endregion #region 云端 //局域网云端 private bool init_Cloud; private CloudMgr cloudMgr; private int DailyOutput; #endregion private SysMgr() { _isInit = false; _isRuning = false; _isAuto = false; statusMgr = StatusMgr.Instance; confMgr = ConfMgr.Instance; userMgr = new UserMgr(statusMgr.MySqlIP); _cts = new CancellationTokenSource(); init_Cloud = false; cloudMgr = new CloudMgr(); DailyOutput = 0; } #region 本地云上传 /// /// 上传当日产量 /// private void SendDailyOutput() { //开启云端 if (init_Cloud) { try { if (!cloudMgr.SendTopic("device/attributes", $"{{ \"DailyOutput\": \"{DailyOutput}\"}}")) Log("云端", $"上传失败", WarningEnum.Low); } catch (Exception e) { Log("云端", $"上传失败:{e.Message}", WarningEnum.Low); } } } /// /// 上传正常状态 /// public void SendStatus() { //开启云端 if (init_Cloud) { //上传报警状态和信息 string statusStr = "正常"; switch (StatusMgr.Status) { case SystemStsEnum.Manual: statusStr = "人工操作"; break; case SystemStsEnum.Standby: statusStr = "正常待机"; break; case SystemStsEnum.Initial: statusStr = "初始化"; break; case SystemStsEnum.Auto: statusStr = "自动运行"; break; case SystemStsEnum.Pause: statusStr = "自动暂停"; break; case SystemStsEnum.SetParams: statusStr = "参数设置"; break; case SystemStsEnum.Debug: statusStr = "调试"; break; case SystemStsEnum.Warning: statusStr = "系统报警"; break; case SystemStsEnum.Bootload: statusStr = "Bootload"; break; default: statusStr = "未知"; break; } try { if (!cloudMgr.SendTopic("device/attributes", $"{{\"status\": \"{statusStr}\", \"alm\": \"无报警信息\", " + $"\"name\": \"{confMgr.SysConfigParams.CloudThisName}\", \"DailyOutput\": \"{DailyOutput}\"}}")) Log("云端", $"上传失败", WarningEnum.Low); } catch (Exception e) { Log("云端", $"上传失败:{e.Message}", WarningEnum.Low); } } } #endregion #region 用户+登入+管理 /// /// 登入 /// /// public bool LoginSystem() { return userMgr.UserLoginDialog(); } /// /// 用户权限 /// public void UserPermissiomMgr() { userMgr.RightManageDialog(); } /// /// 用户管理 /// public void UserListMgr() { userMgr.UserManagerDialog(); } #endregion #region 系统初始化&&运行 /// /// 系统初始化 /// /// public bool Initial() { try { bool ret = false; string err = ""; InitLog("系统开始初始化..."); //Thread.Sleep(200); // 加载系统配置 InitLog("加载系统参数..."); ret = confMgr.LoadSystemConfig(); if (!ret) { throw new Exception("系统参数加载失败..."); } InitLog("系统参数加载完成!"); //根据llog路径,开始记录日志 statusMgr.StartLog(confMgr.SysConfigParams.LogPath); statusMgr.GotoInitial(); SendStatus(); //Thread.Sleep(200); // 硬件初始化 if (!InitAllDev()) { throw new Exception("硬件初始化失败..."); } InitLog("硬件初始化完成!"); // 加载硬件配置 InitLog("加载硬件驱动参数..."); if (!LoadDevConfig()) { throw new Exception("加载硬件驱动参数失败..."); } InitLog("加载硬件驱动参数完成!"); //Thread.Sleep(200); // 处理运行 InitLog("AI算法核心初始化..."); if (!defectLib.start()) throw new Exception("外观检测核心初始化失败..."); InitLog("AI算法核心初始化完成!"); LedReady(); //初始化成功 _isInit = true; statusMgr.GotoNormalStandby(); SendStatus(); OnInitRuning(new InitEventArgs("系统初始化完成...", this.IsInit)); Run(); return ret; } catch (Exception ex) { InitLog(ex.Message, "初始化", WarningEnum.High); InitLog("系统初始化失败!", "初始化", WarningEnum.High); //statusMgr.GotoWarning(MaiMuControl.Device.WarningEnum.High, "初始化", ex.Message); return false; } } /// /// 初始化图像处理报警 /// /// public bool InitDefectEvent() { defectLib.WarningEvent = (warning, msg) => { Log("缺陷检测", msg, warning); }; return true; } public bool InitCloudConnect() { if (confMgr.SysConfigParams.OpenCloud) { if (cloudMgr.ConnectCloud(confMgr.SysConfigParams.CloudServerIP, confMgr.SysConfigParams.CloudServerPort, confMgr.SysConfigParams.CloudUser, confMgr.SysConfigParams.CloudPassword)) { init_Cloud = true; Log("云端数据", "开启云端连接"); return true; } Log("云端数据", "云端连接失败!", WarningEnum.Low); return false; } return true; } /// /// 运行主线程 /// private void Run() { _mainThread = new Thread(() => { MainThreadFunction(); }); _mainThread.IsBackground = true; _mainThread.Start(); } #endregion #region 后台 /// /// 中断工序运行 /// /// private bool isBreakProcessRun() { return statusMgr.Status == SystemStsEnum.Pause || statusMgr.Warning == WarningEnum.High; } /// /// 后台运行主线程 /// private void MainThreadFunction() { while (true) { try { if (_cts.IsCancellationRequested) break; if (IsRuning) { ////暂停开始 //stopWatch.Start(); //do //{ // CurrProcessIndex = nextProcess(CurrProductModel, CurrProcessIndex); //} while (CurrProcessIndex >= 0 && !isBreakProcessRun()); ////暂停中断 //stopWatch.Stop(); _isRuning = false; } Thread.Sleep(10); } catch (Exception e) { _isRuning = false; Log("运行报警", "流程运行出错:" + e.Message + "\n", WarningEnum.High); } } } #endregion #region IO解析 private int GetIOPortIndex(int DIDOEnum) { return DIDOEnum / 8; } private int GetIOBitIndex(int DIDOEnum) { return DIDOEnum % 8; } #endregion #region 三色灯 /// /// 三色灯初始化 /// public void LedReady() { if (confMgr.SysConfigParams.OpenIO) { ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯绿灯), GetIOBitIndex((int)DOName.三色灯绿灯), false); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯黄灯), GetIOBitIndex((int)DOName.三色灯黄灯), false); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯红灯), GetIOBitIndex((int)DOName.三色灯红灯), false); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯蜂鸣器), GetIOBitIndex((int)DOName.三色灯蜂鸣器), false); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.启动按钮绿灯), GetIOBitIndex((int)DOName.启动按钮绿灯), false); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.复位按钮黄灯), GetIOBitIndex((int)DOName.复位按钮黄灯), false); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.停止按钮红灯), GetIOBitIndex((int)DOName.停止按钮红灯), false); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.双手启动绿灯), GetIOBitIndex((int)DOName.双手启动绿灯), false); } } /// /// 运行状态三色灯 /// public void LedRun() { if (confMgr.SysConfigParams.OpenIO) { ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯绿灯), GetIOBitIndex((int)DOName.三色灯绿灯), true); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯黄灯), GetIOBitIndex((int)DOName.三色灯黄灯), false); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯红灯), GetIOBitIndex((int)DOName.三色灯红灯), false); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯蜂鸣器), GetIOBitIndex((int)DOName.三色灯蜂鸣器), false); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.启动按钮绿灯), GetIOBitIndex((int)DOName.启动按钮绿灯), true); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.复位按钮黄灯), GetIOBitIndex((int)DOName.复位按钮黄灯), false); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.停止按钮红灯), GetIOBitIndex((int)DOName.停止按钮红灯), false); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.双手启动绿灯), GetIOBitIndex((int)DOName.双手启动绿灯), false); } } /// /// 暂停状态三色灯 /// public void LedPause() { if (confMgr.SysConfigParams.OpenIO) { ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯绿灯), GetIOBitIndex((int)DOName.三色灯绿灯), false); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯黄灯), GetIOBitIndex((int)DOName.三色灯黄灯), false); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯红灯), GetIOBitIndex((int)DOName.三色灯红灯), true); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯蜂鸣器), GetIOBitIndex((int)DOName.三色灯蜂鸣器), false); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.启动按钮绿灯), GetIOBitIndex((int)DOName.启动按钮绿灯), false); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.复位按钮黄灯), GetIOBitIndex((int)DOName.复位按钮黄灯), false); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.停止按钮红灯), GetIOBitIndex((int)DOName.停止按钮红灯), true); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.双手启动绿灯), GetIOBitIndex((int)DOName.双手启动绿灯), false); } } //控制黄灯闪烁 private bool Blink; private int BlinkCnt = 0; //控制蜂鸣间隔 private int BuzzCnt = 0; /// /// 回原状态三色灯 /// /// public void LedRset(bool val) { if (confMgr.SysConfigParams.OpenIO) { ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯绿灯), GetIOBitIndex((int)DOName.三色灯绿灯), false); //ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯黄灯), GetIOBitIndex((int)DOName.三色灯黄灯), val); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯红灯), GetIOBitIndex((int)DOName.三色灯红灯), false); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.三色灯蜂鸣器), GetIOBitIndex((int)DOName.三色灯蜂鸣器), false); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.启动按钮绿灯), GetIOBitIndex((int)DOName.启动按钮绿灯), false); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.复位按钮黄灯), GetIOBitIndex((int)DOName.复位按钮黄灯), val); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.停止按钮红灯), GetIOBitIndex((int)DOName.停止按钮红灯), false); ioCardDev.WriteBitState(GetIOPortIndex((int)DOName.双手启动绿灯), GetIOBitIndex((int)DOName.双手启动绿灯), false); Blink = val; BlinkCnt = 0; } } #endregion #region 系统关闭 /// /// 关闭 /// public void Close() { _isInit = false; _isRuning = false; if (null != _cts) { _cts.Cancel(); } if (null != _mainThread) { _mainThread.Join(1000); } //关闭相机 //关闭光源 for (int i = 0; i < LightChCount; i++) { lightDev.CloseLight(i + 1); } lightDev.CloseDev(); //关闭io if (confMgr.SysConfigParams.OpenIO) { ioCardDev.ResetAllDO(); ioCardDev.CloseBoard(); } } #endregion #region 日志报警 /// /// 初始化记录报警和显示 /// /// 标头 /// 内容 /// 报警状态 private void InitLog(string msg, string tag = "初始化", WarningEnum warning = WarningEnum.Normal) { OnInitRuning(new InitEventArgs(msg)); statusMgr.GotoWarning(warning, tag, msg); } /// /// 记录报警和显示 /// /// 标头 /// 内容 /// 报警状态 private void Log(string tag, string msg, WarningEnum warning = WarningEnum.Normal) { OnMainRuning(new MainEventArgs(tag, msg, warning)); statusMgr.GotoWarning(warning, tag, msg); //开启云端 if ((init_Cloud) && (warning != WarningEnum.Normal)) { //上传报警状态和信息 string statusStr = warning == WarningEnum.Normal ? "正常" : warning == WarningEnum.Low ? "警告" : "系统报警"; cloudMgr.SendTopic("device/attributes", $"{{\"status\": \"{statusStr}\", \"alm\": \"{tag}-{msg}\", " + $"\"name\": \"{confMgr.SysConfigParams.CloudThisName}\", \"DailyOutput\": \"{DailyOutput}\"}}"); } } #endregion #region 硬件 #region 硬件型号配置 public LightDevNameEnum SysUseLight = LightDevNameEnum.CST; #endregion #region 硬件字段 private IOCardDev ioCardDev; /// /// io控制卡 /// public IOCardDev IOCardDev { get { return ioCardDev; } } private LightDev lightDev; /// /// 光源控制 /// public LightDev LightDev { get { return lightDev; } } public string LightName { get { return "Light"; } } public int LightChCount = 6;//美尚4通道,其他6通道 private PrintControl printControl; /// /// 打印机模块 /// public PrintControl PrintControl { get { return printControl; } } #endregion #region 初始化和基本电机IO操作 private void InitDev() { ioCardDev = new AdvantechIO(); if (SysUseLight == LightDevNameEnum.CST) lightDev = new CSTLight(LightName, LightChCount); else lightDev = new RseeLight(SysUseLight, LightName); defectLib = new DefectLib(); } /// /// 初始化硬件 /// /// private bool InitAllDev() { bool ret = false; InitDev(); //打印机模块初始化 InitLog("打印机模块初始化..."); try { printControl = new PrintControl(); InitLog("初始化打印机模块成功!"); } catch (Exception ex) { printControl = null; InitLog($"初始化打印机模块失败! {ex.Message}"); } if (confMgr.SysConfigParams.OpenPLC) { //PLC初始化 InitLog("PLC连接初始化..."); InitLog("PLC连接成功!"); } if (confMgr.SysConfigParams.OpenIO) { //IO初始化 InitLog("IO板卡初始化..."); if (ioCardDev.InitBoard(MaiMuControl.Device.IOBordType.Advantech) < 0) { InitLog("IO板卡初始化失败!", "初始化", WarningEnum.High); return ret; } if (ioCardDev.OpenBoard(confMgr.SysConfigParams.IODevName, confMgr.SysConfigParams.IOCfgPath) < 0) { InitLog("打开IO板卡失败!", "初始化", WarningEnum.High); return ret; } if (ioCardDev.ResetAllDO() < 0) { InitLog("IO Reset失败!", "初始化", WarningEnum.High); return ret; } InitLog("初始化IO板卡成功!"); } //光源初始化 InitLog("光源控制器初始化..."); int com_num = int.Parse(confMgr.SysConfigParams.LightCom.Remove(0, 3)); if (lightDev.InitDev(com_num, confMgr.SysConfigParams.LightComBaud) < 0) { InitLog("光源控制器初始化失败!", "初始化", WarningEnum.High); return ret; } InitLog("初始化光源控制器成功!"); //关闭光源 for (int i = 0; i < LightChCount; i++) { lightDev.CloseLight(i + 1); } ret = true; return ret; } /// /// 读取硬件配置 /// private bool LoadDevConfig() { LightParams lightParams = new LightParams(LightName, LightChCount); //LightChCount = 6; //lightParams.DevName = LightName; lightParams.ComName = confMgr.SysConfigParams.LightCom; lightParams.Buad = confMgr.SysConfigParams.LightComBaud; //lightParams.ChCount = LightChCount; lightDev.WriteCfgInfo(confMgr.DevConfigPath, lightParams); return true; } #endregion #endregion #region 硬盘检测 public static bool CheckDisk(IWin32Window owner, int max = 10) { if (!string.IsNullOrEmpty(ConfMgr.Instance.SysConfigParams.DefectSrcImag.SavePath)) { string path = ConfMgr.Instance.SysConfigParams.DefectSrcImag.SavePath; string volume = path.Substring(0, path.IndexOf(':')); long freespace = DiskAPI.GetHardDiskSpace(volume); if (freespace < max) { string tip = $"当前{volume}硬盘容量:{freespace}GB,小于{max}GB。注意清理!!"; FrmDialog.ShowDialog(owner, tip, "警告", true); return false; } } return true; } #endregion #region 初始化事件 /// /// 初始化回调 /// /// /// public delegate void InitEventHandler(Object sender, InitEventArgs e); public event InitEventHandler InitRuning; protected virtual void OnInitRuning(InitEventArgs e) { if (null != InitRuning) { InitRuning(this, e); } } #endregion #region 主窗体显示事件 /// /// 主窗体回调 /// /// /// public delegate void MainEventHandler(Object sender, MainEventArgs e); public event MainEventHandler MainRuning; protected virtual void OnMainRuning(MainEventArgs e) { if (null != MainRuning) { MainRuning(this, e); } } #endregion #region 加载测试列表 /// /// 加载产品列表 /// public void LoadProductCodeList() { try { productCodeList = PdtService.GetList().Select(m => m.Code).ToList(); productIdList = PdtService.GetList().Select(m => m.Id).ToList(); } catch (Exception ex) { OnMainRuning(new MainEventArgs("启动", "加载检测标准失败:" + ex.Message, WarningEnum.High)); statusMgr.GotoWarning(WarningEnum.High, "启动", "加载检测标准失败:" + ex.Message); SendStatus(); } } #endregion #region 界面显示 public static void showRowNum_onDataGrid_RowPostPaint(DataGridView dgv, object sender, DataGridViewRowPostPaintEventArgs e) { Rectangle rectangle = new Rectangle(e.RowBounds.Location.X, e.RowBounds.Location.Y, dgv.RowHeadersWidth - 4, e.RowBounds.Height); TextRenderer.DrawText(e.Graphics, (e.RowIndex + 1).ToString(), dgv.RowHeadersDefaultCellStyle.Font, rectangle, dgv.RowHeadersDefaultCellStyle.ForeColor, TextFormatFlags.VerticalCenter | TextFormatFlags.Right); } /// /// IO二进制数据格式化到8位 XXXX10X0 /// /// /// public static string[] IODataFormatBinaryStr(string[] datas, bool clone, char defaultPadChar = 'X') { string[] datas2 = new string[datas.Length]; for (int i = 0; i < datas.Length; i++) { if (clone) { datas2[i] = datas[i].Replace(" ", ""); if (datas2[i].Length > 8) datas2[i] = datas2[i].Substring(datas2[i].Length - 8); else if (datas2[i].Length < 8) datas2[i] = datas2[i].PadLeft(8, defaultPadChar); } else { datas[i] = datas[i].Replace(" ", ""); if (datas[i].Length > 8) datas[i] = datas[i].Substring(datas[i].Length - 8); else if (datas[i].Length < 8) datas[i] = datas[i].PadLeft(8, defaultPadChar); datas2 = datas; } } return datas2; } /// /// /// /// [XXHL XXXX,XXXX XXXX,...] /// [byte,byte,byte,byte] /// public static bool compareIOInput(string[] op_show_list, byte[] currIoDatas) { int isok = 0;//1-true 2-false string IN_OP_SHOW; for (int i = 0; i < currIoDatas.Length; i++) { IN_OP_SHOW = op_show_list[i].Replace(" ", "").PadLeft(8, 'X'); if (IN_OP_SHOW.IndexOf('H') < 0 && IN_OP_SHOW.IndexOf('L') < 0) continue; for (int j = 7; j >= 0; j--) { byte bit = (byte)(1 << 7 - j); if (IN_OP_SHOW[j] == 'H') { if ((bit & currIoDatas[i]) > 0) isok = 1; else { isok = 2; break; } } else if (IN_OP_SHOW[j] == 'L') { if ((currIoDatas[i] ^ (currIoDatas[i] | bit)) > 0) isok = 1; else { isok = 2; break; } } } //已经不符 if (isok == 2) break; } // return isok == 1; } #endregion } #region 系统事件 /// /// 显图事件 /// public class ImgEventArgs : EventArgs { //private Bitmap[] _bmps; //public Bitmap[] Bitmaps { get { return _bmps; } } //private Mat[] _bmps_cut; //public Mat[] Bmps_cut { get { return _bmps_cut; } } //private double _x; //public double X { get { return _x; } } //private double _y; //public double Y { get { return _y; } } //private List[]>> _info; //public List[]>> Info //{ // get { return _info; } //} //public ImgEventArgs(Bitmap[] bmps, Mat[] bmps_cut, double Xmm, double Ymm, List[]>> info) //{ // this._bmps = new Bitmap[bmps.Length]; // for (int i = 0; i < bmps.Length; i++) // { // this._bmps[i] = (Bitmap)bmps[i].Clone(); // } // this._bmps_cut = new Mat[bmps_cut.Length]; // for (int i = 0; i < bmps_cut.Length; i++) // { // this._bmps_cut[i] = bmps_cut[i].Clone(); // } // this._x = Xmm; // this._y = Ymm; // this._info = info; //} } /// /// 主窗体事件 /// public class MainEventArgs : EventArgs { private string _tag; public string Tag { get { return _tag; } } private string _message; public string Message { get { return _message; } } private int _showIndex; public int ShowIndex { get { return _showIndex; } } private WarningEnum _warning; public WarningEnum Warning { get { return _warning; } } public MainEventArgs(int index) { this._showIndex = index; } public MainEventArgs(int index, string message) { this._message = message; this._showIndex = index; } public MainEventArgs(string tag, string message, WarningEnum warning = WarningEnum.Normal) { this._tag = tag; this._message = message; this._showIndex = 0; this._warning = warning; } } /// /// 初始化事件 /// public class InitEventArgs : EventArgs { private string _message; public string Message { get { return _message; } } private bool _isInitialized; public bool IsInitialized { get { return _isInitialized; } } public InitEventArgs() { } public InitEventArgs(string message, bool isInitialized = false) { this._message = message; this._isInitialized = isInitialized; } } #endregion }