Codesys.运动控制电子凸轮

文章案例 Codesys.运动控制电子凸轮案例包资源-CSDN文库

文章目录

一. 电子凸轮基本概念

二. 电子凸轮应用场景

三. 电子凸轮创建

四. 电子凸轮耦合功能块

3.1. MC_CamTableSelect

3.2. MC_CamIn

3.3. MC_CamOut

五. 电子凸轮案例

5.1. 样例介绍

5.2. 引入虚轴

5.3. 程序框架

5.4. 程序编写

5.5. 程序监控


一. 电子凸轮基本概念

机械图伦的推杆位置跟随凸轮角度的周期性变化而变化,其运动特性与机械凸轮的外形相关,定义凸轮为主轴,推杆为从周,那么凸轮的实质就是从周对应主轴的一种位置函数关系

机械电子化,硬件软件化成为当今工业自动化发展趋势,随着制造装备的技术升级,伺服的应用日渐普及,应用系统要求多轴同步运动控制功能,在包装、印刷、鲤电等行业应用极其广泛,采用多伺服轴代替传统机械凸轮,已成为主流趋势

电子凸轮是利用软件数字方式的“凸轮表”来代替机械凸轮,因此也称电子凸轮控制。相比于机械凸轮,电子凸轮具有更好的灵活性。可以在程序中自由修改凸轮曲线实现不同工艺需求

机械凸轮需要机械上的连接才能使推杆跟随运动,电子凸轮用控制器取代机械凸轮,直接控制推杆从轴运动(实际用伺服电机代替了),将推杆和凸轮的运动关系转化为凸轮曲线。电子凸轮对比机械凸轮,具有使用灵活、节约成本、减小机械噪音等优点。

电子凸轮到底是什么?

再总结一遍,电子凸轮其实就是主轴位置和从轴位置的一种函数对应关系。简单理解是主轴到哪个位置,从轴就同步运行到凸轮曲线对应的从轴位置

  • 机械凸轮,需要机构连在一起传动。传动关系取决于机械凸轮的形状的。

  • 电子凸轮,实际上两个轴不用机械连在一起,是独立的,通过PLC的电子凸轮曲线,控制伺服同步运行的。

二. 电子凸轮应用场景

  • 工艺

电子凸轮广泛应用于包装,印刷,木工,鲤电,硅晶等先进制造行业。电子凸轮相比于机械凸轮,更加灵活易用。电子凸轮修改只需要修改相应的位置和速度曲线即可,而机械凸轮的修改需要加个机械零件。

  • 总结

  • 凸轮形状制作容易:可以采用凸轮表、凸轮曲线或数组描述凸轮。

  • 凸轮形状容易多样:支持多个凸轮表选择、运行中可动态切换。

  • 凸轮形状修改容易:允许凸轮表关键点运行中动态修改。

  • 凸轮多个从轴:允许有多个凸轮从轴。

  • 凸轮挺杆:允许有多个凸轮挺杆、多个设置区间。

  • 凸轮离合器:凸轮运行中,用户程序可使之进入与退出凸轮运行。

  • 凸轮特有功能:支持虚拟主轴,相位偏移,输出叠加。

三. 电子凸轮创建

  • 鼠标选中Application,右键-添加对象cam表来新建一个凸轮表。

  • 在轮表中进行关键点的设计以及凸轮曲线的规划。

  • 在Codesys中,对每一个CAM 表,都有描述该CAM 表的数据结构,描述该CAM 表的特征数据为“CAM”凸轮表的描述数据结构,请注意其结构各变量名称。

  • 在Codesys 在内部有一个数据结构来描述CAM 凸轮表的特征:如果我们手动编写一个CAM 表也是可以的,如下虽然我们不需要手动编写CAM 表,但我们可以通过

  • 数据结构的访问操作,对所需的CAM 特性数据进行修改。

注意: 我们在声明CAM凸轮表时,系统自动默认声明了全局变量类型的CAM 数据结构,同时声明了CAM Ai数组可以在用户程序中,修改CAM 凸轮表关键点个数或坐标

四. 电子凸轮耦合功能块

电子凸轮的控制有三个要素:

  • 主轴:被用于同步控制的参考轴。

  • 从轴:根据主轴位置,按照所需非线性特性进行跟随运动的伺服轴。

  • 凸轮表:描述主轴-从轴相对位置与范围、周期性等的数据表或凸轮曲线。

用户编写程序需要设计凸轮表,指定主轴与从轴,运行中在合适时刻触发凸轮运行,就可以使得从轴进入凸轮运行了电子凸轮相关功能块。

3.1. MC_CamTableSelect

  • 指定凸轮表,与MC_CamIn 指令配合使用。

  • 详情可以查看Codesys运动控制手册。

3.2. MC_CamIn

  • 使用指定的凸轮表开始执行电子凸轮动作,可根据应用需求指定主从轴偏置值、缩放比和工作模式。

  • 详情可以查看Codesys运动控制手册。

运行了MC_CamTableSelect功能块后,在运行该功能块可以使得Slave从周进行凸轮运行状态(Synchronized_Motion,即Axis.nAxisState=6),并且每个EtherCat任务周期,系统军执行一次功能块,根据主轴当前位置和凸轮表,计算从周的下一个目标位置,若没有运行MC_CamTableSelect功能块,触发该功能块就会报错。

本指令的功能是,使凸轮从轴进入与凸轮主轴同步运行状态,根据主轴当前位置、凸轮表的位置关系,控制凸轮从轴调整到对应的目标点该指令的执行对主轴没有任何影响。一旦MC Camln 被触发,从按照凸轮表的位置对应关系,跟随主轴的位置运动,注意是位置对应,而不是速度对应,进入凸轮运行后,系统每次EtherCAT 中断都会解析CAM 凸轮表,根据主轴当前位置计算从轴的下一个目标点,然后将下一目标位置发送给从轴,令其运行。

3.3. MC_CamOut

  • 终止执行中的 MC_GearIn,MC_GearInPos 指令, MC_Stop 等指令配合使用断开从轴的凸轮耦合关系。注意: 执行该指令后从轴会按照分离前的速度继续运行,所以需要跟MC_Stop等指令配合使用。

  • 详情可以查看Codesys运动控制手册。

五. 电子凸轮案例

5.1. 样例介绍

电子凸轮测试功能说明: 有两个实轴,一个作为凸轮主轴一个是凸轮从轴。带大家跑一下电子凸轮功能块的具体测试。

一般项目中,我们经常引入一个虚轴作为两个实轴的主轴,其中一个实轴和虚轴1:1电子齿轮耦合,然后虚主轴和另外一个实轴,以电子凸轮方式耦合。

5.2. 引入虚轴

                                                                               

问题:这里为什么不直接让两个牵引轴的一个通过齿轮耦合跟随另一个牵引轴呢?直接耦合行不行?

直接耦合,其实也是可以的,但是我们项目中一般不这么做,我们一般都会增加一个虚轴作为主轴。

  • 虚轴的速度没有波动,实轴的话受到编码器反馈速度是波动的。

  • 使用需求的话,可以解决实轴耗合时从轴永远滞后主轴的问题。

  • 可以方便的调整控制结构,实现不同动作工艺需求的控制。

5.3. 程序框架

提示:调用命令是状态机的切换与运行模式看图解:

  • 新建一个虚轴(主轴)和两个实轴(实主轴,实从轴),轴配置参数如下:

  • 程序目录结构:

  • 创建Cam表,配置如下:

 

  • SCTY_INNER_IO:

  • GVL_Var:

5.4. 程序编写

  • PRG_TaskEct任务程序逻辑:

// 内部变量与实例化:
PROGRAM PRG_TaskEct
VAR
    vmc_MasterPower                 : MC_Power;
    vmc_FilmPower                   : MC_Power;
    vmc_KnifePower                  : MC_Power;
​
    vmc_MasterStop                  : MC_Stop;
    vmc_FilmStop                    : MC_Stop;
    vmc_KnifeStop                   : MC_Stop;
    
    vmc_MasterVelocity              : MC_MoveVelocity;
    vmc_FilmGearIn                  : MC_GearIn;
    vmc_KnifeCamTableSelect         : MC_CamTableSelect;
    vmc_KnifeCamIn                  : MC_CamIn;
    vmc_KnifeCamOut                 : MC_CamOut;
END_VAR
​
// 程序代码:
A00_Axis();
A01_GearCam();
  • A00_Axis()

vmc_MasterPower(
    Axis:=                      V_Master, 
    Enable:=                    TRUE, 
    bRegulatorOn:=              TRUE, 
    bDriveStart:=               TRUE, 
    Status=> , 
    bRegulatorRealState=> , 
    bDriveStartRealState=> , 
    Busy=> , 
    Error=> , 
    ErrorID=> );
    
vmc_FilmPower(
    Axis:=                      R_Master_Film, 
    Enable:=                    TRUE, 
    bRegulatorOn:=              TRUE, 
    bDriveStart:=               TRUE, 
    Status=> , 
    bRegulatorRealState=> , 
    bDriveStartRealState=> , 
    Busy=> , 
    Error=> , 
    ErrorID=> );    
    
vmc_KnifePower(
    Axis:=                      R_Slave_Knife, 
    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_MasterStop, 
    Deceleration:=              gf_TotalAccDec, 
    Jerk:= , 
    Done=>                      gb_MasterStopDone, 
    Busy=> , 
    Error=> , 
    ErrorID=> );    
    
vmc_FilmStop(
    Axis:=                      R_Master_Film, 
    Execute:=                   gb_FilmStop, 
    Deceleration:=              gf_TotalAccDec, 
    Jerk:= , 
    Done=>                      gb_FilmStopDone, 
    Busy=> , 
    Error=> , 
    ErrorID=> );    
    
vmc_KnifeStop(
    Axis:=                      R_Slave_Knife, 
    Execute:=                   gb_KnifeStop, 
    Deceleration:=              gf_TotalAccDec, 
    Jerk:= , 
    Done=>                      gb_KnifeStopDone, 
    Busy=> , 
    Error=> , 
    ErrorID=> );    
A01_GearCam()

vmc_FilmGearIn(
    Master:=                    V_Master, 
    Slave:=                     R_Master_Film, 
    Execute:=                   gb_FilmGearExecute, 
    RatioNumerator:=            gdi_FilmNumerator, 
    RatioDenominator:=          gudi_FilmRightDenominator, 
    Acceleration:=              gf_TotalAccDec, 
    Deceleration:=              gf_TotalAccDec, 
    Jerk:= , 
    BufferMode:= , 
    InGear=>                    gb_FilmGearSyn, 
    Busy=> , 
    Active=> , 
    CommandAborted=> , 
    Error=> , 
    ErrorID=> );
​
vmc_KnifeCamTableSelect(
    Master:=                    V_Master, 
    Slave:=                     R_Slave_Knife, 
    CamTable:=                  Cam, 
    Execute:=                   gb_KnifeCamTabExecute, 
    Periodic:=                  TRUE, 
    MasterAbsolute:=            FALSE, 
    SlaveAbsolute:=             FALSE, 
    Done=>                      gb_KnifeCamTabDone, 
    Busy=> , 
    Error=> , 
    ErrorID=> , 
    CamTableID=> );
        
vmc_KnifeCamIn(
    Master:=                    V_Master, 
    Slave:=                     R_Slave_Knife, 
    Execute:=                   gb_KnifeCamExecute, 
    MasterOffset:=              0, 
    SlaveOffset:=               0, 
    MasterScaling:=             1,   
    SlaveScaling:=              1, 
    StartMode:=                 relative, 
    CamTableID:=                vmc_KnifeCamTableSelect.CamTableID, 
    VelocityDiff:= , 
    Acceleration:= , 
    Deceleration:= , 
    Jerk:= , 
    TappetHysteresis:= , 
    InSync=>                    gb_KnifeCamSyn, 
    Busy=> , 
    CommandAborted=> , 
    Error=> , 
    ErrorID=> , 
    EndOfProfile=> , 
    Tappets=> );
    
vmc_KnifeCamOut(
    Slave:=                     R_Slave_Knife, 
    Execute:=                   gb_KnifeCamOutExecute, 
    Done=>                      gb_KnifeCamOutDone, 
    Busy=> , 
    Error=> , 
    ErrorID=> );
  • PRG_TaskMain程序逻辑:

// 内部变量与实例化:
PROGRAM PRG_TaskMain
VAR
    iStep                       : INT;
    
END_VAR
​
// 程序代码:
CASE iStep OF 
    // 设备启动
    00:
        IF gsc_InnerIO.gb_Start AND V_Master.nAxisState = 3 THEN  
            iStep := 10;
        END_IF
    
    // 设备初始化
    10:
        gb_FilmGearExecute := TRUE;
        gb_KnifeCamTabExecute := TRUE;
        
        IF gb_FilmGearSyn AND gb_KnifeCamTabDone THEN 
            gb_KnifeCamExecute := TRUE; 
            
            IF gb_KnifeCamSyn THEN 
                iStep := 20;
            END_IF;
        END_IF
​
    // 设备运行
    20:
        gb_MasterVelocityExecute := TRUE;
​
        IF gsc_InnerIO.gb_Stop THEN 
            gb_MasterVelocityExecute := FALSE;
            iStep := 30;
        END_IF
    
    // 设备停止 
    30:
        gb_MasterStop := TRUE;
        
        IF gb_MasterStopDone THEN 
            gb_MasterStop := FALSE;
            gb_FilmGearExecute := FALSE;
            gb_KnifeCamTabExecute := FALSE;
            gb_KnifeCamExecute := FALSE;
            iStep := 00;
        END_IF
END_CASE

5.5. 程序监控

  • Trace跟踪:

 

  • 32
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CODESYS是一种广泛应用于自动化领域的编程软件平台。它提供了一种简单而强大的方法来编写和调试程序,用于控制各种设备和系统。凸轮挺杆是一种传动机构,通常用于将旋转运动转换为直线运动。CODESYS电子凸轮挺杆则结合了这两个概念,提供了一种程序化控制凸轮挺杆的方法。 通过CODESYS平台,我们可以编写一个程序来控制凸轮挺杆的运动。首先,我们需要定义凸轮的运动轨迹。可以通过给定的参数和方程来描述凸轮运动的路径。然后,我们可以使用凸轮的位置来计算挺杆的位置,并将其发送到执行器上。 在CODESYS中,我们可以使用各种编程语言来编写凸轮挺杆的控制程序,例如结构化文本(ST)或函数块图(FBD)。我们可以使用条件语句、循环语句和数学运算等基本编程概念来定义凸轮挺杆的行为。CODESYS还提供了一系列的函数库和工具,用于简化编程过程。 使用CODESYS电子凸轮挺杆可以实现许多应用,例如自动化生产线上的部件组装,机器人的运动控制等。通过编写程序,我们可以精确地控制凸轮挺杆的位置和速度,以实现我们所需的运动轨迹。 总之,CODESYS电子凸轮挺杆提供了一种程序化控制凸轮挺杆的方法。通过编写控制程序,我们可以精确地控制凸轮挺杆的运动,实现各种自动化应用。这种技术在工业领域中有着广泛的应用和重要的意义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值