關於安碩

【服務項目】

 自動化設備控制系統及機構設計
 PC Based 控制系統設計
 PLC 及 HMI 程式設計
 多軸運動控制
 機器視覺檢測系統設計
 資料收集及遠端監控
 設備電控電路設計及控制盤體配線
 機械手臂整合應用
 舊有設備整理及改善
 客製化程式開發
 IPC / 軸控模組 / IO 模組 代理

系統整合外包服務 E-mail: ling.ryan@gmail.com 歡迎來信連絡

2019年11月8日 星期五

[筆記]使用TraceListener 類別作出類似 DebugView 功能

對 PC-Based 的開發工程師來說,IDE 的 Debug Mode 在設備試機時期提供相當的便利性,可以即時觀察變數變化或是線程運作都十分方便。但若上線運作的設備便不太可能把整個原始碼放在設備,這時有一個簡單的方式在程式執行期即時觀察到相關參數的狀態便可大幅縮減工程人員除錯的困難。

以下是運用 TraceListener 類別作出類似 DebugView 功能。

public partial class fmTraceLogViewer : Form
    {
        private static fmTraceLogViewer mSingleton;

        private fmTraceLogViewer()
        {
            InitializeComponent();
            Trace.Listeners.Add(new myTraceListener(this));
        }
        public static fmTraceLogViewer GetSingleton()
        {
            if (mSingleton == null)
            {
                mSingleton = new fmTraceLogViewer();
            }
            return mSingleton;
        }

        #region Disable Form 關閉按鈕
        private const int CP_NOCLOSE_BUTTON = 0x200;
        protected override CreateParams CreateParams
        {
            get
            {
                CreateParams myCp = base.CreateParams;
                myCp.ClassStyle = myCp.ClassStyle | CP_NOCLOSE_BUTTON;
                return myCp;
            }

        } 
        #endregion

       

        public void Log(string message)
        {
            
            if (this.InvokeRequired)
            {
                this.BeginInvoke(new MethodInvoker(delegate { Log(message); }));
            }
            if (this.Visible == false)
            {
                this.Show();
            }
            rtbLogVeiwer.AppendText(message + "\n");
            //大於50列, 刪除第一列
            if (rtbLogVeiwer.Lines.Length > 50)
            {
                int start = rtbLogVeiwer.GetFirstCharIndexFromLine(0);
                int end = rtbLogVeiwer.GetFirstCharIndexFromLine(1);
                rtbLogVeiwer.Select(start, end);
                rtbLogVeiwer.SelectedText = "";
            }
            //ScrollT 移到最下端
            rtbLogVeiwer.SelectionStart = rtbLogVeiwer.Text.Length;
            rtbLogVeiwer.ScrollToCaret();
            this.WindowState = FormWindowState.Normal;
        }

        private void btnRichTextBoxClear_Click(object sender, EventArgs e)
        {
            rtbLogVeiwer.Clear();
        }
    }

    public class myTraceListener : DefaultTraceListener
    {
        fmTraceLogViewer mFm;
        public myTraceListener(fmTraceLogViewer fm)
        {
            mFm = fm;
        }
        public override void WriteLine(string message)
        {
            mFm.Log(message);
        }
    }

沒有留言:

張貼留言