首先假设一个简单的应用情况,有一台带相机的工业机器人,需要在机器人移动到某位置时,发出信号,然后视觉系统拍照并处理,最后将返回信号发送回机器人。这个程序就是以这个应用为基础写的。下图是机器人示教器上的程序:移动到P1点后,给计算机发送拍照信号photo=1,然后计算机处理后返回over=1,机器人收到后移动到P2点。
图片2
机器人示教器上面的程序十分简单,然后说明计算机上的程序。
首先是建立计算机与机器人的TCP链接,这里以计算机为客户端,机器人为服务端。
- public void ConnectRobot()
- {
- byte[] data = new byte[1024];
- newclient_Client = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
- string ipadd = "192.168.30.238";
- 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");
- 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()
- {
-
- 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);
-
- if (stringdata == "")
- {
- SetTishi("服务器已退出");
- newclient_Client.Close();
- Connected_Client = false;
- break;
- }
-
-
- stringdata = stringdata.Trim();
- string strTemp = "photo =";
- int iCount = stringdata.IndexOf(strTemp);
- if (iCount > 0)
- {
- string read = stringdata.Substring(strTemp.Length + iCount + 1, 2);
- int kk = int.Parse(read);
- if (kk != 0)
- {
-
- if (thelastData != kk)
- {
- SetTishi("接收到机器人拍照信号...");
- sendToRobot("over=1\r\n");
- SetTishi("接收到消息:" + stringdata);
- }
- }
- thelastData = kk;
- }
- }
- catch
- {
-
- }
- sendToRobot("list/R photo\r\n");
- Thread.Sleep(100);
-
- }
- }
通过不断向机器人获取变量photo的值,当检测到photo=1时,就可以向机器人发送完成信号over=1,然后机器人程序往下执行。