库卡机器人KR 3 R540,库卡机器人KR 4 AGILUS,库卡机器人KR 4 R600,库卡机器人KR 6 R900-2,库卡机器人KR 10 R1100,库卡机器人KR 10 R1420,库卡机器人KR 16 R1610-2,库卡机器人KR 20 R1810,库卡机器人KR 20 R2100,库卡机器人KR 70 R2100-2,库卡机器人KR 210 R2700-2,库卡机器人KR 360 R2830,库卡机器人KR 500 R2830,库卡机器人KR 120 R3200 PA,库卡机器人KR 180 R3200 PA,库卡机器人KR 240 PA,库卡机器人KR 470-2 PA等。
private void button1_Click(object sender, EventArgs e){ OpenTCP();}/// /// TCP放在后台线程/// private void OpenTCP(){ //新建一个托付线程 ThreadStart myThreadDelegate = new ThreadStart(Listen); //实例化新线程 myThread = new Thread(myThreadDelegate); myThread.Start(); }/// /// 创立TCP服务端并监听/// public void Listen()//创立tcp服务端{ //设置端口 setPort = 59152; //初始化SOCKET实例 newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); //允许SOCKET被绑定在已使用的地址上。 newsock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); //初始化终结点实例 localEP = new IPEndPoint(IPAddress.Parse("172.31.1.250"), setPort); try { _sessionTable = new Hashtable(53); //绑定 newsock.Bind(localEP); //监听 newsock.Listen(10); //开始承受衔接,异步。= newsock.BeginAccept(new AsyncCallback(OnConnectRequest), newsock); } catch (Exception ex) { } }/// /// 客户端衔接/// /// public void OnConnectRequest(IAsyncResult ar){ //初始化一个SOCKET,用于其它客户端的衔接 server1 = (Socket)ar.AsyncState; Client[theIndex] = server1.EndAccept(ar); DateTimeOffset now = DateTimeOffset.Now; Byte[] byteDateLine = new Byte[65534]; remote = Client[theIndex].RemoteEndPoint; //把衔接成功的客户端的SOCKET实例放入哈希表 _sessionTable.Add(Client[theIndex].RemoteEndPoint, null); //等候新的客户端衔接 theListClient[theIndex, 0] = Client[theIndex].RemoteEndPoint.ToString(); theListClient[theIndex, 1] = "1"; server1.BeginAccept(new AsyncCallback(OnConnectRequest), server1); theIndex++; int myIndex = theIndex - 1; while (true) { try { if (theListClient[myIndex, 1] == "0") return; Thread.Sleep(150); int recv = Client[myIndex].Receive(byteDateLine); string stringdata = Encoding.UTF8.GetString(byteDateLine, 0, recv); string ip = Client[myIndex].RemoteEndPoint.ToString(); //承受到客户端音讯 if (stringdata != "") { MessageBox.Show(stringdata); } //显示客户端发送过来的信息 } catch (Exception ex) { //从列表中移除通讯失利的客户端 string ip = Client[myIndex].RemoteEndPoint.ToString(); _sessionTable.Remove(Client[myIndex].RemoteEndPoint); for (int i = 0; i < 256; i++) { if (Client[myIndex].RemoteEndPoint.ToString() == theListClient[i, 0]) theListClient[i, 1] = "0"; } break; } }}经过按钮事件,创立后台线程用于TCP服务端,创立服务端并开启监听后,就能够等候机器人客户端发来的音讯了。
库卡机器人TCP通讯存在三种数据发送格局:固定长度字节,任意长度字节,和xml格局。个人感觉xml格局比较好用,这儿介绍xml的通讯。
xml的通讯,其实能够分解为几个步骤:
机器人发送到上位机:机器人程序将变量或者数值写入xml的元素中→机器人将xml发送经过服务端发送到上位机的服务端→服务端承受到数据,按照xml的格局解析其中元素。
RET=EKI_Init("XmlCallBack")//初始化xml文件RET=EKI_Open("XmlCallBack")//翻开(相当于客户端请求衔接)//将变量或值写入到xml文件的元素中;FOLD Write data to connection ; Writeto frame "" Y="" Z="" A="" B="" C="" /> RET=EKI_Set("XmlCallBack","Robot/Data/LastPos", TOOL_DATA[1]) ; Write real to Frame "" /> RET=EKI_SetReal("XmlCallBack","Robot/Data/ActPos/@X", 1000.12) ; Write int toStatus> RET=EKI_SetInt("XmlCallBack","Robot/Status", 12345678) ; Write string toMode> RET=EKI_SetString("XmlCallBack","Robot/Mode","ConnectSensor") ; Write bool toLightOn> RET=EKI_SetBool("XmlCallBack","Robot/RobotLamp/GrenLamp/LightOn",true);ENDFOLD (Write data to connection)//发送xml到服务端RET = EKI_Send("XmlCallBack","Robot")
上位机服务端获取到的数据是:
12345678ConnectSensor1
然后对数据进行逐一元素的解析就能够了。要添加变量,只要对应在mxl文件,机器人程序和上位机解析过程中添加就能够了。
上位机发送到机器人:上位机将变量写成xml格局,利用客户端发送到机器人中的xml文件→机器人读取xml文件中的元素值到程序中的变量
写成xml格局:
sendstr = sendstr + "FALSE";
sendstr = sendstr + "