APP下载

工业机器人代码解释器的开发*

2018-05-05杨晓钧井孟凯周绍帆

机电工程技术 2018年4期
关键词:序列号指令语义

杨晓钧,井孟凯,李 朋,周绍帆

0 前言

机器人语言系统是工业机器人与用户交流的接口,用户可以借助语言系统以机器人指令编写的方式实现对机器人的控制[1]。机器人语言系统一般包括:机器人编程语言,代码编辑器和代码解释器。

整个语言系统的处理过程为:用户根据自己的意图,按照机器人语言规定的格式编写出机器人指令,经由编辑器输入编辑得到机器人源程序,但通过编辑器输入的机器人源程序并不能直接被机器人后端的运动控制模块所理解,需由代码解释器翻译与数据处理完成从源程序到中间程序的转换,作为后端运动控制模块的输入[3],控制器调用轨迹规划模块进行插补运算,最后送给执行机构去控制工业机器人的动作,如图1所示。

其中代码解释系统连接着机器人语言系统和控制系统,是语言系统最主要的子模块。它的作用是将用户编写的源程序指令翻译成机器人控制系统能够识别的目标指令[2]。本文将以代码解释器为主要任务完成对机器人语言系统的开发。

图1 机器人语言系统结构图Fig.1 Structure of the robot language system

在机器人领域中,通常有专用的机器人编程语言。不同的工业机器人编程语言并不一样,但是基本的功能是必要的。指令代码主要以动作级语言AL语言为主体,并在其基础上进行修改作为工业机器人的编程语言。不仅具有基本的运动指令及运算指令,还拥有与外部传感器交互的输入输出指令,以及改变操作流程的控制指令,同时还具有根据用户需求添加特定指令的功能,实现了很好的开放性。机器人程序格式举例如表1示。

表1 机器人编程语言指令格式Tab.1 Examples of Robot Programming Language

1 解释器的运行流程

所开发的解释器系统软件结构如图2所示。

图2 解释系统软件结构Fig.2 Structure of the Code Interpreter

本文采用三遍扫描的方式[4]来实现解释器的工作,即各子模块作为独立程序,按步骤依次运行。机器人源程序输入后,调用解释器的词法分析函数检查并转换源程序,输出为规定格式的中间代码1;中间代码1进而输入到语法分析函数,完成对源程序语法结构的检查,并输出中间代码2,记录语句类型信息;然后将中间代码1、2输入到语义分析函数,进行指令内容的检查,通过后将被提取信息到符号表并翻译成最终的目标代码;对中途识别出的非法指令将记录状态并转入相应的错误处理函数[5]。

2 词法分析模块的实现

词法分析的主要任务是识别出源程序中的各个单词,把源程序中的字符转换成一种内部形式,遇到识别不出的符号,要进行错误处理。选用的机器人语言包括以下几种单词符号:(1)关键字,如SUB、OFF、IF等;(2)标识符,如QI0、QD2、KI#3、P1等给定变量名;(3)常量,如整形或浮点型;(4)判断符以及位置参数等。词法分析程序除了识别单词外,还输出该单词类型,所以为每一个基本命令字都设置了标号值与属性值[6],部分对应关系如表2。

表2 单词符号对照表Tab.2 Intermediate Format 1

图3 分离单词流程图Fig.3 Lexical Analysis Diagram

分析每行代码时,识别单词分为两步:先通过函数Separword()将各单词分离出来;然后调用函数Recogword()负责具体识别每个单词。当识别出单词后,同时需输出并存储单词的标号与属性值,以及所在位置,为此在VC程序中,定义一个类CWordInfor来存储以上信息,该类型具有五个数据成员与两个成员函数。

通过对机器人语言规则的研究,可以对每行指令以空格符或判断符为界来划分单词,为此,设计分离单词的流程图,如图3,按照规划好的流程图即可设计分离单词的算法。当单词完成分离之后即可由Recogword()函数进行识别工作,单词识别后,输出单词的同时建立CWordInfor类的对象,保存对应单词的标号值与属性值等相关信息用于后续的语法分析处理。对于无法识别的单词将进行特殊赋值,并转入错误处理。

3 语法分析模块的实现

语法分析的任务是将输入的单词流进行组合,按照特定的语法规则去分析源程序的语法结构并检查语法错误,当发生错误时输出相应的错误信息,检查无误则输出合法语句[7]。

图4 语法分析流程图Fig.4 Syntax Analysis Diagram

本文采用的机器人语言指令结构比较固定,所以可以采用将单词的标号值与规范的标号值相匹配的方法进行语法分析。首先建立规范指令的数字串集合,称为序列号表。将语法结构正确的指令中所有的单词标号值连成数字串,作为序列号存入序列号表中;当处理一行指令时,将指令中所有单词的标号值提取并连为数字串,通过matc_nu1()函数与序列号表中的序列号进行查询,查询到相同的数字串则表明匹配成功。若匹配成功,则代表语法结构正确;若失败,则对该行指令进行错误处理。例如“MOVJ P2 VJ=50 PL=0”这条指令中所有单词按顺序组合出的序列号为“51359266026”,分析首单词“MOVJ”的标号值为51,则进入MOVJ指令的序列号表进行匹配查询。对应序列号表为:{"51359286026","51359266026","51360265926", "51360265928", "5135926", "5135928"},根据查询对比,与表中第二项序列号匹配,证明该行指令语法格式正确。可进行中间代码2的生成,进入语义分析模块的处理。语法分析模块流程如图4所示。

4 语义分析与中间代码生成模块

语法分析是检查句子的结构,语义分析则是检查句子的意思。因此语义分析的任务为对源程序中每行指令的具体意思进行剖析,检查指令中的静态语义错误。若同时满足语法层面的“形式”正确和语义层面上的“内容”正确,则指令无误,可翻译成等效的中间代码。因此在语义分析和中间代码生成阶段,解释系统要做的工作是进行静态语义检查和翻译[8]。

语义分析的方法主要依照编译原理中的语法制导翻译的思想。即对每一种指令类型都编制其各自的语义子程序,其中包括语义检查模块和目标代码生成模块。当用语法分析匹配出一条指令时,立即调用相应的语义子程序进行处理[9]。基本流程如图5所示。

由于在前面词法分析模块中,将每个单词的类型与属性值等各项信息已提取为类CWordInfor的对象,作为中间代码1;又经过语法分析模块,识别出每行指令的种类等信息,并保存在类CWordInfor的对象中,作为中间代码2。因此可将中间代码1与中间代码2作为语义分析模块的输入,根据中间代码2中指令类型及其参数信息,调用相应的语义动作:通过该指令的静态语义检查模块对中间代码1中信息进行查错与变量表的填充,然后通过翻译子程序模块对中间代码1进行信息的提取[10],完成中间代码的输出。语义分析检查无误后,进入翻译模块,需要对当前指令进行信息的提取,以生成中间代码,在这里采用对每种指令类型创建一种数据结构的形式,指令的参数作为数据结构的成员,定义在头文件Struct.h中。例如对运动指令MOVJ,其数据结构定义为:

typedef struct Traj_linear_move

{

int type; //命令类型

图5 语义分析流程图Fig.5 Semantic Analysis Diagram

EEPose end; //目标点

double maxvel;//速度

int feed_mode; //平滑度

}Traj_joint_move;

对运算指令ADD、SUB、MUL、DIV等,其数据结构定义为:

typedef struct Cal_asmd

{

int type; //命令类型

int caltype;//运算符类型

Vari var1;//操作数:变量1

Vari var2;//操作数:变量2

}Cal_asmd;

其中Vari作为变量类型,用于表示指令中各变量,包括整形变量QIn、浮点型变量QDn、布尔型变量QBn,以及IO接口KI#(n)、KO#(n)等。定义的数据结构为:

typedef struct Vari

{

int vtype;//变量类型

union{

int num; //变量标号

double value;//常量数值

}vdata;

}Vari;

将各行指令创建为相应的数据结构对象后,即可将其提取在消息列表中,定义在头文件Struct.h中的消息列表的数据结构为:

struct CODE_INTERP_LIST_MSG

{

int line_number;//指令行号

int cmd_type; //命令类型

union{ //各指令对应的数据结构

Traj_circular_move tcmd;

Traj_linear_move tlmd;

IF_Condition ic;

Traj_joint_move tjm;

Ctl_begin cb;

……

}cmd_data;

};

其中数据成员line_number表示当前指令所在行的位置,cmd_type表示所存储的指令类型,联合体cmd_data则用于存储当前指令的数据结构对象。这样,创建的消息列表即为当前行生成的中间代码。

5 实例测试

进行解释系统的实例测试,通过在基于MFC开发的程序编辑器中编写机器人的运动测试指令,经过代码解释器最终生成中间代码以验证机器人语言系统尤其是代码解释系统的正确性。测试指令在程序编辑器中输入如图6所示。

图6 测试指令输入Fig.6 The Testing Code

经过解释系统后生成的中间代码如图7所示。

可以证明,本文开发的代码解释器可以准确地将机器人指令翻译输出为规定的中间代码。代码执行过程中,当用户给定的机器人运行轨迹为连续直线形移动时,有的目标点并不需要精确移动到,此时为使机器人平稳运行,可以采用贝塞尔曲线路径对原始路径在目标点处进行平滑拟合,降低机构的冲击。因此连续型轨迹可规划为精确定位的插补和轨迹逼近的插补。

图7 目标代码输出结果Fig.7 The Object Code

这在机器人运动指令中体现为位置精度等级的选取,即在指令MOVL的参数中,PL的值代表过渡路径的平滑度,PL设定值越大,则过渡曲线越平缓,但接近原始路径的程度越低。当PL设为0时,机器人将按规划路径精确移动而不进行过渡曲线的拟合。对于精度的划分,如图8所示,过渡点Q1与Q2的选取遵循λ∈[0,1]的规则,其中λ作为精度系数,取值大小直接影响过渡。精度等级对照如表3所示。

表3 精度等级对照表Tab.3 Precision control table

插补器采用了直线段的五次方多项式轨迹插补函数,四阶贝塞尔曲线路径平滑函数及曲线段的五次多项式轨迹插补函数。在插补器中经轨迹插补后的路径点拟合如图9所示。

图9 路径点插值结果Fig.9 The results of path interpolation

6 结论

图8 位置等级规划Fig.8 Position Levels

本文在工程需求分析的基础上,以Delta机器人为工作平台,重点开发了机器人软件模块中的语言系统的解释模块。选用AL机器人语言并扩充作为用户输入语言,基于MFC设计了机器人程序编辑器,并基于C语言重点开发了机器人代码解释系统,通过三次扫描依次调用词法分析程序、语法分析程序、语义分析及中间代码生成程序以完成源指令到目标指令的翻译。经指令测试,验证了各模块运行的正确性。

参考文献:

[1]彭慧,尹朝万.机器人语言研究[J].机器人,1991,13(5):36-41.

[2]张玮光.面向复杂作业的微操作机器人编程语言[D].天津:南开大学,2008.

[3]黄永华.机器人语言编程系统的设计与实现[D].南京:东南大学,2004.

[4]王浩,谢存禧.工业机器人解释器的研究[J].机械设计与制造,2010(3):160-161.

[5]郭显金.工业机器人编程语言的设计与实现[D].武汉:华中科技大学,2013.

[6]别卫春,朱志红,叶伯生,等.HNC-IR机器人语言解释系统的研究与实践[J].机电一体化,2000,6(3):27-30.

[7]王侦,马旭东.工业机器人语言解释器的设计与实现[J].工业控制计算机,2015,28(3):6-8.

[8]伍春香.编译原理[M].北京:清华大学出版社,2001.

[9]熊巍.机器人编程语言解释器的研究与开发[D].北京:北京工业大学,2005.

[10]LOUDEN KENNETH C.编译原理及实践(计算机科学丛书)[M].北京:机械工业出版社,2011.

猜你喜欢

序列号指令语义
一种离线电子钱包交易的双向容错控制方法
《单一形状固定循环指令G90车外圆仿真》教案设计
语言与语义
一种控制器硬件序列号的更新方法
关于《国家税务总局 工业和信息化部关于加强车辆配置序列号管理有关事项的公告》的解读
批评话语分析中态度意向的邻近化语义构建
“社会”一词的语义流动与新陈代谢
“吃+NP”的语义生成机制研究
中断与跳转操作对指令串的影响
一种基于滑窗的余度指令判别算法