薛 哲,張功學(xué),何 凱,徐耀輝,崔 聰
(1.陜西科技大學(xué)機電工程學(xué)院,陜西 西安 710021;2.中國科學(xué)院深圳先進(jìn)技術(shù)研究院,廣東 深圳 518055)
現(xiàn)在AGV導(dǎo)引技術(shù)正在迅速發(fā)展,很多行業(yè)已經(jīng)開始采用AGV導(dǎo)引技術(shù)[1]。但是部分AGV小車的控制方式為觸摸屏控制,需要人工近距離操作,步驟繁瑣。并且在復(fù)雜實驗環(huán)境下或者AGV小車行駛過程中操作時,存在一定的安全隱患。因此,為了提高AGV小車操控的安全性與方便性,本文使用C#編程語言,結(jié)合Socket通信與串口轉(zhuǎn)WIFI技術(shù),設(shè)計出一款適用于AGV小車的上位機控制系統(tǒng),此系統(tǒng)可使人在較遠(yuǎn)距離使用電腦控制AGV小車,即使在復(fù)雜實驗環(huán)境下也可以很方便的操控AGV小車并且保證了人員的安全。
AGV通訊系統(tǒng)用于實現(xiàn)AGV與地面控制站及地面監(jiān)控設(shè)備之間的信息交換[2]。在本文中AGV的通訊系統(tǒng)采用一問一答式,上位機發(fā)送詢問數(shù)據(jù),AGV控制板在接收到數(shù)據(jù)之后,根據(jù)接收到的數(shù)據(jù)進(jìn)行回應(yīng)或者不回應(yīng),通過詢問數(shù)據(jù)對AGV小車進(jìn)行控制。
Socket作為進(jìn)程通信機制,是2個程序之間進(jìn)行雙向數(shù)據(jù)傳輸?shù)木W(wǎng)絡(luò)通訊端點,用一個地址和一個端口號標(biāo)識[3]。Socket通常也稱作“套接字”,用于描述IP地址和端口。
在通信過程中,客戶端主動打開連接,服務(wù)器端是被動的[4]。當(dāng)客戶端和服務(wù)端彼此交換數(shù)據(jù)前,必須先在雙方之間建立一個TCP連接之后才能傳輸數(shù)據(jù)[5]。
服務(wù)器端的Socket至少需要兩個,一個負(fù)責(zé)接收客戶端的連接請求,但是不負(fù)責(zé)與客戶端的通信;當(dāng)服務(wù)端接收到客戶端的連接后便會在服務(wù)端產(chǎn)生一個負(fù)責(zé)通信的Socket,這個Socket是在收到客戶端的連接時創(chuàng)建。
客戶端的Socket必須指定要連接的服務(wù)端的IP地址和端口;通過創(chuàng)建一個Socket對象來初始化一個到服務(wù)端的TCP連接。
服務(wù)端先初始化Socket,通過bind函數(shù)與端口綁定,調(diào)用listen函數(shù)對端口進(jìn)行監(jiān)聽,再調(diào)用accept函數(shù)等待客戶端的連接。當(dāng)有客戶端初始化一個Socket后,調(diào)用connect函數(shù)與服務(wù)端進(jìn)行連接,服務(wù)端接收到客戶端的連接請求并連接成功后,這時客戶端就可以發(fā)送數(shù)據(jù)請求,服務(wù)端接收并處理請求,然后把回應(yīng)數(shù)據(jù)發(fā)送給客戶端,客戶端讀取數(shù)據(jù),一次服務(wù)端與客戶端的交互結(jié)束。
圖1 AGV小車控制系統(tǒng)通信流程圖
當(dāng)打開服務(wù)端軟件后,先是服務(wù)端開始監(jiān)聽并且接受AGV小車發(fā)來的連接請求,連接成功后便可以向AGV小車核心板發(fā)送數(shù)據(jù),如果AGV小車成功接收到數(shù)據(jù)并作出相應(yīng)指令,會向服務(wù)端回應(yīng)信息,顯示在相應(yīng)區(qū)域,回應(yīng)信息分為AGV當(dāng)前實時狀態(tài)和每條詢問指令成功接收的應(yīng)答信息。
2.2.1 創(chuàng)建一個負(fù)責(zé)監(jiān)聽的Socket
部分代碼如下:
Socket SocketWatch = new Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
IPAddress ip = IPAddress.Any;
IPEndPoint point = new IPEndPoint(ip,Convert.ToInt32(txtPort.Text));
SocketWatch.Bind(point);
ShowMsg("監(jiān)聽成功/r/n");
SocketWatch.Listen(10);
首先新實例初始化Socket類使用指定的地址族、流式套接字和TCP協(xié)議;
接下來提供Internet協(xié)議(IP)地址,并偵聽所有網(wǎng)絡(luò)接口上的客戶端活動的IP地址;
然后新實例初始化IPEndPoint類具有指定的地址和端口號;
使用Bind()函數(shù)將IP地址、端口號與負(fù)責(zé)監(jiān)聽的Socket相關(guān)聯(lián);
使用SocketWatch對象的Listen()函數(shù)使監(jiān)聽的Socket處于偵聽狀態(tài);
最后當(dāng)打開服務(wù)端軟件時在ShowMsg對話框顯示監(jiān)聽成功。
2.2.2 創(chuàng)建一個負(fù)責(zé)通信的Socket
部分代碼如下:
Socket socketsend = SocketWatch.Accept();
ShowMsg(socketsend.RemoteEndPoint.ToString() + ":" + "連接成功" + "/r/n");
為了接收來自客戶端的連接請求,使用Socket類中的Accept()函數(shù)創(chuàng)建一個新的Socket用于與客戶端進(jìn)行通信;當(dāng)連接成功后則會在ShowMsg對話框顯示連接成功。
2.2.3 接收和發(fā)送消息
int r=socketsend.Receive(buffer);
ShowMsg(socketsend.RemoteEndPoint.ToString() + ":" + str + "/r/n");
使用Socketsend對象中的Receive()函數(shù)接收客戶端發(fā)來的消息并存儲到接收緩沖區(qū)中,最后將其顯示在ShowMsg對話框中。
socketsend.Send(buffer);
使用Socketsend對象中的Send()函數(shù)向客戶端發(fā)送消息。
在本控制系統(tǒng)中,上位機向AGV核心板發(fā)送的為十六進(jìn)制數(shù)據(jù),共14個字節(jié)。其中起始碼占1個字節(jié),為通信開始標(biāo)志位;功能碼占1個字節(jié),代表詢問指令功能;數(shù)據(jù)碼占5個字節(jié),代表對應(yīng)的數(shù)據(jù)碼含義;預(yù)留5個字節(jié),為無效數(shù)據(jù)位;結(jié)束碼占1個字節(jié),為通信結(jié)束標(biāo)志位;校驗碼占1個字節(jié),為前邊所有碼相加除以256的余數(shù)。例如AA C1 00 03 E8 03 E8 00 00 00 00 00 BB 11為14個字節(jié),其所代表的含義為AGV小車向前運行,左右電機轉(zhuǎn)速為1000 rpm/min。
因為要計算校驗碼,所以需要將前邊所有編碼提取出來轉(zhuǎn)化為int類型相加除以256求余,求出來的余數(shù)為校驗碼,再將所有的編碼轉(zhuǎn)換成string類型進(jìn)行相加;由于只能發(fā)送Byte類型的數(shù)據(jù),最后將相加的string類型編碼轉(zhuǎn)換成Byte類型則為最終要發(fā)送的編碼。
部分代碼如下:
int[] suma = new int[8];
suma[0] = Convert.ToInt32(str[0],16);
將所有編碼轉(zhuǎn)化成int類型。
int sum=new int();
for (int i=0;i { sum+=suma[i]; } int check=sum%256; 使用for循環(huán)將所有轉(zhuǎn)化成int類型的編碼相加,最后再求余得出校驗碼。 圖2 界面設(shè)計 如圖2所示,TextBox1為服務(wù)端IP地址,TextBox2為端口號,TextBox3顯示AGV小車的返回信息,TextBox4和5可以調(diào)節(jié)AGV小車左右電機的轉(zhuǎn)速,TextBox 6和7可以控制AGV小車升降平臺的升降高度和速度。當(dāng)AGV小車啟動后,PC端連接WIFI,輸入IP地址和端口號再點擊連接按鈕,就會收到AGV小車的連接請求,連接成功后會在TextBox 3顯示連接成功,如果AGV小車行進(jìn)或升降過程中出現(xiàn)異常情況,可以立即點擊停止按鈕就會停止設(shè)備,界面中其他按鈕則實現(xiàn)其相對應(yīng)的功能。 由于AGV核心控制板只預(yù)留了RS232接口,RS232接口支持全雙工、不間斷通信;再使用WIFI串口服務(wù)器將RS232接口轉(zhuǎn)換成WIFI,然后安裝好WIFI天線,就能夠使用筆記本電腦等設(shè)備進(jìn)行連接。 AGV 與上位機采用一問一答式通信,每當(dāng)上位機發(fā)送的指令被AGV成功接收到后會進(jìn)行回應(yīng);每條詢問指令成功接收的應(yīng)答信息共14個字節(jié)。其中起始碼、功能碼、結(jié)束碼和校驗碼各占1個字節(jié);數(shù)據(jù)碼占2個字節(jié),01代表設(shè)置成功,00代表設(shè)置失?。活A(yù)留8個字節(jié)。 完成所有設(shè)計后,開始進(jìn)行實際實驗。為AGV小車設(shè)計L型路徑,分別進(jìn)行前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)和上升、下降操作,再進(jìn)行停止升降和停止移動操作,最后點擊查詢狀態(tài)按鈕查詢AGV當(dāng)前狀態(tài)。進(jìn)行操作時AGV的應(yīng)答信息如表1所示。 表1 操作時AGV應(yīng)答信息 由應(yīng)答信息可知,所有操作的數(shù)據(jù)碼為01,即證明設(shè)置成功;由查詢狀態(tài)按鈕返回的信息可知當(dāng)前升降板處在720 mm的高度。 從實驗結(jié)果看,上位機控制系統(tǒng)操作AGV小車更加方便,保證了小車行駛過程中人員的安全。在實驗過程中,上位機與AGV小車通信良好,AGV小車能夠?qū)ι衔粰C所發(fā)出的指令迅速做出反應(yīng),Socket服務(wù)端界面中的所有功能均運行正常。AGV小車如圖3所示。 圖3 AGV小車實際圖 基于Socket通信的AGV小車上位機控制系統(tǒng),其主要優(yōu)點有:在復(fù)雜實驗環(huán)境下,使用Socket無線控制AGV小車,便于操作人員在遠(yuǎn)距離條件下對AGV小車的控制,提高了實驗效率,保證了在實驗環(huán)境下操作人員的安全。2.3 服務(wù)端界面設(shè)計
2.4 客戶端模塊
3 實際測試
4 結(jié)束語