博客 / 詳情

返回

告別人工干預!C# 輕量級上位機自動聯動 MES 與視覺檢測

前言

工業自動化與智能製造日益普及,如何高效、穩定地將現場設備(如掃碼槍、視覺檢測系統)與企業信息系統(如MES)打通,成為許多製造業關注的核心問題。

本文將介紹一個基於 .NET 開發的實際項目——"上位機掃碼聯動視覺檢測系統",從整體架構到關鍵邏輯,詳細解析其設計思路與實現方式。

場景描述

項目源於某工廠產線的實際需求:操作員通過掃碼槍掃描產品條碼後,系統需自動向MES查詢該產品的工藝狀態,並根據結果決定是否允許進入下一道視覺檢測工序。

整個過程要求實時、可靠、可追溯,且具備良好的用户交互體驗。為滿足這些需求,採用 WinForm 搭建上位機應用,結合串口通信、TCP 網絡交互及 HTTP 接口調用開發了一套輕量但功能完整的閉環控制系統。

項目介紹

一個 Windows 桌面應用程序,主要運行於產線工位的工控機上。其核心任務是監聽掃碼槍輸入,驗證條碼格式,調用 MES 接口獲取產品信息,並將處理結果發送給視覺檢測系統,最終接收並展示檢測結果(OK/NG)。

整個流程實現了"掃一次碼 → 查一次MES → 發一次指令 → 等一次結果"的完整閉環。

項目功能

1、支持通過配置窗口設置掃碼槍所連接的串口參數;

2、自動監聽串口數據,識別完整條碼並進行格式校驗;

3、調用企業 MES 系統接口,查詢當前產品的前工序完成狀態;

4、根據 MES 返回結果,動態決定發送給視覺系統的數據內容(新零件號或"sameSpecs"標識);

5、通過 TCP 客户端將指令發送至 VisionMaster(端口9527);

6、同時啓動 TCP 服務端(端口9528),監聽 VisionMaster 返回的最終檢測結果;

7、在界面上實時顯示條碼、U9單號、零件號、工序狀態及最終 OK/NG 結果;

8、全程記錄詳細日誌至本地文件(按日期分文件),便於問題追蹤與審計。

項目特點

首先,系統具備嚴格的流程控制機制。通過 _isWaitingForResult_currentProcessingBarcode 兩個狀態變量,確保"一件一檢",防止操作員連續掃碼導致數據錯亂。

其次,針對零件號重複場景做了優化:若當前產品與上次為同一型號,則發送"sameSpecs"而非完整零件號,減少視覺系統重複加載模型的開銷。

另外,所有異步操作(如串口接收、HTTP 請求、TCP 通信)均通過線程安全方式更新 UI,避免界面卡死或崩潰。日誌系統也兼顧了可讀性與性能,支持 JSON 格式美化輸出,並限制內存佔用。

項目技術

基於.NET Framework 4.7.2 開發,使用 WinForm 開發圖形界面。

關鍵技術棧包括:

  • System.IO.Ports 實現串口通信,處理掃碼槍數據碎片;

  • HttpClient 調用 RESTful MES 接口,解析 JSON 響應;

  • 自定義 TcpClientManager 與 TcpServerListener 類,分別負責與 VisionMaster 的雙向通信;

  • Newtonsoft.Json 用於 JSON 序列化與格式化;

  • 多線程同步機制(如 Invoke、lock)保障 UI 與文件寫入的安全性;

  • 正則表達式校驗條碼格式,提升輸入可靠性。

項目代碼

異步監聽循環

private async Task ListenLoopAsync(CancellationToken token)
{
    try
    {
        // 監聽所有網絡接口的 IP 地址
        _resultListener = new TcpListener(IPAddress.Any, _listenPort);
        _resultListener.Start();
        WriteToLogFile($"VisionMaster 結果監聽服務已啓動,端口: {_listenPort}");

        while (!token.IsCancellationRequested)
        {
            // 使用 token 優雅地處理關閉時的阻塞
            Task<TcpClient> acceptTask = _resultListener.AcceptTcpClientAsync();

            // 等待接受連接或取消信號
            await Task.WhenAny(acceptTask, Task.Delay(Timeout.Infinite, token));

            if (token.IsCancellationRequested)
            {
                break; // 收到取消信號,退出循環
            }

            // 接受客户端連接
            TcpClient client = await acceptTask;
            // 異步處理該客户端數據,不阻塞主循環
            // 使用 _ = 忽略返回的 Task,實現 fire-and-forget
            _ = HandleVisionMasterResultClient(client, token);
        }
    }
    catch (ObjectDisposedException) when (token.IsCancellationRequested)
    {
        // 正常關閉,忽略
    }
    catch (Exception ex)
    {
        if (!token.IsCancellationRequested)
        {
            WriteToLogFile($"VisionMaster 結果監聽失敗: {ex.Message}");
        }
    }
}

項目效果

系統顯著提升了產線作業效率與準確性。操作員只需掃碼,後續流程全自動執行,無需人工判斷是否可檢測。

MES 數據與視覺檢測結果緊密聯動,杜絕了"未完成前工序卻進入檢測"的風險。

項目源碼

代碼結構清晰,主窗體 Main.cs 集成了串口、TCP、HTTP、日誌等核心模塊,並通過職責分離(如 MesService、TcpServerListener 等類)提升可維護性。

大家可根據自身產線需求,靈活調整條碼規則、接口地址或通信協議。

Gitee:https://gitee.com/w22222h/sjsw

總結

項目是一個基於Windows窗體應用程序的自動化檢測系統,集成了串口通信、TCP/IP網絡通信、日誌記錄以及MES接口查詢等功能。通過模塊化設計、線程安全、異常處理等技術確保系統的穩定性和可靠性。

看似簡單的掃碼聯動系統,實則融合了工業通信、業務邏輯與用户體驗的多重考量。它不僅解決了具體產線痛點,也為類似場景提供可複用的技術示例。

在智能製造向縱深發展的當下,此類"小而美"的上位機應用,正是連接物理世界與數字系統的橋樑。還可進一步集成 OPC UA、數據庫持久化或 Web 管理後台,拓展其應用場景。

關鍵詞

上位機、掃碼槍、MES、VisionMaster、串口通信、TCP通信、C#、WinForm、工業自動化、閉環控制、自動化檢測系統、TCP/IP網絡通信、MES接口查詢、日誌記錄

最後

如果你覺得這篇文章對你有幫助,不妨點個贊支持一下!你的支持是我繼續分享知識的動力。如果有任何疑問或需要進一步的幫助,歡迎隨時留言。

也可以加入微信公眾號[DotNet技術匠] 社區,與其他熱愛技術的同行一起交流心得,共同成長!

user avatar yaoyaolx_wiki 頭像 zilliz 頭像 mylxsw 頭像 dadegongjian 頭像 xiaojiu_625c14980f596 頭像 fanjiapeng 頭像 codingembedded 頭像 monkeynik 頭像 hanhoudedengshanxie_66641de47decd 頭像 zbooksea 頭像 apocelipes 頭像 chuck1sn 頭像
22 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.