在前面一节,我们简单介绍了通过PLC+HMI实现完整控制松下伺服的上使能-运动,采集位置,速度等功能,这里我们会大量简化用到的贝福功能块(为了更加实用)。首先依然是对单个轴的封装,我们之前的做法,例如伺服上使能,使用了MC_Power模块,这个模块的输入和输出引脚都是自己定义的变量,比如是否上电成功我们是靠AxisPowerReady的信号来判断的,如果有两个甚至多个伺服的时候,这样做就很不方便管理了,所有的同类型变量都应该用数组统一管理。
改变之后的上使能,就变成了调用一个模块(我们把AxisPowerModule定义成一个数组,当TargetID是0的时候就表示给数组的第一个元素执行,与之对应的输出引脚,比如是否上电成功,是否ExtFeed成功,也全部是在一个数组里面)
这样我们可以在一个全局文件中对所有轴的输入输出参数统一管理(定义成0..10的这么长数组是为了以后方便扩展,虽然目前是控制两个模组,但是如果要控制多个电机,就无需再增减变量了,主程序可以保持结构完整)
讲到主程序,我们还需要区分针对单个轴和针对整个项目的变量区分。例如初始化,读写偏移值(后续会增加更多功能,比如PTP运动)都是针对整个项目,或者说整个机器的,不同的项目也 不一样。而针对单个轴的却都是有限的,无非是上使能,采集位置,速度,错误等等。所以J0和J1可以用一个Groupbox封起来,以后不管什么项目这些单关节的完整功能都是应该具备而且不变的(当整个项目的某个功能不能用了,我们可以马上切换到单个关节的页面,测试是否可以单关节运动)
在读写偏移值的方面,我个人认为写入文件的方式更加合理和方便。跟上一讲类似,调用贝福的模块需要当前周期为FALSE,下个周期为TRUE,模块才能执行成功(一共用到了FileClose,Open,Read,Write四个模块),本质上读取文件是OPEN-READ-CLOSE三步,写入文件是OPEN-WRITE-CLOSE三步(不能写完直接读,要有一个周期让这些模块都是FALSE)
当然读写偏移值有其他的实现方式,比如在每个轴的Enc参数里面人为地改写Position Bias,然后激活配置,这样也可以,但是比较繁琐,或者无法交给用户,你不可能告诉客户你要这样点开,然后写一个值,所以最好还是一个按钮搞定。(实现的功能就是标记零点,本质上使用了绝对值编码器的松下伺服位置是绝对的,我们标记零点只是标记一个偏移值,真正要让电机回到零点就要走到读取电机位置的数值是0点的位置,而实际上一般做不到或者很难做到,所以最简单的方法是用一个偏移值,我们项目上认为当前关节的位置=从电机读取的位置+偏移值,这样就可以在任意位置把当前位置作为零点了)
在运动控制方面,我们丢弃了之前的绝对运动,相对运动,匀速运动这些模块,而是只使用唯一的ExtFeed模块,不断给位置来控制电机运动(这样做最大的好处是当我们需要使用自定义算法,比如规划一个圆弧,不规则曲线的时候,我们算法必然只能得到每个周期的每个关节的位置,那么就可以直接把算法得到的位置灌入这个模块,非常方便,这是使用贝福的封闭的模块做不到的)。当然读取位置,速度,错误这些模块仍然要保留,目前没有别的好方法。不难想象,JOG+和JOG-本质就是匀速运动(当然启停的时候不是匀速的),MOVE的本质就是绝对运动(走到目标位置,只不过没有空间轨迹规划,只是简单的判断了当前位置和目标位置是否很小了,很小就停住了,这样做也会有问题)
还是说运动部分,为了降低难度,我们只测试了最简单的ExtFeed给位置的情况(每个时间周期的新位置=老的位置+速度*时间),这种方式实际上对电机的启停都是有损害的(位置曲线是一条折线,对位置求导速度曲线在启动和停止的时候是无穷大的,加速度也是)。比较重要的一个学习内容是监控轴的位置,速度,加速度曲线,这里我们简单演示了采集位置和速度,当然机器看起来没什么问题(如果机械方面有缓冲件也是可以降低冲击力的)
最后需要注意的一点是我们把电机位置,电机速度转换到了关节位置,关节速度(机械部分不一样,转换的比例也不一样,但是不管是模组只是加了一个联轴器,滚珠丝杠,还是加了减速机,减速比可能1:50,1:100,对程序来说都需要一个固定的转换,如果项目变了,直接改这个比例就行了)。我们不关心电机位置和速度,只关心输出的关节位置和速度(最直接的用途就是做软件的限位,比如J0这个关节在当前项目允许的位置是-1000度到2000度,速度允许的是300度每秒)当然逆向的转换也是必要的,算法生成的针对关节的位置,最后要传入电机还是需要转换成电机的位置(这里我们并没有把限位加上去,因为针对单个关节的点动,JOG+,JOG-是不应该受到项目的软限位约束的,单关节的点动就是点动,万一超限位了项目上的功能已经不能用了还是要用这组基本点动功能让他恢复正常状态,你可以理解针对单个关节的功能就是倍福自带的NC功能或者松下伺服软件自带的功能,这部分功能是独立于你的项目,才是合理的。我对CurrentJob里面针对单个关节的运动都定义成了-30,-24这种都是负的数值,后续项目上的功能状态都是正值,就很好区分了)
在前面一节,我们简单介绍了通过PLC+HMI实现完整控制松下伺服的上使能-运动,采集位置,速度等功能,这里我们会大量简化用到的贝福功能块(为了更加实用)。首先依然是对单个轴的封装,我们之前的做法,例如伺服上使能,使用了MC_Power模块,这个模块的输入和输出引脚都是自己定义的变量,比如是否上电成功我们是靠AxisPowerReady的信号来判断的,如果有两个甚至多个伺服的时候,这样做就很不方便管理了,所有的同类型变量都应该用数组统一管理。
改变之后的上使能,就变成了调用一个模块(我们把AxisPowerModule定义成一个数组,当TargetID是0的时候就表示给数组的第一个元素执行,与之对应的输出引脚,比如是否上电成功,是否ExtFeed成功,也全部是在一个数组里面)
这样我们可以在一个全局文件中对所有轴的输入输出参数统一管理(定义成0..10的这么长数组是为了以后方便扩展,虽然目前是控制两个模组,但是如果要控制多个电机,就无需再增减变量了,主程序可以保持结构完整)
讲到主程序,我们还需要区分针对单个轴和针对整个项目的变量区分。例如初始化,读写偏移值(后续会增加更多功能,比如PTP运动)都是针对整个项目,或者说整个机器的,不同的项目也 不一样。而针对单个轴的却都是有限的,无非是上使能,采集位置,速度,错误等等。所以J0和J1可以用一个Groupbox封起来,以后不管什么项目这些单关节的完整功能都是应该具备而且不变的(当整个项目的某个功能不能用了,我们可以马上切换到单个关节的页面,测试是否可以单关节运动)
在读写偏移值的方面,我个人认为写入文件的方式更加合理和方便。跟上一讲类似,调用贝福的模块需要当前周期为FALSE,下个周期为TRUE,模块才能执行成功(一共用到了FileClose,Open,Read,Write四个模块),本质上读取文件是OPEN-READ-CLOSE三步,写入文件是OPEN-WRITE-CLOSE三步(不能写完直接读,要有一个周期让这些模块都是FALSE)
当然读写偏移值有其他的实现方式,比如在每个轴的Enc参数里面人为地改写Position Bias,然后激活配置,这样也可以,但是比较繁琐,或者无法交给用户,你不可能告诉客户你要这样点开,然后写一个值,所以最好还是一个按钮搞定。(实现的功能就是标记零点,本质上使用了绝对值编码器的松下伺服位置是绝对的,我们标记零点只是标记一个偏移值,真正要让电机回到零点就要走到读取电机位置的数值是0点的位置,而实际上一般做不到或者很难做到,所以最简单的方法是用一个偏移值,我们项目上认为当前关节的位置=从电机读取的位置+偏移值,这样就可以在任意位置把当前位置作为零点了)
在运动控制方面,我们丢弃了之前的绝对运动,相对运动,匀速运动这些模块,而是只使用唯一的ExtFeed模块,不断给位置来控制电机运动(这样做最大的好处是当我们需要使用自定义算法,比如规划一个圆弧,不规则曲线的时候,我们算法必然只能得到每个周期的每个关节的位置,那么就可以直接把算法得到的位置灌入这个模块,非常方便,这是使用贝福的封闭的模块做不到的)。当然读取位置,速度,错误这些模块仍然要保留,目前没有别的好方法。不难想象,JOG+和JOG-本质就是匀速运动(当然启停的时候不是匀速的),MOVE的本质就是绝对运动(走到目标位置,只不过没有空间轨迹规划,只是简单的判断了当前位置和目标位置是否很小了,很小就停住了,这样做也会有问题)
还是说运动部分,为了降低难度,我们只测试了最简单的ExtFeed给位置的情况(每个时间周期的新位置=老的位置+速度*时间),这种方式实际上对电机的启停都是有损害的(位置曲线是一条折线,对位置求导速度曲线在启动和停止的时候是无穷大的,加速度也是)。比较重要的一个学习内容是监控轴的位置,速度,加速度曲线,这里我们简单演示了采集位置和速度,当然机器看起来没什么问题(如果机械方面有缓冲件也是可以降低冲击力的)
最后需要注意的一点是我们把电机位置,电机速度转换到了关节位置,关节速度(机械部分不一样,转换的比例也不一样,但是不管是模组只是加了一个联轴器,滚珠丝杠,还是加了减速机,减速比可能1:50,1:100,对程序来说都需要一个固定的转换,如果项目变了,直接改这个比例就行了)。我们不关心电机位置和速度,只关心输出的关节位置和速度(最直接的用途就是做软件的限位,比如J0这个关节在当前项目允许的位置是-1000度到2000度,速度允许的是300度每秒)当然逆向的转换也是必要的,算法生成的针对关节的位置,最后要传入电机还是需要转换成电机的位置(这里我们并没有把限位加上去,因为针对单个关节的点动,JOG+,JOG-是不应该受到项目的软限位约束的,单关节的点动就是点动,万一超限位了项目上的功能已经不能用了还是要用这组基本点动功能让他恢复正常状态,你可以理解针对单个关节的功能就是倍福自带的NC功能或者松下伺服软件自带的功能,这部分功能是独立于你的项目,才是合理的。我对CurrentJob里面针对单个关节的运动都定义成了-30,-24这种都是负的数值,后续项目上的功能状态都是正值,就很好区分了)
举报