周任杰 劉 宇 張子立 朱志松
(南通大學機械工程學院 江蘇 南通 226019)
輕鋼別墅作為一種鋼結構住宅,具有“無支撐、鋼柱變斷面、結構布局靈活、抗震性能好、屋面輕型化”五大優(yōu)點,在國內外應用日益廣泛,形成了較為成熟的生產鏈及產業(yè)體系[1-2]。輕鋼別墅骨架的加工設備是龍骨成型機,由工控機、下位機及機構組成。工控機實現龍骨加工數據解析、設備參數設置、加工過程的檢測和反饋等功能,通過建立通信實現數據傳輸;下位機采用松下PLC執(zhí)行機構動作;機械設備由模具、機身、輸料裝置、液壓系統(tǒng)等組成。三部分相互配合加工龍骨。
為實現機器穩(wěn)定加工,工控機與下位機間的通信必須穩(wěn)定可靠。同時為保證工控機的便攜性和布局的便利,廠家提出基于Wi-Fi通信的要求。Wi-Fi通信的優(yōu)點為無線電波覆蓋范圍廣,傳輸速率高,提高工控機的便攜性,無需布線,避免復雜線的連接,實現一定距離上工控數據的交換[3]。在帶來便利的同時,網絡安全成為隱患,當傳輸距離加大時,外加電磁等的干擾,通信質量大幅下降[4]。
龍骨成型機通信系統(tǒng)構架如圖1所示[5]。工控機、Wi-Fi通信模塊、下位機分別構成龍骨成型機通信系統(tǒng)的客戶應用層、數據通信層、與硬件層。在數據通信層,基于Python語言,選擇Socket作為通信的端點,從Socket發(fā)送和接收數據,比其他通信協議更安全可靠[6]。Socket分為基于TCP的流式套接字和基于DUP的數據報式套接字,經過三次握手建立連接。本通信方案采用基于TCP的流式套接字,實現工控機與下位機間的本地通信[7],工控機作為客戶端(Master),PLC作為服務端(Slave)。龍骨成型機的加工速度為40 m/min,連續(xù)高速運行過程中不能出現卡頓現象。由于上下位機數據傳輸密集,為避免通信成為整機運行的速度瓶頸,基于生產者消費者模式,分別設計三種方案:采用單進程、多線程以及多線程與多進程相結合的通信方案。
圖1 龍骨成型機通信系統(tǒng)構架
松下PLC與工控機間進行數據交換采用Mewtocol通信協議。Mewtocol協議要求通信報文為對應格式的指令,指令格式如圖2所示。每一幀指令包含:起始位、站號高低位、指令代碼、文本代碼、校驗碼、結束位。起始位為字符“%”;站號高低位在工控機與多個PLC通信時設置,代表PLC序號;指令代碼為讀寫不同狀態(tài)、不同內容寄存器的指令;高低兩位校驗碼,用來校驗數據傳輸過程中是否出現亂碼或者數據丟失;使用回車符作為結束位[8]。
工控機與松下PLC的傳輸數據包括龍骨加工數據的下發(fā)與工控狀態(tài)寄存器的讀取,其中下發(fā)數據包括模具號、孔距、加工序號等,PLC上傳數據包括模具工況、傳感器狀態(tài)、加工結束標記等。按照圖2所示指令格式,以分別向下位機松下PLC中DT1至DT3的連續(xù)3個寄存器中分別寫入數據0500、0715、0009為例,編寫指令為:“%01# WDD000100030500071500095DCR”,指令字符串經過Socket封裝發(fā)送至下位機,PLC接收指令后數據寫入相應寄存器,控制油缸動作并發(fā)送應答信息。若工控機收到的應答指令為“%0 $WD13CR”,則寫入正確;若收到的應答指令為“%01!WD13CR”,則寫入不正確,數據丟失或其他異常[8]。
圖2 指令格式
龍骨成型機通信系統(tǒng)硬件由5G Wi-Fi路由器、工控機、松下PLC組成,工控機與松下PLC接入路由器完成硬件系統(tǒng)連接。松下PLC提供AFPX-COM5模塊與RS232模塊。RS232串口通信距離較短,通信質量不穩(wěn)定,易受外部環(huán)境干擾,為保證通信質量與效率,提高通信距離,采用RS232轉以太網模塊接入基于Wi-Fi的以太網總線。松下PLC通過AFPX-COM5模塊在以太網中與工控機完成加工指令的接收與執(zhí)行;通過RS232轉以太網模塊將傳感器數據與現場工況傳回工控機。相應硬件組成示意圖如圖3所示[8]。
圖3 通信系統(tǒng)硬件組成示意圖
以龍骨成型機加工過程為例,工控機解析工藝數據,生成加工指令后發(fā)送到下位機,下位機指令執(zhí)行結束后將執(zhí)行狀況反饋給工控機,確保上一條指令執(zhí)行完畢后,工控機繼續(xù)生成下一條加工指令并傳輸[9]。加工過程中單條指令創(chuàng)建與執(zhí)行過程如圖4所示。
(a) 工控機發(fā)送指令 (b) 下位機發(fā)送指令 (c) 工控機接收指令圖4 加工指令過程
若多次發(fā)送與接收指令,Socket只需創(chuàng)建一次,創(chuàng)建Socket過程如下:
tcpCliSocket=socket(AF_INET,SOCK_STREAM)
tcpCliSocket.settimeout(10)
tcpCliSocket.connect(ADDR)
BUFSIZ=512
try:
tcpCliSocket.send(data_send)
data_recv=tcpCliSocket.recv(BUFSIZ)
except:
tcpCliSocket.close()
break
創(chuàng)建名為tcpCliSocket的Socket套接字,AF_INET指定使用IPv4,SOCK_STREAM為流式套接字。使用Connect方法建立Socket,連接到本地地址,使用settimeout設置連接超時時間。Socket通過Send()方法發(fā)送數據data_send;通過Recv()方法從緩沖區(qū)接收數據data_recv;使用close()函數斷開Socket連接。其中,ADDR為地址,HOST為服務器的主機名,PORT是端口號,BUFSIZ為設置的緩沖區(qū)大小。
本方案為同步通信方式,主界面與通信主界面與通信進程在一個進程中,采用try/except語句處理程序正常執(zhí)行過程中出現的一些異常情況,減少Socket阻塞狀態(tài)的出現。龍骨成型機為順序加工,加工進程需要等待通信數據,加工中會出現卡頓現象,效率較低。
由前述通信方式可知,工控機同時完成對加工指令的下發(fā)與下位機各參數的實時反饋,應采用異步方式提高效率。利用不同線程間的自動切換,在后臺交替運行處理數據,多線程的使用無疑能夠充分有效地提高程序執(zhí)行[10],使龍骨成型機的通信、跟蹤、檢測等功能同時進行。本通信方案流程圖如圖5所示[11]。
圖5 使用多線程的通信方案
多線程通信方案設計思路:創(chuàng)建線程池,設置線程池允許運行的線程函數個數,建立Socket連接。將讀寫的功能函數分別包裝為線程函數,使用實例化隊列Queue作為線程函數的參數,將界面進程的數據通過隊列Queue的put()函數傳入線程函數,在線程函數中通過隊列Queue的get()函數取出數據,完成數據的傳入。
采用信號與槽,傳出線程函數中數據,將數據從通信線程中傳到工控機界面進程。首先聲明信號變量,設置其參數類型為str字符串類型,創(chuàng)建信號與槽函數的連接。傳出數據時,emit信號,觸發(fā)信號與槽機制,執(zhí)行槽函數,data作為參數輸出到界面進程中,工控機主界面根據data數據判斷工況并實現加工過程跟蹤。其中,self.slot為槽函數名稱,data為線程中需傳出的數據。實現方法如下:
signal=pyqtSignal(str)
signal.connect(self.slot)
signal.emit(data)
本方案中龍骨成型機在加工時無需等待通信數據,龍骨加工與工控狀態(tài)監(jiān)測并行處理,通信數據讀寫與界面更新同時進行,提高加工速度,缺點是線程函數較多時,影響CPU的處理效率,實際生產中數據傳輸頻率較高時,偶爾有卡頓現象,而且由于Python存在GIL,需要防止線程死鎖情況的發(fā)生[11]。
考慮到前述多線程方案的不足,單獨設置不影響主界面進程的通信進程能大大提高系統(tǒng)的擴展性和穩(wěn)定性[12-13]。本方案采用多線程與多進程相結合,借助Python的future模塊,繞開GIL,利用主進程之外的CPU核心。基于生產者消費者模型,多進程負責生產數據,由于進程間無法通過信號槽機制通信,借助線程安全的隊列Queue共享數據,引入多線程負責查詢和讀取Queue,并通過信號槽機制傳遞給主界面,實現生產者與消費者的解耦合,提高程序的整體處理數據的速度與效率[14-15],數據傳輸路線圖如圖6所示。
圖6 數據傳輸路線圖
將讀寫的功能包裝為進程函數,隊列Queue作為參數,讀寫指令通過Queue的入隊出隊,完成與PLC間數據的交換。使用如下方法創(chuàng)建進程,其中w=work(),實例化通信進程類,w.communication調用實例化類中通信函數,并完成龍骨加工狀態(tài)信息的指令編碼解碼,q_Processwrite,q_Processread為實例化隊列Queue,分別作為參數傳入進程。q_Processwrite作為寫入隊列,存放龍骨成型機加工指令;q_Processread作為為獲取隊列,存放獲取加工狀態(tài)指令。
p=Process(target=w.communication,args=(q_Processwrite,q_Processread))
p.start()
進程間使用多線程中轉程序完成數據的傳輸與交換。多線程中轉程序創(chuàng)建線程池,借助信號和槽機制,在加工中每有一個數據出隊時,線程發(fā)送包含數據的信號給槽函數,將加工狀態(tài)和信息反饋到主界面進程,完成龍骨成型機UI界面對加工過程的實時跟蹤[16]。主界面將需加工數據入隊,通過線程函數生成加工指令,將加工指令存入進程函數參數,完成數據的傳入。線程池創(chuàng)建方法如下:
pool=ThreadPoolExecutor(2)
t_write=pool.submit(fun_write,q_write)
t_read=pool.submit(fun_read,q_read)
其中,t_write為獲取數據的線程函數,t_read為發(fā)送數據的線程函數,fun_read、fun_write分別為讀寫函數。fun_write根據q_write傳入的龍骨加工數據(孔距、加工序列等)放入q_Processwrite。fun_read利用信號與槽機制將q_read中的工況數據emit到主界面進程中,實現加工監(jiān)測。
本方案中主界面進程與通信進程相互獨立,充分利用CPU多核優(yōu)勢,避免通信延遲。結合多線程中轉,龍骨加工進程無需等待數據。數據獲取快速高效,主界面不卡頓。
根據上述三種方案在實際生產中的效果分析,龍骨加工時,使用多線程與多進程相結合的通信方式,加工過程無卡頓,工況最穩(wěn)定,符合預期要求。在通信環(huán)境較為惡劣的情況下,前兩種方案卡頓明顯,方案三無明顯卡頓,能夠滿足生產需要。因此最終采用多線程與多進程相結合的通信方案。
本文介紹了龍骨成型機的系統(tǒng)結構與加工過程,基于Wi-Fi通信,提出了三種通信方案,并使用Python語言實現。經過實驗測試與分析,最終采用了基于Mewtocol協議的多線程與多進程相結合的通信方案。實驗結果標明,該通信方案結合多線程與多進程優(yōu)點,規(guī)避缺點,能夠按照“生產者與消費者模式”實現既定的通信與加工同時進行,穩(wěn)定可靠,數據傳輸迅速,實際生產出的龍骨完全可裝配為輕鋼別墅,生產過程簡單可靠便捷。