馮 方, 王紹杰, 金偉偉
(合肥工業(yè)大學(xué) 儀器科學(xué)與光電工程學(xué)院, 合肥230009)
近年來隨著科學(xué)技術(shù)的飛速發(fā)展,平板顯示技術(shù)也日新月異,顯示屏的應(yīng)用范圍也越來越廣泛。小到智能手表、手機(jī),大到筆記本電腦、液晶電視,平板顯示屏的尺寸越來越大,分辨率也越來越高,因此對(duì)平板檢測(cè)系統(tǒng)的分辨率、掃描定位精度和穩(wěn)定性都提出了更高的要求。 自動(dòng)光學(xué)檢測(cè)(Automatic Optic Inspection,AOI)是指采用光學(xué)成像技術(shù)獲取被測(cè)目標(biāo)的圖像,再通過圖像處理和識(shí)別算法讀取被測(cè)目標(biāo)的缺陷信息[1]。 而在平板檢測(cè)系統(tǒng)中,除了與圖像處理識(shí)別算法單元通信,還要與AOI 系統(tǒng)的控制器端通信。
在顯控軟件開發(fā)時(shí),一般包含以下幾種功能:界面顯示,通信數(shù)據(jù)收發(fā),數(shù)據(jù)處理與轉(zhuǎn)換以及數(shù)據(jù)提交與分發(fā)。 而實(shí)現(xiàn)這些功能就需要多線程與通信機(jī)制相結(jié)合。 多線程可使編程任務(wù)簡(jiǎn)化和模塊化,可以提高處理器的效率,提高數(shù)據(jù)吞吐量[2]。 在現(xiàn)代計(jì)算機(jī)體系中,應(yīng)用程序通常都是多線程運(yùn)行。
傾斜式平板顯示屏自動(dòng)光學(xué)檢測(cè)系統(tǒng)(簡(jiǎn)稱傾斜式平板檢測(cè)系統(tǒng))是集運(yùn)動(dòng)控制、在線檢測(cè)和工業(yè)計(jì)算機(jī)為一體的自動(dòng)化精密儀器。 系統(tǒng)簡(jiǎn)圖如圖1 所示。 首先玻璃基板在上料區(qū)就位,檢測(cè)到玻璃基板到來后,由電機(jī)帶動(dòng)傳動(dòng)輪拖動(dòng)玻璃基板勻速經(jīng)過掃描區(qū)域,圖像處理單元經(jīng)過處理分析后向,系統(tǒng)發(fā)送要進(jìn)行復(fù)檢位置的指令,而后控制玻璃基板到達(dá)指定位置進(jìn)行復(fù)檢后下料。
圖1 傾斜式平板檢測(cè)系統(tǒng)Fig. 1 Inclined flat panel inspection system
上位機(jī)部分是工業(yè)平板電腦,負(fù)責(zé)人機(jī)交互,信息轉(zhuǎn)換和整機(jī)控制。 軟件主界面如圖2 所示。 人機(jī)交互界面HMI 需要實(shí)時(shí)顯示系統(tǒng)的運(yùn)行狀態(tài),提供設(shè)備的運(yùn)行接口。 人機(jī)界面要與下位機(jī)、圖像處理單元和遠(yuǎn)程監(jiān)視端3 個(gè)單元進(jìn)行通信。 實(shí)現(xiàn)人機(jī)界面與PLC 運(yùn)動(dòng)控制系統(tǒng)實(shí)時(shí)交互,圖像處理單元(IMP)反饋控制以及遠(yuǎn)程監(jiān)視(RMT)功能。 圖3 為以人機(jī)界面為基礎(chǔ)的軟件架構(gòu)。 通過以太網(wǎng)人機(jī)界面與運(yùn)動(dòng)控制器連接。 人機(jī)界面讀取運(yùn)動(dòng)控制器MP2300S 內(nèi)的數(shù)據(jù),經(jīng)解析和轉(zhuǎn)換后,顯示在人機(jī)界面上;人機(jī)界面同時(shí)還要接收用戶輸入的一些指令,并將這些指令解析為運(yùn)動(dòng)控制器可以識(shí)別的命令。
圖2 人機(jī)界面Fig. 2 Interactive interface
傾斜式平板檢測(cè)系統(tǒng)根據(jù)圖像處理單元的處理結(jié)果控制系統(tǒng)進(jìn)行復(fù)檢動(dòng)作。 圖像處理單元不是直接控制運(yùn)動(dòng)控制器,而是通過上位機(jī)即人機(jī)界面作為控制接口。 圖像處理單元與人機(jī)界面使用一套自定義的通信協(xié)議,人機(jī)界面作為控制指令的中轉(zhuǎn)站,將圖像處理單元發(fā)來的指令轉(zhuǎn)換為運(yùn)動(dòng)控制命令,并且將結(jié)果信息反饋給圖像處理單元。
人機(jī)界面作為儀器設(shè)備的一部分,安裝在工業(yè)現(xiàn)場(chǎng)。 為了能夠遠(yuǎn)程監(jiān)視設(shè)備的運(yùn)行狀態(tài),人機(jī)界面還要提供數(shù)據(jù)轉(zhuǎn)發(fā)功能,為遠(yuǎn)程用戶提供監(jiān)視服務(wù)。
圖3 軟件架構(gòu)Fig. 3 Software Architecture
進(jìn)程和線程是理解程序運(yùn)行的基礎(chǔ),進(jìn)程是系統(tǒng)資源分配的基本單位,而線程是CPU 調(diào)度的基本單位,它以某種規(guī)則輪流享用進(jìn)程資源完成自身任務(wù)[3]。 單核時(shí)對(duì)CPU 的時(shí)間進(jìn)行切片輪換執(zhí)行多個(gè)任務(wù),當(dāng)時(shí)間足夠小的時(shí)候,可以認(rèn)為是多個(gè)任務(wù)在同時(shí)執(zhí)行。 采用多線程技術(shù)可以將程序劃分成多個(gè)獨(dú)立的任務(wù),顯著提高其性能。 在傾斜式平板檢測(cè)系統(tǒng)中使用多線程技術(shù),可以防止阻塞,保證數(shù)據(jù)的收發(fā)互不干擾,還不會(huì)影響到界面的正常使用。
在傾斜式平板檢測(cè)系統(tǒng)中,人機(jī)界面要與下位機(jī)、圖像處理單元以及遠(yuǎn)程監(jiān)視單元通信。 由于系統(tǒng)狀態(tài)指示等數(shù)據(jù)繁多,所以由人機(jī)交互界面作為主線程創(chuàng)建3 個(gè)子線程IMP,PLC 和RMT 子線程分別負(fù)責(zé)各個(gè)子線程與對(duì)應(yīng)單元的通信。 主線程負(fù)責(zé)界面交互,3 個(gè)子線程則分別負(fù)責(zé)不同的數(shù)據(jù)通信。
本系統(tǒng)是基于MFC 對(duì)話框模式開發(fā)的人機(jī)界面應(yīng)用程序,主窗口由MFC 類向?qū)ё詣?dòng)生成。 主線程由CWinThread 的派生類創(chuàng)建,CWinThread 支持用戶界面線程和工作者線程兩種類型。 由于本系統(tǒng)需要接收,發(fā)送和處理消息,所以開辟的子線程都是用戶界面線程。 使用CWin Thread 類派生PLC、IMP、 RMT 子 線 程 類 CThreadforPLC、CThreadforImage、CThreadforRemote,并為每個(gè)類增添成員變量和成員函數(shù)。 當(dāng)程序啟動(dòng)開始運(yùn)行時(shí),初始化人機(jī)界面,通過調(diào)用全局函數(shù)AfxBeginThread創(chuàng)建PLC、IMP、RMT 3 個(gè)子線程。
通信是創(chuàng)建子線程最主要的目標(biāo),包括初始化通信端口、組織數(shù)據(jù)、發(fā)送數(shù)據(jù)、接收數(shù)據(jù)和解析數(shù)據(jù)。 子線程使用MFC 封裝的Socket 類通信,因此子線程需要定義通信Socket 成員變量,同時(shí)開辟發(fā)送緩沖區(qū)和接收緩沖區(qū)。
子線程采用異步通信的方式,須重寫標(biāo)準(zhǔn)通知函數(shù)。 在客戶端(PLC 子線程)重寫OnConnect、OnReceive、OnClose,在服務(wù)器端(IMP、RMT 子線程)重寫OnAccept、OnReceive、OnClose,在重寫的函數(shù)內(nèi)設(shè)置通信狀態(tài)、建立連接和收發(fā)數(shù)據(jù)。
TCP/IP 協(xié)議的應(yīng)用開發(fā)接口的事實(shí)標(biāo)準(zhǔn)是Socket(套接口)。 使用Socket 可以隱藏網(wǎng)絡(luò)底層復(fù)雜的結(jié)構(gòu)與協(xié)議,能夠抽象地對(duì)網(wǎng)絡(luò)進(jìn)行操作[4]。本系統(tǒng)使用的是MFC 對(duì)Windows Socket 的封裝類,是對(duì)Socket API 的又一次封裝。 傾斜式平板檢測(cè)系統(tǒng)創(chuàng)建的3 個(gè)子線程都擁有它們自己的通信Socket,Socket 管理數(shù)據(jù)收發(fā),各個(gè)線程負(fù)責(zé)數(shù)據(jù)處理。 套接字有流式套接字、數(shù)據(jù)報(bào)式套接字和原始套接字三種,是通信雙方的一種約定。 數(shù)據(jù)報(bào)套接字使用的是UDP 協(xié)議,流式套接字采用的是TCP協(xié)議[5]。 使用CAsyncSocket 類在MFC 應(yīng)用程序中可以輕松處理多個(gè)網(wǎng)絡(luò)協(xié)議,針對(duì)本系統(tǒng)的通信協(xié)議采用流式套接字編程。 流式套接字通信如圖4 所示。
圖4 流式套接字通信Fig. 4 Streaming socket communication
傾斜式平板檢測(cè)系統(tǒng)采用運(yùn)動(dòng)控制器MP2300S 來實(shí)現(xiàn)系統(tǒng)的底層運(yùn)動(dòng)控制功能。MP2300S 內(nèi)置的218IFA 模塊是10Base-T/100Base-TX 的Ethernet 接口,也是MP2300S 標(biāo)準(zhǔn)配備的通信接口[6]。 本系統(tǒng)采用的是218IF-01 中TCP/IP應(yīng)用層五個(gè)協(xié)議中的MEMMOBUS/TCP 來構(gòu)建通信網(wǎng)絡(luò)。 數(shù)據(jù)由標(biāo)題、218 標(biāo)題和應(yīng)用數(shù)據(jù)三部分構(gòu)成,如圖5 所示。
圖5 協(xié)議數(shù)據(jù)格式Fig. 5 Protocol data format
當(dāng)人機(jī)界面與下位機(jī)PLC 通信時(shí),人機(jī)界面為客戶端,下位機(jī)PLC 為服務(wù)器端,使用CAsyncSocket異步通信類派生 PLC 子線程通信類CPLCClientSocket。 在這個(gè)類的構(gòu)造函數(shù)中指定socket 服務(wù)的線程,并在這個(gè)類中重寫OnConnect、OnReceive、OnClose 用于通信服務(wù),調(diào)用子線程CThreadforPLC 中的同名函數(shù)完成相應(yīng)的功能。
將PLC 的動(dòng)作通過兩個(gè)參數(shù)定義區(qū)別可以作為人機(jī)界面程序與PLC 控制程序的接口協(xié)議。 PLC子線程接收讀命令響應(yīng)數(shù)據(jù)、寫命令響應(yīng)數(shù)據(jù)和錯(cuò)誤響應(yīng)數(shù)據(jù)三種類型數(shù)據(jù)。 讀命令將接收到的響應(yīng)數(shù)據(jù)拷貝到主界面輸入緩存區(qū),主界面根據(jù)接收到的這些數(shù)據(jù)顯示系統(tǒng)運(yùn)行狀態(tài)。 寫命令由人機(jī)界面或者圖像處理單元發(fā)送,寫命令響應(yīng)數(shù)據(jù)的功能查看這個(gè)命令有沒有成功寫入。 錯(cuò)誤響應(yīng)數(shù)據(jù)指下位機(jī)PLC 反饋回來的錯(cuò)誤代碼。
圖像處理單元和遠(yuǎn)程監(jiān)視端不直接與下位機(jī)運(yùn)動(dòng)控制器通信。 在和人機(jī)界面通信的時(shí)候,人機(jī)界面作為服務(wù)器端,IMP 和RMT 作為客戶端,創(chuàng)建服務(wù)器端通信Socket,在IMP 子線程通信類的構(gòu)造函數(shù)中指定socket 服務(wù)的線程, 這個(gè)類重寫了OnAccept、OnReceive、OnClose 用 于 通 信 服 務(wù)。 以CAsyncSocket 類作為通信接口,在IMP 子線程的同名函數(shù)中發(fā)送和接收數(shù)據(jù)。
圖像處理單元需要給運(yùn)動(dòng)控制器發(fā)送復(fù)檢指令,則要保證成功建立圖像處理單元到下位機(jī)PLC的通信信道,IMP 不直接與下位機(jī)PLC 通信,那么就需要保證圖像處理單元到人機(jī)界面以及人機(jī)界面到下位機(jī)PLC 的通信連接成功;而后對(duì)人機(jī)界面至下位機(jī)PLC 的通信信道是否被占用進(jìn)行檢測(cè),假如人機(jī)界面正在占用信道發(fā)送命令,圖像處理單元不能發(fā)送指令到下位機(jī)PLC 的;最后還需要檢測(cè)下位機(jī)PLC 是否正在執(zhí)行命令,如果下位機(jī)PLC 還沒有結(jié)束上一條命令的動(dòng)作,則不會(huì)執(zhí)行當(dāng)前命令的動(dòng)作。 如圖6 所示。
圖6 IMP 指令流程Fig. 6 IMP instruction flow
檢測(cè)通信信道是否建立:使用Socket 通信的基礎(chǔ)是保證各個(gè)Socket 已初始化并成功連接。 在主界面類中定義一個(gè)m_iSocketok 成員變量,標(biāo)志PLC、IMP、RMT 子線程通信Socket 有沒有順利初始化,這個(gè)變量的第0 位表示PLC 通信狀態(tài)、第1 位表示IMP 通信狀態(tài)、第2 位表示RMT 通信狀態(tài)。 當(dāng)每個(gè)通信Socket 初始化,連接成功時(shí)置為1,當(dāng)關(guān)閉連接狀態(tài)或者是通信中斷時(shí)置為0。 通過檢測(cè)這個(gè)變量的值,可知通信信道是否成功建立。
檢測(cè)通信信道是否空閑:在3 種情況下人機(jī)界面會(huì)向下位機(jī)PLC 發(fā)送數(shù)據(jù):定時(shí)查詢狀態(tài)、用戶界面操作和圖像處理單元發(fā)來指令,由于有可能會(huì)存在時(shí)間上的并發(fā)沖突,因此需要考慮同步它們的發(fā)送動(dòng)作。 在主界面類中定義一個(gè)bool 型成員變量m_bPLCsend 記錄PLC 的通信狀態(tài),當(dāng)它的值為true 時(shí)表示正在發(fā)送數(shù)據(jù),當(dāng)它的值為false 時(shí)表示此時(shí)沒有發(fā)送數(shù)據(jù)。 每次向下位機(jī)PLC 發(fā)送命令之前,先查詢m_bPLCsend 的值,這個(gè)變量的值在人機(jī)界面向下位機(jī)發(fā)送命令的過程中會(huì)發(fā)生改變,在準(zhǔn)備發(fā)送命令前將其值置true,在發(fā)送完命令后將其值置false。
檢測(cè)下位機(jī)PLC:在進(jìn)行復(fù)檢動(dòng)作時(shí),由人機(jī)界面向下位機(jī)PLC 發(fā)送命令,首先檢測(cè)下位機(jī)有沒有完成上一個(gè)指令的動(dòng)作。 在人機(jī)界面主窗口類中定義一個(gè)成員變量m_byteCMDOrder 表示PLC 發(fā)送命令序號(hào),這個(gè)序號(hào)的范圍為1 ~64,當(dāng)人機(jī)界面向下位機(jī)PLC 發(fā)送寫命令時(shí),這個(gè)成員變量的值會(huì)賦到寫命令的數(shù)據(jù)中,之后該成員變量自增,當(dāng)人機(jī)界面接收到下位機(jī)的響應(yīng)命令時(shí),這個(gè)值作為PLC 數(shù)據(jù)結(jié)構(gòu)成員taskfinl 返回,通過查看taskfinl 和成員變量m_byte CMDOrder 的值是否相等,就可以判斷下位機(jī)PLC 有沒有完成上一個(gè)指令動(dòng)作。
遠(yuǎn)程監(jiān)視端要顯示傾斜式平板檢測(cè)系統(tǒng)的狀態(tài),則要向人機(jī)界面發(fā)送查詢命令,RMT 子線程定義了一個(gè)臨時(shí)的接收緩沖區(qū),將主界面線程中記錄系統(tǒng)狀態(tài)的成員變量復(fù)制到臨時(shí)緩沖區(qū),經(jīng)過整理后發(fā)送給遠(yuǎn)程端。
通過采用多線程多緩沖區(qū)結(jié)構(gòu)來設(shè)計(jì)傾斜式平板檢測(cè)系統(tǒng)的軟件架構(gòu),保證了上位機(jī)人機(jī)界面與下位機(jī)、圖像處理單元和遠(yuǎn)程監(jiān)視端的高效通信,極大提高了實(shí)時(shí)性,完成了其基本功能要求。