做设备的同行应该都遇到过这类需求:一台搬运取料机要完成水平横移、升降、伸缩、抓手旋转四个动作,客户点名要用西门子S7-200 SMART来做控制,还明确要求两台smart通过通讯协同。第一次听这个方案我也愣了一下——单台200smart的晶体管CPU最多只有Q0.0、Q0.1、Q0.2三路高速脉冲输出,四轴怎么塞进一台CPU?后来项目落地,我把横移、升降、伸缩三个轴放在主机上,把旋转轴和夹爪放在从机上,两台PLC走S7以太网通信组成一个整体,整套程序跑下来非常稳定。这篇文章把这个四轴搬运取料机的案例拆开讲:从硬件分工、运动向导组态、双机通信数据规划,到调试现场踩过的几个大坑,一次说透。看懂这套逻辑,你自己也能搭出双PLC四轴取料机的程序框架。
1. 工艺链拆解:取料机四个轴到底在干什么
1.1 从取料工位到放料工位的完整动作链
搬运取料机看起来结构不复杂,但工艺动作是有严格先后顺序的。以最常见的双工位方案为例:A工位是来料位,B工位是放料位,设备需要不停地在两个工位之间搬运工件。设备本体上装了一个可以左右横移的横梁,横梁上挂着一个可以上下升降的滑块,滑块前端装了一套可以前后伸缩的取料臂,取料臂末端是抓手,抓手本身还能旋转换向。
整个动作链是这样的:设备先回到机械原点,X轴横移到A工位上方,Y轴下降到取料高度,Z轴伸出到工件上方,夹爪夹紧或吸盘吸附,Z轴缩回,Y轴升起,X轴横移到B工位,Y轴再次下降,Z轴伸出,R轴旋转到放料角度,夹爪松开,Z轴缩回,Y轴升到安全高度,再回到原点等待下一个周期。
这个动作链看着长,但本质上是顺序点位运动,每个轴只负责起点到终点的定位,不需要两轴或三轴同时走圆弧曲线,也就是不涉及插补。这一点非常关键,它决定了用两台PLC分开管轴是完全可行的——各轴的运动在时间上是先后关系,即使通信让两台CPU之间的衔接有一点延迟,也不会破坏运动轨迹。
1.2 为什么一台S7-200 SMART做不到四轴控制
很多初次接触200smart运动控制的人,第一反应是“四个轴嘛,一个CPU管四个伺服不就完了”。但实际选型时会发现一个硬约束:S7-200 SMART的标准晶体管输出CPU只有三路高速脉冲输出,分别是Q0.0、Q0.1、Q0.2。也就是说,单台CPU最多支持三个运动轴,每路脉冲最高100kHz。继电器输出型CPU更麻烦,输出点根本不能发高速脉冲,接步进驱动器或伺服驱动器时很多速度跟不上,即使靠普通点动凑合能转,也没法做精度要求高的定位。
所以四轴需求摆在面前时,方案只有几个:换更大系列的PLC,或者加专用的运动控制模块,或者在S7-200 SMART系列内部做双机协同。客户既然指定了smart,双机方案就是最稳妥的选择——两台晶体管输出型CPU,一台负责三轴,一台负责一轴加工艺逻辑,通过以太网通信把两个CPU黏合成一台设备。
这里要补充一个容易忽略的概念:S7-200 SMART里说的“轴”,不是物理上的伺服驱动器通道,而是CPU内部的高速脉冲输出通道配上运动向导生成的控制逻辑。每个轴都需要独占一路脉冲输出,同时还要占用对应的方向输出点和回零、限位输入点。所以从机哪怕只控制一个旋转轴,也要占用从机的一路高速脉冲输出和一组IO点,硬件分配时必须把这个考虑进去。
2. 双机分工、输入输出分配与通信拓扑设计
2.1 主机和从机各自管什么
我在这类项目里的分法比较固定:工艺调度职责尽量放在主机,执行机构按“轴资源”切分。具体到这套设备:
| 项目 | 主机PLC | 从机PLC |
|---|---|---|
| CPU型号 | ST40(晶体管输出) | ST20(晶体管输出) |
| 负责轴 | X轴横移、Y轴升降、Z轴伸缩 | R轴旋转 |
| 动作职责 | 全流程状态调度、X/Y/Z定位、位置给定 | 夹具开闭、真空吸附检测、旋转定位、状态反馈 |
| 对外交互 | 触摸屏数据交互、报警汇总 | 不直接接人机界面,通过通信上报 |
| 本地IO | 三个轴的工作限位、原点开关、急停、启动停止 | R轴原点开关、夹爪到位检测、料位检测 |
为什么主机选ST40、从机选ST20?因为主机要管三个轴,每个轴至少占用一个原点输入、两个限位输入,再加上一些常规按钮和传感器,ST40的IO数量刚刚够用。从机只负责一个旋转轴、夹爪和几个检测点,ST20就足够了,没必要上更大点数的CPU。
2.2 轴参数与驱动器选型的匹配思路
轴能不能正常跑,不只是程序的事。脉冲当量、步进细分、机械减速比三者必须一起算清楚。拿X轴举例,如果步进电机步距角1.8°,驱动器细分设为16,电机转一圈需要3200个脉冲;如果同步带减速比为3:1,电机转3圈横梁才走一圈同步带轮周长,假设同步带轮周长240mm,那么X轴移动240mm需要9600个脉冲,每个脉冲对应的实际位移就是240÷9600=0.025mm,脉冲当量约0.025mm/脉冲。这个值要填进运动向导的“工程单位”配置里,后续程序里写位置时直接用mm,让向导替你换算成脉冲数。
Y轴是升降轴,我建议带抱闸的步进电机,防止伺服或步进在断电时滑块坠落。如果升降行程比较高,还要考虑配重或防坠机构,程序里也要加“Y轴到位后再允许X轴动作”的互锁逻辑。Z轴行程短,普通57步进就行;R轴如果带减速机,脉冲当量会非常小,控制精度很高,但要注意速度上限不能超过驱动器接受频率,否则电机会丢步。
对于步进驱动器的接线,脉冲信号和方向信号一定要区分清楚。S7-200 SMART的高速脉冲输出是PNP晶体管输出,接到驱动器时通常用共阳极接法,脉冲输出点接驱动器脉冲输入正端,方向输出点接驱动器方向输入正端,公共端接24V电源负极。如果接反或驱动器侧拨码开关设置不对,最常见的现象就是轴不转或者方向反了,而且这种问题在程序里看不出来,只能顺着接线查。
2.3 通信拓扑:为什么不选Modbus而走S7以太网
两台smart PLC之间可以选Modbus RTU、Modbus TCP或S7协议。我实际选的是S7 TCP方式,也就是PUT/GET通信。原因很直接:200smart自带以太网口,不需要额外接通信模块,两台CPU之间用一根网线或者经交换机直连就能建立连接;S7通信可以直接读写对方V存储区,不需要像Modbus一样维护保持寄存器映射表,程序写起来更直观。
如果现场还有触摸屏,标准拓扑是:触摸屏、主机、从机三台设备都挂在同一台工业交换机下,触摸屏只跟主机通信,所有从机数据由主机汇总之后再给触摸屏。这么做的好处是组态软件的变量表只面对一台PLC,维护方便得多。从机IP固定,主机在PUT/GET向导里直接填从机IP即可。
3. 运动控制核心:运动向导组态与指令调用细节
3.1 运动向导里的关键配置项
S7-200 SMART做运动控制,我强烈建议用Micro/WIN SMART里的运动控制向导,而不是自己写脉冲程序。向导帮你把方向控制、回零流程、加减速包络、限位处理全部生成为后台子程序和中断逻辑,你只需要在每个扫描周期调用对应的轴控制块。
打开向导后,依次组态AXIS0、AXIS1、AXIS2,对应Q0.0、Q0.1、Q0.2。有几个配置项必须认真对待:
- 测量单位:选择“工程单位”,填入脉冲当量,之后轴位置、速度单位全部用mm或mm/s,程序可读性很强,调试时一眼能看出位置对不对。
- 方向控制:我习惯用“脉冲+方向”模式,也就是脉冲输出点负责发脉冲,另一个输出点负责方向电平。这种模式兼容绝大多数步进和伺服驱动器,排查问题也简单,看方向输出点的状态就能判断方向选择是否正确。
- 限定速度与加减速:最大速度和启动停止速度要按机械实际承受能力设置。加减速时间一般先给300ms左右,太快会丢步,太慢影响节拍。
- 回原点方式:建议优先选“信号开关+Z相”方式,也就是碰到原点开关减速,再等编码器Z相脉冲精确定位。这样每次回原点位置重复性很好,不会出现越冲越远的问题。
向导配置完成后会占用一段V存储区,这个地址要记录好。后续在同一个CPU里做触摸屏变量表或通信数据区时,要注意避开这段区域,否则程序运行中可能发生数据覆盖,轴突然乱走。
3.2 手动运行和自动运行必须分开做
程序结构上,我坚持把手动模式和自动模式做成两条独立路径。手动模式用于调试和故障处理:点动按钮接通时,轴以固定速度连续运动,松手即停。自动模式用于正常生产:状态机按顺序触发各轴定位指令,每一步都要等“到位完成”信号后才进入下一步。
在S7-200 SMART的运动指令里,手动模式用的是AXISx_MANUAL,自动定位用的是AXISx_GOTO。手动和自动切换时,必须断开当前模式再切换,否则两个指令同时对同一个轴下命令,输出脉冲会打架。我的做法是在手动/自动切换按钮的上升沿,先调用一次AXISx_STOP停止当前轴运动,再切换使能标志。
3.3 自动流程状态机:用状态字代替散乱的M点
很多初学者喜欢每个动作用一个M继电器写,最后十几个M点缠成一团,改一步就要找半天。我这边统一用一个状态字存放流程编号,每个编号对应一个工艺动作。状态机伪代码逻辑如下:
状态1:X轴绝对定位到A工位取料坐标,等待X轴到位信号,状态字加一。 状态2:Y轴下降到取料高度,到位后状态字加一。 状态3:Z轴伸出到抓取位置,到位后状态字加一。 状态4:向从机发送“夹爪夹紧”命令,等待从机返回完成位,完成后方可继续。
这里唯一要注意的是,等待从机返回时一定要设超时。我在主站用定时器计时,如果发送命令后3秒内没有收到完成标志,直接进入报警状态并停机。这样即使从机故障或通信断掉,整台设备也不会悬在半空等死。
3.4 GOTO指令调用的三个细节
AXISx_GOTO指令在调用时有几个参数要留意。Pos是目标位置,Speed是目标速度,Mode是运动模式,0代表绝对位置运动,1代表相对位置运动,2代表连续运动。绝对定位的前提是已经完成回原点,否则坐标基准是错的,设备会跑飞。所以每次上电后我强制设备先执行回原点流程,原点没到位之前自动按钮无效。
另外,START输入端要用边沿触发,而不建议一直保持接通。如果一直给START,轴到位后指令会再次触发,造成重复定位或误动作。还有一点,别在整个状态机里反复给同一轴的GOTO指令喂位置数据,位置只在状态激活时更新一次,避免程序扫描周期不同步导致位置被覆盖。
4. 双机通信机制:PUT/GET的数据规划与握手协议
4.1 两台PLC通信前必须确认的三件事
第一件事,从机的CPU属性里要勾选“允许其他主站通过GET/PUT访问”,否则主机指令发过去会超时报错。第二件事,IP地址要规划好,不能冲突。第三件事,通信触发方式不能用脉冲式的一直执行,PUT/GET指令持续恒ON会占满通信缓冲,我一般用一个50ms的定时脉冲触发一次通信任务,既保证数据及时更新,又不会让通信队列拥堵。
在Micro/WIN SMART里配置S7通信,主站侧建立一个连接,填从机IP,然后分配通信数据区。主站想读从机的哪些V区,想在本地写从机哪些V区,都要在这个向导里定义。向导生成的通信块带使能端,按我上面说的定时调用即可。
4.2 一张手工约定的数据表
双机通信最难的不是指令用法,而是通信数据区规划。我在项目实施前会把这张表打印出来,当作两台PLC之间的“通信协议”:
| 方向 | 地址 | 长度 | 含义 |
|---|---|---|---|
| 主站→从站 | 从机VB200 | 1字节 | 命令号(0空闲,1夹紧,2松开,3旋转到位,10回零) |
| 主站→从站 | 从机VW201 | 字 | 目标旋转角度(0.1°) |
| 主站→从站 | 从机VB203 | 1字节 | 夹爪控制字节 |
| 从站→主站 | 主站VB100 | 1字节 | 状态字节(0空闲,1忙碌,2完成,3错误) |
| 从站→主站 | 主站VW101 | 字 | 当前旋转角度 |
| 从站→主站 | 主站VB103 | 1字节 | 报警码 |
| 从站→主站 | 主站VW104 | 字 | 心跳计数 |
V区规划时有一条铁律:通信区必须和运动向导生成的V区、触摸屏变量区互相避开。我的习惯是从V3000以后开始划通信区,前面留给运动向导和程序内部变量,宁可多浪费一些地址也不要冒险重叠。
4.3 四步握手协议,防止命令重复执行
两台PLC各自独立扫描,如果不做握手,主站发“夹紧”命令,从站可能在同一个扫描周期里连续执行好几次夹紧动作,后果轻则重复报警,重则机械机构卡死。我设计的握手逻辑分四步:
第一步,主站把命令号写入从站V区。第二步,从站检测到命令号变化后,先回写一个“忙碌”状态,再开始执行动作。第三步,从站执行完成后,回写“完成”状态,同时把命令号清零。第四步,主站收到“完成”状态后,确认命令结束;从站看到命令号清零后,把“完成”状态改为“空闲”,等待下一个命令。
这套流程的关键在于“命令号清零”是一个边沿信号,从站每次只在命令号从0变为非0时触发动作,执行完把命令号清掉,就不会有重复执行的问题。如果主站发完命令后发现从站超过3秒没有进入“忙碌”,或者超过5秒没有返回“完成”,主站直接报警,提示通信或从站故障。
心跳检测也要加上。从站程序里用一个定时器每500ms把自己的心跳字加一,主站定时读取这个心跳字,如果连续3次读数没变化,就认为通信中断并在触摸屏上报警。这个机制在项目调试时救过我很多次——很多通信问题不是线松了,而是从站CPU死机或程序跑飞,有心跳才能第一时间发现。
5. 调试实录:四轴设备跑起来,三个坑躲不掉
5.1 轴不转,查了半天才发现CPU型号不对
第一台样机装配完成后,上电测试时发现R轴怎么给程序都不转。现场查了接线、查了驱动器使能、查了方向信号,最后翻到CPU铭牌一看,供应商采购的是SR40继电器输出型CPU。继电器输出虽然有高速脉冲的“硬件条件”不够,输出点根本达不到高速翻转的要求,脉冲发出来驱动器的频率上不去,电机要么不动要么一跳一跳。
这个坑提醒我两点:第一,S7-200 SMART选型时凡是涉及运动控制,必须选ST系列,也就是晶体管输出型,而且要核对订货号;第二,轴不转的排查顺序应该是“CPU输出类型→接线→驱动器参数→程序使能”,而不是一上来就改程序参数。程序里轴使能没有置位也是常见原因,运动向导生成的AXISx_CTRL指令必须每个扫描周期都调用,并且EN端保持接通,否则轴根本不会被激活。
5.2 回原点每次差半圈,问题出在“冲过开关”
Y轴回原点时经常出现位置偏差,而且偏差值是固定半圈脉冲数。现场查波形后发现,升降轴从高速状态直接撞到原点开关,由于惯性冲过头,到位信号已经变了,轴还在继续滑行,导致每回一次原点都差那么一点。解决思路分两层:第一层是用带Z相脉冲的伺服或步进系统,回零流程改成“碰到原点开关后减速,再等Z相上升沿锁停”,精度可以长期保持在几个脉冲以内;第二层是把原点开关安装位置留出足够减速距离,程序里回零速度不要给满速,建议用慢速回零或两级速度。
还有一个细节容易被忽略:原点开关的信号抖动。接近开关或者机械开关在动作瞬间会有信号毛刺,如果PLC输入滤波时间太短,抖动会被当成有效边沿。我后来把原点信号对应的输入点滤波时间调大了一些,抖动导致的偶发误判就消失了。
5.3 PUT/GET偶发不更新,通信时序卡顿
设备连续运行一段时间后,偶尔出现从站状态不刷新、主站误报通信故障的现场。重启后又能好一阵子。最终定位到两个原因:一是主站程序里PUT/GET指令的调用方式不对,之前在某处用恒ON的方式一直执行通信功能,导致通信队列里积压了大量排队任务;二是从站程序里业务逻辑太长,CPU处理一圈耗费的时间远大于通信扫描周期,GET数据来了但业务程序还没跑完。
对策是:通信调用改成50ms定时脉冲触发,一次只执行一轮;从站主程序里把耗时的夹爪动作、旋转定位拆成独立子程序,需要时再调,不要让每个扫描周期都从头到尾跑一遍全部功能。改完之后通信状态明显平稳,一个星期连续运行都没有再出现偶发中断。
5.4 现场调试用的表格工具
最后分享一个我自己的调试习惯:每个轴都建一张“问题排查小表”,手动、自动、回零、限位、报警五类状态分别记录,出问题时直接对表定位。表里包含轴的脉冲当量、方向输出点、原点输入点、正负限位输入点、当前程序里的轴使能标志和报警字。这张表在双PLC方案里尤其有用,因为两台CPU的程序分着写,但调试要当成一台设备来查,轴和IO点很容易记混。
6. 程序复用与设备提速:从单台案例到可复制模板
6.1 把位置参数做成“数据”,而不是焊死在程序里
初期版本里,各工位的X轴坐标是直接用立即数写在GOTO指令里的。后来换了一个工位规格,每个坐标都要去程序里改,还要重新下载,非常麻烦。我改成把所有目标位置放到固定的V区,触摸屏上用配方功能或者直接设置变量,程序里只读取这些V区值作为GOTO的Pos输入。换规格时现场改触摸屏参数,不用动程序。
轴号也要做统一约定。X轴永远是AXIS0、Y轴永远是AXIS1、Z轴永远是AXIS2,从机R轴就是从机的AXIS0。这套约定沿用在新项目里,程序块可以直接复制,只需要重新组态向导和IO地址,省掉大量重复劳动。
6.2 节拍优化的两个突破口
这套设备调试到稳定后,客户提提速要求。节拍瓶颈一般出现在两个地方:一个是我把所有轴动作都写成严格顺序,X轴动作时Z轴闲着;另一个是夹爪动作要和机械手配合,指令发了但没做并行处理。
第一个突破点是并行动作:S7-200 SMART虽然没有插补功能,但点位运动完全可以并行——只要机械结构不干涉,X轴在横移的同时Z轴可以开始缩回或伸出。我修改状态机,让X轴到达前,Z轴提前启动回退动作,单周期能省出几秒钟。这里必须加安全限制:路径重叠区域不能并行,防止发生碰撞。
第二个突破点是通信预写:主站在Y轴还没下降到位之前,就把“旋转到放料角度”命令发给从机,从机提前执行R轴定位,等Y轴真正到位时,旋转动作已经完成。这其实是把握手协议里的“等待完成”改成“命令先行、到位校核”,但前提是旋转动作不会和Y轴下降发生干涉,机械设计上要保证安全。
6.3 双PLC方案的一点心得
这套四轴搬运取料机案例真正落地的体会是:双PLC协同并不是把程序写两遍那么简单,而是要把“通信协议”当作整个设备的中枢神经系统来设计。哪台CPU负责哪些动作、数据怎么握手、故障怎么传递,这些在设计初期就要白纸黑字定清楚。调试时也是按协议来逐项验证:先通信后动作,先手动后自动,先单轴后联动,每过一关再放行下一步。
如果让我重新做一次,我会把状态机和通信数据表做得比现在更早,电气图纸一出来就开始联调程序,而不是等柜子装完再写逻辑。事实证明,双PLC设备的大部分问题都出在时序协调上,而不是单台CPU的程序复杂程度上。