文章案例 Codesys.运动控制电子齿轮案例包资源-CSDN文库
文章目录
一. 电子齿轮概念应用
在很多应用场景中有多个牵引轴每个牵引轴要以一定的数据比例同步运行,由于存在机械误差,就需要设置齿轮比,根据物理学关系,假设齿轮1齿数为Z1,转速为n1,假设齿轮2齿数为Z2,转速为n2.则满足关系Z1/Z2=n2/n1。
二. 电子齿轮耦合功能块
2.1. MC_GearIn
-
设定从轴与主轴间的齿轮比,进行电子齿轮动作。
-
详情可以查看Codesys运动控制手册。
-
波形测试:
如图所示,设置主从轴齿轮比1:2,则其速度比为2:1,齿轮耦合不改变主轴状态,耦合后从轴状态进入6(同步运行),退出耦合后从轴状态进入5(连续运动)会以当前速度继续运行下去,可以用MC_Stop来停止轴。
2.2. MC_GearInPos
-
设定主轴与从轴之间的电子齿轮比,进行电子齿轮动作。
-
指定开始同步的主轴位置、从轴位置、主轴开始同步距离,并以此来完成切入电子齿轮动作。
详情可以查看Codesys运动控制手册。
-
波形测试:
如图所示,指定开始同步的主轴位置400、从轴位置200、主轴开始同步距离100,并以此来完成切入电子齿轮动作。
2.3. MC_GearOut
-
终止执行中的 MC_GearIn,MC_GearInPos 指令。
-
详情可以查看Codesys运动控制手册。
注意:调用该指令只是退出耦合后从轴状态进入5(连续运动)会以当前速度继续运行下去,可以用MC_Stop来停止轴。
三. 电子齿轮案例
3.1. 样例介绍
下图设备设计使用了两个牵引轴,牵引轴的作用在于提供待加工带料的牵引力,如下图所示,每个牵引轴部分都是由两个齿轮啮合在一起,两个齿轮带动两个摩擦力较大的两个棍贴合在一起,带料从两辊之间穿过,,贴合在一起的这两个棍转动起来则可带动带料朝相应方向运转。
-
牵引轴部分简述
上图设备设计使用了两个牵引轴,牵引轴的作用在于提供待加工带料的牵引力。如右图所示,每个牵引轴部分都是由两个齿轮合在一起,两个齿轮带动两个摩擦力较大的两个辊贴合在一起,带料从两辊之间穿过,贴合在一起的这两个辊转动起来则可带动带料朝相应方向运转。
-
为什么什么设计两个牵引轴
带料经过牵引轴A之后,带料又走过了很多中间棍,由于设备下侧部分是实现摆臂同步工艺所必须要的机械构造,所以若只有一个牵引轴必然会导致牵引力不均匀和牵引力不足。
-
两个牵引轴的速度匹配与同步停止
速度匹配:理论上牵引轴A和牵引轴B的线速度应该是相等的。
同步启停:两个牵引轴应当同步启停。
-
同步张力控制
如上侧图所示,系统中牵引A左侧部分材料的张力通过摆杆A施加,牵引B右侧部分材料张力通过摆杆B施加,在牵引AB之间材料的张力实际上是来源于AB之间材料的形变,即牵引轴AB在单位时间内的位移差。故若需要牵引AB之间材料具备可加工的张力,就需要牵引轴AB存在一定的速度差。
-
根据左侧设备示意图,写一下牵引A和牵引B部分小例程(其他部分机构程序不用管),支持一键启动、一键停止,牵引AB之间要形成一定的张力,支持在切换方向(停机时有效)
3.2. 引入虚轴
问题:这里为什么不直接让两个牵引轴的一个通过齿轮耦合跟随另一个牵引轴呢?直接耦合行不行?
直接耦合,其实也是可以的,但是一般我们项目上,涉及到多轴同步的场合(电子凸轮 & 电子齿轮)都不这么直接耦合,大都增加一个虚主轴,原因有以下几点:
-
实轴速度会有波动,导致从轴也跟着波动,加虚轴可以消除抖动的问题,运行实际更平稳。
-
还有一个响应滞后的问题,假如实轴A做主轴,实轴B做从轴,那么B始终是滞后A的;如果虚轴做主轴,实轴A与B做从轴,那么实轴A与B的参考对象是虚轴,
就解决了B滞后A的问题。
-
另外就是更方便的调整工艺需求,比如可以方便的调整虚主轴的速度,这样整机速度就同步调整了。
3.3. 程序框架
-
新建一个虚轴(主轴)和两个实轴(做牵引,右牵引),轴配置参数如下:
-
程序目录结构:
-
SCTY_INNER_IO:
-
GVL_Var:
3.4. 程序编写
-
PRG_TaskEct任务程序逻辑:
// 内部变量与实例化:
PROGRAM PRG_TaskEct
VAR
vmc_MasterPower : MC_Power;
vmc_MasterVelocity : MC_MoveVelocity;
vmc_MasterStop : MC_Stop;
vmc_LeftPower : MC_Power;
vmc_LeftGearIn : MC_GearIn;
vmc_RightPower : MC_Power;
vmc_RightGearIn : MC_GearIn;
END_VAR
// 程序代码:
vmc_MasterPower(
Axis:= V_Master,
Enable:= TRUE,
bRegulatorOn:= TRUE,
bDriveStart:= TRUE,
Status=> ,
bRegulatorRealState=> ,
bDriveStartRealState=> ,
Busy=> ,
Error=> ,
ErrorID=> );
vmc_MasterVelocity(
Axis:= V_Master,
Execute:= gb_MasterVelocityExecute,
Velocity:= gf_MasterVelocityValue,
Acceleration:= gf_TotalAccDec,
Deceleration:= gf_TotalAccDec,
Jerk:= ,
Direction:= gi_MasterDirection,
BufferMode:= ,
InVelocity=> ,
Busy=> ,
Active=> ,
CommandAborted=> ,
Error=> ,
ErrorID=> );
vmc_MasterStop(
Axis:= V_Master,
Execute:= gb_MasterEmyStop,
Deceleration:= gf_TotalAccDec,
Jerk:= ,
Done=> gb_MasterEmyStopDone,
Busy=> ,
Error=> ,
ErrorID=> );
vmc_LeftPower(
Axis:= R_LeftAxis,
Enable:= TRUE,
bRegulatorOn:= TRUE,
bDriveStart:= TRUE,
Status=> ,
bRegulatorRealState=> ,
bDriveStartRealState=> ,
Busy=> ,
Error=> ,
ErrorID=> );
vmc_LeftGearIn(
Master:= V_Master,
Slave:= R_LeftAxis,
Execute:= gb_LeftCoupler,
RatioNumerator:= gdi_LeftNumerator,
RatioDenominator:= gudi_LeftRightDenominator,
Acceleration:= gf_TotalAccDec,
Deceleration:= gf_TotalAccDec,
Jerk:= ,
BufferMode:= ,
InGear=> gb_LeftSyn,
Busy=> ,
Active=> ,
CommandAborted=> ,
Error=> ,
ErrorID=> );
vmc_RightPower(
Axis:= R_RightAxis,
Enable:= TRUE,
bRegulatorOn:= TRUE,
bDriveStart:= TRUE,
Status=> ,
bRegulatorRealState=> ,
bDriveStartRealState=> ,
Busy=> ,
Error=> ,
ErrorID=> );
vmc_RightGearIn(
Master:= V_Master,
Slave:= R_RightAxis,
Execute:= gb_RightCoupler,
RatioNumerator:= gdi_RightNumerator,
RatioDenominator:= gudi_LeftRightDenominator,
Acceleration:= gf_TotalAccDec,
Deceleration:= gf_TotalAccDec,
Jerk:= ,
BufferMode:= ,
InGear=> gb_RightSyn,
Busy=> ,
Active=> ,
CommandAborted=> ,
Error=> ,
ErrorID=> );
-
PRG_TaskMain程序逻辑:
3.5. 程序监控
-
Trace跟踪: