一种新型轻型机械臂示教软件架构设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一种新型轻型机械臂示教软件架构设计

作者:王祺王堃张璇琛

来源:《软件导刊》2018年第02期

摘要:传统轻型六轴机械臂控制软件构架一般包括控制器、示教器、canopen通讯等部分。传统控制器是一个程序,机械臂动作參数设定时,一个动作信号需要一组控制器參数,大量的数据收发常常引发主线程与其它线程争夺资源而出现死锁,导致主线程不能继续往下执行,出现卡死。对此,使用Qt软件及C++语言,开发了一款新型六轴机械臂控制软件。采用TCP/IP通讯实现程序间通讯,多线程提高单个程序效率,以QTcpSocket类进行网络编程。通过控制轻型六轴机械臂运动实验,证明此控制软件有效、稳定,能解决界面卡死问题,具有良好的可扩展性与可移植性,界面友好,运行流畅。

关键词:TCP/IP通讯;图形界面卡死;QTcpSocket

DOIDOI:10.11907/rjdk.172360

中图分类号:TP319

文献标识码:A 文章编号:1672-7800(2018)002-0124-04

0 引言

图1是六轴轻型机械臂控制系统。控制软件安装在控制器里,示教器是控制器外的触屏。控制器和示教器连在一起是低配的平板电脑,运算和储存要求不高。PCAN又叫做PCAN-USB,是一个CAN转USB接口,通过它可以将CAN网络上的报文通过USB接口传输到PC 上,通过相关软件查看CAN报文。PCAN的另一端连接控制器CAN卡,CAN卡与六轴机械臂相连。使用Qt编写程序,语言为C++。

1 界面卡死原因

“界面卡死”是计算机系统由于过量的进程资源消耗,使图形界面进程受到影响的现象。控制程序较为复杂的指令有发送和接收报文、进行运动轨迹规划等。用户通过示教器的图形界面发出指令,在进行稍微复杂的处理时就会有延迟,使得界面(GUI)卡死。对此进行改进,将控制器的程序拆分为两个,如图2所示。一个程序是用户界面程序(GUI),称为RH-LBR,负责收集用户指令,另一个程序Communication_APP专门负责收集下位机发来的报文,以及通过GUI指令向下位机发送指令。这样耗时的处理都由Communication_APP来处理,用户交互界面RH-LBR不会被卡死。两个程序之间的通讯模式为TCP/IP。

2 建立TCP通讯

下面分别介绍RH_LBR和Communication_APP这两个程序里负责通讯的类。

CIRT_LBR_GUI类定义RH_LBR程序的GUI,有信号与槽函数和ControllerSocket类互通消息。ControllerSocket类定义TCP里的用户端类。Communication_APP程序里有TcpTransaction 类,主要定义TCP里的服务器端,见图3。

在RH_LBR程序的ControllerSocket类中,重要函数如下:①void ControllerSocket::connectToController()建立TCP连接;②void ControllerSocket::readMessage()接收Communication_APP这个程序发来的信息,会有对应的sendMessage函数在Communication_APP程序里;③void ControllerSocket::writeBytes(const QString & Message)传输信息,使Communication_APP可以接收到信息。

在Communication_APP程序的TcpTransaction类中,重要函数有:①void TcpTransaction::sessionOpened()。TCP通信的网络配置槽函数;②void TcpTransaction::readMessage()。获取用户程序发送的全部报文,并解析后通过信号发送给子线程:HS_Interface;③void TcpTransaction::sendMessage(const QString & Message)。通过本函数将需要发送ControllerSocket类的信息发送出去。

2.1 RH_LBR用户界面程序两个主要类

RH_LBR程序里有两个主要类:CIRT_LBR_GUI和ControllerSocket类。

在CIRT_LBR_GUI类中用信号与槽函数调用ControllerSocket类中的startTCPConnection ()函数,建立TCP连接。

void CIRT_LBR_GUI::initTCPConnection()

{

开始新建socket的线程和socket的对象

TCPConnectionThread=new QThread;

controllerSocket=new ControllerSocket;

controllerSocket->moveToThread(TCPConnectionThread);

下一行代码表示用GUI界面的信号函数触发ControllerSocket类的TCP连接函数:

connect(this,SIGNAL(startTCPConnection()),controllerSocket,SLOT (startTCPConnection()));

下一行代码表示ControllerSocket类的TCP连接结果反馈给GUI界面:

connect(controllerSocket,SIGNAL(socketConnectionResult(bool)),this,SLOT (getSocketConnectionResult(bool)));

TCPConnectionThread->start();开始事件循环}

下面是ControllerSocket类中定义的一些参数和槽函数。

QString ControllerSocket::hostName="127.0.0.1";TCP主机名,不是实际的,可自行设定

int ControllerSocket::portNo=30001;TCP端口名

QTcpSocket*socket;

QDataStream dataInputStream;

ControllerSocket::ControllerSocket(QObject*parent):QObject(parent)

{socket=new QTcpSocket(this);新建socket

connect(socket,SIGNAL(connected()),this,SLOT(onConnected()));

connect(socket,SIGNAL(disconnected()),this,SLOT(onDisconnected()));

connect(socket,SIGNAL(readyRead()),this,SLOT(readMessage()));读取socket发来的信息

}

void ControllerSocket::startTCPConnection()

{connectToController();}

void ControllerSocket::connectToController()

{socket->connectToHost(hostName,portNo);

if(!socket->waitForConnected())

{qDebug()

相关文档
最新文档