1. <abbr id="oxsup"></abbr>
      • <var id="oxsup"><optgroup id="oxsup"></optgroup></var><abbr id="oxsup"></abbr>
        丰满的女房东在线观看6,日本一卡二卡三卡四卡2021,黄网站欧美内射,久久精品国产99国产精2018 ,久久只有精品免费观看国产 ,超碰97人人密牙,婷婷亚洲国产成人精品性色,久久人人爽人人爽人人片va

        18621383605

        上海市寶山區(qū)富聯(lián)一路98號(hào)6棟

        側(cè)邊懸浮
        主頁(yè) > 新聞動(dòng)態(tài) > 行業(yè)新聞

        上位機(jī)C#通過(guò)TCPIP和庫(kù)卡機(jī)器人通訊

        2020-02-14 17:24:08

        上位機(jī)C#通過(guò)TCPIP和庫(kù)卡機(jī)器人通訊

        注:本文章文字、圖片部分來(lái)自網(wǎng)絡(luò)
        版權(quán)歸原作者,侵刪。
        您是否對(duì)將工業(yè)自動(dòng)化集成到您的設(shè)施中感興趣?如果是這樣,那么您應(yīng)該致電工業(yè)自動(dòng)化和集成領(lǐng)域的領(lǐng)導(dǎo)者工博士。工博士是包括FANUC,Yaskawa,KUKA,KawasakiABB在內(nèi)的多家不同機(jī)器人公司的認(rèn)證集成商。我們的員工致力于幫助您為您的行業(yè)和預(yù)算構(gòu)建和定制完美的自動(dòng)化系統(tǒng)。
        因?yàn)楸疚牟皇墙榻B該軟件的安裝,所以就不多做解釋?zhuān)旅娴膬?nèi)容默認(rèn)已經(jīng)能用自帶的測(cè)試軟件獲取庫(kù)卡機(jī)器人發(fā)送過(guò)來(lái)的數(shù)據(jù)。在此基礎(chǔ)上,我來(lái)說(shuō)一下c#利用tcp/ip是如何跟庫(kù)卡機(jī)器人進(jìn)行通訊的.
         
        首先當(dāng)然是TCP/IP的基礎(chǔ)部分,服務(wù)器和客戶(hù)端。這里將庫(kù)卡機(jī)器人作為客戶(hù)端,上位機(jī)作為服務(wù)器進(jìn)行通訊。
         
        private void button1_Click(object sender, EventArgs e)
                {
                    OpenTCP();
                }
                /// <summary>
                /// TCP放在后臺(tái)線(xiàn)程
                /// </summary>
                private void OpenTCP()
                {
                    //新建一個(gè)委托線(xiàn)程
                    ThreadStart myThreadDelegate = new ThreadStart(Listen);
                    //實(shí)例化新線(xiàn)程
                    myThread = new Thread(myThreadDelegate);
                    myThread.Start();
         
         
                }
                /// <summary>
                /// 創(chuàng)建TCP服務(wù)端并監(jiān)聽(tīng)
                /// </summary>
                public void Listen()//創(chuàng)建tcp服務(wù)端
                {   //設(shè)置端口
                    setPort = 59152;
                    //初始化SOCKET實(shí)例
                    newsock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    //允許SOCKET被綁定在已使用的地址上。
                    newsock.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
                    //初始化終結(jié)點(diǎn)實(shí)例
                    localEP = new IPEndPoint(IPAddress.Parse("172.31.1.250"), setPort);
                    try
                    {
                        _sessionTable = new Hashtable(53);
                        //綁定
                        newsock.Bind(localEP);
                        //監(jiān)聽(tīng)
                        newsock.Listen(10);
                        //開(kāi)始接受連接,異步。=
                        newsock.BeginAccept(new AsyncCallback(OnConnectRequest), newsock);
                    }
                    catch (Exception ex)
                    {
         
                    }
         
                }
                /// <summary>
                /// 客戶(hù)端連接
                /// </summary>
                /// <param name="ar"></param>
                public void OnConnectRequest(IAsyncResult ar)
                {
                    //初始化一個(gè)SOCKET,用于其它客戶(hù)端的連接
         
                    server1 = (Socket)ar.AsyncState;
                    Client[theIndex] = server1.EndAccept(ar);
                    DateTimeOffset now = DateTimeOffset.Now;
                    Byte[] byteDateLine = new Byte[65534];
                    remote = Client[theIndex].RemoteEndPoint;
                    //把連接成功的客戶(hù)端的SOCKET實(shí)例放入哈希表
                    _sessionTable.Add(Client[theIndex].RemoteEndPoint, null);
         
                    //等待新的客戶(hù)端連接
                    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();
         
                            //接受到客戶(hù)端消息
                            if (stringdata != "")
                            {
                                MessageBox.Show(stringdata);
                            }
                            //顯示客戶(hù)端發(fā)送過(guò)來(lái)的信息
         
                        }
                        catch (Exception ex)
                        {
                            //從列表中移除通訊失敗的客戶(hù)端
                            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;
                        }
                    }
         
                }
        通過(guò)按鈕事件,創(chuàng)建后臺(tái)線(xiàn)程用于TCP服務(wù)端,創(chuàng)建服務(wù)端并開(kāi)啟監(jiān)聽(tīng)后,就可以等待機(jī)器人客戶(hù)端發(fā)來(lái)的消息了。
         
         庫(kù)卡機(jī)器人TCP通訊存在三種數(shù)據(jù)發(fā)送格式:固定長(zhǎng)度字節(jié),任意長(zhǎng)度字節(jié),和xml格式。個(gè)人感覺(jué)xml格式比較好用,這里介紹xml的通訊。
         
        xml的通訊,其實(shí)可以分解為幾個(gè)步驟:
         
        機(jī)器人發(fā)送到上位機(jī):機(jī)器人程序?qū)⒆兞炕蛘邤?shù)值寫(xiě)入xml的元素中→機(jī)器人將xml發(fā)送通過(guò)服務(wù)端發(fā)送到上位機(jī)的服務(wù)端→服務(wù)端接受到數(shù)據(jù),按照xml的格式解析其中元素。
         
        RET=EKI_Init("XmlCallBack")//初始化xml文件
        RET=EKI_Open("XmlCallBack")//打開(kāi)(相當(dāng)于客戶(hù)端請(qǐng)求連接)
        //將變量或值寫(xiě)入到xml文件的元素中
        ;FOLD Write data to connection
          ; Write frame to <LastPos X="" Y="" Z="" A="" B="" C="" />
          RET=EKI_SetFrame("XmlCallBack","Robot/Data/LastPos", TOOL_DATA[1])
          ; Write real to <ActPos X="" />
          RET=EKI_SetReal("XmlCallBack","Robot/Data/ActPos/@X", 1000.12)
          ; Write int to <Status></Status>
          RET=EKI_SetInt("XmlCallBack","Robot/Status", 12345678)
          ; Write string to <Mode></Mode>
          RET=EKI_SetString("XmlCallBack","Robot/Mode","ConnectSensor")
          ; Write bool to <LightOn></LightOn>
          RET=EKI_SetBool("XmlCallBack","Robot/RobotLamp/GrenLamp/LightOn",true)
        ;ENDFOLD (Write data to connection)
        //發(fā)送xml到服務(wù)端
        RET = EKI_Send("XmlCallBack","Robot")
        上位機(jī)服務(wù)端獲取到的數(shù)據(jù)是:
         
        <Robot><Data><LastPos X="483.980011" Y="7.210000" Z="239.869995" A="0.000000" B="0.000000" C="0.000000"></LastPos><ActPos X="1000.119995"></ActPos></Data><Status>12345678</Status><Mode>ConnectSensor</Mode><RobotLamp><GrenLamp><LightOn>1</LightOn></GrenLamp></RobotLamp></Robot>
        然后對(duì)數(shù)據(jù)進(jìn)行逐個(gè)元素的解析就可以了。要增加變量,只要對(duì)應(yīng)在mxl文件,機(jī)器人程序和上位機(jī)解析過(guò)程中添加就可以了。
         
        上位機(jī)發(fā)送到機(jī)器人:上位機(jī)將變量寫(xiě)成xml格式,利用客戶(hù)端發(fā)送到機(jī)器人中的xml文件→機(jī)器人讀取xml文件中的元素值到程序中的變量
         
        寫(xiě)成xml格式:
         
        sendstr = sendstr + "<Sensor><Status><IsActive>FALSE</IsActive></Status></Sensor>";
        sendstr = sendstr + "<Sensor><Read><xyzabc X='10.0' Y='20.0' Z='30.0' A='40.0' B='50.0' C='60.0'></xyzabc></Read</Sensor>";
         
        然后是tcp發(fā)送
         
        /// <summary>
                /// 將字符串發(fā)送給機(jī)器人
                /// </summary>
                /// <param name="str"></param>
                private void sendToRobot(string str)
                {
                    string sendstr;
                    str = str.Replace(" ", "");
                    string[] fields = str.Split(',');
                    string header = "<Sensor>", tail = "</Sensor>";//變量xml文件中的父元素
         
                    sendstr = header;
                    //設(shè)置xml文件中變量的值,格式:<變量名>變量值</變量名>
                    foreach (string item in fields)
                    {
                        string[] arr = item.Split('=');
                        sendstr += "<" + arr[0] + ">" + arr[1] + "</" + arr[0] + ">";
                    }
                    sendstr += tail;
                    //這些變量的某些中間父元素與前面的不同,所以另外寫(xiě)
                    sendstr = sendstr + "<Sensor><Status><IsActive>FALSE</IsActive></Status></Sensor>";
                    sendstr = sendstr + "<Sensor><Read><xyzabc X='10.0' Y='20.0' Z='30.0' A='40.0' B='50.0' C='60.0'></xyzabc></Read></Sensor>";
                    string strDataLine = sendstr;
                    try
                    {
                        Byte[] sendData = Encoding.UTF8.GetBytes(strDataLine);
         
                        foreach (DictionaryEntry de in _sessionTable)
                        {
                            EndPoint temp = (EndPoint)de.Key;
                            {
                                for (int i = 0; i < theIndex; i++)
                                {
                                    if (theListClient[i, 1] == "1")
                                    {
                                        if (temp.ToString() == theListClient[i, 0])
                                        {
                                            try
                                            {
                                                Client[i].SendTo(sendData, temp);
                                            }
                                            catch (Exception ex)
                                            {
                                                
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    catch
                    { }
                }
        等發(fā)送完成之后,機(jī)器人再讀取
         
        機(jī)器人從xml元素中讀取值或者屬性并賦予創(chuàng)建的變量
          RET=EKI_GetString("XmlCallBack","Sensor/Message",valueChar[])
          RET=EKI_GetInt("XmlCallBack","Sensor/Nmb",valueInt)
          RET=EKI_GetBool("XmlCallBack","Sensor/Status/IsActive" ,valueBOOL)
          RET=EKI_GetFrame("XmlCallBack","Sensor/Read/xyzabc",valueFrame)
        然后就可以在機(jī)器人程序中使用,或者通過(guò)查看變量值檢測(cè)是否正確
         
        本例中的xml文件和機(jī)器人程序文件src由ETHERNETKRL軟件中自帶的測(cè)試?yán)有薷亩鴣?lái)。不用原例子的原因是,原例子只有程序文件src而沒(méi)有數(shù)據(jù)文件dat,程序里的變量都是臨時(shí)變量,無(wú)法在示教器上查詢(xún)變量的值。所以新建了一個(gè)程序,將原例子的變量定義放在dat數(shù)據(jù)文件中,處理過(guò)程放在src程序文件中。另外,對(duì)上位機(jī)發(fā)送到機(jī)器人的元素有做一些刪改。
        ————————————————
        版權(quán)聲明:本文為CSDN博主「千年de小妖」的原創(chuàng)文章,
        原文鏈接:https://blog.csdn.net/qq_29221215/article/details/95759479
        在此處聯(lián)系我們或致電186-1656-9600與我們聯(lián)系,以獲取有關(guān)庫(kù)卡機(jī)器人解決方案和快速簡(jiǎn)便的報(bào)價(jià)。
        了解更多:庫(kù)卡機(jī)器人

        主站蜘蛛池模板: 久章草在线毛片视频播放| 国产乱子伦对白视频| 国产91在线精品免费观看久| 欧洲熟妇色XXXX欧美| 国产精品久久一区二区三区动毛片| 婷婷久久香蕉五月综合加勒比| 伊人久久综合线亚洲2019| 国产亚洲香蕉aⅴ播放| 亚洲国产无套无码AV电影| 人妻换人妻仑乱| 亚洲A∨无码男人的天堂| 极品少妇被猛得白浆直流草莓视频| 国产成视频永久免费| 久久精品国产亚洲AⅤ无码| 久久久国产精品无码免费专区| 色吊丝av熟女中文字幕| 人人爽人人爽人人片a免费| 亚洲Av无码一区二区三区天堂| 欧美日韩一中文字幕| 国产喷水1区2区3区咪咪爱AV | 四虎国产精品永久地址99| 精品国产精品国产偷麻豆| 日韩中文字幕人妻一区| 美女黄网站人色视频免费国产| 国产精品欧美v亚洲v综合一级欧亚精品乱码 | 色欲天堂久久亚洲综合网| 欧美A级毛欧美1| 身为人母免费播放电影| 中文字幕亚洲人妻系列| 久久精品国产99国产精品图片| 91久久国产综合久久| 性欧美乱妇高清come| 老熟妇乱子伦牲交视频欧美| 国产三级av在线播放| 2020天天久久躁日日躁狠狠躁| 免费 无码 国产成年| 一个人看的片免费高清WWW| 亚洲黑人巨大videos| 色二av手机版在线| 国产精品亚洲成在人线| 无码视频一区二区三区|