抖音粉丝群1
『7x24小时有问必答』

实现基于模拟量控制的斜坡曲线调速功能
概述
本文详细介绍了如何使用欧姆龙CJ系列PLC通过模拟量输出模块控制松下A5系列伺服驱动器,实现电机的斜坡曲线调速功能。系统包含启动/停止控制、上升/下降斜率设定、输出限制等功能,采用ST语言编写功能块,并使用变量标签进行程序组织。
系统架构与硬件配置
系统架构
本系统采用欧姆龙CJ系列PLC作为主控制器,通过模拟量输出模块控制松下A5伺服驱动器,实现对伺服电机的精确速度控制。系统架构如下图所示:
欧姆龙CJ2M PLC → CJ1W-DA08V模拟量模块  →  松下A5伺服驱动器  →  松下MH伺服电机
硬件配置
设备
型号
说明
PLC
欧姆龙CJ2M-CPU33
支持结构化文本编程和高性能控制
模拟量输出模块
CJ1W-DA08V
8通道模拟量输出,分辨率12位,输出范围0-10V
伺服驱动器
松下MADDT1205
A5系列,支持模拟量速度控制模式
伺服电机
松下MHMF042L1U2M
400W3000rpm,与A5驱动器配套使用
电源模块
S8VK-C12024
24V DC电源供应
硬件连接
CJ1W-DA08V模拟量输出模块连接到CJ2M PLC的扩展端口。模拟量输出通道连接到松下A5伺服驱动器的速度控制输入端子:
模拟量输出+ →  松下A5 CN1连接器3号引脚(速度指令输入+)模拟量输出- →  松下A5 CN1连接器11号引脚(模拟量公共端)PLC输出点  →  松下A5 CN1连接器41号引脚(伺服使能信号)PLC输出点  →  松下A5 CN1连接器43号引脚(报警复位信号)
参数配置
松下A5伺服驱动器参数设置
在开始编程前,需要先配置伺服驱动器的基本参数,通过驱动器面板或调试软件设置以下参数:
Pr0.01 = 0 //  控制模式选择:速度控制模式Pr0.02 = 1 //  速度指令选择:模拟量速度指令输入

Pr0.03 = 0 //  
转矩指令选择:不使用转矩指令

Pr0.07 = 100 //  
速度指令增益:100%

Pr3.00 = 1 //  
伺服使能信号选择:CN1-41引脚

Pr3.01 = 1 //  
报警复位方式:CN1-43引脚上升沿复位

Pr5.04 = 1 //  
模拟量速度指令极性:正极性(0-10V对应0-最大转速)

Pr5.16 = 2000 //  
模拟量速度指令最大输出时的转速:2000rpm

Pr5.17 = 0 //  
模拟量速度指令零偏调整:0

Pr5.18 = 100 //  
模拟量速度指令增益调整:100%

Pr0.08 = 100 //  
速度环比例增益:100%

Pr0.09 = 200 //  
速度环积分时间:200ms

Pr0.10 = 0 //  
速度环滤波器:0
欧姆龙CJ系列PLC配置
CX-Programmer中配置CJ2M PLCCJ1W-DA08V模块:
1.创建新工程,选择CJ2M-CPU33型号
2.IO表中添加CJ1W-DA08V模块,设置单元号为1
3.配置模拟量输出范围为0-10V(对应0-2000转速)
4.设置输出信号范围:0-10V对应0-4095数字量
5.设置输出刷新方式:CYCLIC
功能块设计与实现
功能块接口定义
FUNCTION_BLOCK FB_SpeedControlVAR_INPUT

bEnable: BOOL; (*  
功能块使能  *)

   bStart: BOOL; (*  
启动信号,上升沿触发  *)

   bStop: BOOL; (*  
停止信号,上升沿触发  *)

   rSetSpeed: REAL; (*  
设定速度值,单位:rpm *)

   rRampUpTime: REAL; (*  
上升斜率时间,单位:秒  *)

   rRampDownTime: REAL; (*  
下降斜率时间,单位:秒  *)

   rMinOutput: REAL; (*  
最小输出限制,单位:rpm *)

   rMaxOutput: REAL; (*  
最大输出限制,单位:rpm *)

END_VAR

VAR_OUTPUT

   rOutputSpeed: REAL; (*  
输出速度值,单位:rpm *)

   bRunning: BOOL; (*  
运行状态指示  *)

   bAccelerating: BOOL; (*  
加速状态指示  *)

   bDecelerating: BOOL; (*  
减速状态指示  *)

   bAtTarget: BOOL; (*  
达到目标速度指示  *)

END_VAR

VAR

   rCurrentSpeed: REAL; (*  
当前速度值  *)

   rTargetSpeed: REAL; (*  
目标速度值  *)

   rRampUpRate: REAL; (*  
计算出的上升斜率  *)

   rRampDownRate: REAL; (*  
计算出的下降斜率  *)

   tRampTimer: TIME; (*  
斜坡计时器  *)

   bStartRising: BOOL; (*  
启动信号上升沿检测  *)

   bStopRising: BOOL; (*  
停止信号上升沿检测  *)

   bLastStart: BOOL; (*  
上一次启动状态  *)

   bLastStop: BOOL; (*  
上一次停止状态  *)

   eState: INT; (*  
状态机:0=停止,1=加速,2=匀速,3=减速  *)

   bStopping: BOOL; (*  
正在停止标志  *)

END_VAR
<b>功能块ST语言实现
关键特性:本实现采用状态机设计,解决了斜坡下降和输出限制之间的矛盾,确保速度能够正确降到0
//  斜坡曲线速度控制功能块实现//  检测启动和停止信号的上升沿

bStartRising := bStart AND NOT bLastStart;

bStopRising := bStop AND NOT bLastStop;

//  
保存当前状态用于下一次扫描周期的边缘检测

bLastStart := bStart;

bLastStop := bStop;

IF bEnable THEN

   //  
状态机控制

   CASE eState OF

      0: //  
停止状态

         rCurrentSpeed := 0;

         bRunning := FALSE;

         bAccelerating := FALSE;

         bDecelerating := FALSE;

         bAtTarget := TRUE;

         bStopping := FALSE;

         IF bStartRising THEN

            eState := 1; //  
切换到加速状态

            tRampTimer := T#0s;

         END_IF;

      1: //  
加速状态

         bRunning := TRUE;

         bAccelerating := TRUE;

         bDecelerating := FALSE;

         bAtTarget := FALSE;

         bStopping := FALSE;

         

         //  
计算加速斜坡

         IF rRampUpTime > 0 THEN

            rCurrentSpeed := (rSetSpeed / rRampUpTime) * (TIME_TO_REAL(tRampTimer) / 1000.0);

         ELSE

            rCurrentSpeed := rSetSpeed; //  
如果加速时间为0,直接跳到设定速度

         END_IF;

         

         //  
检查是否达到目标速度

         IF rCurrentSpeed >= rSetSpeed THEN

            rCurrentSpeed := rSetSpeed;

            eState := 2; //  
切换到匀速状态

         END_IF;

         

         //  
检查是否收到停止信号

         IF bStopRising THEN

            eState := 3; //  
切换到减速状态

            tRampTimer := T#0s;

            bStopping := TRUE; //  
设置停止标志

         END_IF;

      2: //  
匀速状态

         bRunning := TRUE;

         bAccelerating := FALSE;

         bDecelerating := FALSE;

         bAtTarget := TRUE;

         bStopping := FALSE;

         rCurrentSpeed := rSetSpeed;

         

         //  
检查是否收到停止信号

         IF bStopRising THEN

            eState := 3; //  
切换到减速状态

            tRampTimer := T#0s;

            bStopping := TRUE; //  
设置停止标志

         END_IF;

      3: //  
减速状态

         bRunning := TRUE;

         bAccelerating := FALSE;

         bDecelerating := TRUE;

         bAtTarget := FALSE;

         

         //  
计算减速斜坡

         IF rRampDownTime > 0 THEN

            rCurrentSpeed := rSetSpeed - (rSetSpeed / rRampDownTime) * (TIME_TO_REAL(tRampTimer) / 1000.0);

         ELSE

            rCurrentSpeed := 0; //  
如果减速时间为0,直接跳到0

         END_IF;

         

         //  
检查是否减速到0

         IF rCurrentSpeed <= 0 THEN

            rCurrentSpeed := 0;

            eState := 0; //  
切换到停止状态

            bStopping := FALSE; //  
清除停止标志

         END_IF;

   END_CASE;

   

   //  
更新斜坡计时器

   tRampTimer := tRampTimer + T#10ms;

   //  
输出限制  -  确保速度在最小和最大限制范围内

   //  
只有在非停止过程中才应用最小输出限制

   IF NOT bStopping THEN

      //  
正常运行时的输出限制

      IF rCurrentSpeed > rMaxOutput THEN

         rOutputSpeed := rMaxOutput;

      ELSIF rCurrentSpeed < rMinOutput THEN

         rOutputSpeed := rMinOutput;

      ELSE

         rOutputSpeed := rCurrentSpeed;

      END_IF;

   ELSE

      //  
停止过程中的输出限制  -  允许降到0

      IF rCurrentSpeed > rMaxOutput THEN

         rOutputSpeed := rMaxOutput;

      ELSIF rCurrentSpeed < 0 THEN

         rOutputSpeed := 0;

      ELSE

         rOutputSpeed := rCurrentSpeed;

      END_IF;

   END_IF;

ELSE

   //  
功能块不使能时,重置所有状态

   rOutputSpeed := 0;

   bRunning := FALSE;

   bAccelerating := FALSE;

   bDecelerating := FALSE;

   bAtTarget := FALSE;

   rCurrentSpeed := 0;

   eState := 0;

   tRampTimer := T#0s;

   bStopping := FALSE;

END_IF;
<b>实现说明:本功能块采用状态机设计,包含四个状态:停止、加速、匀速和减速。通过bStopping标志区分正常减速过程和停止过程,解决了输出限制与斜坡下降之间的矛盾,确保速度能够正确降到0
主程序调用示例
PROGRAM MAINVAR

fbSpeedControl: FB_SpeedControl; (*  
速度控制功能块实例  *)

   bStartButton: BOOL; (*  
启动按钮  *)

   bStopButton: BOOL; (*  
停止按钮  *)

   rSetSpeedValue: REAL := 1500.0; (*  
设定速度值:1500rpm *)

   rRampUp: REAL := 2.0; (*  
加速时间2  *)

   rRampDown: REAL := 3.0; (*  
减速时间3  *)

   rMinOut: REAL := 100.0; (*  
最小输出100rpm *)

   rMaxOut: REAL := 2000.0; (*  
最大输出2000rpm *)

   rAnalogOutput: REAL; (*  
模拟量输出值  *)

   nAnalogOutputWord: WORD; (*  
模拟量输出字  *)

   tCycleTimer: TIME; (*  
循环计时器  *)

   bServoEnable: BOOL; (*  
伺服使能信号  *)

   bServoReset: BOOL; (*  
伺服报警复位信号  *)

END_VAR

//  
调用速度控制功能块

fbSpeedControl(

   bEnable := TRUE,

   bStart := bStartButton,

   bStop := bStopButton,

   rSetSpeed := rSetSpeedValue,

   rRampUpTime := rRampUp,

   rRampDownTime := rRampDown,

   rMinOutput := rMinOut,

   rMaxOutput := rMaxOut

);

//  
伺服使能控制

bServoEnable := fbSpeedControl.bRunning OR fbSpeedControl.bDecelerating;

//  
将输出速度值转换为模拟量输出(0-10V对应0-2000rpm)

rAnalogOutput := (fbSpeedControl.rOutputSpeed / 2000.0) * 10.0; //  
转换为0-10V信号

//  
将实数转换为模拟量模块所需的数字值(0-10V对应0-4095)

nAnalogOutputWord := REAL_TO_WORD(rAnalogOutput * 409.5);

//  
写入模拟量输出模块(假设模块地址为D20000)

D20000 := nAnalogOutputWord;

//  
循环计时器,用于模拟TIME_TO_REAL函数

tCycleTimer := tCycleTimer + T#10ms;

IF tCycleTimer >= T#1000s THEN

   tCycleTimer := T#0s;

END_IF;
<b>系统调试与优化
安全警告:在调试伺服系统前,请确保已采取适当的安全措施,特别是急停按钮功能正常工作,防止意外运动造成伤害或设备损坏。
调试步骤
1.检查所有硬件连接是否正确可靠,特别是电源线和信号线
2.确认伺服驱动器参数设置正确,特别是控制模式和信号范围
3.CX-Programmer中下载程序到PLC,设置PLC为运行模式
4.使用在线模式监视变量值,特别是rOutputSpeed和状态标志
5.逐步测试功能块的各项功能:启动、加速、匀速运行、减速停止
6.调整斜坡时间和输出限制参数,优化系统响应
7.测试异常情况处理:急停、电源中断、驱动器报警等
参数优化建议
加速/减速时间:根据负载惯量和机械强度调整,避免过大的机械冲击最小输出限制:设置适当的最小速度,避免电机在低速时抖动最大输出限制:根据电机和机械系统的最大允许速度设置伺服驱动器参数:根据实际负载调整速度环比例增益和积分时间
常见问题与解决方案
问题现象
可能原因
解决方案
电机不转动
伺服使能信号未接通、驱动器报警、模拟量输出值不正确
检查使能信号、清除驱动器报警、检查模拟量输出值
转速不稳定
模拟量信号干扰、机械共振、PID参数不合适
增加信号滤波、调整机械结构、优化PID参数
响应过慢
斜坡时间设置过长、PID参数过于保守
减小斜坡时间、增加速度环比例增益
超过最大转速
输出限制功能失效、模拟量输出校准不正确
检查输出限制逻辑、重新校准模拟量输出
速度无法降到0
输出限制与斜坡下降逻辑冲突
使用bStopping标志区分正常减速和停止过程
结论
本文介绍了使用欧姆龙CJ系列PLC通过模拟量模块控制松下A5伺服驱动器实现电机斜坡曲线调速的完整解决方案。通过合理配置硬件参数和编写结构化的ST语言功能块,实现了灵活的速度控制功能,包括可调的加速/减速斜率、输出限制和安全保护功能。
系统采用状态机设计,通过bStopping标志区分正常减速过程和停止过程,解决了输出限制与斜坡下降之间的矛盾,确保速度能够正确降到0。该系统具有良好的可扩展性,可根据实际应用需求进一步优化和扩展功能,如位置控制、转矩限制、多轴同步等。
实际应用中,应根据具体的机械特性和工艺要求调整参数,并进行充分的测试验证,确保系统安全可靠运行。
<mp-common-product data-windowproduct="v2=HODfqgKoCot-YqdfKckmn-9Klj6ppIFrEVPuodgr3k8pDqgjZb1rrtg3ymBH4Lm7WZejQTNjn_SxMw" data-customstyle="{" display":"block","height":"481px"}"="" data-cardtype="0" data-title="欧姆龙PLC编程及应用实例" data-type="0" has-insert-preloading="1" data-url-params="{" article_info":"eyjtcf9iaxoioiizodgxmtgxmty3iiwiaxrlbv9pzhgiojesimfwcg1zz2lkijoymjq3ndg0mdawlcjpdgvtx3nob3dfdhlwzsi6mcwibxbfyxj0awnszv9zy2vuzsi6mcwibxbfc3vix3njzw5lijowlcjtcf9nzxrfythrzxlfc2nlbmuiojasimnhcnjpzxjfdhlwzsi6mcwic2vhcmnox2nsawnrx2lkijoiin0="}" data-req-scene="1" data-loaded="1"></mp-common-product>
免责声明:本文内容源于网络内容整理优化而成,内容仅供学习参考,尊重版权侵权速删,歉意致谢!
</b></b></b>

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码