前言
工業自動化與智能製造日益普及,如何高效、穩定地將現場設備(如掃碼槍、視覺檢測系統)與企業信息系統(如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技術匠] 社區,與其他熱愛技術的同行一起交流心得,共同成長!