由於本人在工業自動化行業做機器視覺的工作,所以除了圖像處理方面要掌握外,還需要與工業機器人進行通信。最近學習了計算機與川崎機器人的TCP/IP通信,於是在這里記錄一下。
除了直接與機器人通信外,有一種方式是通過PLC間接通信,附上我的另一篇文章,講c#與三菱PLC通信的:C#與三菱PLC通信
首先假設一個簡單的應用情況,有一台帶相機的工業機器人,需要在機器人移動到某位置時,發出信號,然后視覺系統拍照並處理,最后將返回信號發送回機器人。這個程序就是以這個應用為基礎寫的。下圖是機器人示教器上的程序:移動到P1點后,給計算機發送拍照信號photo=1,然后計算機處理后返回over=1,機器人收到后移動到P2點。
圖片2
機器人示教器上面的程序十分簡單,然后說明計算機上的程序。
首先是建立計算機與機器人的TCP鏈接,這里以計算機為客戶端,機器人為服務端。
- public void ConnectRobot()//鏈接tcp
- {
- byte[] data = new byte[1024];
- newclient_Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- string ipadd = "192.168.30.238";//機器人IP地址
- int port = Convert.ToInt32("23");//端口號
- IPEndPoint ie = new IPEndPoint(IPAddress.Parse(ipadd), port);
- try
- {
- newclient_Client.Connect(ie);//建立連接
- Connected_Client = true;//連接標志位
- btnConn.Enabled = false;
- sendToRobot("as\r\n");//建立連接后,首先發送as,則可以通過計算機發送as語言指令
- SetTishi("機器人鏈接成功...");//顯示
- }
- catch (SocketException e)
- {
- SetTishi("連接機器人失敗 " + e.Message);
- return;
- }
- <span style="white-space:pre;"> </span>//用於監聽機器人是否發送數據
- ThreadStart myThreaddelegate = new ThreadStart(ReceiveMsg);
- myThread_client = new Thread(myThreaddelegate);
- myThread_client.Start();
- }
TCP通信的基本知識不在這里講,這里要說明的是connect后為什么有一句向機器人發送“as”。在川崎機器人E系列TCP/IP通信手冊中,有如下內容:
即,在connect后首先向機器人發送"as"后,可以直接從計算機發送機器人的AS語言指令。這樣,就可以實現從計算機上對機器人程序進行控制。
建立連接后,要做的就是收發信息了。計算機向機器人發信息很簡單,因為計算機可以向機器人發送as語言指令,所以就是簡單的TCP發送消息就可以了,如直接發送“over=1”,機器人就可以獲取得到了。需要說的是機器人向計算機發送消息,在本程序中沒有采用在機器人中建立TCP服務器然后監聽的方法,而是在計算機中實現該功能。本方法利用的是川崎機器人as語言中的list指令,list指令的功能是顯示所有程序步驟和變量,而要查詢變量photo的值,只需要向機器人發送“list/r photo”,這樣就可以得到變量photo的值。這樣就可以通過計算機端不斷查詢,達到了機器人發送數據的效果,從而簡化了機器人程序,復雜性降低。以下是監聽代碼:
- public void ReceiveMsg()//監聽tcp
- {
- int thelastData = 999;
- while (true)
- {
- try
- {
- byte[] data = new byte[1024];
- int recv = newclient_Client.Receive(data);//接收消息
- string stringdata = Encoding.UTF8.GetString(data, 0, recv);//將bytes轉換為字符
- //string stringdata = Encoding.Unicode.GetString(data, 0, recv);
- if (stringdata == "")//判斷是否斷開連接
- {
- SetTishi("服務器已退出");
- newclient_Client.Close();
- Connected_Client = false;
- break;
- }
- //利用AS語言的檢測變量的指令list實現監聽功能
- //因為發送‘list/r photo’監測變量photo的值返回的還有其它字符,所以要去掉這些字符
- stringdata = stringdata.Trim();
- string strTemp = "photo =";
- int iCount = stringdata.IndexOf(strTemp);//得到多余字符的長度
- if (iCount > 0)
- {
- string read = stringdata.Substring(strTemp.Length + iCount + 1, 2);//去掉多余字符以及photo
- int kk = int.Parse(read);//得到變量photo的值
- if (kk != 0)
- {
- if (thelastData != kk)//信號從0->1才認為收到信號
- {
- SetTishi("接收到機器人拍照信號...");
- sendToRobot("over=1\r\n");//給機器人完成信號
- SetTishi("接收到消息:" + stringdata);
- }
- }
- thelastData = kk;
- }
- }
- catch
- {
- }
- sendToRobot("list/R photo\r\n");//向機器人發送as語言的指令,查詢photo的值
- Thread.Sleep(100);
- }
- }
通過不斷向機器人獲取變量photo的值,當檢測到photo=1時,就可以向機器人發送完成信號over=1,然后機器人程序往下執行。