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