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跟踪:

 

### 回答1: CODESYS凸轮程序是一种基于CODESYS编程环境的编程技术,用于控制机械设备的凸轮运动。凸轮是一种机械装置,它可以通过不同形状的凸轮曲线来实现工件的定位和运动控制CODESYS凸轮程序的编写主要包括以下几个步骤: 1. 配置凸轮参数:首先需要定义凸轮的参数,包括凸轮的曲线形状、凸轮轴的位置和运动速度等。这些参数可以根据具体的机械设备要求进行设置。 2. 编写凸轮程序:在CODESYS编程环境中,可以使用Ladder Diagram(梯形图)或Structured Text(结构化文本)等编程语言来编写凸轮程序。凸轮程序主要包括凸轮运动的起始、运动方向、运动速度等控制逻辑。 3. 进行调试和测试:完成凸轮程序的编写后,需要进行调试和测试,以确保凸轮的运动符合预期。可以通过模拟器或实际的机械设备进行调试,观察凸轮的运动状态,及时调整程序逻辑和参数。 CODESYS凸轮程序的应用非常广泛。例如,在自动化生产线中,可以使用凸轮程序控制工件的定位、装配和运输等。此外,凸轮程序还可以应用于机械手臂、升降机械等设备的运动控制。 综上所述,CODESYS凸轮程序是一种用于控制机械设备凸轮运动的编程技术,它通过设置凸轮参数和编写控制逻辑来实现凸轮的精确运动控制。这种编程技术在自动化生产线和机械设备控制中具有重要的应用价值。 ### 回答2: Codesys凸轮程序,即Codesys软件中的凸轮控制程序,是一种基于凸轮机构的运动控制方法。通过编写凸轮程序,可以实现各种复杂的运动轨迹和动作控制。 凸轮控制程序的编写主要涉及以下几个方面: 1. 凸轮参数定义:首先要定义凸轮的参数,如凸轮的形状、轴心位置、角度等。凸轮的形状可以是圆形、椭圆形、三角形等。轴心位置和角度的定义则决定了凸轮的位置和运动方式。 2. 轴控制指令:在凸轮控制程序中,需要使用到轴控制指令来控制凸轮所连接的轴的运动。通过设置相应的目标位置和速度,可以实现轴的预定运动轨迹。可以根据需要设置不同的轴运动参数,如加速度、减速度等。 3. IEC 61131-3编程:Codesys软件使用IEC 61131-3标准作为其编程语言。在凸轮控制程序中,可以使用LD、FBD、ST、SFC和IL等编程语言来编写相应的控制逻辑。通过程序的编写,可以实现凸轮运动和轴的同步控制。 4. 运动控制信号输出:凸轮控制程序通过控制输出信号来控制运动执行器,如电机、气缸等。可以根据需要配置相应的IO模块,将控制信号输出到执行器上,从而实现凸轮运动控制。 总之,Codesys凸轮程序是一种基于凸轮机构的运动控制方法,通过编写凸轮参数定义、轴控制指令、IEC 61131-3编程和运动控制信号输出等方面内容,可以实现复杂的运动轨迹和动作控制。该方法在自动化领域中广泛应用,为各种机械设备的精密控制提供了有效的解决方案。 ### 回答3: CODESYS凸轮程序是一种专门用于控制凸轮机构的编程语言。凸轮机构是一种常见的机械结构,可以将旋转运动转换为线性运动,常用于开关、阀门、喷涂等机械设备的控制。 CODESYS凸轮程序通过编程语言,定义凸轮运动的参数和规则,将其转化为机械设备的控制信号,实现凸轮机构的运动控制。具体来说,凸轮程序可以实现以下功能: 1. 定义凸轮运动的周期和相位:可以通过编程语言设置凸轮的周期和相位,使其按照预定的时间和位置运动。 2. 控制凸轮运动的速度和加速度:可以通过编程语言设置凸轮的速度和加速度,实现凸轮运动的平滑和稳定控制。 3. 定义凸轮运动的角度和距离:可以通过编程语言设置凸轮的运动角度和线性距离,实现凸轮机构的自定义控制。 4. 实现凸轮运动的互锁和安全保护:可以通过编程语言设置凸轮运动的互锁和安全保护机制,确保凸轮机构在工作中的安全性和可靠性。 CODESYS凸轮程序具有良好的灵活性和扩展性,可以与其他控制系统和设备进行集成,实现更复杂的机械控制。通过对凸轮运动参数的自定义设置,可以满足不同机械设备的控制需求,并提高生产效率和产品质量。 总之,CODESYS凸轮程序是一种用于控制凸轮运动的编程语言,可以实现凸轮机构的灵活控制和安全保护,提高机械设备的运行效率和生产质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值