王建伟 何洪岩
摘 要:为了缩短汽车的投产周期,汽车自动化焊装生产线多采用仿真验证然后输出离线程序的方式完成工业机器人的编程工作。而由于软件、人为等方面的因素,输出的机器人程序可能存在各种错误,削弱了离线编程的优势。文章介绍了一种基于flex和bison编写的Kuka-Volvo机器人焊接程序的解析器,对输出的离线程序进行检查。实验证明,该解析器可以有效检测出程序中的错误,从而及早修正程序中的错误,保证离线程序的质量,使汽车能够尽快投产。
关键词:机器人 解析器 焊接 程序检查
随着科技的不断进步,汽车行业的竞争也日趋激烈。白车身制造是汽车制造中不可或缺的一环,而白车身焊接的柔性化不及涂装和总装,因此,白车身焊接线投产周期的缩短,有利于将汽车产品尽快推向市场,提高市场竞争力,从而提升企业的经济效益。
在白车身焊装自动生产线上,均使用工业机器人完成焊接任务,以提高效率,保证焊接质量,并降低工人劳动强度。机器人的焊接工作是由机器人程序驱动的,为了进一步缩短投产周期,并降低现场调试风险,机器人程序多采用仿真软件验证的离线编程方式编制。由于软件不够完善以及工作人员的疏漏,难免会出现输出的离线程序存在各种各样的问题,无法供生产线上的机器人直接使用,而在现场修改程序是一件费时费力的工作,削弱了离线编程所带来的优势。针对该情况,需要有一种手段来检测出程序中存在的语法错误和逻辑错误,方便在程序发放给生产线上的机器人前对错误进行修正。
使用解析器可以有效地检测程序中的语法错误,而应用解析器生成的语法树则可以进行逻辑错误的检查。机器人程序解析由两个部分构成:词法解析和语法解析。词法解析是对程序文件中的内容进行分词,识别有意义的最小元素;语法解析则是应用词法解析的结果,组合成有意义的语句,并将语句组合成语法树。flex和bison是常用的两种构建解析器的工具,文献[1]中讲解了flex和bison的结合使用方式。
1 Kuka-Volvo机器人焊接程序
Kuka-Volvo是在Kuka机器人的基础指令上开发出的适用于Volvo体系的机器人工艺包集合,文献[2-5]中对扩展部分的语法做了详细的说明。一个完整的Kuka-Volvo机器人焊接程序模块有两个文件构成:扩展名为”.dat”的数据文件和扩展名为”.src”的程序文件。
1.1 数据文件
数据文件存放变量的定义,包括空间位置、负载信息、信号地址等。数据的声明均以”DECL”开始,之后是变量的类型和变量名称,之后是变量的初始值。部分示例如下:
DECL LockSignType AllocateZone4={Number 27,Info[] "R1-1,R1-3 Weld and R4-2 Weld"}
1.2 程序文件
程序文件中定义机器人需要执行的指令,包括运动、设备交互、时间同步等。程序文件中会定义若干程序块,其中一个为主程序块,主程序块调用文件中的其他块,而主程序则会被其他模块调用。
2 解析器构造
flex是一种词法分析生成器,可以根据定义好的词法匹配规则,生成相应的词法分析程序。flex的词法规则定义由3个部分构成,使用'%%'作为分隔标识。第一部分由声明及选项组成。第二部分则是词法规则的定义部分。词法匹配规则由正则表达式书写,并在表达式后面对匹配到的元素进行相应的处理。第三部分是附加的C语言代码,这些代码会直接复制到生成的词法分析程序中。
分词阶段需要根据不同的语法定义相应的词法规则,此处主要依据Kuka-Volvo的规范编写词法规则,区分关键词、注释、数值等。由于篇幅有限,此处只摘录部分词法规则。
"DEFDAT" {return DEFDAT;}
"ENDDAT" {return ENDDAT;}
"DECL" {return DECL;}
它是一个语法解析器生成器,经常与flex结合使用。同flex一样,bison的文件也由3个部分构成:包含声明和选项的第一部分,语法规则定义的第二部分,以及附加C语言代码的第三部分,各部分之间也以'%%'分隔。
一个程序文件和对应的数据文件被解析为一个模块,数据文件被解析为模块中的数据块,程序文件被解析为模块中的指令块,而文件的基础名称(不含扩展名)作为整个模块的名称。
数据块存放变量列表,变量列表中的每个变量由名称、类型和值构成;指令块则存放机器人的指令段列表,指令段由指令序列构成,而指令又包含名称和参数,参数可以是在数据块中定义的变量。
bison的语法规则根据模块的结构编写,从上至下,并采用递归的方式:
modular: blocklist{moduleAppendBlock(gCurrentModule,$1);}
blocklist:/*nothing*/{$$=NULL;}
|block{$$=$1;}
|blocklist block{$$=blockListAppend($1,$2);}
block: statementlist{gCurrentBlock=blockCreateFromStatements($1);
$$=gCurrentBlock; }
|datblock{gCurrentBlock=blockCreateFromDatBlock($1);
$$=gCurrentBlock;}
|srcProgram{gCurrentBlock=blockCreateFromProgram($1);
$$=gCurrentBlock;}
3 錯误检查
错误检查程序首先初始化内置变量表和函数表,然后使用解析器解析数据文件,生成变量表,然后再解析指令文件,分析机器人操作。在解析指令文件的时候可以完成一部分程序完整性检查,如引用未定义的变量等,最后遍历模块完整的语法树,查找一些高级的错误,如干涉区定义不成对、信号定义但没有使用等。
在所检查的程序中发现了变量未定义的错误和废弃的函数使用警告,达到了预期的目标。对实验的8台机器人的离线程序进行检测。
4 结语
通过解析器的构建和使用,可以检测出机器人离线程序的语法格式、数据定义和数据使用等错误,有利于机器人程序错误的早期修正,从而保证输出的机器人离线程序的质量。语法树的构建,也可以作为统计分析的一个基础,对焊枪的使用、焊点的焊接及机器人干涉区进行统计,并进行优化,提高离线程序的质量,因此,统计优化是下一个研究方向。
参考文献
[1] John R.Levine.Flex & Bison[M].Sebastopol:Oreilly,2009.
[2] KUKA Roboter GmbH.VCC Basic[Z].KUKA Roboter GmbH,2013.
[3] KUKA Roboter GmbH.VCC Handling[Z].KUKA Roboter GmbH,2013.
[4] KUKA Roboter GmbH.VCC Spot Weld[Z].KUKA Roboter GmbH,2013.
[5] KUKA Roboter GmbH.VCC ToolChange[Z].KUKA Roboter GmbH,2013.
[6] 左培良,邓先智,王建平.工业机器人在自动化控制中的应用研究[J].中国设备工程,2019(9):212-214.