川崎機器人c#通訊(轉)


由於本人在工業自動化行業做機器視覺的工作,所以除了圖像處理方面要掌握外,還需要與工業機器人進行通信。最近學習了計算機與川崎機器人的TCP/IP通信,於是在這里記錄一下。

除了直接與機器人通信外,有一種方式是通過PLC間接通信,附上我的另一篇文章,講c#與三菱PLC通信的:C#與三菱PLC通信

首先假設一個簡單的應用情況,有一台帶相機的工業機器人,需要在機器人移動到某位置時,發出信號,然后視覺系統拍照並處理,最后將返回信號發送回機器人。這個程序就是以這個應用為基礎寫的。下圖是機器人示教器上的程序:移動到P1點后,給計算機發送拍照信號photo=1,然后計算機處理后返回over=1,機器人收到后移動到P2點。

圖片2圖片2

機器人示教器上面的程序十分簡單,然后說明計算機上的程序。

首先是建立計算機與機器人的TCP鏈接,這里以計算機為客戶端,機器人為服務端。

[csharp] view plain copy
 
  1. public void ConnectRobot()//鏈接tcp  
  2.         {  
  3.             byte[] data = new byte[1024];  
  4.             newclient_Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  
  5.             string ipadd = "192.168.30.238";//機器人IP地址  
  6.             int port = Convert.ToInt32("23");//端口號  
  7.             IPEndPoint ie = new IPEndPoint(IPAddress.Parse(ipadd), port);  
  8.             try  
  9.             {  
  10.                 newclient_Client.Connect(ie);//建立連接  
  11.                 Connected_Client = true;//連接標志位           
  12.                 btnConn.Enabled = false;  
  13.                 sendToRobot("as\r\n");//建立連接后,首先發送as,則可以通過計算機發送as語言指令  
  14.                 SetTishi("機器人鏈接成功...");//顯示  
  15.   
  16.   
  17.             }  
  18.             catch (SocketException e)  
  19.             {  
  20.                 SetTishi("連接機器人失敗  " + e.Message);  
  21.                 return;  
  22.             }  
  23. <span style="white-space:pre;">     </span>//用於監聽機器人是否發送數據  
  24.             ThreadStart myThreaddelegate = new ThreadStart(ReceiveMsg);  
  25.             myThread_client = new Thread(myThreaddelegate);  
  26.             myThread_client.Start();  
  27.   
  28.   
  29.         }  

TCP通信的基本知識不在這里講,這里要說明的是connect后為什么有一句向機器人發送“as”。在川崎機器人E系列TCP/IP通信手冊中,有如下內容:

圖片1

即,在connect后首先向機器人發送"as"后,可以直接從計算機發送機器人的AS語言指令。這樣,就可以實現從計算機上對機器人程序進行控制。

建立連接后,要做的就是收發信息了。計算機向機器人發信息很簡單,因為計算機可以向機器人發送as語言指令,所以就是簡單的TCP發送消息就可以了,如直接發送“over=1”,機器人就可以獲取得到了。需要說的是機器人向計算機發送消息,在本程序中沒有采用在機器人中建立TCP服務器然后監聽的方法,而是在計算機中實現該功能。本方法利用的是川崎機器人as語言中的list指令,list指令的功能是顯示所有程序步驟和變量,而要查詢變量photo的值,只需要向機器人發送“list/r photo”,這樣就可以得到變量photo的值。這樣就可以通過計算機端不斷查詢,達到了機器人發送數據的效果,從而簡化了機器人程序,復雜性降低。以下是監聽代碼:

 

[csharp] view plain copy
 
  1. public void ReceiveMsg()//監聽tcp  
  2.         {  
  3.   
  4.             int thelastData = 999;  
  5.             while (true)  
  6.             {  
  7.                 try  
  8.                 {  
  9.   
  10.                     byte[] data = new byte[1024];  
  11.                     int recv = newclient_Client.Receive(data);//接收消息  
  12.                     string stringdata = Encoding.UTF8.GetString(data, 0, recv);//將bytes轉換為字符  
  13.                     //string stringdata = Encoding.Unicode.GetString(data, 0, recv);  
  14.                     if (stringdata == "")//判斷是否斷開連接  
  15.                     {  
  16.                         SetTishi("服務器已退出");  
  17.                         newclient_Client.Close();  
  18.                         Connected_Client = false;  
  19.                         break;  
  20.                     }  
  21.                     //利用AS語言的檢測變量的指令list實現監聽功能  
  22.                     //因為發送‘list/r photo’監測變量photo的值返回的還有其它字符,所以要去掉這些字符  
  23.                     stringdata = stringdata.Trim();  
  24.                     string strTemp = "photo    =";  
  25.                     int iCount = stringdata.IndexOf(strTemp);//得到多余字符的長度  
  26.                     if (iCount > 0)  
  27.                     {  
  28.                         string read = stringdata.Substring(strTemp.Length + iCount + 1, 2);//去掉多余字符以及photo  
  29.                         int kk = int.Parse(read);//得到變量photo的值  
  30.                         if (kk != 0)  
  31.                         {  
  32.   
  33.                             if (thelastData != kk)//信號從0->1才認為收到信號  
  34.                             {  
  35.                                 SetTishi("接收到機器人拍照信號...");  
  36.                                 sendToRobot("over=1\r\n");//給機器人完成信號  
  37.                                 SetTishi("接收到消息:" + stringdata);  
  38.                             }  
  39.                         }  
  40.                         thelastData = kk;  
  41.                     }  
  42.                 }  
  43.                 catch  
  44.                 {  
  45.   
  46.                 }  
  47.                 sendToRobot("list/R photo\r\n");//向機器人發送as語言的指令,查詢photo的值  
  48.                 Thread.Sleep(100);  
  49.   
  50.             }  
  51.         }  

通過不斷向機器人獲取變量photo的值,當檢測到photo=1時,就可以向機器人發送完成信號over=1,然后機器人程序往下執行。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM