☰
西门子S7-1500T凸轮输出OUPUTCAM指令:高速气缸精准同步方案
2026/10/7 18:21:19 网站建设 项目流程

先问一句:你手头有没有遇到过这样的设备,主轴转速一上来,靠普通DO点去控制气缸动作总是“慢半拍”?我在好几个旋转式包装项目里都栽过这个跟头。后来换了思路,把凸轮输出交给S7-1500T硬件去算,用OUPUTCAM指令把角度和输出点直接挂上钩,气缸动作才真正跟上了主轴节奏。这篇文章就把这套玩法的完整路径写出来:为什么非要凸轮输出、1500T里的工艺对象怎么建、凸轮分段数据怎么填、OUPUTCAM指令怎么调,以及实测时最容易踩的坑。无论是做旋转裁切、模切、贴标,还是多工位转盘气缸,这套思路都能直接抄作业。

1. 为什么普通DO控制气缸会“慢半拍”:凸轮输出的价值

1.1 一个算账案例:5ms扫描周期到底丢了多少度

先说个我调试过的典型场景:一台八工位转盘设备,主伺服带着转盘旋转,转盘每个工位上有一个小气缸,需要在某个固定角度区间内把料顶起来,过了这个区间就得缩回去。

一开始用最常规的做法:伺服编码器反馈回PLC,程序里读绝对位置,做比较,满足条件就置位Q点,不满足就复位。听起来没毛病,可实际跑起来,转盘转速只要超过300r/min,气缸动作就开始“飘”,要么顶早了,要么该缩的时候还伸着。

问题出在哪里?算一笔账就清楚了。假设PLC主循环是5ms,高速计数器或运动控制轴的反馈虽然实时刷新,但程序读到位置、做出判断、再写Q点,这中间至少要跨一个扫描周期。300r/min是什么概念?等于每毫秒转1.8度,5ms扫描周期意味着整整9度误差。再加上气缸电磁阀本身的响应时间、气缸动作时间,一个窗口只有20度的动作区间,根本卡不住。

这不是程序写得不好,而是传统的“读位置-判断-输出”链路本身就带着延迟。只要速度快,延迟就会被角度放大。

1.2 凸轮输出和普通数字量输出的本质差异

凸轮输出的思路和上面完全不同。它借鉴了机械凸轮的工作方式:一根凸轮轴转一圈,上面的凸轮块在固定的角度范围内压住行程开关,把气缸或机构顶起来。电子凸轮实现的就是把这个机械曲线“数字化”:角度作为输入,输出状态作为结果,由一个专门的工艺对象在运动控制周期内计算并映射到物理输出点。

关键差异在于,PLC程序不需要再每个周期去读位置、做比较、写输出。你把“什么角度输出什么状态”这张表配置好,凸轮输出工艺对象会自动根据主轴的实际位置去刷新输出点。位置更新和输出刷新都是硬件级别的处理,不像普通DO点那样依赖扫描周期里的IO刷新。换句话说,普通的Q点是“程序什么时候写它,它就什么时候变”,凸轮输出则是“角度一到,输出自己就变”。

这就是为什么在高速同步场合,凸轮输出是标配,而不是可选项。尤其S7-1500T系列PLC,把凸轮输出做成了标准工艺对象,配合OUPUTCAM指令,一个周期内就能同时刷新一批输出点,适合控制多个气缸阀。

1.3 OUPUTCAM指令在西门子1500T体系里的位置

先澄清一点,市面上关于这条指令的叫法有点乱。标题里写的OUPUTCAM,我在不同版本的博途项目和西门子应用示例里见过写成OUTPUTCAM的,也见过直接用输出凸轮DB实例ID来调用的。原理都一样,只是不同固件版本封装的块名有差异。下面默认按OUPUTCAM这个叫法来讲,实际用的时候留意你自己项目里库文件的名字。

在西门子1500T运动控制体系里,凸轮输出相关的东西可以拆成三个层次:

  • 凸轮轨迹:相当于一个“角度源”,可以绑定到物理主轴、虚拟主轴,或者通过高速计数器读取的外部编码器。
  • 凸轮轮廓:定义具体的凸轮曲线,也就是分段表,记录角度区间和对应的输出值。
  • 输出凸轮:把凸轮轮廓计算出来的结果映射到DQ地址或过程映像区,OUPUTCAM指令就是激活和管理这个输出凸轮功能的接口。

够抽象?没关系,打个比方。凸轮轨迹是一根转动的轴,凸轮轮廓是套在这根轴上的凸轮片,输出凸轮是凸轮片顶住的那排行程开关。OUPUTCAM相当于一个操作员,负责把这套装置挂到运行状态,并告诉你当前是不是正常运行。

2. 工程选型与工程组态:没满足这些前提,后面全是白搭

2.1 T-CPU和普通S7-1500的区分

先说最基础的前提:不是所有西门子1500都支持凸轮输出。1500T的“T”代表Technology,属于集成运动控制功能的CPU,比如1511T、1515T、1516T、1517T这一系列。普通S7-1500虽然也能做运动控制,但凸轮输出这种偏硬件实时性的功能,只在T系列CPU上才有。

所以选型阶段就得分清楚:项目如果已经定了1515T,那没问题;如果用的是1511标准型,后面怎么调程序都调不出凸轮输出功能。另外固件版本也要留意,太老的固件对凸轮输出支持不完整,建议尽量选择较新的固件,并用配套的TIA博途版本打开。我见过有人用V15打开一个V17创建的项目,工艺对象显示不全,问题就出在版本不匹配。

2.2 组态一个输出凸轮至少要建哪些工艺对象

在TIA博途里新建一个1500T项目,左侧树形菜单找到“工艺对象”,在里面创建三样东西:

  • 运动控制轴:可以是实际伺服轴,也可以是虚拟主轴。如果设备已经有伺服,就直接用伺服轴;如果只是想测凸轮效果,先建一个虚拟轴,手动给角度也行。
  • 凸轮轨迹:新建时选择角度来源,绑定刚才那个轴。
  • 凸轮:新建时选择关联的凸轮轨迹,然后进入分段配置界面去填凸轮曲线。

最后再看是否需要建“输出凸轮”这个工艺对象。不同版本的博途,输出凸轮对象的位置有差异,有些它作为一个独立工艺对象出现,有些它集成在凸轮对象的属性里。OUPUTCAM指令调用时,需要把输出凸轮的DB传给指令,所以这一步必须建好,否则程序编译都过不去。

这里有个很容易忽略的细节:工艺对象建好之后,要在“下载”时把工艺对象数据下载到CPU。很多人在博途里改完凸轮表,只下载了PLC程序,没下载工艺对象,结果运行的时候凸轮数据还是旧的。千万别省这一步。

2.3 输出点规划:连续地址和总线同步

凸轮输出最终要落到物理输出点。我一般建议把用于凸轮控制的Q点规划为连续地址,比如Q10.0到Q10.7对应8个气缸,或者用MB10这样一个字节地址。这样OUPUTCAM可以一次性刷新整个字节,避免多个输出点分开累计延迟。

如果输出模块挂在PROFINET总线上,还要看总线同步性。标准S7-1500的PROFINET IO如果没开IRT,输出刷新存在不确定性;凸轮输出要响应稳定,最好把轴和输出模块配在同一个同步域里,或者至少把输出模块放在CPU本地机架或ET200SP这种更新比较快的槽位。速度不太高的场合,普通模块勉强能用,但那种动辄上千转的设备,还是老老实实考虑同步性能。

另外一个规划细节:不要在一台设备上把凸轮输出点和普通程序输出点混在同一个字节里。否则OUPUTCAM每周期刷新这个字节,普通程序也在改这个字节,两边会互相覆盖,查起来相当头疼。

3. 凸轮分段表:把“气缸什么时候伸出”变成数据

3.1 角度-输出通道-分段之间的关系

凸轮输出的核心数据就是分段表。所谓分段,就是在一圈360度的行程内,把输出通道分成若干个“角度窗口”,每个窗口对应一个输出状态。

要理解分段,先搞清楚三个概念的区别:

  • 输出通道:每个通道对应一个物理Q点,通常是一个位,比如通道0对应Q0.0,通道1对应Q0.1。
  • 分段:同一个通道在一圈内可以有多段输出,比如0°到45°为ON,90°到180°为OFF,其他角度保持默认状态。
  • 角度区间:起点角度必须小于终点角度,如果跨过0°/360°边界,需要拆成两段来定义。

比如一个通道需要从350°转到20°这段区间输出ON,你不能写“350°到20°”,而要写成两段:350°到360°为ON,0°到20°为ON。这是刚开始做凸轮表时最容易犯的错。

3.2 一个8工位转台气缸凸轮表的搭建实例

拿前面那个八工位转台来搭一张真实的凸轮表。转盘主轴角度的零点设定在1号工位,每个工位间隔45度。气缸工作要求是:从1号工位开始,每个工位在它的中心角度前10度伸出,后20度缩回。假设8个气缸分别接Q10.0到Q10.7,每个通道用两个分段就能完成:

输出通道对应Q点段1起始角段1结束角段1状态段2起始角段2结束角段2状态
通道0Q10.035651其他角度默认0
通道1Q10.1801101其他角度默认0
通道2Q10.21251551其他角度默认0
通道3Q10.31702001其他角度默认0
通道4Q10.42152451其他角度默认0
通道5Q10.52602901其他角度默认0
通道6Q10.63053351其他角度默认0
通道7Q10.7350201其他角度默认0

注意通道7就是因为跨了0度,必须拆成“350到360”和“0到20”两段处理。

在博途界面里填这些数据时,每个分段要确认“输出值”是布尔量1还是0。默认状态下所有通道都是0,所以你只需要把伸出区间填成1。

3.3 换向角、滤波与输出窗口的调整

填完这张表,理论上凸轮就能动了,但实际调试时还得考虑机械和气动的滞后。电磁阀从得电到气缸真正伸出去,中间有20ms甚至更长的延迟;反过来,电磁阀失电到气缸缩回也有延迟。这些延迟会让实际动作比凸轮输出晚一拍。

解决办法就是提前或者滞后调整分段的角度边界。转速越高,提前量越大。具体值要靠现场实际观察调整,但可以按这个公式估算:

角度偏移量 = 延迟时间(ms) × 转速(°/ms)

例如转速300r/min,也就是1.8°/ms,电磁阀延迟20ms,那就需要提前36度,也就是把段1的起始角从35改成-1度(写成359),结束角从65改成29。这样气缸伸出的实际时刻才能落在期望的工位中心附近。

还有一个常见现象:输出点在分段边界处来回抖动。原因是在边界角度附近,主轴位置因为编码器抖动或插补误差在临界点反复跨越,导致输出频繁通断。解决办法是给输出通道设置一个很小的滞回量,或者干脆在分段表里留出几度的“死区”,比如窗口边界从“正好65度结束”改成“62度结束,下一段起点68度”,中间5度保持输出上一个状态。气缸动作不需要精确的角度切点,死区能明显减少阀的频繁动作。

4. OUPUTCAM指令的调用逻辑与程序框架

4.1 指令接口与参数理解

OUPUTCAM指令在不同项目里封装的接口有差别,但核心参数基本固定。我列一下我在项目里常用的输入输出含义供参考:

参数方向说明
enable输入凸轮输出总使能,必须为TRUE才会执行
cam输入凸轮工艺对象的DB编号
track输入凸轮轨迹对象,用于确定角度源
angle输入角度值,可以直接传主轴实际位置
mode输入循环/单次模式,一般用循环
busy输出指令正在处理中
done输出一次处理完成
error输出故障状态,配合errorID查看
outputByte输出映射到的字节地址,如P#M10.0或P#Q10.0

请一定注意,块名和参数名以你TIA库里的实际定义为准,我这里只是给一个最常见的参考模板。真正的重点是理解这几个参数的配合逻辑:enable是总开关,cam和track是数据来源,angle是当前运转角度,outputByte是输出落点。

4.2 在一个主轴运动控制程序里如何安排调用顺序

OUPUTCAM不能孤立使用,它依赖运动控制轴的运行状态。标准做法是先把整个运动控制程序按这个顺序组织好:

  1. MC_Power给轴使能。
  2. MC_Home将轴回零,或者用绝对编码器直接建立参考系。
  3. 启动运动指令,比如MC_MoveAbsolute或MC_Gear让轴转起来。
  4. 每个周期调用OUPUTCAM,把轴的实际位置作为角度源传进去。
  5. 条件满足时,置位凸轮输出使能。

尤其要注意第5步。很多人一上来就把enable给TRUE,但轴还没回零,角度是乱的,凸轮输出自然对不上。我习惯把“轴已回零”和“轴正在运行”这两个状态做成使能条件,缺一不可。

4.3 代码示例与复位/急停逻辑

用SCL风格的伪代码表示大概是这样的:

"OUPUTCAM_DB"( enable := "Axis_1".StatusWord.X1 AND "Run_CamEnable", cam := "Cam_1", track := "CamTrack_1", angle := "Axis_1".ActualPosition, mode := 1, // 循环模式 outputByte := P#Q 10.0 );

这个例子中,轴处于使能让能状态且运行标志为TRUE时,凸轮输出才会工作。角度源直接取轴的实际位置,输出点落在Q10.0字节。

但是别急着抄,还有一个同样重要的部分:急停和复位逻辑。凸轮输出是硬件自动刷新的,一旦使能,角度到了就会输出。如果设备急停,主轴停了,气缸却还停在伸出状态,那就很危险。必须在急停回路里把这个字节强制清零,或者在急停时把enable断开,并额外复位输出点。

IF NOT "E_Stop" THEN "Q10_BYTE" := 16#00; "Run_CamEnable" := FALSE; END_IF;

这段逻辑在所有运动指令之前执行,确保急停优先。很多项目因为漏了这一步,调试时没出问题,一到现场紧急停止就出状况。

5. 实战应用:高速转盘上的气缸动作控制全流程

5.1 现场机构与动作要求

把前面那些配置串起来,我们完整走一遍现场流程。

设备是一台八工位旋转包装机,主伺服带动转盘,转盘上八个工位各有一个下顶气缸,负责把产品顶起,让上方的机械手抓走。产品在不同工位有不同工艺间隔,机械手抓取窗口只有25度。转盘转速目标是240r/min,相当于每毫秒1.44度。

现场动作要求是:1号工位在角度30度到55度之间气缸伸出,机械手在45度附近抓取;抓完后气缸在60度前缩回。对应的凸轮分段就是:通道0,段1起始30度,结束55度,输出1;其余默认0。

这还是简单的单段情况。实际现场因为机械手和转盘之间有相对位置偏差,我们调整了零点偏移,把凸轮轨迹的角度源做了一个“相位偏置”,相当于整体平移了凸轮表。这个偏置量通过触摸屏写入,调试起来方便很多。

5.2 凸轮段与设备速度的匹配计算

速度匹配是这台设备调试过程中最让我记忆深刻的部分。最初按240r/min调好的凸轮窗口,速度降到120r/min以后,气缸和机械手照样配合正常,说明凸轮输出的角度相关性很好。但是提到300r/min后,问题开始显现:机械手偶尔抓空。

重新核算后发现问题出在电磁阀延迟上。240r/min时,电磁阀延迟14ms,折算角度约20度,凸轮窗口25度还能勉强覆盖;300r/min时,同样14ms延迟折算成25.2度,窗口宽度只剩不到5度,几乎等于没有余量。

解决办法有两个方向:

  • 方向一:换响应更快的电磁阀,把延迟压到10ms以内。
  • 方向二:重新调整凸轮段,把伸出窗口加宽,比如从“30到55”改成“25到60”,让阀延迟带来的动作偏移落在窗口内。

现场综合考虑后,两条路都走了。先换了快速阀,再把凸轮窗口微调加宽,最终稳定运行。这个经验换成任何设备都适用:凸轮表不是一次填完就完事,速度和负载变了,窗口就要重新核算。

5.3 Trace验证与动作微调

调整凸轮表不能靠肉眼猜,TIA的Trace功能这时候非常有用。把主轴实际位置、OUPUTCAM输出的字节值、气缸到位传感器信号同时拖进轨迹记录,低速跑一圈,高速跑一圈,对比波形就能看到实际动作点和凸轮输出点之间的偏差。

比如Trace显示气缸实际伸出信号在角度52度才到,而凸轮输出在30度就置位了,中间差了22度。如果这22度是电磁阀延迟造成的,就在凸轮表里把起始角提前22度;如果发现气缸缩回总是偏晚,就把结束角同步提前。

微调完以后,最好再跑三个速度点验证——低速、额定、高速,每条曲线都能对上,才算调完。这个过程没法省,因为每个气缸的负载、摩擦力不同,延迟也不完全一样。我的习惯是八通道分别微调,虽然麻烦一点,但能保证每个工位都稳定。

6. 调试路上会踩到的坑与排除手册

6.1 凸轮没有输出,指令状态却正常

这类问题最迷惑人。OUPUTCAM的busy和done都正常,DB里也能看到角度值变化,但Q点就是不动。

排查方向按优先级排列:

  • 输出地址被占用:项目里其他地方有一个位触点或“MOVE”在反复写同一个Q字节,覆盖了OUPUTCAM的输出。用交叉引用查一下这个地址有多少处写入。
  • 输出模块被禁用:模块属性里的“启用/禁用”被勾掉,或者在安全程序里做了强制输出。
  • 凸轮数据没下载:博途在线状态下打开工艺对象,对比离线在线数据,不一致就重新下载。
  • 使能虽然为TRUE,但轴的实际位置没有进入工艺对象:确认角度源的轴编号没有绑错。

我遇到过最隐蔽的情况是触摸屏上有一个“手动调试”界面,工程师手动点过某个气缸输出,之后把这个位写在HMI画面里,每次一进画面就自动写入0。交叉引用一查,果然和凸轮输出撞了地址。

6.2 输出闪烁或抖动

凸轮输出在分段边界来回翻跳,电磁阀“啪嗒啪嗒”响,这个问题前面提过,大概率是边界震荡。原因通常是两个:编码器角度在临界点抖动,或者凸轮分段的结束角和下一段起始角完全贴合,没有留出滞回空间。

处理方法:

  • 给凸轮输出通道配置滞回量,这是工艺对象属性里可以直接设置的。
  • 或者人工把分段边界错开几度。
  • 还有一个偏门情况:如果轴的实际位置来自增量编码器且回零不准,零点漂移会让所有边界整体偏移,检查一下零点是否稳定。

6.3 与普通OUT指令打架

这个坑单独拿出来说,因为太常见了。OUPUTCAM每周期会把输出字节刷一遍,但普通梯形图里如果还有一个OUT或S/R指令写同一个Q点,整个凸轮输出会变得“时灵时不灵”。更麻烦的是,CPU的IO刷新发生在程序扫描结束后,OUPUTCAM和普通OUT谁在逻辑上“最后生效”,结果可能完全相反。

我的建议很简单:把所有凸轮输出点集中规划,在程序里做一个明确的约定,凸轮输出字节的Q点不允许其他逻辑直接写。必须额外控制时,要么改地址,要么在OUPUTCAM之后做一个“允许覆盖”的逻辑,并在注释里写清楚。

除了这几个大坑,还有一个很容易被忽略的点:OUPUTCAM指令不是无条件每周期执行越快越好。如果它所在的OB循环周期过长,角度源的采样分辨率会下降。对于高速应用,建议把它放在运动控制任务或循环周期更短的OB里,必要时专门生成一个定时中断OB来调用。低速场合放在OB1里问题不大,高速情况下还是单独处理靠谱。

7. 从气缸到整个设备:OUPUTCAM还能干什么

7.1 激光打标触发

OUPUTCAM控制气缸只是最基础的一种用法。它本质是一个“角度到输出”的高速映射器,凡是需要在指定角度触发信号的动作,都能用它。我后来在一个激光打标项目里直接用它触发打标机启动信号:主轴旋转,激光头需要在固定的3度窗口内出光一次。这个窗口比气缸动作窗口苛刻得多,普通DO点根本没法稳定触发,OUPUTCAM配一个高速输出点就能干净利落地完成,而且打标点位置不会因为速度波动而漂移。

7.2 伺服飞切和贴标应用

飞切和贴标设备是凸轮输出的另一个主战场。旋转刀辊的切断位置必须和材料线速度严格同步,过去很多人靠凸轮轨迹和伺服齿轮耦合做位置同步,刀辊到位后再用OUPUTCAM输出一个“切断允许”信号给刀具气缸或刀片驱动。这样同步归同步,动作归动作,两者解耦,调试的时候能分别优化,设备故障时也更容易定位。

贴标机里的应用类似:标签切刀在某一角度区间需要压紧,压紧信号如果跟着普通程序走,速度一快就切偏。用凸轮输出之后,不管贴标头转速怎么变化,压紧窗口始终跟着主轴角度走,材料长度根本不会因为角度误差而变。

7.3 把凸轮输出当成设备联动的时间基准

最后再分享一个我自己的体会。凸轮输出最大的价值不只是省一个扫描周期,而是把“时间基准”统一到了角度上。设备运行速度来回波动时,基于时间的逻辑总会累积误差,但基于角度的凸轮输出不会。主轴转一圈,凸轮输出在固定的角度点动作,跟速度无关。

如果整套设备里有多组气缸、多个触发信号,我的建议是尽量都放到同一个凸轮轨迹下来做。这样大家共用一个角度基准,联动关系天然一致,不会出现“A气缸已经伸出但B传感器还没到”的尴尬。

最后给一点实操层面的建议:项目第一台设备调试凸轮输出时,不要急着上高速。先把凸轮表按低速跑通,确认每个通道的置位复位角度都正确,再逐步提升速度,每提一档重新看一眼Trace。高速下凸轮输出表现异常时,优先怀疑电磁阀延迟、输出模块总线和凸轮段边界,这三个方向排查完基本能覆盖90%的问题。等这套流程跑熟练了,你会发现凸轮输出其实比想象中简单——它只是把“按时间做事”换成了“按角度做事”,一旦适应了这种思维方式,很多高速设备的控制问题都会豁然开朗。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询