ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CODESYS虚拟单轴运动控制:从原理到工程落地全指南

CODESYS虚拟单轴运动控制:从原理到工程落地全指南 做运动控制的年头长了我越来越觉得一个项目里最花时间的往往不是那台真实电机怎么走准而是整个系统里“谁说了算”的问题。多轴联动、同步、张紧、仿真预调试这些场景里经常需要一个根本不存在于物理世界的轴它不发声音、不发热、不撞限位却要像一个乐队指挥一样把速度、位置、加速度的意图清清楚楚地传递给每一根真实轴。这个轴就是CODESYS里的虚拟轴。这篇内容我就拿“CODESYS控制虚拟单轴运动”当主线把虚拟轴是什么、为什么好用、工程怎么搭、指令怎么配、踩过哪些坑一次性讲清楚。不管你是刚从传统PLC转过来接触CODESYS的工程师还是已经在用SoftMotion但只调过真实轴的人这篇都适用。1. CODESYS为什么要弄一个“看不见的轴”出来1.1 虚拟轴的定位一个只输出位置指令的“参考模型”虚拟轴在CODESYS SoftMotion里本质上不是一个运动机构而是一个软件层面的参考模型。你可以给它目标位置、目标速度、加速度、减速度它会按照你设定的曲线规划在一个个插补周期里输出理想的位置值、速度值和加速度值。它不会驱动任何电机也不会接收编码器反馈它的“位置”就是一个不断更新的软件变量。理解这一点很关键。很多人刚上手时容易有个误区虚拟轴就是拿来看的没啥实际用处。实际上虚拟轴的价值恰恰体现在“它能把运动意图标准化”。真实轴最终动得是否平滑很大程度取决于主轴或参考轴的曲线是否合理虚拟轴帮你把这条参考曲线先算好、调顺再通过电子齿轮、电子凸轮或者程序赋值的方式送给下游整个系统会干净很多。1.2 虚拟轴解决的三类实际问题第一类是纯软件仿真场景。设备还没到场电气设计要先验证程序逻辑这时用虚拟轴跑一遍流程看动作顺序、连锁条件、报警逻辑是否合理比对着空气写梯形图要直观得多。第二类是主轴应用比如两台电机需要同步运行但机械上并没有一根实轴把它们连起来这时就建一个虚拟主轴两台真实轴通过电子齿轮都跟它同步关系由虚主轴曲线统一控制。第三类是数据前处理比如某些张力控制、飞剪控制中需要一个平滑的速度给定源虚拟轴天然带了速度规划、曲线过渡、上下限保护比手动写斜坡函数要可靠不少。除了这三类虚拟轴在数字孪生、HMI模拟调试、培训演示里也很常见。它把“运动控制”这件事从硬件依赖里解放出来让你在办公室就能把大部分控制逻辑验证掉。1.3 虚拟轴和真实轴的边界在哪里说句实在话虚拟轴不能完全替代真实轴。它没有负载、没有惯量、没有机械弹性、没有编码器噪声也没有驱动器限流这些物理约束。这意味着你在虚拟轴上跑得再顺也不能保证真实设备一次到位。但它能帮你把控制逻辑、曲线参数、上下游数据接口这些“上层建筑”先搞定剩下的物理调试就聚焦在电流环、速度环、机械共振这些“底层问题”上无形中把一个难问题拆成了两个相对容易的问题。这一点在我做过的项目里屡试不爽。2. 动手前先把虚拟单轴的几个基本概念盘清楚2.1 位置、速度、加速度到底用什么单位CODESYS柔动控制里轴的“用户单位”是可以自由定义的。你既可以把轴设成位置单位是毫米、速度单位是毫米/秒也可以设成角度单位是度、速度单位是度/秒甚至直接采用编码器计数单位。新手最常见的翻车现场就是把“轴单位”和“电机换算系数”混在一起导致目标位置写1000实际只走了1.25毫米差了三个数量级。虚拟轴因为没有物理电机参与换算单位的影响主要体现在下游接真实轴或接计算模块时的一致性。如果你虚拟主轴的小数位单位是“脉冲”下游从轴单位是“毫米”两者做电子齿轮时必须额外做单位转换。我习惯的做法是所有虚拟轴都直接采用最终工艺要用的单位比如“毫米”“度”“圈”在轴配置里统一设定不再另做转换。这样后续看着程序里的数值就能直接对应设备实际动作排查问题会省很多脑力。2.2 为什么轴必须“使能”之后才肯动用过SoftMotion的人都知道直接给轴发Move指令通常不会成功原因在于轴有状态机。轴对象上电后默认处于Disabled状态要先通过MC_Power把轴使能让它进入Standstill状态然后运动指令才能从Standstill转到Running状态运动结束后又回到Standstill。整个过程里还有Homing、Synchronized、Continuous等状态但单轴虚拟运动你先抓住从Disabled到Standstill再到Running这条主线就够用了。使能的实际意义在于给运动控制内核一个“许可”信号。真实轴使能时驱动器会通电并进入伺服闭环虚拟轴使能时虽然没有物理动作但控制内核会开始在线规划位置曲线。你要是不使能就发MoveAbsolute绝大多数情况下指令会直接报错或者Execute信号一闪而过但轴纹丝不动。这一点在你用上位机按钮触发运动时尤其容易踩到按钮松开后Execute信号消失轴还没来得及启动就被取消了。2.3 虚拟轴也要设限位和曲线别让它“裸奔”虚拟轴没有物理限位开关但这不意味着你可以不设软限位。恰恰因为虚拟轴经常会作为主令源它的位置一旦因为程序Bug或者PID积分累计跑飞下游真实轴会毫不犹豫地跟着冲。所以在轴参数里把最小位置、最大位置、最大速度、最大加速度这些安全值都配置好是虚拟轴应用里必须养成的好习惯。曲线规划方面CODESYS的轴运动指令里都带了加速度和减速度参数部分版本还支持Jerk加加速度参数。考虑到虚拟轴通常给下游当“榜样”我更推荐在允许的范围里把加减速稍微放慢一点甚至在机械冲击敏感的应用上启用S型曲线。这样下游真实轴跟随的压力会小很多系统整体看起来更柔顺而不是每个换向点都“咣当”一下。3. 实操从零搭一个CODESYS虚拟单轴工程3.1 环境准备装上SoftMotion运行时要跑虚拟轴单纯装CODESYS Development System是不够的还需要额外的SoftMotion组件。这个组件一般通过CODESYS Installer安装安装时勾选SoftMotion相关的包然后在新建工程时才能看到SoftMotion轴对象。如果用的是现场PLC部分设备的Runtime已经内置了SoftMotion功能如果是纯软件模拟需要确认这台电脑上的CODESYS Control仿真运行时带对应的授权或试用版本。多说一句CODESYS体系里不同厂商的定制版本可能界面略有差异比如汇川AM系列、部分国产CODESYS内核PLC菜单路径可能不完全一致但核心概念都是一样的。你在这套环境里练熟了切到别的CODESYS设备上基本无缝过渡。3.2 添加轴对象把驱动配置成“虚拟”新建一个Standard Project后目标设备选择“CODESYS Control Win V3”这类软件PLC就可以。接着在Application下面添加一个SoftMotion轴对象名字比如叫Axis_Virtual。新增轴会弹出一个驱动配置界面你会在里面看到EtherCAT、CANopen、脉冲输出等不同驱动选项虚拟轴要选择模拟/虚拟驱动具体名称根据不同版本可能是Virtual、Simulation或者“不分配驱动”。选好之后再回到轴参数配置页面把单位设为毫米、速度单位设为毫米每秒、位置范围设一个合理的区间比如0到10000毫米最大速度设为500毫米/秒最大加速度设为2000毫米/秒方。虚拟轴不需要编码器分辨率、母线电压这些物理参数但软限位和速度限制一定要设置。配合一个MC_Power和一个MC_MoveAbsolute这就是一个最小可用系统了。3.3 写控制程序使能、回零、定位三步走运动控制程序可以分三步第一步MC_Power把轴使能第二步用SMC_SetPosition把轴的当前位置清零相当于虚拟回零第三步执行一次MC_MoveAbsolute定位到目标位置。为了让这个例程足够直观我直接贴一份结构化文本代码读者可以照着建一个POU来试PROGRAM Main VAR AxisVirtual : AXIS_REF_SM3; // 虚拟轴实例 stPower : MC_Power; stSetPos : SMC_SetPosition; stMoveAbs : MC_MoveAbsolute; bEnable : BOOL : TRUE; bHomeReset : BOOL : FALSE; bMoveAbs : BOOL : FALSE; fSetPos : LREAL : 500.0; // 目标位置单位mm fVelocity : LREAL : 100.0; // 运动速度单位mm/s fAcc : LREAL : 500.0; // 加速度 fDec : LREAL : 500.0; // 减速度 END_VAR// 1. 轴使能 stPower.Axis : AxisVirtual; stPower.Enable : bEnable; stPower.bRegulatorOn : bEnable; stPower(); // 2. 位置清零 stSetPos.Axis : AxisVirtual; stSetPos.Execute : bHomeReset; stSetPos.Position : 0; stSetPos(); // 3. 绝对定位 stMoveAbs.Axis : AxisVirtual; stMoveAbs.Execute : bMoveAbs; stMoveAbs.Position : fSetPos; stMoveAbs.Velocity : fVelocity; stMoveAbs.Acceleration : fAcc; stMoveAbs.Deceleration : fDec; stMoveAbs();这段代码里bHomeReset和bMoveAbs需要外部置位触发。建议实际调试时用两个BOOL变量在监视窗口里手动置TRUE、复位FALSE就能反复观察运动过程。特别提醒运动指令的Execute是一个“上升沿有效”的信号你不能一直顶着TRUE否则下一次想触发时会因为信号没有下降沿而无法重新启动。3.4 下载运行看轴状态有没有按预期跳转把程序编译下载到软件PLC并运行之后你可以在轴对象的“轴诊断”或在线监视里看当前状态。正常情况下先看到状态从Disabled变为Standstill然后置位bMoveAbs后变为Running位置值开始逐步逼近500毫米等到达目标后状态回到Standstill。整个过程里速度值会先上升再下降呈一个梯形。如果发现状态一直停在Disabled大概率是MC_Power的Enable或bRegulatorOn没接通如果状态已经Standstill但触发运动没反应检查Execute是不是上升沿触发了以及轴是不是已经处在了目标位置。这些都是新手期最常见的现象肉眼排查比查代码更快。4. 单轴运动核心指令与参数拆开看更清楚4.1 MC_Power使能不是简简单单给个TRUEMC_Power用在真实伺服上是给驱动器下发“准备运行”信号用在虚拟轴上则是通知运动内核“这个轴可以开始规划曲线了”。它的执行过程有一个时间差Enable置TRUE后轴并不会瞬间就绪而是等内部状态机迁移完成后才进入Standstill。所以如果你的逻辑紧接着在同一扫描周期就发MoveAbsolute有可能运动指令先执行了导致被打回。稳妥做法是让运动指令比使能晚几个周期再执行或者在程序里增加一个“轴就绪后再给运动指令”的连锁判断。MC_Power还有一个非常容易忽略的点当轴的故障产生时bRegulatorOn会被切断或者轴会报错这时你需要把Enable和bRegulatorOn按顺序复位再重新置位一次很多轴才能恢复正常。对于虚拟轴虽然没有真正意义上的“掉使能”但状态机性质一致建议把MC_Reset也一起接上万一报警了能手动清除。4.2 MC_MoveAbsolute和MC_MoveVelocity到底选谁MC_MoveAbsolute是按绝对位置运动适合定位控制比如点位搬运、角度分度、坐标复位。MC_MoveVelocity是按速度模式运动适合连续运转场景比如恒速输送、张力辊、主轴空跑。这两个指令在很多项目里会组合使用先MC_MoveVelocity让虚拟主轴跑起来系统进入稳定运行后再通过电子齿轮把从轴跟上去或者反过来MC_MoveAbsolute先导到等待位然后切换成MC_MoveVelocity持续运行。选型上有一条判断路径你的最终工艺关注的是“去哪儿”还是“跑多快”。定位类优先绝对或相对定位连续类优先速度模式。虚拟轴做速度源的时候特别适合MC_MoveVelocity因为你可以把这个速度值平滑地输出给下游比手动写一个斜坡函数要省钱省力。4.3 加减速参数对运动效果的影响比你想的大同一段100毫米的定位用同样的最大速度加速度设500和设5000视觉上可能看不出太多区别但下游的真实轴反馈差异是巨大的。加速度越大曲线越“满”系统在启停瞬间的冲击越强结构振动越明显加速度越小运行时间越长效率越低。虚拟轴由于没有物理约束你很可能会下意识把加速度设大觉得反正不会损坏设备但跟随它的从轴却有真实的电流限制和机械强度限制所以虚拟轴的曲线参数一定要从整个系统的角度去定。如果项目里有明显的机械谐振我建议在虚拟轴上加Jerk限制把速度转折处从直角变成圆角。CODESYS里部分版本支持在轴参数里开启Jerk限制或者使用速度规划函数实现。不要小看这一个圆角很多跟随误差大、设备抖动严重的问题根源就在加速度突变那一下。5. 把虚拟轴玩出花电子齿轮、PID与联动控制5.1 用虚拟轴当主轴真实轴做电子齿轮跟随虚拟轴最经典的应用是当“虚主轴”。工艺上需要两根或多根轴保持固定比例关系时比如印刷机的版辊和胶辊、贴标机的牵引轴和切刀轴不需要机械齿轮箱而是在控制里做一个电子齿轮。电子齿轮的从轴可以跟随任何轴包括虚拟轴。这时虚拟轴的轴类型依然是普通轴主从关系通过MC_GearIn或MC_GearOut指令建立。操作步骤是先让虚拟主轴以MC_MoveVelocity进入连续运动再接一个MC_GearIn把真实从轴以一定比例耦合上去。比例值用RatioNumerator和RatioDenominator两个整数参数表示比如从轴速度是主轴的二分之一可以设Numerator:1Denominator:2。好处是比例用分数精确表示不存在浮点误差这在凸轮和同步场景里很重要。调试这种跟随系统时有个非常实用的技巧把虚拟主轴的位置、真实从轴的位置、两者的差值放进同一个Trace波形里看。只要差值曲线是一条平稳的直线说明电子齿轮工作正常如果差值出现周期性的波动先查主轴速度曲线是否平滑再查从轴的负载变化。很多时候问题不在电子齿轮耦合上而是主轴本身就是带毛刺的速度源。5.2 虚拟轴上的PID控制与级联思路大家搜“CODESYS PID”时经常看到级联PID这个关键词。在运动控制里级联PID通常指位置环、速度环、电流环层层嵌套的结构真实伺服驱动器内部就是这样工作的。但虚拟轴本身并不需要电流环因为它根本不产生电流。那PID和虚拟轴有什么关系关系在于虚拟轴经常作为“理想位置源”和真实轴的反馈位置做比较生成偏差再通过PID对这个偏差进行调节。比如有些张力控制系统里虚拟轴按照理想线速度产生位置指令真实放卷轴的反馈位置和这个指令做差PID输出一个附加速度修正量叠加下来。此时虚拟轴提供了一个干净的参考信号PID负责应付真实系统的扰动两者分工明确。还有一种情况是做软件低通滤波用虚拟轴本身的位置规划充当一个带限速、限加速度的参考模型配合一个简单的P控制器就能让从轴走得很稳。有一点要提醒纯软件PID控制的稳定性分析是绕不过去的别指望调大比例增益就能解决所有跟随问题。虚拟轴延时、通信周期、任务抖动都会给系统带来相位滞后比例增益过大会让整个系统振荡。我的习惯是先让虚拟轴曲线尽量平缓再从小到大调PID增益每次只动一个参数观察Trend曲线变化。5.3 与上位机和数据采集工具的数据交互不少人在搜“PLC Recorder读取CODESYS变量”说明大家在实际项目中确实需要把运动数据采集出来做分析。CODESYS里要对外暴露轴上各种变量通常要做“符号配置”。默认情况下你在程序里声明的变量、轴对象的动态数据不一定都能被外部OPC UA或者第三方工具直接读取需要先在Application的Symbol Configuration里将相关变量发布出去。如果你是走Modbus TCP给外部采集系统则还要建立对应的保持寄存器映射把轴位置、速度、状态字映射过去。虚拟轴因为不涉及硬件地址它的位置、速度、使能状态都是纯软件变量非常适合采集。我在设备预调试阶段都会把虚拟主轴的位置、从速度、PID输出这几个变量周期记录下来用离线曲线分析整个运动过程是否合理。这比自己盯着屏幕看数字跳动要高效得多尤其当故障发生时历史曲线能准确还原事故前的几百毫秒发生了什么省去了很多“我以为它好好的”这类争论。6. 常见问题与排查技巧实录6.1 使能了但轴不动优先查这几处先说最容易发生的状态已经StandstillExecute也给了上升沿但轴就是不动。这时候你先看目标位置和当前位置是不是已经一致了很多“不动”其实是“早就到了”。再看指令Velocity是不是设成了0CODESYS很多运动指令里速度参数为0会导致指令直接报错或者立即完成。还要确认Execute是否真的产生了上升沿用一个BOOL变量在外部触发正常每一个上升沿对应一次有效运动。另外一个隐蔽问题是任务周期。SoftMotion的运动计算要求在运动控制任务里调用而且任务周期最好和插补周期匹配一般用1ms或2ms。如果你把主程序放在一个100ms的周期任务里调用运动指令轴不是完全不能动而是动作会非常卡顿位置增量一蹦一蹦的看起来就像“没动”。解决方法是单独建一个高优先级、短周期的任务专门跑运动控制相关POU。6.2 位置速度数值和预期差了几个数量级虚拟轴没有硬件反馈位置值纯靠曲线积分累加所以一旦单位配置错后果比真实轴更隐蔽因为它不会报错只是数值不对。比如轴单位设的是“圈”你以为是“毫米”那么目标位置500毫米实际给轴的是500圈对于虚拟轴来说它不会跑到天边但下游真实轴如果真的跟随就会高速飞车。排查时先看轴参数里的“单位”字段再看你指令里速度、位置的数值是否和单位匹配。还有一个常见做法是把轴的当前值放到可视化界面上显示出来运行一段已知距离看显示值和机械实际值的对应关系。如果比例是整数倍基本就是单位或电子齿轮比例的问题。6.3 轴状态反复报错定位问题的通用思路虚拟轴报错不像真实轴那样有明确的高速温度、过流、编码器断线可以查更多是软件层面的问题比如位置超过软限位、速度设置超过最大速度、运动指令执行时轴未使能、曲线规划超时等。遇到报错先别急着把错误码抄到群里问直接在轴关联的SMC_ReadAxisError指令或者轴诊断窗口里读错误码对照当前版本SoftMotion的错误码表大部分问题能直接定位。还有一招很实用把轴使能时的状态变化和运动指令的Busy、Done、Error信号一起放进Trace里记录。一旦故障发生你能看出到底是使能没建立还是运动指令在哪个阶段复位掉了。这套“用数据代替猜测”的排查方式比反复按F9单步执行要快得多。6.4 虚拟轴和真实轴同步时总是对不齐同步类应用里经常出现虚拟主轴和真实从轴在启动后对不齐、跑一段时间误差越积越大的现象。先看电子齿轮比例是否生效很多版本里MC_GearIn只在Execute上升沿时捕获比例参数已经耦合的话改比例不会立即生效需要先执行GearOut再重新GearIn。然后看真实从轴本身是否存在丢步或跟随超差这个要从驱动器的实际位置跟踪误差里看。如果虚拟主轴和从轴之间有程序计算环节比如有个PID输出附加速度叠加那还要重点检查这个附加量的限幅和清零逻辑。我处理过一个张力项目问题就出在附加速度量累计到一定值后没有及时清零从轴越追越偏最后表现为周期性误差。把虚拟轴位置看作基准把实际反馈和基准的差值设定一个死区小于死区就不再积分系统就稳下来了。这里把最常踩的几个问题整理成一张表方便现场对照问题现象可能原因处理方法轴不动或动作很奇怪Execute没有正确上升沿用BOOL变量手动触发观察运动状态使能后仍报错使能时序不对或未复位按Enable、Reset、再次使能顺序处理位置数值偏差极大用户单位配置错误核对轴单位与指令数值单位速度看起来一顿一顿任务周期过慢单独建1ms或2ms运动任务调用POU从轴跟随误差越来越大电子齿轮比例未生效或附加速度积分超限重新GearIn给附加量加限幅和死区外部工具读不到轴变量符号配置未发布变量在Symbol Configuration里勾选发布的变量最后分享一个小技巧虚拟轴调试阶段很多人习惯盯着轴诊断界面的数字看有没有反应这是效率最低的方式。我自己的做法是从第一个能跑通的程序开始就把虚拟轴的位置、速度、跟随差值这些关键量全部做成Trace或数据记录哪怕只是一个非常简单的单轴定位动作也要留下一条历史曲线。等以后系统复杂了、故障出现了这些看似普通的基线数据反而能帮你在几分钟内锁定问题比临时加变量重新采集靠谱得多。运动控制这件事曲线和数据永远比感觉更可信。
返回列表