跳到主要内容

控制器二次开发例程教学

介绍

为了方便用户快速上手 Qt 的一些简单操作,之后我们使用一个点胶机项目源码作为例子,这是一个简单的项目,里面涉及到的主要是一些通讯操作,实际逻辑功能很少,作为一个简单的入门项目还是非常不错的

· 控制器接收参数通讯并保存在本地

在开始本章前,请先参考《示教器二次开发例程教学》中的《示教器端发送参数》章节

控制器端,和参数相关主要的函数为以下三个

核心思路就是每次程序启动的时候检测本地是否存在参数文件,如果不存在则创建一个,并给参数赋默认值,同时每当示教器修改参数,在读取新参数的同时同步修改本地的参数文件,当示教器发送请求时将本地参数文件的参数读取出来并传给示教器 我们先来看第一个函数,这里主要用到 fsteam 和 ofsteam 这两个接口,分别需要头文件<iosteam><fsteam>,前者用于读取文件并返回是否存在,后者用于操作文件内容

当我们执行程序后,控制器端会生成一个参数文件

不管本地是否存在参数文件,到这一步我们都已经把参数存在了名为 root 的 Json 对象里,但是 root 是一个临时的对象,我们还得将这些参数传给全局变量,这样更方便我们在工艺实现部分对它们进行调用。 这一步我创建了一些局部变量作为中转,把这些参数通过一个接口赋给全局变量

在这其中,glue_param 是 Glue 类的一个结构体,在初始化之后,类里面的变量都是全局性质的,计算机会在初始化的时候给它们分配内存空间,在之后程序的任何一个地方都能对其进行调用和修改,非常方便

当控制器收到示教器发送的消息通讯时,我们只要和参数初始化的时候一样把示教器发来的参数写入本地的参数文件,再重新调用一次 param_access()读取参数文件里的参数到全局变量即可

下图中使用了 Json 库中的 Json::Reader 创建了一个名为 reader 的对象,其作用是把以 Json 格式写成的字符串读取到 Json::Value 对象里,使用方法是

Json::Reader.parse(string,Json::Value)

如图中所示,同时我们注意到 X_coord,Y_coord,Z_coord,U_coord 都是 origin 的子标签,这样保存的时候它们就隶属于 origin 这个标签

使用 ofsteam 库将这些参数保存在 glueParam.json 中

在本段程序中,Json::StyledWriter 和前面提到的 Json::FastWriter 相似,他的功能就是将 Json 格式转换为字符串时自动排版,这样保存为本地文件之后,直接打开文件也能直观的看到各个参数的数值,如下

控制器读取到参数之后,还需要同步给示教器,这一步常用在参数初始化的时候,当控制器从本地参数配置文件读取到参数之后,需要同步给示教器端,核心思路为,示教器发送参数请求给控制器,控制器收到之后将本地的参数以 Json 格式发送给示教器,示教器收到之后再显示到用户界面

下一步我们来写示教器的接收部分,请参考《示教器二次开发例程教学》中的示教器端接收参数

· 制作一个点位记录界面

《示教器二次开发例程教学》中,示教器给我们发送了获取当前点位的请求,因此需要控制器下发当前点位,实现方式如下图

这里用到了接口

NRC_GetCurrentPos(NRC_COORD coord, NRC_Position position)

具体用法可以自行查阅头文件,其作用就是获取当前机器人的坐标点位。之后我们把点位发送给示教器后,示教器再把这些点位覆盖到对应的 item 上

“运动至此”功能实现方式如下

· 工艺实现

做了这么多准备工作,接下来我们该试试让机器人动起来了,如果控制器连接了实体机器人的话,在进行本节之前请先确保机器人类型、DH 参数等机器人设置是正确的,并且能实现正常点动,否则可能造成撞机事故。简单的控制器运动可以参考《控制器基础教程》

这里我主要介绍在做二次开发工艺中比较常用的两种运动实现形式,一种是作业文件模式,一种是追加运行模式,无作业运行模式作为一种特殊的作业文件形式在此就不做介绍,用户可以自行研究

· 作业文件形式

作业文件形式相当于我们通俗意义上的机器人编程,即生成一个里面包含各种机器人运动和逻辑判断指令的文件,这样每次我们只需要执行这个文件,机器人就会按照文件里面的指令按顺序运动,优点是编程简单、容易上手、易于转移和可以直接在示教器端修改,缺点是在处理一些复杂的逻辑判断的时候不够灵活。请尝试使用下列接口来生成或打开一个作业文件吧,生成的作业文件会保存在控制器中的/robot/job 文件下,直接用代码操作作业文件和在示教器上进行作业文件编程是等效的,也可以用示教器打开

在这里我们看到点位参数是 NRC_Position &target,这个参数中包含了坐标的坐标系、点位、姿态信息,具体请参照接口说明

还有一个我们常用的接口,获取当前点位,因为很多工艺中,点位的位置并不是绝对的而是相对的,这就需要我们用获取当前坐标位置在加上对应的偏移值来进行运动,所以需要用到这个接口

值得注意的是,这些指令都是插入指令而不是运动指令,作业文件在运行的时候,指令都已经完成插入了,所以我们常用的逻辑判断是不会生效的,举例来说,如果要“通过一个 IO 判断来让机器人运动到一个点上”,下面这种形式是无法实现的

这一段代码的实际效果是,如果读取到 IO1 输入为 1,那就给作业文件插入一个 MOVJ 指令,这与我们的本意有所出入,实际应该写成以下形式

如果 IO5 输入为 1,就运动到 Pos1,否则延迟 0.5s 可以看出,作业文件指令也能处理一些简单的逻辑判断,但是在复杂的逻辑判断上,整个代码的逻辑会非常繁琐,所以在制作复杂的工艺时,我更推荐使用追加运行模式

· 追加运行模式

另一种机器人运动方法是追加运行模式,追加运行模式的好处是可以在各种运动指令之间插入逻辑判断,它所有的指令都是实时的,即程序跑到对应的代码的时候,机器人就会进行对应的运动,而且它不需要等待机器人上一条指令执行完,在短时间内插入多条指令时,机器人会按顺序执行,相对于作业文件来说,追加运行模式更加灵活,但不会生成作业文件,也不会显示在示教器端,不能在示教器端修改

使用追加运行模式需要先打开追加运行模式,其实现方式如下

基于追加运行模式的特性,我们可以在运动指令中间插入逻辑判断的阻塞,比如下列例子

这段代码的实际效果是,当 IO1 没有读到输入信号并且结束标志位没有触发的时候,程序阻塞,当 IO1 信号被触发的时候,进行 MOVJ 运动。相对作业文件形式来说,这种能在运动指令之间自行添加各种逻辑判断的模式更加灵活,易于实现更复杂的逻辑

小练习

1、用官网的教程使机器人运动起来 2、尝试分别使用作业文件形式和追加运行模式来实现一个通过 IO 信号来控制机器人运动的功能