技术领域
[0001] 本发明涉及一种面向机械臂程序开发编程语言的调试器,属于计算机应用领域。
相关背景技术
[0002] 机器人编程语言在整个机器人控制系统中占有十分重要的地位,它直接影响着工业机器人的基本作业和离线编程,从而影响到用户对机器人的使用效率。
[0003] 随着机器人技术的不断发展,机器人语言也不断地向前推进,其功能不断扩展,使用上也更加容易理解和上手。现在应用比较广泛的且有代表性的工业机器人编程语言是ABB公司开发的RAPID语言。它是一种英文编程语言,所包含的指令可以移动机器人、设置输出、读取输入、还能实现决策、重复其它指令、构造程序、与系统操作员交流等功能,是有较强功能的机器人语言。
[0004] 近年来,像ROS Industrial这样的编程选项开始为程序员提供更多的标准化选项。Tenon语言是我国自主设计的一种用于机械臂程序开发的编程语言,属于应用新型通用语言的机器人程序库,本发明针对Tenon语言设计了相应的程序调试器。Tenon语言支持汇编级和源代码级调试。通过设置断点,可以挂起被调试程序。然后进行变量检查,函数调用栈回溯,代码查看等常用调试操作。结束检查后可以继续执行被调试程序。
[0005] 中国发明专利“一种基于脚本可二次开发的工业机器人编程系统”(申请号为201611233352.7)公开了一种基于脚本可二次开发的工业机器人编程系统,解决了可以二次开发指令集的问题,但是未注重编程语言的扩展性。武汉科技大学熊志恒在其硕士学位论文“模块化机械臂作业语言解析器设计与实现”中,以六自由度模块化机械臂为研究对象,设计和实现了一套工业机器人编程语言,并提出使用受限自然语言实现自动编程,但其指令为中文,可扩展性不够好。
[0006] 机器人编程语言分为专用操作语言(如VAL语言、AL语言、SLIM语言等)、应用已有计算机语言的机器人程序库(如Pascal语言、JARS语言、AR-BASIC语言等)、应用新型通用语言的机器人程序库(如RAPID语言、AML语言KAREL语言等)三种类型。
[0007] 商用机器人公司提供给用户的编程接口一般都是自己开发的简单的示教编程语言系统,如KUKA、ABB等,机器人控制系统提供商提供给用户的一般是第二层语言平台,在这一平台层次,控制系统供应商可能提供了机器人运动学算法和核心的多轴联动插补算法,用户可以针对自己设计的产品应用自由的进行二次开发,该层语言平台具有较好的开放性,但是用户的工作量也相应增加,这一层次的平台主要是针对机器人开发厂商的平台,如欧系一些机器人控制系统供应商就是基于IEC61131标准的编程语言平台。
[0008] 现行机器人语言执行的虚拟机,尚未配置对应的调试器,不能直接对写好的机械臂程序进行调试,难以优化代码、发现错误,只能在运行时根据机械臂运行情况判断产生问题的可能原因,不利于高效率编写程序。本发明针对这一问题设计了Tenon机械臂程序的调试器,实现了Tenon程序的调试功能,符合高级语言程序开发调试习惯,易于操作,便于快速高效编写机械臂程序。
具体实施方式
[0024] 下面将结合附图对本发明做进一步说明。
[0025] 本发明提供了针对于Tenon的作业程序进行Debug调试的方法。和GDB一样类似,支持源码显示,设置断点,程序运行到断点的位置会停下来,运行程序,跟踪查看某个变量,单步执行,查看函数调用信息和栈帧等功能。
[0026] 调试器(Debugger)是帮助程序员跟踪、分隔和从软件中移除bug的工具。它帮助程序员更进一步理解程序。调试器的工作原理是基于中央处理器的异常机制,并由操作系统的异常分发/事件分发的子系统(或模块)负责将其封装处理后,以比较友好的方式与调试器进行实时交互。每当调试器捕获到一个异常/事件之后,将会根据调试器的自身逻辑来判定是否需要接管这个异常/事件,并决定由调试器的哪个函数来接管。当调试器接管下来这个异常/事件后,将根据用户的需求对其进行进一步的处理,处理完毕后再通知系统已经处理完毕,此时新一轮的异常/事件捕获、分发循环开始。
[0027] Tenon调试器在执行模块基础上进行扩展,支持本地和远程调试,支持断点设置,单步执行,变量查看等。基本逻辑如图1所示。
[0028] 本发明完全自主开发,使用gdb的通讯协议(rsp)和命令格式为开发参考,基于socket实现远程调试,使用相关指令设置和控制调试状态。下面详细的介绍本发明技术方案。
[0029] Tenon调试器支持调试命令局部匹配,当输入的字符串是且仅是某一命令名的前置部分时,调试器会成功匹配该命令。比如,“hi”会匹配“history”,因为它是后者的前两个字符,而且没有任何其他命令的前两个字符是“hi”。
[0030] 同时,某些命令有固定的特殊简写,这些简写是为了跟“GDB”保持兼容,比如“b”可同时匹配多个命令,但我们将其绑定到“breakpoint”。这些固定的简写在“简写”行列出。
[0031] 当编译Tenon程序的时候,使用-g可以生成源代码级调试信息。目前的调试信息主要包括行号信息和源文件路径。
[0032] Tenon调试器增加了对持久量的支持。持久量与普通变量不同,它的值在程序运行过程中如果发生改变,会被保存下来。当程序结束后,再次运行的时候,会使用之前更新的值。持久量可以用来存放机械臂的坐标点,使得机械臂的位置不会由于程序中断退出而复位。
[0033] 实现方式:
[0034] 持久量在Tenon程序中使用特定的关键字来标识。在Tenon编译器编译程序的时候,会将持久量在外部文件中的代码位置记录下来,保存每一持久量及其对应到位置。当程序退出,或者持久量所在模块被卸载的时候,将会触发一个事件。虚拟机会响应该事件,遍历映射表中的持久量,将它的当前值写回到程序外部文件中。当程序通过外部文件再次启动的时候,持久量会使用最新的值来初始化。
[0035] 使用Tenon调试器进行调试,被调试的程序是一个编译好的字节码,或者汇编文件。在调试过程中,如果持久量的值发生改变,则处理方式跟普通运行的时候类似。不同之处在于,调试器会内部维护映射表,而不是将变量的值写回到外部文件中。这样做实现了2个效果:1)在调试过程中对程序重启,持久量会使用最新的值来初始化;2)在调试过程中对持久量的改变,不会影响程序的外部文件。
[0036] Tenon调试器提供了与仿真器对接的接口,可以在仿真器中可视化的显示和调试机械臂的运行状态。
[0037] 实现方式:
[0038] 调试器支持2种运行方式:1)在命令行界面使用,类似于普通程序的命令行界面调试;2)在仿真器中使用,可视化的显示和调试机械臂的运行状态。如果通过仿真器启动调试器,在调试过程中,调试器会将机械臂的位置数据,即程序中的持久量的值,通过接口发送给仿真器,仿真器接收到数据后,实时更新机械臂的显示位置,从而达到可视化的效果。
[0039] (1)关键结构体
[0040] 与运行上下文类似,调试器有自身的调试上下文结构体,是在运行上下文上的结构扩展,DebugCtx程序调试结构体如下:
[0041] typedef struct debug_ctx
[0042] {
[0043] ExecCtx*exec_ctx;
[0044] Frame*cur_frame;
[0045] BreakPointPool breakpoints;
[0046] HTab src_htab;
[0047] DebugState state;
[0048] History*cmd_history;
[0049] int line_cursor;
[0050] char*his_cmd;
[0051] bool is_exec_script;
[0052] int saved_argpool_size;
[0053] int saved_retpool_size;
[0054] int remote_fd;
[0055] DebugOps target_ops;
[0056] }DebugCtx;
[0057] DebugCtx域 含义exec_ctx 运行上下文
cur_frame 当前运行帧
breakpoints 断点池
state 当前程序状态
cmd_history cmd命令行操作历史信息
target_ops 调试操作函数
[0058] DebugOps结构体,用于Debug过程,具体的操作:
[0059]
[0060]
[0061]
[0062] (2)通讯协议
[0063] 通信协议使用GDB RSP(Remote Serial Protocol)。
[0064] (3)调试引擎
[0065] 1)功能简介
[0066] 支持本地调试和远程调试,本地调试直接在本地打开调试shell进行cmd操作(命令行操作),Debug远程调试,与gdbserver类似,发起Socket连接到指定IP和Port,在本地端使用和服务器端一样的命令,同样支持源码显示、设置断点、运行程序、跟踪查看某个变量、单步执行、查看函数调用信息和栈帧等功能。
[0067] 2)关键实现接口
[0068]
[0069]
[0070] 3)实现原理
[0071] 调试原理依靠运行上下文中的Flag,来控制虚拟机的运行和暂停,并从DebugCtx中获取相关信息反馈。
[0072] 4)业务使用流程
[0073] 1.生成含有位置信息的汇编程序
[0074] 在编译Tenon程序的时候,Tenonc编译器会在生成的程序中插入位置信息,比如对于持久量,会在生成的汇编程序中生成该变量初始值对应的源码位置信息:
[0075] .pers string@a
[0076] .ploc 5 19 5 26
[0077] .string"hello"
[0078] 对应的源代码为:
[0079] pers string a="hello";
[0080] 即持久量a的初始值位于源码中的第5行19列到第5行26列(不含第26列)。
[0081] 2.程序加载
[0082] 虚拟机tvm加载该汇编程序的时候,会对位置信息进行解析,在内部创建一个映射表:
[0083] 持久量 初始值 当前值 初始值在源码中的位置 初始值在汇编中的位置@a "hello" "hello" (5,19)~(5,26) (3,10)~(3,17)
[0084] 3.程序执行
[0085] 在执行过程中,如果持久量的值发生改变,则会在映射表中更新当前值。
[0086] 持久量 初始值 当前值 初始值在源码中的位置 初始值在汇编中的位置@a "hello" "helloworld" (5,19)~(5,26) (3,10)~(3,17)
[0087] 4.程序卸载
[0088] 对于正常执行的程序,当程序终止被卸载的时候,如果当前值跟初始值不同,虚拟机则会根据映射表中的位置信息,将当前值更新到程序文件中:
[0089] (1)如果程序是通过源文件加载的方式执行,虚拟机则会将当前值更新到程序的源文件中。
[0090] (2)如果程序是先编译成汇编文件,通过汇编文件加载的方式执行,虚拟机则会将当前值更新到程序的汇编文件中。
[0091] (3)如果程序是先编译成二进制文件,通过二进制文件加载的方式执行,虚拟机则会将当前值更新到程序的二进制文件中。
[0092] 对于调试执行的程序,当程序终止被卸载的时候,持久量的值不会被更新到外部文件中。由于调试器本身并未退出,映射表数据结构还在内存中,所以当重新加载程序的时候,调试器会将持久量的值更新为当前值。
[0093] 具体调试过程如下:
[0094] a.准备带有调试信息的代码
[0095] 当编译Tenon程序的时候,使用-g可以生成源代码级调试信息。目前的调试信息主要包括行号信息和源文件路径。
[0096]tenonc-g demo.t
[0097] 检查生成的汇编文件,可以看到源文件路径信息:
[0098].file"xxx/test.t"
[0099] 还可以看到行号信息:
[0100]
[0101] b.进入调试shell
[0102] Tenon调试器集成在Tenon虚拟机中加载程序时,指定-i会打开调试模式:
[0103] tvm-i task0.asm
[0104] c.根据相关命令进行调试
[0105]
[0106] 本发明未详细阐述部分属于本领域公知技术。
[0107] 以上对本发明所述的数据一致性检测方法进行了详细的说明,但显然本发明的具体实现形式并不局限于此。对于本技术领域的一般技术人员来说,在不背离本发明所述方法的精神和权利要求范围的情况下对它进行的各种显而易见的改变都在本发明的保护范围之内。