Motoman机器人离线编程——Motocom32库函数的使用与封装

欢迎关注Jungle的Motoman机器人离线编程专栏系列文章:

Motoman机器人离线编程——Motocom32开发简介

Motoman机器人离线编程——Visio Studio环境配置

Motoman机器人离线编程——Motocom32库函数的使用与封装

Motoman机器人离线编程——Motocom32参考文献及注意事项

Motoman机器人离线编程——MotocomES介绍


在上两节中,Jungle介绍了Motocom32的安装( Motoman机器人离线编程——Motocom32开发简介)和Visio Studio 2008中的环境配置(Motoman机器人离线编程——Visio Studio环境配置),在第二篇文章最后,可以看到很多以“Bsc”命名开头的函数,这些都是Motocom32自带的功能函数,用户可以根据需求自行调用和组合这些函数。需要再次强调的是,正如Jungle在第二篇文章里提到的,“在后期的开发过程中,更多的不仅在于调用哪个哪个库函数,更在于整个程序的逻辑。”另一方面,在安装位置的\MOTOCOM32DLL\Help文件夹下有中英文的帮助文档,这个文档及其有用!不仅有简单的开发demo,更包含了各个函数的用法介绍。

1.手册使用及示例说明

Motoman机器人离线编程——Motocom32库函数的使用与封装_第1张图片

在上图左侧的目录中,第七章是对各个功能函数的介绍,将其分为了数据传输(Data Transmission)、机器人控制(Robot Control)、IO读写控制等几类。以具体一个函数为例,比如BscOpen函数,在手册里可以找到该函数的介绍,如下图:

Motoman机器人离线编程——Motocom32库函数的使用与封装_第2张图片

 手册里对该函数的作用、入口参数个数、参数含义、返回值及意义进行了说明。因此,在程序开发中,可以通过下述代码测试是否能够得到一个通讯句柄(communication handler)。通过检测返回值可以判断是否顺利获取了通讯句柄。

        ///获取当前工作目录
	char cur_dir[_MAX_DIR];
	_getcwd(cur_dir,_MAX_DIR);
	///获取当前窗口句柄
	WId hwnd = this->winId();

	///打开以太网通讯
	////short commHWND :通讯句柄
	short commHWND ;
	commHWND = BscOpen(cur_dir,PACKETETHERNET);
	if(commHWND <0)  //返回值小于零:错误;其他:Communication handler number
	{
		QMessageBox::critical(this,"Failure","BscOpen() Wrong!",QMessageBox::Cancel);
		return commHWND ;
	}

 2.函数使用与封装

通过浏览手册可以看到,Motocom封装的函数非常丰富,几乎可以实现在示教器上操作的所有功能。但设计程序不仅仅是要实现客户的需求,同时还需要考虑代码的简洁性、可维护性和可重用性。我们需要将库函数根据需求、按照功能和一定的逻辑进行封装,既能高效完成控制任务,又能便捷调试迅速找到问题所在,这里举个例子,如何对函数封装。

//Function:  连接上位机与机器人.
//Parameters:
//      none.
//Return:1-连接成功;其他-连接失败.
int Robot::connecttoController()
{
        ///b_controllerConnectted是一个连接状态的标识,已经连接为true,否则为false
	if(b_controllerConnectted == true)
		return 1;
	///控制器IP地址
	QString IP = "192.168.255.1";
	char *IPAddress;
	QByteArray tmp = IP.toLatin1();
	IPAddress = tmp.data();

	///获取当前工作目录
	char cur_dir[_MAX_DIR];
	_getcwd(cur_dir,_MAX_DIR);
	///获取当前窗口句柄
	WId hwnd = this->winId();

	///打开以太网通讯
	////short nCid:通讯句柄
	short nCid;
	short rc;
	nCid = BscOpen(cur_dir,PACKETETHERNET);
        ///commHWND是全局的通讯句柄,手册里可以发现,几乎所有的函数的入口参数都有通讯句柄
	commHWND = nCid;
	if(nCid<0)  //返回值小于零:错误;其他:Communication handler number
	{
		QMessageBox::critical(this,"Failure","BscOpen() Wrong!",QMessageBox::Cancel);
		return nCid;
	}
	//rc = 1:正常;rc = 0:失败
	rc = BscSetEther(nCid,IPAddress,0,hwnd/*GetSafeHwnd()*/);//GetSafeHwnd()获得窗口句柄
	if(rc != 1)
	{
		rc = BscClose(nCid);
		QMessageBox::critical(this,"Failure","BscSetEther() Wrong!",QMessageBox::Cancel);
		return -1;
	}

	///建立连接
	//rc = 1:连接完成;rc = 0,连接失败
	rc = BscConnect(nCid);
	if(rc != 1)
	{
		//rc=0:关闭正常;rc=其他值:关闭失败
		rc = BscClose(nCid);
		return -1;
	}
	b_controllerConnectted = true;
        ///下面两行为Qt设计的界面相关的,不必在意
	ui.pushButton_ControllerState->setIcon(*getIcon(2));
	ui.pushButton_connecttoController->setText("断开控制器");
	return 1;
}

 上面的函数名为connecttoController,作用是响应用户界面的操作(用户在软件界面上点击“连接”按钮,执行该函数)。在函数内部,依次调用了Motocom32的BscOpen、BscSetEther、BscConnect等函数,每次调用都传入通讯句柄等参数(所以Jungle设计了一个成员变量commWHND)并判断返回值是否异常,由此完成该函数的封装。(当然,上述封装并非最优最恰当,仅仅举个例子)。

类似的,可以完成以下功能函数的封装:

函数名 备注 涉及到的库函数
connectToController() 建立连接 BscOpen, BscSetEther, BscConnect……
disconnectToController() 断开连接 BscServoOff,BscDisConnect, BscClose……
controlServe(int ) 控制机器人伺服 BscIsServo, BscServoOn, BscServoOff……
resetRobot() 机器人复位 BscMovl/BscMovl/BscMovl……
setRobottoProcessingPoint(double p[12]) 命令机器人运动到指定位置 BscMovl/BscMovl/BscMovl
…… …… ……

还有传输指令文件、下载指令文件、读写IO、选择程序文件等功能,这里不一一列出来了。

3. 与Host Control 32配合开发

在本系列的第一篇文章里( Motoman机器人离线编程——Motocom32开发简介)介绍到了一个软件Host Control 32,程序开发过程中可以与该软件配合来使用,观测某些函数的作用,因为Host Control 32 界面上的按钮、功能划分和Motocom32的库函数是及其相似的,按钮命名也可以顾名思义在手册里找到对应的函数的用法。

在使用Host Control 32之前,首先要配置软件的环境,如下图:

Motoman机器人离线编程——Motocom32库函数的使用与封装_第3张图片

Motoman机器人离线编程——Motocom32库函数的使用与封装_第4张图片

 选择“Operation Environment ”,主要是设置机器人控制柜的IP地址和机器人控制柜的类型。控制柜类型需要明确,在调用Motocom32函数时会涉及到,控制柜类型不同,调用的函数不同(比如读写IO点函数)。设置完成之后点击“OK”。

 接下来尝试一下Host Control 32中的功能,比如Operation中我们选择“SVON”,这个顾名思义可以猜到是“servo on”,即控制伺服开关的,接下来选择“on”,并执行,如果执行顺利,可以听到机器人伺服打开的声音,同时在界面的Answer——Code里会显示一个返回值,返回值的含义与手册里对应函数BscServoOn的返回值意义相同。

Motoman机器人离线编程——Motocom32库函数的使用与封装_第5张图片


欢迎关注知乎专栏:Jungle是一个用Qt的工业Robot

欢迎关注Jungle的微信公众号:Jungle笔记

Motoman机器人离线编程——Motocom32库函数的使用与封装_第6张图片

 

你可能感兴趣的:(工业机器人)