From df934d5daf1838355f9e7a67920122403ea1799a Mon Sep 17 00:00:00 2001 From: "zhengxuan.zhang" Date: Fri, 22 Mar 2024 18:37:28 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=20=E8=BF=90?= =?UTF-8?q?=E5=8A=A8=E5=B9=B3=E5=8F=B0=E5=BA=95=E5=B1=82=E6=8A=A5=E9=94=99?= =?UTF-8?q?=E7=9A=84=E6=8D=95=E8=8E=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HexcalMC/MainFrom.Designer.cs | 84 +++++++++++------------ HexcalMC/MainFrom.cs | 122 ++++++++++++++++++++++++++++++++-- 2 files changed, 161 insertions(+), 45 deletions(-) diff --git a/HexcalMC/MainFrom.Designer.cs b/HexcalMC/MainFrom.Designer.cs index 2c1746c..36be145 100644 --- a/HexcalMC/MainFrom.Designer.cs +++ b/HexcalMC/MainFrom.Designer.cs @@ -52,6 +52,10 @@ this.rtb_demo = new Telerik.WinControls.UI.RadButtonElement(); this.radRibbonBarGroup6 = new Telerik.WinControls.UI.RadRibbonBarGroup(); this.rtb_quick_loc = new Telerik.WinControls.UI.RadButtonElement(); + this.radRibbonBarButtonGroup8 = new Telerik.WinControls.UI.RadRibbonBarButtonGroup(); + this.rtb_SetX = new Telerik.WinControls.UI.RadTextBoxElement(); + this.rtb_Sety = new Telerik.WinControls.UI.RadTextBoxElement(); + this.rtb_SetZ = new Telerik.WinControls.UI.RadTextBoxElement(); this.ribbonTab2 = new Telerik.WinControls.UI.RibbonTab(); this.radRibbonBarGroup2 = new Telerik.WinControls.UI.RadRibbonBarGroup(); this.rtb_about = new Telerik.WinControls.UI.RadButtonElement(); @@ -142,10 +146,6 @@ this.TextBoxMsg = new System.Windows.Forms.RichTextBox(); this.tmrMonitor = new System.Windows.Forms.Timer(this.components); this.timer_RefreshUI = new System.Windows.Forms.Timer(this.components); - this.radRibbonBarButtonGroup8 = new Telerik.WinControls.UI.RadRibbonBarButtonGroup(); - this.rtb_SetX = new Telerik.WinControls.UI.RadTextBoxElement(); - this.rtb_Sety = new Telerik.WinControls.UI.RadTextBoxElement(); - this.rtb_SetZ = new Telerik.WinControls.UI.RadTextBoxElement(); ((System.ComponentModel.ISupportInitialize)(this.radRibbonBar1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.radRibbonBarBackstageView1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.radStatusStrip1)).BeginInit(); @@ -355,6 +355,45 @@ this.rtb_quick_loc.Text = ""; this.rtb_quick_loc.Click += new System.EventHandler(this.rtb_quick_loc_Click); // + // radRibbonBarButtonGroup8 + // + this.radRibbonBarButtonGroup8.Items.AddRange(new Telerik.WinControls.RadItem[] { + this.rtb_SetX, + this.rtb_Sety, + this.rtb_SetZ}); + this.radRibbonBarButtonGroup8.Name = "radRibbonBarButtonGroup8"; + this.radRibbonBarButtonGroup8.Orientation = System.Windows.Forms.Orientation.Vertical; + this.radRibbonBarButtonGroup8.Text = "radRibbonBarButtonGroup8"; + this.radRibbonBarButtonGroup8.TextOrientation = System.Windows.Forms.Orientation.Horizontal; + // + // rtb_SetX + // + this.rtb_SetX.MinSize = new System.Drawing.Size(80, 0); + this.rtb_SetX.Name = "rtb_SetX"; + this.rtb_SetX.Padding = new System.Windows.Forms.Padding(0, 2, 0, 1); + this.rtb_SetX.Text = "100.0"; + this.rtb_SetX.TextAlign = System.Windows.Forms.HorizontalAlignment.Left; + this.rtb_SetX.UseCompatibleTextRendering = false; + // + // rtb_Sety + // + this.rtb_Sety.MinSize = new System.Drawing.Size(80, 0); + this.rtb_Sety.Name = "rtb_Sety"; + this.rtb_Sety.Padding = new System.Windows.Forms.Padding(0, 2, 0, 1); + this.rtb_Sety.Text = "150.0"; + this.rtb_Sety.TextAlign = System.Windows.Forms.HorizontalAlignment.Left; + this.rtb_Sety.UseCompatibleTextRendering = false; + // + // rtb_SetZ + // + this.rtb_SetZ.AutoSize = false; + this.rtb_SetZ.Bounds = new System.Drawing.Rectangle(0, 0, 80, 20); + this.rtb_SetZ.Name = "rtb_SetZ"; + this.rtb_SetZ.Padding = new System.Windows.Forms.Padding(0, 2, 0, 1); + this.rtb_SetZ.Text = "-100"; + this.rtb_SetZ.TextAlign = System.Windows.Forms.HorizontalAlignment.Left; + this.rtb_SetZ.UseCompatibleTextRendering = false; + // // ribbonTab2 // this.ribbonTab2.AutoEllipsis = false; @@ -1241,43 +1280,6 @@ this.timer_RefreshUI.Interval = 1000; this.timer_RefreshUI.Tick += new System.EventHandler(this.Timer_RefreshUI_Tick); // - // radRibbonBarButtonGroup8 - // - this.radRibbonBarButtonGroup8.Items.AddRange(new Telerik.WinControls.RadItem[] { - this.rtb_SetX, - this.rtb_Sety, - this.rtb_SetZ}); - this.radRibbonBarButtonGroup8.Name = "radRibbonBarButtonGroup8"; - this.radRibbonBarButtonGroup8.Orientation = System.Windows.Forms.Orientation.Vertical; - this.radRibbonBarButtonGroup8.Text = "radRibbonBarButtonGroup8"; - this.radRibbonBarButtonGroup8.TextOrientation = System.Windows.Forms.Orientation.Horizontal; - // - // rtb_SetX - // - this.rtb_SetX.Name = "rtb_SetX"; - this.rtb_SetX.Padding = new System.Windows.Forms.Padding(0, 2, 0, 1); - this.rtb_SetX.Text = "100.0"; - this.rtb_SetX.TextAlign = System.Windows.Forms.HorizontalAlignment.Left; - this.rtb_SetX.UseCompatibleTextRendering = false; - // - // rtb_Sety - // - this.rtb_Sety.Name = "rtb_Sety"; - this.rtb_Sety.Padding = new System.Windows.Forms.Padding(0, 2, 0, 1); - this.rtb_Sety.Text = "150.0"; - this.rtb_Sety.TextAlign = System.Windows.Forms.HorizontalAlignment.Left; - this.rtb_Sety.UseCompatibleTextRendering = false; - // - // rtb_SetZ - // - this.rtb_SetZ.AutoSize = false; - this.rtb_SetZ.Bounds = new System.Drawing.Rectangle(0, 0, 80, 20); - this.rtb_SetZ.Name = "rtb_SetZ"; - this.rtb_SetZ.Padding = new System.Windows.Forms.Padding(0, 2, 0, 1); - this.rtb_SetZ.Text = "-100"; - this.rtb_SetZ.TextAlign = System.Windows.Forms.HorizontalAlignment.Left; - this.rtb_SetZ.UseCompatibleTextRendering = false; - // // MainFrom // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); diff --git a/HexcalMC/MainFrom.cs b/HexcalMC/MainFrom.cs index e9b4bc2..37cdc87 100644 --- a/HexcalMC/MainFrom.cs +++ b/HexcalMC/MainFrom.cs @@ -5,6 +5,7 @@ using System.IO; using System.Net; using System.Runtime.InteropServices; using System.Windows.Forms; +using System.Windows.Threading; using ACS.SPiiPlusNET; using HexcalMC.Base; using HexcalMC.Form; @@ -44,6 +45,15 @@ namespace HexcalMC public MainFrom() { InitializeComponent(); + + + //处理未捕获的异常 + Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); + //处理UI线程异常 + Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); + //处理非UI线程异常 + AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); + } private void MainFrom_Load(object sender, EventArgs e) @@ -60,6 +70,8 @@ namespace HexcalMC //启动界面刷新 timer_RefreshUI.Start(); + + } private void MainFrom_Shown(object sender, EventArgs e) //窗体显示准备好接受用户输入时发生 @@ -333,7 +345,7 @@ namespace HexcalMC } //else if (msg.Contains("^B")) //查询状态, READY或BUSY //{ - // CheckPlatformStatus(); + // checkPlatformStatus(); //} else if (msg.Contains("CMMTYP")) //测量机类型 @@ -528,6 +540,108 @@ namespace HexcalMC #region ACS平台相关 + #region 异常抓取 + + //实现函数 + private void DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) + { + MessageBox.Show($"Application_ThreadException:{e.Exception}"); + e.Handled = true; // 标记为 “已处理”,避免异常进一步传递而引起崩溃 + } + + private static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) + { + // 在这里处理未被捕获的异常 + // 您可以记录异常、显示错误信息等等 + + // 防止程序终止 + MessageBox.Show("发生了未处理的异常:" + e.Exception.Message); + } + private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) + { + MessageBox.Show($"CurrentDomain_UnhandledException: {e.ExceptionObject}"); + } + + + //订阅报错 + private void EnableFaultEvent() + { + _acs.EnableEvent(Interrupts.ACSC_INTR_COMM_CHANNEL_CLOSED); + _acs.EnableEvent(Interrupts.ACSC_INTR_EMERGENCY); + _acs.EnableEvent(Interrupts.ACSC_INTR_SYSTEM_ERROR); + _acs.EnableEvent(Interrupts.ACSC_INTR_ETHERCAT_ERROR); + _acs.EnableEvent(Interrupts.ACSC_INTR_MOTOR_FAILURE); + _acs.EnableEvent(Interrupts.ACSC_INTR_MOTION_FAILURE); + _acs.COMMCHANNELCLOSED += _acs_COMMCHANNELCLOSED; + _acs.MOTORFAILURE += _acs_MOTORFAILURE; + _acs.MOTIONFAILURE += _acs_MOTIONFAILURE; + _acs.SYSTEMERROR += _acs_SYSTEMERROR; + _acs.ETHERCATERROR += _acs_ETHERCATERROR; + _acs.EMERGENCY += _acs_EMERGENCY; + } + + //关联函数 + private void _acs_EMERGENCY(ulong param) + { + DebugDfn.AddLogText($"[EStopError] Error Message:{_acs.GetErrorString((int)param)}"); + } + + private void _acs_ETHERCATERROR(ulong param) + { + DebugDfn.AddLogText($"[EtherCatError] Error Message:{_acs.GetErrorString((int)param)}"); + } + + private void _acs_SYSTEMERROR(ulong param) + { + DebugDfn.AddLogText($"[SystemError] Error Message:{_acs.GetErrorString((int)param)}"); + } + + private void _acs_MOTIONFAILURE(AxisMasks axis) + { + for (int i = 0; i < _acs.GetAxesCount(); i++) + { + if (((int)axis & (int)Math.Pow(2, i)) == Math.Pow(2, i)) + { + if (_acs.GetMotionError((Axis)i) != 0) + { + //Motor无法自动捕获,需要在motion报错中获取 + int errorcode = _acs.GetMotionError((Axis)i); + + DebugDfn.AddLogText( + $"[MotionError] Axis:{i} Error Code:{errorcode} Error Message: {_acs.GetErrorString(errorcode)}"); + + int errorcodes = _acs.GetMotorError((Axis)i); + + DebugDfn.AddLogText( + $"[MotorError] Axis:{i} Error Code:{errorcodes} Error Message:{_acs.GetErrorString(errorcodes)}"); + } + } + } + } + + private void _acs_MOTORFAILURE(AxisMasks axis) + { + for (int i = 0; i < _acs.GetAxesCount(); i++) + { + if (((int)axis & (int)Math.Pow(2, i)) == Math.Pow(2, i)) + { + int errorcode = _acs.GetMotorError((Axis)i); + + DebugDfn.AddLogText( + $"[MotorError] Axis:{i} Error Code:{errorcode} Error Message:{_acs.GetErrorString(errorcode)}"); + } + } + } + + private void _acs_COMMCHANNELCLOSED(ulong param) + { + DebugDfn.AddLogText($"[CommError] Error Message:{_acs.GetErrorString((int)param)}"); + } + + + #endregion + + private void BtnEnable_Click(object sender, EventArgs e) //使能所有轴 { if (_mAcsConnected) @@ -659,7 +773,6 @@ namespace HexcalMC // 启动定时器 tmrMonitor.Interval = 50; tmrMonitor.Start(); - } catch (COMException comex) @@ -715,7 +828,6 @@ namespace HexcalMC case Axis.ACSC_AXIS_8: newAxisNumber = 2; break; - } return newAxisNumber; @@ -730,7 +842,7 @@ namespace HexcalMC axis = UseAxis[i]; _axisNo = TranslateAxisNumber(UseAxis[i]); - + // Get Motor State ACSPL+ Variable : MST (integer) _mNMotorState = _acs.GetMotorState(axis); @@ -906,6 +1018,8 @@ namespace HexcalMC _mlblEnable[0] = lblEnable0; _mlblEnable[1] = lblEnable1; _mlblEnable[2] = lblEnable2; + + EnableFaultEvent();//订阅错误事件 } public static bool IsWithinLimit(Point3D point) //判断点是否在行程范围内