0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

上位机C#通过TCP/IP和机器人通讯

qianyanjishuhui 来源:爱上PLC 2023-08-15 11:06 次阅读

要想和库卡机器人通讯,首先要给机器人安装“ETHERNETKRL”这个软件,对,是给机器人安装。具体软件的安装以及初步通讯测试就不多做介绍了。

因为本文不是介绍该软件的安装,所以就不多做解释,下面的内容默认已经能用自带的测试软件获取库卡机器人发送过来的数据。在此基础上,我来说一下c#利用tcp/ip是如何跟库卡机器人进行通讯的.

首先当然是TCP/IP的基础部分,服务器和客户端。这里将库卡机器人作为客户端,上位机作为服务器进行通讯。

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
; Write frame to
RET=EKI_SetFrame("XmlCallBack","Robot/Data/LastPos", TOOL_DATA[1])
; Write real to
RET=EKI_SetReal("XmlCallBack","Robot/Data/ActPos/@X", 1000.12)
; Write int to
RET=EKI_SetInt("XmlCallBack","Robot/Status", 12345678)
; Write string to
RET=EKI_SetString("XmlCallBack","Robot/Mode","ConnectSensor")
; Write bool to
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 + "";

然后是tcp发送
///


/// 将字符串发送给机器人
///

///
private void sendToRobot(string str)
{
string sendstr;
str = str.Replace(" ", "");
string[] fields = str.Split(',');
string header = "", tail = "";//变量xml文件中的父元素

sendstr = header;
//设置xml文件中变量的值,格式:<变量名>变量值
foreach (string item in fields)
{
string[] arr = item.Split('=');
sendstr += "<" + arr[0] + ">" + arr[1] + "";
}
sendstr += tail;
//这些变量的某些中间父元素与前面的不同,所以另外写
sendstr = sendstr + "FALSE";
sendstr = sendstr + "";
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
{ }
}

等发送完成之后,机器人再读取

机器人从xml元素中读取值或者属性并赋予创建的变量

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)

然后就可以在机器人程序中使用,或者通过查看变量值检测是否正确。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器人
    +关注

    关注

    210

    文章

    28191

    浏览量

    206486
  • 通讯
    +关注

    关注

    9

    文章

    893

    浏览量

    34831
  • TCP
    TCP
    +关注

    关注

    8

    文章

    1348

    浏览量

    78983
  • 上位机
    +关注

    关注

    27

    文章

    930

    浏览量

    54728

原文标题:上位机C#通过TCP/IP和机器人通讯

文章出处:【微信号:爱上PLC,微信公众号:爱上PLC】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    机器人labview上位程序

    机器人控制labview上位程序
    发表于 03-21 11:48

    现在用WINCC开发上位,如何实现wincc和PB之间的TCP/IP通讯

    现在已有PB开发的系统,预留TCP/IP通讯上位相连。现在用WINCC开发上位
    发表于 06-09 11:44

    履带式移动机器人的设计

    作为一个技术宅,我对机器人和单片很感兴趣。在这里我把自己做过的一款履带式移动机器人的资料分享给大家。欢迎大家吐槽!同时也希望对做机器人的同学有帮助。 该
    发表于 07-27 18:28

    c#/winform c#/wpf c++/QT上位

    c#/winform c#/wpf c++/QT上位,本人从事上位
    发表于 09-21 21:20

    上位全套程序,上位机器人和PLC通讯都是通过以太网总线方式

    ABB机器人、PLC、C#上位全套程序1.项目用的是ABB蜘蛛机器人,六轴用的程序开发都一样2.上位
    发表于 07-01 07:52

    上位机器人和PLC都是如何进行通讯

    ABB蜘蛛机器人六轴用的程序开发都一样吗?上位机器人和PLC都是如何进行通讯的?
    发表于 09-01 07:39

    [求助]W5500 上位通讯程序 TCP/IP协议

    实验室的嵌入式设备用的是W5500,而上位是PC电脑,两者通过网线连到交换机,在同一个局域网内通讯。现要用QT或labview编写上位
    发表于 02-04 10:32

    如何通过IP命令控制机器人

    我有一个连接到 arduino uno 的 ESP8266 模块和一个通过 WiFi 连接到 ESP8266 的智能手机。我正在尝试从 IP(Internet 协议)读取数据,我需要通过 IP
    发表于 02-28 08:23

    ABB机器人如何与相机详细方法通讯图文讲解

    ABB机器人如何与相机通讯1)机器人与相机一般采用socket通讯TCP/IP)。所以
    的头像 发表于 01-27 09:09 1.7w次阅读
    ABB<b class='flag-5'>机器人</b>如何与相机详细方法<b class='flag-5'>通讯</b>图文讲解

    EPSON机器人如何与视觉上位实现TCP通信

    上位开发中经常会有机器人通信,今天跟大家分享一下,EPSON机器人如何与视觉上位实现
    发表于 10-10 15:35 1624次阅读

    什么是EPSON机器人上位TCP通信

    大家好,今天跟大家分享一下,EPSON机器人如何与视觉上位实现TCP通信。
    的头像 发表于 02-22 15:52 3263次阅读
    什么是EPSON<b class='flag-5'>机器人</b>与<b class='flag-5'>上位</b><b class='flag-5'>机</b><b class='flag-5'>TCP</b>通信

    C#上位和松下PLC通讯

    C#上位和松下PLC通讯 1、前言也好久没回来看博客了,看大家对于其他的PLC的需求都是有的,说明搞我们工业控制这一行的人也是很多的。刚好最近基于项目需要,一些新的东西,需要和松下P
    发表于 04-17 11:54 3次下载
    <b class='flag-5'>C#</b><b class='flag-5'>上位</b><b class='flag-5'>机</b>和松下PLC<b class='flag-5'>通讯</b>

    C#编写简易的上位

    标题C#编写简易的上位 代码如下:
    发表于 05-08 09:42 7次下载
    <b class='flag-5'>C#</b>编写简易的<b class='flag-5'>上位</b><b class='flag-5'>机</b>

    ABB机器人上位进行Socket通信的RAPID代码实现(服务端)

    本文采取TCP/IP中Socket的方式实现ABB与上位的通信。其中上位做为客户端,
    发表于 05-29 16:16 1次下载
    ABB<b class='flag-5'>机器人</b>与<b class='flag-5'>上位</b><b class='flag-5'>机</b>进行Socket通信的RAPID代码实现(服务端)

    图文详解ABB机器人如何与相机通讯

    机器人与相机一般采用socket通讯TCP/IP)。所以机器人需要有pc-interface选项。
    发表于 06-11 09:23 1296次阅读
    图文详解ABB<b class='flag-5'>机器人</b>如何与相机<b class='flag-5'>通讯</b>