zoukankan      html  css  js  c++  java
  • 川崎机器人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 ");//建立连接后,首先发送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 ");//给机器人完成信号  
    37.                                 SetTishi("接收到消息:" + stringdata);  
    38.                             }  
    39.                         }  
    40.                         thelastData = kk;  
    41.                     }  
    42.                 }  
    43.                 catch  
    44.                 {  
    45.   
    46.                 }  
    47.                 sendToRobot("list/R photo ");//向机器人发送as语言的指令,查询photo的值  
    48.                 Thread.Sleep(100);  
    49.   
    50.             }  
    51.         }  

    通过不断向机器人获取变量photo的值,当检测到photo=1时,就可以向机器人发送完成信号over=1,然后机器人程序往下执行。

  • 相关阅读:
    LeetCode(65):有效数字
    LeetCode(64):最小路径和
    物理Data Guard的日常维护
    Oracle Data Guard的配置
    SQL基础--完整性约束
    使用rman迁移数据库到异机
    Oracle的表空间和数据文件
    Oracle的控制文件
    Oracle重做日志文件
    RMAN的恢复篇
  • 原文地址:https://www.cnblogs.com/bile/p/8939996.html
Copyright © 2011-2022 走看看